Example #1
0
    def parse(self, filename):
        """
        Method to parse the file `filename`. It returns a matrix with all the coordinates.

        :param string filename: name of the input file.

        :return: mesh_points: it is a `n_points`-by-3 matrix containing the coordinates of
            the points of the mesh
        :rtype: numpy.ndarray

        """
        self.infile = filename

        self.shape = self.load_shape_from_file(filename)

        # cycle on the faces to get the control points
        # init some quantities
        n_faces = 0
        control_point_position = [0]
        faces_explorer = TopExp_Explorer(self.shape, TopAbs_FACE)
        mesh_points = np.zeros(shape=(0, 3))

        while faces_explorer.More():
            # performing some conversions to get the right format (BSplineSurface)
            face = OCC.TopoDS.topods_Face(faces_explorer.Current())
            nurbs_converter = BRepBuilderAPI_NurbsConvert(face)
            nurbs_converter.Perform(face)
            nurbs_face = nurbs_converter.Shape()
            brep_face = BRep_Tool.Surface(OCC.TopoDS.topods_Face(nurbs_face))
            bspline_face = geomconvert_SurfaceToBSplineSurface(brep_face)

            # openCascade object
            occ_face = bspline_face.GetObject()

            # extract the Control Points of each face
            n_poles_u = occ_face.NbUPoles()
            n_poles_v = occ_face.NbVPoles()
            control_polygon_coordinates = np.zeros(\
                shape=(n_poles_u * n_poles_v, 3))

            # cycle over the poles to get their coordinates
            i = 0
            for pole_u_direction in range(n_poles_u):
                for pole_v_direction in range(n_poles_v):
                    control_point_coordinates = occ_face.Pole(\
                        pole_u_direction + 1, pole_v_direction + 1)
                    control_polygon_coordinates[i, :] = [control_point_coordinates.X(),\
                        control_point_coordinates.Y(),\
                        control_point_coordinates.Z()]
                    i += 1
            # pushing the control points coordinates to the mesh_points array (used for FFD)
            mesh_points = np.append(
                mesh_points, control_polygon_coordinates, axis=0)
            control_point_position.append(
                control_point_position[-1] + n_poles_u * n_poles_v)

            n_faces += 1
            faces_explorer.Next()
        self._control_point_position = control_point_position
        return mesh_points
def occ_triangle_mesh(event=None):
    #
    # Mesh the shape
    #
    BRepMesh_IncrementalMesh(aShape, 0.1)
    builder = BRep_Builder()
    Comp = TopoDS_Compound()
    builder.MakeCompound(Comp)

    ex = TopExp_Explorer(aShape, TopAbs_FACE)
    while ex.More():
        F = topods_Face(ex.Current())
        L = TopLoc_Location()
        facing = (BRep_Tool().Triangulation(F, L)).GetObject()
        tab = facing.Nodes()
        tri = facing.Triangles()
        for i in range(1, facing.NbTriangles() + 1):
            trian = tri.Value(i)
            #print trian
            index1, index2, index3 = trian.Get()
            for j in range(1, 4):
                if j == 1:
                    M = index1
                    N = index2
                elif j == 2:
                    N = index3
                elif j == 3:
                    M = index2
                ME = BRepBuilderAPI_MakeEdge(tab.Value(M), tab.Value(N))
                if ME.IsDone():
                    builder.Add(Comp, ME.Edge())
        ex.Next()
    display.DisplayShape(Comp, update=True)
