Example #1
0
def intersection(shp1: TopoDS_Shape,
                 shp2: Union[TopoDS_Shape, gp.GP3d]) -> TopoDS_Shape:
    """
    Most Robust TopoDS intersection

    BRepAlgoAPI_Common will only return if the intersection is solid.
    BRepAlgoAPI_Section will work for face-on-face

    similar issue with GeomAPI is documented here:
        https://www.opencascade.com/content/use-brepalgosection-instead-brepalgoapisection

    :param: shp1 - TopoDS_Shape1
    :param: shp2 - TopoDS_Shape2

    BRepAlgoAPI_Section(TopoDS_Shape const &,TopoDS_Shape const &,BOPAlgo_PaveFiller const &,Standard_Boolean const)
    BRepAlgoAPI_Section(TopoDS_Shape const &,TopoDS_Shape const &,Standard_Boolean const)
    BRepAlgoAPI_Section(TopoDS_Shape const &,gp_Pln const &,Standard_Boolean const)
    BRepAlgoAPI_Section(TopoDS_Shape const &,Handle_Geom_Surface const &,Standard_Boolean const)
    BRepAlgoAPI_Section(Handle_Geom_Surface const &,TopoDS_Shape const &,Standard_Boolean const)
    BRepAlgoAPI_Section(Handle_Geom_Surface const &,Handle_Geom_Surface const &,Standard_Boolean const)

    returns wires representing the intersection
    """
    intrs = BRepAlgoAPI_Section(shp1, shp2)
    if intrs.BuilderCanWork() is True:
        intrs.Build()
        # todo add isDone check (maybe ??)
        # intrs.FuseEdges()
        intrs.RefineEdges()
        shp = intrs.Shape()
        intrs.Destroy()
        return shp
Example #2
0
def CutSect(Shape, SpanStation):
    """
    Parameters
    ----------
    Shape : TopoDS_Shape
        The Shape to find planar cut section (parallel to xz plane)

    SpanStation : scalar in range (0, 1)
        y-direction location at which to cut Shape

    Returns
    -------
    Section : result of OCC.BRepAlgoAPI.BRepAlgoAPI_Section (TopoDS_Shape)
        The cut section of shape given a cut plane parallel to xz at input
        Spanstation.

    Chord : result of OCC.GC.GC_MakeSegment.Value (Geom_TrimmedCurve)
        The Chord line between x direction extremeties
    """
    (Xmin, Ymin, Zmin, Xmax, Ymax, Zmax) = ObjectsExtents([Shape])

    YStation = Ymin + (Ymax - Ymin) * SpanStation
    OriginX = Xmin - 1
    OriginZ = Zmin - 1

    P = gp_Pln(gp_Pnt(OriginX, YStation, OriginZ), gp_Dir(gp_Vec(0, 1, 0)))
    # Note: using 2*extents here as previous +1 trimmed plane too short
    CutPlaneSrf = make_face(P, 0, Zmax + 2, 0, Xmax + 2)

    I = BRepAlgoAPI_Section(Shape, CutPlaneSrf)
    I.ComputePCurveOn1(True)
    I.Approximation(True)
    I.Build()
    Section = I.Shape()

    (Xmin, Ymin, Zmin, Xmax, Ymax, Zmax) = ObjectsExtents([Section])

    #     Currently assume only one edge exists in the intersection:
    exp = TopExp_Explorer(Section, TopAbs_EDGE)
    edge = topods_Edge(exp.Current())

    #    Find the apparent chord of the section (that is, the line connecting the
    #    fore most and aftmost points on the curve
    DivPoints = Uniform_Points_on_Curve(edge, 200)

    Xs = np.array([pt.X() for pt in DivPoints])

    min_idx = np.argmin(Xs)
    LeadingPoint = gp_Pnt(Xs[min_idx], DivPoints[min_idx].Y(),
                          DivPoints[min_idx].Z())

    max_idx = np.argmax(Xs)
    TrailingPoint = gp_Pnt(Xs[max_idx], DivPoints[max_idx].Y(),
                           DivPoints[max_idx].Z())

    HChord = GC_MakeSegment(TrailingPoint, LeadingPoint).Value()
    #    Chord = HChord.GetObject()
    return Section, HChord
