【摘 要】針對城市規(guī)劃行業(yè)目前普遍使用的AutoCAD軟件所繪制的圖形層次較低且缺乏關(guān)聯(lián)、智能性不足、方案修改維護成本高,以及現(xiàn)有參數(shù)化設(shè)計系統(tǒng)技術(shù)門檻較高等問題,提出一套面向城市規(guī)劃的參數(shù)化設(shè)計新技術(shù),并開發(fā)了相應(yīng)的系統(tǒng)。文章共分三部分,本文為第二部分,給出了DXF-SHP文件格式自定義轉(zhuǎn)換方法,其中包括DXF文件的讀取和存儲、SHP文件寫入技術(shù)等。第一、三部分分別給出了系統(tǒng)整體架構(gòu)思路和基于屬性塊的城市圖元參數(shù)管理方法、參數(shù)化三維建模技術(shù),并通過實際規(guī)劃案例,證明了所述技術(shù)和系統(tǒng)的可行性和高效性。
【關(guān)鍵詞】參數(shù)化設(shè)計;城市規(guī)劃;CityEngine;格式轉(zhuǎn)換
1 引言
目前城市規(guī)劃行業(yè)普遍使用計算機輔助設(shè)計軟件為AutoCAD,它所繪制的圖形存在著層次較低且缺乏關(guān)聯(lián)、智能性不足、方案修改維護成本高,以及現(xiàn)有參數(shù)化設(shè)計系統(tǒng)技術(shù)門檻較高等問題,嚴重制約了城市規(guī)劃設(shè)計工作的效率。為此,筆者提出了一套面向城市規(guī)劃的參數(shù)化設(shè)計新技術(shù),并開發(fā)了相應(yīng)的系統(tǒng)。文章共分三部分:第一部分介紹了系統(tǒng)的整體架構(gòu)思路和基于屬性塊的城市圖元參數(shù)管理方法;本文為第二部分,重點介紹了DXF-SHP文件格式自定義轉(zhuǎn)換方法,其中包括DXF文件的讀取和存儲、SHP文件寫入技術(shù)等;第三部分給出了參數(shù)化建模技術(shù),并通過實際規(guī)劃案例,證明了所述技術(shù)和系統(tǒng)的可行性和高效性。
2 DXF-SHP文件格式自定義轉(zhuǎn)換技術(shù)
DXF[1](Drawing Exchange File)文件是Autodest公司推出的與外部CAD/CAM進行圖形信息交換的一種文件格式。一個完整的DXF文件應(yīng)由7個大段組成:標題(HEADER)段、類(CLASSES)段、符號表(TABLES)段、塊(BLOCKS)段、圖元(ENTITIES)段、對象(OBJECTS)段、文件結(jié)束符號(組碼為0,組值為EOF)[2]。每個大段又由若干個組組成,每個組占用連續(xù)的2行,第1行為組碼,用于表示后續(xù)數(shù)據(jù)所代表的含義,第2行為組值,相當于數(shù)據(jù)的值,組碼和組織合起來代表1個數(shù)據(jù)的含義和數(shù)值。
本系統(tǒng)客戶端輸出格式為DXF(DWG可轉(zhuǎn)換成DXF),而服務(wù)端CityEngine平臺必須使用SHP(ESRI Shapefiles)[3]格式,因此首先需要進行文件格式轉(zhuǎn)換,包含讀取DXF文件、存儲實體信息并寫入SHP文件兩大塊內(nèi)容。
2.1 讀取DXF文件
目前,DXFLIB是一個比較實用的讀寫DXF文件的C++庫。在讀取DXF文件時,DXFLIB分析文件并且調(diào)用用戶自定義的函數(shù)來添加實體、層、塊等數(shù)據(jù)。然而,DXFLIB并不保存任何實體或者信息,更不提供保存的容器,需要用戶自定義處理函數(shù)。它的基本工作原理如下:(1)DXFLIB分析DXF文件,識別對象;(2)當獲得用戶需要的對象時,調(diào)用用戶自定義的回調(diào)函數(shù);(3)在用戶的回調(diào)函數(shù)中處理各種實體,或者將它們保存到容器中。
本系統(tǒng)利用DXFLIB設(shè)計的讀取DXF文件基本流程如圖 1所示。首先進入塊(BLOCKS)段讀取塊定義信息,將每個讀取到的塊及其內(nèi)部圖元存入一個預(yù)先定義的“塊”數(shù)據(jù)結(jié)構(gòu),并保存在塊容器(一個存儲塊的列表)中,注意塊列表中的圖元并不在繪圖區(qū)顯示,它只起到參照的作用。塊段讀完之后,進入實體(ENTITIES)段,搜索并讀取屬性塊(DXF內(nèi)部定義為INSERT實體)圖元。當找到一個INSERT實體時,讀取它的引用塊名、插入點坐標、縮放和旋轉(zhuǎn)參數(shù)、屬性值(ATTRIB)等信息。然后根據(jù)引用塊名,在前述的塊列表中獲取原塊定義,提取其中的每個幾何圖元,作坐標轉(zhuǎn)換、記錄屬性值、線/面判斷以及存入線/面容器等操作。實體段讀完后,整個流程結(jié)束。
2.2 存儲和寫入SHP
在存儲、寫入矢量數(shù)據(jù)方面,作為GDAL項目分支的C++開源庫——OGR[4]提供了較好的支持。OGR體系結(jié)構(gòu)包含有OGRGeometry,OGRFeature,OGRLayer等大類,[5]其中Geometry類又包含點、線、面、多點、多線、多面等派生子類。下面將介紹結(jié)合OGR設(shè)計的數(shù)據(jù)結(jié)構(gòu)(容器),用以存儲從DXF文件中讀取的屬性塊信息。
首先,針對屬性數(shù)據(jù)(Promp字段不做記錄)設(shè)計如下結(jié)構(gòu):