OpenCasCade官方开发文档翻译(11)–扩展数据交换 (XDE)

介绍

本手册介绍了如何使用扩展数据交换(XDE)。它提供了有关设置和使用 XDE 的基本文档。

扩展数据交换 (XDE) 模块允许通过转换附加到几何 BREP 数据的附加数据来扩展交换范围,从而提高与外部软件的互操作性。

支持颜色、层、装配描述和验证属性(即重心等)等数据类型。这些数据与形状一起存储在 XCAF 文档中。也可以以现有工具为原型添加新类型的数据。

最后,XDE 提供读写器工具,用于在 IGES 和 STEP 文件中读取和写入 XCAF 支持的数据。

图片[1]-OpenCasCade官方开发文档翻译(11)–扩展数据交换 (XDE)-卡核

使用 XDE 导入的形状

XDE 组件需要形状修复工具包才能运行。

基本条款

为了更好地理解 XDE,定义了一些关键术语:

  • 形状——独立的形状,不属于装配结构。
  • 实例– 另一个形状的复制,其位置可以是相同的位置,也可以是不同的位置。
  • 装配体——一种结构,它既可以是根也可以是子装配体。

XDE 组织

XDE 的基础,称为 XCAF,是一个基于OCAF(Open CASCADE Technology Application Framework)的框架,旨在与程序集和各种附加数据(属性)一起使用。属性可以是形状的单个属性,指定形状的某些特征,也可以是分组属性,指定形状属于给定组,其定义与形状不同。

XDE 在 OCAF 文档中工作,该文档具有在专用 XCAF 模块中定义的特定组织。XDE 的各种功能使用这种组织来交换除形状和几何形状之外的标准化数据。

分配给形状的装配结构和属性存储在 OCAF 树中。可以以API 的形式或使用 API来获得TopoDS程序集的每个级别的表示。TopoDS_CompoundTopoDS_Shape

XDE 使用的基本元素由包引入到 XCAF 子模块中XCAFDoc。这些元素包括对标准化数据交换中常用数据结构(除了形状本身)的描述。它们不依附于特定的应用程序,不带来特定的语义,而是根据数据交换的用途和需要进行结构化。XDE 使用的 Document 通常以TDocStd_Document.

组件

XDE 通过分离形状定义及其位置来支持装配。形状是没有位置定义的简单 OCAF 对象。一个组件由几个组件组成。这些组件中的每一个都引用一个具有不同位置的相同指定形状。所有这些都为处理多级装配提供了更大的灵活性。

例如,机械组件可以定义如下:

图片[2]-OpenCasCade官方开发文档翻译(11)–扩展数据交换 (XDE)-卡核

装配说明
图片[3]-OpenCasCade官方开发文档翻译(11)–扩展数据交换 (XDE)-卡核

装配视图

XDE 定义了程序集内容的具体组织。形状存储在 label 的子标签上0:1:1。无论是真正的树还是简单的形状,都可以有一个或多个根(称为自由形状)。如果一个形状是用组件定义的(子形状,定位与否),它可以被认为是一个装配体(如图 1 中的AS1下图)。0:1:1:1

XCAFDoc_ShapeTool是一个允许管理 XCAF 文档的 Shape 部分的工具。此工具作为属性实现,位于形状部分的根标签处。

验证属性

验证属性是由发送系统写入 STEP 文件的形状(体积、质心、表面积)的几何特征。接收系统读取这些特征以验证翻译的质量。这是通过将原始系统计算的值与接收系统在结果模型上计算的相同值进行比较来完成的。

Advanced Data Exchange 支持读取和写入验证属性,并提供检查它们的工具。

图片[4]-OpenCasCade官方开发文档翻译(11)–扩展数据交换 (XDE)-卡核

验证属性描述

检查日志包含计算值与存储在 STEP 文件中的值的偏差。一个典型的例子如下所示:

标签 面积缺陷 体积缺陷 dX dY dZ 名称
0:1:1:1 312.6 (0%) -181.7 (0%) 0.00 0.00 0.00 “S1”
0:1:1:2 -4.6 (0%) -191.2 (0%) -0.00 0.00 -0.00 “主体”
0:1:1:3 -2.3 (0%) -52.5 (0%) -0.00 0.00 0.00 “MAIN_BODY_BACK”
0:1:1:4 -2.3 (0%) -51.6 (0%) 0.00 0.00 -0.00 “MAIN_BODY_FRONT”
0:1:1:5 2.0 (0%) 10.0 (0%) -0.00 0.00 -0.00 “头”
0:1:1:6 0.4 (0%) 0.0 (0%) 0.00 -0.00 -0.00 “HEAD_FRONT”
0:1:1:7 0.4 (0%) 0.0 (0%) 0.00 -0.00 -0.00 “返回”
0:1:1:8 -320.6 (0%) 10.9 (0%) -0.00 0.00 0.00 “尾巴”
0:1:1:9 0.0 (0%) 0.0 (0%) -0.00 -0.00 0.00 “TAIL_MIDDLE”
0:1:1:10 -186.2 (0%) 4.8 (0%) -0.00 0.00 -0.00 “TAIL_TURBINE”
0:1:1:11 0.3 (0%) -0.0 (0%) -0.00 -0.00 0.00 “脚”
0:1:1:12 0.0 (0%) -0.0 (0%) 0.00 -0.00 -0.00 “FOOT_FRONT”
0:1:1:13 0.0 (0%) 0.0 (0%) -0.00 0.00 0.00 “FOOT_BACK”

在我们的示例中,可以看出对于面积、体积或定位数据都没有检测到错误。

名称

XDE 支持从 IGES 和 STEP 文件格式读取和写入形状名称。如果您不需要此类数据,可以关闭此功能,从而减小文档的大小。

图片[5]-OpenCasCade官方开发文档翻译(11)–扩展数据交换 (XDE)-卡核

实例名称

颜色和图层

XDE 可以在 IGES 和 STEP 格式中读取和写入分配给形状或其子部分的颜色和图层(直至面和边的级别)。枚举中定义了三种颜色XCAFDoc_ColorType

  • 通用颜色 ( XCAFDoc_ColorGen)
  • 表面颜色 ( XCAFDoc_ColorSurf)
  • 曲线颜色 ( XCAFDoc_ColorCurv)
