张晋华
(惠生工程(中国)有限公司,北京 100102)
AutoCAD 广泛应用于工程公司各专业,但CAD软件只提供了基本的绘图环境,工程师经常使用CAD 进行大量重复的设计绘图工作,绘图效率偏低。通过对CAD 进行二次开发,实现目标图形的参数化自动绘制,可以将工程师从重复复杂的绘图工作中解放出来,将更多的精力放在专业技能提高上。
市面上有很多CAD 二次开发插件,但一般均由编程专业人员开发,难以满足工程师专业性需求。只有工程师自己能充分了解工作中深层需求,若工程师掌握基本的二次开发能力,开发适于日常工作的参数化绘图程序,将更有效地提高工作效率。
目前AutoCAD 二次开发工具主要有Visual Lisp、Object ARX、VBA,其 中VLisp 与VBA 相对简单,开发速度较快,但对面向对象的功能支持不好,Object ARX 基于VC 平台,功能强大,可以很好地运用各种面向对象技术,但开发速度较慢,且对开发人员的能力要求较高,更适合大系统的开发 [1]。
本文选择VLisp 为开发工具,Vlisp 是CAD 自带的二次开发工具,嵌套于CAD 内部,可以直接调用CAD 命令、系统变量等,简单易学,与CAD 兼容性好,且对非编程专业的工程师非常友好[2]。
塔器梯子平台图绘制在工程设计中是一项非常繁琐的工作,尤其对于高塔,平台数量可能多达十几层,在实际设计中,设计人员通常利用CAD 通过点线等基础命令对梯子和平台进行绘制,耗费大量时间与精力。本文通过利用Visual Lisp 对塔器梯子平台图的绘制进行二次开发,实现了目标图形的参数化自动绘制,大大提高了绘图效率,将设计人员从重复性劳动中解放出来。
参数化绘图是指用户根据参数对话框和命令行的提示,输入相关参数,便可由程序自动完成所需图形绘制工作。本文主要从以下几方面对开发步骤进行分析:
二次开发的首要工作是需求分析,只有充分了解开发背景、开发需求、开发内容、开发目标才能准确完成开发任务。
本次开发的主要目标是实现塔器梯子平台立面图、平面图的参数化自动绘制,通过输入基本参数,实现图形自动绘制及相关尺寸的自动标注,同时生成预焊件360°展开图,便于检查碰撞。此外,开发绘图环境设置、技术要求、节点图等辅助模块。使用本程序绘制的图形,用户只要稍加修改,便可达到出图要求,快捷高效。
本程序的开发主要包括以下几步:
(1)分析结构特点,提炼规律,确定绘图模块;
(2)确定绘图参数,设计人机交互对话框;
(3)理清绘图流程,编写绘图程序;
(4)程序调试与测试;
(5)加载程序,实现图形参数化绘制。
本程序以HG/T 21543—2009《圆形塔平台通用图》为设计标准进行开发。
1.3.1 分析结构特点,提炼规律,确定绘图模块
二次开发中,编程语言只是工具,开发的核心在于思路的提炼与整理,简洁和清晰的思路会使得开发事半功倍。本文以梯子平台立面图为例对开发过程进行分析。
立面图绘制主要集中在塔轮廓、平台、梯子三个方面,提炼绘图模块分类见表1。考虑到绘图的快捷简便性和后期修改的灵活性,在开发立面图总模块同时开发塔轮廓、平台、梯子三个子模块。总模块可实现立面图总图(包含尺寸标注与标识)的一次性绘制;子模块可实现各部件的单独绘制,也可用于对全塔图的修改,使用灵活。
表1 塔轮廓、平台、梯子绘图模块分类Table 1 Classification of drawing module for tower outline,platform, ladder
1.3.2 确定绘图参数,设计人机交互对话框
Visual Lisp 编程语言中,Lisp 用于实现图形绘制,DCL 用于建立人机交互对话框。友好的对话框对于参数化绘图程序非常重要,可通过必要的文字和图片提示来增加可读性,使用户操作更便捷。
1.3.2.1 确定绘图参数并搭建DCL 对话框
结合立面图绘图模块,提炼所需绘图参数于表2中,并搭建图1 所示DCL 参数录入对话框。
图1 塔器梯子平台立面图绘制对话框Fig.1 DCL for Elevation drawing for Platform and Ladder of Tower
表2 塔器梯子平台立面图绘图参数Table 2 Elevation drawing parameters for Platform and Ladder of Tower
1.3.2.2 DCL 对话框特点
(1)记忆上次数据,减免用户对相同类型数据的重复输入,也可帮助用户出错时快速载入参数重新绘制。
(2)内嵌平台和梯子子对话框,不同塔设备所需平台和梯子的数量及形式不同,高塔可能设置十几层平台,结合DCL 与Lisp 编写随数量变化的参数录入对话框(见图2),可以灵活方便地录入所有平台和梯子参数,并记忆所有参数,避免重复输入。
图2 平台参数录入子对话框Fig.2 Sub-DCL for Platform parameters
(3)绘图比例设置,结合塔顶标高给出推荐的图纸比例,用于尺寸标注及文字比例设置。
(4)嵌套质量估算及预焊件绘图模块,供用户选择。
(5)设置可放大的参考图,便于用户准确了解参数的意义。
(6)对话框结合命令行,根据参数特点,对难以录入对话框的部分参数采取绘图过程中通过命令行来输入的方式,如梯子支耳间距。
1.3.3 理清绘图流程,编写绘图程序
绘图程序编写前应对绘图流程进行分析,理清图形中存在的数学关系和约束条件,确定绘图方法、流程、所需节点等,以此来有效指导程序的编写。结合Lisp 程序设计特点,将立面图参数化绘制的流程简述如下[3]:
(1)系统环境设置
绘图开始应对CAD 的系统环境进行设置,使其符合企业的绘图规范。参照公司制图规定,通过command 函数或setvar 函数依次对图层样式、标注样式、文字样式、主单位精度等系统变量进行设置。
(2)塔轮廓建模
塔轮廓建模涉及基本轮廓外形尺寸,所需参数(形式、外径、高度等)均从DCL 对话框获取,采取点线建模方式完成自动绘图,算法简单。同时,可根据用户对预焊件的绘制需求进行塔轮廓复制和预焊件的360°展开图绘制。
(3)平台建模
平台建模涉及参数有平台标高(以塔器基础底面中心为0 标高位置)、平台宽度、塔保温参数等,参数关系及样式选择按HG/T21543-2009《圆形塔平台通用图》要求。平台建模流程模拟实际绘图过程,通过Lisp 语言复现绘图命令,利用cond 条件语句进行判断,利用循环语句进行简化,算法相对简单。
此外,可根据用户需求进行预焊件绘制及质量估算。循环绘制多个平台。
(4)梯子建模:
梯子建模涉及参数有起始平台标高、终止平台标高、梯子位置、支耳间距等。梯子绘图型式变化多样,根据梯子所在标高处塔轮廓外形不同可分为直梯、斜梯、斜梯+直梯、直梯+斜梯+直梯等。
梯子建模包含梯子主体(梯棍、踏步)、支耳、护笼三部分,自动绘图中,首先通过梯子标高结合塔外形对梯子型式进行判断,确定各部分绘图样式,然后结合已录入参数,按表3 自动绘图算法原则完成图形绘制及相关标注标识工作,用户按需将绘制的梯子组进行镜像和平移操作。
表3 梯子自动绘图算法原则Table 3 Algorithm principle for ladder automatic drawing
此外,可根据用户需求进行预焊件绘制及质量估算。循环绘制多个梯子。
至此程序绘图结束,详细流程如图3 所示。
图3 梯子平台立面图绘制流程Fig.3 Elevation drawing flow chart for Platform and Ladder of Tower
1.3.4 程序调试与测试
程序开发过程中需不断进行调试,确保程序实现目标功能的同时应不断优化简化程序。调试的方法为:在关注位置设置断点→通过检验查看变量值、通过添加监视查看变量值的变化→根据问题修改程序源代码→重新运行调试→直至程序调试合格。
开发人员对程序调试合格后,还需邀请使用人员对程序进行测试。开发人员的视野和经验毕竟有限,且在开发过程中倾向于根据自己的工作思路进行开发,当别的设计人员使用时便可能会因思路不同而出错。只有经使用人员大量测试,结合测试中发现的问题不断对程序完善,才能使得程序更加稳定,界面更加友好,更符合用户的需求与习惯。
1.3.5 加载程序,实现图形参数化绘制
程序调试合格后将程序编译为扩展名为“.vlx”的工程文件进行加载,程序的加载方式有命令行加载、启动组加载、制作菜单栏、制作工具栏等多种方式,其中菜单栏方式最方便简洁。加载成功,按对话框和命令行提示输入相关参数,便可完成自动绘图工作,手动对图形进行局部调整,按照绘图前设定的比例将图形放入A1 图框中即可。
此次主要完成了塔器梯子平台立面图总图、平面图总图、立面图子模块、预焊件绘制、360°干涉展开图绘制、质量估算、技术要求、节点图等模块开发,实现了梯子平台绘图的高度自动化与参数化,以前需要几小时绘制的图纸,使用此程序几分钟便可以完成,极大提高了绘图效率。部分绘制样图见图4。
图4 绘制样图(立面图、预焊件图、360°展开图)Fig.4 Sample drawing(elevation drawing, pre-weldment drawing, 360° expended drawing)
程序中参数分为全局变量和局部变量,尽可能将变量设置为局部变量,在程序结束时将变量从内存中释放,避免占用大量内存空间,有效提高运行效率。此外,若在不同程序中误使用相同的全局变量名称,全局变量可能互相干扰,使得绘图出错。
本程序仅在为用户记忆上次输入参数时使用全局变量。
程序设计时应尽量避免对当前系统变量修改,但有时为保证自动绘图准确,需临时对部分系统变量进行修改(如对象捕捉),程序结束后将这些系统变量还原。但如果程序在运行中意外出错,程序会直接中断跳出,使得系统变量无法还原,给用户的操作带来不便。通过增加错误处理子函数可解决此问题,将修改前用户的系统变量备份,在出现错误时将备份的系统变量还原。具体操作如下:
主程序中开始处增加:
(setq *error*_bak *error*)
;;将系统内置的出错函数备份
(setq *error* *error*_new)
;;将自定义的出错函数复制给系统出错函数
主程序中结尾处增加:
(setq *error* *error*_bak)
;;若程序正常执行,则还原备份的出错函数
自定义出错子函数如下:
(defun *error*_new (msg)
(command)
;; 对CAD 内 置command 命 令 执 行 的 使 用(command)取消执行
(setq *error* *error*_bak)
;;将系统出错函数进行还原
梯子模块开发中,梯子绘制方法随筒体变径情况不同而变化,样式繁多,给开发带来极大困难。开发中应尽可能穷尽常用组合,理清数学关系,但以解决80%的情况为目标,保证程序的简洁友好,避免程序过于庞大。
平台梯子绘图繁琐线条较多,在程序编制中使用组group 功能将平台组件、梯子组件分别组合成对象组,便于后期用户对这些部件进行整体操作(如移动、镜像等)。
程序执行中调用command 命令时命令行会显示命令执行过程参数,显得很乱且非常影响绘图速度,可在程序开始添加(setvar “cmdecho” 0)来关闭命令响应,且最好在每个包含command 命令的子程序均增加此语句,可有效防止命令行回显且提高运行速度[4]。
程序执行中有时会在命令行出现未知命令,但不影响程序正常运行,此种情况多因command 命令中增加了多余的“”双引号造成,删除即可解决。
对话框参数录入状态及响应关系应清晰,如筒体结构分有变径和无变径两种情况,不同情况下所需输入的相关参数不同,不需输入的参数应处于灰色不激活状态,在用户切换选择类型时参数应能准确调整激活状态。
DCL 对话框搭建过程中也应尽可能穷尽不同参数交叉组合时的相互响应,对参数状态了然于心,然后编写Lisp 程序对参数激活状态进行控制,只有参数状态清晰用户使用才能得心应手。
在AutoCAD 平台下应用Visual Lisp 语言进行二次开发,实现了塔器梯子平台图纸的参数化自动化绘制,减少了设计人员不必要的重复绘图劳动,使流程标准化,几分钟便可完成一张图纸的绘制工作,节约绘图时间,提高工作效率。本成果对其他类似系统的开发具有参考价值。