韓希國
(遼寧科技學(xué)院 機(jī)械工程學(xué)院,遼寧 本溪 117004)
在機(jī)械設(shè)計(jì)過程中,先進(jìn)行三維設(shè)計(jì)再導(dǎo)出二維視圖的設(shè)計(jì)理念已經(jīng)被多數(shù)設(shè)計(jì)者所認(rèn)可,而如何將三維實(shí)體快速生成二維視圖已倍受關(guān)注,目前,一般采用文獻(xiàn)〔1〕、〔2〕中所提到的方法來生成二維圖,其缺點(diǎn)是操作復(fù)雜,且繪圖效率低。
本文基于Auto LISP、Visual LISP、Dialog Control Language等程序語言,并結(jié)合AutoCAD中的flatshot命令,開發(fā)出將三維實(shí)體快速生成二維視圖的AutoCAD插件,從而使二維工程圖樣的繪制變得簡單、快捷、可靠。
本文重點(diǎn)論述了程序設(shè)計(jì)的主要方法和步驟。
考慮到三視圖的使用頻率高于其它視圖配置模式,并兼顧提高繪圖效率,插件默認(rèn)為生成主、俯、左三個(gè)視圖(圖1),節(jié)省了操作時(shí)間。對于其它視圖配置模式是通過輸入關(guān)鍵字“E”調(diào)用話框進(jìn)行設(shè)置,其中線型屬性默認(rèn)值更改后將會(huì)自動(dòng)保存于注冊表中,并成為下次使用時(shí)的默認(rèn)值,盡量適應(yīng)各類用戶的使用習(xí)慣。
圖1 AutoCAD命令窗口操作提示截圖
在dwg圖形文件中,為了既允許存在多個(gè)三維或二維對象,又不影響被選定的三維目標(biāo)對象轉(zhuǎn)換成二維視圖,編程時(shí)應(yīng)按下述方法進(jìn)行。
(1)保存當(dāng)前圖層
(setq clayer_bak (getvar "clayer"))
(2)保存當(dāng)前視口中的顯示
程序代碼為:(command "view" "s" "stx")
(3)關(guān)閉坐標(biāo)系
程序代碼為:(command "ucsicon" "off")
圖2 視圖、線型屬性選項(xiàng)對話框截圖
為了控制二維視圖的生成的中間過程為不可見模式,可新建“ 3→2專用”圖層,使其置為當(dāng)前且關(guān)閉。程序代碼為:
(command "_layer" "m" “3→2專用” "off" “3→2專用” "y" "")。
單選三維實(shí)體并復(fù)制,然后將復(fù)制后的三維實(shí)體更改到“3→2專用”圖層中, 此時(shí),凍結(jié)除當(dāng)前圖層外的所有圖層,以避免autocad當(dāng)前dwg文件中其它對象參與操作,程序代碼為:
(vla-put-layer (vlax-ename->vla-object mx) “3→2專用”)
(command "layer" "f" "*" "")。
目標(biāo)對象的長、寬、高和各視圖的間距尺寸是程序處理時(shí)的必要數(shù)據(jù),獲取方法如下:
首先在西南等軸測世界坐標(biāo)系下,分別獲取目標(biāo)對象在俯視方向(Z軸負(fù)向)和主視方向(Y軸方向)最小正交包圍框(圖3中雙點(diǎn)劃線所示的假想矩形),并且計(jì)算出沿俯視或主視方向觀察時(shí),假想矩形左下角點(diǎn)和右上角點(diǎn)坐標(biāo)p1、p2。然后再求出三維實(shí)體長(L)、寬(W)、高(H)和視圖間距尺寸d。
圖3 西南等軸測世界坐標(biāo)系下立體包圍框和z軸矢量位置圖
程序代碼如下:
(defun bound (/ blk_bound )
(setq blk_bound (acet-geom-ss-extents ss t))
(setq p1 (car blk_bound))
(setq p2 (cadr blk_bound)) )
(defun c: example1 ()
(command "-view" "swiso" )
(command "ucs" "w")
(setq en (car (entsel "? 選擇三維實(shí)體")))
(command "copy" en "" "0,0,0" "0,0,0")
(setq ss (ssget "L")) (bound)
(setq W(- (cadr p2) (cadr p1)))
(command "ucs" "x" 90) (bound)
(setq L(- (car p2) (car p1)))
(setq H(- (cadr p2) (cadr p1)))
(setq d(/ (+ W H) 5)))
先切換為主視圖,再根據(jù)圖2中鉤選視圖的數(shù)量,分別按圖3中箭頭所示的位置和方向變換USC的Z軸矢量,最后旋轉(zhuǎn)復(fù)制三維實(shí)體,最多可以生成主、俯、左、右、仰、后六個(gè)不同視角下的三維實(shí)體〔3〕(見圖4)。
以生成主、俯、左三個(gè)視角下的三維實(shí)體為例,程序代碼如下:
(if (= fustz 1) (progn
(command "UCS" "ZA" (list (car p1) (- (cadr p1) d) (caddr p1)) (list (+(car p1) 10) (- (cadr p1) d) (caddr p1)))
(command "rotate" en "" "0,0,0" "C" 90)
(command "UCS" "p")
))
(if (= zuostz 1) (progn
(command "UCS" "ZA" (list (+(car p2) d) (cadr p2) (caddr p1)) (list (+(car p2) d) (+(cadr p2) 10) (caddr p1)))
(command "rotate" en "" "0,0,0" "C" 90)
(command "UCS" "p")))
以此類推,可得到其它三維實(shí)體(圖4)。
當(dāng)沒選擇主視圖時(shí),刪除生成主視圖的立體
(if (= zustz 0) (command "erase" en "" ))
圖4 按六視圖規(guī)則旋轉(zhuǎn)復(fù)制三維實(shí)體
(1) 將“3→2專用”圖層中的n個(gè)三維實(shí)體在視口中最大化命令為(command "zoom" "e")
(2) 將對象鉛直向上移動(dòng)
移動(dòng)距離為當(dāng)前視口高度尺寸的2倍,使其在視口內(nèi)不可見。程序代碼為:
(command "move" (ssget "x" '((8 . “3→2專用”))) "" "0,0" (list 0 (* 2 (getvar "viewsize "))))
(3) 打開“3→2專用”圖層
程序代碼為:(Command "_.-layer" "_on" “3→2專用” "")
(4) 執(zhí)行平面攝影flatshot命令
程序代碼為:(command "_.flatshot" (list 0 hhh) "" "" "")
(5) 刪除“3→2專用”圖層中所有三維立體
程序代碼為:(command "_.erase" (ssget "x" '((0 . "3dsolid") (8 . “3→2專用”))) "")
(6) 帶基點(diǎn)復(fù)制由flatshot命令生成的視圖塊,然后再粘貼到視口內(nèi)
程序代碼如下:
(setq m (ssget "L"))
(bound)
(if (= (+ zustz fustz zuostz youstz yangstz houstz) 1)
(command "copybase" p1 (entlast) "" ) (command "copybase" (polar p1 (angle p1 p2) (* 0.5 (distance p1 p2))) (entlast) "" ) )
(command "erase" (entlast) "" )
(command "view" "r" "stx")
(command "layer" "t" "*" "")
(command "_layer" "m" clayer_bak "")
(command "ucs" "v")
(command "pasteclip" pause)
至此,程序運(yùn)行完畢
圖5 執(zhí)行flatshot命令創(chuàng)建二維視圖
本文所給論述的編程方法,經(jīng)過了反復(fù)的實(shí)驗(yàn)和應(yīng)用,其視圖的生成速度以秒計(jì),大幅度提高了二維工程圖樣的繪圖效率,具有一定的實(shí)用價(jià)值。