OpenCASCADE Application Framework Data Framework Services

时间:2022-10-21 13:45:39

OpenCASCADE Application Framework Data Framework Services

eryar@163.com

一、概述Overview

OpenCASCADE的数据框架对来自不同程序的数据提供了统一的处理环境。这就简化了数据交换、修改,也保证了数据统一性、稳定性。实现方法需要用到以下部分:

u 标号Tha tag

u 标签The label

u 属性The attribute

OpenCASCADE Application Framework Data Framework Services

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

OpenCASCADE Application Framework Data Framework Services

2. 用户自定义创建标号法生成子标签 Creation of a child label by user delivery from a tag

创建子标签的另一种方式就是用户自定义创建。即在指定标号创建标签。可以使用TDF_Label::FindChildTDF_Label::Tag来获得指定标号的子标签。

OpenCASCADE Application Framework Data Framework Services

如上代码所示,3是需要查找的标签的标号,Standard_False用来表示若查找不到指定标号时是否创建子标签。

三、标签The Label

标号(Tag)给了标签(Label)一个唯一的地址。数据框架中的标签是包含属性,绑定数据的容器。数据框架的本质是一个标签树,如下图所示:

OpenCASCADE Application Framework Data Framework Services

数据框架中的标签不能被删除,因此,当文档打开后已经的数据框架结构不能被删除。

1. 创建标签 Label creation

可以在任意层次创建标签,也可以找到标签在数据框架中的深度(Depth)。TDF_Label提供上述功能。

2. 创建子标签 Creating child labels

在数据框架中指定标签上创建子标签使用TDF_Label::FindChild。如下所示:

OpenCASCADE Application Framework Data Framework Services

当把FindChilde的第二个参数设为Standard_True时,就确保了查找不到指定标号的标签时会创建一个标签。如下所示:

OpenCASCADE Application Framework Data Framework Services

3. 访问子标签 Retrieving child labels

可以使用遍历器来访问当前标签的第一层的子标签。如下所示:

OpenCASCADE Application Framework Data Framework Services

也可以访问当前标签的所有子标签,如下所示:

OpenCASCADE Application Framework Data Framework Services

使用TDF_Tool::Entry可以得到当前标签的入口字符串,如下所示:

OpenCASCADE Application Framework Data Framework Services

4. 访问父标签

访问当前标签的父标签:

OpenCASCADE Application Framework Data Framework Services

四、属性The Attribute

标签本身不包含任何数据。所有数据,不管什么类型,程序的非程序的数据都是保存在属性中。属性是绑定在标签上,且属性可以是任意类型的数据。OCAF提供许多直接可以使用的属性如:整数、实数、轴、平面。也有用于拓朴、功能、可视化的属性。每种类型的属性由GUID来标识。这样做的好处就是所有类型的属性都以相同的方式处理。可以创建新的实例,访问、绑定到标签和从标签上删除等。

1.访问标签的属性

使用函数TDF_Label::FindAttribute来访问标签的属性。如下例所示,

OpenCASCADE Application Framework Data Framework Services

2.使用GUID来标识属性 Identifying an attribute using a GUID

可以创建一个属性对象并得到其GUID。如下例所示,创建了一个整数属性,通过方法ID来得到GUID

OpenCASCADE Application Framework Data Framework Services

3. 将属性绑定到标签 Attaching an attribute to a label

使用函数TDF_Label::Add来将属性绑定到标签。重复绑定相同GUID的属性到一个标签会出现错误。TDF_Attribute::Label可以得到绑定属性的标签。如下所示:

OpenCASCADE Application Framework Data Framework Services

4. 测试标签绑定状态 Testing the attachment to a label

可以使用函数TDF_Attribute::IsA来检验属性是否已经绑定到标签上,函数的参数是属性的GUID。在下例所示,是检测当前标签是否有整数属性,然后得出这个标签属性的数量。函数TDF_Tool::HasAttribute用来检测标签是否绑定的有属性,函数TDF_Tool::NbAttributes返回标签绑定属性的数量。

OpenCASCADE Application Framework Data Framework Services

5. 删除标签的属性 Removing an attribute from a label

若要将属性从标签中删除,可以使用TDF_Label::Forget,函数参数为属性的GUID。若要删除标签所有属性,使用函数TDF_Label::ForgetAll

OpenCASCADE Application Framework Data Framework Services

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  : eryar@163.com
  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 . . .

eryar@163.com

2012-11-06

