X-Authentication-Warning: delorie.com: mail set sender to geda-user-bounces using -f X-Recipient: geda-user AT delorie DOT com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:date:message-id:subject:from:to:content-type; bh=C9Q4rMEopNb+iVoFsyQx/trqFvq6XDIJhYHGL3BR6YI=; b=f/NjjVtjPn5waJ+FbxBtUKMw9XhNmRwwLdwZAs8fbZPH33o1tp3vVJI599JHGvfXNK CEtdyTI+7gUdPZR+FKYt1ZBTsUstj3iof3rwRfwH4pINy4Qq5CdntCV59Zt0eHt/N3FU gJq/LEs5GgJa2v8lmIWYHEfEWoxo/2sBCmACGCznMyuZR8zu1YLzKpKDL7E40bJjhoET h78Zj0+pNxqEVhS1EC/p91fWzobLwboozZL8/OBqHdGp9jf597EMLzJuQoek9rUi2irc 4to6CN2O7ocYZRCDPoiSZXeHLrNSoMV/WuGPW3KZrCIvkDesEiCqWqeNgySfLv8DD78N DfGw== MIME-Version: 1.0 X-Received: by 10.202.168.15 with SMTP id r15mr3629857oie.92.1426976390500; Sat, 21 Mar 2015 15:19:50 -0700 (PDT) Date: Sat, 21 Mar 2015 18:19:50 -0400 Message-ID: Subject: [geda-user] A Python Gerber writer From: Jason White To: geda-user AT delorie DOT com Content-Type: multipart/mixed; boundary=001a113c328cdc17e90511d3d45c Reply-To: geda-user AT delorie DOT com --001a113c328cdc17e90511d3d45c Content-Type: text/plain; charset=UTF-8 Hello, today I spent a while toying around with the idea of creating a gerber writer in python. This is in order to facilitate the goal of creating multilayer PCBs with buried vias. I succeeded in making a usable, but unpolished, gerber writer. It takes primitives (instances of classes) such as text, lines, circles, and polygons and writes them out using the standard gerber RS-274X format. Check out the attached code, screenshot, and gerber files! Here is the example code used to generate export2.gbr: (note, the actual code uses micrometers as units for coordinates, I replaced them with the equivalent mm values for readability) writer=gerber_writer("export2.gbr") writer.primitives=[ line(1, 1, 2, 2, "C", 0, "copper", thickness=0.25, clearance=None), line(1, 2, 2, 3, "R", 0, "copper", thickness=0.5, clearance=None), line(1, 3.5, 2, 3.5, "C", 0, "copper", thickness=0.25, clearance=None), line(1, 4, 2, 4, "R", 0, "copper", thickness=0.25, clearance=None), line(2.5, 1, 2.5, 1, "R", 0, "copper", thickness=1, clearance=None), circle(0, 0, 1, 0, "copper", thickness=0.5, clearance=None), circle(0, 2, 1, 0, "copper", thickness=0.5, clearance=None), circle(3.5, 3, 1, 0, "copper", thickness=1.25, clearance=None), polygon(1, 0, 1, [[3,0], [4,0], [4,1.5], [2.5,1.5], [3,1]], 0, "copper", thickness=0.0, clearance=None), text(0, -1.5, "Hello!", 1, 0, 0, "copper", thickness=0.15, clearance=None), text(-5, 0, "Any Angle Text", 0.25, 45, 0, "copper", thickness=0.04, clearance=None) ] writer.write() With a bit more polish and another layer of abstraction to handle groups and layers, this will easily be capable of generating the Gerbers for an entire (hard-coded) board. Mail server rejected the zip file with the source code, so .... You can download the sources and the gerbers here (glif.zip, 9.1K): https://drive.google.com/file/d/0BwP0qhqyaTIIeUV1YVo3MDNpbHM/view?usp=sharing -- Jason White --001a113c328cdc17e90511d3d45c Content-Type: image/png; name="gerber.png" Content-Disposition: attachment; filename="gerber.png" Content-Transfer-Encoding: base64 X-Attachment-Id: f_i7jjr7ky1 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 +X8//wGm8hDg55K7DQAAAABJRU5ErkJggg== --001a113c328cdc17e90511d3d45c--