def split_edge_with_face(event=None):
    display.EraseAll()
    p0 = gp_Pnt()
    vnorm = gp_Dir(1, 0, 0)
    pln = gp_Pln(p0, vnorm)
    face = BRepBuilderAPI_MakeFace(pln, -10, 10, -10, 10).Face()
    p1 = gp_Pnt(0, 0, 15)
    p2 = gp_Pnt(0, 0, -15)
    edge = BRepBuilderAPI_MakeEdge(p1, p2).Edge()
    # Initialize splitter
    splitter = GEOMAlgo_Splitter()
    # Add the edge as an argument and the face as a tool. This will split
    # the edge with the face.
    splitter.AddArgument(edge)
    splitter.AddTool(face)
    splitter.Perform()

    edges = []
    exp = TopExp_Explorer(splitter.Shape(), TopAbs_EDGE)
    while exp.More():
        edges.append(exp.Current())
        exp.Next()
    print('Number of edges in split shape: ', len(edges))
    display.DisplayShape(edges[0], color='red')
    display.DisplayShape(edges[1], color='green')
    display.DisplayShape(edges[2], color='yellow')
    display.FitAll()
Example #4
0
def occ_topo_list(shape):
    """ return the edges & faces from `shape`

    :param shape: a TopoDS_Shape
    :return: a list of edges and faces
    """

    from OCC.TopAbs import TopAbs_FACE
    from OCC.TopAbs import TopAbs_EDGE
    from OCC.TopExp import TopExp_Explorer
    from OCC.TopoDS import topods_Face, topods_Edge

    topExp = TopExp_Explorer()
    topExp.Init(shape, TopAbs_FACE)
    faces = []
    edges = []

    while topExp.More():
        face = topods_Face(topExp.Current())
        faces.append(face)
        topExp.Next()

    topExp.Init(shape, TopAbs_EDGE)

    while topExp.More():
        edge = topods_Edge(topExp.Current())
        edges.append(edge)
        topExp.Next()

    return faces, edges
def FilletFaceCorners(face, radius):
    """Fillets the corners of the input face

    Parameters
    ----------
    face : TopoDS_Face

    radius : the Fillet radius

    Returns
    -------
    """
    vert_explorer = TopExp_Explorer(face, TopAbs_VERTEX)
    from OCC.BRepFilletAPI import BRepFilletAPI_MakeFillet2d
    fillet = BRepFilletAPI_MakeFillet2d(face)
    while vert_explorer.More():
        vertex = topods_Vertex(vert_explorer.Current())
        fillet.AddFillet(vertex, radius)
        # Note: Needed two next statements here as faces have a vertex on
        # either side
        vert_explorer.Next()
        vert_explorer.Next()

    fillet.Build()
    face = fillet.Shape()
    return face
Example #6
0
 def get_faces(shp):
     ex = TopExp_Explorer(shp, TopAbs_FACE)
     seq = []
     while ex.More():
         s1 = ex.Current()
         seq.append(s1)
         ex.Next()
     return seq
Example #7
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 #8
0
def iter_wires(shape):
    """
    Generator / Iterator over the wire of a shape
    """

    exp = TopExp_Explorer(shape, TopAbs_WIRE)
    while exp.More():
        yield topods_Wire(exp.Current())
        exp.Next()
Example #9
0
def iter_edges(shape):
    """
    Generator / Iterator over the edges of a shape
    """

    exp = TopExp_Explorer(shape, TopAbs_EDGE)
    while exp.More():
        yield topods_Edge(exp.Current())
        exp.Next()
Example #10
0
def process_face(face):
    '''traverses a face for wires
    returns a list of wires'''
    wires = []
    explorer = TopExp_Explorer(face, TopAbs_EDGE)
    while explorer.More():
        edge = TopoDS().Edge(explorer.Current())
        wire = BRepBuilderAPI_MakeWire(edge).Wire()
        wires.append(wire)
        explorer.Next()
    return wires
Example #11
0
def process_shape(shape):
    '''extracts faces from a shape
    note: if this doesnt work you should try process_face(shape)
    returns a list of faces'''
    faces = []
    explorer = TopExp_Explorer(shape, TopAbs_FACE)
    while explorer.More():
        face = TopoDS().Face(explorer.Current())
        faces.append(face)
        explorer.Next()
    return faces
