pythonocc 拉伸特征
micromamba install -c conda-forge pythonocc-core
opencascade.js安装不起来,ai用pythonocc练个手
拉伸线框 线成面
from OCC.Core.gp import gp_Pnt, gp_Dir, gp_Vec
from OCC.Core.BRepBuilderAPI import BRepBuilderAPI_MakeEdge, BRepBuilderAPI_MakeWire
from OCC.Core.BRep import BRep_Tool # Add this import
from OCC.Core.BRepPrimAPI import BRepPrimAPI_MakePrism
from OCC.Display.SimpleGui import init_displaydef create_closed_wire():# 定义闭合线段的顶点(示例为正方形轮廓)p1 = gp_Pnt(0, 0, 0)p2 = gp_Pnt(10, 0, 0)p3 = gp_Pnt(10, 10, 0)p4 = gp_Pnt(0, 10, 0)# 创建边(线段)edge1 = BRepBuilderAPI_MakeEdge(p1, p2).Edge()edge2 = BRepBuilderAPI_MakeEdge(p2, p3).Edge()edge3 = BRepBuilderAPI_MakeEdge(p3, p4).Edge()edge4 = BRepBuilderAPI_MakeEdge(p4, p1).Edge() # 闭合最后一条边# 创建线框并添加所有边wire_builder = BRepBuilderAPI_MakeWire()wire_builder.Add(edge1)wire_builder.Add(edge2)wire_builder.Add(edge3)wire_builder.Add(edge4)wire_builder.Build()# 检查线框是否闭合(修正:使用 BRep_Tool.IsClosed)if not wire_builder.IsDone() or not BRep_Tool.IsClosed(wire_builder.Wire()):raise ValueError("线框未成功构建或未闭合")return wire_builder.Wire()def extrude_wire_to_solid(wire):# 定义拉伸方向(沿 Z 轴正方向,高度 20)direction = gp_Dir(0, 0, 1)vec = gp_Vec(direction) * 20 # 拉伸向量(长度决定高度)# 生成拉伸实体(BREP 特征)prism = BRepPrimAPI_MakePrism(wire, vec)prism.Build()if not prism.IsDone():raise ValueError("拉伸操作失败")return prism.Shape()if __name__ == "__main__":display, start_display, add_menu, add_function_to_menu = init_display()try:# 生成闭合线框closed_wire = create_closed_wire()# 拉伸生成实体solid = extrude_wire_to_solid(closed_wire)# 显示结果display.DisplayShape(solid, update=True)start_display()except Exception as e:print(f"错误:{e}")
拉伸面 实体
from OCC.Core.gp import gp_Pnt, gp_Dir, gp_Vec
from OCC.Core.BRepBuilderAPI import BRepBuilderAPI_MakeEdge, BRepBuilderAPI_MakeWire, BRepBuilderAPI_MakeFace # 新增 BRepBuilderAPI_MakeFace
from OCC.Core.BRep import BRep_Tool
from OCC.Core.BRepPrimAPI import BRepPrimAPI_MakePrism
from OCC.Display.SimpleGui import init_displaydef create_closed_wire():# 定义闭合线段的顶点(示例为正方形轮廓)p1 = gp_Pnt(0, 0, 0)p2 = gp_Pnt(10, 0, 0)p3 = gp_Pnt(10, 10, 0)p4 = gp_Pnt(0, 10, 0)# 创建边(线段)edge1 = BRepBuilderAPI_MakeEdge(p1, p2).Edge()edge2 = BRepBuilderAPI_MakeEdge(p2, p3).Edge()edge3 = BRepBuilderAPI_MakeEdge(p3, p4).Edge()edge4 = BRepBuilderAPI_MakeEdge(p4, p1).Edge() # 闭合最后一条边# 创建线框并添加所有边wire_builder = BRepBuilderAPI_MakeWire()wire_builder.Add(edge1)wire_builder.Add(edge2)wire_builder.Add(edge3)wire_builder.Add(edge4)wire_builder.Build()# 检查线框是否闭合(修正:使用 BRep_Tool.IsClosed)if not wire_builder.IsDone() or not BRep_Tool.IsClosed(wire_builder.Wire()):raise ValueError("线框未成功构建或未闭合")return wire_builder.Wire()def extrude_wire_to_solid(wire):# 新增:将线框转换为面(关键步骤)face_builder = BRepBuilderAPI_MakeFace(wire)face_builder.Build()if not face_builder.IsDone():raise ValueError("面构建失败,线框可能未正确闭合或自相交")face = face_builder.Face()# 定义拉伸方向(沿 Z 轴正方向,高度 20)direction = gp_Dir(0, 0, 1)vec = gp_Vec(direction) * 20 # 拉伸向量(长度决定高度)# 拉伸面生成实体(BREP 特征)prism = BRepPrimAPI_MakePrism(face, vec) # 改为拉伸面而非线框prism.Build()if not prism.IsDone():raise ValueError("拉伸操作失败")return prism.Shape()if __name__ == "__main__":display, start_display, add_menu, add_function_to_menu = init_display()try:# 生成闭合线框closed_wire = create_closed_wire()# 拉伸生成实体solid = extrude_wire_to_solid(closed_wire)# 显示结果display.DisplayShape(solid, update=True)start_display()except Exception as e:print(f"错误:{e}")