图片[6]-OpenCasCade官方开发文档翻译(11)–扩展数据交换 (XDE)-卡核

颜色和图层

几何尺寸和公差 (GD&T)

GD&T 是一种产品和制造信息PMI ),可以由 CAD 系统自动计算,也可以由用户手动输入。有关详细信息,请使用CAx-IF 产品制造信息 (PMI) 表示和表示的推荐做法 (AP242)

XDE 可以读写以下类型的 GD&T 数据:

  • 尺寸,如距离、长度、半径等;
  • 几何公差;
  • 基准,即与公差特征相关的理论上精确的几何参考,例如点、线或平面。

XDE 支持 GD&T 数据的两种表示形式:

  • 语义表示,即数据以机器可消费的方式存储,并包含在不借助任何表示元素的情况下理解规范所需的所有信息;
  • 镶嵌表示,即数据以人类可读的方式显示。

剪裁平面

XDE 支持从 STEP 读取并存储用于裁剪的命名平面。目前,XDE 仅支持以 XBF 格式保存剪切平面。

XDE 提供了添加、编辑和删除剪切平面的功能。

保存的视图

XDE 支持从 STEP 视图读取。视图允许保存有关相机参数(位置、方向、缩放系数等)和可见形状、PMI、使用的剪切平面和注释的信息。目前,XDE 仅支持以 XBF 格式保存剪切平面。

XDE 提供以下视图管理功能:

  • 添加/删除视图;
  • 设置查看相机参数;
  • 设置可见形状、PMI、使用的剪切平面和注释。

自定义注释

自定义注释是一种附加到装配项目、它们的属性和子形状的特定于应用程序的数据。基本上,有简单的文本注释、二进制数据和其他特定于应用程序的数据。每个笔记都提供了一个时间戳和创建它的用户。

Notes API 提供以下功能:

  • 返回注释和注释项的总数;
  • 返回所有注释和注释项目的标签;
  • 创建笔记:
    • 来自文本字符串的注释;
    • 来自文件或字节数组的二进制数据注释;
  • 检查装配项目是否已注释;
  • 查找注释项的标签;
  • 返回注释项的所有注释标签;
  • 向项目添加注释:
    • 组装项目;
    • 装配项属性;
    • 装配项子形状索引;
  • 从带注释的装配项目中删除注释;可以选择删除孤立笔记(没有链接笔记的项目将被自动删除);
  • 删除注释并将其从带注释的项目中删除;
  • 获取/删除孤儿笔记。

入门

如上一章所述,XDE 使用TDocStd_Documents作为起点。XDE 的一般用途是:

  • 检查现有文档是否适合 XDE;
  • 获取应用程序和初始化文件;
  • 初始化文档以适应 XDE;
  • 添加、设置和查找数据;
  • 查询和管理形状;
  • 将属性附加到形状。

XDE 使用的 Document 通常以TDocStd_Document.

环境变量

要使用 XDE,您必须正确设置环境变量。确保两个重要的环境变量设置如下:

  • CSF_PluginDefaults指向的来源$CASROOT/src/XCAFResources
  • CSF_XCAFDefaults指向的来源$CASROOT/src/XCAFResources

一般检查

在使用形状、属性和其他类型的信息之前,可以查询或完成 XDE 文档的全局组织,以确定现有文档是否实际上是为与 XDE 一起使用而构建的。

要确定现有的TDocStd_Document是否适合 XDE,请使用:

Handle( TDocStd_Document ) theDoc;
if ( XCAFDoc_DocumentTool::IsXCAFDocument (theDoc)) { .. yes .. }

如果文档适用于 XDE,您可以执行本指南中说明的操作和查询。但是,如果一个 Document 不是完全为 XDE 构建的,它必须被初始化。

获取应用程序或初始化文档

如果要检索现有应用程序或现有文档(已知为 XDE 正确结构化),请使用:

形状和组件

初始化 XDE 文档(形状)

XDE 文档以TDocStd_Document. 假设您TDocStd_Document已经创建了一个,您可以通过如下初始化 XDE 结构来确保它针对 XDE 的结构正确:

Handle(TDocStd_Document) theDoc = …;
TDF_Label aLabel = myAssembly->NewShape();

请注意,该方法XCAFDoc_DocumentTool::ShapeTool返回XCAFDoc_ShapeTool. 第一次使用此方法时,它会创建XCAFDoc_ShapeTool. 在我们的示例中,句柄用于TDocStd_Document.

获取一个被视为程序集的节点

要从 XDE 结构中将节点视为程序集,可以使用节点的标签。假设您已正确初始化TDocStd_Document,请使用:

Handle( TDocStd_Document ) theDoc = …;

在前面的示例中,您还可以获得 XDE 文档的 Main Item,该文档通过使用XCAFDoc_DocumentTool::ShapeTool(theDoc->Main())而不是XCAFDoc_DocumentTool::ShapeTool(aLabel).

然后,您可以查询或编辑此 Assembly 节点、Main Item 或另一个(myAssembly在我们的示例中)。

请注意,对于本指南其余部分中的示例,myAssembly始终假定以这种方式访问​​,因此不会重复此信息。

填充或编辑后更新装配体

本章中的某些操作会影响文档的内容,将其视为一个程序集。因此,您有时需要更新各种表示(包括化合物)。

要更新表示,请使用:

myAssembly->UpdateAssemblies();

此调用对存​​储在文档中的装配化合物执行自上而下的更新。

请注意,在对形状进行任何低级修改后,您必须手动运行此方法以实现您的程序集。

添加或设置顶级形状

形状可以添加为顶级形状。顶级意味着它们可以添加到更高级别的装配中,或者作为组件在最高级别单独添加,或者由定位的实例引用。因此可以添加两种类型的顶级形状:

  • 具有上层参考的形状;
  • 没有任何上参考的自由形状(对应于根)。

请注意,可以将多个顶级形状添加到同一个组件中。

要添加的形状可以定义为复合(如果需要),具有以下解释:

  • 如果 Shape 是一个复合体,根据用户的选择,它可能被解释为代表一个装配体,也可能不被解释为代表一个装配体。如果它是一个程序集,它的每个子形状都定义一个子标签。
  • 如果 Shape 不是复合词,则将其视为一个整体,而不是将其分解。

要分解装配结构中的 Compound,请使用:

