挖孔¶
约 92 个字 34 行代码 2 张图片 预计阅读时间 1 分钟
概念理解¶
拓扑 vs 几何
- 几何:点
gp_Pnt
、圆gp_Circ
、平面gp_Pln
等,描述“形状的数学定义” - 拓扑:边
Edge
、线框Wire
、面Face
等,描述“几何的连接关系与方向”
孔洞: Face
有一个外环(outer wire)和若干内环(inner wires)。内环的方向与外环相反,就会被视为“孔”。
挖孔¶
from OCC.Core.gp import gp, gp_Pnt, gp_Circ
from OCC.Core.BRepBuilderAPI import BRepBuilderAPI_MakeEdge, BRepBuilderAPI_MakeWire, BRepBuilderAPI_MakeFace
from OCC.Display.SimpleGui import init_display
# 外矩形 10x10
p00, p10, p11, p01 = gp_Pnt(0,0,0), gp_Pnt(10,0,0), gp_Pnt(10,10,0), gp_Pnt(0,10,0)
outer = BRepBuilderAPI_MakeWire(
BRepBuilderAPI_MakeEdge(p00, p10).Edge(),
BRepBuilderAPI_MakeEdge(p10, p11).Edge(),
BRepBuilderAPI_MakeEdge(p11, p01).Edge(),
BRepBuilderAPI_MakeEdge(p01, p00).Edge()
).Wire()
# 基于外环建面
face_mk = BRepBuilderAPI_MakeFace(outer)
# 加入三个圆孔( Reverse)
ax2 = gp.XOY()
for cx, cy in [(3,3), (7,3), (3,7)]:
circ = gp_Circ(ax2, 1.0) # 在 XOY 平面、半径 1 的圆
circ.SetLocation(gp_Pnt(cx, cy, 0.0)) # 移动圆心到 (cx, cy, 0.0)
w = BRepBuilderAPI_MakeWire(BRepBuilderAPI_MakeEdge(circ).Edge()).Wire()
w.Reverse() # 反向 = 作为“孔”
face_mk.Add(w)
face = face_mk.Shape()
display, start_display, add_menu, add_function_to_menu = init_display()
display.DisplayShape(face, update=True)
start_display()