跳转至

挖孔

约 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()

拉伸

from OCC.Core.gp import gp_Vec
from OCC.Core.BRepPrimAPI import BRepPrimAPI_MakePrism
solid = BRepPrimAPI_MakePrism(face, gp_Vec(0,0,1)).Shape()  # 厚度 1