基于AUTOLISP二次开发的剖面绘制辅助工具原理及应用

2015-11-17 08:32罗镇泉詹明珠
船舶设计通讯 2015年1期
关键词:型线型材交点

罗镇泉 詹明珠

(上海船舶研究设计院,上海201203)

船舶结构

基于AUTOLISP二次开发的剖面绘制辅助工具原理及应用

罗镇泉詹明珠

(上海船舶研究设计院,上海201203)

利用VISUAL LISP集成开发环境,通过AUTOLISP语言,开发出在绘制船体结构剖面的时候有效的辅助工具。可以根据肋骨型线图,自动铺开剖面、自动绘制纵骨并加纵骨号标注。利用该工具可以有效地提高剖面绘制效率,并能在设计初期对纵骨布置方案做出有效评估。

AUTOLISP;AUTOCAD;二次开发;剖面绘制

1 开发环境概述

1.1AUTOLISP概述

LISP(List Processing Language)是一种符号式语言,因为它处理的对象是符号表达式[1]。LISP语言的程序和数据都以符号表达式的形式来表示,因此,一个LISP程序可以把另一个LISP程序作为它的数据来处理。LISP语言语法简单,编写程序便捷、灵活,数据类型丰富。

AUTOLISP是为了二次开发AUTOCAD而专门设计的编程语言。它起源于LISP语言,嵌入在AUTOCAD内部,是LISP语言和AUTOCAD有机结合的产物。利用AUTOLISP语言可以进行各种工程的分析计算,自动绘制复杂的图形;还可以定义新的AUTOCAD命令,驱动对话框,控制菜单;并且可为AUTOCAD扩充具有一定智能化、参数化的功能。

VISUAL LISP是新一代AUTOLISP语言。它对AUTOLISP语言的功能进行了扩展,可以通过Microsoft ActiveX Automation接口与 AUTOCAD对象进行交互,可以通过反应器函数扩展AUTOLISP响应事件的能力。使用VISUAL LISP中对AUTOLISP进行扩展的功能时,必须调用vl-load-com函数,或者将调用该函数的表达式写在acad2006doc.lsp文件内。

1.2重要数据类型介绍

AUTOLISP的数据类型丰富,除了具有一般程序设计语言的整型、实型、字符串等数据类型之外,还有表、函数、文件描述符、AUTOCAD选择集、AUTOCAD图元名、VLA对象、函数分页表和外部函数等数据类型。

本程序着重用到表、VLA对象等数据类型。用表(LIST)可以很方便地构造出复杂的数据结构。而VLA对象是ActiveX应用程序的主要组成部分。不仅直线、圆弧、多义线和圆等称为VLA对象,图层、组、块、视图、视口、图形的模型空间、图纸空间、线型和尺寸标注样式等也称为VLA对象,甚至连AUTOCAD应用程序本身也被认为是VLA对象。

2 程序原理介绍

2.1界面介绍

利用VISUAL LISP集成开发环境,可以便捷、高效地开发AUTOLISP程序,经过编译可以得到运行效率高、代码紧凑、源代码受到保护的应用程序。

本文通过AUTOLISP语言,开发出在绘制船体结构剖面的时候有效的辅助工具,可以根据肋骨型线图,自动铺开剖面、自动绘制纵骨并加纵骨号标注。程序界面如图1。

图1 程序界面

该程序分为两部分:复制型线部分和纵骨生成部分。

2.2复制型线部分

在绘制船体结构剖面的时候,特别是首部、机舱、尾部等每档线型变化的分段,需要把每档的肋骨型线逐个复制到相应的剖面。本程序的第一部分即可以实现自动将型线复制到相应肋位,效果如图2所示。

图2 自动复制型线效果

该部分程序操作步骤如下:

1)首先根据程序中的【横向间隔】(往右)和【纵向间隔】(往下)利用阵列(array)命令,布置出两个竖列的剖面基线和中心线;

2)以肋骨型线图中的基点作为程序的【基点】;

