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