通过surface和wires构建face时,常规的一种直观方法是可能会发生问题的。此常规方法如下:
- 通过surface调用BRepLib_MakeFace直接构建face
- 通过BRepLib_MakeFace.Add往face上面添加wire
这个流程有一个潜在的风险,第一步在执行的时候,系统可能会根据surface的boundary来创建wire。这里自动创建的wire很有可能会是用户不希望看到的。
这里提出另外一种方法来构建,这种方法需要我们事先知道哪个wire是外部wire。
- 通过BRepLib_MakeFace(surface, outerWire)创建初始化aFace
- 通过for aWire in innerWires:
BRepLib_MakeFace(aFace, aWire)来完善face
这一种方法,会避开常规直观方法的坑。
最近发现OCC在Face和Wire(相当于其他CAD几何内核中的Loop的拓扑元素)之间的关系上搞得相当差。 在产生Face时如果不注意Wire的方向即OuterWire应该是CCW, 而InnerWire是CW(按Face方向)。 产生的Face后再访问Wire时是不能保证Face的内点在Wire前进的左边。
好像occ是有提供通过wire找出orderedEdge的方法。如果不特意找orderedEdge,直接用wire会出现您说到的情况。