朱鎮波,王佳卿,滕 松
(1.無錫市測繪院有限責任公司,江蘇 無錫 214000;2.無錫市政設計研究院有限公司,江蘇 無錫 214000)
LISP在三維管線的長度統計方法中的應用
朱鎮波1,王佳卿2,滕 松1
(1.無錫市測繪院有限責任公司,江蘇 無錫 214000;2.無錫市政設計研究院有限公司,江蘇 無錫 214000)
主要介紹了通過利用Lisp語言開發程序,在AUTOCAD的工作環境中對三維管線的電子圖中的數據進行統計計算,精確計算三維管線的長度數據,有關經驗可供相關專業人員參考。
LISP語言;CAD二次開發;三維管線
現代城市地下綜合管線信息,是現代城市空間基礎地理信息的一個重要的組成部分,是現代城市進行規劃建設和管理所需要的重要基礎地理信息。現代城市地下綜合管線信息化建設,是現代城市信息化、數字化建設工作的重要組成部分。在現代化大都市建設的過程中,地下綜合管線信息的調查越來越受到相關領導部門的重視。積極推進城市地下綜合管線信息化的建設,是當前時代的需要,是城市現代化、信息化、數字化建設的需要,也是構建和諧社會的需要。
傳統的綜合管線圖的成圖方法為野外數據采集后室內計算機成圖,當成圖完成后,一般要對綜合管線的長度進行統計計算。在綜合管線圖中,管線一般是以多義線(PLINE)來表示的。很多的商業管線軟件,自帶有統計計算的功能,但商業管線軟件需要購買,很多單位未必會購買。
在CAD中自帶有兩個指令,一個為DIST指令,一個為LIST指令。
DIST指令為測量兩點之間的平面距離,而我在上面的文章中說到,管線一般是用多義線(PLINE)來表示的,是三維的、空間的,如果用DIST指令來測量管線的長度,那得出的是管線投影在平面上的長度,并不是真實的長度,因此,在管線長度的統計工作中,使用DIST指令來統計管線的長度是不正確的。
LIST指令的作用是對于一個或多個對象,返回一個關于一個或多個對象相關屬性的表。在實際操作中我們可以發現,當對PLINE線進行LIST指令操作時,返回的是一張包含多種屬性的表,其中就包含了三維長度。但是,LIST指令只具備了以表的形式顯示屬性的功能,而在管線圖中,對于任意一條管線,它并不是一條完整的多義線(PLINE),而LIST指令不具備統計求和的功能。如果采用LIST指令+人工統計求和的方法,不僅容易出錯,而且還浪費時間和精力,如果去購買商業管線軟件的話,又是一筆不小的開支。因此,筆者決定利用CAD二次開發的方法,來提高工作效率和準確率。
LISP語言(計算機程序設計語言),它是一種通用的高級計算機程序設計語言,在人工智能的領域內被廣泛的應用,甚至長期處于一個壟斷的地位。眾所周知的,LISP是計算機領域第一個函數式的高級計算機程序設計語言,是為人工智能設計服務的語言,有別于B、C語言等命令式程序設計語言和Java、C++、C#等面向對象語言。
LISP語言是一種函數式程序設計語言,所以,對于LISP語言而言,在程序編寫的過程中,函數所有運算都能以函數作用于參數的方式來實現。
有別于一般的命令式的語言程序,LISP語言幾乎不用所謂的變量以及特定的賦值語句,通過對遞歸的函數的調用,來實現重復的過程,因此,在LISP語言的編寫過程中很少使用到循環模式。
LISP是古老的函數語言、弱類型、動態推斷,其代碼本身就是各種列表。每一個表項均可以儲存任何類型的數據如數字、函數、符號或一個子表等,在編碼時,可以隨時操作以更新列表。
LISP核心的操作符只有7個操作符:quote、atom、eq、car、cdr、cons、cond。前三者quote、atom、eq用于符號的推斷;car、cdr、cons操縱表格;cond負責分支判斷。這種簡潔定義,非常接近圖靈機原型的純函數式語言,是現代語言完全無法比擬的。
LISP語言的最大的相對的缺點就是運行效率的低下。原始定義簡潔的缺點使到大型開發工程變得困難,自底層到高層,自二維表查詢到面向對象,使用者需要嵌入更多的函數來實現,致使LISP眾多方言的衍生。
圖1為某項目的綜合管線圖。該項目位于蘇南丘陵區域,該項目區域位置靠山,地勢略有起伏。該綜合管線圖內含有多種地埋管線和架空管線,管線用PLINE線進行表示,架空管線隨著地勢的起伏行走,高差變化較大。因此,DIST指令在該工程中是不建議使用的,如果采用LIST指令+人工統計求和的方法,不僅容易出錯,而且還浪費時間和精力,這是相當的不可取的,筆者決定用LISP語言對CAD進行二次開發。

圖1 某項目綜合管線圖
下面就是具體的執行程序執行語言及其說明:
(setq ObjATrigon(ssget));
獲取所有圖元
(setq lngNum(sslength ObjATrigon));
取得圖元的數目
(setq LngCycle 0)(setq sngAPline 0.00)(While(< LngCy cle lngNum)(setq objSTrigon(ssname ObjATrigon LngCycle));
獲取單個圖元
(setq AcadObject(vlax-get-acad-object)Acad Document(vla-get-ActiveDocumentAcadobject)mSpace(vla-get-ModelSpace Acaddocument));
初始化系統
(setqvlaSTrigon(vlax-ename->vla-objectobjSTrigon);
將轉化成VLA對象
(setq sngSPline(vla-get-Length vlastrigon))
(setq sngAPline(+sngAPline sngSPline))
(setq LngCycle(+LngCycle 1)))
(princ" 所有線段總長")(princ sngAPline);
顯示統計管線的總長
這個程式第一步完成對選擇范圍內的多義線的數量進行統計,第二步完成對提取每條多義線的三維長度,第三步完成對累加選擇范圍內的多義線的長度。這樣就利用LISP自編的程序高效、高精度的完成了本工程的內業工作量的統計計算的問題。
當前,計算機程序語言的二次開發的廣泛應用,為工作生產提高了極大的便利。因此,利用上述方法統計綜合管線圖的管線長度是一種高精度、高速度、高效率、低風險的方法。在不購買商業管線軟件的前提下,該方法完全可以取代其他統計綜合管線圖的管線長度的方法,經濟實惠,值得推廣,也必將成為今后中小管線測繪單位統計綜合管線圖的管線長度的首選方法!
[1]謝剛生,鄒時林.數字化成圖原理與實踐[M].陜西西安:西安地圖出版社,2000.
[2]閻聚群.AUTOCAD2000 Visual Lisp開發[M].湖北武漢:華中理工大學出版社,2000.
TB22
B
1009-7716(2016)05-0234-02
10.16799/j.cnki.csdqyfh.2016.05.065
2016-01-14
朱鎮波(1980-),男,江蘇無錫人,工程師,從事工程測量工作。