Custom Shape Module =================== The custom shape module allows you to create new shapes for Dia without writing any C code. Instead, you just have to write a simple XML file describing the shape. This opens up the job of creating new shapes for dia to non programmers as well. The actual shape is described using a subset of the SVG specification. The line, polyline, polygon, rect, circle, ellipse, path and g elements are supported. Note that the path element only supports the M,m,L,l,H,h,V,v,C,c,S,s,Z and z commands. Transformations and CSS units are not supported (only `user' units are), and only a limited set of the CSS attributes are supported. A number of connection points can be associated with the shape, which are specified in the same coordinate system as the shape description. A text box can be associated with the shape. The custom shape code will make sure that the text entered into it fits the text box by resizing the image if necessary. The text box is specified in the same units as the shape. The rest is taken care of for you (resizing, moving, line connection, loading, saving, undo, etc). Shapes ====== A typical shape file may look something like this: Circuit - NPN Transistor npn.xpm Only the name and svg elements are required in the shape file. The rest are optional. The name element give the name of the object. The name is a unique identifier for this shape that is used for saving and loading. The icon element specifies an xpm file that is used as the icon in the dia toolbox. The filename can be relative to the shape file. If it is not given, a default custom shape icon will be used. The connections section specifies a number of connection points for the shape. The coordinate system for these points is the same as the coordinate system used in the svg shape description. The aspectratio element allows you to specify how the shape can be distorted. The three possibilities are: Any aspect ratio is OK (the default) Fix the aspect ratio for this shape. Give a range of values. The last option allows you to specify a range of allowable amounts of distortion, which may be useful in some cases. The textbox element (not shown) allows you to associate some text with the shape. The syntax is: Where the attributes give the bounds of the text box in the same coordinate system as the SVG shape description. The svg element describes the shape. The width and height attributes are ignored, and only given to comply with the SVG specification. For more information on SVG, see the W3C pages about the format at: http://www.w3.org/Graphics/SVG/ The next section details what parts of the SVG spec can be used in shape files. The Shape Description ===================== The Scalable Vector Graphics format is used to describe the shape. That is why the separate namespace is used for that part of the file. Each of the SVG drawing elements understands the style attribute. The attribute should be of the form: Currently only the following style attributes are understood: stroke-width - The width of the line, relative to the user specified width. stroke-linecap - The line cap style. One of butt, round, square, projecting (a synonym for square), or default. stroke-linejoin - The line join style. One of miter, round, bevel or default. stroke-pattern - The dash pattern. One of none, dashed, dash-dot, dash-dot-dot, dotted or default. stroke-dashlength - The length of the dashes in the dash pattern, in relation to the user selected value (default is a synonym for 1.0). stroke - The stroke colour. You can use one of the symbolic names foreground, fg, default, background, bg inverse, text or none, or use a hex colour value of the form #rrggbb. fill - The fill colour. The same values as for stroke are used, except that the meaning of default and inverse are exchanged. By default, elements are not filled, so to get the default fill, use "fill: default" So to draw a rectangle with a hairline stroke, the following would do the trick: The recognised drawing elements are: This is the group element. You can place other drawing elements inside it. The contents of the style attribute on a group element will propagate to the contained elements (unless they override it). This element is a line. This is a polyline. That is, a number of connected line segments. The points attribute holds the coordinates of the end points for the line segments. The coordinates are separated by white space or commas. The suggested format is "x1,y1 x2,y2 x3,y3 ...". This is a polygon. The points argument has the same format as the polyline. This is a rectangle. The upper left corner is (x1,y1), and the lower right corner is (x2,y2). This is a circle with centre (cx,cy) and radius r. This is a ellipse with centre (cx, cy) and radius rx in the x direction and ry in the y direction. This is the most complicated drawing element. It describes a path made up of line segments and bezier curves. It currently does not support the elliptic arc or quadratic bezier curves. The d string is made up of a number of commands of the form "x arg1 arg2 ..." where x is a character code identifying the command, and the arguments are numbers separated by white space or commas. Each command has an absolute and relative variant. The relative ones use the end point of the previous command as the origin. The supported commands are: M x,y Move cursor L x,y Draw a line to (x,y) H x Draw a horizontal line to x V y Draw a vertical line to y C x1,y1 x2,y2, x3,y3 Draw a bezier curve to (x3,y3) with (x1,y1) and (x2,y2) as control points. S x1,y1 x2,y2 Same as above, but draw a `smooth' bezier. That is, infer the first control point from the previous bezier. Z Close the path. If the path is closed with z or Z, then it can be filled. Otherwise, it will just be drawn. Design Notes ============ The custom shape code is designed so that a sheet of objects can be self contained in a single directory. Installing new shapes can be as easy as untaring a .tar.gz file to ~/.dia/shapes or $(prefix)/share/dia/shapes. If you have any suggestions for this code, please tell me. James Henstridge