3)以布置出来的两个竖列的剖面最左上角的剖面基点为【插入点】,程序将根据【插入点】位置和【横向间隔】、【纵向间隔】自动得到后续剖面的基点位置供后续复制型线使用。

4)利用fence方法按顺序选择要拷贝的型线,点击 【执行】,程序则自动将需要拷贝的型线形成“表”,并逐个将型线复制到相应剖面。

2.3纵骨生成部分

在绘制纵骨架式的首部分段、首尾货舱分段时,因为型线变化,需要把每档剖面都表达出来,而在每档肋位将纵骨表达出来,如果手动绘制,将费时费事。利用程序,可以根据肋骨型线图上的纵骨线自动地将纵骨布置在相应的结构剖面,并且可以根据需要选择纵骨是否垂直于外板。同样原理,还可以自动布置纵桁、纵骨纵桁的文字标注等。每个剖面的纵骨自动生成效果见图3,其中SL.5、SL.6为垂直于外板,SL.4、SL.5a为没有选择垂直于外板。

图3 自动生成纵骨及其文字标注效果

该部分程序操作步骤如下:

1)根据程序第一部分,得到各个剖面的型线。并将相应的【横向间隔】、【纵向间隔】填写到这部分的【横向间隔】、【纵向间隔】上。

2)根据第一部分同样的原理选择【基点】以及【插入点】。

3)点击【纵骨线】,选择一根纵骨线,该纵骨线可以为直线或者多段线。这里只能选择一个对象,方便后续程序有序获得交点并将之形成“表”供程序后续使用。

4)点击【选择型线】,用fence方法按顺序选择与纵骨线相交的肋骨线,程序自动将相应剖面对应的型线形成“表”,并通过ActiveX对象方法,利用vla-intersectwith函数依次有序获得纵骨线和肋骨线的交点,并形成“表”。这里肋骨线必须为多段线。

此时,程序将自动根据【插入点】和【横向间隔】、【纵向间隔】获得后续所有剖面的基点,并根据【基点】以及交点的相对位置获得在相应剖面处纵骨线和肋骨线的交点,为程序后续将型材剖面复制到相应交点位置作准备。

5)点击【纵骨剖面】和【剖面基点】,获得该纵骨线所代表的型材剖面以及拷贝和旋转基点。这里选择的型材剖面为一个对象,一般为多段线或者块。

如果要完成如图3所示的自动完成纵骨的文字标注效果,则可以将型材剖面和文字标注做成一个块,或者单独将文字标注作为型材剖面来操作,可以得到相同的效果。

6)如果勾选了【纵骨是否垂直外板】复选框,则程序将在复制型材剖面到相应交点位置之后,把复制对象根据交点做一个旋转。而为了得到旋转角度,程序将自动获取该肋位上的型线的所有顶点,并找到与交点位置最近的顶点(统一在顶点上方),利用angle函数得到这两个点形成的角度,这样便通过几何关系得到需要的旋转角度。

为了统一几何关系,当需要选定纵骨垂直于外板时,选择【纵骨剖面】的时候,型材剖面原始状态如图3中SL.5a所示 (此时需要要求该部分所有操作都是针对于剖面右舷)。如果型材是垂直布置(如图3中SL.4所示)或者水平布置(如图3中SL.5a所示),则不勾选【纵骨是否垂直外板】,并在选择【纵骨剖面】的时候,保证型材剖面原始状态为相应样式即可。

7)点击【执行】,程序完成选定模式相应的操作。

3 程序关键技术及代码实现

3.1表数据类型的使用

表以左括号“(”开始,以配对的右括号“)”结束。表可以是空的,也可以有若干个元素;元素可以是简单的,也可以是复杂的,还可以是其他的表。

通过2.2和2.3可以看到,利用表数据类型,可以很方便地有序引用CAD里的图元,作为后续依次复制或求取交点的基础。而建立表只需要以下一句代码 (在选择图元的时候用fence方法按顺序选择)。

代码:(setq ssframe(ssget))

3.2访问ActiveX对象

