2018-06-04

IFC的格式 - 純文字解析基礎

進行IFC格式解析前請先稍微了解IFC的架構(請參考「IFC的架構」一文),
本文先不談IFCXML格式,以純IFC格式來說明。

IFC的優點之一,就是採用「純文字」做為資料底層,
所有的資料都可以用明碼的方式存在,
因此不論採用什麼軟體設備,
只要能用純文字編輯器都可以開啟IFC檔案。

所以不論是Windows、Linux、iOS、Android都可以開啟IFC格式的檔案。

我們先隨意挑一個簡單來IFC 2x3 TC1的案例來看一下:

IFC 格式範例

這邊我們用最簡單的方式來理解一下上面這個IFC檔案,
在這裡我用Windows內建的「記事本」開啟,我們先看第一行

#43516 = IFCCARTESIANPOINT((7820.2955167228, 610.415423053157,514.28509535737));

主要分成三個部份:
左邊紅色是 P21ID
中間藍色是 物件類別
右邊綠色是 物件參數

這樣的表示法本身是一個ISO10303標準格式,
稱為STEP(Standard for the Exchange of Product model data) file,
等號(=)左邊井字號(#)開頭的數字#43516是ISO標準中的 Part21所記錄的一種方式,
因此我們常稱之為P21ID (詳情可以參考ISO10303-21說明)。

等號(=)右邊即為該行的資料,第一個英文字即為物件類別,
此處的IFCCARTESIANPOINT即為「卡氏座標點」,
而後面接的三個數字即為其 x, y, z 座標,也就是物件參數。

更進一步的IFC規格可以參考官方網站的說明,最常用的是下面這兩種:
1. IFC 2x3 TC1 格式說明
2. IFC4 Add2 格式說明

其中 IFC 2x3 TC1是支援度最廣的格式,
IFC4 Add2是目前開放出來最新的格式。

再往下可以找到

#43546 = IFCPOLYLOOP((#43486,#43538,#43510, ... ));

在右邊的 #43486,#43538,#43510, ... 就是一堆上面提到的卡氏座標點位,
因此,可以理解該行即為 將這些點位串起來,變成一個多邊型 (Polygon)。

再進一步可以看到 #43549 = IFCFACEOUTERBOUND(#43546, .T. );
第二個參數 .T. 就是代表 True 的一個布林值,
此時需要去找一下IFCFACEOUTERBOUND的定義
得知第二個參數為
Orientation : This indicated whether (TRUE) or not (FALSE) the loop has the same sense when used to bound the face as when first defined. If sense is FALSE the senses of all its component oriented edges are implicitly reversed when used in the face.
更進一步可以把一堆IFCFACEOUTERBOUND組成IFCFACE
最後再經過很多個步驟後,才會組成該檔案的「樓板」。

我們在該檔案中搜尋一下 IFCSLAB,回頭來解析看看:
#32536= IFCSLAB('17_$0D8CH3heDs19BdsuPW',#41,'\X2\6A13677F\X0\:RC15cm:3467913',$,'\X2\6A13677F\X0\:RC15cm',#32518,#32534,'3467913',.FLOOR.);

可以知道裡面總共有9個參數,
再來,前往官方網站找IFCSLAB的定義:

可以發現這九個參數分別是:

GlobalId : IfcGloballyUniqueId;
OwnerHistory : IfcOwnerHistory;
Name : OPTIONAL IfcLabel;
Description : OPTIONAL IfcText;
ObjectType : OPTIONAL IfcLabel;
ObjectPlacement : OPTIONAL IfcObjectPlacement;
Representation : OPTIONAL IfcProductRepresentation;
Tag : OPTIONAL IfcIdentifier;
PredefinedType : OPTIONAL IfcSlabTypeEnum;

其中有 OPTIONAL代表可以填空值($),
如果要找該樓版的位置的話,應該要從 ObjectPlacement 往下找。
如果要找該樓版的外觀的話,應該要從 Representation 往下找。

中間複雜的過程這邊就先省略,
總之,把一開始的卡式座標式一路往上就會找到這個樓板,
而從這個樓版的Representation一路往下找就會找到這些組成樓版的座標點位。

而座標的部份,常用來指定物件為置的物件類別為IfcAxis2Placement3D,
簡單來說物件的解析方式可用下圖表示:

有了Z-Axis跟X-Axis即可cross出Y-Axis,
解析後可以把該物件變成一個 4x4 的轉置矩陣,
透過層層堆疊就可以把座標從物件座標一路轉換成專案座標,
甚至是全球座標。

再舉另一個簡單的「掃掠」格式來組成立方體的案例,
透過這幾行IFC的描述,即可表示出一個立方柱體。

這些是IFC的基礎解析方式,
而不同版本的IFC會有一定程度上的差別,
但通常基本的圖形描述方式並不會改變,
新版本的IFC主要都是在「物件定義」上加入新的物件類別及描述,
例如 IFC4 Add1中加入的定線 (Alignment)其實就是將原本的線形給予其工程意義,
讓直線、弧線、緩合曲線、豎曲線能夠用類似公式的方式來加以描述及調整,
本質上依然是「線」的集合,但解析上就會有所不同。


1 則留言: