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)
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)
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())
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
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)
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
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())
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
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())
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
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)
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())
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) )
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
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)
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) )