劉尚蔚 周鈺航 魏群
摘 要:數(shù)字地形模型(DTM)是水利水電工程三維數(shù)字模型的重要組成部分,應用范圍非常廣泛。一般的建模軟件流程繁瑣,嚴重影響建模效率且存在地形表面失真,不能準確地表現(xiàn)真實地形信息。本文通過分析DXF文件的數(shù)據(jù)結(jié)構(gòu),在Python環(huán)境下利用Python語言編寫程序讀取和直接編寫DXF文件,利用Delaunay算法生成三角網(wǎng)描述地形曲面拓撲關(guān)系,并將拓撲信息直接寫入DXF文件中,編寫的DXF文件可在不同軟件中通過拉伸生成實體,既實現(xiàn)了三維數(shù)字地形模型的快速建模,又可滿足不同軟件之間的數(shù)據(jù)交換。此方法在某水利工程三維數(shù)字地形模型中成功應用,對基于DXF文件的直接建模方法研究具有借鑒意義。
關(guān)鍵詞:Python;DXF;不規(guī)則三角網(wǎng);三維地形實體模型
中圖分類號:TV39 ? 文獻標志碼:A
doi:10.3969/j.issn.1000-1379.2020.04.034
Abstract:Digital Terrain Model (DTM) is an important part of the 3D digital model of water conservancy and hydropower engineering and its application range is very wide. The general modeling software process is cumbersome, seriously affecting the modeling efficiency and the terrain surface distortion cant strictly represent the real terrain information. By analyzing the data structure of DXF files, this paper used Python language to write programs and directly write DXF files in Python 3.7 environment. The Delaunay algorithm was used to generate triangulation to describe the terrain surface topological relationship and the topology information was directly written into the DXF file. The DXF file could be generated by stretching in different software, which could not only realize the rapid modeling of the 3D digital terrain model but also the data exchange between different software. This method had been successfully applied in the 3D digital terrain model of a water conservancy project and it could be used as a reference for the direct modeling method based on DXF file.
Key words: Python; DXF; TIN; 3D terrain solid model
隨著計算機技術(shù)的飛速發(fā)展,BIM技術(shù)已經(jīng)被廣泛應用于土木工程、水利水電工程等多個領域,BIM技術(shù)的實質(zhì)是結(jié)構(gòu)工程的數(shù)字圖形與相關(guān)信息融合集成及動態(tài)關(guān)聯(lián)[1-2]。水工BIM技術(shù)應用中,地形模型作為描述工程施工總布置的基礎,不僅為所有水工建筑物及施工提供活動場所,方便設計方進行合理規(guī)劃設計,而且通過建立不同時期的曲面,如原始地形曲面、設計開挖土方量的體積曲面,可以快速精確地計算出開挖或者回填的土方量。可見快速高效地建立高質(zhì)量的地形模型在水工BIM技術(shù)應用中具有重要意義。
目前AutoCAD是全球用戶最多的圖形設計軟件之一,也是影響最大的圖形設計軟件[3]。為滿足不同軟件之間進行圖形數(shù)據(jù)信息交換的需求,提高數(shù)據(jù)交換精度,Autodesk公司開發(fā)了一種數(shù)據(jù)存儲格式即DXF,在DXF文件中數(shù)據(jù)信息按照嚴格的格式進行排列,用戶可以通過對DXF的讀取和修改完成數(shù)據(jù)的篩選和處理,完成一些重復且繁瑣的建模工作?;贒XF的數(shù)字圖形建模方法與所選軟件平臺無關(guān),任何從三維軟件中得到的數(shù)據(jù)信息按照DXF文件的格式進行排列即可生成新的DXF文件,完成數(shù)據(jù)交換[2]。
DXF文件具有結(jié)構(gòu)嚴密、易于讀取等特點,成為國際上較為通用的圖形交換文件之一[4]。目前國內(nèi)外學者也通過編寫接口程序使用不同的算法對DXF文件進行操作從而應用在不同的領域中,盧曉春等[4]基于DXF文件開發(fā)有限元后處理系統(tǒng),滿足了個性化的后處理顯示功能;姚冕等[5]提出基于DXF格式的優(yōu)化數(shù)控代碼自動生成方法,實現(xiàn)了讀取DXF文件過程自動生成數(shù)控加工代碼,解決了傳統(tǒng)讀取算法中讀取結(jié)果無序,不適合實際加工的難題;Atia[6]通過算法實現(xiàn)對DXF文件中重復對象的消除和分類,解決了數(shù)據(jù)交換中因?qū)ο笮畔⒅貜投鴮е履P蜔o法重構(gòu)的問題。筆者結(jié)合Python面向?qū)ο蟮膬?yōu)勢與DXF豐富的擴展性和數(shù)據(jù)可控性,研究基于DXF文件的三維地形實體模型的創(chuàng)建方法。
1 DXF文件數(shù)據(jù)獲取及創(chuàng)建
1.1 DXF文件的結(jié)構(gòu)
DXF文件是一種開放的矢量數(shù)據(jù)格式,由標題段(HEADER)、類段(CLASSBS)、表段(TABLES)、塊段(BLOCK)、實體段(ENTITIES)、對象段(OBJECTS)和文件結(jié)束段(EOF of FILE)構(gòu)成,具體含義見表1。每段又由許多“組”逐行排列構(gòu)成,每組占兩行,第一行為組的代碼,表示本組的數(shù)據(jù)類型,含義由AutoCAD開發(fā)公司定義,第二行為組值,是數(shù)據(jù)變量的值,二者結(jié)合起來相當于數(shù)據(jù)的含義和值[7]。如組碼“0”和組值“SECTION”代表新段的開始。
在實際應用中,圖形的可視化數(shù)據(jù)信息主要存儲在實體段(ENTITIES),如點、線、面、文字等。對上述圖元、圖層、線型、坐標等信息的提取,只需遍歷ENTITIRS段,設置關(guān)鍵詞即可讀取每個圖元的幾何數(shù)據(jù)信息。
1.2 數(shù)據(jù)獲取與處理
獲取DXF文件數(shù)據(jù)的核心是準確獲取存放于ENTIITES段中的點、線、面等圖形屬性的幾何信息,通過對獲取的數(shù)據(jù)進行處理完成模型檢查分析或者導出其他格式文本對數(shù)據(jù)進行利用。在DXF文件中,每個圖形對象的坐標數(shù)據(jù)信息與其單獨的句柄(handle)相匹配,通過嚴格的組碼及其值的排列來表述。由于傳統(tǒng)意義上的面向過程的算法獲取和處理DXF中的幾何信息比較繁瑣且獲取的點的信息易與幾何對象不匹配,因此筆者利用面向?qū)ο蟮腜ython語言來獲取和處理DXF文件中的數(shù)據(jù)信息。
面向?qū)ο蟮幕舅惴ㄔ硎牵簩NTITIES段中所有的圖形對象信息儲存在modelspace函數(shù)中,通過判斷對象類型來查詢具體屬性信息。每一個對象的數(shù)據(jù)庫中包含了幾何關(guān)系、坐標、圖層等圖形信息,通過相應的查詢函數(shù)即可獲取數(shù)據(jù)信息。將獲得的數(shù)據(jù)以列表或者元組的形式儲存,每一個基礎列表或元組中依次存放X、Y、Z坐標信息,方便使用Scipy和Numpy模塊對點的數(shù)據(jù)進行科學計算處理。程序中結(jié)合ezdxf庫編寫算法實現(xiàn)面向?qū)ο蟮臄?shù)據(jù)獲取。以“LINE”為例,面向?qū)ο蠛兔嫦蜻^程的數(shù)據(jù)獲取流程見圖1和圖2。
1.3 創(chuàng)建DXF文件
DXF文件目前可以被大多數(shù)計算機輔助設計軟件所識別,利用數(shù)據(jù)直接編寫DXF文件實現(xiàn)不同軟件之間的圖形數(shù)據(jù)交換,會帶來事半功倍的效果。但是由于DXF組碼及其值排列嚴格,且不同組碼及其值代表的含義也都不同,因此利用其他編程語言實現(xiàn)這一過程比較復雜。
基于Python調(diào)用ezdxf模塊創(chuàng)建新的DXF文件,簡化逐行填寫組碼及其值的過程,重點放在確定DXF文件中不同的對象,如“LINE”“3Dface”“Mesh”等。圖層信息、線型信息、顏色信息等作為屬性添加到已確定的對象中。創(chuàng)建新的DXF文件的一般流程如下:①首先調(diào)用“ezdxf.new(‘版本名稱)”函數(shù)定義新建的DXF文件的版本類型;②調(diào)用“modelspace()”函數(shù)創(chuàng)建儲存圖形數(shù)據(jù)的模型空間;③調(diào)用“l(fā)ayer.new(‘圖層名稱,dxfattributs={‘具體線型和屬性等名稱})”函數(shù)定義相應的圖層信息;④調(diào)用“add_對象名稱()”函數(shù)添加對象信息;⑤調(diào)用dwg.saves(‘名稱.dxf)函數(shù)命名并保存創(chuàng)建的DXF文件。
2 工程實例
某國家重點水利工程地形條件復雜,挖填土方量大,精確完整的數(shù)字地形可為其提供精確的挖填土方量的計算和三維虛擬展示。
2.1 地形圖形數(shù)據(jù)處理
建立三維地形圖首先對AutoCAD圖紙中的原始數(shù)據(jù)進行檢查分析,為避免地形BIM模型與實際偏差過大,對等高線進行仔細檢查并進行修改,調(diào)整處理后的等高線如圖3所示。將處理過的圖紙轉(zhuǎn)存為DXF格式,在DXF文件中,等高線的對象類型一般是多段線(POLYLINE),可以在Python中調(diào)用ezdxf的query函數(shù)尋找對象“POLYLINE”,并把其頂點坐標信息作為不規(guī)則三角網(wǎng)(TIN)的原始數(shù)據(jù)。
將處理過的AutoCAD圖紙轉(zhuǎn)存為DXF格式,通過上述程序讀取DXF文件快速獲取坐標數(shù)據(jù)信息,并創(chuàng)建相應的列表進行儲存或直接存儲為CSV文件。部分包含了離散點信息的CSV文件如圖4所示。
2.2 地形曲面模型的生成
讀取DXF文件提取的原始等高線中的幾何離散點,通過Delaunay三角網(wǎng)格描述其拓撲關(guān)系。Delaunay三角剖分法具有最接近、唯一性、最規(guī)則及最優(yōu)性等優(yōu)點[8],在計算機圖形學中得到廣泛應用,實現(xiàn)Delaunay的算法有很多,在本工程中,基于Python強大的科學計算能力,采用思路簡單易于編程實現(xiàn)的逐點插入Lawson算法,如圖5所示,其基本數(shù)學原理為:
(1)假設集合V是二維實數(shù)域上的離散點集,繪制三角形△ABC把所有集合V包圍起來;
(2)向三角形中插入集合V中的離散點Pi(i=0,1,2,3,…),使該點與包含它的三角形的3個頂點相連形成3個新的三角形;
(3)逐個對生成的三角形進行空外接圓檢測,同時用Lawson設計的局部最優(yōu)化過程LOP進行優(yōu)化,即通過交換對角線的方法來保證所形成的三角網(wǎng)為Delaunay三角網(wǎng)。
在Python的Scipy庫中提供了面向?qū)ο蟮膕patial.Delaunay()接口函數(shù)來進行Delaunay三角構(gòu)網(wǎng),實現(xiàn)自動繪制不規(guī)則三角網(wǎng)。遍歷生成的三角網(wǎng)獲取拓撲信息,將Z軸數(shù)據(jù)依次加入三角網(wǎng)中形成三維曲面。利用Delunay算法生成不規(guī)則三角網(wǎng)格的過程中容易在凹形等高線處生成平三角形,即Z軸坐標相等的三角形,造成與實際地形不符。改進算法為遍歷Delaunay三角形,找到凹形等高線處的平三角形和與之相鄰的非平三角形,在非平三角形中插入補充特征點完成平三角形優(yōu)化[9]。將最終生成的拓撲信息整理后直接寫入新的DXF文件,在DXF文件中通過對象“3Dface”來描述不規(guī)則三角網(wǎng)面,實現(xiàn)地形曲面自動繪制,與此同時調(diào)用matplotlib模塊實現(xiàn)可視化展示。生成的DXF文件可在AutoCAD中或者Ansys workbench的SpaceClaim前處理軟件中打開。Matplotlib可視化展示結(jié)果如圖6所示,生成的地形曲面如圖7所示。
2.3 生成三維實體
在AutoCAD軟件中,打開創(chuàng)建的包含地形曲面的DXF文件,通過拉伸、合并創(chuàng)建三維地形實體。具體步驟如下:
(1)建立拉伸路徑。由于地形曲面的投影平面與大地深度方向垂直,因此假設地形曲面的投影平面為XY平面,大地深度方向為Z軸方向。沿著地形曲面的正投影方向繪制拉伸路徑,通過拉伸命令,將曲面轉(zhuǎn)換為實體,路徑深度根據(jù)工程模擬深度確定。
(2)合并實體。由于地形曲面由獨立的不規(guī)則三角網(wǎng)表面構(gòu)成,因此拉伸生成的實體為獨立的三維柱狀實體,通過合并命令,完成多個獨立柱狀實體的布爾運算,生成一個完整的三維實體地形。合并后的三維地形實體模型如圖8所示。
3 結(jié) 語
利用Python語言直接對DXF文件進行操作,基于面向?qū)ο蟮睦砟?,簡化獲取數(shù)據(jù)和編寫DXF的過程,利用等高線數(shù)據(jù)對數(shù)字地形模型自動建模,在BIM技術(shù)的應用中,極大地提高了建模效率和建模質(zhì)量?;赑ython的DXF操作方法具有優(yōu)秀的擴展性,除了基于DXF文件直接創(chuàng)建三維地形曲面完成實體建模外,還可將計算機視覺處理學和計算機圖形學結(jié)合,通過邊緣檢測從圖片中獲取邊界數(shù)據(jù)信息,經(jīng)過處理分類,采用本文程序?qū)懭氩?chuàng)建DXF文件,實現(xiàn)二維平面圖向三維模型的轉(zhuǎn)換。
參考文獻:
[1] 趙繼偉,魏群,張國新.水利工程信息模型的構(gòu)建及其應用[J].水利水電技術(shù),2016,47(4):29-33.
[2] 魏群,尹偉波,劉尚蔚.BIM技術(shù)中的數(shù)字圖形信息融合集成系統(tǒng)研究進展[C]//2014年中國建筑金屬結(jié)構(gòu)協(xié)會鋼結(jié)構(gòu)分會年會和建筑鋼結(jié)構(gòu)專家委員會學術(shù)年會論文集.北京:中國建筑工業(yè)出版社,2014:118-127.
[3] 張愛梅,鞏奇,趙艷霞,等.AutoCAD 2007計算機繪圖實用教程[M].北京:高等教育出版社,2007:2-4.
[4] 盧曉春,童富果,田斌.基于AutoCAD平臺的有限元后處理系統(tǒng)開發(fā)[J].人民長江,2014,45(5):34-37.
[5] 姚冕,唐厚君.基于DXF格式的優(yōu)化數(shù)控代碼自動生成方法[J].測控技術(shù),2014,33(11):81-84.
[6] ATIA M R A. Classification and Elimination of Overlapped Entities in DXF Files[J]. Ain Shams Engineering Journal, 2014(5):851-860.
[7] 劉勝華,徐衛(wèi)兵.AutoCAD DXF文件格式與二次開發(fā)[J].科技資訊,2017,15(10):15-17.
[8] 王大志.一種快速實現(xiàn)地形圖三維實體建模方法[J].圖學學報,2017,38(1):23-27.
[9] 劉慶元,易柳城,劉莉.一種以等高線為特征線的不規(guī)則三角網(wǎng)的生成方法[J].礦山測量,2012(3):13-15.
【責任編輯 張 帥】