Vertex(顶点)
定义:顶点是 B-rep 结构中的零维拓扑元素,对应几何上的一个点。它是边的端点,也是构成模型边界的最小单元。
在 OCC / pythonOCC 中的实现:
- 类:TopoDS_Vertex(C++) / TopoDS_Vertex(pythonOCC)
- 几何关联:顶点包含一个 gp_Pnt 对象,表示其三维位置。
- 创建:通常通过 BRepBuilderAPI_MakeVertex 或 BRepBuilderAPI_MakeEdge 等工具自动生成。
- 查询:可使用 BRep_Tool::Pnt()(C++)或 BRep_Tool.Pnt()(pythonOCC)获取顶点坐标。
示例(pythonOCC):
from OCC.Core.gp import gp_Pnt, gp_Ax2
from OCC.Core.BRepPrimAPI import BRepPrimAPI_MakeSphere
from OCC.Core.BRepBuilderAPI import BRepBuilderAPI_MakeVertex
from OCC.Core.BRep import BRep_Tool
# 可视化所需模块
from OCC.Display.SimpleGui import init_display
from OCC.Display.OCCViewer import Viewer3d
# ===== 1. 创建顶点 =====
pnt = gp_Pnt(10, 20, 30) # 顶点坐标
vertex = BRepBuilderAPI_MakeVertex(pnt).Vertex()
# 获取坐标
x = BRep_Tool.Pnt(vertex).X()
y = BRep_Tool.Pnt(vertex).Y()
z = BRep_Tool.Pnt(vertex).Z()
print(x, y, z)
# ===== 2. 在顶点位置创建一个球体作为视觉标记 =====
sphere = BRepPrimAPI_MakeSphere(pnt, 2.0).Shape() # 半径 2.0
# ===== 3. 初始化显示窗口 =====
display, start_display, add_menu, add_function_to_menu = init_display()
# ===== 4. 将形状添加到场景 =====
display.DisplayShape(sphere, color='RED', update=True) # 显示红色球体
# 也可以显示顶点本身(默认不可见,此处可选项)
# display.DisplayShape(vertex, color='BLUE', update=True)
# ===== 5. 启动事件循环 =====
start_display()

from OCC.Core.gp import gp_Pnt
from OCC.Core.BRepBuilderAPI import BRepBuilderAPI_MakeVertex
from OCC.Display.SimpleGui import init_display
pnt = gp_Pnt(10, 20, 30)
vertex = BRepBuilderAPI_MakeVertex(pnt).Vertex()
display, start_display, add_menu, add_function_to_menu = init_display()
display.DisplayShape(vertex, color='RED', update=True) # 显示为红色像素点
start_display()

Edge(边)
定义:边是一维拓扑元素,由两个顶点(或一个自封闭边)界定,并关联一段几何曲线(直线、圆弧、B样条等)。边是面的边界,多个边可连接成环。
在 OCC / pythonOCC 中的实现:
- 类:TopoDS_Edge
- 几何关联:边关联一条曲线(Geom_Curve),并可包含参数区间。
- 创建:常用 BRepBuilderAPI_MakeEdge,可直接给定两个点、一条曲线,或通过 BRepBuilderAPI_MakeWire 组合。
- 查询:BRep_Tool::Curve()(C++)或 BRep_Tool.Curve()(pythonOCC)获取曲线对象及参数范围。
示例(pythonOCC):
from OCC.Core.BRepBuilderAPI import BRepBuilderAPI_MakeEdge
from OCC.Core.gp import gp_Pnt
from OCC.Display.SimpleGui import init_display
# 创建边
p1 = gp_Pnt(0, 0, 0)
p2 = gp_Pnt(10, 0, 0)
edge = BRepBuilderAPI_MakeEdge(p1, p2).Edge()
# 初始化显示窗口
display, start_display, add_menu, add_function_to_menu = init_display()
# 将边添加到场景,颜色设为蓝色
display.DisplayShape(edge, color='BLUE', update=True)
# 启动事件循环,保持窗口打开
start_display()

