Exemplo n.º 1
0
def main():
    """Run as a command line program."""

    parser = OptionParser()
    parser.add_option("-f", "--face", dest="face",
                      help="name of face dxf file", metavar="FACEDXF")
    parser.add_option("-t", "--temple", dest="temple",
                      help="name of temple dxf file", metavar="TEMPLEDXF")
    parser.add_option("-n", "--name", dest="name",
                      help="name of hinge", metavar="HINGENAME")
    parser.add_option("-o", "--outfile", dest="outfile",
                      help="name of output file", metavar="OUTFILE")

    (options, args) = parser.parse_args()

    if options.face == None or options.temple == None or options.name == None or options.outfile == None:
        sys.stderr.write("Insufficient arguments.")
        parser.print_help()
        sys.exit(0)

    facedxf = dxfgrabber.readfile(options.face)
    templedxf = dxfgrabber.readfile(options.temple)
    spec = {'description': options.name, 'drill_dia': 1.0, 'cb_dia': 2.0, 'cb_depth': 0.5, 'pocket_depth': 1.0}
    process_contour('face', facedxf, spec)
    process_contour('temple', templedxf, spec)
    with open(options.outfile, 'w') as outfile:
          json.dump(spec, outfile)
Exemplo n.º 2
0
def main():
    parser = OptionParser()
    parser.add_option("-n", "--name", dest="name",
            help="Name of the hinge.  Program will load file called <name>.json and output <name>-face.dxf and <name>-temple.dxf.", metavar = "HINGENAME")

    (options, args) = parser.parse_args()

    if options.name == None:
        sys.stderr.write("Not enough arguments")
        parser.print_help()
        sys.exit(0)

    name = options.name
    facename = name + "-face.dxf"
    templename = name + "-temple.dxf"

    facedxf = dxfgrabber.readfile(facename)
    templedxf = dxfgrabber.readfile(templename)

    hinge = { 'description': name }
    process_contour(facedxf, "face", hinge)
    process_contour(templedxf, "temple", hinge)

    filename = name + ".json"
    with open(filename, 'w') as outfile:
        json.dump(hinge, outfile)
Exemplo n.º 3
0
    def refreshDXF(self):
        
        filename = self.ui.lineEditInput.text()
        self.dxf = None
        self.dxf = dxfgrabber.readfile(str(filename))
        try:
            self.dxf = dxfgrabber.readfile(str(filename))
        except Exception:
            QMessageBox.critical(self, "File error", "File not found!")
            self.ui.lineEditDXF.selectAll()
            self.ui.lineEditDXF.setFocus()
            return

        self.layers = ()
        for layer in self.dxf.layers:
            self.layers = self.layers + (layer.name,)
        sorted_layers = sorted(self.layers)
        rows = self.ui.tableWidget.rowCount()
        if rows > 0:
            for row in range(rows):
                combobox = self.ui.tableWidget.cellWidget(row, 0)
                temp = u"{0}".format(combobox.itemText(combobox.currentIndex()))
                combobox.clear()
                combobox.setInsertPolicy(6)
                combobox.addItems(sorted_layers)
                if temp in sorted_layers:
                    combobox.setCurrentIndex(sorted_layers.index(temp))
                else:
                    combobox.setCurrentIndex(combobox.findText("0"))
                self.ui.tableWidget.setCellWidget(rows, 0, combobox)
Exemplo n.º 4
0
def stress_test():
    overall_time = 0
    ok = 0
    error = 0

    print('Cython acceleration is removed since version 0.8.0')
    print("Stress test:")

    for filename in all_files:
        try:
            start_time = time.time()
            dwg = dxfgrabber.readfile(filename)
            end_time = time.time()
            run_time = end_time - start_time
        except Exception:
            error += 1
            print('errors at opening: {}'.format(filename))
        else:
            ok += 1
            overall_time += run_time
            print('ok ({:.2f} seconds for opening: {})'.format(
                run_time, filename))

    print("{:.2f} seconds for {} files".format(overall_time, ok))
    print("{} errors".format(error))
    print('success' if error == 0 else 'failed')
Exemplo n.º 5
0
    def build_roots(self):
        reader = sab.SABReader()
        dxf = dxfgrabber.readfile(self._dxf_path)

        # read header info
        self._CAD_SCALE = 1. / dxf.header.get('$DIMALTF', 1.)

        # convert binary acis data to something logical
        acs_ents = [
            reader.read_single(x.acis) for x in dxf.entities
            if isinstance(x, Body)
        ]

        # get the translation to a logical 0
        self._CAD_TRANSLATE = -1 * self.as_line_xf(
            acs_ents[0], scale=self._CAD_SCALE).points[0].numpy

        # read families
        self.setup_point_based(
            filter(lambda x: isinstance(x, Insert), dxf.entities))

        pipes_long = list(
            filter(
                self._length_filter,
                map(self.as_linecyl,
                    filter(self._is_valid, map(sab.SACCylinder, acs_ents)))))

        pairs, tree, pts_ind = sks.connect_by_pairs(pipes_long,
                                                    factor=self.CONNECT_TOL)
        node_dict = sks.make_node_dict(pairs, pts_ind, pipes_long)
        root_nodes = sks.connected_components(list(node_dict.values()),
                                              min_size=2)
        final_roots = sks.kdconnect(root_nodes, tol=self._kd_tol)
        return final_roots
Exemplo n.º 6
0
   def _read_dxf(self, filename):
      """
         Read the dxf file with the dxf grabber.

         Arguments:
         - filename: representing the path and the name  of the dxf file.

         Returns: None.

         Raise: PermissionError, IsADirectoryError, FileNotFoundError or generic
         Exception in case of reading failure.

         Try to read the dxf file with the grabber.
      """

      try:
         self._grabber = dxfgrabber.readfile(filename)
      except PermissionError:
         Logger.error("Permission error: cannot read file " + filename)
         raise
      except IsADirectoryError:
         Logger.error("File is a directory error: cannot read file " + filename)
         raise
      except FileNotFoundError:
         Logger.error("File not found error: cannot read file " + filename)
         raise
      except Exception as e:
         Logger.error("Unknown exception on DXF file reading: " + str(e))
         raise
Exemplo n.º 7
0
 def __init__(self,
              filename,
              interpolate_curve=50,
              layers=None,
              ignore=None):
     """
     Reads a .dxf file
     
     Parameters
     ----------
     filename : str
         Path to .dxf file.
     interpolate_curve : int, optional (default: 50)
         Number of points to use to interpolate a curve.
     layers : list or dict, optional (default: all layers)
         Layers to handle.
     ignore : list, optional (default: None)
          Names of entity types to ignore.
     """
     if ignore is None:
         ignore = []
     self.dxf = dxfgrabber.readfile(filename)
     self.interp = interpolate_curve
     self.layers = layers
     self.ignore = ignore
Exemplo n.º 8
0
def traverse_dxf(filepath, applications=None):
    """

    :param filepath:
    :param applications:
    :type applications: list[ActionApplication]
    :return:
    """

    if applications is None:
        applications = []

    dxf = dxfgrabber.readfile(filepath)

    for e in dxf.entities.get_entities():  # type: DXFEntity

        for application in applications:
            if all(map(lambda x: x(e), application.rules)):
                application.action(e)

        if e.dxftype == "LINE":
            print("LINE")
        elif e.dxftype == "CIRCLE":
            print("CIRCLE")
        elif e.dxftype == "ARC":
            print("ARC")
        elif e.dxftype == "LWPOLYLINE":
            print("LWPOLYLINE")
        print(f"{e.layer}")
Exemplo n.º 9
0
    def _read_dxf(self, filename):
        """
         Read the dxf file with the dxf grabber.

         Arguments:
         - filename: representing the path and the name  of the dxf file.

         Returns: None.

         Raise: PermissionError, IsADirectoryError, FileNotFoundError or generic
         Exception in case of reading failure.

         Try to read the dxf file with the grabber.
      """

        try:
            self._grabber = dxfgrabber.readfile(filename)
        except PermissionError:
            Logger.error("Permission error: cannot read file " + filename)
            raise
        except IsADirectoryError:
            Logger.error("File is a directory error: cannot read file " +
                         filename)
            raise
        except FileNotFoundError:
            Logger.error("File not found error: cannot read file " + filename)
            raise
        except Exception as e:
            Logger.error("Unknown exception on DXF file reading: " + str(e))
            raise
Exemplo n.º 10
0
def read_painting(filename):
    dxf = dxfgrabber.readfile(filename)
    polylines = [poly for poly in dxf.entities if type(poly) is dxfgrabber.dxfentities.LWPolyline]

    painting_info = {}
    
    for line in polylines:
        sid_marker, stroke_id, cid_marker, color_id = line.layer.split("_")
        if sid_marker != "STROKEID" or cid_marker != "COLORID":
            print("found polyline on invalid layer")
            raise InvalidPaintingFileError()
        try:
            stroke_id = int(stroke_id)
            color_id = int(color_id)
        except ValueError:
            print("polyline layer '{}' stroke or color ID invalid!".format(line.layer))
            raise InvalidPaintingFileError()

        if stroke_id in painting_info:
            if painting_info[stroke_id]['color'] != color_id:
                print("found multiple layers with same stroke id but different color id!")
                raise InvalidPaintingError()
            painting_info[stroke_id]['lines'].append(line)
        else:
            painting_info[stroke_id] = {'lines': [line],
                                        'color': color_id}

    return [painting_info[i] for i in sorted(list(painting_info))]
Exemplo n.º 11
0
    def LoadDXF(self):

        # Loads the dxf-file selected in the DXFInputBox, checks all entities in the file and appends those with the
        # dxftype 'POLYLINE' (a set of points interpolated by lines) to a list. The points of the first polyline are
        # then loaded into the instruction list. NOTE: ALL POINTS WITH Z-COORDINATES LESS THAN 0,5m WILL HAVE THEIR
        # Z-COORDINATE SET TO 0,5 WHEN LOADED!

        dxf = dxfgrabber.readfile(self.pwd +
                                  '/src/kampala/gui/src/gui/DXFFiles/' +
                                  self._widget.DXFInputBox.currentText())
        allpolylines = [
            entity for entity in dxf.entities.__iter__()
            if entity.dxftype == 'POLYLINE'
        ]
        if allpolylines != []:
            linepoints = allpolylines[0].points
            self._widget.Pointlist.clear()
            self.pointlist = []
            for point in linepoints:
                if point[2] < 0.5:
                    safepoint = [round(point[0], 3), round(point[1], 3), 0.5]
                else:
                    safepoint = [
                        round(point[0], 3),
                        round(point[1], 3),
                        round(point[2])
                    ]
                self.pointlist.append(['go to: ', safepoint])
                self._widget.Pointlist.insertItem(
                    len(self.pointlist), 'go to: ' + str(safepoint[0]) + ',' +
                    str(safepoint[1]) + ',' + str(safepoint[2]))
        else:
            rospy.logwarn("no points in the selected DXFFile")
