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:1:2:1。
每个标签(label)可以一些属性(attribute),这些属性可以包含数据。每个属性由GUID来区分。标签最重要的性质是其入口只是数据框架的一个地址。
二、标号The Tag
一个标号Tag就是一个整数,它用两种方式标示了一个label:
u 相对标示法 Relative identification:一个标签的标号只与其父标签有关系。如对于一个指定的标签,可能由四个子标签组成,其标号分别为2,7,18,100。使用相对标示方法,在设置属性时有安全的范围。
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::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 : 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 . . .
2012-11-06
OpenCASCADE Application Framework Data Framework Services的更多相关文章
- OpenCascade Application Framework Introduction
OpenCascade Application Framework Introduction eryar@163.com 本教程介绍了Open CASCADE程序框架(Application Fram ...
- [转]Creating an Entity Framework Data Model for an ASP.NET MVC Application (1 of 10)
本文转自:http://www.asp.net/mvc/overview/older-versions/getting-started-with-ef-5-using-mvc-4/creating-a ...
- .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 ...
- 连接MySQL数据库得到错误“Unable to find the requested .Net Framework Data Provider”
Registering DbProviderFactories Each .NET Framework data provider that supports a factory-based cl ...
- 源码学习之ASP.NET MVC Application Using Entity Framework
源码学习的重要性,再一次让人信服. ASP.NET MVC Application Using Entity Framework Code First 做MVC已经有段时间了,但看了一些CodePle ...
- How to: 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 ...
- How to: 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 ...
- CodeSimth - .Net Framework Data Provider 可能没有安装。解决方法
今天想使用CodeSimth生成一个sqlite数据库的模板.当添加添加数据库的时候发现: .Net Framework Data Provider 可能没有安装. 下面找到官方的文档说明: SQLi ...
- CodeSimth - .Net Framework Data Provider 可能没有安装
使用CodeSimth 连接SQLite数据库库 提示错误 codesmith 6以上的版本,说是支持sqlite生成,也有对应的sqliteprovider.dll,但是使用时却说Test fail ...
随机推荐
- 关于selenium截图
没时间深入研究源代码,凭调试解决了非浏览器级别的滚动条截图. 首先,定位到带有滚动条的元素,通过xpath. 其次,获取scrollheight和clientheight. 第三,循环截图,循环截图的 ...
- sqlserver 2008 数据库表结构脚本及数据导出
sqlserver2008 在xp上尝试安装了 sqlserver2008 express版本,但是和公司的sqlserver2008 r2 版本不兼容.升级的时候,出了问题.所以换了中思路,将数据 ...
- C# IGUID的生成
GUID(全局统一标识符)是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的.通常平台会提供生成GUID的API.生成算法很有意思,用到了以太网卡地址.纳秒级时间.芯片ID码和许多可 ...
- C# 图片压缩
/// <summary> /// 图片压缩方法 /// </summary> /// <param name="sF ...
- 润乾报表之制作List列表
一般情况洗啊,如果sql查到多条数据,使用表格扩展的方式在一张表格里面(横展.纵展):目前的需求是,以报表为单位,做成List.例如,如果查出3条数据,预览的时候,要有3张格式相同内容有异的报表.如图 ...
- SQL Server 2008 R2 下移动数据库的存储位置
使用场景:1. 该数据库增长的较大,存储磁盘空间不足: 2. 在特定情况下该数据库需要移动到另外一块磁盘上(呵呵...我的情况就是之前的磁盘要还给别人) 步骤: 1. 新建查询 SELECT na ...
- 针对Excel的vbs操作
工程中具有导入Excel数据的功能,但是需要满足一定的格式.为了在导入之前,对Excel的格式进行规范,对vbs脚本语言进行了一定的了解,并实现了一个可以将Excel全部单元格设为文本格式的vbs脚本 ...
- halcon三种模板匹配方法
halcon有三种模板匹配方法:即Component-Based.Gray-Value-Based.Shaped_based,分别是基于组件(或成分.元素)的匹配,基于灰度值的匹配和基于形状的匹配,此 ...
- PHPBB公布新的维护版本
9月28日,PHPBB官方网站公布了新PHPBB的最新消息.这个版本命名为:"Richard 'D¡cky' Foote",版本号为3.0.12.据官方的说明,“这个版本是一个维护 ...
- Entity FrameWork 单表对多实体
一个影片信息Clips表,四个字段:clipId,clipName,fileSize,fileName 方案一: [Table("Clips")] public class Cli ...