1.背景介绍
1.1 什么是拓扑?
拓扑是研究几何图形或空间在连续改变形状后还能保持不变的一些性质的一个学科。它只考虑物体间的位置关系而不考虑它们的形状和大小。数学上的拓扑主要研究“在连续变换下能够维持不变的空间性质,如连通性和紧致性”。
几何拓扑一类空间数据结构,用于封装或裁剪几何曲线曲面,从而将几何组织成形体。几何拓扑不变,指通过一系列变换,形体中不会增加/减少连通区域/面/环/边。
Body对象的拓扑可以理解为面(Face)与边(Edge)、边( Edge )与顶点(Vertex)之间的连接关系。可以理解Face、Edge、Vertex为拓扑元素。
拓扑结构:
拓扑方向:
1.2 什么是拓扑跟踪?
跟踪造型前后拓扑元素的来源。
1.3 什么是拓扑命名?
几何建模引擎中的拓扑命名规则是一套用于标志和管理几何模型中的拓扑元素(如顶点、边、面、体等)的命名规范,这些规则旨在确保拓扑元素在模型操作(如修改、布尔运算、参数化设计等)过程中能够被稳定唯一、稳定的标识和引用。
拓扑命名=拓扑变化记录 + 唯一ID重映射
1.4 为什么需要拓扑命名?
基于历史记录的建模,在模型编辑的时候,模型会重新生成或关联更新时,需要一套用于标志和管理几何模型中的拓扑元素。
在参数化建模中,模型的拓扑可能因为参数的变化而改变(如拉伸、切割),需要保证命名规则在下面场景中的稳定性:
(1)拓扑不变性
如果操作不改变拓扑结构(如平移、旋转),原有命名保持不变。
(2)拓扑变化
如果操作改变拓扑(如拓扑运算生成新边),新元素需按规则生成新名称,旧的名称可能标记失效。
(3)引用保留
删除或合并元素时,需要处理命名冲突(如E3合并到E2后,E3被标记为DELETED_E3).
1.5 拓扑创建基本造型
enum EnumBodyType
{
TYPE_extrude,
TYPE_revolve,
TYPE_Flight,
TYPE_spiral,
TYPE_sweep,
TYPE_sweepshell,
TYPE_spiralsweep,
TYPE_ruled,
TYPE_loft
}
1.6 拓扑容差
面的容差:所有面的容差,以及所有(三维)边两端点到其邻面距离中的最大值。
点的容差:所有点的容差定义为这个点为球心,容差为半径的球体。
线容差:线的容差定义为以edge为中心线,容差为半径的管段。
容差原则:点的容差 >线的容差>面的容差
1.6 使用场景
(1)参数化建模:通过名称引用特定边或面,实现参数化设计。
(2)数据交换:在导入、导出模型中(例如STEP,IGES等)保留拓扑信息。
(3)对象联级更新
1.6 有效性检
(1)合法性检查
2.方案设计
(1)记录引用边的指针。
不可行。指针是临时的,模型重新生成时,指针会变化无效,无法实现拓扑跟踪。
(2)使用枚举变量记录模型中的拓扑元素。
不可行。模型重新生成时,元素顺序会发生变化,也不能实现实现拓扑跟踪。
(3)拓扑命名
给模型中的拓扑元素一个ID,当模型修改变化时,拓扑命名系统把老模型中的拓扑元素ID映射到新模型的拓扑元素ID。CTopoTrack类实现拓扑跟踪。这是业界通用的做法。
拓扑操作类型:
enum TopoOperateType
{
kFaceCreated,
kFaceMerged,
kEdgeDeleted,
kBooleanOperate
}
Parasolid的拓扑命名:
目前存在两个版本,第一个版本直接返回新旧拓扑的指针,第二个版本提供一个拓扑跟踪的数据结构。
ACIS的拓扑命名
ACIS对特征命名的支持为公告板增加了额外的操作信息,这些信息将操作中的输入和输出关联在一起。这些额外的信息已注释实体的形式存在于造型器中,注释中含有模型操作的语义信息。注释由类ANNOTATION实现。
3.设计实现
(1)面的拓扑命名
class FaceNamingRule
{
EnumFaceType m_faceType;
std::vector<int> m_tagList;
}
面的类型: 顶面,底面,侧面等等。
未完-待续
4.问题改进
- 思路一:
在几何布尔操作过程,如果结果体中的边、面来自原始体,那么在IGraphicsNodeIdAsker中只是拷贝生成这些相应原始体的边、面的编号。也就是,如果原始体的边、面没有出现在结果体中,那么无需拷贝生成相应的边、面编号(效果待定)。
注意:目前扣减体使用连接后或者base 的grep 对被扣减体进行扣减,所以拷贝扣减体边、面的编号导致的追溯信息过多问题不明显。 但如果这个行为修正后,可能会导致追溯信息过多问题(如果扣减体自身比较复杂,例如经过多次打洞、扣减等)
- 思路二:
布尔操作过程,如果结果体的边、面来自原始体,是否可以考虑不用生成原始边、面的编号?如以下追溯信息是否可以省略?
注意:需要评估下如果省略了,找父子关系是否存在问题?这个需要验证 - 理论上找父子关系没有问题,因为该拓扑信息存在的父信息编号就是自身编号,对找父子关系没有影响。
问题:如果不生成原始边、面编号,那么有些modelingoperation里的追溯信息就未空了。 构件编辑器里的布尔减操作。
- 思路三:TopoTrackingObject::m_EncodingDataSet 不保存那些负一的值?
- 思路四:编码的第一、二位合并
- 思路五:编码存储的数据结构调整 - 还没细想,方案待定,效果不明