Пример #1
0
def getDXF(data):
    dwg = g2.Drawing()
    dwg.insertGeo('work', data['shape'])
    print(dwg.boundBox)
    dxf_result = dwg.getDXF()
    return dxf_result
Пример #2
0
    def Activated(self):
        def indexNode(x, y):
            i = 0
            notfound = True
            while (notfound) and i < len(nodes):
                if (x == nodes[i][0]) and (y == nodes[i][1]):
                    notfound = False
                    i = i - 1
                i = i + 1
            if notfound:
                nodes.append([x, y])
                all_nodes.append(g2.Point(x, y))
            return i

        def createPaths(path, node, geos):
            while len(geos) > 0:
                geo = geos.pop()
                if (geo[1] == node):
                    path.append(geo)
                    createPaths(path, geo[2], geos)
                elif (geo[2] == node):
                    path.append(geo)
                    createPaths(path, geo[1], geos)
            return dict(path=path, node=node, geos=geos)

        # create a copy of the selected face
        sel = FreeCADGui.Selection.getSelectionEx()[0]
        face = sel.SubObjects[0]
        obj = sel.Object
        copy_face = Part.Face(face.Wires)

        # align face on Z plane
        vns1 = face.normalAt(0.0, 0.0)
        print('Face normal vect: ', vns1.normalize(), '...')
        zdeg = vns1.getAngle(FreeCAD.Vector(0.0, 0.0, 1.0))
        print('...Rotation degree to Z plane: ', math.degrees(zdeg), '...')
        rAxis = FreeCAD.Rotation(FreeCAD.Vector(0.0, 0.0, 1.0),
                                 vns1.normalize()).Axis
        rDegree = -math.degrees(zdeg)
        rCenter = face.CenterOfMass
        face = copy_face
        face.Placement = FreeCAD.Placement(FreeCAD.Vector(0.0, 0.0, 0.0),
                                           FreeCAD.Rotation(rAxis, rDegree),
                                           rCenter).multiply(face.Placement)

        # find all paths
        edges = face.Edges
        nodes = []
        paths = []
        geos = []
        all_nodes = []
        all_geos = []
        chains = []
        for edge in edges:
            ind_nd = 0
            type_edge = type(edge.Curve).__name__
            vertexes = edge.Vertexes
            if type_edge == 'GeomLineSegment' or type_edge == 'Line':
                txt = 'line'
                n1 = indexNode(vertexes[0].X, vertexes[0].Y)
                n2 = indexNode(vertexes[1].X, vertexes[1].Y)
                geos.append(['Line', n1, n2])
            elif type_edge == 'GeomCircle' or type_edge == 'Circle':
                if len(edge.Vertexes) == 1:
                    txt = 'circle'
                    n1 = indexNode(edge.Curve.Center.x, edge.Curve.Center.y)
                    n2 = indexNode(vertexes[0].X, vertexes[0].Y)
                    geos.append(['Circle', n1, n2])
                if len(edge.Vertexes) == 2:
                    txt = 'arc'
                    n1 = indexNode(vertexes[0].X, vertexes[0].Y)
                    n3 = indexNode(vertexes[1].X, vertexes[1].Y)
                    mdldgr = edge.ParameterRange[0] + (
                        edge.ParameterRange[1] - edge.ParameterRange[0]) / 2
                    middle = edge.valueAt(mdldgr)
                    n2 = indexNode(middle.x, middle.y)
                    geos.append(['Arc', n1, n2, n3])
            elif type_edge == "GeomEllipse":
                txt = 'ellipse'
                n1 = indexNode(vertexes[0].X, vertexes[0].Y)
                n2 = indexNode(vertexes[1].X, vertexes[1].Y)
                f1 = e.Curve.Focus1
                rM = e.Curve.MajorRadius
                rm = e.Curve.MinorRadius
                #geos.append(['Ellipse',n1,n2,f1,f2,rM])????
        while len(geos) > 0:
            empty_search = False
            trovato = False
            act = geos.pop()
            chain = [act[1], act[0]]
            if act[0] == 'Arc':
                chain.append(act[2])
            chain.append(act[-1])
            node_to_find = act[-1]
            while not empty_search:
                i = 0
                empty_search = True
                while i < len(geos):
                    if geos[i][1] == node_to_find:
                        trovato = True
                        chain.append(geos[i][0])
                        if geos[i][0] == 'Arc':
                            chain.append(geos[i][2])
                        chain.append(geos[i][-1])
                        node_to_find = geos[i][-1]
                    elif geos[i][-1] == node_to_find:
                        trovato = True
                        chain.append(geos[i][0])
                        if geos[i][0] == 'Arc':
                            chain.append(geos[i][2])
                        chain.append(geos[i][1])
                        node_to_find = geos[i][1]
                    if trovato:
                        empty_search = False
                        act = geos[i]
                        geos.pop(i)
                        trovato = False
                    else:
                        i = i + 1
            chains.append(chain)

        print('...', len(chains), ' chains found ...')

        ### create a drawing
        dr = g2.Drawing()
        p_int = []
        conta = 0
        for c in chains:
            print(c)
            path = g2.Path(all_nodes, c)
            for i in range(0, len(path.geometries)):
                g = path.geo(i)
                print(g)
                dr.insertGeo(conta, g)
                conta += 1
        output_dxf = dr.toDXF()
        filename = QtGui.QFileDialog.getSaveFileName(None, "Salva DXF", "",
                                                     ".DXF")
        f = open(filename[0], "w")
        f.write(output_dxf)
        f.close()

        print('... all done!')
        return