// True 将 Compound 解释为一个 Assembly,False 将其作为一个整体
bool toMakeAssembly = …;
TDF_Label aLabel = myAssembly->AddShape (aShape, toMakeAssembly);

因此,组件的每个节点都指代它的子形状。

关于子形状的定位实例,相应的形状(没有位置)出现在不同的子标签上。它们由关联位置的形状实例引用。

在给定标签处设置给定形状

可以更改顶级形状。在此示例中,不执行化合物解释:

// 标识标签 (form 0:i:j…)
// 标签必须存在
TDF_Label aLabel = …;
TopoDS_Shape aShape = …;
myAssembly->SetShape (aLabel, aShape);

从标签获取形状

要从顶层的 Label 中获取形状,请使用:

TDF_Label aLabel = …;
// 标签必须存在
if (aLabel.IsNull ( ))
{
// 没有这样的标签:放弃
}
TopoDS_Shape aShape = myAssembly->GetShape (aLabel);
if (aShape.IsNull ( ))
{
// 此标签不适用于 Shape
}

请注意,如果标签对应于程序集,则结果是化合物。

从形状中获取标签

要从顶层获取附加到 Shape 的标签,请使用:

bool toFindInstance = false ; // 这是默认值
TDF_Label aLabel = myAssembly->FindShape(aShape [,toFindInstance]);
if (aLabel.IsNull ( ))
{
// 没有找到这个形状的标签
}

如果toFindInstanceTrue,则搜索具有相同位置的形状。如果是False(默认值),则在原始的、未定位的形状中进行搜索。

标签上的其他查询

可以从 XDE 的 Main Item 中的 Label 进行各种其他查询:

主要形状

要确定是否记录了形状(或不记录),请使用:

if (myAssembly->IsShape (aLabel)) { .. 是 .. }

要确定形状是否是顶级的,即由XCAFDoc_ShapeTool::AddShape方法添加,请使用:

if (myAssembly->IsTopLevel (aLabel)) { .. 是 .. }

要获取由该方法添加的顶级形状的列表XCAFDoc_ShapeTool::AddShape,请使用:

TDF_LabelSequence to FreeShapes;
myAssembly->GetShapes(aFreeShapes);

如果上面的列表只有一项,要一次获得所有免费形状,请使用:

TopoDS_Shape结果 = myAssembly->GetShape(aFreeShapes.First ( ));

如果有多个项目,则必须创建并填充复合,使用:

BRep_Builder aBuilder;
for ( TDF_LabelSequence ::Iterator aLabIter(aFreeShapes); aLabIter.More(); aLabIter.Next());
{
TopoDS_Shape aShape = myAssembly->GetShape (aLabIter.Value());
aBuilder.添加(aComp,aShape);
}

在我们的示例中,结果是化合物aComp。要确定形状是否为自由形状(无参考或超级装配),请使用:

if (myAssembly->IsFree (aLabel)) { .. 是 .. }

要获取自由形状(根)列表,请使用:

TDF_LabelSequence to FreeShapes;
myAssembly->GetFreeShapes(aFreeShapes);

要获取使用给定形状作为组件的形状,请使用:

Standard_Integer aNbUsers = myAssembly->GetUsers (aLabel, aUsers);

的计数aUsers包含在 中aNbUsers。它包含0是否没有用户。

装配和组件

要确定标签是附加到主要零件还是附加到子零件(组件),请使用:

if (myAssembly->IsComponent (aLabel)) { .. 是 .. }

要确定标签是(子)装配的节点还是简单形状,请使用:

if (myAssembly->IsAssembly (aLabel)) { .. 是 .. }

如果标签是(子)装配的节点,则可以获得组件的数量,使用:

bool subchilds = false ; // 默认
Standard_Integer nbc = myAssembly->NbComponents (aLabel [,subchilds]);

如果subchildsTrue,命令也考虑子级别。默认情况下,仅选中一级。

要自己获取组件标签,请使用:

bool subchilds = false ; // 默认
bool isassembly = myAssembly->GetComponents (aLabel, aComps [,subchilds]);

组件的实例和参考

要确定标签是否为简单形状,请使用:

if (myAssembly->IsSimpleShape (aLabel)) { .. 是 .. }

要确定标签是否是对另一个标签的定位引用,请使用:

if (myAssembly->IsReference (aLabel)) { .. 是 .. }

如果标签是定位引用,则可以获取位置,使用:

TopLoc_Location aLoc = myAssembly->GetLocation (aLabel);

要获取引用的原始形状的标签(也测试它是否是引用),请使用:

TDF_Label aRefLabel;
bool isRef = myAssembly->GetReferredShape (aLabel, aRefLabel);

如果不作为参考,则isRef返回注释。FalseaLabel

编辑形状

除了前面描述的AddShape和之外SetShape,还可以进行多种形状编辑。

要删除 Shape 及其所有子标签,请使用:

bool isRemoved = myAssembly->RemoveShape (aLabel);
// isRemoved 如果完成则返回 True

如果形状既不是自由的也不是顶级的,则此操作将失败。

要将组件从新形状添加到装配体,请使用:

bool toExpand = false ; // 默认
TDF_Label aLabel = myAssembly->AddComponent (aShape [,toExpand]);

If toExpandis Trueand aShapeis a Compound,aShape被分解以产生子组件,每个子形状都有一个。

要从先前记录的形状(新组件由参考形状的标签及其位置定义)将组件添加到装配体,请使用:

TDF_Label aRefLabel = …; // 参考形状的标签
TopLoc_Location aLoc = …; // 想要的位置
TDF_Label aLabel = myAssembly->AddComponent (aRefLabel, aLoc);

要从装配中移除组件,请使用:

myAssembly->RemoveComponent (aLabel);

子形状的管理

除了(子)组件的组件之外,还可以对任何形状内的某些子形状进行单独标识。因此,您可以附加特定属性,例如颜色。可以对既不是顶级也不是组件的子形状执行一些附加操作。要将子形状添加到给定标签,请使用:

TDF_Label aSubLabel = myAssembly->AddSubShape (aLabel, aSubShape);

要查找附加到给定子形状的标签,请使用:

TDF_Label子标签;// 要计算的新标签
if (myAssembly-> FindSubShape (aLabel, aSubShape, aSubLabel)) { .. yes .. }