Exemplo n.º 12
0
    def read_dxf(self, filename, options=None, **kwargs):
        """reads a .dxf file
        :param filename: string path to .dxf file to read
        :param options: passed to :class:`~dxfgrabber.drawing.Drawing`constructor
        :param kwargs: dict of optional parameters passed to :method:`Group.from_dxf`
        """
        try:
            import dxfgrabber
            self.dxf = dxfgrabber.readfile(filename, options)
        except ImportError:
            logging.error('optional module dxfgrabber required')
            return
        except Exception as e:
            logging.error('could not read %s : %s' % (filename, e))
            return
        self.name = filename

        #build dictionary of blocks
        self.block = {}
        for block in self.dxf.blocks:
            self.block[block.name] = Group().from_dxf(block._entities,
                                                      **kwargs)

        super(Drawing, self).from_dxf(self.dxf.entities, **kwargs)
        return self
def main():
    if (len(sys.argv) != 4):
        print("use with params <input file> <output file> <height room>")
        return

    dxf = dxfgrabber.readfile(sys.argv[1])
    height_room = float(sys.argv[3])

    lines = [entity for entity in dxf.entities if entity.dxftype == 'LINE']
    polylines = [
        entity for entity in dxf.entities if entity.dxftype == 'LWPOLYLINE'
    ]

    vertexes = ''
    faces = ''
    index = 0

    result = convertLines(lines, vertexes, faces, index, height_room)
    vertexes = result[0]
    faces = result[1]
    index = result[2]

    result = convertPolylines(polylines, vertexes, faces, index, height_room)
    vertexes = result[0]
    faces = result[1]
    index = result[2]

    file = open(sys.argv[2], 'w+')
    file.write(vertexes)
    file.write(faces)
    file.close()
Exemplo n.º 14
0
 def read_dxf(self, filename, options=None, **kwargs):
     """reads a .dxf file
     :param filename: string path to .dxf file to read
     :param options: passed to :class:`~dxfgrabber.drawing.Drawing`constructor
     """
     import dxfgrabber
     self.dxf = dxfgrabber.readfile(filename,options)
     self.name = filename
     
     def _iter_dxf(entities, layers, only, ignore, trans, recurse):
         """iterator over dxf or block entities"""
         for e in entities:
             if layers and e.layer not in layers:
                 continue
             if only:
                 if e.dxftype in only:
                     yield e, trans
                 else:
                     continue
             elif e.dxftype in ignore:
                 continue
             elif recurse and e.dxftype == 'INSERT':
                 t2 = trans*Trans(1, e.insert[:2], e.rotation)
                 for e2, t3 in _iter_dxf(self.dxf.blocks[e.name]._entities, layers=None, ignore=ignore, only=None, trans=t2, recurse=recurse):
                     yield e2, t3
             else: 
                 yield e, trans
     
     layers=kwargs.get('layers',None)
     only=kwargs.get('only',[])
     ignore=kwargs.get('only',[])
     for edge,trans in _iter_dxf(self.dxf.entities,layers=layers,only=only,ignore=ignore,trans=Trans(),recurse=True):
         self.append(Entity.from_dxf(edge, trans))   
Exemplo n.º 15
0
    def __init__(self,
                 dxfFileName,
                 layerNamesToImport,
                 getRelativeCoo,
                 threshold=0.01,
                 importLines=True,
                 importSurfaces=True):
        ''' Constructor.

       :param layerNamesToImport: list of regular expressions to be tested.
       :param getRelativeCoo: coordinate transformation to be applied to the
                              points.
    '''
        self.dxfFile = dxfgrabber.readfile(dxfFileName)
        self.layersToImport = self.getLayersToImport(layerNamesToImport)
        self.getRelativeCoo = getRelativeCoo
        self.threshold = threshold
        self.selectKPoints()
        self.labelDict = {}
        self.points = self.importPoints()
        if (importLines):
            self.importLines()
        else:
            self.lines = {}
        if (importSurfaces):
            self.importFaces()
        else:
            self.facesByLayer = {}
Exemplo n.º 16
0
    def __init__(self,dxfFileName,layerNamesToImport, getRelativeCoo, threshold= 0.01,importLines= True, importSurfaces= True, polylinesAsSurfaces= False, tolerance= .01):
        ''' Constructor.

           :param layerNamesToImport: list of regular expressions to be tested.
           :param getRelativeCoo: coordinate transformation to be applied to the
                                  points.
        '''
        self.options= {"grab_blocks":True,"assure_3d_coords":True,"resolve_text_styles":True}
        self.dxfFile= dxfgrabber.readfile(filename= dxfFileName, options= self.options)
        self.tolerance= tolerance
        self.impLines= importLines
        self.impSurfaces= importSurfaces
        self.polylinesAsSurfaces= polylinesAsSurfaces
        self.layersToImport= self.getLayersToImport(layerNamesToImport)
        self.polyfaceQuads= dict()
        self.polylineQuads= dict()
        self.getRelativeCoo= getRelativeCoo
        self.threshold= threshold
        self.labelDict= {}
        self.kPointsNames= self.selectKPoints()
        self.importPoints()
        if(self.impLines):
            self.importLines()
        else:
            self.lines= {}
        if(self.impSurfaces):
            self.importFaces()
        else:
            self.facesByLayer= {}
Exemplo n.º 17
0
    def read_dxf(self):
        t1 = sec()

        print(out(outpth, 'Reading DXF geometry...'), end='\r')
        dxffile = dxf.readfile('{}.dxf'.format(self.title))
        print(out(outpth, '[OK] DXF geometry imported ({} s)'.format(round(sec() - t1, 2))))

        beams = []
        columns = []
        x = 0
        t = len(dxffile.entities)
        # assign LINES elements to columns or beams tables
        for ent in dxffile.entities:
            progressBar('Converting lines', x, t)
            if ent.dxftype == 'LINE':
                if ent.start[2] == ent.end[2]:
                    beams.append(ent)
                else:
                    columns.append(ent)
            x += 1
        print(out(outpth, '[OK] Lines converted                         '))

        # assign 3DFACE elements to shells table
        shells = [ent for ent in dxffile.entities if ent.dxftype == '3DFACE']

        return {'b': beams, 'c': columns, 's': shells, 'f': []}
Exemplo n.º 18
0
 def __init__(self,param):
     self.param = dict(self.DEFAULT_PARAM)
     self.param.update(param)
     try:
         self.dwg = self.param['dwg']
     except KeyError:
         self.dwg = dxfgrabber.readfile(self.param['fileName'])
     self.makeListOfCmds()
Exemplo n.º 19
0
def saveLinesByTypes(filepath):
    #read cad files
    dxf = dxfgrabber.readfile(filepath)

    lines = []
    wall_kw = ['WALL','wall']
    glass_kw = ['窗','WINDOWS','玻璃']
    wood_kw = ['门扇']
    other_kw = ['阴影','垂直面']
    all_kw = wall_kw+glass_kw+wood_kw+other_kw
    #layerkeywordlist = ['窗','WALL','wall','WINDOWS','玻璃','垂直面','门扇','阴影']
    for e in dxf.entities:
        for kw in all_kw:
            if kw not in e.layer:
                continue
            #linestype = -1
            #reduce_dist = 0
            #print(linestype)
            if kw in wall_kw:
                linestype = 0
                #reduce_dist = wall_reduce_dist
            elif kw in glass_kw:
                linestype = 1
                #reduce_dist = glass_reduce_dist
            elif kw in wood_kw:
                linestype = 2
                #reduce_dist = wood_reduce_dist
            else:
                linestype = 3
                #reduce_dist = other_reduce_dist

            if e.dxftype == 'LINE':
                if e.start[0] < 150000:
                    continue
                x1 = round(e.start[0])
                y1 = round(e.start[1])
                x2 = round(e.end[0])
                y2 = round(e.end[1])
                lines.append([x1, y1, x2, y2, linestype])
            elif e.dxftype == 'LWPOLYLINE':
                p = e.points
                for i in range(len(p) - 1):
                    if p[i][0] < 150000:
                        continue
                    lines.append([round(p[i][0]), round(p[i][1]), round(p[i + 1][0]), round(p[i + 1][1]), linestype])
                if e.is_closed:
                    if p[0][1] < 0 or p[0][0] < 150000:
                        continue
                    lines.append([round(p[0][0]), round(p[0][1]), round(p[-1][0]), round(p[-1][1]), linestype])
            break

    nums = len(lines)
    print(nums)
    df = pd.DataFrame(lines)
    print(df)
    save_path = os.getcwd().replace("\\",'/')+"/data/linesDataByMaterials.csv"
    df.to_csv(save_path, index=0, sep=',', header=None)
    print('success')
Exemplo n.º 20
0
def main():
    """Run as a command line program."""

    parser = OptionParser()
    parser.add_option("-f",
                      "--face",
                      dest="face",
                      help="name of face dxf file",
                      metavar="FACEDXF")
    parser.add_option("-t",
                      "--temple",
                      dest="temple",
                      help="name of temple dxf file",
                      metavar="TEMPLEDXF")
    parser.add_option("-n",
                      "--name",
                      dest="name",
                      help="name of hinge",
                      metavar="HINGENAME")
    parser.add_option("-o",
                      "--outfile",
                      dest="outfile",
                      help="name of output file",
                      metavar="OUTFILE")

    (options, args) = parser.parse_args()

    if options.face == None or options.temple == None or options.name == None or options.outfile == None:
        sys.stderr.write("Insufficient arguments.")
        parser.print_help()
        sys.exit(0)

    facedxf = dxfgrabber.readfile(options.face)
    templedxf = dxfgrabber.readfile(options.temple)
    spec = {
        'description': options.name,
        'drill_dia': 1.0,
        'cb_dia': 2.0,
        'cb_depth': 0.5,
        'pocket_depth': 1.0
    }
    process_contour('face', facedxf, spec)
    process_contour('temple', templedxf, spec)
    with open(options.outfile, 'w') as outfile:
        json.dump(spec, outfile)
Exemplo n.º 21
0
def main(filename):
    print('lng,lat,blockname')
    dxf = dxfgrabber.readfile(filename)

    for entity in dxf.entities:
        if entity.dxftype == 'INSERT':
            coords = pyproj.transform(epsg3945, wgs84, entity.insert[0],
                                      entity.insert[1])
            print(repr(coords[0]) + ',' + repr(coords[1]) + ',' + entity.name)
Exemplo n.º 22
0
 def __init__(self, file, layers=None, ignore=[]):
     """reads a .dxf file
     :param file: string path to .dxf file to read
     :param layers: list or dictionary of layers to handle. Empty = all layers
     :param ignore: list of strings of entity types to ignore
     """
     self.dxf=dxfgrabber.readfile(file)
     self.layers=layers
     self.ignore=ignore
Exemplo n.º 23
0
def main(filename):
    print("reading file: {}".format(filename))
    starttime = time.time()
    dxf = dxfgrabber.readfile(filename)
    endtime = time.time()
    print("time to read: {:.2f}s".format(endtime - starttime))
    print("entities: {:d}".format(len(dxf.entities)))
    print("defined Layers: {}".format(len(dxf.layers)))
    print_layers(Counter(entity.layer for entity in dxf.entities))