Example #12
0
def color_the_edges(shp, display, color, width):
    shapeList = []
    Ex = TopExp_Explorer(shp, TopAbs_EDGE)
    ctx = display.Context
    while Ex.More():
        aEdge = topods.Edge(Ex.Current())
        ais_shape = AIS_Shape(aEdge).GetHandle()
        ctx.SetColor(ais_shape, color, False)
        ctx.SetWidth(ais_shape, width, False)
        ctx.Display(ais_shape, False)
        Ex.Next()
Example #13
0
    def _entities(self, topo_type):

        out = {}  # using dict to prevent duplicates

        explorer = TopExp_Explorer(self.wrapped, inverse_shape_LUT[topo_type])

        while explorer.More():
            item = explorer.Current()
            out[item.__hash__()] = item  # some implementations use __hash__
            explorer.Next()

        return list(out.values())
Example #14
0
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
Example #15
0
    def check_topology(self):
        """
        Method to check the topology of imported geometry.
        :return: 0: 1 solid = 1 shell = n faces
        1: 1 solid = 0 shell = n free faces
        2: 1 solid = n shell = n faces (1 shell = 1 face)
        """
        # read shells and faces
        shells_explorer = TopExp_Explorer(self.shape, TopAbs_SHELL)
        n_shells = 0
        while shells_explorer.More():
            n_shells += 1
            shells_explorer.Next()

        faces_explorer = TopExp_Explorer(self.shape, TopAbs_FACE)
        n_faces = 0
        while faces_explorer.More():
            n_faces += 1
            faces_explorer.Next()

        print(
            "##############################################\n"
            "Model statistics -- Nb Shells: {0} Faces: {1} \n"
            "----------------------------------------------\n".format(
                n_shells, n_faces))

        if n_shells == 0:
            self.check_topo = 1
        elif n_shells == n_faces:
            self.check_topo = 2
        else:
            self.check_topo = 0
Example #16
0
def GetFacesSurfaces(BRepShape):
    FaceExplorer = TopExp_Explorer(BRepShape, TopAbs_FACE)

    Faces = []
    while FaceExplorer.More():
        ShapeFace = FaceExplorer.Current()  # a TopoDS_Shape
        # Convert TopoDS_Shape to a TopoDS_Face
        Face = topods.Face(ShapeFace)

        Faces.append(Face)
        FaceExplorer.Next()
        pass

    Surfaces = [BRep_Tool().Surface(Face) for Face in Faces]
    SurfObjs = [Surface.GetObject() for Surface in Surfaces]

    return (Faces, Surfaces, SurfObjs)
    def __init__(self, myShape, ignore_orientation=False):
        """

        implements topology traversal from any TopoDS_Shape
        this class lets you find how various topological entities are connected from one to another
        find the faces connected to an edge, find the vertices this edge is made from, get all faces connected to
        a vertex, and find out how many topological elements are connected from a source

        *note* when traversing TopoDS_Wire entities, its advised to use the specialized
        ``WireExplorer`` class, which will return the vertices / edges in the expected order

        :param myShape: the shape which topology will be traversed

        :param ignore_orientation: filter out TopoDS_* entities of similar TShape but different Orientation

        for instance, a cube has 24 edges, 4 edges for each of 6 faces

        that results in 48 vertices, while there are only 8 vertices that have a unique
        geometric coordinate

        in certain cases ( computing a graph from the topology ) its preferable to return
        topological entities that share similar geometry, though differ in orientation
        by setting the ``ignore_orientation`` variable
        to True, in case of a cube, just 12 edges and only 8 vertices will be returned

        for further reference see TopoDS_Shape IsEqual / IsSame methods

        """
        self.myShape = myShape
        self.ignore_orientation = ignore_orientation

        # the topoFactory dicts maps topology types and functions that can
        # create this topology
        self.topoFactory = {
            TopAbs_VERTEX: topods.Vertex,
            TopAbs_EDGE: topods.Edge,
            TopAbs_FACE: topods.Face,
            TopAbs_WIRE: topods.Wire,
            TopAbs_SHELL: topods.Shell,
            TopAbs_SOLID: topods.Solid,
            TopAbs_COMPOUND: topods.Compound,
            TopAbs_COMPSOLID: topods.CompSolid
        }
        self.topExp = TopExp_Explorer()
