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.

As of version 1.0.8 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.8
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
autoplace608 works buildin Automatically place elements.
autoroute4177 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.
djopt2315 works buildin Various board optimization algorithms.
export_gcode2450 works buildin Export to gcode
export_lpr96 works buildin Export to lpr (using export_ps to generate postscript)
export_nelma683
export_ps1608 works buildin Export postscript or embedded postscript.
gpmi2992 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_sch255 works buildin Imports element and netlist data from the schematics (or some other source).
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.
oldactions53 works disabled Random collection of old/obsolete actions. Bell(): audible feedback; DumpLibrary(): print footprint library on stdout
puller1878 works buildin Pull traces to minimize their length.
renumber218 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.
toporouter6161 fails
(infinite loop in gts)
disabled Automatically route selected or all rats using a topological algorithm. This is the new autorouter from 2009.
vendordrill567 works buildin Vendor drill mapping.