1. 程式人生 > >OpenCASCADE Application Framework Data Framework Services

OpenCASCADE Application Framework Data Framework Services

OpenCASCADE Application Framework

Data Framework Services

一、概述Overview

OpenCASCADE的資料框架對來自不同程式的資料提供了統一的處理環境。這就簡化了資料交換、修改,也保證了資料統一性、穩定性。實現方法需要用到以下部分:

u 標號Tha tag

u 標籤The label

u 屬性The attribute

Contents of a document

Figure 1. Contents of a document

如上圖所示,框架樹的第一個標籤(label)是根標籤(root)。每個標籤(label)有個以整數表示的標號(tag)。由當前標籤的標號到根標籤的標號,可以得到一個惟一的標號列表,如:0

:1:2:1

每個標籤(label)可以一些屬性(attribute),這些屬性可以包含資料。每個屬性由GUID來區分。標籤最重要的性質是其入口只是資料框架的一個地址。

二、標號The Tag

一個標號Tag就是一個整數,它用兩種方式標示了一個label

u 相對標示法 Relative identification:一個標籤的標號只與其父標籤有關係。如對於一個指定的標籤,可能由四個子標籤組成,其標號分別為2718100。使用相對標示方法,在設定屬性時有安全的範圍。

u 絕對標示法 Absolute identification:一個標籤在資料框架中位置由無歧義的、從根標籤的標號到當前標籤的標號用冒號表示的標號列表(list

of tags)來表示。

不管採用哪種方法,都要注意的是這些標號的值沒什麼實際的意義。只是用來確定每個標籤在樹結構的位置,都是為了使用文件支援Undo/Redo的功能。

建立標號Tag的兩種方式:

u Random delivery 隨機建立;

u User-defined delivery 使用者自定義建立;

正如字面所說,隨機建立標號時,標號是由系統隨機生成。使用者自定義建立標號時,標號的值是建立標號函式的引數。

1. 隨機建立標號法生成子標籤 Creating child labels using random delivery of tags

使用TDF_TagSource::NewChild

來新增標籤。如下程式碼所示,函式NewChild的引數level2也是一個TDF_Label

2. 使用者自定義建立標號法生成子標籤 Creation of a child label by user delivery from a tag

建立子標籤的另一種方式就是使用者自定義建立。即在指定標號建立標籤。可以使用TDF_Label::FindChildTDF_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:1
  2: Root label :0:
  3: Entry of the new label :0:10
  4: Retrieving child labels:
  5: 0:1
  6: 0:10
  7: 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