fig, a drawing editor, mostly stolen from Gargoyle. A picture is constructed of objects (polygons and circles). Objects are constructed by placing the `current point' at each of a sequence of points that define the object. There is a collection of alignment objects toward which the current point gravitates when dragged. Each object in the scene is an alignment object. Additionally, the user can specify a set of points and lines on the screen (hot spots) and a set of rules by which alignment objects should be created, e.g.: circles of a given radius around each hot point lines of a given slope from each hot point lines a given distance away from each hot line lines of at given angle at the endpoints of each hot line midpoint of each hot line The user can specify that appropriate pieces (points and lines of a polygon, center of a circle) of the current selection be made hot if it is being edited, (but not if it's being transformed). File commands: read/write a file start over Selection commands: select a circle/point/line/polygon Object creation commands: start a new circle/polygon (selects an empty polygon) Object editing commands: change center/radius of selected circle break the selected edge move the selected point close the selected polygon delete the selected object Transformation commands: drop anchor translate/rotate/scale the selected object Measurement commands: measure/type an angle/distance/slope Alignment construction commands: circles of a given radius around each hot point lines of a given slope from each hot point lines a given distance away from each hot line lines at a given angle at the endpoints of each hot line midpoints of hot lines Hot spot selection commands: heat/cool the selected object cool everything always/never heat the selection being edited Global definitions: struct object{ char type; /* CIRCLE/POLYGON/CLOSED/POINT/LINE */ Point c; /* center of circle */ int r; /* radius of circle */ int nv; /* number of vertices in polygon */ Point *v; /* polygon/line/point vertices */ struct object *container; /* polygon containing the point or line */ struct object *next; /* next member of list */ }; /* * object types */ #define CIRCLE 1 /* a circle */ #define POLYGON 2 /* an open polygon: first and last vertices unconnected */ #define CLOSED 3 /* a closed polygon: last vertex connected to first */ #define POINT 4 /* a single point, possibly part of some polygon */ #define LINE 5 /* a single line, possibly part of some polygon */ struct object *scene; /* the thing being drawn (type in CIRCLE, POLYGON) */ struct object *align; /* list of gravitating objects (CIRCLE, POINT, LINE) */ struct object *hotspot; /* list of hot spots (POINT, LINE) */ struct object *select; /* selected objects (CIRCLE, POLYGON, POINT, LINE) */ Point current; /* the current point */ char hotsel; /* make selection hot when editing */ Point anchor; /* reference point for transformations */ struct alignrule{ char type; /* PTCIRC/PTANG/LNDIST/LNANG/MIDPT */ int v; /* rule parameter */ struct alignrule *next; }*rule; /* * alignment rule types */ #define PTCIRC 1 /* a circle of radius v at each hot point */ #define PTANG 2 /* a line at angle v at each hot point */ #define LNDIST 3 /* a line at distance v from each hot line */ #define LNANG 4 /* a line at angle v from each end of each hot line */ #define MIDPT 5 /* the midpoint of each hot line */