Esempio n. 1
0
 def rectangle(cls,
               width,
               height,
               left=0,
               bottom=0,
               units='metric',
               draw_mode=None,
               filename=None):
     if units == 'metric':
         settings = FileSettings(units=units,
                                 zero_suppression='leading',
                                 format=(3, 4))
     else:
         settings = FileSettings(units=units,
                                 zero_suppression='leading',
                                 format=(2, 5))
     statements = [
         DxfLineStatement(None, (left, bottom), (left + width, bottom)),
         DxfLineStatement(None, (left + width, bottom),
                          (left + width, bottom + height)),
         DxfLineStatement(None, (left + width, bottom + height),
                          (left, bottom + height)),
         DxfLineStatement(None, (left, bottom + height), (left, bottom)),
     ]
     return cls(statements, settings, draw_mode, filename)
def loads(data, filename=None, settings=None, tools=None, format=None):
    if not settings:
        settings = FileSettings(**detect_excellon_format(data))
        if format:
            settings.format = format
    file = ExcellonParser(settings, tools).parse_raw(data, filename)
    return ExcellonFileEx.from_file(file)
Esempio n. 3
0
def loads(data, filename=None, settings=None, tools=None, format=None):
    if not settings:
        settings = FileSettings(**detect_excellon_format(data))
        if format:
            settings.format = format
    gerber.excellon.CoordinateStmt = CoordinateStmtEx
    gerber.excellon.UnitStmt = UnitStmtEx
    file = ExcellonParser(settings, tools).parse_raw(data, filename)
    return ExcellonFileEx.from_file(file)
Esempio n. 4
0
    def to_gerber(self, settings=FileSettings()):
        def gerbers():
            yield 'G75*'
            yield self._polarity_command()
            yield 'D{0}*'.format(self.dcode)
            if self.draw_mode == DxfFile.DM_FILL:
                yield 'G36*'
                if self.fill_mode == DxfFile.FM_TURN_OVER:
                    self._prepare_sorted_close_paths()
                    polarity = self.polarity
                    level = 0
                    for path in self.sorted_close_paths:
                        if len(path.containers) > level:
                            level = len(path.containers)
                            polarity = not polarity
                            yield 'G37*'
                            yield self._polarity_command(polarity)
                            yield 'G36*'
                        yield path.to_gerber(settings)
                else:
                    for path in self.close_paths:
                        yield path.to_gerber(settings)
                yield 'G37*'
            else:
                pitch = self.pitch if self.draw_mode == DxfFile.DM_MOUSE_BITES else 0
                for path in self.open_paths:
                    yield path.to_gerber(settings, pitch=pitch, width=self.width)
                for path in self.close_paths:
                    yield path.to_gerber(settings, pitch=pitch, width=self.width)

        return '\n'.join(gerbers())
Esempio n. 5
0
 def to_excellon(self, settings=FileSettings(), pitch=0, width=0):
     if not pitch:
         return
     gstr = ""
     for p in self._dots(pitch, width):
         gstr += CoordinateStmt(x=p[0], y=p[1]).to_excellon(settings) + '\n'
     return gstr
Esempio n. 6
0
    def from_dxf(cls, dxf, settings=None, draw_mode=None, filename=None):
        fsettings = settings if settings else \
            FileSettings(zero_suppression='leading')

        if dxf.header['$INSUNITS'] == 1:
            fsettings.units = 'inch'
            if not settings:
                fsettings.format = (2, 5)
        else:
            fsettings.units = 'metric'
            if not settings:
                fsettings.format = (3, 4)

        statements = []
        for entity in dxf.entities:
            if entity.dxftype == 'LWPOLYLINE':
                statements.append(DxfPolylineStatement(entity))
            elif entity.dxftype == 'LINE':
                statements.append(DxfLineStatement.from_entity(entity))
            elif entity.dxftype == 'CIRCLE':
                statements.append(DxfCircleStatement(entity))
            elif entity.dxftype == 'ARC':
                statements.append(DxfArcStatement(entity))

        return cls(statements, fsettings, draw_mode, filename)
Esempio n. 7
0
    def to_excellon(self, settings=FileSettings(), pitch=0, width=0):
        from gerberex.dxf import DxfArcStatement
        if pitch == 0:
            x0, y0 = self.statements[0].start
            excellon = 'G00{0}\nM15\n'.format(
                CoordinateStmtEx(x=x0, y=y0).to_excellon(settings))

            for statement in self.statements:
                x0, y0 = statement.start
                x1, y1 = statement.end
                if isinstance(statement, DxfArcStatement):
                    i = statement.center[0] - x0
                    j = statement.center[1] - y0
                    excellon += '{0}{1}\n'.format(
                        'G03' if statement.end_angle > statement.start_angle
                        else 'G02',
                        CoordinateStmtEx(x=x1, y=y1, i=i,
                                         j=j).to_excellon(settings))
                else:
                    excellon += 'G01{0}\n'.format(
                        CoordinateStmtEx(x=x1, y=y1).to_excellon(settings))

            excellon += 'M16\nG05\n'
        else:

            def ploter(x, y):
                return CoordinateStmtEx(x=x, y=y).to_excellon(settings) + '\n'

            excellon = self._plot_dots(pitch, width, ploter)

        return excellon