如果找到子形状(是),aSubLabel则填充正确的值。

要查找包含给定子形状的顶级简单形状(不是自由与否的复合形状),请使用:

TDF_Label aMainLabel = myAssembly->FindMainShape (aSubShape);

请注意,有效模型应该只有一种形状。在任何情况下,搜索都会在找到的第一个上停止。

要获取记录在标签下的形状的子形状,请使用:

TDF_LabelSequence一个子形状;
bool hasSubshapes = myAssembly->GetSubShapes (aLabel, aSubShapes);

特性

某些属性可以直接附加到形状。这些属性是:

  • 名称(来自 OCAF 的标准定义);
  • 质心(用于验证转移);
  • 体积(用于验证转移);
  • 区域(用于验证转移)。

还可以附加一些其他属性,也可以通过不同的颜色和图层工具进行管理。颜色和图层作为组织数据的另一种方式进行管理(通过提供一种识别形状组的方式)。颜色被放入一个颜色表中,而形状参考这个表。

将颜色附加到形状有两种方法:

  • 通过附加表格中的项目;
  • 直接添加颜色。

直接添加颜色时,会在目录中进行搜索以确定是否包含请求的颜色。完成此搜索和初始化操作后,将使用第一种将颜色附加到形状的方法。

姓名

Name 被实现并用作 a TDataStd_Name,它可以附加到任何标签上。在继续之前,请考虑:

  • 在 IGES 中,每个实体的名称都可以带有一个可选的数字部分,称为下标标签。例如,MYCURVE是一个名称,并且MYCURVE(60)是一个带有下标标签的名称。
  • 在 STEP 中,有两个级别:Part Names 和 Entity Names:
    • 零件名称附加到“主要形状”,例如零件和装配体。XDE 专门支持这些部件名称。
    • 实体名称可以附加到每个几何实体。此选项很少使用,因为它往往会使数据结构的利用过载。只有在某些特定情况下才证明使用该选项是合理的:例如,当发送系统在每个 STEP 写入后确实可以确保实体名称的稳定性时。如果确保了这种稳定性,您可以使用此选项为使用数据库的外部应用程序发送标识符。

请注意,IGES 或 STEP 文件都将名称作为纯 ASCII 字符串处理。

这些注意事项并非特定于 XDE。特定于数据交换的是名称附加到实体的方式。

要将名称附加到标签上(作为使用 OCAF 的提醒),请使用:

Handle( TDataStd_Name ) aNameAttr;
if (!aLabel.FindAttribute ( TDataStd_Name ::GetID (), aNameAttr))
{
// 没有附加名称
}
TCollection_ExtendedString aName = aNameAttr->Get();

对于交换文件,不要忘记将扩展字符串视为 ASCII。

要将名称设置为标签(作为使用 OCAF 的提醒),请使用:

// 包含此标签的所需名称 (ASCII)
TDataStd_Name::Set (aLabel, aName);

质心

质心由点定义以固定其位置。它作为属性、类的项目、类XCAFDoc_Centroid的子类来处理TDF_Attribute。但是,全局方法可以访问位置本身。

此概念已在 STEP 中与 Volume 和 Area 的概念一起引入,以定义验证属性:此功能允许交换几何图形和一些基本附加值,以便在读取和处理后对它们的维护方式进行综合检查转换交换文件。这种交换依赖于几何和拓扑的可靠交换。否则,这些值可以被认为是不相关的。

可以在组件的任何级别确定质心,从而允许检查单个简单形状及其组合(包括位置)。

要获得附加到形状的质心,请使用:

gp_Pnt aPos;
Handle( XCAFDoc_Centroid ) aCentAttr;
aCentAttr.FindAttribute ( XCAFDoc_Centroid::GetID (), aCentAttr);
if (!aCentAttr.IsNull()) aPos = aCentAttr->Get();

要将质心设置为形状,请使用:

gp_Pnt aPos (X, Y, Z);
// 先前为质心计算的位置
XCAFDoc_Centroid::Set (aLabel, aPos);

区域

面积由实数定义,它对应于形状的计算面积,前提是它包含曲面。它作为属性、类的项目、类XCAFDoc_Area的子类来处理TDF_Attribute。此概念已在 STEP 中引入,但对于实体通常不予考虑,因为使用的是体积。此外,它附加到简单的形状,而不是组件。

要获取附加到形状的区域,请使用:

Standard_Real anArea = 0.0;
处理( XCAFDoc_Area ) anAreaAttr;
anAreaAttr.FindAttribute ( XCAFDoc_Area::GetID (), anAreaAttr);
if (!anAreaAttr.IsNull()) anArea = anAreaAttr->Get();

要将面积值设置为形状,请使用:

// 先前为该区域计算的值
Standard_Real anArea = …;
XCAFDoc_Area::Set (aLabel, anArea);

体积

Volume 由 Real 定义,对应于 Shape 的计算体积,前提是它包含实体。它被作为一个属性,一个类的一个项目,一个的XCAFDoc_Volume子类来处理TDF_Attribute。这个概念已在 STEP 中引入。它可以附加到简单的形状或它们的组件上,用于计算累积体积和重心。

要获得附加到形状的卷,请使用:

Standard_Real aVolume = 0.0;
处理( XCAFDoc_Volume ) aVolAttr;
aVolAttr.FindAttribute ( XCAFDoc_Volume::GetID (), aVolAttr );
if (!aVolAttr.IsNull()) aVolume = aVolAttr->Get();

要将体积值设置为形状,请使用:

// 先前为音量计算的值
Standard_Real aVolume = …;
XCAFDoc_Volume::Set (aLabel, aVolume);

颜色和图层

XDE 可以在 IGES 和 STEP 格式中读取和写入分配给形状或其子部分的颜色和图层(直至面和边的级别)。

图片[7]-OpenCasCade官方开发文档翻译(11)–扩展数据交换 (XDE)-卡核

马达头

在 XDE 文档中,颜色由类管理XCAFDoc_ColorTool。它的工作原理与 ShapeTool 处理 Shapes 的原理相同。该工具可以在主标签或任何子标签上提供。Property 本身被定义为 的XCAFDoc_Color子类TDF_Attribute

