Tutorials on python scripting in pcbnew


@MitjaN yes,the replicate script does work with hierarchical schematics. The trick is whether to look for replication on the lower levels of hierarchy or the upper ones. I wish pcbnew supported properties. After I did my placement by sch script, I think I might be able to fake the properties thing by just parsing the schematics. Among other things, that would be a good place to store the desired spacings from one copy to the next. It would further make things clearer because it would also say which level is replicated. Send me a link to a testcase and I can take a look if it’s still relevant.

@hermit It appears I can’t edit my earlier posts. I don’t see the pencil icon on posts older than 40 days.

New post on zones with holes from svg

In other news, I have a new blog post. It’s about a script (and the hows behind it) that takes an svg file (only inkscape tested) and converts it to zones like this:


Here’s the post:

Here’s a related post on another blog of mine talking about the challenges of parsing svgs:

Here’s a video mostly talking about the steps needed in inkscape:

Sorry it sometimes takes a while for me to reply to this thread. The announcements tend to get lost with other stuff in my gmail.

Any feedback, criticism, ideas,… are welcome. Replies to this thread, references in other threads, or direct mail (address is on my blog) are fine.

Editing older posts

5 posts were split to a new topic: Editing older posts


This is really a great post, thank you so much for compiling this information.

Does anyone know of a similar post that focuses on the schematic side of things???


eeschema does not yet have a Python API, but there are some standalone Python wrappers for schematic and symbol libraries, e.g. https://github.com/KiCad/kicad-library-utils/blob/master/sch/sch.py


I tried to using the replicatelayout.py on the latest KiCad version on ubuntu (4.0.7) but it fails due to missing functions in the pcbnew.py. is there any chance to get it running on a stable release or does I have to wait for 5.0.0?


@Tojan Could you post the error message you’re getting?

I usually run on a Dev build but I should probably try using the stable PPA version (I’m guessing that’s what you have).

There is a nightly PPA as well

The kicad folks are pretty good about keeping the nightlies functional.

If you do try with a nightly and it still doesn’t work, then definitely let me know. Also, if you have test design I can try, I would love that too.


Due to work regulations it is not possible for me to work with the nightly build I’m afraid.

the error code is:

… )
Traceback (most recent call last):
File “”, line 1, in
File “/home/tojan/workspace/github/kicad_mmccoo/replicatelayout/replicatelayout.py”, line 151, in
File “/home/tojan/workspace/github/kicad_mmccoo/replicatelayout/replicatelayout.py”, line 97, in RegisterModulesAndNets
for net in board.GetNetsByNetcode().values():
File “/usr/lib/python2.7/dist-packages/pcbnew.py”, line 4806, in
getattr = lambda self, name: _swig_getattr(self, BOARD, name)
File “/usr/lib/python2.7/dist-packages/pcbnew.py”, line 83, in _swig_getattr
raise AttributeError("’%s’ object has no attribute ‘%s’" % (class_type.name, name))
AttributeError: ‘BOARD’ object has no attribute ‘GetNetsByNetcode’

As said I took a look into the pcbnew.py of the stable build and it seems like some functions and attributes you are using are missing there.


I have a new post on my kicad scripting blog. This one showcases some of the things you can do in scripting (If I were god, most of the editing functionality of pcbnew… most tools actually, would be writting in scripting languages. It would be much easier for folks to customize)


I’ve made a youtube showing all of the steps I used to generate this board:

which I drew mostly in fusion 360:

Here’s the video:

The post and the video don’t explain much about how the scripts work, but I do want to recommend a couple existing python libraries out there:

When playing around with the libraries below, remember that while they may return some cryptic data structure, you can often wrap that structure into a list(blah) call. Those structures are often/usually just a list and passing it to the list function gives you the kinds of lists you’ll fine more familiar.

The SciPy library is fantastic for graph algorithms like minimum spanning tree and delanay triangulation

The shapely library is very nice for polygon manipulation. Merging polygons, bloating and shrinking them… Designing layout is mostly geometric, so this is a nice tool to have in your pocket.

The dxf_grabber library is how I parse dxf files. Together with shapely, you can do a lot of import stuff.


I have a new post/youtube:
Kicad C++ walkthrough (adding python footprint APIs)

First, two important notes:

  • It came to my attention that kicad 4.0.7 is missing a bunch of python interface related stuff. From my experience, the nightlies available from the kicad download page are quite good and stable.
  • The first post of this thread has been converted to a wiki and I will use it as a sort of table of contents for this thread.

This time, I talk a bit about the c++ code of pcbnew, focusing on the parts that relate to the python interface.

I also have a related blog post, but it doesn’t really add anything.


I have a new video demonstrating some plugins I wrote for importing fusion360 DXF files. This is basically the same as my previous post, except “productized” as plugins.

The code for the plugins can be found here:

See the README on how to enable them in your env.

Hope you find it helpful.


I’d like to know the area surrounded by the Edge.Cuts layer. Any hints to get this result using the scripting console?


Don’t hijack the thread, ask in separate thread.