OpenCASCADE Application Framework Data Framework Services
OpenCASCADE Application Framework
Data Framework Services
一、概述Overview
OpenCASCADE的資料框架對來自不同程式的資料提供了統一的處理環境。這就簡化了資料交換、修改,也保證了資料統一性、穩定性。實現方法需要用到以下部分:
u 標號Tha tag
u 標籤The label
u 屬性The attribute
Figure 1. Contents of a document
如上圖所示,框架樹的第一個標籤(label)是根標籤(root)。每個標籤(label)有個以整數表示的標號(tag)。由當前標籤的標號到根標籤的標號,可以得到一個惟一的標號列表,如:0
每個標籤(label)可以一些屬性(attribute),這些屬性可以包含資料。每個屬性由GUID來區分。標籤最重要的性質是其入口只是資料框架的一個地址。
二、標號The Tag
一個標號Tag就是一個整數,它用兩種方式標示了一個label:
u 相對標示法 Relative identification:一個標籤的標號只與其父標籤有關係。如對於一個指定的標籤,可能由四個子標籤組成,其標號分別為2,7,18,100。使用相對標示方法,在設定屬性時有安全的範圍。
u 絕對標示法 Absolute identification:一個標籤在資料框架中位置由無歧義的、從根標籤的標號到當前標籤的標號用冒號表示的標號列表(list
不管採用哪種方法,都要注意的是這些標號的值沒什麼實際的意義。只是用來確定每個標籤在樹結構的位置,都是為了使用文件支援Undo/Redo的功能。
建立標號Tag的兩種方式:
u Random delivery 隨機建立;
u User-defined delivery 使用者自定義建立;
正如字面所說,隨機建立標號時,標號是由系統隨機生成。使用者自定義建立標號時,標號的值是建立標號函式的引數。
1. 隨機建立標號法生成子標籤 Creating child labels using random delivery of tags
使用TDF_TagSource::NewChild
2. 使用者自定義建立標號法生成子標籤 Creation of a child label by user delivery from a tag
建立子標籤的另一種方式就是使用者自定義建立。即在指定標號建立標籤。可以使用TDF_Label::FindChild和TDF_Label::Tag來獲得指定標號的子標籤。
如上程式碼所示,3是需要查詢的標籤的標號,Standard_False用來表示若查詢不到指定標號時是否建立子標籤。
三、標籤The Label
標號(Tag)給了標籤(Label)一個唯一的地址。資料框架中的標籤是包含屬性,繫結資料的容器。資料框架的本質是一個標籤樹,如下圖所示:
資料框架中的標籤不能被刪除,因此,當文件開啟後已經的資料框架結構不能被刪除。
1. 建立標籤 Label creation
可以在任意層次建立標籤,也可以找到標籤在資料框架中的深度(Depth)。TDF_Label提供上述功能。
2. 建立子標籤 Creating child labels
在資料框架中指定標籤上建立子標籤使用TDF_Label::FindChild。如下所示:
當把FindChilde的第二個引數設為Standard_True時,就確保了查詢不到指定標號的標籤時會建立一個標籤。如下所示:
3. 訪問子標籤 Retrieving child labels
可以使用遍歷器來訪問當前標籤的第一層的子標籤。如下所示:
也可以訪問當前標籤的所有子標籤,如下所示:
使用TDF_Tool::Entry可以得到當前標籤的入口字串,如下所示:
4. 訪問父標籤
訪問當前標籤的父標籤:
四、屬性The Attribute
標籤本身不包含任何資料。所有資料,不管什麼型別,程式的非程式的資料都是儲存在屬性中。屬性是繫結在標籤上,且屬性可以是任意型別的資料。OCAF提供許多直接可以使用的屬性如:整數、實數、軸、平面。也有用於拓樸、功能、視覺化的屬性。每種型別的屬性由GUID來標識。這樣做的好處就是所有型別的屬性都以相同的方式處理。可以建立新的例項,訪問、繫結到標籤和從標籤上刪除等。
1.訪問標籤的屬性
使用函式TDF_Label::FindAttribute來訪問標籤的屬性。如下例所示,
2.使用GUID來標識屬性 Identifying an attribute using a GUID
可以建立一個屬性物件並得到其GUID。如下例所示,建立了一個整數屬性,通過方法ID來得到GUID。
3. 將屬性繫結到標籤 Attaching an attribute to a label
使用函式TDF_Label::Add來將屬性繫結到標籤。重複繫結相同GUID的屬性到一個標籤會出現錯誤。TDF_Attribute::Label可以得到繫結屬性的標籤。如下所示:
4. 測試標籤繫結狀態 Testing the attachment to a label
可以使用函式TDF_Attribute::IsA來檢驗屬性是否已經繫結到標籤上,函式的引數是屬性的GUID。在下例所示,是檢測當前標籤是否有整數屬性,然後得出這個標籤屬性的數量。函式TDF_Tool::HasAttribute用來檢測標籤是否繫結的有屬性,函式TDF_Tool::NbAttributes返回標籤繫結屬性的數量。
5. 刪除標籤的屬性 Removing an attribute from a label
若要將屬性從標籤中刪除,可以使用TDF_Label::Forget,函式引數為屬性的GUID。若要刪除標籤所有屬性,使用函式TDF_Label::ForgetAll。
6. 特定屬性的建立 Specific attribute creation
見《Application Framework User's Guide》。
五、示例程式 Sample Code
1: //------------------------------------------------------------------------------
2: // Copyright (c) 2012 eryar All Rights Reserved.
3: //
4: // File : Main.cpp
5: // Author : [email protected]
6: // Date : 2012-11-4 21:25
7: // Version : 0.1v
8: //
9: // Description : OpenCASCADE Application Framework sample code.
10: //
11: //==============================================================================
12:13: #include <iostream>14: using namespace std;15:16: #include <TDF_Tool.hxx>17: #include <TDF_ChildIterator.hxx>18: #include <TDataStd_Integer.hxx>19: #include <TDocStd_Document.hxx>20:21: // Use Toolkit: TKLCAF
22: #pragma comment(lib, "TKernel.lib")
23: #pragma comment(lib, "TKLCAF.lib")
24:25: int main(int argc, char* argv[])26: {27: TCollection_AsciiString entry;28:29: Handle_TDocStd_Document myDF = new TDocStd_Document("myDocument");30:31: // Main label and root label of the data framework.
32: TDF_Label mainLabel = myDF->Main();33: TDF_Label root = mainLabel.Root();34:35: cout<<"Main label :";
36: mainLabel.EntryDump(cout);37:38: cout<<endl<<"Root label :";
39: root.EntryDump(cout);40:41: // Create a label with tag 10 at Root.
42: TDF_Label myLabel = root.FindChild(10);43:44: cout<<endl<<"Entry of the new label :";
45: myLabel.EntryDump(cout);46:47: // Retrieving child labels.
48: cout<<endl<<"Retrieving child labels: "<<endl;
49: for (TDF_ChildIterator it(root); it.More(); it.Next())
50: {51: it.Value().EntryDump(cout);52: cout<<endl;53: }54:55: // Attaching an attribute to a label.
56: Handle_TDataStd_Integer INT = new TDataStd_Integer;
57: myLabel.AddAttribute(INT);58:59: // Testing of attribute attachment.
60: if (myLabel.IsAttribute(INT->GetID()))
61: {62: cout<<"The attribute is attached to the label."<<endl;
63: }64: else
65: {66: cout<<"The attribute is not attached to the label."<<endl;
67: }68:69: // Removing an attribute from a label.
70: myLabel.ForgetAttribute(INT->GetID());71:72: // Testing of attribute attachment.
73: if (myLabel.IsAttribute(INT->GetID()))
74: {75: cout<<"The attribute is attached to the label."<<endl;
76: }77: else
78: {79: cout<<"The attribute is not attached to the label."<<endl;
80: }81:82: return 0;
83: }
輸出結果如下所示:
1: Main label :0:12: Root label :0:3: Entry of the new label :0:10
4: Retrieving child labels:5: 0:16: 0:107: The attribute is attached to the label.8: The attribute is not attached to the label.
9: Press any key to continue . . .
2012-11-06