导入外部几何文件获得所有体面线点
按照这样的方式可以直接获得一种子元素的所有集合
下面solids可以替换为shells,faces,wires,edges,vertices
对应的类型为TopoDS_Solid,TopoDS_Shell,TopoDS_Face,TopoDS_Wire,TopoDS_Edge,TopoDS_Vertex
from OCC.Extend.DataExchange import read_step_file
from OCC.Extend.TopologyUtils import TopologyExplorer
stpshp = read_step_file(r"two_half_cylinder.stp")
res = TopologyExplorer(stpshp)
solid_list = []
for ii in res.solids():
solid_list.append(ii)
获得一个对象的所有子对象
from OCC.Core.TopExp import TopExp_Explorer
from OCC.Core.TopAbs import TopAbs_FACE
exp = TopExp_Explorer(ashape, TopAbs_FACE)
subClassList = []
while exp.More():
subClassList.append(exp.Current())
exp.Next()
# subClassList
代码中的ashape可以是下面对象的一种,下面对象都是继承的TopoDS_Shape
。
- TopoDS_Solid
- TopoDS_Shell
- TopoDS_Face
- TopoDS_Wire
- TopoDS_Edge
- TopoDS_Vertex
可以取到的类型有
- TopAbs_SOLID
- TopAbs_SHELL
- TopAbs_SHAER
- TopAbs_FACE
- TopAbs_WIRE
- TopAbs_EDGE
- TopAbs_VERTEX
将Topo对象转换为Geom对象
from OCC.Core.BRep import BRep_Tool
# # TopoDS_Face -> Geom_Surface
asurface = BRep_Tool.Surface(aface)
# TopoDS_Edge -> Geom_Curve
acurveList = BRep_Tool.Curve(aedge)
acurve = acurveList[0]
# TopoDS_Vertex -> gp_Pnt
apnt = BRep_Tool.Pnt(avertex)
在导入的STEP几何模型的面上布点
OCCT上的帮助:https://dev.opencascade.org/doc/overview/html/occt_user_guides__step.html
OCCT几何类别与STEP的映射,需要说明OCCT中有几何与拓扑两套东西
from OCC.Extend.DataExchange import read_step_file
from OCC.Extend.DataExchange import write_stl_file
from OCC.Extend.TopologyUtils import TopologyExplorer
from OCC.Display.SimpleGui import init_display
from OCC.Core.BRep import BRep_Tool
from OCC.Core.ShapeAnalysis import shapeanalysis_GetFaceUVBounds
from OCC.Core.IntTools import IntTools_Context
stpshp = read_step_file(r"two_half_cylinder.stp")
res = TopologyExplorer(stpshp)
solid_list = []
for ii in res.solids():
solid_list.append(ii)
face_list = []
for ii in res.faces():
face_list.append(ii)
# aface = face_list[0]
display, start_display, add_menu, add_function_to_menu = init_display()
for aface in face_list:
display.DisplayShape(aface, update=True)
umin, umax, vmin, vmax = shapeanalysis_GetFaceUVBounds(aface)
asurface = BRep_Tool.Surface(aface)
du = (umax-umin)/10.0
dv = (vmax - vmin) / 10.0
u = umin
while u <= umax:
v = vmin
while v <= vmax:
p = asurface.Value(u, v)
itc = IntTools_Context()
tf = itc.IsPointInFace(p,aface,0.1)
print(tf)
if tf:
display.DisplayShape(p, update=False)
v += dv
u += du
start_display()
file: https://xdd1997.lanzoue.com/iIvz52i1jgvi
获得顶点坐标
from OCC.Core.BRepPrimAPI import BRepPrimAPI_MakeBox
from OCC.Core.TopExp import TopExp_Explorer
from OCC.Core.BRep import BRep_Tool
from OCC.Core.TopAbs import TopAbs_VERTEX
my_box = BRepPrimAPI_MakeBox(10., 20., 30.).Shape()
exp = TopExp_Explorer(my_box, TopAbs_VERTEX)
subClassList = []
while exp.More():
subClassList.append(exp.Current())
exp.Next()
pnts = []
for avertex in subClassList:
apnt = BRep_Tool.Pnt(avertex)
coordinate = (apnt.X(), apnt.Y(), apnt.Z())
if coordinate not in pnts:
pnts.append(coordinate)
print(pnts)