PC Board Tools

Here are the scripts I use to convert PC boards from Kicad to G-code.
This is the README included for information.

README 03/28/20012

Tested with LinuxCNC 2.6.0~pre and KiCad (2012-01-19 BZR3256)-stable and
    pcb2gcode 1.1.4


Files included in boardtools directory:
doall.py                    GUI front end for pcbbatch
pcbbatch.py                 Batch file to run all programs using config file
boardcfgdef.py              Default config file
Etch_Z_adjust.2.2.cl.py     Modified command line version
gerber2emc2cl.py            Modified command line version
p2gdrillopt.py              For optimizing drill files
p2gpathopt.py               For optimizing paths
demo                        Directory with sample Kicad layout, gerbers, and
                            sample boardcfg.py for testing

pcb2gcode installed on system
EMC2/LinuxCNC 2.5+

opti  (from Etch_Z_adjust)  Untested, I have not used it, not included

-Quick and dirty:
For GUI, from boardtools directory run:

$python doall.py

    You will probably need to run doall.py at least once to verify default
    file paths. Save defaults to boardcfgdef.py in installed directory.

To try demo:
    Click "Load boardcfg"
    Open the demo directory and choose boardcfg.py
    Click "Default Paths" and set to the correct locations.
    Click on "Browse" under "Board back" and reselect "demo-Back.gbl"
        to make sure the path is working directory is correct.
        This will automatically set the other files correctly.
    Click "Run boardcfg" (it will automatically ask you to save)
    Check out the generated files!

To run a config file from a project directory:

$python boardcfg.py

-The idea:
Generate ready to run g-code files from KiCad for LinuxCNC using one interface.

-The method (how I do it):
Schematic and board layout with KiCad.
    I use the Comment layer for text and draw board outline using actual tool
    path based on the bit I will be using so I can leave gaps to keep boards
    paneled together. (there is an option to use pcb2gcode for outline instead)
Generate gerbers and drill files (4). *Back.gbl, *PCB_Edges.gbr, *Comments.gbr,
    and *.drl
Use pcb2gcode to generate back and drill g-code files.
    * the paths are very "stair-steppy" which I did not like
Use gerber2emc2cl to generate text and outline g-code files.
Join the paths and text together in one file.
Use p2gpathopt to reduce "stair-step", smooth paths, and reduce moves.
    Due crude optimizing.
Use p2gdrillopt to due crude optimizing and optionally use only one drill bit.
Use Etch_Z_adjust (*modified) to do auto-leveling.

-The Solution:
Have a config / batch script to do all this automatically.
    In reality there is a script that is placed in the drawing directory
    that holds the configs (boardcfg.py) and calls another script (pcbbatch)
    that does all the hard work. This way boardcfg can be run in place when
    a board is modified without copying main script to each drawing directory.
    All needed settings needed to run are saved in the boardcfg.py file.
A GUI to select all the various setting and generate the config file and
    optionally run it.
Config file default name is boardcfg.py This can be modified by hand "at own
    risk" if desired, but may break compatibility with GUI. Undocumented.

-What does the work:

    Modified command line version. Added ability to re-run file without
    re-probing. Modified to use a separate probe instead of tool bit, and to
    set tool height automatically.(Must use EMC2/LinuxCNC 2.5+!!!!!! uses G10)
    Modified command line version. Added ability to mirror and offset.
    For optimizing drill files. Allows using only one drill and does crude
    optimizing using Morton number.
    For optimizing paths. Smooths out pcb2gcode paths by finding the midpoint
    of each stair-step, eliminates redundant points creating straight lines
    within a set tolerance. (difference in slope < .001 or about .057 degrees)
    Adds very slight deviations from original, but gives much smoother result.
    You decide.
    Also optimizes based on Morton number.

-Credit where credit is due:
While thoroughly hacked and mangled, my work is based on these previous works.
Both have no copyright/left restrictions in the files.
I likewise put no restrictions other than ask for credit if you use it.
(Please visit lwill.net)

Etch_Z_adjust from michael_m at cnczone.com


gerber2emc2 from SAMMEL Lothar on the LinuxCNC wiki


-Other software:






-Why my settings / method seems weird:
I actually use a coated board and a drag bit to scribe the coating, then drill
    it without removing it from the machine, then etch in FeCl. The scribe
    only needs to be offset .001. The scribe and probe mount off to the side
    of my spindle, that is the reason for the offsets. I also use
    Etch_Z_adjust for engraving other things using a normal engraving bit and
    separate probe which was the original reason for modifying it.
I used the Morton number optimizing method because it was fast and simple and
    better than nothing. I may rewrite the optimizing method later.
This is my first major attempt at Python programming, so it is ugly. It
    started simple, and 1100+ lines of code later.... So don't ask why I did
    something the way I did, the answer you will likely get is
    "Because it worked!"
More info on this and other stuff at lwill.net/blog
All comments are welcome, but I reserve the right to ignore them!

I can be contacted though lwill.net

Screen shot of GUI:

Number of View :21545

4 Responses to “PC Board Tools”

  1. JonasO Says:


    Amazing piece of code you’ve put together, and I’ve made good use of it in some cases.

    However, I’m struggling with using metric system gerber files.

    Did you hard-code the unit system on some level? I’ve tried to find it, but without luck.


  2. lwill Says:

    Thank you, for being the first to comment on the code and my blog! (aside from spammers)
    My code is just a “wrapper” or “front end” for pcb2gcode.
    Apparently there is a bug in pcb2gcode.
    I am in the US so do not work in metric, but I thought I tested it and it worked. I will take another look when I get a chance.
    I think most of the conversions are unit-less, so I think if you put metric in, output will be metric as well. You may just need to edit the preamble in the outputted G-code (G20/G21). The problem comes converting from one to another.
    I have found a other few bugs and made a few minor changes and will be posting an updated version soon.

  3. Senthil Seveelavanan Says:

    Hi, I thought I would be the second non-spammer! I hoping to mill PCB with my CNC also using KiCad. I came across your blog after trying to make ‘Etch_Z_adjust.py’ working. Thanks for this effort. I am going to dig in…

  4. lwill Says:

    Whooooo! On a roll now!
    Thank you.
    I have been using the tools lately and have made some more small changes, but think I have introduce a few more bugs.
    I will try to update them and upload them here for others to try soon,