Example #18
0
    def combine_faces(compshape, sew_tolerance):
        """
        Method to combine faces in a shell by adding connectivity and continuity
        :param compshape: TopoDS_Shape
        :param sew_tolerance: tolerance for sewing
        :return: Topo_Shell
        """

        offsew = BRepOffsetAPI_FindContigousEdges(sew_tolerance)
        sew = BRepBuilderAPI_Sewing(sew_tolerance)

        face_explorers = TopExp_Explorer(compshape, TopAbs_FACE)
        n_faces = 0
        # cycle on Faces
        while face_explorers.More():
            tface = topods.Face(face_explorers.Current())
            sew.Add(tface)
            offsew.Add(tface)
            n_faces += 1
            face_explorers.Next()

        offsew.Perform()
        offsew.Dump()
        sew.Perform()
        shell = sew.SewedShape()
        sew.Dump()

        shell = topods.Shell(shell)
        shell_fixer = ShapeFix_Shell()
        shell_fixer.FixFaceOrientation(shell)

        if shell_fixer.Perform():
            print("{} shells fixed! ".format(shell_fixer.NbShells()))
        else:
            print "Shells not fixed! "

        new_shell = shell_fixer.Shell()

        if brepalgo_IsValid(new_shell):
            print "Shell valid! "
        else:
            print "Shell failed! "

        return new_shell
Example #19
0
def simple_mesh():
    #
    # Create the shape
    #
    shape = BRepPrimAPI_MakeBox(200, 200, 200).Shape()
    theBox = BRepPrimAPI_MakeBox(200, 60, 60).Shape()
    theSphere = BRepPrimAPI_MakeSphere(gp_Pnt(100, 20, 20), 80).Shape()
    shape = BRepAlgoAPI_Fuse(theSphere, theBox).Shape()
    #
    # Mesh the shape
    #
    BRepMesh_IncrementalMesh(shape, 0.8)
    builder = BRep_Builder()
    comp = TopoDS_Compound()
    builder.MakeCompound(comp)

    bt = BRep_Tool()
    ex = TopExp_Explorer(shape, TopAbs_FACE)
    while ex.More():
        face = topods_Face(ex.Current())
        location = TopLoc_Location()
        facing = (bt.Triangulation(face, location)).GetObject()
        tab = facing.Nodes()
        tri = facing.Triangles()
        for i in range(1, facing.NbTriangles()+1):
            trian = tri.Value(i)
            index1, index2, index3 = trian.Get()
            for j in range(1, 4):
                if j == 1:
                    m = index1
                    n = index2
                elif j == 2:
                    n = index3
                elif j == 3:
                    m = index2
                me = BRepBuilderAPI_MakeEdge(tab.Value(m), tab.Value(n))
                if me.IsDone():
                    builder.Add(comp, me.Edge())
        ex.Next()
    display.EraseAll()
    display.DisplayShape(shape)
    display.DisplayShape(comp, update=True)