Exemplo n.º 24
0
def main():
    app = DXFApplication(sys.argv)
    drawing = dxfgrabber.readfile(sys.argv[1])
    w = DXFMainWindow(drawing)
    w.show()
    retcode = app.exec_()
    w = None
    app = None
    return retcode
Exemplo n.º 25
0
 def __init__(self, param):
     self.param = dict(self.DEFAULT_PARAM)
     self.param['laserDIOPin'] = self.LASER_DIO_PIN
     self.param['laserHomeXY'] = self.LASER_HOME_XY
     self.param.update(param)
     try:
         self.dwg = self.param['dwg']
     except KeyError:
         self.dwg = dxfgrabber.readfile(self.param['fileName'])
     self.makeListOfCmds()
Exemplo n.º 26
0
def read_dxf(filename):
    dxf = dxfgrabber.readfile(filename)
    polylines = [poly for poly in dxf.entities if type(poly) is dxfgrabber.dxfentities.LWPolyline]
    paths = []
    for line in polylines:
        path = []
        for pt in line:
            path += [(pt[0]/1000.0, pt[1]/1000.0)]
        paths += [path]
    return paths
Exemplo n.º 27
0
Arquivo: DxfReader.py Projeto: lcpt/xc
 def read(self,dxf_file_name,xc_preprocessor,layers):
   self.dxf= dxfgrabber.readfile(dxf_file_name)
   self.preprocessor= xc_preprocessor
   self.pointHandler= self.preprocessor.getMultiBlockTopology.getPoints
   self.lineHandler= self.preprocessor.getMultiBlockTopology.getLines
   self.pointsInLayer= {}
   self.blocksInLayer= {}
   for l in layers:
     self.pointsInLayer[l]= self.read_points(self.dxf.entities,l)
     self.blocksInLayer[l]= self.read_lines(self.dxf.entities,l)
Exemplo n.º 28
0
 def read(self,dxf_file_name,xc_preprocessor,layers):
   self.dxf= dxfgrabber.readfile(dxf_file_name)
   self.preprocessor= xc_preprocessor
   self.pointHandler= self.preprocessor.getMultiBlockTopology.getPoints
   self.lineHandler= self.preprocessor.getMultiBlockTopology.getLines
   self.pointsInLayer= {}
   self.blocksInLayer= {}
   for l in layers:
     self.pointsInLayer[l]= self.read_points(self.dxf.entities,l)
     self.blocksInLayer[l]= self.read_lines(self.dxf.entities,l)
Exemplo n.º 29
0
    def test_open_proe_ac1018(self):
        dwg = dxfgrabber.readfile("D:\Source\dxftest\ProE_AC1018.dxf")
        modelspace = list(dwg.modelspace())

        # are there entities in model space
        self.assertEqual(17, len(modelspace))

        # can you get entities
        lines = [entity for entity in modelspace if entity.dxftype == 'LINE']
        self.assertEqual(12, len(lines))
Exemplo n.º 30
0
    def __init__(self, dxf_path):
        self.dxf_path = dxf_path #'../客流点位图-F.dxf'
        dxf = dxfgrabber.readfile(self.dxf_path)
        ids = [e for e in dxf.entities if e.layer == 'ID' and (e.dxftype == 'TEXT' or e.dxftype == 'MTEXT')]
        bounds = [e for e in dxf.entities if e.layer == 'Bounds' and e.dxftype == 'LWPOLYLINE']
        self.bounds = np.array([e.points for e in bounds])

        self.ids_center = np.array([self.get_mtext_center(e,dxf.styles.get(e.style).width) if e.dxftype == 'MTEXT' else self.get_text_center(e) for e in ids])
        self.bounds_center = np.array([self.get_centerpoint(bound) for bound in bounds])
        self.ids_text = [self.get_text(e) for e in ids]
Exemplo n.º 31
0
    def read(self):
        self.dxf = dxfgrabber.readfile(self.file)
        self.objects = [
            entity for entity in self.dxf.entities
            if entity.layer == self.layer
        ]  #and entity.dxftype=='LINE' or entity.dxftype=='LINE' ]
        self.objects = [
            entity for entity in self.objects
            if entity.dxftype == 'LINE' or entity.dxftype == 'POLYLINE'
        ]
        #x=np.array[entity.points]

        self.x = np.array([])
        self.y = np.array([])
        self.przerwyX = []

        for i, entity in enumerate(self.objects):
            if entity.dxftype == "POLYLINE":
                x = np.array(
                    [entity.points[i][0] for i in range(len(entity.points))])
                y = np.array(
                    [entity.points[i][1] for i in range(len(entity.points))])

            elif entity.dxftype == "LINE":
                #assert entity.start[0]<entity.end[0], "Jakas linia ma odwrocona kolejnosc start-end"

                x = np.array([entity.start[0], entity.end[0]])
                y = np.array([entity.start[1], entity.end[1]])

            if i == 0:
                pass
            else:
                if abs(x.min() - self.x.max()) < 10:
                    pass  #Jest zachowana ciaglosc
                else:
                    self.przerwyX.append([self.x.max(), x.min()])

            self.x = np.append(self.x, x)
            self.y = np.append(self.y, y)

        self.xy = np.column_stack((self.x, self.y))
        self.xy = sorted(self.xy, key=lambda k: [k[0], k[1]])

        self.xymin = self.xy[0]

        self.x = self.x - self.xymin[0] + self.startKm
        self.x = self.x / self.xScale

        self.y = self.y - self.xymin[1]
        self.y = self.y / self.yScale + self.startLevel

        self.przerwyX = (np.array(self.przerwyX) - self.xymin[0] +
                         self.startKm) / self.xScale

        self.interline = interpolate.interp1d(self.x, self.y, kind="linear")
Exemplo n.º 32
0
    def Open(self):
        name = askopenfilename(
            initialdir=
            "D:/Users/BENDJOUDI/Documents/Documents/GithubMaster/Interface/",
            filetypes=(("CSV File", "*.dxf"), ("All Files", "*.*")),
            title="Choose a file.")

        import dxfgrabber
        dwg = dxfgrabber.readfile(name)
        print("DXF version:{} ".format(dwg.dxfversion))

        layer_names = dwg.layers.names()
        all_layers = {}
        entitie = [entity for entity in dwg.entities]

        for n in layer_names:
            all_layers.update({str(n) : [entity for entity in dwg.entities if (entity.layer == str(n)) and (entity.dxftype == 'LWPOLYLINE' or entity.dxftype == 'SOLID') \
                               and entity.layer != 'CARTOUCHE' and entity.layer != 'S_ZONE___E'  and entity.layer != 'LEGENDE' and entity.layer != 'C_PLA_KR_T']})

        layers_list = {
            i: all_layers[i]
            for i in all_layers if all_layers[i] != []
        }

        for key in layers_list:
            color = []
            for e in layers_list[key]:
                color.append(e.color)

        self.NewPlan()

        l = {}
        for key in layers_list:
            f = []
            for e in layers_list[key]:
                k = []
                for i in e.points:
                    k.append((i[0] / 300, -i[1] / 300))
                f.append(k)
                l.update({key: f})
        i = 0
        for key in l:
            i += 1
            for e in range(len(l[key])):

                self.canvas.create_polygon(
                    l[key][e],
                    outline=self.color[i]["hexString"],
                    fill=self.color[i]["hexString"],
                    tags=[str(self.color[i]['colorId']),
                          str(key)])
                print('i = ', i)

        return name
Exemplo n.º 33
0
    def __init__(self,dxf_path):
        print('***dxfProcessor inited:')
        self.dxf = dxfgrabber.readfile(dxf_path)
        self.dxf_path = dxf_path
        self.entities = [e for e in self.dxf.entities if (e.layer != 'ID' and e.layer !='Bounds')]
        self.line = self.get_line(self.entities)
        self.arc = self.get_arc(self.entities)
        self.ellipse = self.get_ellipse(self.entities)
        self.lwpline = self.get_lwpline(self.entities)

        self.xa, self.xi, self.ya, self.yi = self.set_boundary(self.line)
        print('***dxfProcessor finished:')
Exemplo n.º 34
0
    def __init__(self, dxfpath, dico_dxf, tipo, txt=''):
        u""" Uses OGR functions to extract basic informations about
        geographic vector file (handles shapefile or MapInfo tables)
        and store into dictionaries.

        dxfpath = path to the File Geodatabase Esri
        dico_dxf = dictionary for global informations
        dico_fields = dictionary for the fields' informations
        li_fieds = ordered list of fields
        tipo = format
        text = dictionary of text in the selected language

        """
        # opening
        dxf = dxfgrabber.readfile(dxfpath)

        # AutoCAD version
        dico_dxf['version_code'] = dxf.dxfversion
        # see: http://dxfgrabber.readthedocs.org/en/latest/#Drawing.dxfversion
        if dxf.dxfversion == 'AC1009':
            dico_dxf['version_name'] = 'AutoCAD R12'
        elif dxf.dxfversion == 'AC1015':
            dico_dxf['version_name'] = 'AutoCAD R2000'
        elif dxf.dxfversion == 'AC1018':
            dico_dxf['version_name'] = 'AutoCAD R2004'
        elif dxf.dxfversion == 'AC1021':
            dico_dxf['version_name'] = 'AutoCAD R2007'
        elif dxf.dxfversion == 'AC1024':
            dico_dxf['version_name'] = 'AutoCAD R2010'
        elif dxf.dxfversion == 'AC1027':
            dico_dxf['version_name'] = 'AutoCAD R2013'
        else:
            dico_dxf['version_name'] = 'NR'

        # headers
        dico_dxf['headers_var_count'] = len(dxf.header)

        # layers count
        dico_dxf['layers_count'] = len(dxf.layers)

        # entities count
        dico_dxf['entities_count'] = len(dxf.entities)

        # blocs count
        dico_dxf['blocks_count'] = len(dxf.blocks)

        # encoding
        dico_dxf['encoding'] = dxf.encoding

        # entities
        dico_dxf['entities'] = [
            entity for entity in dxf.entities if entity.layer == '1'
        ]
Exemplo n.º 35
0
 def print_all_entity_reprs(filename, output):
     dxf = dxfgrabber.readfile(filename)
     all_entities = [entity for entity in dxf.entities]
     for block in dxf.blocks:
         for entity in block:
             all_entities.append(entity)
     for e in all_entities:
         if sys.version_info[0] == 2:
             value = str(e).decode('utf-8') + "\t" + repr(e).decode('utf-8')
         else:
             value = str(e) + "\t" + repr(e)
         output.write(value.encode('utf-8'))
         output.write(os.linesep.encode())
