摘要:該文主要討論在房產測繪中對于autocad軟件中的lisp語言編程的應用。通過使用符合工作環境與要求的編程提高繁瑣而細致的房產測繪內業作業中的工作效率。
關鍵詞:AutoLISP;房產測繪
AutoLISP Language in the Real Estate Mapping
ZHOU Lan-jie, LIU Ling-yan
(Seismic Survey Research Center, Xiamen 361021, China)
Abstract: This paper mainly discusses about the application of LISP in daily work of real-estate mapping. By programming, we can meet the need of complicated and meticulous work in real-estate mapping and improve work performance.
Key words: AutoLISP; real-estate mapping
房地產測繪是關系到百姓民生的重要測繪項目。在繁瑣復雜的工作中要做到細致認真,保證數據質量的可靠性。而面對龐大的數據量,如何通過有效的編制一定的程序讓計算機為我們的作業人員服務,從而提高工作效率,成為我們需要思考的問題。在這里,我們通過編制LISP程序來實現一定的提高。
1 AutoLISP語言簡介及其應用
AutoLISP全名是LIST Processing Language,出現于1985年推出的AutoCAD R2.18中,是一種嵌入在AutoCAD內部的編程語言,是LISP原版的一個子集,她一直是低版本AutoCAD的首選編程語言。她是一種表處理語言,是被解釋執行的,任何一個語句鍵入后就能馬上執行,她對于交互式的程序開發非常方便,其缺點是繼承了LISP語言的編程規則而導致繁多的括號。隨著AutoCAD在數字化測繪的流行,AutoLISP也隨之成為二次開發的利器。
隨著AutoCAD版本的演進,目前VisualLISP已經被完整的集成到AutoCAD 2000以上的版本中,她為開發者提供了嶄新的、增強的集成開發環境,一改過去在AutoCAD中內嵌AutoLISP運行引擎的機制,這樣開發者可以直接使用AutoCAD中的對象和反應器,進行更底層的開發。其特點是自身是AutoCAD 2000中默認的代碼編輯工具;用她開發AutoLISP程序的時間被大大的縮短,原始代碼能被保密,以防盜版和被更改;能幫助大家使用ActiveX對象及其事件;使用了流行的有色代碼編輯器和完善的調試工具,使大家很容易創建和分析LISP程序的運行情況。在VisualLISP中新增了一些函數:如基于AutoLISP的ActiveX/COM自動化操作接口;用于執行基于AutoCAD內部時間的LISP程序的對象反應器;新增了能夠對操作系統文件進行操作的函數。
在數字化測繪的世界里,AutoCAD是被廣泛使用的成圖軟件,針對AutoCAD進行的二次開發也廣泛流行,例如被廣泛采用的CASS系統及各種建筑軟件等。而針對不同要求的工程項目,一套普遍適用的軟件總是會在細小的環節表現出不適應性,或者說,我們可以通過簡單的編程從細節上滿足作業人員的需要,改善工作表現,提高工作效率。
2 房產測繪工作流程簡介
在房產測繪中,我們需要將外業中形成的房屋草圖繪制成CAD圖件并加以注記。一般情況下要區分幾個圖層,線劃層,注記層,權屬線層等。在紛繁復雜的圖形中,通過人眼分辨并從多個圖層中分辨并操作正確,在長期的工作中容易導致疲勞并帶來誤操作。我們需要計算機能夠對特定的圖層中的目標進行選定和操作。
3 程序實現
通過vlide命令我們進入到lisp語言的編輯界面中,新建一個lsp文件以供編輯,并保存下來,在今后的工作中通過調用這個文件來訪問并使用這些命令。在此我們簡要的對自己工作中產生的幾個典型的命令進行介紹。
本文討論的程序在AutoCAD 2004版本AutoLISP環境中運行通過。
3.1 查詢指定圖層閉合多段線面積并注記
(defun c:mj(/ s bh mj str p)
(command \"layer\" \"m\" \"5說明注記\" \"\")
(princ \"\plz choose target in layer 3!\")
(command \"osnap\" \"\")
(setq s(entsel))
(if s(progn
(setq s(car s))
(setq bh (cdr (assoc 70 (entget s))))
(redraw s 3)
(if (/= (boole 1 bh 1) 1)(princ \"arget not closed, plz check!\"))
(command \"_area\" \"o\" s)
(setq mj (getvar \"area\"))
(if (= mj 0)(exit))
(setq mj (rtos mj 2 3))
(princ (strcat \"\end in:\" mj \"㎡\"))
(setq str (getstring \"\note:\"))
(setq mj (strcat str \"=\" mj))
(setq p (getpoint \"\point out the point\"))
(if p (progn
(command \"style\" \"standard\" \"宋體\" 0.35 1 \"\" \"\" \"\")
(command \"text\" p 0 mj)
)
)
(redraw s 4)
)
(princ \"\ ** hands up, it's a hold up! **\")
)
(princ)
)
3.2 對注記層面積注記進行累加計算
(defun c:zmj()
(princ \"\plz choose numbers in layer 5 to sum\")
(setq s (ssget '((0 . \"text\")(8 . \"5說明注記\"))) total 0)
(if s
(progn
(setq l (sslength s)i 0)
(repeat l
(setq e (ssname s i) i (1+ i)
mj (cdr (assoc 1 (entget e)))
)
(if (vl-string-search \"=\" mj)
(setq mj (atof (substr mj (+ 2 (vl-string-search \"=\" mj)))))
(setq mj (atof mj))
)
(setq total (+ total mj))
)
(princ (rtos total 2 3))
(princ \"\point out the point\")
(setq s3 (ssget '((0 . \"text\")(8 . \"5說明注記\"))))
(if s3 (progn
(setq s(ssname s3 0 ) e (entget s) total (rtos total 2 3) t1 (assoc 1 e))
(if (vl-string-search \"=\" (cdr t1))(setq total (strcat \"S=\" total)))
(setq t2 (cons (car t1) total) e (subst t2 t1 e))
(entmod e)
)
)
)
(princ \"\plz choose text including number!\")
)
(princ)
)
3.3 對測量草圖中的墻厚進行注記
(defun c:qh()
(command \"osnap\" \"\")
(setq str (getstring \"\width:\"))
(command \"layer\" \"m\" \"4數據注記\" \"\")
(command \"style\" \"standard\" \"宋體\" 0.35 1 \"\" \"\" \"\")
(setq p (getpoint \"point out the point\"))
(command \"text\" \"m\" p \"0\" str)
(command \"circle\" p 0.3)
(princ)
)
4 結束語
通過思考與實踐,我們能夠使用AutoLISP語言來進行相應的編程,以適應工程項目要求的程序來滿足作業人員簡化操作,提高工作精度,縮短作業時間的要求,從而提高生產效率。在工作中,這樣的例子還有很多,我們需要通過不斷的學習,思考與實踐來提升效率。
參考文獻:
[1] 唐亮,張帆,衛朝富.AutoCAD2002開發教程[M].北京:北京希望電子出版社,2002.
[2] 郭秀娟,于全通,范小鷗.AutoLISP語言程序設計[M].北京:化學工業出版社,2008.