Example #20
0
    def createModel(self):
        #         edges = makeEdgesFromPoints(self.points)
        #         self.a1 =
        edge1 = BRepBuilderAPI_MakeEdge(getGpPt(self.a1), getGpPt(self.a2))
        edge2 = BRepBuilderAPI_MakeEdge(getGpPt(self.a2), getGpPt(self.a3))
        arc1 = GC_MakeArcOfCircle(getGpPt(self.a3), getGpPt(self.a4),
                                  getGpPt(self.a5))
        edge3 = BRepBuilderAPI_MakeEdge(arc1.Value())
        edge4 = BRepBuilderAPI_MakeEdge(getGpPt(self.a5), getGpPt(self.a6))
        arc2 = GC_MakeArcOfCircle(getGpPt(self.a6), getGpPt(self.a7),
                                  getGpPt(self.a8))
        edge5 = BRepBuilderAPI_MakeEdge(arc2.Value())
        edge6 = BRepBuilderAPI_MakeEdge(getGpPt(self.a8), getGpPt(self.a9))
        arc3 = GC_MakeArcOfCircle(getGpPt(self.a9), getGpPt(self.a10),
                                  getGpPt(self.a11))
        edge7 = BRepBuilderAPI_MakeEdge(arc3.Value())
        edge8 = BRepBuilderAPI_MakeEdge(getGpPt(self.a11), getGpPt(self.a12))
        edge9 = BRepBuilderAPI_MakeEdge(getGpPt(self.a12), getGpPt(self.a1))
        #         wire = makeWireFromEdges(edge1,edge2,edge3,edge4,edge5,edge6,edge7,edge8,edge9)
        wire = BRepBuilderAPI_MakeWire(edge1.Edge(), edge2.Edge(),
                                       edge3.Edge(), edge4.Edge())
        wire = BRepBuilderAPI_MakeWire(wire.Wire(), edge5.Edge())
        wire = BRepBuilderAPI_MakeWire(wire.Wire(), edge6.Edge())
        wire = BRepBuilderAPI_MakeWire(wire.Wire(), edge7.Edge())
        wire = BRepBuilderAPI_MakeWire(wire.Wire(), edge8.Edge())
        wire = BRepBuilderAPI_MakeWire(wire.Wire(), edge9.Edge())

        aFace = makeFaceFromWire(wire.Wire())
        extrudeDir = self.L * self.wDir  # extrudeDir is a numpy array

        prism = makePrismFromFace(aFace, extrudeDir)
        mkFillet = BRepFilletAPI_MakeFillet(prism)
        anEdgeExplorer = TopExp_Explorer(prism, TopAbs_EDGE)
        while anEdgeExplorer.More():
            aEdge = topods.Edge(anEdgeExplorer.Current())
            mkFillet.Add(self.T / 17., aEdge)
            anEdgeExplorer.Next()

        prism = mkFillet.Shape()

        return prism
Example #21
0
    def createModel(self):
        edges = makeEdgesFromPoints(self.points)
        wire = makeWireFromEdges(edges)
        aFace = makeFaceFromWire(wire)
        extrudeDir = self.T * self.wDir # extrudeDir is a numpy array
        prism =  makePrismFromFace(aFace, extrudeDir)
        mkFillet = BRepFilletAPI_MakeFillet(prism)
        anEdgeExplorer = TopExp_Explorer(prism, TopAbs_EDGE)
        while anEdgeExplorer.More():
            aEdge = topods.Edge(anEdgeExplorer.Current())
            mkFillet.Add(self.T / 17. , aEdge)
            anEdgeExplorer.Next()
                
        prism = mkFillet.Shape()
        cylOrigin = self.secOrigin
        innerCyl = BRepPrimAPI_MakeCylinder(gp_Ax2(getGpPt(cylOrigin), getGpDir(self.wDir)), self.r1, self.H).Shape()
        result_shape = BRepAlgoAPI_Cut(prism, innerCyl).Shape()

        return result_shape
    
            
Example #22
0
 def createModel(self):
     
     edges = makeEdgesFromPoints(self.points)
     wire = makeWireFromEdges(edges)
     aFace = makeFaceFromWire(wire)
     extrudeDir = -self.T * self.shaftDir # extrudeDir is a numpy array
     boltHead =  makePrismFromFace(aFace, extrudeDir)
     mkFillet = BRepFilletAPI_MakeFillet(boltHead)
     anEdgeExplorer = TopExp_Explorer(boltHead, TopAbs_EDGE)
     while anEdgeExplorer.More():
         aEdge = topods.Edge(anEdgeExplorer.Current())
         mkFillet.Add(self.T / 17. , aEdge)
         anEdgeExplorer.Next()
             
     boltHead = mkFillet.Shape()
     cylOrigin = self.origin
   
     boltCylinder = BRepPrimAPI_MakeCylinder(gp_Ax2(getGpPt(cylOrigin), getGpDir(self.shaftDir)), self.r, self.H).Shape()
     whole_Bolt = BRepAlgoAPI_Fuse(boltHead,boltCylinder).Shape()
     mkFillet = BRepFilletAPI_MakeFillet(whole_Bolt)
     
     return whole_Bolt