Exemplo n.º 36
0
    def __init__(self, dxfpath, dico_dxf, tipo, txt=''):
        u""" Uses OGR functions to extract basic informations about
        geographic vector file (handles shapefile or MapInfo tables)
        and store into dictionaries.

        dxfpath = path to the File Geodatabase Esri
        dico_dxf = dictionary for global informations
        dico_fields = dictionary for the fields' informations
        li_fieds = ordered list of fields
        tipo = format
        text = dictionary of text in the selected language

        """
        # opening
        dxf = dxfgrabber.readfile(dxfpath)

        # AutoCAD version
        dico_dxf['version_code'] = dxf.dxfversion
        # see: http://dxfgrabber.readthedocs.org/en/latest/#Drawing.dxfversion
        if dxf.dxfversion == 'AC1009':
            dico_dxf['version_name'] = 'AutoCAD R12'
        elif dxf.dxfversion == 'AC1015':
            dico_dxf['version_name'] = 'AutoCAD R2000'
        elif dxf.dxfversion == 'AC1018':
            dico_dxf['version_name'] = 'AutoCAD R2004'
        elif dxf.dxfversion == 'AC1021':
            dico_dxf['version_name'] = 'AutoCAD R2007'
        elif dxf.dxfversion == 'AC1024':
            dico_dxf['version_name'] = 'AutoCAD R2010'
        elif dxf.dxfversion == 'AC1027':
            dico_dxf['version_name'] = 'AutoCAD R2013'
        else:
            dico_dxf['version_name'] = 'NR'

        # headers
        dico_dxf['headers_var_count'] = len(dxf.header)

        # layers count
        dico_dxf['layers_count'] = len(dxf.layers)

        # entities count
        dico_dxf['entities_count'] = len(dxf.entities)

        # blocs count
        dico_dxf['blocks_count'] = len(dxf.blocks)

        # encoding
        dico_dxf['encoding'] = dxf.encoding

        # entities
        dico_dxf['entities'] = [entity for entity in dxf.entities if entity.layer == '1']
Exemplo n.º 37
0
def libdxfgrabber(request):
    now = datetime.datetime.now()
    logging.basicConfig(filename='log/libdxfgrabber.log', level=logging.INFO) 
    logging.info( "" ) 
    logging.info(' #------------------------------------------------# ') 
    logging.info( now ) 
    logging.info(' # Begin Views Function ==>  Library dxfgrabber ') 
    logging.info( "" ) 
    dxfg = dxfgrabber.readfile("dxffiles/habitacion.dxf") 
#    dxf = dxfgrabber.readfile("dxffiles/pared.dxf");
#    dxf = dxfgrabber.readfile("dxffiles/hostel.dxf") 
    logging.info( "" )
    logging.info(' #------------------------------------------------# ') 
    logging.info(' # DXF information: ') 
    dxfg_version = dxfg.dxfversion
    logging.info(' # Version [ %s ] ', dxfg_version) 
    dxfversiong = dxfg.header['$ACADVER']
#    header_var_count = len(dxf.header) # dict of dxf header vars
#    logging.info(' # Nº vars header [ %d ] ', header_var_count) 
    layer_count = len(dxfg.layers) # collection of layer definitions
    logging.info(' # Nº vars layer [ %d ] ', layer_count) 
    block_definition_count = len(dxfg.blocks) #  dict like collection of block definitions
    logging.info(' # Nº vars count definition [ %d ] ', block_definition_count) 
    entity_count = len(dxfg.entities)
    logging.info(' # Nº vars entities [ %d ] ', entity_count) 
    logging.info(' # Codificación dibujo [ %s ] ', dxfg.encoding) 
    namefile = dxfg.filename 
    logging.info(' # Nombre fichero [ %s ] ', namefile) 
    logging.info(' #------------------------------------------------# ') 

    modelspace = dxfg.modelspace() 
    j = 1
    logging.info( "" ) 
    logging.info(' # End Views Function   ==>  Library dxfgrabber ') 
    logging.info(' #------------------------------------------------# ') 
    logging.info( "" ) 
    for e in modelspace: 
#        tipo = e.dxftype()
#        logging.info( " tipo %s", tipo )
#        logging.info(' # Layer      [ %s ] ', e.dxfg.layer) 
        logging.info( " modelspace [ %d ]" %j)
        logging.info( "" )
        j = j + 1 

    return render_to_response('libdxfgrabber/dxfhomedxfgrab.html', locals())
Exemplo n.º 38
0
def rdxf(filename):
    dxf = dxfgrabber.readfile(filename)

    x_max, x_min, y_max, y_min = -float('inf'), float('inf'), -float('inf'), float('inf')

    for e in dxf.entities:

        typename = e.dxftype
        print(typename)

        if typename == 'LWPOLYLINE':

            # update boundary
            x_max, y_max = np.max((np.max(e.points, 0), (x_max, y_max)), 0)
            x_min, y_min = np.min((np.min(e.points, 0), (x_min, y_min)), 0)

        elif typename == 'LINE':

            # update boundary
            x_max, y_max = np.max((np.max((e.start, e.end), 0), (x_max, y_max)), 0)
            x_min, y_min = np.min((np.min((e.start, e.end), 0), (x_min, y_min)), 0)

        elif typename == 'SPLINE':

            # update boundary
            cpoints = np.array(e.controlpoints)
            x_max, y_max = np.max((np.max(cpoints[:, (0,1)], 0), (x_max, y_max)), 0)
            x_min, y_min = np.min((np.min(cpoints[:, (0,1)], 0), (x_min, y_min)), 0)

            print('n_ctrlp: %d' % len(e.controlpoints))
            w = e.weights
            for (i, pt) in enumerate(e.controlpoints):
                print('ctrlp: %f %f %f' % (pt[0]*w[i], pt[1]*w[i], pt[2]*w[i]))
            for (index, knot) in enumerate(e.knots):
                print('knot: %f' % (knot))
            print('u_min: %f' % e.knots[0])
            print('u_max: %f' % e.knots[-1])
            pass

        else:

            print('Not Implemented')

    print('x_max: {}\ny_max: {}'.format(x_max, y_max))
    print('x_min: {}\ny_min: {}'.format(x_min, y_min))
Exemplo n.º 39
0
def export_zt():
    p = ur'H:\work\云南接图表.dxf'
    p1 = ur'H:\work\yn_tiles_index.json'
    p2 = ur'H:\work\yn_tiles_index_zt.json'
    
    dxf = dxfgrabber.readfile(p)
    print("DXF version: {%s}" % str(dxf.dxfversion))
    cnt = 0
    l = []
    #d = {}
    coordlist = {}
    for entity in dxf.entities:
        if entity.layer=='0':
            cnt += 1
            d = {}
            if hasattr(entity, 'points'):
                #print('len(entity.points)=%d' %  len(entity.points))
                if len(entity.points) == 4:
                    coordlist['ld'] = entity.points[0]
                    coordlist['rd'] = entity.points[1]
                    coordlist['ru'] = entity.points[2]
                    coordlist['lu'] = entity.points[3]
            if hasattr(entity, 'text'):
                if len(coordlist.keys())>0:
                    d[entity.text] = coordlist
            if len(d.keys())>0:
                l.append(d)
                coordlist = {}
                
                
    with open(p1, 'w') as f:
        f.write(json.dumps(l))
    d = {}
    for i in l:
        key = i.keys()[0]
        keyintrow = int(key[0:3])
        keyintcol = int(key[3:])
        if keyintrow <= 34 and keyintrow + keyintcol >= 62:
            d[key] = i[key]
    with open(p2, 'w') as f:
        f.write(json.dumps(d))
    print(len(d.keys()))
Exemplo n.º 40
0
def to_polygon(filename):
    """Returns list of [x,y] points from DXF."""

    dxf = dxfgrabber.readfile(filename)

    points = []

    for e in dxf.entities:
        if isinstance(e, dxfgrabber.entities.Line):
            points += line_to_points(e)
        elif isinstance(e, dxfgrabber.entities.Polyline):
            points += polyline_to_points(e)
        elif isinstance(e, dxfgrabber.entities.Arc):
            points += arc_to_points(e)
        elif isinstance(e, dxfgrabber.entities.Circle):
            pass
        else:
            raise Exception("Unrecognized DXF entity %s." % str(e))

    return filter_duplicate_points(points)
Exemplo n.º 41
0
Arquivo: DxfReader.py Projeto: lcpt/xc
  def __init__(self,dxfFileName,layerNamesToImport, getRelativeCoo, threshold= 0.01,importLines= True, importSurfaces= True):
    ''' Constructor.

       :param layerNamesToImport: list of regular expressions to be tested.
       :param getRelativeCoo: coordinate transformation to be applied to the
                              points.
    '''
    self.dxfFile= dxfgrabber.readfile(dxfFileName)
    self.layersToImport= self.getLayersToImport(layerNamesToImport)
    self.getRelativeCoo= getRelativeCoo
    self.threshold= threshold
    self.selectKPoints()
    self.labelDict= {}
    self.points= self.importPoints()
    if(importLines):
      self.importLines()
    else:
      self.lines= {}
    if(importSurfaces):
      self.importFaces()
    else:
      self.facesByLayer= {}
Exemplo n.º 42
0
    def LoadDXF(self):

        # Loads the dxf-file selected in the DXFInputBox, checks all entities in the file and appends those with the 
        # dxftype 'POLYLINE' (a set of points interpolated by lines) to a list. The points of the first polyline are
        # then loaded into the instruction list. NOTE: ALL POINTS WITH Z-COORDINATES LESS THAN 0,5m WILL HAVE THEIR
        # Z-COORDINATE SET TO 0,5 WHEN LOADED!

        dxf = dxfgrabber.readfile(self.pwd + '/src/kampala/gui/src/gui/DXFFiles/' + self._widget.DXFInputBox.currentText())
        allpolylines = [entity for entity in dxf.entities.__iter__() if entity.dxftype == 'POLYLINE']
        if allpolylines != []:
            linepoints = allpolylines[0].points
            self._widget.Pointlist.clear()
            self.pointlist = []
            for point in linepoints:
                if point[2] < 0.5:
                    safepoint = [round(point[0],3),round(point[1],3),0.5]
                else:
                    safepoint = [round(point[0],3),round(point[1],3),round(point[2])]
                self.pointlist.append(['go to: ',safepoint])
                self._widget.Pointlist.insertItem(len(self.pointlist),'go to: ' + str(safepoint[0]) + ',' + str(safepoint[1]) + ',' + str(safepoint[2]))
        else:
            rospy.logwarn("no points in the selected DXFFile")
