OpenCascade使用TopoDS_Shape類表示一個拓撲對象,這個類記錄了拓撲對象的三個主要數據:位置、方向和共享對象,具體由如下三個數據成員表示:
Handle(TopoDS_TShape) myTShape;
TopLoc_Location myLocation;
TopAbs_Orientation myOrient;
可以說,這三個數據成員,充分考慮的共享數據的需求。
1、myTShape字段
首先說,myTShape這個數據成員,是一個句柄指針(共享指針),記錄了一個基於引用計數技術共享的TopoDS_TShape派生的對象。該對象記錄了拓撲對象的具體數據,包括:拓撲數據和幾何數據。例如:這個可能是一個BRep_TEdge對象,記錄了一條共邊的數據,包括:一條3D曲線、曲線的參數范圍等等數據,或者可能是BRep_TFace對象,記錄了一個曲面對象及其相關數據。另外,TopoDS_TShape記錄了子對象的鏈表,等等。
這里,使用句柄指針,就是為了方便共享,例如:對拓撲對象中的兩個有向邊,通常公用一個共邊,這里myTShape中就記錄了共邊對象及其數據。
2、myOrient字段
myOrient記錄了拓撲對象的方向。由於OCCT支持non-manifold模型,因此定義了四種類型:
TopAbs_FORWARD,
TopAbs_REVERSED,
TopAbs_INTERNAL,
TopAbs_EXTERNAL
對manifold模型中,通常一個共邊對應兩個有向邊,兩個有向邊,方向一正一反,對應一個是TopAbs_FORWARD,一個是TopAbs_REVERSED。對Non-manifold模型來說,可能存在一些內部邊,或者懸邊,另外兩個值分別對應這兩種情況。
對Face來說,Face的法矢方向可能和對應曲面的法矢方向相同(TopAbs_FORWARD),也可能和對應曲面的法矢方向相反(TopAbs_REVERSED),此時使用該數據成員來表示這些情況。
3、myLocation字段
myLocation記錄了一個對象的位置信息。
考慮,一個球面被陣列了10次,顯然這里球的Face對象除了位置發生了改變,其他(曲面表示、裁剪環等)都是相同的。基於共享的考慮,那么會生成10個TopoDS_Shape對象,每個對象記錄相同的BRep_TFace對象,方向可能相同,可能相反,而myLocation記錄了如何從原始Face對象經過變換變換到最終對象。
這樣,通過共享曲面對象等數據,大大減少了拓撲對象占用內存的大小,減小了模型的大小。同時,由於共享了對象,一些后續的操作(例如查找所有的共邊)也得以可行,或者得到簡化。
對一個TopoDS_Shape對象,通過在定時器中不斷改變位置信息,可以實現簡單的動畫效果,當然,這個的效率是不高的。
這三個字段構成了OCCT眾多拓撲對象處理的基礎,也在很多方面決定了一些處理機制。
例如:OCCT的拓撲對象沒有回指指針,就是沒法從Edge快速的得到Face對象,通過類似:edge->face的操作。通常的途徑,是遍歷Face中的Edge對象,創建一個Edge和關聯face的表,通過查表得到所鄰接的Face對象,這個在很多處理中會影響到效率,增加編碼實現的復雜性。
另外,TopoDS_Shape對象也沒有辦法記錄一些屬性信息,例如:拓撲對象的顏色信息,缺乏Parasolid類似的attrib列表機制。這個也導致一些處理上的復雜性,例如:step導入時,要讀取對象的顏色、圖層等信息,就相對復雜了。