Esempio n. 8
0
 def to_excellon(self, settings=FileSettings()):
     if self.draw_mode == DxfFile.DM_FILL:
         return
     def drills():
         pitch = self.pitch if self.draw_mode == DxfFile.DM_MOUSE_BITES else 0
         for path in self.open_paths:
             yield path.to_excellon(settings, pitch=pitch, width=self.width)
         for path in self.close_paths:
             yield path.to_excellon(settings, pitch=pitch, width=self.width)
     return '\n'.join(drills())
Esempio n. 9
0
    def to_gerber(self, settings=FileSettings(), pitch=0, width=0):
        if pitch:
            return
        x0 = self.entity.points[0][0]
        y0 = self.entity.points[0][1]
        b = self.entity.bulge[0]
        gerber = 'G01*\nX{0}Y{1}D02*\nG75*'.format(
            write_gerber_value(x0, settings.format, settings.zero_suppression),
            write_gerber_value(y0, settings.format, settings.zero_suppression),
        )

        def ptseq():
            for i in range(1, len(self.entity.points)):
                yield i
            if self.entity.is_closed:
                yield 0

        for idx in ptseq():
            pt = self.entity.points[idx]
            x1 = pt[0]
            y1 = pt[1]
            if b == 0:
                gerber += '\nG01*\nX{0}Y{1}D01*'.format(
                    write_gerber_value(x1, settings.format,
                                       settings.zero_suppression),
                    write_gerber_value(y1, settings.format,
                                       settings.zero_suppression),
                )
            else:
                ang = 4 * atan(b)
                xm = x0 + x1
                ym = y0 + y1
                t = 1 / tan(ang / 2)
                xc = (xm - t * (y1 - y0)) / 2
                yc = (ym + t * (x1 - x0)) / 2
                r = sqrt((x0 - xc) * (x0 - xc) + (y0 - yc) * (y0 - yc))

                gerber += '\nG{0}*\nX{1}Y{2}I{3}J{4}D01*'.format(
                    '03' if ang > 0 else '02',
                    write_gerber_value(x1, settings.format,
                                       settings.zero_suppression),
                    write_gerber_value(y1, settings.format,
                                       settings.zero_suppression),
                    write_gerber_value(xc - x0, settings.format,
                                       settings.zero_suppression),
                    write_gerber_value(yc - y0, settings.format,
                                       settings.zero_suppression))

            x0 = x1
            y0 = y1
            b = self.entity.bulge[idx]

        return gerber
Esempio n. 10
0
    def to_excellon(self, settings=FileSettings()):
        if not self.draw_mode == DxfFile.DM_MOUSE_BITES:
            return

        def drills():
            for statement in self.statements:
                if isinstance(statement, DxfLineStatement):
                    yield statement.to_excellon(settings,
                                                pitch=self.pitch,
                                                width=self.width)

        return '\n'.join(drills())
Esempio n. 11
0
    def to_gerber(self, settings=FileSettings(), pitch=0, width=0):
        from gerberex.dxf import DxfArcStatement
        if pitch == 0:
            x0, y0 = self.statements[0].start
            gerber = 'G01*\nX{0}Y{1}D02*\nG75*'.format(
                write_gerber_value(x0, settings.format,
                                   settings.zero_suppression),
                write_gerber_value(y0, settings.format,
                                   settings.zero_suppression),
            )

            for statement in self.statements:
                x0, y0 = statement.start
                x1, y1 = statement.end
                if isinstance(statement, DxfArcStatement):
                    xc, yc = statement.center
                    gerber += '\nG{0}*\nX{1}Y{2}I{3}J{4}D01*'.format(
                        '03' if statement.end_angle > statement.start_angle
                        else '02',
                        write_gerber_value(x1, settings.format,
                                           settings.zero_suppression),
                        write_gerber_value(y1, settings.format,
                                           settings.zero_suppression),
                        write_gerber_value(xc - x0, settings.format,
                                           settings.zero_suppression),
                        write_gerber_value(yc - y0, settings.format,
                                           settings.zero_suppression))
                else:
                    gerber += '\nG01*\nX{0}Y{1}D01*'.format(
                        write_gerber_value(x1, settings.format,
                                           settings.zero_suppression),
                        write_gerber_value(y1, settings.format,
                                           settings.zero_suppression),
                    )
        else:

            def ploter(x, y):
                return 'X{0}Y{1}D03*\n'.format(
                    write_gerber_value(x, settings.format,
                                       settings.zero_suppression),
                    write_gerber_value(y, settings.format,
                                       settings.zero_suppression),
                )

            gerber = self._plot_dots(pitch, width, ploter)

        return gerber