Exemplo n.º 43
0
def showDialog():
    workdir = json.loads("settings.json")
    filename = Qt.QFileDialog.getOpenFileName(mainWindow, "Open_file", workdir["workdirectory"], "*.dxf")
    try:
        dxf = dxfgrabber.readfile(filename)
    except DXFStructureError:
        msgError = Qt.QErrorMessage()
        msgError.showMessage("Неверная структура DXF файла! "+"Введите координаты в ручном режиме.")
    all_entety = [enity for enity in dxf.entities]
    all_rastr = []
    name = combobox.itemText(combobox.currentIndex())
    # Чтение координат из файла
    for i in all_entety:
        # Ищем координаты только полилиний (Такое чувство, что есть еще какой то тип)
        if i.__class__ == dxfgrabber.dxfentities.Polyline or i.__class__ == dxfgrabber.dxfentities.LWPolyline:
            for j in i.points:
                coord_x = float(round(list(j)[0], 2))
                coord_y = float(round(list(j)[1], 2))
                # Добавление номера растра полученного из findrastres(почему то не всегда точно получаем номер)
                all_rastr.append(findrastres(name, coord_x, coord_y))
        elif i.__class__ == dxfgrabber.dxfentities.Point:
            coord_x = float(round(list(i.point)[0], 2))
            coord_y = float(round(list(i.point)[1], 2))
            if coord_x != 1323201.82 and coord_y != 416377.63:
        # Добавление номера растра полученного из findrastres(почему то не всегда точно получаем номер)
                all_rastr.append(findrastres(name, coord_x, coord_y))
        else:
            answer.setText("Не допустимые линии на чертеже!")
    # исключаем одинаковые растры
    all_rastr = set(all_rastr)
    all_rastr = list(all_rastr)
    if len(all_rastr) == 1:
        answer.setText(str(all_rastr[0]))
    else:
        text = str(all_rastr[0])
        for i in range(1,len(all_rastr)):
            text = text + ", " + all_rastr[i]
        answer.setText(text)
Exemplo n.º 44
0
    def load(self, path):
        dbgfname()
        dxf = dxfgrabber.readfile(path)
        debug("  DXF version: {}".format(dxf.dxfversion))
        header_var_count = len(dxf.header) # dict of dxf header vars
        layer_count = len(dxf.layers) # collection of layer definitions
        block_definition_count = len(dxf.blocks) #  dict like collection of block definitions
        entity_count = len(dxf.entities) # list like collection of entities
        blocks = dxf.blocks
        paths = []
        entities = [e for e in dxf.entities]
        p = Path(Singleton.state, [], "ungrouped", Singleton.state.settings.get_def_lt().name)
        for e in entities:
            if self.__is_basic(e):
                self.__basic_el(e, p, None, dxf.layers, None, None)
            elif e.dxftype == DXFEnum.insert:
                block_name = e.name
                offset = e.insert[:2]
                rotation = e.rotation
                scale = e.scale[:2]
                tp = Path(Singleton.state, [], block_name, Singleton.state.settings.get_def_lt().name)
                for b in dxf.blocks:
                    if b.name == block_name:
                        for e in b:
                            if self.__is_basic(e):
                                self.__basic_el(e, tp, offset, dxf.layers, b, scale, rotation)
                            else:
                                debug("  Unknown type: "+str(e.dxftype))
                                debug("  "+str(e))
                paths.append(tp)
            else:
                debug("  Unknown type: "+str(e.dxftype))
                debug("  "+str(e))
        if len(p.elements)>0:
            paths.append(p)

        return paths
Exemplo n.º 45
0
def rdxf(filename):
    dxf = dxfgrabber.readfile(filename)

    for e in dxf.entities:

        typename = e.dxftype
        print(typename)

        if typename == 'SPLINE':

            #print(e.__dict__)
            print('n_ctrlp: %d' % len(e.controlpoints))
            w = e.weights
            for (i, pt) in enumerate(e.controlpoints):
                print('ctrlp: %f %f %f' % (pt[0]*w[i], pt[1]*w[i], pt[2]*w[i]))
            for (index, knot) in enumerate(e.knots):
                print('knot: %f' % (knot))
            print('u_min: %f' % e.knots[0])
            print('u_max: %f' % e.knots[-1])
            pass

        else:

            print('Not Implemented')
Exemplo n.º 46
0
    def read_dxf(self, filename, options=None, **kwargs):
        """reads a .dxf file
        :param filename: string path to .dxf file to read
        :param options: passed to :class:`~dxfgrabber.drawing.Drawing`constructor
        :param kwargs: dict of optional parameters passed to :method:`Group.from_dxf`
        """
        try:
            import dxfgrabber
            self.dxf = dxfgrabber.readfile(filename,options)
        except ImportError:
            logging.error('optional module dxfgrabber required')
            return
        except Exception as e:
            logging.error('could not read %s : %s'%(filename,e))
            return
        self.name = filename

        #build dictionary of blocks
        self.block={}
        for block in self.dxf.blocks:
            self.block[block.name]=Group().from_dxf(block._entities, **kwargs)

        super(Drawing, self).from_dxf(self.dxf.entities, **kwargs)
        return self
Exemplo n.º 47
0
    def __init__(self, dxfpath, dico_dxf, tipo, txt=''):
        u""" Uses OGR functions to extract basic informations about
        geographic vector file (handles shapefile or MapInfo tables)
        and store into dictionaries.

        dxfpath = path to the DXF file
        dico_dxf = dictionary for global informations
        tipo = format
        text = dictionary of text in the selected language
        """
        # changing working directory to layer folder
        chdir(path.dirname(dxfpath))

        # raising GDAL/OGR specific exceptions
        ogr.UseExceptions()
        self.alert = 0

        # opening DXF
        dr_dxf = ogr.GetDriverByName("DXF")
        try:
            dxf = dr_dxf.Open(dxfpath, 0)
        except Exception as e:
            print(e)
            return

        # check if DXF is OGR friendly
        if dxf is None:
            self.alert += 1
            self.erratum(dico_dxf, dxfpath, u'err_incomp')
            return
        else:
            pass

        # DXF name and parent folder
        dico_dxf['name'] = path.basename(dxf.GetName())
        dico_dxf['folder'] = path.dirname(dxf.GetName())

        # opening
        douxef = dxfgrabber.readfile(dxfpath)

        # AutoCAD version
        dico_dxf['version_code'] = douxef.dxfversion
        # see: http://dxfgrabber.readthedocs.org/en/latest/#Drawing.dxfversion
        if douxef.dxfversion == 'AC1009':
            dico_dxf['version_name'] = 'AutoCAD R12'
        elif douxef.dxfversion == 'AC1015':
            dico_dxf['version_name'] = 'AutoCAD R2000'
        elif douxef.dxfversion == 'AC1018':
            dico_dxf['version_name'] = 'AutoCAD R2004'
        elif douxef.dxfversion == 'AC1021':
            dico_dxf['version_name'] = 'AutoCAD R2007'
        elif douxef.dxfversion == 'AC1024':
            dico_dxf['version_name'] = 'AutoCAD R2010'
        elif douxef.dxfversion == 'AC1027':
            dico_dxf['version_name'] = 'AutoCAD R2013'
        else:
            dico_dxf['version_name'] = 'NR'

        # layers count and names
        dico_dxf['layers_count'] = dxf.GetLayerCount()
        li_layers_names = []
        li_layers_idx = []
        dico_dxf['layers_names'] = li_layers_names
        dico_dxf['layers_idx'] = li_layers_idx

        # dependencies
        dependencies = [f for f in listdir(path.dirname(dxfpath))
                        if path.splitext(path.abspath(f))[0] == path.splitext(dxfpath)[0]
                        and not path.splitext(path.abspath(f).lower())[1] == ".dxf"]
        dico_dxf[u'dependencies'] = dependencies

        # cumulated size
        dependencies.append(dxfpath)
        total_size = sum([path.getsize(f) for f in dependencies])
        dico_dxf[u"total_size"] = self.sizeof(total_size)
        dependencies.pop(-1)

        # global dates
        dico_dxf[u'date_actu'] = strftime('%d/%m/%Y',
                                          localtime(path.getmtime(dxfpath)))
        dico_dxf[u'date_crea'] = strftime('%d/%m/%Y',
                                          localtime(path.getctime(dxfpath)))
        # total fields count
        total_fields = 0
        dico_dxf['total_fields'] = total_fields
        # total objects count
        total_objs = 0
        dico_dxf['total_objs'] = total_objs
        # parsing layers
        for layer_idx in range(dxf.GetLayerCount()):
            # dictionary where will be stored informations
            dico_layer = OD()
            # parent DXF
            dico_layer['dxf_name'] = path.basename(dxf.GetName())
            # getting layer object
            layer = dxf.GetLayerByIndex(layer_idx)
            # layer name
            li_layers_names.append(layer.GetName())
            # layer index
            li_layers_idx.append(layer_idx)
            # getting layer globlal informations
            self.infos_basics(layer, dico_layer, txt)
            # storing layer into the DXF dictionary
            dico_dxf['{0}_{1}'.format(layer_idx,
                                      layer.GetName())] = dico_layer
            # summing fields number
            total_fields += dico_layer.get(u'num_fields')
            # summing objects number
            total_objs += dico_layer.get(u'num_obj')
            # deleting dictionary to ensure having cleared space
            del dico_layer
        # storing fileds and objects sum
        dico_dxf['total_fields'] = total_fields
        dico_dxf['total_objs'] = total_objs
Exemplo n.º 48
0
    def __load_dxf(self):
        """Loads in a dxf file and returns a list of parts

        Returns:
            list: list of Part
        """
        print('Loading file: %s' % self.__fname)
        dwg = dxfgrabber.readfile(self.__fname)
        lines = [item for item in dwg.entities if item.dxftype == 'LINE']
        arcs = [item for item in dwg.entities if item.dxftype == 'ARC']
        if self.__layer > -1:
            lines = [item for item in lines if item.layer == self.__layer]
            arcs = [item for item in arcs if item.layer == self.__layer]
        print('File read.')
        print('Loaded %i lines' % len(lines))
        print('Loaded %i arcs' % len(arcs))

        # get all points and Line and Arc using pycalculix entities
        all_points, all_lines = self.__get_pts_lines(lines, arcs)
        # the index of the point in the set can be used as a hash
        lines_from_ptind = {}
        for line in all_lines:
            ind1 = all_points.index(line.pt(0))
            ind2 = all_points.index(line.pt(1))
            for ind in [ind1, ind2]:
                if ind not in lines_from_ptind:
                    lines_from_ptind[ind] = [line]
                else:
                    if line not in lines_from_ptind[ind]:
                        lines_from_ptind[ind].append(line)

        # make line loops now
        loops = []
        line = all_lines[0]
        this_loop = geometry.LineLoop()
        while len(all_lines) > 0:
            this_loop.append(line)
            if line in all_lines:
                all_lines.remove(line)
            point = line.pt(1)
            ind = all_points.index(point)
            pt_lines = lines_from_ptind[ind]
            if line in pt_lines:
                pt_lines.remove(line)
            if len(pt_lines) == 1:
                # we have the next line
                next_line = pt_lines[0]
                if line.pt(1) != next_line.pt(0):
                    next_line.reverse()
                line = next_line
            elif len(pt_lines) > 1:
                print('One point was connected to > 2 lines.')
                print('Only import simple part loops, or surfaces.')
            if this_loop.closed == True:
                loops.append(this_loop)
                this_loop = geometry.LineLoop()

        # check loops to see if one is inside another
        # if no loops inside self, then self is a part
        # each part in parts is a list of line loops [exterior, hole1, hole2]
        parts = []
        for ind, loop in enumerate(loops):
            other_loops = loops[ind+1:]
            is_exterior = True
            for other_loop in other_loops:
                if loop.inside(other_loop):
                    is_exterior = False
                    break
            if is_exterior:
                # exterior must be clockwise
                if loop.ccw == True:
                    loop.reverse()
                parts.append(loop)
        # remove the exterior loops from our loops list
        for loop in parts:
            loops.remove(loop)
        # now place the child loops under the part exterior loops
        for ind in range(len(parts)):
            exterior_loop = parts[ind]
            holes = []
            # find child holes
            for loop in loops:
                if loop.inside(exterior_loop):
                    # holes must be ccw
                    loop.hole = True
                    if loop.ccw == False:
                        loop.reverse()
                    holes.append(loop)
            loop_list = [exterior_loop] + holes
            parts[ind] = loop_list
            # remove child holes from loop list
            for hole in holes:
                loops.remove(hole)

        # make parts
        parts_list = []
        for part_loops in parts:
            this_part = partmodule.Part(self.__fea)
            for ind, loop in enumerate(part_loops):
                is_hole = loop.hole
                start = loop[0].pt(0)
                this_part.goto(start.x, start.y, is_hole)
                for item in loop:
                    if isinstance(item, geometry.Line):
                        end = item.pt(1)
                        this_part.draw_line_to(end.x, end.y)
                    elif isinstance(item, geometry.Arc):
                        end = item.pt(1)
                        center = item.actr
                        this_part.draw_arc(end.x, end.y, center.x, center.y)
            parts_list.append(this_part)
        print('Parts created: %i' % len(parts_list))
        return parts_list
