摘 要: 以建筑AutoCAD矢量圖形文件為研究載體,以墻體為主要研究對象,設(shè)計(jì)了墻體數(shù)據(jù)深度優(yōu)先探測提取算法。根據(jù)提取出的墻體數(shù)據(jù)集合,設(shè)計(jì)了基于凹點(diǎn)分割的墻體裁剪算法,該算法已在實(shí)踐中進(jìn)行了反復(fù)驗(yàn)證,高效可靠。在此基礎(chǔ)上提出了以中軸線+屬性形式代替墻體的設(shè)計(jì)思想,構(gòu)建墻體抽象模型,為建筑工程量自動(dòng)計(jì)算提供數(shù)據(jù)支持。
關(guān)鍵詞: DXF;墻體識別;凹點(diǎn)判定;剪裁算法
近年來,隨著計(jì)算機(jī)技術(shù)和信息技術(shù)的迅猛發(fā)展,建筑工程概預(yù)算領(lǐng)域中出現(xiàn)了大量的預(yù)算軟件,但這些軟件只是在人工讀圖并計(jì)算出工程量的基礎(chǔ)上完成定額套用、調(diào)整、費(fèi)用計(jì)算、報(bào)表編制等工作,工程量計(jì)算工作還停留在由預(yù)算師人工識別圖紙的階段。因此,如何實(shí)現(xiàn)工程量的自動(dòng)計(jì)算是目前建筑工程概預(yù)算領(lǐng)域研究的主要熱點(diǎn)之一,而建筑工程圖的自動(dòng)識別問題是制約工程量計(jì)算自動(dòng)化水平提高的主要瓶頸。本文模仿人工識圖的思路與方法,以建筑AutoCAD中墻體識別建模為例,設(shè)計(jì)出一套有效識別墻體、裁剪建模的算法,解決AutoCAD與工程量計(jì)算的接口問題,為實(shí)現(xiàn)建筑工程量計(jì)算的自動(dòng)化提供參考。
1 AutoCAD矢量文件研究與墻體元素提取
AutoCAD采用矢量數(shù)據(jù)格式文件DXF存儲圖形信息[1]。DXF是一種被多數(shù)圖形設(shè)計(jì)軟件接受的文件存儲格式,其實(shí)際上已經(jīng)成為一種行業(yè)標(biāo)準(zhǔn)。隨著AutoCAD的新版本不斷推出,對DXF文件格式作了進(jìn)一步調(diào)整,但基本框架保持不變。DXF文件按先后順序分為7大段,其中實(shí)體段是研究的主要目標(biāo),在實(shí)體段中保存著所有離散的圖形圖元[1],這些實(shí)體有Point、Line、Circle、Arc、Trace、Solid、Polyline、Vertex和3Dface等圖形圖元。每段由鍵值對組成,鍵(通常稱為組碼)表明其后的值的類型,使用這些鍵值對可以將AutoCAD圖形元素組織到由記錄組成的區(qū)域中。
本文在對建筑墻體識別之前,首先將DXF格式文件轉(zhuǎn)化為可讀性更好、被軟件普遍接受的XML格式文件[2-4]。DXF格式文件轉(zhuǎn)換成XML格式文件后的數(shù)據(jù)格式如圖1所示。從DXF文件中讀取的信息還處于離散狀態(tài),之間沒有任何聯(lián)系,在進(jìn)行墻體識別、裁剪、建模之前要對這些離散數(shù)據(jù)進(jìn)行必要的預(yù)處理,使其滿足識別需要。在房屋建筑制圖統(tǒng)一標(biāo)準(zhǔn)[5]中,對建筑制圖中的各種圖形元素畫法都作出了非常具體的規(guī)定,其中墻體具有以下特點(diǎn)。
(1)任何一段墻體都構(gòu)成一個(gè)封閉的區(qū)域,并且構(gòu)成墻體的線段數(shù)要大于或等于4;
(2)每段墻體之間通過門、窗等建筑構(gòu)件相連接;
(3)通常按照建筑中墻體的外型,可以將墻體分為L型、T型、C型、+型、直線型和復(fù)雜的不規(guī)則類型等。建筑圖中墻體的常見形狀如圖2所示。
構(gòu)成墻體的主要圖元就是線段,墻體是由若干條線段形成的一個(gè)封閉區(qū)域。對于墻體的數(shù)據(jù)提取,可以采用深度優(yōu)先遍歷方法[6-7],在已讀出的大量線段中任意選取一條作為起始點(diǎn),根據(jù)線段兩端的坐標(biāo)去匹配下一條線段,直到回到起點(diǎn)。
根據(jù)以上特點(diǎn),設(shè)計(jì)用于在離散數(shù)據(jù)中識別提取墻體的算法1。
算法1:墻體識別提取算法
(1)?坌l(wèi)ine?奐{linei|i≥1}。
(2)提取l1起點(diǎn)坐標(biāo)S{x,y,z}。
(3)提取l1終點(diǎn)坐標(biāo)P{x,y,z},與{linei|i≥1}中其他線段起點(diǎn)坐標(biāo)匹配。
(4)匹配成功,得到l2,存儲l1,l1=l2。
(5)LOOP重復(fù)步驟(3)~步驟(4),循環(huán)計(jì)數(shù)器count
IF P{x,y,z}==S{x,y,z},存儲所有墻體線段;
IF count>i,放棄所有線段,重新探測。
經(jīng)過算法1處理后,從眾多離散線段中識別、提取出墻體集合{walli|i≥1}{linei|i≥1}。
2 墻體圖形裁剪算法設(shè)計(jì)
在成功獲取墻體集合后,采用提取墻體中軸線的方法建立墻體數(shù)學(xué)模型,但對于形式復(fù)雜的墻體造型,若直接提取中軸線會(huì)造成建筑工程量計(jì)算的重復(fù),導(dǎo)致數(shù)據(jù)偏差,所以還要對墻體進(jìn)行進(jìn)一步的細(xì)分。本文提出了基于凹點(diǎn)多邊形墻體裁剪算法[8-11],將復(fù)雜墻體分割成相對簡單的墻體單元。
針對平面直角坐標(biāo)系中墻體構(gòu)造的多邊形,判斷凹點(diǎn)及采集算法如下。
算法2:凹點(diǎn)判斷與墻體裁剪算法
在建筑CAD中絕大多數(shù)墻體都是水平或鉛直的,同時(shí)存在有一定角度或弧形的墻體。對于水平和鉛直類墻體,可以使用比較法判斷凹點(diǎn);對于有一定角度的墻體,拐點(diǎn)可以采用斜率法進(jìn)行判斷;對于弧形墻體,將進(jìn)行特殊處理,不在本文討論范圍內(nèi)。
(1)對于水平鉛直墻體的凹點(diǎn)判斷與裁剪算法。
①從墻體集合{walli|i≥1}中選取一組封閉墻體數(shù)據(jù),以x分量最小的點(diǎn)作為起點(diǎn)。
②嚴(yán)格按照順時(shí)針方向遍歷墻體線段。
定義:起始線段li(i=1),起點(diǎn)坐標(biāo)s(xi,yi),終點(diǎn)坐標(biāo)e(xi,yi),順時(shí)針鄰接線段為li+1,起點(diǎn)坐標(biāo)s(xi+1,yi+1),終點(diǎn)坐標(biāo)e(xi+1,yi+1),兩線段交點(diǎn)為P,即e(xi,yi)=s(xi+1,yi+1)。
IF (e|yi>s|yi) and (e|xi+1>e|xi) THEN P為凸點(diǎn);
IF (e|yi>s|yi) and (e|xi+1<e|xi) THEN P為凹點(diǎn);
IF (e|yi<s|yi) and (e|xi+1<e|xi) THEN P為凸點(diǎn);
IF (e|yi<s|yi) and (e|xi+1>e|xi) THEN P為凹點(diǎn);
簡單來說,從起點(diǎn)開始,x、y坐標(biāo)變化滿足下面規(guī)律就是最簡墻體;否則,若存在凹點(diǎn),就延長線段交于墻體線段集合中的某條線段,并分離出一段墻體。
裁剪算法過程演示如圖3所示。在圖3(a)中,選出A為遍歷起點(diǎn)。遍歷過程為:AB(Y↑)→BC(X↑)→CD(Y↓)→DE(X↓)→EF(Y↑)→FG(X↓),在EF-FG線段交點(diǎn)處出現(xiàn)凹點(diǎn),記錄F點(diǎn)信息,向墻體集合中添加輔助線段FX,并將EF延長到X,即用EX代替DF,并將CD、DE、EX、XC從墻體集合中分離出來形成單獨(dú)集合。重復(fù)以上算法,對剩余墻體集合繼續(xù)遍歷,任何一段復(fù)雜的墻體集合通過該算法都能分解成為最簡墻體,即得到墻體的最簡形式。
(2)使用斜率判定非水平鉛直墻體的凹點(diǎn)。
定義:d為相鄰兩條線段的斜率差,由于墻體線段不在水平鉛直狀態(tài),無需考慮分母為零的情況。
IF(e|yi>s|yi)
IF d>0 THEN P為凹點(diǎn)
IF d<0 THEN P為凸點(diǎn)
IF(e|yi>s|yi)
IF d>0 THEN P為凸點(diǎn)
IF d<0 THEN P為凹點(diǎn)
3 墻體數(shù)據(jù)模型構(gòu)建
圖紙識別的最終目的是要建立起墻體的數(shù)學(xué)模型,并在此基礎(chǔ)上實(shí)現(xiàn)對建筑工程量的估算[12]。模型是全面反映墻體形狀和結(jié)構(gòu)的基礎(chǔ),并附加以必要的屬性。墻體的中軸線是確定墻體的核心數(shù)據(jù),利用分解后的簡單墻體中平行的兩長邊端點(diǎn)信息,可以確定中軸線兩端點(diǎn)坐標(biāo),并將該段墻體的厚度等設(shè)計(jì)參數(shù)一并存入中軸線數(shù)據(jù)結(jié)構(gòu)中,形成一個(gè)關(guān)于墻體中軸線鏈表。設(shè)墻體的兩條平行邊為l1和l2,起點(diǎn)為s,終點(diǎn)為e,則中軸線兩端點(diǎn)坐標(biāo)為:
可以用鏈表構(gòu)造其內(nèi)部存儲結(jié)構(gòu),鏈表的節(jié)點(diǎn)定義如圖4所示。
有了以上軸線抽象模型,可以方便、準(zhǔn)確地計(jì)算墻體的長度,重構(gòu)墻體輪廓,方便后期建筑工作量提取[13]。
本文在對AutoCAD矢量數(shù)據(jù)文件大量研究的基礎(chǔ)上,以建筑工程中墻體為例,設(shè)計(jì)了墻體深度優(yōu)先識別提取算法;針對提取的復(fù)雜墻體,設(shè)計(jì)了基于凹點(diǎn)分割的墻體裁剪算法,并以墻體中軸線模型加屬性的方式重構(gòu)墻體,為工程量計(jì)算提供有效支持。在算法設(shè)計(jì)過程中注重與具體問題相結(jié)合,加入識別裁剪過程中的輔助因素,降低了通用算法的復(fù)雜度,使算法簡潔而高效。
參考資料
[1] Autodesk Inc. DXF Reference. http://www.autodesk.com/techpubs/autocad/acadr14/dxf/.
[2] 王志勃.基于DXF文件格式的讀取與XML轉(zhuǎn)換[J].新學(xué)術(shù),2007(6):240-243.
[3] 劉傳亮,陸建德.AutoCAD DXF文件格式與二次開發(fā)圖形軟件編程[J].微機(jī)發(fā)展,2004(9):101-104.
[4] 舒飛.中文版AutoCAD 2004二次開發(fā)標(biāo)準(zhǔn)教程[M].上海:上海科學(xué)普及出版社,2004.
[5] GB/T 50001-2001. 房屋建筑制圖統(tǒng)一標(biāo)準(zhǔn)[S].
[6] DOSCH P H, MASINI G. Reconstruction of the 3D structure of a building from the 2D Drawings of its Floors[J]. Proceedings of the 5th International Conference on Document Analysis and Recognition, Bangalore(India),1999:487-490.
[7] Yu Yuhong, SAMAL A. A system for recognizing a large class of engineering drawings[J]. IEEE Transactions on Pattern Analysis and Machine Intelligence,1997,19(8): 868-890.
[8] 宋曉眉,程昌秀,周成虎.簡單多邊形頂點(diǎn)凹凸性判斷算法綜述[J].國土資源遙感,2011,90(3):25-30.
[9] 陳炳發(fā),錢志峰,廖文和.簡單多邊形凸凹性自識別算法[J].計(jì)算機(jī)輔助設(shè)計(jì)與圖形學(xué)學(xué)報(bào),2002(3):214-218.
[10] FEITO F, TORRES J C, URENA A. Orientation, simplicity, and inclusion test for planar polygons[J]. Computers & Graphics,1995,19(4):595-600.
[11] DORI D, Liu Wenyin. Automated CAD conversion with the machine drawing under standing system:Concepts algorithm and performance[J]. IEEE Transaction on System, Man and Cybernetics, part A: System and Humans, 1999,29(4):411-416.
[12] 孫靜波,侯秀萍,鄭虹.建筑圖數(shù)字化存貯與工程量計(jì)算模型的實(shí)現(xiàn)[J].計(jì)算機(jī)工程與應(yīng)用,2003(10):222-225.
[13] 陸再林,張樹有,譚建榮.基于圖形理解的預(yù)算工程量提取算法[J].計(jì)算機(jī)輔助設(shè)計(jì)與圖形學(xué)學(xué)報(bào),2002(5):442-446.