黃 武
(1.廣州市市政工程設計研究院,廣東 廣州 510060)
城市排水系統(tǒng)建設是否完善,直接影響到城市居民的生活質量。面對近年來城市的不斷擴建和內澇問題的日趨嚴重[1],國家于2010~2012年開展了第一次全國水利普查。排水設施專項普查作為其中一項重要內容,全面調查城市管網現(xiàn)狀數(shù)據(jù),建立基礎排水設施地理信息數(shù)據(jù)庫,對城市排水設施的規(guī)劃設計、運營維護及綜合管理有著重要意義。管線數(shù)據(jù)涉及數(shù)據(jù)屬性較多,幾乎每個點、線、面都將近20多項,將這些數(shù)據(jù)準確無誤地錄入數(shù)據(jù)庫是一項重要而復雜的工作。采用GIS軟件直接錄入,要求作業(yè)人員必須熟練操作軟件,錄入過程繁瑣,界面操作不直觀,工作量大;采用大家熟知的CAD軟件作為數(shù)據(jù)錄入的中間載體,利用Lisp語言進行二次開發(fā),將會大大減少數(shù)據(jù)錄入的工作量。
Visual Lisp語言是內嵌于AutoCAD軟件上的一款開發(fā)工具。它具有獨立的集成開發(fā)環(huán)境,包括文本編輯器、語法檢查器、源代碼調試器及智能化的控制臺等。用戶利用它可以隨意地編輯、編譯、修改及調試Auto Lisp源程序,通過編譯得到運行效率高、代碼緊湊、源代碼受保護的應用程序[2]。因為Auto Lisp是一種內嵌于AutoCAD中的表處理程序設計語言,屬于解釋型高級語言,它能夠直接在AutoCAD內部運行,具有語法簡潔、表達力強、函數(shù)種類多、程序結構靈活、易學易用等特點,是AutoCAD二次開發(fā)的理想工具[3,4]。
排水設施專項普查作為全國第一次水利普查的子項,從前期方案的制定到外業(yè)數(shù)據(jù)采集、內業(yè)整理入庫,每個環(huán)節(jié)都必須形成一整套完善的工作流程,以便指導每個環(huán)節(jié)的工作。
傳統(tǒng)數(shù)據(jù)入庫可在ArcGIS軟件下直接編輯,由于普查范圍廣,數(shù)據(jù)量大,且在ArcGIS軟件下,其數(shù)據(jù)錄入功能的可操作性不強,如圖面數(shù)據(jù)不直觀。部分相關數(shù)據(jù)不進行自動計算,不能實現(xiàn)自動編號、接邊時難以區(qū)分新舊數(shù)據(jù)等,且要求作業(yè)人員必須熟練掌握軟件的操作。針對這些問題,利用大家熟知的CAD軟件作為數(shù)據(jù)整理的一個平臺,運用于本次排水設施專項普查數(shù)據(jù)入庫工作,詳細工作流程見圖1。
圖1 數(shù)據(jù)入庫流程圖
根據(jù)本次普查的流程和特點,進行二次開發(fā)的程序設計,其詳細開發(fā)流程見圖2。
本程序是針對全國第一次水利普查的數(shù)據(jù)格式開發(fā)的,可以實現(xiàn)的功能主要有測點自動展繪、管段連線、對象屬性的查看及修改、對象名稱及編號的自動處理等。以下重點講述幾個關鍵功能模塊的開發(fā)。
1)對象屬性項添加及編輯。利用Lisp語言,對CAD對象進行屬性的擴展,其代碼為:
(defun extradatayj();(窨井字段添加)
圖2 開發(fā)流程思路
(setq endata (entget en '("ADDR")))
(regapp "ADDR")
(setq new_ext_list(list-3 (list "ADDR"(cons 1000 ""))))
(setq endata (append endata (list new_ext_list)))
(entmod endata)
上述代碼是為窨井數(shù)據(jù)添加一個“ADDR”(地址)的字段名稱,為字符串型,字段名稱與數(shù)據(jù)庫字段完全吻合,能保證后續(xù)數(shù)據(jù)入庫的無損轉換。
為對象增加需要的屬性項目后生成對話框,根據(jù)屬性框提示,填寫并編輯對象屬性值,如圖3。
圖3 地物屬性對話框
2)管段連線過程自動計算并填寫相關數(shù)據(jù)。利用程序開發(fā)的管段連線命令“WS、YS”等進行繪制管段。在繪制過程中,輸入現(xiàn)場調查的深度、管徑及外業(yè)測量的高程值,可自動計算與這些數(shù)據(jù)相關的數(shù)值,并自動填寫在對象屬性表中。如管段要求填寫的起點管底高程、終點管底高程、起點埋深、終點埋深、管段長度值,都可在繪制過程中自動讀取,其現(xiàn)場數(shù)據(jù)采集見圖4。
圖4 現(xiàn)場數(shù)據(jù)采集圖
起、終點管底高程(H1)=起、終點井面高程(H0)-起點管底深度(S1)
起、終點管底埋深(?S)=起、終點管底深度(S1)-管徑(D)/1000-壁厚(μ)
其中H0、S1、D為現(xiàn)場采集數(shù)據(jù)值,μ一般根據(jù)材質的不同設置為常數(shù)。根據(jù)上述關系,編寫語言進行相關計算,其中sur_h為地面高程,d、s為管徑、壁厚(設置為常數(shù)0.05 m),end_h為終點管底高程。
(setq end_sur_h (cdr (car (cdr (cadr (assoc -3 (entget endob '("sur_h")
(if (and (/= end_sur_h "*多種*") (/= end_sur_h nil)(/= gx_d_s nil) (/= b_end_h nil) (/= ob_end_h "*多種*"))
progn (setq ob_endcen_dee (- end_sur_h ob_end_h (*gx_d_s 0.001) 0.05))
(setq endata (entget en '("endcen_dee")))
(setq new_ext_list (list -3 (list "endcen_dee" (cons 1040 ob_endcen_dee))))
(if (setq old_ext_list (assoc -3 endata))
(setq endata (subst new_ext_list old_ext_list endata))
3)作業(yè)編號的自動生成。作業(yè)編號(work_id)作為數(shù)據(jù)庫中地物的唯一標識碼,其填寫的準確性對數(shù)據(jù)庫后續(xù)的運行有重大的影響。因作業(yè)編號的字段較長且需遵循既定的編號規(guī)則,如果采用人工編寫,工作量巨大,且準確率不高,易出現(xiàn)重復。在本次項目中針對該屬性項的填寫,進行程序開發(fā),實現(xiàn)作業(yè)編號的自動生成,關鍵代碼如下:
(setq strictinfo (getstring (strcat " 輸入作業(yè)片區(qū)信息<" strictinfobak ">:")))
(if (or (= strictinfo nil) (= strictinfo "")) (setq strictinfo strictinfobak))
(setq strictinfo (strcase strictinfo))
(setq strictinfobak strictinfo)
(setq nn (getint (strcat " 作業(yè)編號起始流水號<"(itoa start_num) ">:")))
(if (= nn nil) (setq nn start_num))
(setq start_num nn);本次作業(yè)編號起始流水號。
4)數(shù)據(jù)接邊顏色區(qū)分。將普查的數(shù)據(jù)更新到數(shù)據(jù)庫中,存在數(shù)據(jù)融合的問題,在不同時期數(shù)據(jù)的邊界處,存在著新舊數(shù)據(jù)的接邊。而在接邊操作過程中由于不同類型的數(shù)據(jù)都在同一個層上且顏色沒有區(qū)別,故在接邊操作時容易選錯對象。本次開發(fā)中根據(jù)對象屬性中的“checkstate”字段的不同,利用Lisp語言,將該字段中對應為“更新”、“刪除”和“新增”三個類型的對象分別改變成不同的顏色,并放置在不同圖層上。當接邊工作完成后利用“HY”(還原)命令,可將改變的圖層和顏色恢復到之前的狀態(tài),顏色更改的關鍵代碼如下:
(if (= (tblsearch "layer""新 增 層") nil) (command"layer""N""新增層""C""7""新增層""") (command"layer""C""7""新增層"""))
(if (= (tblsearch "layer""更 新 層") nil) (command"layer""N""更新層""C""2""更新層""") (command"layer""C""2""更新層"""))
(if (= (tblsearch "layer""刪 除 層") nil) (command"layer""N""刪除層""C""8""刪除層""") (command"layer""C""8""刪除層""")
5)屬性數(shù)據(jù)檢查。普查對象填寫的屬性項眾多,每個屬性項都有填寫的規(guī)范和標準,數(shù)值數(shù)據(jù)間存在著關聯(lián),空間拓撲關系復雜,在數(shù)據(jù)入庫前必須要保證屬性填寫的正確性,空間拓撲關系的完整性,邏輯關系的合理性。針對此次普查數(shù)據(jù)填寫的特點,利用Lisp語言進行程序編寫,實現(xiàn)基礎的檢查功能,如管點重復、管線端點為空、屬性項為空值、埋深數(shù)據(jù)是否為負值、作業(yè)編號是否一致等。經過檢查,可去除掉很大部分數(shù)據(jù)填寫過程中因粗心造成的錯誤。以下列舉管線端點為空時,程序檢查程序關鍵代碼如下,檢查結果見圖5。
(setq endob_x (rtos (cadr (assoc 10 endobdata)) 2))
(setq endob_y (rtos (caddr (assoc 10 endobdata)) 2))
if (and (wcmatch pt2_x endob_x) (wcmatch pt2_y endob_y))
(progn (setq endob (ssname jcj jj))
(setq gd_gxd_end_result nil)
(setq jj (sslength jcj))
(setq gd_gxd_end_result "終點上無管點,")
圖5 管線端點為空檢查過程
基于Visual Lisp語言對AutoCAD進行二次開發(fā),利用該開發(fā)程序對第一次水利普查——排水設施專項數(shù)據(jù)進行數(shù)據(jù)整理及入庫工作,可借助大家熟知的AutoCAD軟件平臺,實現(xiàn)數(shù)據(jù)的整理入庫工作,避免了直接在GIS軟件上操作的不便。此次排水設施專項數(shù)據(jù)整理的工作結果證實,基于Visual Lisp語言對AutoCAD進行二次開發(fā)可較大程度上減少數(shù)據(jù)整理的工作量,提高作業(yè)效率,節(jié)省成本,減少因人工操作造成的錯誤。
[1]徐丹.從城市內澇災害頻發(fā)看排水規(guī)劃的發(fā)展[J].科技與企業(yè)志,2014(3):122-123
[2]李與權.論AutoCAD的二次開發(fā)[J].電腦編程技巧與維護,1995(3):42-45
[3]江方記.基于AutoCAD進行二次開發(fā)的技術淺析[J].電腦知識與技術,2006(8):140-143
[4]唐志煒.基于Visual Lisp的AUTOCAD的二次開發(fā)[D].長春:吉林大學,2008
[5]馬彥東.利用Auto LISP程序轉換Auto CAD實體[J].科技資訊,2011(13):57-59
[6]譚姝,張墨,張春娥.利用Visual LISP對AutoCAD進行二次開發(fā)[J].山東交通大學學報,2002(4):84-86
[7]康保成. Auto LISP程序在Auto CAD中的應用實例[J].山西建筑,2002(3):157-158
[8]陳文峰,劉祚秋,鐘志輝,等.AutoCAD二次開發(fā)在工程計算軟件中的應用[J].科學技術與工程, 2011(24):5 844-5 847