pcb-rnd modularization

Why bother...

I believe good software should be modular. This is especially important in the context of large software, such as CAD applications. There should be a thin core that can model the world and provide the basic operations defined on it but anything else should go in separate modules.

Fortunately PCB already had a strong infrastructure supporting this idea. It has dynamic loadable plugins and the GUI and exporters are in separate HID modules. While working on pcb-gpmi and later pcb-rnd, I added the gpmi module as a separate plugin.

In version 1.0.8 and 1.0.9 a cosiderable chunk of core code has been moved into core plugins. A core plugin is just a plugin that is maintained together with the core, in the same repository, still the code is somewhat detached from the core. More importantly, the user can choose, for each plugin, separately:

I believe such modularization has benefits on multiple levels:

Progress in charts

Before-after

All numbers are in SLOC and are acquired running sloccount on the given directory. While lines of code alone is not a true measure of complexity, it's a good estimation. The slices of pie charts are the major components of the pcb-rnd executable.
       
Before modularization: pcb-rnd version 1.0.7
Note: gpmi was already a plugin
After modularization: pcb-rnd version 1.0.9
Note: gpmi is part of the "plugins" slice

Zooming on to the plugins

(Red means the plugin doesn't really work).

Progress in numbers

Below is a table with the summary of core plugins.
module size [sloc] status configure
default
description
autoplace612 works buildin Automatically place elements.
autoroute4337 works buildin Automatically route selected or all rats. This is the original autorouter.
dbus438 disabled
(TODO: needs scconfig support)
disabled Remote control PCB using DBUS.
djopt2320 works buildin Various board optimization algorithms.
export_bom374 works buildin Export bom (Bill of Materials)
export_gcode2452 works buildin Export to gcode
export_gerber972 works buildin Export to gerber
export_lpr96 works buildin Export to lpr (using export_ps to generate postscript)
export_nelma685 works buildin Export to nelma (Numerical capacitance calculator)
export_png1107 works buildin Export to png, gif and jpeg
export_ps1613 works buildin Export postscript or embedded postscript.
fontmode163 works buildin Font editing actions.
gpmi3003 works buildin
(if gpmi is installed)
Scriptable plugin system with about 10 scripting languages supported and dynamic load/unload of scripts that can manipulate the GUI, the board, can implement exporters, etc.
import_edif3578 works buildin Import code for netlists in the EDIF format.
import_sch259 works buildin Imports element and netlist data from the schematics (or some other source).
legacy_func72 works buildin Random collection of old/obsolete (legacy) functions. 3rd party plugins may depend on them. This module implements C functions and variables and does not register actions or flags.
mincut886 works buildin Use the minimal cut algorithm to indicate shorts: instead of highlighting two random pins/pads, try to highlight the least number of objects that connect the two networks.
oldactions57 works disabled Random collection of old/obsolete actions. Bell(): audible feedback; DumpLibrary(): print footprint library on stdout
puller1884 works buildin Pull traces to minimize their length.
renumber222 works buildin Renumber elements (renaming them) and generate a text file for back annotation.
stroke124 partially works (doesn't work with lesstif; works with the gtk hid, but there's no zoom bindings) disabled
(requires libstroke installed)
Gesture recognition with libstroke.
toporouter6165 fails
(infinite loop in gts)
disabled Automatically route selected or all rats using a topological algorithm. This is the new autorouter from 2009.
vendordrill572 works buildin Vendor drill mapping.