Exemplo n.º 49
0
def dxfToPostgis(nameTable, dxfFile):
    #dxf = dxfgrabber('KN848832_3_2_I.dxf') # katastralna mapa
    dxf = dxfgrabber.readfile(dxfFile) # vykres sa musi nachadzat pri skripte

    #entities = dxf.modelspace()
    layers = dxf.layers         # zoznam pouzitych vrstiev vo vykrese
    entities = dxf.entities     # zoznam prvkov vo vykrese
    #print("DXF version: {}".format(dxf.dxfversion))  # dxf version
    header_var_count = len(dxf.header)  # dict of dxf header vars
    layer_count = len(dxf.layers)  # collection of layer definitions
    block_definition_count = len(dxf.blocks)  # dict like collection of block definitions
    entity_count = len(dxf.entities)  # list like collection of entities
    #print entity_count
    connection = psycopg2.connect(DB)  # pripoenie k db
    connection.autocommit = True
    cursor = connection.cursor()
    '''
    for layer in layers:
        layerName = (layer.name).replace("-", "_")
        if layerName == '0':
            continue
        print layerName
    '''
    cursor.execute("DROP TABLE IF EXISTS " + nameTable)
    cursor.execute("CREATE TABLE " + nameTable + " (ID INT NOT NULL, typ CHAR(50),geom GEOMETRY, PRIMARY KEY (ID))")

    id = 1
    # pocitadla entit
    line_count, polyline_count, pw_polyline_count, arc_count, ellipse_count, circle_count, point_count, dsolid, dface_count, k = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    geometry = []
    c =1
    for entity in entities:  # vyber entit podla typu
        #print c, entity.dxftype
        c=c+1
        k=k+1
        #print entity.dxftype
        '''
        if entity.dxftype == "POINT":
            point_count = point_count + 1
            point = ogr.Geometry(ogr.wkbPoint)
            point.AddPoint(entity.point[0], entity.point[1])
            wkt = point.ExportToWkt()
            cursor.execute("INSERT INTO " + nameTable + " (ID, typ, geom)" + "VALUES (%s, %s, ST_GeometryFromText(%s))",
                           (id, entity.dxftype, wkt, epsg))
            id = id+1
            '''
        if entity.dxftype == "LINE":
            line_count = line_count+1
            line = ogr.Geometry(ogr.wkbLineString)
            start = entity.start
            end = entity.end
            #print start, end
            line.AddPoint(start[0], start[1], start[2])
            line.AddPoint(end[0], end[1], end[2])
            wkt = line.ExportToWkt()
            cursor.execute("INSERT INTO " + nameTable + " (ID, typ, geom) " + "VALUES(%s, %s, ST_GeometryFromText(%s))",
                           (id, entity.dxftype, wkt))
            id = id + 1
            geometry.append(wkt)

        elif entity.dxftype == "POLYLINE":
            polyline_count = polyline_count+1
            vertices = entity.points
            vertices_count = len(vertices)
            line = ogr.Geometry(ogr.wkbLineString)
            for i in range(vertices_count):
                line.AddPoint(vertices[i][0],vertices[i][1],vertices[i][2])
                wkt = line.ExportToWkt()
            cursor.execute("INSERT INTO " + nameTable + " (ID, typ, geom) " + "VALUES(%s, %s, ST_GeometryFromText(%s))",
                           (id, entity.dxftype, wkt))
            id = id + 1
            geometry.append(wkt)

        elif entity.dxftype == "LWPOLYLINE":
            pw_polyline_count = pw_polyline_count+1
            vertices = entity.points
            vertices_count = len(vertices)
            line = ogr.Geometry(ogr.wkbLineString)
            for i in range(vertices_count):
                line.AddPoint(vertices[i][0],vertices[i][1])
                wkt = line.ExportToWkt()
            cursor.execute("INSERT INTO " + nameTable + " (ID, typ, geom) " + "VALUES(%s, %s, ST_GeometryFromText(%s))",
                           (id, entity.dxftype, wkt))
            id = id + 1
            geometry.append(wkt)

        elif entity.dxftype == "ARC":
            arc_count = arc_count+1
            centerPoint = Point(entity.center[0], entity.center[1], entity.center[2])
            #print"arc", centerPoint.getX(), centerPoint.getY(), centerPoint.getZ()
            radius = entity.radius
            start_angle = entity.start_angle             #entity.start_angle
            end_angle = entity.end_angle                 #entity.end_angle
            #endPoint = Point(centerPoint.getX()+(radius * m.cos(end_angle)), centerPoint.getY() + (radius * m.sin(end_angle)), entity.center[2])
            line = ogr.Geometry(ogr.wkbLineString)
            range_angle = end_angle-start_angle
            if range_angle < 0:
                range_angle = range_angle+(360)
            while start_angle < (entity.start_angle+range_angle):
                p = Point(centerPoint.getX()+(radius * m.cos(m.radians(start_angle))), centerPoint.getY()+(radius * m.sin(m.radians(start_angle))), entity.center[2])
                line.AddPoint(p.getX(), p.getY())
                start_angle = start_angle + m.radians(1)
            wkt = line.ExportToWkt()
            #print wkt
            cursor.execute("INSERT INTO " + nameTable + " (ID, typ, geom)" + "VALUES(%s, %s, ST_GeometryFromText(%s))",
                           (id, entity.dxftype, wkt))
            id = id + 1
            geometry.append(wkt)

        elif entity.dxftype == "ELLIPSE":
            ellipse_count = ellipse_count+1
            centerPoint = Point(entity.center[0], entity.center[1], entity.center[2])
            majorAxisPoint = Point(entity.major_axis[0], entity.major_axis[1], entity.major_axis[2])
            start_param = entity.start_param
            end_param = entity.end_param
            line = ogr.Geometry(ogr.wkbLineString)
            #print "start_par: ", start_param, "end_param: ", end_param
            #print "ellipse center point x = {0}, y = {1}, z = {2}".format(centerPoint.getX(), centerPoint.getY(), centerPoint.getZ())
            #print "major axis: ", majorAxisPoint.getX(), majorAxisPoint.getY()
            endPointMajorAxis = Point(centerPoint.getX() + majorAxisPoint.getX(), centerPoint.getY() + majorAxisPoint.getY())
            #print "end Point Major axis:",endPointMajorAxis.getX(), endPointMajorAxis.getY()
            #print "ratio:", entity.ratio
            ratio = entity.ratio
            a = m.sqrt(majorAxisPoint.getX()*majorAxisPoint.getX() + majorAxisPoint.getY()*majorAxisPoint.getY())
            b = a*ratio
            azimut = fCalculateAzimuth(centerPoint.getX(), centerPoint.getY(), endPointMajorAxis.getX(), endPointMajorAxis.getY())

            if round(end_param,5) == round(2*pi,5) and round(start_param,5) <> round(0.0,5):   # ak by nebolo -pi elipsa je o pi otocena dovod - zatial neznami
                end_param = start_param - pi
                start_param = 0
            a=0
            while start_param <= end_param:

                xi = a * m.cos(start_param)
                yi = b * m.sin(start_param)
                xe = m.sin(m.radians(azimut))*xi - m.cos(m.radians(azimut))*yi
                ye = m.sin(m.radians(azimut))*yi + m.cos(m.radians(azimut))*xi
                if (end_param-start_param) < m.radians(1):
                    start_param = start_param + (end_param-start_param)
                    start_param = start_param + a
                    a=1
                else:
                    start_param = start_param+m.radians(1)
                p = Point(centerPoint.getX() + xe, centerPoint.getY() + ye)
                line.AddPoint(p.getX(), p.getY())
                #print p.getX(), p.getY()
            wkt = line.ExportToWkt()
            print wkt
            cursor.execute("INSERT INTO " + nameTable + " (ID, typ, geom)" + "VALUES(%s, %s, ST_GeometryFromText(%s))",
                           (id, entity.dxftype, wkt))
            id = id + 1
            geometry.append(wkt)

        elif entity.dxftype == "CIRCLE":
            circle_count = circle_count+1
            radius = entity.radius
            centerPoint = Point(entity.center[0], entity.center[1], entity.center[2])
            line = ogr.Geometry(ogr.wkbLineString)
            i = 0
            while i <= 2*pi:
                p = Point(centerPoint.getX()+(radius * m.cos(i)), centerPoint.getY()+(radius * m.sin(i)), entity.center[2])
                line.AddPoint(p.getX(), p.getY())
                i = i + m.radians(1)
            wkt = line.ExportToWkt()
            cursor.execute("INSERT INTO " + nameTable + " (ID, typ, geom)" + "VALUES(%s, %s, ST_GeometryFromText(%s))",
                           (id, entity.dxftype, wkt))
            id = id + 1
            geometry.append(wkt)

    cursor.execute("DROP INDEX IF EXISTS " + nameTable + "_index")
    cursor.execute("CREATE INDEX " + nameTable + "_index ON test USING GIST(geom)")

            #else:
            #    print k, entity.dxftype
    '''
    print "count line %i" % line_count
    print "count polyline %i" % polyline_count
    print "count pwpolyline %i" % pw_polyline_count
    print "count arc %i" % arc_count
    print "count ellipse %i" % ellipse_count
    #print "count 3Dsolid %i" % dsolid_count
    #print "count 3Dface %i" % dface_count
    print "count circle %i" % circle_count
    print "count point %i" % point_count
    print line_count+polyline_count+pw_polyline_count+arc_count+ellipse_count+circle_count
    print len(geometry)
    '''

    return geometry
