OCCT几何形状修复
Shape Healing 工具箱提供了一组工具来处理 Open CASCADE Technology (OCCT) 形状的几何和拓扑、完成形状修复与调整任务,使它们尽可能适合 Open CASCADE 技术使用。
1、Shape Healing包用例
以下是一些典型问题的示例,并附有 Shape Healing 如何处理这些问题的说明:
- 缺少接缝边缘的面
问题:周期性表面(surface)上的面(face)由线框(wire)限定, 这些线在 3d 中闭合但在表面的参数空间中不闭合。 这在 Open CASCADE 中无效。
解决方案:Shape Healing包通过插入结合两条开放线的接缝边缘修复此面,从而闭合参数空间。 请注意,内部线框已正确处理。
- 线框方向错误
问题:面的线框方向不正确,导致面的内部和外部混合在一起。
解决方案:Shape Healing包可恢复线框的正确方向。
- 自相交线框
问题:面无效,因为它的边界线框有自相交(在两个相邻边上)。
解决方案:Shape Healing包在交点处切割相交边,从而使边界有效。
- 缺边
问题:线框中两条边(edge)之间有缝隙,导致线框没有闭合。
解决方案:Shape Healing包通过插入缺失的边来缩小间隙。
2、 Shape Healing包结构
Shape Healing 目前包括几个旨在帮助:
- 分析形状特征,特别是识别不符合 Open CASCADE 技术有效性规则的形状;
- 修复形状可能存在的一些问题;
- 可根据用户需求升级形状特征,如C0支撑表面可升级为C1连续。
下图显示了 API 包的依赖关系:
每个子域都有自己的功能范围:
- 分析(analysis)—探索形状属性,计算形状特征,检测是否违反 OCCT 要求(形状本身未被修改);
- 修复(fixing)— 修复形状以满足OCCT要求(形状可能会改变其原始形式:修改、移除、构建子形状等);
- 升级(upgrade)—形状改进,以提高 Open CASCADE 技术或其他算法的可用性(形状被新形状替换,但几何形状相同);
- 定制(custom)——修改形状表示以满足特定需求(形状未修改,仅修改其表示形式);
- 处理(processing)——通过用户可编辑的资源文件管理形状修改的机制。
消息管理用于创建消息,用各种参数填充它们并将它们存储在跟踪文件中。 此工具提供将消息附加到形状的功能,以便对各种运行时事件进行延迟分析。 在本文档中,将仅描述使用形状修复的一般原则。 有关更多详细信息,请参阅相应的头文件。
负责分析、修复和升级形状的工具可以提供有关如何执行这些操作的信息。 用户可以借助状态查询机制获得这些信息。
3、查询工具状态
每个修复和升级工具都有自己的状态,当它们的方法被调用时会被重置。 状态可以包含多个标志,这些标志提供有关如何执行该方法的信息。 为了探索状态,提供了一组名为 StatusXXX() 的方法,例如 ShapeFix_Wire::StatusReorder()
。 这些方法接受枚举 ShapeExtend_Status,如果状态设置了相应的标志,则返回 True。 每种方法的标志的含义如下所述。
状态可能包含一组布尔标志(内部由位表示)。 标志由枚举 ShapeExtend_Status 编码。 此枚举提供以下状态系列:
- ShapeExtend_OK – 情况正常,不需要任何操作,也没有执行。
- ShapeExtend_DONE – 操作已成功执行。
- ShapeExtend_FAIL – 操作期间发生错误。
可以使用类提供的 StatusXXX()
方法来测试某些标志是否存在的状态:
if (object.StatusXXX (ShapeExtend_DONE))
{
// something was done
}
定义了 8 个“DONE”和 8 个“FAIL”标志,名为 ShapeExtend_DONE1 ... ShapeExtend_FAIL8,用于对遇到的情况进行详细分析。 每个方法都为每个标志分配自己的含义,记录在该方法的标头中。 还有三个枚举值用于一次测试多个标志:
- ShapeExtend_OK——如果没有设置标志;
- ShapeExtend_DONE——如果至少设置了一个 ShapeExtend_DONEi;
- ShapeExtend_FAIL——如果至少设置了一个 ShapeExtend_FAILi。
4、修复算法
修复有问题(违反 OCCT 要求)几何形状的算法位于包 ShapeFix 中。
ShapeFix 包的每一类都处理一种特定类型的形状或一些问题。
在使用 ShapeFix 之前,没有必要检测问题,因为 ShapeFix 包的所有组件都会在使用 ShapeAnalysis 包中的相应工具修复现有问题之前对存在的问题进行分析,然后修复发现的问题。
ShapeFix 包当前包括以下功能:
- 在缺少的地方添加 2D 曲线或 3D 曲线,
- 当 2D 曲线与 3D 曲线的偏差超过给定的公差值时,纠正该偏差,
- 将形状的公差值限制在给定范围内,
- 为形状设置给定的公差值,
- 修复导线相邻边缘之间的连接,
- 正确的自相交线,
- 添加接缝边
- 修正 3D 和 2D 曲线之间的间隙,
- 合并并删除小的边
- 修正壳和实体的方向。
5、Shap Healing快速上手
修复几何形状的最简单方法是在具有默认参数的整个形状上使用类 ShapeFix_Shape 和 ShapeFix_Wireframe。 这些工具的组合可以解决形状可能存在的大部分问题。 动作顺序如下:
- 创建工具 ShapeFix_Shape 并按形状对其进行初始化:
Handle(ShapeFix_Shape) aFixShape = new ShapeFix_Shape();
aFixShape->Init(theShape);
2. 设置基本精度、最大/最小允许公差:
aFixShape->SetPrecision (thePrec);
aFixShape->SetMaxTolerance (theMaxTol);
aFixShape->SetMinTolerance (theMintol);
其中:
- thePrec—基本精度。
- theMaxTol – 最大允许公差。 当无效维度大于基本精度或检测到该问题的子形状公差时,将检测所有问题。 最大公差值限制了解决问题的增加公差,例如修复未连接和自相交的电线。 如果纠正检测到的问题需要大于最大允许公差的值,则无法修复该问题。 在计算 ShapeFix_SameParameter() 方法和 ShapeFix_Edge::FixVertexTolerance() 方法中的边公差时,不考虑最大公差。 有关详细信息,请参见边缘修复工具。
- theMintol – 最小允许公差。 它定义了边的最小允许长度。 如果线修复工具中的 ModifyTopologyMode 设置为 true,检测到的长度小于指定最小公差的边将被删除。 详见电线维修工具。
3. 启动修复
aFixShape->Perform();
4. 得到结果
TopoDS_Shape aResult = aFixShape->Shape();
在某些情况下,仅使用 ShapeFix_Shape 可能是不够的。 可以使用工具合并和移除小边以及修复 2D 和 3D 曲线之间的间隙。
5. 创建 ShapeFix_Wireframe 工具并按形状对其进行初始化
Handle(ShapeFix_Wireframe) aFixWire = new ShapeFix_Wireframe (theShape);
或者:
Handle(ShapeFix_Wireframe) aFixWire = new ShapeFix_Wireframe();
aFixWire->Load (theShape);
6. 设置基本精度和最大允许公差:
aFixWire->SetPrecision (thePrec);
aFixWire->SetMaxTolerance (theMaxTol);
请参阅上面的 thePrec 和 theMaxTol 的描述。
7. 合并和移除小边
aFixWire->DropSmallEdgesMode() = true;
aFixWire->FixSmallEdges();
注意:默认模式下不会移除小边,但在许多情况下移除小边对于修复形状非常有用。
8. 修复 2D 和 3D 曲线的间隙
aFixWire->FixWireGaps();
9. 得到结果
TopoDS_Shape aResult = aFixWire->Shape();
原文链接:OpenCascade Shape Healing Toolkit
BimAnt翻译整理,转载请标明出处