目录
1、简介
在定义模板的时候,有时候需要提取特征的拓扑元素,但特征的拓扑元素是不稳定的,当参数发生改变时,有些拓扑元素可能会提取失败。
例如下面的示例中使用阵列生成多个曲面特征,如果采用直接提取的方式创建提取特征,改变阵列的实例数量会出现以下两种情况:
- 当阵列的实例数量增多时:部分曲面没有被提取到,可能影响模板的适用性。
- 当阵列的实例数量减少时:模型直接报错,提取失败,直接影响模板的使用。

为解决上述这种问题,本文介绍一种使用 EKL 提取特征拓扑元素的方法。
2、详细介绍
使用 EKL 提取特征拓扑元素主要用到以下两个函数:
List GetSubElements(Integer dimension, Boolean duplicates)
WireFrame extract(CATCell cell, Integer propagationType)
- GetSubElements() 方法用于获取特征的拓扑元素,返回相应子元素的列表,dimension 参数指定提取元素的维度,它只有 3 个合法值(0 表示提取顶点,1 表示提取边线,2 表示提取面),duplicates 有默认值,可不传入。
- extract() 方法用于提取拓扑元素生成几何特征,返回线框类型特征,cell 参数是要提取的拓扑元素,propagationType 表示连续性(0 表示 G0,1 表示 G1,2 表示 G2,其他值表示不连续),此参数指定提取时将符合 propagationType 连续性的拓扑元素一起提取。
2.1 提取顶点
顶点的类型为 CATVertex,下面是一个提取顶点的示例:
iFeature : GeometricFeature
--------------------------
let parent(OpenBodyFeature)
set parent = `提取元素`
let vertex(CATVertex)
for vertex inside iFeature->GetSubElements(0)
{
let wf(Wireframe)
set wf = new("Point", "", parent)
wf = extract(vertex)
}
parent->Update()

2.2 提取边线
边线的类型为 CATEdge,下面是一个提取边线的示例:
iFeature : GeometricFeature
--------------------------
let parent(OpenBodyFeature)
set parent = `提取元素`
let edge(CATEdge)
for edge inside iFeature->GetSubElements(1)
{
let wf(Wireframe)
set wf = new("Curve", "", parent)
wf = extract(edge)
}
parent->Update()

2.3 提取面
面的类型为 CATFace,下面是一个提取面的示例:
iFeature : GeometricFeature
--------------------------
let parent(OpenBodyFeature)
set parent = `提取元素`
let face(CATFAce)
for face inside iFeature->GetSubElements(2)
{
let wf(Wireframe)
set wf = new("Surface", "", parent)
wf = extract(face)
}
parent->Update()

2.4 使用参数控制提取类型
上面分别提取的方式有些繁琐,因为拓扑元素都属于 CATCell 类型,我们可以使用一个参数来控制提取类型,示例如下:
iFeature : GeometricFeature,iExtract : String
--------------------------
let parent(OpenBodyFeature)
set parent = `提取元素`
let dimension(Integer)
if iExtract == "Point" dimension = 0
if iExtract == "Curve" dimension = 1
if iExtract == "Surface" dimension = 2
let cell(CATCell)
for cell inside iFeature->GetSubElements(dimension)
{
let wf(Wireframe)
set wf = new(iExtract, "", parent)
wf = extract(cell)
}
parent->Update()

2.5 提取阵列元素
上面的示例中都需要手动执行提取操作,在简介中提到的提取阵列问题需要实现自动提取,怎么解决呢?
有两种解决方法:
- 使用规则的自动执行特性进行自动提取;
- 使用反应监控参数的修改来调用提取操作。
这里我们使用规则来进行自动提取,示例如下:
let parent(OpenBodyFeature)
set parent = `提取元素`
// 删除“提取元素”里已经存在的提取特征
let feat(Feature)
for feat inside parent.Children
{
feat->Delete()
}
// 执行提取操作
let geoFeature(GeometricFeature)
set geoFeature = `零件几何体\圆形阵列.1`
let extractType(String)
extractType = `提取类型`
let dimension(Integer)
if extractType == "Point" dimension = 0
if extractType == "Curve" dimension = 1
if extractType == "Surface" dimension = 2
let i = 1
let cell(CATCell)
for cell inside geoFeature->GetSubElements(dimension)
{
let wf(Wireframe)
set wf = new(extractType, "曲面." + i, parent)
wf = extract(cell)
i = i + 1
}
parent->Update()