如果要在Visual LISP中使用ActiveX函数,必须首先调用vl-load-com函数来初始化ActiveX环境。vl-load-com函数首先检查是否加载了ActiveX支持的函数,如果已加载,就不做任何工作,否则将加载ActiveX和其他Visual LISP扩展部分的函数。

在2.3中可以看到,为了获取纵骨线和肋骨线的交点,需要调用一个求取交点的函数。而在AUTOLISP中,仅有inters函数可供使用。该函数格式如下:

(inters pt1 pt2 pt3 pt4[onseg])

由于inters函数仅支持求取以4个点中前2个点和后2个点分别形成的直线的交点。无法满足程序的使用要求,故需要使用ActiveX函数,先将纵骨线和肋骨线等用AUTOCAD实体名引用的图元,利用vlax-ename→vla-object函数转换为VLA对象。再利用vla-intersectwith函数得到两个VLA对象的交点。

3.3DCL语言使程序可视化

对话框形象、直观,可以随意输人、随时修改,鼠标、键盘并用,是一种深受用户欢迎的界面。对话框用DCL语言(Dialog Control Language)定义,得到“.DCL”类型的文件,用AUTOLISP或C程序驱动。

如图1所示,本程序利用加框列(boxed_column)控件,将界面根据程序用途分为【复制型线】和【纵骨生成】两个部分。使程序更为直观,而且在2.3中,当选择一条纵骨线执行之后,如果另一条纵骨线表示的型材型号一致,则不需要重新依据步骤按部就班,只需要点击【纵骨线】选取新的一条纵骨线,并点击【执行】即可。可在处理一组相同型材剖面的纵骨的时候大大提高效率。

3.4获取多段线的所有顶点

在AUTOCAD中有二维多段线(Polyline)和多段线(LWPolyline)之分,分别利用entget函数获得二维多段线和多段线的属性表可以看到,二维多段线并没有将所有顶点坐标显示在属性表中,如果需要访问顶点,需要再利用entnext函数访问子实体(subentity)的属性表以获得顶点坐标。而多段线则可以直接在属性表中获得顶点坐标。故在2.3获取多段线顶点以获得离交点最近的顶点时,本程序只考虑肋骨线为多段线的情况。如果从Napa中导出的肋骨线为二维多段线,则可以利用convert命令将其转化为多段线。

4 结语

本文详细地介绍了基于AUTOLISP二次开发的剖面绘制辅助工具的具体编程思路及实现方法。对于利用该工具绘制船体结构剖面的读者可以更好的提高工作效率;另外对于读者自行开发AUTOLISP程序也有一定的启发意义。

[1]李学志.Visual LISP程序设计:AutoCAD 2006.北京:清华大学出版社,2006.

Technique and Application of Section Drawing Assistant Tool Based on AUTOLISP Secondary Development

Luo Zhen-quanZhan Ming-zhu

(Shanghai Merchant Ship Design and Research Institute,Shanghai 201203,China)

An assistant tool for section drawings of ship structure was developed based on VISUAL LISP integrated developing environment with AUTOLISP language.The tool could collocate sections and draw longitudinal at frames automatically.It would improve drawing sections efficiency and evaluate longitudinal arrangement at the beginning of design.

AUTOLISP;AUTOCAD;secondary development;section drawing

U662.9

A

1001-4624(2015)01-0057-04

2014-08-07;

2014-12-20

罗镇泉(1987—),男,助理工程师,从事船舶结构设计工作。詹明珠(1982—),女,工程师,从事船舶结构设计工作。

猜你喜欢
型线型材交点
朗盛推出空心型材混合技术
基于Matlab的螺杆转子的型线分析
高次曲线组合型线涡旋盘性能研究*
大型船舶T型材焊接工艺试验及工艺再造
阅读理解
被动房用四密封多断桥隔热铝塑共挤型材
借助函数图像讨论含参数方程解的情况
试析高中数学中椭圆与双曲线交点的问题
一种用于低压开关柜“S”形型材的设计与运用
变截面复杂涡旋型线的加工几何与力学仿真