Example #23
0
def discretize(shape, tol):
    """This method discretizes the OpenCascade shape.

    :param shape: Shape to discretize
    :type shape:
    :return: discretized face; profile coordinates; id of the surface the\
    coordinates belong to
    :rtype: OCC.TopoDS.TopoDS_Compound; numpy.ndarray; numpy.ndarray
    """
    BRepMesh_IncrementalMesh(shape, tol, False, 5)
    builder = BRep_Builder()
    comp = TopoDS_Compound()
    builder.MakeCompound(comp)

    bt = BRep_Tool()
    ex = TopExp_Explorer(shape, TopAbs_EDGE)
    edge_coords = np.zeros([0, 3])
    edge_ids = np.zeros([0], dtype=int)
    edge_id = 0
    while ex.More():
        edge = topods_Edge(ex.Current())
        location = TopLoc_Location()
        edging = (bt.Polygon3D(edge, location)).GetObject()
        tab = edging.Nodes()
        for i in range(1, edging.NbNodes() + 1):
            p = tab.Value(i)
            edge_coords = np.append(edge_coords,
                                    [[p.X(), p.Y(), p.Z()]],
                                    axis=0)
            edge_ids = np.append(edge_ids, edge_id)
            mv = BRepBuilderAPI_MakeVertex(p)
            if mv.IsDone():
                builder.Add(comp, mv.Vertex())
        edge_id += 1
        ex.Next()

    edge_coords = np.round(edge_coords, 8)
    return edge_coords, edge_ids
def get_edges_from_shape(a_topods_shape):
    """ Returns a list of edges from a topods_shape
    """
    edge_explorer = TopExp_Explorer()
    edge_explorer.Init(a_topods_shape, TopAbs_EDGE)
    edges = []
    hashes = []
    while edge_explorer.More():
        current_edge = edge_explorer.Current()
        current_item_hash = current_edge.__hash__()
        if not current_item_hash in hashes:
            hashes.append(current_item_hash)
            edges.append(current_edge)
        edge_explorer.Next()
    return edges
Example #25
0
def draft_angle(event=None):
    S = BRepPrimAPI_MakeBox(200., 300., 150.).Shape()
    adraft = BRepOffsetAPI_DraftAngle(S)
    topExp = TopExp_Explorer()
    topExp.Init(S, TopAbs_FACE)
    while topExp.More():
        face = topods_Face(topExp.Current())
        surf = Handle_Geom_Plane_DownCast(BRep_Tool_Surface(face)).GetObject()
        dirf = surf.Pln().Axis().Direction()
        ddd = gp_Dir(0, 0, 1)
        if dirf.IsNormal(ddd, precision_Angular()):
            adraft.Add(face, ddd, math.radians(15), gp_Pln(gp_Ax3(gp_XOY())))
        topExp.Next()
    adraft.Build()
    display.DisplayShape(adraft.Shape(), update=True)
Example #26
0
def get_faces(_shape):
    """ return the faces from `_shape`
    :param _shape: TopoDS_Shape, or a subclass like TopoDS_Solid
    :return: a list of faces found in `_shape`
    """
    topExp = TopExp_Explorer()
    topExp.Init(_shape, TopAbs_FACE)
    _faces = []

    while topExp.More():
        fc = topods_Face(topExp.Current())
        _faces.append(fc)
        topExp.Next()

    return _faces
