AutoCAD作為強(qiáng)大而專業(yè)的工程繪圖軟件,提供了豐富的矢量圖編輯工具,但也有一些常用的特殊編輯功能沒有提供,給交互式繪圖工作中的圖形編輯帶來了不便。例如, 在繪制地理圖時(shí), 經(jīng)常遇到繪制鐵路線;在手動(dòng)矢量化過程中,為精確調(diào)整矢量圖與底圖的符合程度, 需要增加或減少多義線節(jié)點(diǎn)。這些功能AutoCAD缺省時(shí)無法實(shí)現(xiàn),如果通過編程讓計(jì)算機(jī)自動(dòng)完成上述功能,則既可提高工作效率又可減輕工程設(shè)計(jì)人員的勞動(dòng)強(qiáng)度。
AutoCAD軟件提供了許多開放式接口,允許用戶通過這些接口對(duì)AutoCAD進(jìn)行二次開發(fā),為AutoCAD增加新功能,以滿足用戶的工作需要。LISP語(yǔ)言程序就是常用的一種,在AutoCAD R14中,將編寫的LISP程序(函數(shù))加入到ACADr14.LSP 文件中,這些函數(shù)就如同AutoCAD的基本命令一樣,非常方便。下面開發(fā)的幾個(gè)LISP函數(shù)程序分別實(shí)現(xiàn)了繪制鐵路線型、多義線節(jié)點(diǎn)的增加、刪除操作等特殊編輯功能。
繪制鐵路線型
1.程序設(shè)計(jì)思路
在AutoCAD的線型庫(kù)文件ACAD.LIN、ACADISO.LIN分別新增實(shí)線段與空白段之比為1∶1、名為“Railway” 的線型,描述格式如下:
在ACAD.LIN中增加:
*Railway,Railway — —
A,1,-1
在ACADISO.LIN中增加:
*Railway,Railway — —
A,15,-15
通過對(duì)選定多義線設(shè)置線寬(鐵路線寬),原點(diǎn)拷貝,將由拷貝生成的多義線設(shè)置為新建的“鐵路”圖層,顏色設(shè)為“白色”,線型設(shè)為“Railway”,線寬為原線寬的0.7倍,這樣原多義線與疊加在其上的寬度稍窄的白色虛線就構(gòu)成了形象逼真的鐵路線。
2.程序代碼
(defun c:tlx()
(setvar “cmdecho” 0)
(setq ss (ssget ‘((0 .“LWPOLYLINE”))))
(if (equal ss NIL)
(exit) ; 沒有選擇對(duì)象或已取消
)
(setq tlkd (getstring“請(qǐng)輸入鐵路線寬度:”))
(command “pedit” ss “width” tlkd “”)
(command “copy” ss “” “0,0” “0,0” “”)
(command “layer” “m” “鐵路” “L” “Railway” “” “”)
(command “layer” “s” “鐵路” “c” “255” “” “”)
(setq sset (ssget “L”))
(command “pedit” sset “width” (setq tlkd1 (* (atof tlkd) 0.7)) “L” “ON” “”)
(setq ename1 (ssname sset 0)
ent1 (entget ename1))
(setq ent11 (nth 5 ent1))
(setq ent11 (subst (cons 8 “鐵路”) ent11 ent1))
(entmod ent11)
(setq ent12 (nth 6 ent11))
(setq ent12 (subst (cons 6 “Railway”) ent12 ent11))
(entmod ent12)
)
增加多義線節(jié)點(diǎn)
1. 程序設(shè)計(jì)思路
選定多義線,通過設(shè)置“最近點(diǎn)”捕捉方式精確定位所增加節(jié)點(diǎn)的位置。提取多義線的定義數(shù)據(jù)表中的節(jié)點(diǎn)坐標(biāo),通過檢測(cè)添加點(diǎn)到相鄰兩節(jié)點(diǎn)距離之和是否等于兩節(jié)點(diǎn)間距離的方法,判斷添加節(jié)點(diǎn)所在的位置。把添加點(diǎn)的坐標(biāo)插入數(shù)據(jù)表中與之相鄰的兩節(jié)點(diǎn)坐標(biāo)之間,并對(duì)多義線的定義數(shù)據(jù)表進(jìn)行更新,以達(dá)到增加節(jié)點(diǎn)的目的。
2. 程序代碼
(defun c:add_V()
; add_Vertex.lsp
; 要求用戶選定多義線
(princ “ Select LWPolylines: ”)
(setq ss (ssget ‘((0 . “LWPOLYLINE”))))
(if (equal ss NIL)
(exit)) ; 沒有選擇對(duì)象或已取消
; 獲得單個(gè)多義線
(setq ename (ssname ss 0)
ent (entget ename)
listlength (length ent)
elementcounter 1)
(setq e2 (entsel“請(qǐng)?jiān)黾右粋€(gè)節(jié)點(diǎn):”))
(setq ent11 (nth 1 e2))
(setq ent11 (osnap ent11 “nea”))
;最近點(diǎn)精確捕捉
(setq e3 (cons 10 ent11))
(setq el10 (list (car ent)))
(setq el20 (cdr (assoc 10 ent)))
(setq element2 el20)
(setq k 0)
; 從多義線清單中獲得每個(gè)元素
(while (< elementcounter listlength)
; 從表中獲得一個(gè)元素
(setq element (nth elementcounter ent)
kind (car element))
(if (equal kind 10)
; 該元素所含的坐標(biāo)
(progn
; 獲取坐標(biāo) (OCS系統(tǒng))
(setq OCSpoint (list (nth 1 element); x坐標(biāo)
(nth 2 element))) ; y坐標(biāo)
(setq element2 (trans OCSpoint ename 1)); 將OCS系統(tǒng)轉(zhuǎn)為UCS系統(tǒng)
(setq element1 (cons 10 element2))
(setq dist (distance element2 el20))
(setq dist1 (distance ent11 element2))
(setq dist2 (distance ent11 el20))
(setq dist (rtos dist 2 4))
(setq dist1 (rtos dist1 2 4))
(setq dist2 (rtos dist2 2 4))
(if (= (atof dist) (+ (atof dist1) (atof dist2)));判斷節(jié)點(diǎn)位置并將其坐標(biāo)加入表中
(progn
(setq ent11 (trans ent11 1 ename))
;將UCS系統(tǒng)轉(zhuǎn)為OCS系統(tǒng)
(setq e3 (cons 10 ent11))
#p#分頁(yè)標(biāo)題#e#(setq el10 (cons e3 el10))
(setq k 1)
)
)
)
)
(setq el1 (cons element el10))
(setq kind “”)
(setq elementcounter (1+ elementcounter))
(setq el10 el1)
(setq el20 element2)
)
(if (= k 0) (print “添加點(diǎn)沒選中,重試!”))
(setq ent (reverse el1))
(entmod ent);表更新
(setq ss NIL)
(princ “ Ready.”)
(princ)
)
多義線節(jié)點(diǎn)的刪除
1. 程序設(shè)計(jì)思路
選定多義線,通過設(shè)置“端點(diǎn)”、“交點(diǎn)”捕捉方式定位刪除節(jié)點(diǎn)的位置。提取多義線的定義數(shù)據(jù)表中的節(jié)點(diǎn)坐標(biāo),通過檢查所刪節(jié)點(diǎn)在定義數(shù)據(jù)表中的位置,把數(shù)據(jù)表中的對(duì)應(yīng)節(jié)點(diǎn)坐標(biāo)數(shù)據(jù)刪除,并對(duì)多義線的定義數(shù)據(jù)表進(jìn)行更新,以達(dá)到刪除節(jié)點(diǎn)的目的。
2. 程序代碼;
remove_vertex.lsp
(defun c:rem_v(); 要求用戶選定多義線
(princ “ Select LWPolylines: ”)
(setq ss (ssget ‘((0 . “LWPOLYLINE”))))
(if (equal ss NIL)
(exit) ; 沒有選擇對(duì)象或已取消); 獲得單個(gè)多義線
(setq ename (ssname ss 0)
ent (entget ename)
listlength (length ent)
elementcounter 1)
(setq e2 (entsel“請(qǐng)選擇一個(gè)節(jié)點(diǎn):”))
(setq ent11 (nth 1 e2))
(setq ent11 (osnap ent11 “int,end”))
(setq e3 (cons 10 ent11))(setq el10 (list (car ent))); 從表中獲得每個(gè)元素
(while (< elementcounter listlength); 從表中獲得一個(gè)元素
(setq element (nth elementcounter ent)
kind (car element))
(if (equal kind 10); 該元素所含的坐標(biāo)
(progn; 獲取坐標(biāo) (以O(shè)CS系統(tǒng))
(setq OCSpoint (list (nth 1 element); x坐標(biāo)
(nth 2 element))) ; y坐標(biāo)
(setq element1 (trans OCSpoint ename 1))
; 將OCS系統(tǒng)轉(zhuǎn)為UCS系統(tǒng)
(setq element1 (cons 10 element1))
)
)
(if (equal element1 e3)
(setq el1 el10)
(setq el1 (cons element el10))
)
(setq element1 “”)
(setq elementcounter (1+ elementcounter))
(setq el10 el1)
)
(setq ent (reverse el1))
(entmod ent)
(setq ss NIL)
(princ “ Ready.”)
(princ)
)
應(yīng)當(dāng)指出的是上述多義線節(jié)點(diǎn)的增加、刪除操作適合于任何用戶坐標(biāo)系統(tǒng)的圖形文件。在程序設(shè)計(jì)中,還涉及到坐標(biāo)系統(tǒng)轉(zhuǎn)換,即OCS系統(tǒng)(對(duì)象坐標(biāo)系統(tǒng))與UCS(用戶坐標(biāo)系統(tǒng))之間的轉(zhuǎn)換,原因是多義線定義數(shù)據(jù)表中的坐標(biāo)為對(duì)象坐標(biāo),屏幕圖元的顯示坐標(biāo)為用戶坐標(biāo),在非WCS(世界坐標(biāo)系)坐標(biāo)系中,屏幕上同一點(diǎn)對(duì)象坐標(biāo)與顯示坐標(biāo)是不同的,因此,在兩者坐標(biāo)數(shù)據(jù)進(jìn)行比較時(shí)必須使用同一種坐標(biāo)系。
相關(guān)文章
- 2021-08-23精通AutoCAD三維設(shè)計(jì)與開發(fā)PDF下載
- 2021-08-22AutoCAD 2013應(yīng)用與開發(fā)系列中文版AutoCAD 2013室內(nèi)裝
- 2021-08-22AutoCAD 2013應(yīng)用與開發(fā)系列中文版AutoCAD 2013機(jī)械圖
- 2021-08-19數(shù)字化成圖-最新AutoCAD地形圖測(cè)繪高級(jí)開發(fā)PDF下載
- 2021-08-03Autodesk RevitStructure2012應(yīng)用寶典 [歐特克軟件(中
- 2021-08-02Autodesk RevitMEP2012應(yīng)用寶典 [歐特克軟件(中國(guó))有限
- 2021-08-02Autodesk Revit2013族達(dá)人速成 [歐特克軟件(中國(guó))有限公
- 2021-08-01Visual Basic與AutoCAD二次開發(fā)PDF下載
- 2021-07-31Autodesk Revit2012族達(dá)人速成 [歐特克軟件(中國(guó))有限公
- 2021-07-18AutoCAD VBA開發(fā)手冊(cè)PDF下載