在边界表示(B-rep)中,每条边在几何上对应一条曲线(如直线、圆弧等),但在拓扑结构中,边具有方向的概念。
- 正向:边的方向与它所关联的曲线的参数增长方向一致。
- 反向:边的方向与曲线的参数增长方向相反。
简单来说,一条边的几何曲线是无方向的(例如一条直线,你可以从 A 到 B,也可以从 B 到 A),但拓扑上的边会指定一个特定的走向。当你在模型中遍历拓扑结构时(例如沿着一个面的边界走),你会遇到边的正向或反向引用。
为什么需要方向性?
| 作用 | 说明 |
|---|---|
| 减少数据冗余 | 同一条几何曲线可以被多个面共享,仅通过方向区分,避免重复存储。 |
| 保证模型一致性 | 确保面的法线方向统一(朝外或朝内),使实体体积定义正确。 |
| 简化算法实现 | 在参数化、求交、网格剖分等算法中,只需处理正向的几何曲线,方向由拓扑层自动转换。 |
| 便于拓扑操作 | 在布尔运算、特征建模时,通过方向快速确定面的内外侧。 |
因此,虽然几何上看起来简单的“正反边”,在 B-rep 中起到了串联几何与拓扑、确保模型一致性的关键作用。理解它,是掌握高级几何建模的基础。
from OCC.Core.BRepBuilderAPI import BRepBuilderAPI_MakeEdge
from OCC.Core.gp import gp_Pnt
from OCC.Core.BRep import BRep_Tool
p1 = gp_Pnt(0,0,0)
p2 = gp_Pnt(10,0,0)
edge = BRepBuilderAPI_MakeEdge(p1, p2).Edge()
# 获取曲线及参数范围
curve, first, last = BRep_Tool.Curve(edge)
print(f"参数范围: [{
first}, {
last}]") # 对于正向边,first < last
# 现在反向一下(注意:不能直接修改 edge 的方向,需要通过复制或使用 TopoDS_Edge 的 Reversed 方法)
from OCC.Core.TopTools import TopTools_ListOfShape
from OCC.Core.BRepBuilderAPI import BRepBuilderAPI_Copy
from OCC.Core.TopExp import TopExp_Explorer
# 获取反向边
reversed_edge = edge.Reversed()
# 获取反向边的曲线和参数
curve_rev, first_rev, last_rev = BRep_Tool.Curve(reversed_edge)
print(f"反向边参数范围: [{
first_rev}, {
last_rev}]")

Wire(线框)
定义:Wire 是一维拓扑元素,由一组首尾相连的边(Edge)构成的序列,即线框。它是边的有序集合,要求相邻边共享一个顶点。Wire 可以闭合(形成环)也可以开放。在边界表示(B-rep)中,Wire 主要用于定义面的边界:外环(Outer Wire)界定面的外部边界,内环(Inner Wire)定义面上的孔洞边界。
在 OCC / pythonOCC 中的实现:
- 类:TopoDS_Wire
- 几何关联:Wire 本身不直接关联几何,但其组成边关联曲线(Geom_Curve)。
- 创建:常用 BRepBuilderAPI_MakeWire,通过添加多条边构建线框。边可以依次添加,最终生成的 Wire 会自动检查边之间的连接性(首尾顶点重合)。
- 查询:使用 TopExp_Explorer 遍历 Wire 中的边(TopAbs_EDGE)或顶点(TopAbs_VERTEX);也可通过 BRep_Tool 获取边的几何信息。BRepTools_WireExplorer 可方便地按顺序遍历 Wire 的边和顶点。
示例(pythonOCC):
from OCC.Core.BRepBuilderAPI import BRepBuilderAPI_MakeWire, BRepBuilderAPI_MakeEdge
from OCC.Core.gp import gp_Pnt
from OCC.Core.TopExp import TopExp_Explorer
from OCC.Core.TopAbs import TopAbs_EDGE
from OCC.Display.SimpleGui import init_display
# 定义四个顶点,构成一个矩形
p1 = gp_Pnt(0, 0, 0)
p2 = gp_Pnt(10, 0, 0)
p3 = gp_Pnt(10, 10, 0)
p4 = gp_Pnt(0, 10, 0)
# 创建四条边
e1 = BRepBuilderAPI_MakeEdge(p1, p2).Edge()
e2 = BRepBuilderAPI_MakeEdge(p2, p3).Edge()
e3 = BRepBuilderAPI_MakeEdge(p3, p4).Edge()
e4 = BRepBuilderAPI_MakeEdge(p4, p1).Edge()
# 构建闭合线框(矩形环)
wire_builder = BRepBuilderAPI_MakeWire()
wire_builder.Add(e1)
wire_builder.Add(e2)
wire_builder.Add(e3)
wire_builder.Add(e4)
wire = wire_builder.Wi

拓扑结构深度剖析:Vertex、Edge、Wire、Face、Shell、Solid、CompSolid、Compound 在 OCCpythonOCC 中的实践》&spm=1001.2101.3001.5002&articleId=159464205&d=1&t=3&u=7158b4dbcf48420ca70d16841373390a)
1741

被折叠的 条评论
为什么被折叠?



