■陳培龍
(漳州市測(cè)繪設(shè)計(jì)研究院福建漳州363000)
AUTOLISP實(shí)現(xiàn)SCS編碼與南方CASS編碼的轉(zhuǎn)換
■陳培龍
(漳州市測(cè)繪設(shè)計(jì)研究院福建漳州363000)
地形圖的編碼在各種軟件中存在的方式各不一樣,由于地形圖成圖軟件的更換,地形圖編碼也需要進(jìn)行轉(zhuǎn)換。本文主要論述利用Autolisp語(yǔ)言進(jìn)行二次開(kāi)發(fā),實(shí)現(xiàn)SCS地形圖編碼轉(zhuǎn)換到南方CASS地形圖編碼的一種方法。
SCS編碼 CASS編碼 編碼轉(zhuǎn)換
近年來(lái)隨著計(jì)算機(jī)技術(shù)的進(jìn)步,測(cè)繪行業(yè)的計(jì)算機(jī)參與也在發(fā)生著日新月異的變化,特別是隨著Autocad軟件的更新,各種成圖軟件的發(fā)展變得更加快速。筆者所在單位一直在使用廣州SCS成圖軟件,但隨著SCS軟件停止更新以及南方CASS的普及和發(fā)展,在去年筆者的單位也對(duì)成圖軟件進(jìn)行了全面的更新。由于兩種軟件的編碼方式存在較大的差異,地形圖地物編碼在軟件中存在的方式和編碼采用的規(guī)范,都存在較大的區(qū)別,造成大量已有圖形需要由SCS編碼格式轉(zhuǎn)換為南方CASS格式。限于文章篇幅,本文主要講述如何使用Autolisp程序語(yǔ)言,實(shí)現(xiàn)SCS圖形中的建筑物批量轉(zhuǎn)換成南方CASS編碼。
SCS中建筑物的編碼存儲(chǔ)于建筑輪廓線的厚度值屬性中,建筑物的層數(shù)僅依靠對(duì)應(yīng)的文字來(lái)體現(xiàn),在編碼中無(wú)法直接識(shí)別。通過(guò)查詢建筑物輪廓線的圖元組碼可以發(fā)現(xiàn)其厚度值存儲(chǔ)于39組碼中,譬如磚的編碼為2110300,則其對(duì)應(yīng)的建筑物輪廓線的組碼可以查詢到(39.2110300)的屬性(如圖1)。南方CASS的編碼方式與SCS有較大的區(qū)別,在南方CASS中建筑物的編碼也是存儲(chǔ)建筑物輪廓線中,但區(qū)別于SCS的是南方CASS編碼不是存儲(chǔ)于厚度值中,而是存儲(chǔ)于一個(gè)名為SOUTH的擴(kuò)展屬性組中。該屬性組不僅保存了建筑物的編碼,而且存儲(chǔ)了該建筑物的層數(shù)(地上建筑層數(shù)為正值,地下為負(fù)值)。譬如砼的編碼為141111,層數(shù)為1,則其對(duì)應(yīng)的建筑物輪廓線的Cad組碼可以查詢到(~3(SOUTH(1000.141111) (1040.1.0))))(如圖2)。兩種編碼方式存在較大的不同,SCS直接存儲(chǔ)于厚度值中,能夠非常方便的進(jìn)行修改,但是也比較容易出錯(cuò);比如在縮放圖形的過(guò)程中,編碼值也會(huì)隨之變換;CASS的編碼方式只能通過(guò)特定的程序進(jìn)行讀取和修改,易用性較差,但是不會(huì)引起誤操作,安全性高很多,而且在編碼中直接存了建筑物層數(shù),在后期如果需要對(duì)地形圖的建筑物面積進(jìn)行計(jì)算時(shí),能夠非常方便的使用。
由于成圖平臺(tái)的更換,大量的地形圖需要由SCS編碼轉(zhuǎn)換為南方CASS編碼,對(duì)于明確對(duì)應(yīng)的編碼只需根據(jù)編碼值批量轉(zhuǎn)換即可,但是建筑物中,由于SCS的編碼中沒(méi)有表示建筑物的層數(shù),所以無(wú)法直接轉(zhuǎn)換為對(duì)應(yīng)的南方CASS編碼,人工操作只能一個(gè)一個(gè)進(jìn)行,過(guò)程繁瑣而且耗費(fèi)大量的人力,出錯(cuò)率很高。故筆者使用LISP語(yǔ)言編寫(xiě)了一個(gè)程序,能夠直接根據(jù)建筑物輪廓線識(shí)別其對(duì)應(yīng)的文字注記從而分辨出該建筑物層數(shù),并直接根據(jù)南方CASS編碼的結(jié)構(gòu)模式,寫(xiě)入對(duì)應(yīng)的南方CASS編碼,從而實(shí)現(xiàn)兩種編碼的轉(zhuǎn)換。
圖1 SCS編碼的CAD組碼
圖2 CASS編碼的CAD組碼
在圖形轉(zhuǎn)換前,先將需要轉(zhuǎn)換的建筑物注記文字圖層修改為建筑物標(biāo)注圖層,選取JMD圖層中所有閉合的建筑物輪廓線,然后一一讀取多段線的端點(diǎn)坐標(biāo),組成一個(gè)列表,再根據(jù)這個(gè)表使用SSGET函數(shù)分別選取多段線內(nèi)的注記文字,然后根據(jù)文字中的內(nèi)容識(shí)別出該建筑物的層數(shù)。然后構(gòu)建類(lèi)似于(~3(SOUTH(1000.141121) (1040.2.0))))格式的編碼值,將其存入該建筑物輪廓線中,實(shí)現(xiàn)編碼的轉(zhuǎn)換。
4.1批量歸層建筑文字
由于時(shí)間跨度較多,地形圖上的很多數(shù)據(jù)并不是非常的規(guī)范,建筑物文字注記的圖層也比較多而且比較亂。由于識(shí)別建筑物層數(shù)主要的依據(jù)就是建筑的文字注記,因此為確保建筑物輪廓線與其文字注記的一一對(duì)應(yīng)關(guān)系,首先需要把建筑物注記文字都?xì)w類(lèi)到相同的圖層中,命名該圖層為建筑物標(biāo)注圖層。在編碼轉(zhuǎn)換的過(guò)程中,只需搜索圖面上文字基點(diǎn)在建筑物輪廓線內(nèi)并且在建筑物標(biāo)注圖層內(nèi)的文字進(jìn)行分析即可,大大提高程序的準(zhǔn)確性和執(zhí)行速度。為了快速的實(shí)現(xiàn)文字的圖層歸類(lèi),筆者提供了jjgc命令,程序首先讀取一個(gè)預(yù)先編輯好的對(duì)照文件,程序自動(dòng)搜索文本中定義的文字,并將其歸類(lèi)入文本的設(shè)定好的圖層中。
4.2自動(dòng)生成南方CASS編碼
程序運(yùn)行前,先根據(jù)南方CASS編碼規(guī)則,創(chuàng)建一個(gè)列表如下:
(("砼"141111)("磚"141121)("鐵"141131)("鋼"141141)(" 木"141151)("混"141161)("簡(jiǎn) "141200)("建"141300)("破" 141400)))
表中存儲(chǔ)了各種建筑物材質(zhì)及對(duì)應(yīng)的南方CASS編碼。執(zhí)行時(shí),根據(jù)建筑物輪廓線一一搜索在線內(nèi)且圖層為建筑物標(biāo)注圖層的文字,將這些文字圖元放入一個(gè)選擇集中。當(dāng)選擇集的數(shù)目為0或者大于1時(shí),將該輪廓線放入無(wú)法識(shí)別的建筑物輪廓線圖層中;如果選擇集的數(shù)目為1,程序就將其作為該輪廓線的文字標(biāo)注進(jìn)行編碼匹配。匹配時(shí)首先使用Substr函數(shù),截取注記的第一個(gè)文字,并在列表中搜索相應(yīng)的編碼,根據(jù)返回的值,構(gòu)建一個(gè)類(lèi)似于(~3 (SOUTH(1000.141121)(1040.2.0))))格式的列表,使用Append函數(shù)將該屬性加入到建筑物輪廓線中,最后將該文字放入JMD圖層并將其與建筑物輪廓線使用Group命令編組,即可實(shí)現(xiàn)編碼的自動(dòng)轉(zhuǎn)換。
主要代碼如下:
(defun c:crsx(/wlist listcz ss i en)
(if(not(tblsearch"layer""識(shí)別后的房屋注記"))(command"lay~er""n""識(shí)別后的房屋注記"""));如果不存在圖層則新建識(shí)別后的房屋注記圖層
(if(not(tblsearch"layer""無(wú)法識(shí)別"))(command"layer""n""無(wú)法識(shí)別"""));如果不存在圖層則新建無(wú)法識(shí)別圖層
(setq oldpk(getvar"PICKSTYLE")(setvar"PICKSTYLE"0) (vl~load~com)
(regapp"SOUTH")(setq wlist'())
(setq listcz'(("砼"141111)("磚"141121)("鐵"141131)("鋼" 141141)("木"141151)("混"141161)("簡(jiǎn)"141200)("建"141300)(" 破"141400)));創(chuàng)建建筑物注記文字及南方CASS編碼對(duì)照列表
(setq ss(ssget"x"'((~4."
(if ss(prong(setq i 0)
(repeat(sslength ss);對(duì)每個(gè)建筑物輪廓線一一處理
(setq en(Vlax~Ename~>Vla~Object(ssname ss i)))
(setq listzb(Vlax~Get en'Coordinates))(setq j 0)(setq listzbx'())
(while( (setq listzbx(append listzbx(list(list(nth j listzb)(nth(+j 1)listzb))) )) (if(="AcDb2dPolyline"(Vlax~Get en'ObjectName))(setq j(1+j)));構(gòu)建坐標(biāo)表 (setq j(+j 2))) (setq ss1(ssget"cp"listzbx'((0."TEXT")(8."建筑物標(biāo)注圖層") )));選擇輪廓線內(nèi)的文字 (setq ss2(ssadd)) (if ss1(fenxiwenzi)(command"change"ss"p""la""無(wú)法識(shí)別" ""));如果建筑物輪廓線內(nèi)有建筑物標(biāo)注文字則進(jìn)行識(shí)別,否則將建筑物輪廓線放入無(wú)法識(shí)別圖層 (setq i(1+i)))))(setvar"PICKSTYLE"oldpk) (defun fenxiwenzi();開(kāi)始建筑物材質(zhì)、層數(shù)識(shí)別 (setq cengshu"1") (setq nr(cdr(assoc 1(entget(ssname ss1 0))))) (if(=(strlen nr)2)(setq caizhi(substr nr 1 2)));識(shí)別材質(zhì) (if(=(strlen nr)3)(progn(setq caizhi(substr nr 1 2))(setq cengshu (substr nr 3 1))));識(shí)別層數(shù) (if(>(strlen nr)3)(progn(setq caizhi(substr nr 1 2)) (if(and(>(ascii(substr nr 4 1))47)(<(ascii(substr nr 4 1))59)) (setq cengshu(substr nr 3 2)) (setq cengshu(substr nr 3 1))))) (if(assoc caizhi listcz)(progn (setq listkzsx(list~3(list"SOUTH"(cons 1000(itoa(nth 0(cdr (assoc caizhi listcz)))))(cons 1040(atof cengshu)))));根據(jù)材質(zhì)從列表中找到對(duì)應(yīng)的南方CASS編碼 (setq endata(entget(ssname ss i))) (setq ss2(ssadd(ssname ss i)ss2)) (setq endata(append endata(list listkzsx))) (entmod endata);將建筑輪廓線加入南方CASS編碼 (if(/=cengshu"1")(progn (command"layer""s""識(shí)別后的房屋注記""");將識(shí)別的文字注記修改圖層 (setq enwz(ssname ss1 0)) (setq endatawz(entget enwz)) (setq ptwz(polar(polar(cdr(assoc 10 endatawz))0 0.7232)(/pi 2) 0.25)) (setq oldys(getvar"textstyle")) (setvar"textstyle""細(xì)等線體") (command"text""j""mr"ptwz"0.5"""caizhi);生成南方格式的文字注記 (wenzisx(entlast))(setq ss2(ssadd(entlast)ss2))(setvar"textstyle" oldys) (setq oldys(getvar"textstyle"))(setvar"textstyle""正等線體") (command"text""j""ml"(polar ptwz 0 0.25)"0.4"""cengshu) (wenzisx(entlast)) (setq ss2(ssadd(entlast)ss2))(setvar"textstyle"oldys)) (prong(command"layer""s""識(shí)別后的房屋注記""") (setq enwz(ssname ss1 0))(setq endatawz(entget enwz)) (setq ptwz(polar(polar(cdr(assoc 10 endatawz))0 0.7232)(/pi 2) 0.25)) (setq oldys(getvar"textstyle"))(setvar"textstyle""細(xì)等線體") (command"text""j""mr"ptwz"0.5"""caizhi)(wenzisx(entlast)) (setq ss2(ssadd(entlast)ss2))(setvar"textstyle"oldys))) (command"group""c""*"""ss2"");將文字注記及輪廓線編組 (command"erase"(ssname ss1 0)"")))) (defun wenzisx(enwzsx)(setq endatawzsx(entget enwzsx)) (setq listwzsx(list~3(list"SOUTH"(cons 1000"141111~1"))));將建筑文字注記加入南方CASS編碼 (setq endatawzsx(append endatawzsx(list listwzsx)))(entmod endatawzsx)) 通過(guò)筆者的方法,能夠?qū)崿F(xiàn)地形圖SCS編碼與南方CASS編碼的快速轉(zhuǎn)換。由于兩種編碼方式的不同,在地形圖轉(zhuǎn)換時(shí)會(huì)產(chǎn)生大量的需要人工干預(yù)的工作。通過(guò)本文描述的辦法,能夠快速、準(zhǔn)確的將地形圖的建筑編碼轉(zhuǎn)換為南方CASS編碼,轉(zhuǎn)換的速度快、準(zhǔn)確率高,大大提高了工作效率,節(jié)省了人力物力。 [1]AutoCAD 2004幫助:開(kāi)發(fā)者文檔 [R]. [2]任航科.LISP語(yǔ)言在測(cè)繪作業(yè)中的應(yīng)用 [J].城市勘測(cè),2011(1):110~112. [3]朱虹.淺談Autocad與一些常用軟件的結(jié)合運(yùn)用 [J].科技轉(zhuǎn)讓集錦,2010(2). P694[文獻(xiàn)碼]B 1000~405X(2016)~4~476~25 結(jié)語(yǔ)