Esempio n. 12
0
    def __init__(self, statements, settings=None, draw_mode=None, filename=None):
        if not settings:
            settings = FileSettings(units='metric', format=(3,4), zero_suppression='leading')
        if draw_mode == None:
            draw_mode = self.DM_LINE

        super(DxfFile, self).__init__(settings=settings, filename=filename)
        self._draw_mode = draw_mode
        self._fill_mode = self.FM_TURN_OVER
        
        self.aperture = ADParamStmt.circle(dcode=10, diameter=0.0)
        if settings.units == 'inch':
            self.aperture.to_inch()
        else:
            self.aperture.to_metric()
        self.statements = DxfStatements(
            statements, self.units, dcode=self.aperture.d, draw_mode=self.draw_mode, fill_mode=self.filename)
Esempio n. 13
0
    def to_gerber(self, settings=FileSettings()):
        def gerbers():
            yield 'D{0}*'.format(self.dcode)
            if self.draw_mode == DxfFile.DM_FILL:
                yield 'G36*'
                for statement in self.statements:
                    if isinstance(statement, DxfCircleStatement) or \
                        (isinstance(statement, DxfPolylineStatement) and statement.entity.is_closed):
                        yield statement.to_gerber(settings)
                for path in self.paths:
                    yield path.to_gerber(settings)
                yield 'G37*'
            else:
                for statement in self.statements:
                    yield statement.to_gerber(
                        settings,
                        pitch=self.pitch
                        if self.draw_mode == DxfFile.DM_MOUSE_BITES else 0,
                        width=self.width)

        return '\n'.join(gerbers())
Esempio n. 14
0
    def to_gerber(self, settings=FileSettings(), pitch=0, width=0):
        if pitch:
            return
        r = self.radius
        x0, y0 = self.center
        return 'G01*\nX{0}Y{1}D02*\n' \
               'G75*\nG03*\nX{2}Y{3}I{4}J{5}D01*'.format(
            write_gerber_value(x0 + r, settings.format,
                               settings.zero_suppression),
            write_gerber_value(y0, settings.format,
                               settings.zero_suppression),

            write_gerber_value(x0 + r, settings.format,
                               settings.zero_suppression),
            write_gerber_value(y0, settings.format,
                               settings.zero_suppression),
            write_gerber_value(-r, settings.format,
                               settings.zero_suppression),
            write_gerber_value(0, settings.format,
                               settings.zero_suppression)
        )
Esempio n. 15
0
 def to_gerber(self, settings=FileSettings(), pitch=0, width=0):
     if pitch == 0:
         x0, y0 = self.start
         x1, y1 = self.end
         return 'G01*\nX{0}Y{1}D02*\nX{2}Y{3}D01*'.format(
             write_gerber_value(x0, settings.format,
                                settings.zero_suppression),
             write_gerber_value(y0, settings.format,
                                settings.zero_suppression),
             write_gerber_value(x1, settings.format,
                                settings.zero_suppression),
             write_gerber_value(y1, settings.format,
                                settings.zero_suppression))
     else:
         gstr = ""
         for p in self._dots(pitch, width):
             gstr += 'X{0}Y{1}D03*\n'.format(
                 write_gerber_value(p[0], settings.format,
                                    settings.zero_suppression),
                 write_gerber_value(p[1], settings.format,
                                    settings.zero_suppression))
         return gstr
Esempio n. 16
0
    def __init__(self,
                 statements,
                 settings=None,
                 draw_mode=None,
                 filename=None):
        if not settings:
            settings = FileSettings(units='metric',
                                    format=(3, 4),
                                    zero_suppression='leading')
        if draw_mode == None:
            draw_mode = self.DM_LINE

        super(DxfFile, self).__init__(settings=settings, filename=filename)
        self._draw_mode = draw_mode
        self.header = DxfHeaderStatement()

        self.header2 = DxfHeader2Statement()
        self.aperture = ADParamStmt.circle(dcode=10, diameter=0.0)
        self.statements = DxfStatements(statements,
                                        self.units,
                                        dcode=self.aperture.d,
                                        draw_mode=self.draw_mode)
Esempio n. 17
0
    def to_gerber(self, settings=FileSettings(), pitch=0, width=0):
        if pitch:
            return
        x0 = self.center[0]
        y0 = self.center[1]
        start_x, start_y = self.start
        end_x, end_y = self.end

        return 'G01*\nX{0}Y{1}D02*\n' \
               'G75*\nG{2}*\nX{3}Y{4}I{5}J{6}D01*'.format(
            write_gerber_value(start_x, settings.format,
                               settings.zero_suppression),
            write_gerber_value(start_y, settings.format,
                               settings.zero_suppression),
            '02' if self.start_angle > self.end_angle else '03',
            write_gerber_value(end_x, settings.format,
                               settings.zero_suppression),
            write_gerber_value(end_y, settings.format,
                               settings.zero_suppression),
            write_gerber_value(x0 - start_x, settings.format,
                               settings.zero_suppression),
            write_gerber_value(y0 - start_y, settings.format,
                               settings.zero_suppression)
        )