When making small boards, it’s often economical to put multiple copies of the project on one panel to make best use of the available board size. In EDA tools without explicit support for panelisation this is usually accomplished by copy and pasting the the finished board or by use of tools that operate on the exported gerber data. This approach has the downside that last-minute changes to the board such as updating the silkscreen require the whole manual panelisation process to be redone.

As the first approach of copy/pasting the board inside the layout tool itself doesn’t work in Horizon EDA due to the strong link between board and netlist, I decided it’s a good idea to add support for proper panelisation.

Panelising an existing board in Horizon EDA now is a simple multi-step process:

  1. Create a new empty project and open the board.
  2. Use the "Manage included boards" tool to load the board(s) to be placed on the panel.
  3. Place the included boards using the "Place board panel" tool.

The boards can then be arranged as one object each without the possibility of unintentionally modifying it. To update the included boards, either use the reload button in the "Manage included boards" tool or reopen the project.

For making it easier to draw the panel outline, the outline of included boards can be extracted using the "Smash panel outline" tool.

Additionally, the board editor has grown a new layer "Outline notes" for adding annotations such as text or lines to the exported gerber outline data. These can’t be placed on the regular outline layer as it should only contain the actual outline polygons used for generating the board shape in 3D preview and STEP export.

To my best knowledge, this makes Horizon EDA the first free and open source PCB layout tool to have panelisation built in.

Polygon vertex selection

In hover select mode, the interactive manipulator automatically selects the smallest object under the cursor based on the area of its selection box. This works surprisingly well for regular objects, but didn’t work so well for selecting polygon vertices as they have the same area (0 × 0 = 0) as polygon edges (l × 0 = 0).

To improve on this the get_area() method now returns the length of the nonzero coordinate, so that a vertex is smaller than an edge. Since all dimensions are calculated in nanometers, chances are very low that an object with width and height will return a smaller area than an edge.

Tool renumber pads: circular renumbering

For quite some time we’ve had a tool to renumber pads in a zig-zag order as it’s common among connectors. In the past month, the tool has been enhanced to support circular renumbering:

renumber pads

Symbol editor enhancements

Recently, people were asking about automated creation of symbols from units. Since I didn’t see much value in this as there’s more to a well-designed symbol than placing inputs left and outputs to the right, I decided to take this as a suggestion to improve the symbol editor in various ways.

Preview for autoplacing pins

To make it easier to place consecutive pins, the symbol editor supports placing pins based on the last and second to last pin by pressing the return key. To increase the discoverability and ease of use of this interaction, the place pin tool now shows a preview of the to be placed pin:

pin preview

Autoplace all pins

Rather than pressing return as many times as there are pins, the place pin tool can now place all remaining pins by pressing the p key.

Show bounding box

In most symbols, all pins should be placed on the edges of rectangle centered around symbol’s origin. To help with this, the symbol editor has been enhanced to show the bounding box formed by the pins.

symbol outline

The bounding box is updated automatically while moving pins.

Resizing symbols

Resizing a symbol to make room for more pins or for rearranging existing pins tends to be a laborious task that involves moving pins, the symbol’s box and text. As all of this is governed by rather simple rules, the tool “Resize symbol” has been introduced that tries its best to keep things aligned:

Outline layer in packages

Some parts make it necessary to include cutouts in the board to accommodate features of their package that would collide with the board otherwise. It’s preferable to make these cutouts part of the package itself to ensure consistency.

To enable this, it’s now possible to draw polygons on the outline layer in packages that’ll also show up on boards. As the outline drawn in the package might need to be modified for use on the board, the outline can be smashed from the package and edited as needed.

Enhanced touchpad navigation (PR #352)

As pointed out by user anuejn in issue #350 it could be useful to use touchpad scroll gestures for panning rather than for zooming. Their PR added an option in the preferences to achieve this. To improve consistency with other applications, both trackpoint and touchpad panning use the same scroll directions as other scrollable widgets provided by Gtk.

While KiCad has an identically-named option, our implementation is superior in two ways, both of which are enabled by Gtk’s excellent input device handling:

  1. The option only applies to touchpads since Gtk can tell from which device an event originated.
  2. We support fractional/smooth/pixel perfect scrolling, (finer increments than provided by emulated scroll wheel clicks) resulting in a much smoother panning experience since even small movements translate to a panning motion.

Pool cache monitor

In order to use a part after modifying it in the pool manager, it’s necessary to update it in the pool cache if the part is already used in the project. As this step might not be obvious at first glance, especially for newcomers, I decided to improve on the situation.

To let the user immediately know if there’s an item in the pool cache that has become out of date, the pool cache is monitored for changes (triggered by pool updates and modification of the cached files) and its status is shown right in the project manager:

pool cache status

The “Refresh list” button is still there in the pool cache window as the monitor doesn’t pick up changes in cached 3D models.

Since we now have the current status (out of date / current / missing) of all items in the cache always available, implementing Pitrsek’s suggestion to show a warning when placing a part that’s outdated in the cache got feasible.

pool cache warning

Deciding when to display the warning message is a bit more involved than one might initially think as not only the part itself, but also one or more of the items (unit, symbol, etc.) making up the part might be out of date. To quickly find all dependencies of the selected part, the part browser uses a recursive SQL query. This list is then checked against the pool cache status. Clicking on the “Pool Cache” button will open the pool cache window with all out-of-date items preselected.

Git add from pool manager

When adding a new part to the pool, it’s sooner or later required to git add the part with all of its dependencies. To simplify this process and to make sure that no item is left behind, the Git tab in the pool manager grew a new button “git add with dependencies” that – as the name implies – stages the selected item and all of it’s dependencies. Again, a recursive SQL query is used to quickly find the dependencies.

What’s next?

As outlined in the previous post, release 1.1 is due by end of this month, so don’t expect too many new features until then.