def get_faces_from_shape(a_topods_shape):
    """ Returns a list of faces from a TopoDS_Shape
    """
    faces = []
    # get faces
    face_explorer = TopExp_Explorer()
    face_explorer.Init(a_topods_shape, TopAbs_FACE)
    faces = []
    hashes = []
    while face_explorer.More():
        current_face = face_explorer.Current()
        current_item_hash = current_face.__hash__()
        if not current_item_hash in hashes:
            hashes.append(current_item_hash)
            faces.append(current_face)
        face_explorer.Next()
    return faces
Example #28
0
 def compute(self):
     # get faces
     explorer = TopExp_Explorer()
     explorer.Init(self._shape, TopAbs_FACE)
     if self._map_faces_to_mesh:  # one mesh per face
         faces = []
         while explorer.More():
             current_face = explorer.Current()
             faces.append(current_face)
             explorer.Next()
         # loop over faces
         for face in faces:
             face_tesselator = Tesselator(face)
             self._indexed_face_sets.append(face_tesselator.ExportShapeToX3DIndexedFaceSet())
     else:  # only one mesh for the whole shape
         shape_tesselator = Tesselator(self._shape)
         self._indexed_face_sets.append(shape_tesselator.ExportShapeToX3DIndexedFaceSet())
Example #29
0
    XYZ = (1, 0, 1)
    lim_coord1 = (xmin, xmax)
    lim_coord2 = (zmin, zmax)

    section_width = ymin + 1e-3
    # A horizontal plane is created from which a face is constructed to intersect with
    # the building. The face is transparently displayed along with the building.
    section_plane = gp_Pln(gp_Pnt(xmax + xmin, section_width, 0.0),
                           gp_Dir(0, 1, 0))

    plt.figure()
    plt.xlim(lim_coord1)
    plt.ylim(lim_coord2)

    # Explore the faces of the shape (these are known to be named)
    exp = TopExp_Explorer(shape, TopAbs_FACE)
    while exp.More():
        s = exp.Current()

        tp = Topo(s)
        for face in tp.faces():
            for edge in list(Topo(face).edges()):

                obj = EdgeOnSurface(edge, section_plane, lim_coord2,
                                    lim_coord1, XYZ)

                if type(obj) == Line3D:
                    x1, y1 = obj.get_v1(XYZ)
                    x2, y2 = obj.get_v2(XYZ)
                    plt.plot([x1, x2], [y1, y2], color="red")
Example #30
0
    # Read the file to get the shape to be sampled.
    shape = TopoDS_Shape()
    builder = BRep_Builder()
    breptools_Read(shape, "cubeWithHole.brep", builder)

    # Loop over the shape pulled from the input and look for solids.
    solids = []  # A list for storing solids from the file
    i = 0  # A counter for writing vertices/points
    allPointsDataFrame = pd.DataFrame([])  # A dataframe for ALL points
    # OpenCASCADE can only successfully execute point inclusion queries if the
    # shape in question is a full solid, which is defined in their topology as
    # TopAbs_SOLID. Each solid in the file can sampled individually by pulling
    # it from the compound.
    if shape.ShapeType() != TopAbs_SOLID:
        # Create a topology explorer and pull all the solids from the shape
        explorer = TopExp_Explorer(shape, TopAbs_SOLID)
        # Loop over all the solids
        while explorer.More():
            solid = explorer.Current()
            #pointsInSolid = sampleSolid(n,solid)
            pointsInSolid = sampleSolid(n, solid, vertexList)
            # Write the coordinates that are saved to disk.
            i = i + 1
            fileName = 'solid_' + str(i) + '.csv'
            pointsInSolid.to_csv(fileName, index=False)
            # Store the points for later
            allPointsDataFrame = allPointsDataFrame.append(
                pointsInSolid.copy(), ignore_index=False)
            # Store the solid for later reference (i.e. - visualization)
            solids.append(solid)
            # Go to the next solid if one exists