颜色存储在起始文档标签的子级中:它是第二级 ( 0.1.2),而 Shapes 位于第一级。然后,每种颜色对应一个专用标签,属性本身是 a Quantity_Color,它具有红色、绿色、蓝色的名称和值。颜色可以附加到表面(平面颜色)或曲线(线框颜色),或两者。颜色可以附加到子形状。在这种情况下,子形状(及其自己的子形状)将其自己的颜色作为优先级。

使用与颜色相同的原则处理图层。在下面描述的所有操作中,您可以在处理图层时简单地将颜色替换为图层。类支持层。XCAFDoc_LayerTool

属性的类是 的XCAFDoc_Layer子类,TDF_Attribute而它的定义是 a TCollection_ExtendedString。处理图层时通常使用整数。一般情况有:

  • IGES 有LevelList作为层号列表(不常用);
  • STEP 标识一个层(不是通过数字,而是通过字符串),更通用。

颜色和形状与树节点相关。

这些定义对于各种交换格式是通用的,至少对于 STEP 和 IGES 是这样。

初始化

要查询、编辑或初始化文档以处理 XCAF 的颜色,请使用:

Handle( XCAFDoc_ColorTool ) myColors = XCAFDoc_DocumentTool::ColorTool (theDoc->Main());

可以随时使用此调用。第一次使用时,将相关结构添加到文档中。此定义用于以下所有颜色调用,不再重复。

添加颜色

有两种添加颜色的方法。你可以:

  • 添加定义为的新颜色Quantity_Color,然后直接将其设置为形状(匿名颜色);
  • 定义一个新的属性颜色,将其添加到颜色列表中,然后将其设置为各种形状。

当 Color 按其值Quantity_Color添加时,仅当尚未在 Document 中记录(相同的 RGB 值)时才添加它。

要使用标签将颜色设置为形状,请使用:

Quantity_Color aCol(红、绿、蓝);
// 可以取以下值之一:
// XCAFDoc_ColorGen – 所有类型的几何图形;
// XCAFDoc_ColorSurf – 仅表面;
// XCAFDoc_ColorCurv – 仅曲线。
XCAFDoc_ColorType aColType = …;
myColors->SetColor (aLabel, aCol, aColType);

或者,可以直接指定 Shape ,而不使用其标签,使用:

myColors->SetColor (aShape, aCol, aColType);
// 显式地创建和添加颜色
Quantity_Color aCol(r、g、b);
TDF_Label aColLabel = myColors->AddColor (aCol);

请注意,这个颜色可以被命名,允许以后通过它的名称而不是它的值来检索。

要将由其标签标识并已记录的颜色设置为形状,请使用:

XCAFDoc_ColorType aColType = …; // 看上面
if (myColors->SetColors (aLabel, aColLabel, aColType)) {.. 完成了.. }

在本例中,aLabel可以直接替换为aShape

颜色查询

可以对颜色执行各种查询。但是,本节仅包含特定查询,不包括使用名称的一般查询。

要确定颜色是否附加到形状,对于给定的颜色类型 ( aColType),请使用:

if (myColors->IsSet (aLabel, aColType))
{
// 是的,有一个 ..
}

在本例中,aLabel可以直接替换为aShape

要将颜色附加到形状(对于任何颜色类型),请使用:

// 将接收记录的值(如果有的话)
if (!myColors->GetColor (aLabel, aCol))
{
// 抱歉,没有颜色 ..
}

颜色名称也可以通过aCol.StringName或查询aCol.Name。在本例中,aLabel可以直接替换为aShape

要使用特定颜色类型将颜色附加到形状,请使用:

XCAFDoc_ColorType aColType = …;
// 将接收记录的值(如果有的话)
if (!myColors->GetColor (aLabel, aColType, aCol))
{
// 抱歉,没有颜色 ..
}

要获取文档中记录的所有颜色,请使用:

TDF_LabelSequence aColLabels;
myColors->GetColors (aColLabels);
for ( TDF_LabelSequence::Iterator aColIter (aColLabels); aColIter.More(); aColIter.Next())
{
Quantity_Color aCol;// 接收值
TDF_Label aColLabel = aColIter.Value();
if (!myColors->GetColor (aColLabel, aCol)) { continue ; }
}

要从其值中查找颜色,请使用:

Quantity_Color aCol(红、绿、蓝);
TDF_Label aColLabel = myColors->FindColor (aCol);
if (!aColLabel.IsNull ( )) { .. found .. }

编辑颜色

除了添加颜色之外,还可以进行以下属性编辑:

要取消设置形状上的颜色,请使用:

// 所需的类型(所有的 XCAFDoc_ColorGen )
XCAFDoc_ColorType aColType = …;
myColors->UnSetColor (aLabel, aColType);

要删除颜色及其所有引用(使相关形状变为无色),请使用:

myColors->RemoveColor(aColLabel);

几何尺寸和公差 (GD&T)

XDE 可以从 STEP 格式读取和写入分配给形状或其子部分的 GD&T(直至面和边的级别)。

在 XDE 文档中,GD&T 由类管理XCAFDoc_DimTolTool。它的工作原理与 ShapeTool 处理 Shapes 的原理相同。该工具可以在主标签或任何子标签上提供。GD&T 实体本身被定义为以下子类TDF_Attribute

GD&T 类型由上面列出的属性标识,即XCAFDoc_DimTolTool处理特定实体类型的方法检查传递的标签中是否存在相应的属性。XCAFDoc_DimTolTool为此,可以使用以“是”开头的方法。

GD&T 实体存储在起始文档标签的子项中0.1.4。然后每个 GD&T 实体对应于专用标签,属性本身是访问类之一:

  • XCAFDimTolObject_DimensionObject– 尺寸;
  • XCAFDimTolObject_GeomToleranceObject——几何公差;
  • XCAFDimTolObject_DatumObject– 用于几何公差基准。

GD&Ts 和 Shapes 由 Graph Nodes 关联。

这些定义对于各种交换格式是通用的,至少对于 STEP 而言。

初始化

要查询、编辑或初始化文档以处理 XCAF 的 GD&T,请使用:

句柄( XCAFDoc_DimTolTool ) myDimTolTool = XCAFDoc_DocumentTool::DimTolTool (theDoc->Main());

可以随时使用此调用。首次使用时,会在文档中添加相关结构。此定义用于所有以后的 GD&T 调用,不再重复。

添加 GD&T

