def get_points_from_edge(edge): texp1 = TopologyExplorer(edge) points = [] for v in texp1.vertices(): apt = BRep_Tool_Pnt(v) points.append((apt.X(), apt.Y(), apt.Z())) return points
def get_edge_points(edge): from OCC.Core.BRep import BRep_Tool_Pnt from OCC.Extend.TopologyUtils import TopologyExplorer t = TopologyExplorer(edge) points = [] for v in t.vertices(): apt = BRep_Tool_Pnt(v) points.append((apt.X(), apt.Y(), apt.Z())) return points
def thick_solid(event=None): S = BRepPrimAPI_MakeBox(150, 200, 110).Shape() topo = TopologyExplorer(S) vert = next(topo.vertices()) shapes = TopTools_ListOfShape() for f in topo.faces_from_vertex(vert): shapes.Append(f) _thick_solid = BRepOffsetAPI_MakeThickSolid(S, shapes, 15, 0.01) display.EraseAll() display.DisplayShape(_thick_solid.Shape()) display.FitAll()
def make_fillet(edge1, edge2, bend_radius): from ada.core.vector_utils import normal_to_points_in_plane f = ChFi2d_AnaFilletAlgo() points1 = get_points_from_edge(edge1) points2 = get_points_from_edge(edge2) normal = normal_to_points_in_plane([np.array(x) for x in points1] + [np.array(x) for x in points2]) plane_normal = gp_Dir(gp_Vec(normal[0], normal[1], normal[2])) t = TopologyExplorer(edge1) apt = None for v in t.vertices(): apt = BRep_Tool_Pnt(v) f.Init(edge1, edge2, gp_Pln(apt, plane_normal)) f.Perform(bend_radius) fillet2d = f.Result(edge1, edge2) if is_edges_ok(edge1, fillet2d, edge2) is False: raise ValueError("Unsuccessful filleting of edges") return edge1, edge2, fillet2d
def sweep_pipe(edge, xvec, r, wt, geom_repr=ElemType.SOLID): if geom_repr not in [ElemType.SOLID, ElemType.SHELL]: raise ValueError("Sweeping pipe must be either 'solid' or 'shell'") t = TopologyExplorer(edge) points = [v for v in t.vertices()] point = BRep_Tool_Pnt(points[0]) # x, y, z = point.X(), point.Y(), point.Z() direction = gp_Dir(*unit_vector(xvec).astype(float).tolist()) # pipe makeWire = BRepBuilderAPI_MakeWire() makeWire.Add(edge) makeWire.Build() wire = makeWire.Wire() try: if geom_repr == ElemType.SOLID: i = make_circular_sec_face(point, direction, r - wt) elbow_i = BRepOffsetAPI_MakePipe(wire, i).Shape() o = make_circular_sec_face(point, direction, r) elbow_o = BRepOffsetAPI_MakePipe(wire, o).Shape() else: elbow_i = None o = make_circular_sec_wire(point, direction, r) elbow_o = BRepOffsetAPI_MakePipe(wire, o).Shape() except RuntimeError as e: logging.error(f'Pipe sweep failed: "{e}"') return wire if geom_repr == ElemType.SOLID: boolean_result = BRepAlgoAPI_Cut(elbow_o, elbow_i).Shape() if boolean_result.IsNull(): logging.debug("Boolean returns None") else: boolean_result = elbow_o return boolean_result