張晉華
(惠生工程(中國(guó))有限公司,北京 100102)
AutoCAD 廣泛應(yīng)用于工程公司各專業(yè),但CAD軟件只提供了基本的繪圖環(huán)境,工程師經(jīng)常使用CAD 進(jìn)行大量重復(fù)的設(shè)計(jì)繪圖工作,繪圖效率偏低。通過(guò)對(duì)CAD 進(jìn)行二次開發(fā),實(shí)現(xiàn)目標(biāo)圖形的參數(shù)化自動(dòng)繪制,可以將工程師從重復(fù)復(fù)雜的繪圖工作中解放出來(lái),將更多的精力放在專業(yè)技能提高上。
市面上有很多CAD 二次開發(fā)插件,但一般均由編程專業(yè)人員開發(fā),難以滿足工程師專業(yè)性需求。只有工程師自己能充分了解工作中深層需求,若工程師掌握基本的二次開發(fā)能力,開發(fā)適于日常工作的參數(shù)化繪圖程序,將更有效地提高工作效率。
目前AutoCAD 二次開發(fā)工具主要有Visual Lisp、Object ARX、VBA,其 中VLisp 與VBA 相對(duì)簡(jiǎn)單,開發(fā)速度較快,但對(duì)面向?qū)ο蟮墓δ苤С植缓?,Object ARX 基于VC 平臺(tái),功能強(qiáng)大,可以很好地運(yùn)用各種面向?qū)ο蠹夹g(shù),但開發(fā)速度較慢,且對(duì)開發(fā)人員的能力要求較高,更適合大系統(tǒng)的開發(fā) [1]。
本文選擇VLisp 為開發(fā)工具,Vlisp 是CAD 自帶的二次開發(fā)工具,嵌套于CAD 內(nèi)部,可以直接調(diào)用CAD 命令、系統(tǒng)變量等,簡(jiǎn)單易學(xué),與CAD 兼容性好,且對(duì)非編程專業(yè)的工程師非常友好[2]。
塔器梯子平臺(tái)圖繪制在工程設(shè)計(jì)中是一項(xiàng)非常繁瑣的工作,尤其對(duì)于高塔,平臺(tái)數(shù)量可能多達(dá)十幾層,在實(shí)際設(shè)計(jì)中,設(shè)計(jì)人員通常利用CAD 通過(guò)點(diǎn)線等基礎(chǔ)命令對(duì)梯子和平臺(tái)進(jìn)行繪制,耗費(fèi)大量時(shí)間與精力。本文通過(guò)利用Visual Lisp 對(duì)塔器梯子平臺(tái)圖的繪制進(jìn)行二次開發(fā),實(shí)現(xiàn)了目標(biāo)圖形的參數(shù)化自動(dòng)繪制,大大提高了繪圖效率,將設(shè)計(jì)人員從重復(fù)性勞動(dòng)中解放出來(lái)。
參數(shù)化繪圖是指用戶根據(jù)參數(shù)對(duì)話框和命令行的提示,輸入相關(guān)參數(shù),便可由程序自動(dòng)完成所需圖形繪制工作。本文主要從以下幾方面對(duì)開發(fā)步驟進(jìn)行分析:
二次開發(fā)的首要工作是需求分析,只有充分了解開發(fā)背景、開發(fā)需求、開發(fā)內(nèi)容、開發(fā)目標(biāo)才能準(zhǔn)確完成開發(fā)任務(wù)。
本次開發(fā)的主要目標(biāo)是實(shí)現(xiàn)塔器梯子平臺(tái)立面圖、平面圖的參數(shù)化自動(dòng)繪制,通過(guò)輸入基本參數(shù),實(shí)現(xiàn)圖形自動(dòng)繪制及相關(guān)尺寸的自動(dòng)標(biāo)注,同時(shí)生成預(yù)焊件360°展開圖,便于檢查碰撞。此外,開發(fā)繪圖環(huán)境設(shè)置、技術(shù)要求、節(jié)點(diǎn)圖等輔助模塊。使用本程序繪制的圖形,用戶只要稍加修改,便可達(dá)到出圖要求,快捷高效。
本程序的開發(fā)主要包括以下幾步:
(1)分析結(jié)構(gòu)特點(diǎn),提煉規(guī)律,確定繪圖模塊;
(2)確定繪圖參數(shù),設(shè)計(jì)人機(jī)交互對(duì)話框;
(3)理清繪圖流程,編寫繪圖程序;
(4)程序調(diào)試與測(cè)試;
(5)加載程序,實(shí)現(xiàn)圖形參數(shù)化繪制。
本程序以HG/T 21543—2009《圓形塔平臺(tái)通用圖》為設(shè)計(jì)標(biāo)準(zhǔn)進(jìn)行開發(fā)。
1.3.1 分析結(jié)構(gòu)特點(diǎn),提煉規(guī)律,確定繪圖模塊
二次開發(fā)中,編程語(yǔ)言只是工具,開發(fā)的核心在于思路的提煉與整理,簡(jiǎn)潔和清晰的思路會(huì)使得開發(fā)事半功倍。本文以梯子平臺(tái)立面圖為例對(duì)開發(fā)過(guò)程進(jìn)行分析。
立面圖繪制主要集中在塔輪廓、平臺(tái)、梯子三個(gè)方面,提煉繪圖模塊分類見表1??紤]到繪圖的快捷簡(jiǎn)便性和后期修改的靈活性,在開發(fā)立面圖總模塊同時(shí)開發(fā)塔輪廓、平臺(tái)、梯子三個(gè)子模塊。總模塊可實(shí)現(xiàn)立面圖總圖(包含尺寸標(biāo)注與標(biāo)識(shí))的一次性繪制;子模塊可實(shí)現(xiàn)各部件的單獨(dú)繪制,也可用于對(duì)全塔圖的修改,使用靈活。
表1 塔輪廓、平臺(tái)、梯子繪圖模塊分類Table 1 Classification of drawing module for tower outline,platform, ladder
1.3.2 確定繪圖參數(shù),設(shè)計(jì)人機(jī)交互對(duì)話框
Visual Lisp 編程語(yǔ)言中,Lisp 用于實(shí)現(xiàn)圖形繪制,DCL 用于建立人機(jī)交互對(duì)話框。友好的對(duì)話框?qū)τ趨?shù)化繪圖程序非常重要,可通過(guò)必要的文字和圖片提示來(lái)增加可讀性,使用戶操作更便捷。
1.3.2.1 確定繪圖參數(shù)并搭建DCL 對(duì)話框
結(jié)合立面圖繪圖模塊,提煉所需繪圖參數(shù)于表2中,并搭建圖1 所示DCL 參數(shù)錄入對(duì)話框。
圖1 塔器梯子平臺(tái)立面圖繪制對(duì)話框Fig.1 DCL for Elevation drawing for Platform and Ladder of Tower
表2 塔器梯子平臺(tái)立面圖繪圖參數(shù)Table 2 Elevation drawing parameters for Platform and Ladder of Tower
1.3.2.2 DCL 對(duì)話框特點(diǎn)
(1)記憶上次數(shù)據(jù),減免用戶對(duì)相同類型數(shù)據(jù)的重復(fù)輸入,也可幫助用戶出錯(cuò)時(shí)快速載入?yún)?shù)重新繪制。
(2)內(nèi)嵌平臺(tái)和梯子子對(duì)話框,不同塔設(shè)備所需平臺(tái)和梯子的數(shù)量及形式不同,高塔可能設(shè)置十幾層平臺(tái),結(jié)合DCL 與Lisp 編寫隨數(shù)量變化的參數(shù)錄入對(duì)話框(見圖2),可以靈活方便地錄入所有平臺(tái)和梯子參數(shù),并記憶所有參數(shù),避免重復(fù)輸入。
圖2 平臺(tái)參數(shù)錄入子對(duì)話框Fig.2 Sub-DCL for Platform parameters
(3)繪圖比例設(shè)置,結(jié)合塔頂標(biāo)高給出推薦的圖紙比例,用于尺寸標(biāo)注及文字比例設(shè)置。
(4)嵌套質(zhì)量估算及預(yù)焊件繪圖模塊,供用戶選擇。
(5)設(shè)置可放大的參考圖,便于用戶準(zhǔn)確了解參數(shù)的意義。
(6)對(duì)話框結(jié)合命令行,根據(jù)參數(shù)特點(diǎn),對(duì)難以錄入對(duì)話框的部分參數(shù)采取繪圖過(guò)程中通過(guò)命令行來(lái)輸入的方式,如梯子支耳間距。
1.3.3 理清繪圖流程,編寫繪圖程序
繪圖程序編寫前應(yīng)對(duì)繪圖流程進(jìn)行分析,理清圖形中存在的數(shù)學(xué)關(guān)系和約束條件,確定繪圖方法、流程、所需節(jié)點(diǎn)等,以此來(lái)有效指導(dǎo)程序的編寫。結(jié)合Lisp 程序設(shè)計(jì)特點(diǎn),將立面圖參數(shù)化繪制的流程簡(jiǎn)述如下[3]:
(1)系統(tǒng)環(huán)境設(shè)置
繪圖開始應(yīng)對(duì)CAD 的系統(tǒng)環(huán)境進(jìn)行設(shè)置,使其符合企業(yè)的繪圖規(guī)范。參照公司制圖規(guī)定,通過(guò)command 函數(shù)或setvar 函數(shù)依次對(duì)圖層樣式、標(biāo)注樣式、文字樣式、主單位精度等系統(tǒng)變量進(jìn)行設(shè)置。
(2)塔輪廓建模
塔輪廓建模涉及基本輪廓外形尺寸,所需參數(shù)(形式、外徑、高度等)均從DCL 對(duì)話框獲取,采取點(diǎn)線建模方式完成自動(dòng)繪圖,算法簡(jiǎn)單。同時(shí),可根據(jù)用戶對(duì)預(yù)焊件的繪制需求進(jìn)行塔輪廓復(fù)制和預(yù)焊件的360°展開圖繪制。
(3)平臺(tái)建模
平臺(tái)建模涉及參數(shù)有平臺(tái)標(biāo)高(以塔器基礎(chǔ)底面中心為0 標(biāo)高位置)、平臺(tái)寬度、塔保溫參數(shù)等,參數(shù)關(guān)系及樣式選擇按HG/T21543-2009《圓形塔平臺(tái)通用圖》要求。平臺(tái)建模流程模擬實(shí)際繪圖過(guò)程,通過(guò)Lisp 語(yǔ)言復(fù)現(xiàn)繪圖命令,利用cond 條件語(yǔ)句進(jìn)行判斷,利用循環(huán)語(yǔ)句進(jìn)行簡(jiǎn)化,算法相對(duì)簡(jiǎn)單。
此外,可根據(jù)用戶需求進(jìn)行預(yù)焊件繪制及質(zhì)量估算。循環(huán)繪制多個(gè)平臺(tái)。
(4)梯子建模:
梯子建模涉及參數(shù)有起始平臺(tái)標(biāo)高、終止平臺(tái)標(biāo)高、梯子位置、支耳間距等。梯子繪圖型式變化多樣,根據(jù)梯子所在標(biāo)高處塔輪廓外形不同可分為直梯、斜梯、斜梯+直梯、直梯+斜梯+直梯等。
梯子建模包含梯子主體(梯棍、踏步)、支耳、護(hù)籠三部分,自動(dòng)繪圖中,首先通過(guò)梯子標(biāo)高結(jié)合塔外形對(duì)梯子型式進(jìn)行判斷,確定各部分繪圖樣式,然后結(jié)合已錄入?yún)?shù),按表3 自動(dòng)繪圖算法原則完成圖形繪制及相關(guān)標(biāo)注標(biāo)識(shí)工作,用戶按需將繪制的梯子組進(jìn)行鏡像和平移操作。
表3 梯子自動(dòng)繪圖算法原則Table 3 Algorithm principle for ladder automatic drawing
此外,可根據(jù)用戶需求進(jìn)行預(yù)焊件繪制及質(zhì)量估算。循環(huán)繪制多個(gè)梯子。
至此程序繪圖結(jié)束,詳細(xì)流程如圖3 所示。
圖3 梯子平臺(tái)立面圖繪制流程Fig.3 Elevation drawing flow chart for Platform and Ladder of Tower
1.3.4 程序調(diào)試與測(cè)試
程序開發(fā)過(guò)程中需不斷進(jìn)行調(diào)試,確保程序?qū)崿F(xiàn)目標(biāo)功能的同時(shí)應(yīng)不斷優(yōu)化簡(jiǎn)化程序。調(diào)試的方法為:在關(guān)注位置設(shè)置斷點(diǎn)→通過(guò)檢驗(yàn)查看變量值、通過(guò)添加監(jiān)視查看變量值的變化→根據(jù)問題修改程序源代碼→重新運(yùn)行調(diào)試→直至程序調(diào)試合格。
開發(fā)人員對(duì)程序調(diào)試合格后,還需邀請(qǐng)使用人員對(duì)程序進(jìn)行測(cè)試。開發(fā)人員的視野和經(jīng)驗(yàn)畢竟有限,且在開發(fā)過(guò)程中傾向于根據(jù)自己的工作思路進(jìn)行開發(fā),當(dāng)別的設(shè)計(jì)人員使用時(shí)便可能會(huì)因思路不同而出錯(cuò)。只有經(jīng)使用人員大量測(cè)試,結(jié)合測(cè)試中發(fā)現(xiàn)的問題不斷對(duì)程序完善,才能使得程序更加穩(wěn)定,界面更加友好,更符合用戶的需求與習(xí)慣。
1.3.5 加載程序,實(shí)現(xiàn)圖形參數(shù)化繪制
程序調(diào)試合格后將程序編譯為擴(kuò)展名為“.vlx”的工程文件進(jìn)行加載,程序的加載方式有命令行加載、啟動(dòng)組加載、制作菜單欄、制作工具欄等多種方式,其中菜單欄方式最方便簡(jiǎn)潔。加載成功,按對(duì)話框和命令行提示輸入相關(guān)參數(shù),便可完成自動(dòng)繪圖工作,手動(dòng)對(duì)圖形進(jìn)行局部調(diào)整,按照繪圖前設(shè)定的比例將圖形放入A1 圖框中即可。
此次主要完成了塔器梯子平臺(tái)立面圖總圖、平面圖總圖、立面圖子模塊、預(yù)焊件繪制、360°干涉展開圖繪制、質(zhì)量估算、技術(shù)要求、節(jié)點(diǎn)圖等模塊開發(fā),實(shí)現(xiàn)了梯子平臺(tái)繪圖的高度自動(dòng)化與參數(shù)化,以前需要幾小時(shí)繪制的圖紙,使用此程序幾分鐘便可以完成,極大提高了繪圖效率。部分繪制樣圖見圖4。
圖4 繪制樣圖(立面圖、預(yù)焊件圖、360°展開圖)Fig.4 Sample drawing(elevation drawing, pre-weldment drawing, 360° expended drawing)
程序中參數(shù)分為全局變量和局部變量,盡可能將變量設(shè)置為局部變量,在程序結(jié)束時(shí)將變量從內(nèi)存中釋放,避免占用大量?jī)?nèi)存空間,有效提高運(yùn)行效率。此外,若在不同程序中誤使用相同的全局變量名稱,全局變量可能互相干擾,使得繪圖出錯(cuò)。
本程序僅在為用戶記憶上次輸入?yún)?shù)時(shí)使用全局變量。
程序設(shè)計(jì)時(shí)應(yīng)盡量避免對(duì)當(dāng)前系統(tǒng)變量修改,但有時(shí)為保證自動(dòng)繪圖準(zhǔn)確,需臨時(shí)對(duì)部分系統(tǒng)變量進(jìn)行修改(如對(duì)象捕捉),程序結(jié)束后將這些系統(tǒng)變量還原。但如果程序在運(yùn)行中意外出錯(cuò),程序會(huì)直接中斷跳出,使得系統(tǒng)變量無(wú)法還原,給用戶的操作帶來(lái)不便。通過(guò)增加錯(cuò)誤處理子函數(shù)可解決此問題,將修改前用戶的系統(tǒng)變量備份,在出現(xiàn)錯(cuò)誤時(shí)將備份的系統(tǒng)變量還原。具體操作如下:
主程序中開始處增加:
(setq *error*_bak *error*)
;;將系統(tǒng)內(nèi)置的出錯(cuò)函數(shù)備份
(setq *error* *error*_new)
;;將自定義的出錯(cuò)函數(shù)復(fù)制給系統(tǒng)出錯(cuò)函數(shù)
主程序中結(jié)尾處增加:
(setq *error* *error*_bak)
;;若程序正常執(zhí)行,則還原備份的出錯(cuò)函數(shù)
自定義出錯(cuò)子函數(shù)如下:
(defun *error*_new (msg)
(command)
;; 對(duì)CAD 內(nèi) 置command 命 令 執(zhí) 行 的 使 用(command)取消執(zhí)行
(setq *error* *error*_bak)
;;將系統(tǒng)出錯(cuò)函數(shù)進(jìn)行還原
梯子模塊開發(fā)中,梯子繪制方法隨筒體變徑情況不同而變化,樣式繁多,給開發(fā)帶來(lái)極大困難。開發(fā)中應(yīng)盡可能窮盡常用組合,理清數(shù)學(xué)關(guān)系,但以解決80%的情況為目標(biāo),保證程序的簡(jiǎn)潔友好,避免程序過(guò)于龐大。
平臺(tái)梯子繪圖繁瑣線條較多,在程序編制中使用組group 功能將平臺(tái)組件、梯子組件分別組合成對(duì)象組,便于后期用戶對(duì)這些部件進(jìn)行整體操作(如移動(dòng)、鏡像等)。
程序執(zhí)行中調(diào)用command 命令時(shí)命令行會(huì)顯示命令執(zhí)行過(guò)程參數(shù),顯得很亂且非常影響繪圖速度,可在程序開始添加(setvar “cmdecho” 0)來(lái)關(guān)閉命令響應(yīng),且最好在每個(gè)包含command 命令的子程序均增加此語(yǔ)句,可有效防止命令行回顯且提高運(yùn)行速度[4]。
程序執(zhí)行中有時(shí)會(huì)在命令行出現(xiàn)未知命令,但不影響程序正常運(yùn)行,此種情況多因command 命令中增加了多余的“”雙引號(hào)造成,刪除即可解決。
對(duì)話框參數(shù)錄入狀態(tài)及響應(yīng)關(guān)系應(yīng)清晰,如筒體結(jié)構(gòu)分有變徑和無(wú)變徑兩種情況,不同情況下所需輸入的相關(guān)參數(shù)不同,不需輸入的參數(shù)應(yīng)處于灰色不激活狀態(tài),在用戶切換選擇類型時(shí)參數(shù)應(yīng)能準(zhǔn)確調(diào)整激活狀態(tài)。
DCL 對(duì)話框搭建過(guò)程中也應(yīng)盡可能窮盡不同參數(shù)交叉組合時(shí)的相互響應(yīng),對(duì)參數(shù)狀態(tài)了然于心,然后編寫Lisp 程序?qū)?shù)激活狀態(tài)進(jìn)行控制,只有參數(shù)狀態(tài)清晰用戶使用才能得心應(yīng)手。
在AutoCAD 平臺(tái)下應(yīng)用Visual Lisp 語(yǔ)言進(jìn)行二次開發(fā),實(shí)現(xiàn)了塔器梯子平臺(tái)圖紙的參數(shù)化自動(dòng)化繪制,減少了設(shè)計(jì)人員不必要的重復(fù)繪圖勞動(dòng),使流程標(biāo)準(zhǔn)化,幾分鐘便可完成一張圖紙的繪制工作,節(jié)約繪圖時(shí)間,提高工作效率。本成果對(duì)其他類似系統(tǒng)的開發(fā)具有參考價(jià)值。