Exemplo n.º 50
0
def main():
    # Connect to arduino
    device = "/dev/ttyAMC1"
    try:
        ser = serial.Serial(device, PORT)
    except serial.SerialException:
        ser = serial.Serial('/dev/ttyACM0', PORT)
        #print 'Oops, couldn\'t connect to the Arduino'
        #print 'is it plugged in?'
        #print 'did you set the right DEVICE and PORT in this file?'
        #exit()
        # Wait for arduino to connect
        time.sleep(2)
        print 'Connected'

    # Open dxf file
    filename = 'line.dxf'
    dxf = dxfgrabber.readfile(filename)
    lines = [ [],[],[],[] ]
    print 'x1 x2 y1 y2'
    # Get lines
    for entity in dxf.entities:
        x1,y1 = entity.start
        x2,y2 = entity.end
        print x1,x2,y1,y2
        lines[0].append(x1)
        lines[1].append(x2)
        lines[2].append(y1)
        lines[3].append(y2)
        
    # shift drawing so that origin is at 0,0
    x1Min = min(lines[0])
    x2Min = min(lines[1])
    y1Min = min(lines[2])
    y2Min = min(lines[3])
    xMin = min([x1Min, x2Min])
    yMin = min([y1Min, y2Min])
    lines[0] = [el - xMin for el in lines[0]]
    lines[1] = [el - xMin for el in lines[1]]
    lines[2] = [el - yMin for el in lines[2]]
    lines[3] = [el - yMin for el in lines[3]]

    # Scale drawing so that maximum dimension is MAXDIM
    x1Max = max(lines[0])
    x2Max = max(lines[1])
    y1Max = max(lines[2])
    y2Max = max(lines[3])
    Max = max([x1Max, x2Max, y1Max, y2Max])
    lines[0] = [ (el)*(MAXDIM/Max)+xStart for el in lines[0] ]
    lines[1] = [ (el)*(MAXDIM/Max)+xStart for el in lines[1] ]
    lines[2] = [ (el)*(MAXDIM/Max)+yStart for el in lines[2] ]
    lines[3] = [ (el)*(MAXDIM/Max)+yStart for el in lines[3] ]

    # Invert y coordinate because 'y' is backwards on board
    lines[2] = [ e *(-1) for e in lines[2] ]
    lines[3] = [ e *(-1) for e in lines[3] ]

    print 'after'
    # Draw lines
    for x1,x2,y1,y2 in zip(lines[0],lines[1],lines[2],lines[3]):
        print x1,x2,y1,y2
        # The A is to verify that a real signal has been sent
        ser.write(str(int(x1))+','+str(int(x2))+','+str(int(y1))+','+str(int(y2))+'\n')
        # Wait for the arduino to finish the line or break after a while
        millis = int(round(time.time() * 1000))
        print millis
        while(1):
            try:
                # TODO: wrap this call in something that will kill it if it's
                # not done in a few milliseconds
                waitline = ser.read()
            except: # serial.SerialException:
                print "Something wrong with serial connection?"
                break
            finally:
                break
            if waitline == "a":
                break
            current_millis = int(round(time.time() * 1000))
            # Timeout condition
            print current_millis
            if current_millis > millis + 2000:
                print "Timeout"
                break
Exemplo n.º 51
0
footer = """)
"""

# draw a line
# (from http://www.compuphase.com/electronics/LibraryFileFormats.pdf)
def make_line(x0, y0, x1, y1):
    return """  (fp_line
    (start %(0)s %(1)s)
    (end %(2)s %(3)s)
    (layer Edge.Cuts)
    (width %(4)0.2f)
  )
""" % {"0":x0, "1":y0, "2":x1, "3":y1, "4":args.width[0]}

def conv_dxf_to_module(module_name, entities):
    module = header % {"name": module_name}
    for entity in entities:
        if entity.dxftype == "LINE":
            module += make_line(entity.start[0], entity.start[1], entity.end[0], entity.end[1])
    module += footer % {"name": module_name}
    return module


dxf = dxfgrabber.readfile(args.inputfile)
header_var_count = len(dxf.header) 
layer_count = len(dxf.layers) 
entity_count = len(dxf.entities) 
outfile=open(args.outputfile, 'w')
outfile.write(conv_dxf_to_module("DP5050", dxf.entities))
outfile.close()
Exemplo n.º 52
0
    if layer.on and not layer.frozen:
      handleEntity(svgFile, entity)
    else:
      print "Not handeling entity " + str(entity)

  svgFile.write('</svg>\n')
#end: saveToSVG

if __name__ == '__main__':
  # TODO: error handling
  if len(sys.argv) < 2:
    sys.exit('Usage: {0} file-name'.format(sys.argv[0]))

  for filename in sys.argv[1:]:
    # grab data from file
    dxfData = dxfgrabber.readfile(filename)

    # convert and save to svg
    svgName = '.'.join([os.path.splitext(filename)[0]] + ['svg'])
    if os.path.exists(svgName):
      if not raw_input("Overwrite existing file? (y/N) ").lower() == 'y':
        quit("Quitting.")

    svgFile = open(svgName, 'w')

    label_basename = os.path.basename(filename).split('_')[0]
    print("Opening '%s' (%s)" % (filename, label_basename))

    print "Saving to SVG file: {0}".format(svgName)
    saveToSVG(svgFile, dxfData)
    x0 = (B*B + L1*L1 - L2*L2)/(2*B)
    y0 = math.sqrt(L2*L2 - (B - x0)*(B - x0))
    L1new = math.sqrt((x + x0)*(x + x0) + (y +y0)*(y +y0))
    L2new = math.sqrt((B - (x + x0))*(B - (x + x0)) + (y +y0)*(y +y0))
    L1corrected = - (L1new - L1)
    L2corrected = - (L2new - L2)
    return L1corrected, L2corrected

#This opens a file dialog for choosing a .dxf file to import.

if __name__ == '__main__':
    
    root = Tkinter.Tk() 
    root.withdraw()
    file = tkFileDialog.askopenfilename(filetypes=[("DXF files","*.dxf")], title="Import DXF file",parent=root)
    dxf = dxfgrabber.readfile(file)
    all_lines = [entity for entity in dxf.entities if entity.dxftype == 'LINE']
    NoofLines = len(all_lines)

#Sets the origin and further magnitude of speed for the plotting in units mm/minute.
    
gcode = 'G1 ' + 'X 0.0000 ' + 'Y 0.0000 ' + 'Z 0.0000 F 3000 \n' + 'G1 ' + 'X 0.0000 ' + 'Y 0.0000 ' + 'Z 0.3000 \n'

for x in range(len(all_lines)):
    if x == 0:
        gcode = gcode + 'G1 ' + 'X ' + str(cartesianTodrawbot(all_lines[x].start[0],all_lines[x].start[1],B, L1, L2)[0]) + ' Y ' + str(cartesianTodrawbot(all_lines[x].start[0],all_lines[x].start[1],B, L1, L2)[1]) + ' Z 0.3000 \n'
    else:
        if all_lines[x-1].end[0] == all_lines[x].start[0] and all_lines[x-1].end[1] == all_lines[x].start[1]:
            gcode = gcode + 'G1 ' + 'X ' + str(cartesianTodrawbot(all_lines[x].start[0],all_lines[x].start[1],B, L1, L2)[0]) + ' Y ' + str(cartesianTodrawbot(all_lines[x].start[0],all_lines[x].start[1],B, L1, L2)[1]) + ' Z 0.0000 \n'
        else:
            gcode = gcode + 'G1 ' + 'X ' + str(cartesianTodrawbot(all_lines[x].start[0],all_lines[x].start[1],B, L1, L2)[0]) + ' Y ' + str(cartesianTodrawbot(all_lines[x].start[0],all_lines[x].start[1],B, L1, L2)[1]) + ' Z 0.3000 \n'
Exemplo n.º 54
0
def create_script(dxf_file, script_file, layers, scale_factor=1, offset=(0,0), spline_point_scalar = 50):
    """
    Create an EAGLE script from a DXF file.
    
    :param dxf_file: The path to the input DXF file. 
    :param script_file: The path to the output EAGLE script. 
    :param layers: A ``dict`` of layers which should be converted, or ``None`` if all layers should be converted.
    :param scale_factor: The factor by which to scale the output. 
    :param offset: A two-element tuple specifying the amount by which to offset the output.
    :param spline_point_scalar: The factor by which to multiply the number of spline control points to yield the total number of spline approximation points.
    
    :returns: ``None``.
    """
    
    # Read the input DXF file
    dxf = dxfgrabber.readfile(dxf_file)
    
    # Open the output EAGLE script file
    f = open(script_file, 'w')
    
    # Initialize counters to hold the number of primitives by type.
    num_arcs = 0
    num_circles = 0
    num_lines = 0
    num_polylines = 0
    num_splines = 0
    num_text = 0
    
    last_text_size = None
    
    # Iterate through the entities
    for e in dxf.entities:
        
        if layers == None or layers.has_key(e.layer):
            if isinstance(e, dxfgrabber.entities.Arc):
                add_arc(f, e.center[0]*scale_factor + offset[0],
                        e.center[1]*scale_factor + offset[1],
                        e.radius*scale_factor,
                        e.startangle,
                        e.endangle)
                num_arcs += 1
            
            elif isinstance(e, dxfgrabber.entities.Circle):
                add_circle(f, e.center[0]*scale_factor + offset[0], e.center[1]*scale_factor + offset[1], e.radius * scale_factor)
                num_circles += 1
            
            elif isinstance(e, dxfgrabber.entities.Line):
                add_line(f, e.start[0] * scale_factor + offset[0], e.start[1] * scale_factor + offset[1], e.end[0] * scale_factor + offset[0], e.end[1] * scale_factor + offset[1])
                num_lines += 1
            
            elif isinstance(e, dxfgrabber.entities.Polyline):
                for i in range(1, len(e.vertices)):
                    add_line(f, e.vertices[i-1].location[0] * scale_factor + offset[0],
                             e.vertices[i-1].location[1] * scale_factor + offset[1],
                             e.vertices[i].location[0] * scale_factor + offset[0], 
                             e.vertices[i].location[1] * scale_factor + offset[1])
                num_polylines += 1
                
            elif isinstance(e, dxfgrabber.entities.Spline):
                p = e.degree
                P = e.controlpoints
                U = e.knots
                
                num_points = spline_point_scalar * len(P) 
                step = (U[-1] - U[0]) / float(num_points)
                
                points = []
            
                for i in range(num_points):
                    u = U[0] + step * i
                    xy = bezier.deboor(P, U, u, p)
                    points.append(xy)
                    
                xy = bezier.deboor(P, U, U[-1] - step*0.01, p)
                points.append(xy)
                
                for i in range(len(points)-1):
                    add_line(f, points[i][0] * scale_factor + offset[0], 
                             points[i][1] * scale_factor + offset[1], 
                             points[i+1][0] * scale_factor + offset[0], 
                             points[i+1][1] * scale_factor + offset[1])
                    
                num_splines += 1
               
            elif isinstance(e, dxfgrabber.entities.Text):
                h = e.height * scale_factor
                
                if h != last_text_size:
                    add_set(f, 'size', h)
                    last_text_size = h
                
                add_text(f, e.insert[0] * scale_factor + offset[0],
                         e.insert[1] * scale_factor + offset[1],
                         e.rotation,
                         e.text)
                
                num_text += 1
            
            elif isinstance(e, dxfgrabber.entities.MText):
