Tutorials on python scripting in pcbnew

I’ve added this thread to the FAQ. Please consider editing the original post from time to time if you feel that something could be added that would keep someone from having to read the entire thread.
Thanks.

Agree, continue

/postmustbemorethan20char//

1 Like

thank you for the feedback.

changing the original post… Duh. should have thought of that myself. In fact, i think have have done just that in the past.

Youth is walking into a room and remember why. :slight_smile:

Does the autoplacement script work with hiearchical schematics?

@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:

https://i0.wp.com/kicad.mmccoo.com/wp-content/uploads/2018/01/kicad_svg_zone.png

Here’s the post:
https://kicad.mmccoo.com/2018/01/11/zones-with-holes-from-svg/

Here’s a related post on another blog of mine talking about the challenges of parsing svgs:
https://nerd.mmccoo.com/2018/01/11/understanding-and-parsing-svg-paths/

Here’s a video mostly talking about the steps needed in inkscape:
https://youtu.be/5vWBWuKbFg8

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.

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:

execfile("/home/tojan/workspace/github/kicad_mmccoo/replicatelayout/replicatelayout.py"
… )
Traceback (most recent call last):
File “”, line 1, in
File “/home/tojan/workspace/github/kicad_mmccoo/replicatelayout/replicatelayout.py”, line 151, in
SheetInstance.RegisterModulesAndNets(board)
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)

https://kicad.mmccoo.com/2018/01/30/scripting-fusion-360-designs-into-kicad/

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:
https://youtu.be/av5HwAFl2VI

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.
https://kicad.mmccoo.com/2018/04/03/kicad-c-walkthrough-footprint-apis/

3 Likes

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:
https://github.com/mmccoo/kicad_mmccoo

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

Hope you find it helpful.

4 Likes

3 posts were split to a new topic: Getting the area of the board

This post isn’t directly about scripting in pcbnew but is likely of interest to those running linux. In recent months, it’s been difficult/impossible for some to run pcbnew scripting at all due to seg faults.

I recommend running ubuntu 16.04 with the kicad nightly build

Ubuntu 18 and Linux Mint (based on ubuntu) expose some incompatibilities between Kicad and the libraries it depends on. Notably wxPython, but also wxWidgets and gtk. it’s a version mismatch thing.

As far as I understand it, the version mismatches have always been there, but we’ve gotten away with it. Recent distros have cleaned up which versions are installed to be more correct and it’s exposed our sins.

In my experience, the kicad team does a fantastic job in keeping the nightlies functional. In fact, because the official releases as so far between, it’s quite possible that the python scripts you find for pcbnew will not work on any official release. This is often the case with my own plugins. As I develop them, I discover that something is missing from the pcbnew API. So I implement it and submit a patch.

1 Like

I have a new video and some new code. This time it’s about a way to record the actions of a pcbnew plugin. It generates a file listing all of the pcbnew calls made and sourcing that file should produce the same output.

There are two use cases I had in mind.

  1. creating regression tests. The kicad team doesn’t want your plugin code (I assume they don’t) but plugins are a great way to test whether something in pcbnew’s python has changed. So Instead of running the plugin, run a journal of a run.

  2. Learning how someone did something. Maybe I want to do something similar to someone else’s plugin. Maybe that plugin has some sections that I just don’t understand. Perhaps the math is not relevant to what I want, maybe I’m a new programmer, a zillion reasons. I just want to know how they got pcbnew to do a thing.

The code can be found here on github:

Here’s a video demonstrating the code and how it works.

1 Like

I’m not 100% sure this post will be of interest to everyone, but…

I’ve been doing a fair bit with Boost’s c++ polygon and geometry libraries. These are libraries that enable one to manipulate polygons. merge, inflate, subtract. This can be useful for things like generating copper pours, design rule checking and more.

Since they’re c++ libraries (though the shapely is a wrapper around boost::geometry), they’re not directly python scripting. But since this thread is a clearing house of my writings, I’m adding it here.

I have other nerdly posting on my non-kicad blog: Using Boost polygon/geometry. Tutorial/tips/workarounds – Miles's Nerdy Thoughts

Here’s the video:

2 Likes

Hi @mmccoo, I’m getting an ‘internal server error’ when clicking on any of your links… Could you look into this? Thanks!!!

A post was split to a new topic: Manipulating Planes