OpenCASCADE Application Framework Data Framework Services的更多相关文章

  1. OpenCascade Application Framework Introduction

    OpenCascade Application Framework Introduction eryar@163.com 本教程介绍了Open CASCADE程序框架(Application Fram ...

  2. &lbrack;转&rsqb;Creating an Entity Framework Data Model for an ASP&period;NET MVC Application &lpar;1 of 10&rpar;

    本文转自:http://www.asp.net/mvc/overview/older-versions/getting-started-with-ef-5-using-mvc-4/creating-a ...

  3. &period;NET Compact Framework Data Provider for SQL Server CE

    .NET Compact Framework Data Provider for SQL Server Mobile Standard Data Source=MyData.sdf;Persist S ...

  4. 连接MySQL数据库得到错误&ldquo&semi;Unable to find the requested &period;Net Framework Data Provider&rdquo&semi;

      Registering DbProviderFactories Each .NET Framework data provider that supports a factory-based cl ...

  5. 源码学习之ASP&period;NET MVC Application Using Entity Framework

    源码学习的重要性,再一次让人信服. ASP.NET MVC Application Using Entity Framework Code First 做MVC已经有段时间了,但看了一些CodePle ...

  6. How to&colon; Use the Entity Framework Data Model Located in an External Assembly 如何:使用位于外部程序集中的EF数据模型

    If you have a non-XAF application, and want to develop an XAF application that utilizes the same dat ...

  7. How to&colon; Supply Initial Data for the Entity Framework Data Model 如何:为EF数据模型提供初始数据

    After you have introduced a data model, you may need to have the application populate the database w ...

  8. CodeSimth - &period;Net Framework Data Provider 可能没有安装。解决方法

    今天想使用CodeSimth生成一个sqlite数据库的模板.当添加添加数据库的时候发现: .Net Framework Data Provider 可能没有安装. 下面找到官方的文档说明: SQLi ...

  9. CodeSimth - &period;Net Framework Data Provider 可能没有安装

    使用CodeSimth 连接SQLite数据库库 提示错误 codesmith 6以上的版本,说是支持sqlite生成,也有对应的sqliteprovider.dll,但是使用时却说Test fail ...

随机推荐

  1. c&num; 获取 本周、本月、本季度、本年 的开始时间或结束时间

    #region 获取 本周.本月.本季度.本年 的开始时间或结束时间 /// <summary> /// 获取结束时间 /// </summary> /// <param ...

  2. STL之序列式容器list与forward&lowbar;list

    List (双向链表) 与 forwardlist (单向链表) 算是非常基础的数据结构了,这里只是简单介绍下其结构及应用. 以list为例: 其节点模板: template <class T& ...

  3. 使用AIDL远程调用服务中的方法

    AIDL:android interface define language(接口定义语言) 作用:方便远程调用其他服务中的方法 注意:安卓四大组件都要在清单文件注册 aidl创建图: AIDL的全称 ...

  4. 简易版CSS3 Tab菜单 实用的Tab切换

    今天我们要来分享一款非常简易而又实用的CSS3 Tab菜单,Tab菜单没有非常华丽的动画,但是代码非常简洁易懂,也可以在大部分场合使用,因此也非常实用,如果你需要加入动画效果,也可以自己方便地修改这款 ...

  5. HTML实体

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  6. &lpar;转&rpar;php 获取今日、昨日、上周、本月的起始时间戳和结束时间戳的方法

    php 获取今日.昨日.上周.本月的起始时间戳和结束时间戳的方法,主要使用到了 php 的时间函数 mktime. 下面首先还是直奔主题以示例说明如何使用 mktime 获取今日.昨日.上周.本月的起 ...

  7. LINUX 命令行编辑

    向          <-前               后 -> 删除 ctrl + d      删除光标所在位置上的字符相当于VIM里x或者dl ctrl + h      删除光标 ...

  8. LInux 些许知识

    1.Linux下去掉^M的方法 ①dos2unix filename ②sed -i 's/^M//g' filename #注意:^M的输入方式是 Ctrl + v ,然后Ctrl + M 2.so ...

  9. xshell 显示中文

    xshell 可能无法正常显示中文,即使选择了utf-8编码也不生效. 1:输入:echo $LANG 显示:en_US.UTF-8 2.输入:export LANG=zh_CN.UTF-8 3. 输 ...

  10. linux命令学习之:echo

    echo命令用于在shell中打印shell变量的值,或者直接输出指定的字符串.linux的echo命令,在shell编程中极为常用, 在终端下打印变量value的时候也是常常用到的,因此有必要了解下 ...