XCAFDoc_DimTolTool提供创建 GD&T“空”实体的方法:

所有方法都为工具主标签的相应 GD&T 实体创建一个子标签,并为创建的实体附加一个特定的属性。

以下是添加新维度的示例:

TDF_Label aDimLabel = myDimTolTool->AddDimension();
if (!aDimLabel.IsNull ( ))
{
//错误处理
}

类似的方法可用于其他 GD&T 类型。

编辑 GD&T

新添加的 GD&T 实体为空。要设置其数据,应使用相应的访问对象,如下所示,其中尺寸变为两点之间的线性距离。

Handle( XCAFDoc_Dimension ) aDimAttr;
if (!aDimAttr.IsNull())
{
Handle( XCAFDimTolObjects_DimensionObject ) aDimObject = aDimAttr->GetObject();
// 设置维度数据
aDimObject->SetType(XCAFDimTolObjects_DimensionType_Location_LinearDistance);
aDimObject->SetPoint(thePnt1); // 第一个参考点
aDimObject->SetPoint2(thePnt2); // 第二个参考点
aDimObject->SetValue(theValue); // 距离值
// …
aDimAttr->SetObject(aDimObject);
}

类似的方法可用于其他 GD&T 类型。

链接 GD&T

要将 GD&T 实体与其他 OCAF 标签(例如表示形状)链接,应使用以下方法:

这些方法可以采用单个标签或一系列标签。所有以前的链接都将被删除。

下面的示例演示了将维度链接到形状标签序列:

TDF_LabelSequence aShapes1, aShapes2;
aShapes1.Append (aShape11);
//…
aShapes2.Append (aShape21);
//…
aDGTTool->SetDimension (aShapes1, aShapes2, aDimLabel);

此外,XCAFDoc_DimTolTool::SetDatumToGeomTol应使用特殊方法将基准与形位公差联系起来。

查找 GD&T 和参考形状

XCAFDimTolObjects_Tool类提供了搜索与形状相关联的 GD&T 的基本功能。该工具提供与形状相关的尺寸序列、几何公差和基准。还为几何公差返回一系列相关基准。

要获得 GD&T 实体的参考形状,可以使用XCAFDoc_DimTolTool::GetRefShapeLabel.

XCAFDoc_DimTolTool提供获取所有尺寸、几何公差和基准的列表的方法。

存储自定义数据

XDE 中的每个 GD&T 实体都表示为带有标识实体类型的附加属性的标签。所有特定数据都存储在标准 OCAF 属性中的子标签中,例如TDataStd_IntegerTDataStd_IntegerArrayTDataStd_RealArray。子标签标签保留供内部使用,不能用于存储自定义数据。以下标签范围为 GD&T 实体保留:

  • 1 – 17 – 用于尺寸;
  • 1 – 17 – 用于几何公差;
  • 1 – 19 – 日期。

自定义数据可以存储在标签中,标签超出上述范围。

剪裁平面

在 XDE 文档中,剪切平面由类管理XCAFDoc_ClippingPlaneTool。它的工作原理与 ShapeTool 处理 Shapes 的原理相同。该工具可以在主标签或任何子标签上提供。剪切平面存储在起始文档 label 的子项中0.1.8,其中平面本身被定义为TDataXtd_Plane属性。TDataStd_Name属性用于命名。

要查询、编辑或初始化文档以处理 XCAF 的剪切平面,请使用:

Handle( XCAFDoc_ClippingPlaneTool ) myClipPlaneTool = XCAFDoc_DocumentTool::ClippingPlaneTool (theDoc->Main());

可以随时使用此调用。首次使用时,会在文档中添加相关结构。

要添加剪切平面,请使用重载方法之一XCAFDoc_ClippingPlaneTool::AddClippingPlane,例如:

gp_Pln aPln = …;
Standard_Boolean aCapping = …;
TDF_Label aClipPlnLbl = myClipPlaneTool->AddClippingPlane (aPln, “平面名称” , aCapping);
if (aClipPlnLbl.IsNull ( ))
{
//错误处理
}

删除平面使用XCAFDoc_ClippingPlaneTool::RemoveClippingPlane方法,例如:

if (!myClipPlaneTool->RemoveClippingPlane (aClipPlnLbl))
{
// 未删除
}

如果至少在一个视图中引用了该平面,则不会删除该平面。

要更改剪切平面及其名称使用XCAFDoc_ClippingPlaneTool::UpdateClippingPlane方法,例如:

gp_Pln aPln = …;
myClipPlaneTool->UpdateClippingPlane (aClipPlnLbl, aPln, “新的平面名称” );

可以使用XCAFDoc_ClippingPlaneTool::SetCapping方法更改封顶属性,例如:

Standard_Boolean aCapping = …;
myClipPlaneTool->SetCapping (aClipPlnLbl, aCapping);

XCAFDoc_ClippingPlaneTool可用于获取所有剪切平面标签并检查标签是否属于ClippingPlane 表,例如:

TDF_LabelSequence aClipPlaneLbls;
myClipPlaneTool->GetClippingPlanes(aClipPlaneLbls);
for ( TDF_LabelSequence::Iterator anIt(aClipPlaneLbls); anIt.More(); anIt.Next());
{
if (myClipPlaneTool->IsClippingPlane(anIt.Value()))
{
// 标签是一个剪切平面
gp_Pln aPln;
if (!myClipPlaneTool->GetClippingPlane(anIt.Value(), aPln, aName, aCapping))
{
//错误处理
}
}
}

保存的视图

在 XDE 文档中,视图由类管理XCAFDoc_ViewTool。它的工作原理与 ShapeTool 处理 Shapes 的原理相同。该工具可以在主标签或任何子标签上提供。视图存储在起始文档 label的子类中0.1.7,其中视图本身被定义为 的XCAFDoc_View子类TDF_Attribute。视图和选定的形状、剪裁平面、GD&T 和注释由图形节点关联。

要查询、编辑或初始化 Document 以处理 XCAF 的视图,请使用:

Handle( XCAFDoc_ViewTool ) myViewTool = XCAFDoc_DocumentTool::ViewTool (theDoc->Main());

可以随时使用此调用。首次使用时,会在文档中添加相关结构。

添加视图使用XCAFDoc_ViewTool::AddView方法和访问XCAFView_Object对象来设置相机参数,例如:

