《边界表示(B-rep)拓扑结构深度剖析:Vertex、Edge、Wire、Face、Shell、Solid、CompSolid、Compound 在 OCC/pythonOCC 中的实践》

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值