#                 lines = e.lines()
#                 
#                 # The defualt spacing between two baselines is 5/3 the height of the text
#                 default_spacing = 5/3.0
#                 
#                 # Thus, the text height is 1,
#                 # the descender is 1/3.0
#                 # the ascender is 1/3.0
#                 
#                 # This can be overriden by the linespacing property
#                 spacing = e.linespacing * default_spacing * scale_factor
#                 
#                 # The total height is the total number of lines multiplied by the spacing
#                 total_height = len(lines) * spacing
#                 
#                 # The attachment points are:
#                 
                
                
                
                
                pass
#                 lines = e.lines()
#                 
#                 # The default spacing between two baselines is 5/3 the height of the text
#                 default_spacing = 5 / 3.0
#                 
#                 # This can be overriden by the linespacing property
#                 spacing = e.linespacing * default_spacing * scale_factor
#                 h = e.height * scale_factor
#                 
#                 total_height = h + (len(lines) - 1) * spacing
#                 
#                 x_base = e.insert[0] * scale_factor + offset[0]
#                 y_base = e.insert[1] * scale_factor + offset[1]
#                 
#                 if (e.attachmentpoint >= 1 and e.attachmentpoint <= 3):
#                     # Attachment point is top
#                     y = y_base
#                 elif (e.attachmentpoint >= 4 and e.attachmentpoint <= 6):
#                     # Attachment point is middle
#                     pass
#                 elif (e.attachmentpoint >= 7 and e.attachmentpoint <= 8):
#                     # Attachment point is bottom
#                     pass
#                 else:
#                     raise Exception("Invalid text attachment point {0}.".format(e.attachmentpoint))
                
            else:
                print('Got unknown element {0}'.format(e))
                
               
    f.close()
    
    print("Script written successfully.")
    print("{0} arcs".format(num_arcs))
    print("{0} circles".format(num_circles))
    print("{0} lines".format(num_lines))
    print("{0} polylines".format(num_polylines))
    print("{0} splines".format(num_splines))
    print("{0} text".format(num_text))
Exemplo n.º 55
0
import dxfgrabber

drawing = dxfgrabber.readfile("F:\\Egyetem\\Diplomamunka\\bottle_opener.dxf")
print("DXF version: {}".format(drawing.dxfversion))
print("Encoding: {}".format(drawing.encoding))
print("Entities: {}".format(drawing.entities))
# dict of dxf header vars
header_var_count = len(drawing.header)
# collection of layer definitions
layer_count = len(drawing.layers)
#  dict like collection of block definitions
block_definition_count = len(drawing.blocks)
entitiy_count = len(drawing.entities)

references = ([entity for entity in drawing.entities
              if entity.dxftype == 'INSERT'])

for block in drawing.blocks:
    print("block name: {}".format(block.name))
    print("block basepoint: {}".format(block.basepoint))
    print("block xrefpath: {}".format(block.xrefpath))
    print("\n")

for entity in drawing.entities:
    print("entity name: {}".format(entity.name))
    print("entity type: {}".format(entity.dxftype))
    print("insert insert: {}".format(entity.insert))
    print("insert rotation: {}".format(entity.rotation))
    print("insert scale: {}".format(entity.scale))
    print("insert attribs: {}".format(entity.attribs))
    print("entity layer: {}".format(entity.layer))
Exemplo n.º 56
0
def _layer_entities(entities):
    seq = list(entities)
    seq.sort(key=lambda e: e.layer)
    groups = groupby(seq, lambda e: e.layer)
    return groups


def cmds_from_entities(entities):
    '''
    get all cmd (in kicad_mod_format) from entities which is the entities
    on all layers.
    '''
    return functools.reduce(lambda x, y: x+y,
                            (list(fp_polys(layer, entities))
                             for (layer, entities) in
                             _layer_entities(dxf.entities)))


if __name__ == '__main__':
    if len(sys.argv) < 2:
        print('usage:\n'
              '  save to a file:   python {} '
              'inputfile.dxf > outputfile.kicad_mod\n'
              '  print to stdout:  python {} inputfile.dxf'.format(
                  sys.argv[0], sys.argv[0]))
    else:
        dxf = dxfgrabber.readfile(sys.argv[1])
        print(str(kf.Module('autogenerated',
                            children=cmds_from_entities(dxf.entities))))
def calcOpeningBoundingBox(abs_file_path, WINDOW_LAYER_NAME, DOOR_LAYER_NAME):
    
    dxf = dxfgrabber.readfile(abs_file_path, {"grab_blocks":True, "assure_3d_coords":False, "resolve_text_styles":False})
    windows=[]
    doors=[]

    for i in dxf.entities:
        
# -------------------------------- Windows ------------------------------------     
        if i.layer == WINDOW_LAYER_NAME and i.dxftype == 'INSERT':
            
            X0=i.insert[0]
            Y0=i.insert[1]
            angle=math.radians(i.rotation)
            xs=i.scale[0]
            ys=i.scale[1]        
                       
            result=blockbbox(i, dxf, X0, Y0, angle, xs, ys)
            
            p1=result[0]
            p2=result[1]
            p3=result[2]
            p4=result[3]
        
            if p1.distance(p2)>=p2.distance(p3):
                pp1,pp2=extend_line_bothdir(Point((p1.x+p4.x)/2, (p1.y+p4.y)/2), Point((p2.x+p3.x)/2, (p2.y+p3.y)/2), 20)
                width=p2.distance(p3)
                length=Point((p1.x+p4.x)/2, (p1.y+p4.y)/2).distance(Point((p2.x+p3.x)/2, (p2.y+p3.y)/2))
            else:
                pp1,pp2=extend_line_bothdir(Point((p1.x+p2.x)/2, (p1.y+p2.y)/2), Point((p3.x+p4.x)/2, (p3.y+p4.y)/2), 20)
                width=p1.distance(p2)
                length=Point((p1.x+p2.x)/2, (p1.y+p2.y)/2).distance(Point((p3.x+p4.x)/2, (p3.y+p4.y)/2))
                
            windows.append(Window(LineString([(pp1.x,pp1.y),(pp2.x,pp2.y)]), width, length))
            
            
# --------------------------------- Doors ------------------------------------- 
        if i.layer == DOOR_LAYER_NAME and i.dxftype == 'INSERT':
            
            X0=i.insert[0]
            Y0=i.insert[1]
            angle=math.radians(i.rotation)
            xs=i.scale[0]
            ys=i.scale[1]        
            
            result=blockbbox(i, dxf, X0, Y0, angle, xs, ys)

            p1=result[0]
            p2=result[1]
            p3=result[2]
            p4=result[3]
             
            if p1.distance(p2)>=p2.distance(p3):
                pp1,pp2=extend_line_bothdir(Point((p1.x+p4.x)/2, (p1.y+p4.y)/2), Point((p2.x+p3.x)/2, (p2.y+p3.y)/2), 20)
                width=p2.distance(p3)
                length=Point((p1.x+p4.x)/2, (p1.y+p4.y)/2).distance(Point((p2.x+p3.x)/2, (p2.y+p3.y)/2))
            else:
                pp1,pp2=extend_line_bothdir(Point((p1.x+p2.x)/2, (p1.y+p2.y)/2), Point((p3.x+p4.x)/2, (p3.y+p4.y)/2), 20)
                width=p1.distance(p2)
                length=Point((p1.x+p2.x)/2, (p1.y+p2.y)/2).distance(Point((p3.x+p4.x)/2, (p3.y+p4.y)/2))
                
            doors.append(Door(LineString([(pp1.x,pp1.y),(pp2.x,pp2.y)]), width, length))
#------------------------------------------------------------------------------            
             
    print '#-----------------------------'             
    print 'len(windows)', len(windows)  
    print 'len(doors)', len(doors) 
        
    openings=[]
    openings.extend(windows)
    openings.extend(doors)
    
    return openings
Exemplo n.º 58
0
def rdxf(filename):
    dxf = dxfgrabber.readfile(filename)

    total_length = 0

    ########################################
    # Info
    ########################################

    log("DXF version: {}".format(dxf.dxfversion))

    # dict of dxf header vars
    log('header_var_coun: {}'.format(len(dxf.header)))

    # collection of layer definitions
    log('layer_count: {}'.format(len(dxf.layers)))

    # dict like collection of block definitions
    log('block_definition_count'.format(len(dxf.blocks)))

    # list like collection of entities
    log('entity_count: {}'.format(len(dxf.entities)))
    log('')

    ########################################
    # Entities
    ########################################

    for e in dxf.entities:

        typename = e.dxftype

        log('=' * 20)
        log('DXF Entity: {}\n'.format(typename))

        if typename == 'LWPOLYLINE':

            #print('LWPolyline is closed? {}\n'.format(e.closed))

            length = None
            ppoint = (0, 0)

            for p in e.points:

                log(p)

                if length is None:
                    length = 0
                    ppoint = p
                    continue

                length += euclidean_distance(ppoint, p)
                ppoint = p

            log('Length = {}\n'.format(length))

            total_length += length

        elif typename == 'LINE':

            log('LINE on layer: {}\n'.format(e.dxf.layer))
            log('start point: {}\n'.format(e.dxf.start))
            log('end point: {}\n'.format(e.dxf.end))

            length = euclidean_distance(e.start, e.end)

            log('Length = {}\n'.format(length))

            total_length += length

        elif typename == 'ELLIPSE':

            a = euclidean_distance((0, 0), e.majoraxis)
            b = a * e.ratio

            log('center: {}'.format(e.center))
            log('majoraxis: {}'.format(e.majoraxis))
            log('a: {}'.format(a))
            log('b: {}'.format(b))

            length = ellipse(a, b)

            log('distance: {}'.format(length))

            total_length += length

        elif typename == 'SPLINE':

            print(e.__dict__)
            pass

        else:

            print('Not Implemented')

        log('=' * 20)

    speed = 4

    log('{} mm / {} mmps = {} s'.format(total_length, speed, total_length / speed))
Exemplo n.º 59
0
import dxfgrabber
import svgwrite
import math


dxf = dxfgrabber.readfile("map.dxf")
svg = svgwrite.Drawing()


class Line(object):

    def __init__(self, letter, dxf_color):
        self.letter = letter
        self.dxf_color = dxf_color
        self.line_svg_layer = svg.g(id="line-" + letter)
        self.hollow_svg_layer = svg.g(id="line-" + letter + "-hollow")


# We use DXF colors as a proxy for line designation.
# These don't actually match the colors we use in the final
# rendered map.
# The order in this list dictates the layering order in the
# map rendering, with the first item deepest.
line_stack = [
    Line("T", 1),
    Line("L", 9),
    Line("A", 5),
    Line("B", 3),
    Line("K", 2),
    Line("R", 40),