Example #3
0
    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
Example #4
0
def vectorized_slicer(li):
    # Create Plane defined by a point and the perpendicular direction
    z_values, shape = li
    _slices = []
    for z in z_values:
        #print 'slicing index:', z, 'sliced by process:', os.getpid()
        plane = gp_Pln(gp_Pnt(0., 0., z), gp_Dir(0., 0., 1.))
        face = BRepBuilderAPI_MakeFace(plane).Shape()
        # Computes Shape/Plane intersection
        section = BRepAlgoAPI_Section(shape, face)
        section.Build()
        if section.IsDone():
            _slices.append(section.Shape())
    return _slices
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()
Example #6
0
def section(event=None):
    Torus = BRepPrimAPI_MakeTorus(120, 20).Shape()
    radius = 120.0
    sections = []
    for i in range(-3, 4):
        # Create Sphere
        Sphere = BRepPrimAPI_MakeSphere(gp_Pnt(26 * 3 * i, 0, 0), radius).Shape()
        # Computes Torus/Sphere section
        section = BRepAlgoAPI_Section(Torus, Sphere, False)
        section.ComputePCurveOn1(True)
        section.Approximation(True)
        section.Build()
        sections.append(section)

    display.EraseAll()
    display.DisplayShape(Torus)
    for section in sections:
        display.DisplayShape(section.Shape())
    display.FitAll()
Example #7
0
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()
Example #8
0
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()
Example #9
0
class Intersector:
    """
    given shape1 and shape2, form the intersection
    need to be able to return which 'topo' of
    """
    def __init__(self, shp1, shp2):
        # self.shp1 = shp1
        # self.shp2 = shp2
        self.algo = BRepAlgoAPI_Section(shp1, shp2, True)
        self.algo.ComputePCurveOn1(True)
        self.algo.ComputePCurveOn2(True)
        # self.algo.Approximation(True)

    @property
    def shp1(self):
        return self.algo.Shape1()

    @property
    def shp2(self):
        return self.algo.Shape2()

    def Shape(self):
        return self.algo.Shape()

    def faces_on(self):
        self.algo.Build()
        from OCC.TopTools import TopTools_ListIteratorOfListOfShape
        seen = set()

        edge_list = self.algo.Modified(self.shp1)
        itre = TopTools_ListIteratorOfListOfShape(edge_list)
        while itre.More():
            print(itre.Value())
            itre.Next()
        print('-')
        edge_list = self.algo.Modified(self.shp2)
        itre = TopTools_ListIteratorOfListOfShape(edge_list)
        while itre.More():
            print(itre.Value())
            itre.Next()
        # edge_list = self.algo.SectionEdges()
        # itr = TopTools_ListIteratorOfListOfShape(edge_list)
        # edge_list = self.algo.SectionEdges()


        res = self.Shape()
        itr = TopExp_Explorer(res, TopAbs_EDGE)



        faces1, faces2 = [], []
        while itr.More():
            curr_edge = itr.Current()

            s1_iter = TopExp_Explorer(self.shp1, TopAbs_FACE)
            s2_iter = TopExp_Explorer(self.shp2, TopAbs_FACE)

            while s1_iter.More():
                curr_face1 = s1_iter.Current()

                if self.algo.HasAncestorFaceOn1(curr_edge, curr_face1):
                    k, v = hash(curr_face1), hash(curr_edge)
                    if (k, v) not in seen:
                        seen.add((k, v))
                        faces1.append(curr_face1)
                s1_iter.Next()

            while s2_iter.More():
                curr_face2 = s2_iter.Current()
                if self.algo.HasAncestorFaceOn2(curr_edge, curr_face2):
                    k, v = hash(curr_face2), hash(curr_edge)
                    if (k, v) not in seen:
                        seen.add((k, v))
                        faces2.append(curr_face2)

                s2_iter.Next()

            # s2_iter.ReInit()
            # s1_iter.ReInit()
            itr.Next()
        return faces1, faces2

    def commonface(self):
        w = Construct.make_wirex(*Topo(self.Shape()).edges())
        f = Construct.make_face(w)
        return f