def SplitShapeFromProjection(shape, wire, direction, return_section=True): """Splits shape by the projection of wire onto its face Parameters ---------- shape : TopoDS_Shape the brep to subtract from wire : TopoDS_Wire the tool to use for projection and splitting direction: OCC.gp.gp_Dir the direction to project the wire return_section : bool returns the split shape Returns ------- newshape : TopoDS_Shape input shape with wire subtracted section : the shape which was substracted (returned only if return_section is true) Notes ----- Currently assumes splits the first face only """ # get the face from the shape exp = TopExp_Explorer(shape, TopAbs_FACE) face = topods_Face(exp.Current()) # Perform the projection proj = BRepProj_Projection(wire, face, direction) wire = proj.Current() splitter = BRepFeat_SplitShape(face) splitter.Add(wire, face) splitter.Build() section_list = splitter.DirectLeft() iterator = TopTools_ListIteratorOfListOfShape(section_list) section = iterator.Value() # assume here that only 1 section is produced mod_list = splitter.Modified(face) iterator = TopTools_ListIteratorOfListOfShape(mod_list) newshape = iterator.Value() if return_section: return newshape, wire else: return newshape
def __call__(self, plane: gp.gp_Pln, vertex=None, edge_dict=None, **kwargs): splt = BRepFeat_SplitShape() if isinstance(self._base, TopoDS_Shape): base_shape = self._base else: base_shape = self._base.Shape() splt.Init(base_shape) sect = BRepAlgoAPI_Section(base_shape, plane, False) sect.ComputePCurveOn1(True) sect.Approximation(True) sect.Build() self.cutting_edge = sect.Shape() ancestors = set() new_faces = [] edge_iter = TopExp_Explorer(self.cutting_edge, TopAbs_EDGE) while edge_iter.More(): base_iter = TopExp_Explorer(base_shape, TopAbs_FACE) curr_edge = edge_iter.Current() while base_iter.More(): curr_face = base_iter.Current() if sect.HasAncestorFaceOn1(curr_edge, curr_face): k, v = hash(curr_face), hash(curr_edge) if (k, v) not in self.ancestors: ancestors.add((k, v)) e = topods.Edge(curr_edge) f = topods.Face(curr_face) splt.Add(e, f) # todo - only add the closest one !!!! new_faces.append(f) self.added.append(e) break # if sect.HasAncestorFaceOn2(curr_edge, curr_face): # print('has2', curr_edge, curr_face) # pass base_iter.Next() edge_iter.Next() # ------------------------------------- splt.Build() new_shape = splt.Shape() sect.Destroy() return new_shape
def split_shape(event=None): S = BRepPrimAPI_MakeBox(gp_Pnt(-100, -60, -80), 150, 200, 170).Shape() asect = BRepAlgoAPI_Section(S, gp_Pln(1, 2, 1, -15), False) asect.ComputePCurveOn1(True) asect.Approximation(True) asect.Build() R = asect.Shape() asplit = BRepFeat_SplitShape(S) for edg in Topo(R).edges(): face = TopoDS_Face() if asect.HasAncestorFaceOn1(edg, face): asplit.Add(edg, face) asplit.Build() display.EraseAll() display.DisplayShape(asplit.Shape()) display.FitAll()
def splitwire(base, in_edge): sect = BRepAlgoAPI_Section(base, in_edge) sect.Build() sect.RefineEdges() edge = sect.Shape() splt = BRepFeat_SplitShape(base) Ex = TopExp_Explorer(edge, TopAbs_VERTEX) while Ex.More(): # print(Ex.Current()) Sx = TopExp_Explorer(base, TopAbs_EDGE) while Sx.More(): if sect.HasAncestorFaceOn1(Ex.Current(), Sx.Current()): print('add', Ex.Current(), Sx.Current()) splt.Add(Ex.Current(), Sx.Current()) Sx.Next() Ex.Next() splt.Build() return splt.Shape()
def split_solid(base, plane): splt = BRepFeat_SplitShape() splt.Init(base) sect = BRepAlgoAPI_Section(base, plane, False) sect.ComputePCurveOn1(True) sect.Approximation(True) sect.Build() edge = sect.Shape() rdict = set() # print(Topo(edge).number_of_edges()) Ex = TopExp_Explorer(edge, TopAbs_EDGE) while Ex.More(): # print('edge', Ex.Current()) base_iter = TopExp_Explorer(base, TopAbs_FACE) curr = Ex.Current() while base_iter.More(): # print('face', base_iter.Current()) bface = base_iter.Current() if sect.HasAncestorFaceOn1(curr, bface): # print('has1', curr, bface) k, v = hash(bface), hash(curr) if (k, v) not in rdict: rdict.add((k, v)) e = topods.Edge(curr) f = topods.Face(bface) splt.Add(e, f) if sect.HasAncestorFaceOn2(curr, bface): # print('has2', curr, bface) pass base_iter.Next() Ex.Next() splt.Build() return splt.Shape()