TDF_Label aViewLbl = myViewTool->AddView();
if (aViewLbl.IsNull ( ))
{
//错误处理
}
Handle( XCAFDoc_View ) aViewAttr;
if (!aViewAttr.IsNull())
{
Handle( XCAFView_Object ) aViewObject = aViewAttr->GetObject();
// 设置视图数据
aViewObject->SetType(XCAFView_ProjectionType_Parallel);
aViewObject->SetViewDirection(theViewDir);
aViewObject->SetZoomFactor(2.0);
aViewAttr->SetObject(aViewObject);
}

要设置为视图选择的形状、剪裁平面、GD&T 和注释,请SetView使用XCAFDoc_ViewTool. 要仅设置剪切平面,应使用XCAFDoc_ViewTool::SetClippingPlanes方法。

TDF_LabelSequence aShapes; …
TDF_LabelSequence aGDT;…
myViewTool->SetView(aShapes, aGDTs, aViewLbl);
TDF_LabelSequence aClippingPlanes; …
myViewTool->SetClippingPlanes(aClippingPlanes, aViewLbl);

删除视图使用XCAFDoc_ViewTool::RemoveView方法。

要获取所有视图标签并检查标签是否属于视图表,请使用:

myViewTool->GetViewLabels(aViewLbls);
for ( TDF_LabelSequence::Iterator anIt(aViewLbls); anIt.More(); anIt.Next());
{
if (myViewTool->IsView(anIt.Value()))
{
// 标签是一个视图
}
}

要获取与特定视图关联的形状、剪切平面、GD&T 或注释,请使用以下方法:

反之亦然,要获得显示特定剪切平面、GD&T 或注释的视图,请使用以下方法:

自定义注释

在 XDE 文档中,自定义注释由类管理XCAFDoc_NotesTool。它的工作原理与 ShapeTool 处理 Shapes 的原理相同。该工具可以在主标签或任何子标签上提供。Property 本身被定义为抽象类的子类,XCAFDoc_Note抽象类是TDF_Attributeone 的子类。

自定义注释存储在标签的子XCAFDoc_NotesTool标签 label 中0.1.9.1。然后每个音符对应一个专用标签。注释可以附加到由标签标识的文档项、由整数索引标识的子形状或由 GUID 标识的属性。注释存储在标签的子XCAFDoc_NotesTool标签中,位于 label 0.1.9.2。Notes绑定是通过XCAFDoc_GraphNode属性完成的。

图片[8]-OpenCasCade官方开发文档翻译(11)–扩展数据交换 (XDE)-卡核

XCAF 文档注释部分的结构

初始化

要查询、编辑或初始化文档以处理 XCAF 的自定义注释,请使用:

可以随时使用此调用。第一次使用时,将相关结构添加到文档中。此定义用于所有以后的注释调用,并且不会对其重复。

创建笔记

在注释文档项目之前,必须使用以下XCAFDoc_NotesTool类方法之一创建注释:

两种方法都返回一个类的实例XCAFDoc_Note

Handle( XCAFDoc_NotesTool ) myNotes = …;
Handle( XCAFDoc_Note ) myNote = myNotes->CreateComment ( “User” , “Timestamp” , “Hello, World!” );

此代码将子标签添加到0.1.9.1带有XCAFDoc_NoteComment属性的标签。

编辑笔记

类的实例XCAFDoc_Note可用于注释编辑。一个人可能会改变常见的笔记数据。

myNote->Set( “新用户” , “新时间戳” );

要更改特定数据,需要将myNote句柄向下转换为适当的子类:

Handle( XCAFDoc_NoteComment ) myCommentNote =句柄( XCAFDoc_NoteComment )::DownCast(myNote);
if (!myCommentNote.IsNull())
{
myCommentNote->Set( “新评论” );
}

为了编辑辅助注释数据,如文本和附件位置、渲染平面和镶嵌表示,应使用类XCAFNoteObjects_NoteObject的 GetObject 和 SetObject 方法传递对象XCAFDoc_NoteXCAFNoteObjects_NoteObject类提供以下功能:

  • HasPlane,GetPlane以及SetPlane方法测试、获取和设置用于笔记渲染的平面;
  • HasPointGetPoint以及SetPoint方法测试,获取和设置注释对象上的注释附着位置;
  • HasPointTextGetPointText,SetPointText方法测试,获取和设置测试位置;
  • GetPresentationSetPresentation方法允许测试和指定镶嵌表示。

获取后,可以对传输对象进行编辑设置回note:

Handle( XCAFNoteObjects_NoteObject ) aNoteObj = myNote->GetObject();
if (!aNoteObj.IsNull())
{
gp_Pnt aPntTxt (…);
aNoteObj->SetPointText (aPntTxt);
TopoDS_Shape aS = …;
aNoteObj->SetPresentation (aS);
myNote->SetObject (aNoteObj);
}

添加注释

创建便笺后,可以使用以下XCAFDoc_NotesTool方法将其绑定到 Document 项目:

所有方法都返回一个指向XCAFDoc_AssemblyItemRef标识注释项的属性的指针。

Handle( XCAFDoc_NotesTool ) myNotes = …;
Handle( XCAFDoc_Note ) myNote = …;
TDF_Label theLabel = …;
Handle( XCAFDoc_AssemblyItemRef ) myRef = myNotes->AddNote(myNote->Label(), theLabel);
Standard_GUID theAttrGUID = …;
Handle( XCAFDoc_AssemblyItemRef ) myRefAttr = myNotes->AddNoteToAttr(myNote->Label(), theAttrGUID);
Standard_Integer theSubshape = 1;
Handle( XCAFDoc_AssemblyItemRef ) myRefSubshape = myNotes->AddNoteToSubshape(myNote->Label(), theSubshape);

此代码将三个具有XCAFDoc_AssemblyItemRef属性的子标签添加到 label 0.1.9.2XCAFDoc_GraphNode属性被添加到子标签和注释标签。

寻找笔记

要在标签下查找注释标签,0.1.9.2请使用以下XCAFDoc_NotesTool方法:

Handle( XCAFDoc_NotesTool ) myNotes = …;
TDF_Label theLabel = …;
TDF_Label myLabel = myNotes->FindAnnotatedItem(theLabel);
Standard_GUID theAttrGUID = …;
TDF_Label myLabelAttr = myNotes->FindAnnotatedItemAttr(theLabel, theAttrGUID);
Standard_Integer theSubshape = 1;
TDF_Label myLabelSubshape = myNotes->FindAnnotatedItemSubshape(theLabel, theSubshape);

如果没有对应的注解,将返回空标签。

要获取 Document 项的所有注释,请使用以下XCAFDoc_NotesTool方法:

所有这些方法都返回音符的数量。

Handle( XCAFDoc_NotesTool ) myNotes = …;
TDF_Label theLabel = …;
TDF_LabelSequence theNotes;
myNotes->GetNotes(theLabel, theNotes);
Standard_GUID theAttrGUID = …;
TDF_LabelSequence theNotesAttr;
myNotes->GetAttrNotes(theLabel, theAttrGUID, theNotesAttr);
Standard_Integer theSubshape = 1;
TDF_Label对Notes 子形状进行排序;
myNotes->GetAttrSubshape(theLabel, theSubshape, theNotesSubshape);

删除笔记

要删除注释,请使用以下XCAFDoc_NotesTool方法之一:

Handle( XCAFDoc_Note ) myNote = …;
TDF_Label theLabel = …;
myNotes->RemoveNote(myNote->Label(), theLabel);
Standard_GUID theAttrGUID = …;
myRefAttr = myNotes->RemoveAttrNote(myNote->Label(), theAttrGUID);
Standard_Integer theSubshape = 1;
myNotes->RemoveSubshapeNote(myNote->Label(), theSubshape);

笔记不会被自动删除。删除所有笔记的对应方法也可用。

删除笔记

要删除笔记,请使用以下XCAFDoc_NotesTool方法:

除了最后一个之外,所有这些方法也破坏了与 Document 项目的所有链接。

读写 STEP 或 IGES

请注意,保存和恢复文档本身是标准的 OCAF 操作。由于前面描述的各种定义都进入了这个框架,因此不再对其进行解释。查看也可以这样说:演示文稿可以从形状和颜色中定义。

有几个要点需要考虑:

  • 先前定义的仅用于处理 Shapes 的 Readers 和 Writers,无论是Standard还是 Advanced,其形式和依赖项都保持不变。此外,映射以外的功能也没有变化。
  • XDE 提供了与 Shapes 以外的数据的映射。名称、颜色、层、GD&T、剪裁平面、视图、验证属性(质心、体积、面积)和装配结构是具有刚性运动的层次结构。目前,仅 XBF 格式支持剪切平面和视图写入。
  • XDE 映射与高级数据交换的使用相关,而不是标准的,因为更高级别的信息更适合更高质量的形状。此外,这允许避免各种选项之间的多重组合。请注意,此选择不是架构之一,而是实际使用和包装。
  • XDE 的 Reader 和 Writer 类通常像 Shapes 一样使用。但是,它们的使用适用于管理文档而不是形状。

管理这个的包是IGESCAFControl用于 IGES 和STEPCAFControlSTEP 的。

读取 STEP 文件

要单独读取 STEP 文件,请使用:

const char * theFilename = …;
IFSelect_ReturnStatus aReadStat = aReader。读取文件(文件名);
if (aReadStat != IFSelect_RetDone) { .. 阅读器/解析器错误 .. }
// 这里也有各种读取文件的方法:
// 由读者阅读,从 WorkSession 中获取…
Handle( TDocStd_Document ) aDoc = …;
// 引用的文档已经定义并正确初始化;现在,转移本身
if (!aReader.Transfer ( aDoc))
{
Message::SendFail () << “无法从 STEP 文件中读取任何相关数据” ;
// 放弃 ..
}
// 这里,Document已经从一个STEP文件中填充了,可以使用了

此外,阅读器提供了适用于文档传输和直接查询生成的数据的方法。

编写 STEP 文件

要自己编写 STEP 文件,请使用:

// AsIs为推荐值,其他可用;
// 用户可以使用已经准备好的 WorkSession 或创建一个新的
//bool aScratch = false;
//STEPCAFControl_Writer aWriter (WS, aScratch);
// 首先,执行到 STEP 实体的转换
if (!aWriter.Transfer ( aDoc, aMode))
{
Message::SendFail () << “文档无法翻译或没有结果” ;
// 放弃 ..
}
// 写入文件
const char * theFilename = …;
IFSelect_ReturnStatus aStat = aWriter。(文件名);
if (aStat != IFSelect_RetDone) { .. 写入失败 .. }

读取 IGES 文件

使用与 STEP 文件相同的过程,但使用IGESCAFControl而不是STEPCAFControl.

编写 IGES 文件

使用与 STEP 文件相同的过程,但使用IGESCAFControl而不是STEPCAFControl.

使用 XDE 文档

有几种方法可以利用应用程序中的 XDE 数据,您可以:

  1. 通过映射 XDE/Appli 获取与应用程序相关的数据,然后在使用后丢弃 XDE 数据。
  2. 创建从应用程序文档到 XDE 文档的引用,以使其数据可用作外部数据。
  3. 在应用程序文档中嵌入 XDE 数据(有关详细信息,请参阅以下部分)。
  4. 直接利用 XDE 数据,例如在使用文件检查器时。

应用程序文档中的 XDE 数据

要在 label 之外的其他地方获取 XCAF 数据0.1,请使用 XDE 的 DocLabel。该方法XCAFDoc_DocumentTool::DocLabel确定 XCAF 的相关标签。但是,请注意,默认值为0.1.

此外,由于 XDE 数据是以模块化方式定义和管理的,因此您可以只考虑组装结构、只考虑颜色等。

由于 XDE 提供了数据结构的扩展,对于标准化交换中的相关数据,请注意以下几点:

  • 这种数据结构适合于数据交换,而不是供最终应用程序使用;
  • 提供的定义是通用的,用于常见用途,因此不会带来强烈的特定语义。

因此,如果应用程序在程序集、颜色或层、验证属性(如 STEP 中定义)上工作,它可以依赖所有或部分 XDE 定义,并将它们包含在自己的数据结构中。

此外,如果应用程序的数据结构与这些概念相去甚远,它可以根据需要获取数据(例如形状上的颜色和名称),而不必考虑整体。

© 版权声明
THE END
喜欢就支持一下吧
点赞7829 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容