Mike Parr. 5/Sep/2013 .... mikeparr@live.com
Gram is a simple language for creating box diagrams (text in circles and boxes, joined by lines). If you change the position of a box, any lines attached to it will also move automatically. It is not interactive - you create a text file with an editor, which describes the diagram to be created. It is open source. Rather old, and I'm sure there are better alternatives now.
Download the exe, manual (this page), and examples here: gram-docs.zip (Around 60Kb).
I got frustrated with drawing simple diagrams using e.g. Word. I could not find a very simple text-based tool either. (Yes, I have read about the pic and dpic little languages, which were possible). I looked at svg and decided to use it, so wrote a program to create svg from my diagram instructions.
I know that shape drawing is a classic OO task, but decided to implement a non-OO version at first. This was a mistake, as the code is a complete mess. But it does what I want, and I cannot be bothered to re-write it.
It is open-source, written in Delphi - around 1000 lines - would probably run with lazarus or Free Pascal - it does not use a gui. It runs from the Windows command line, but I imagine it would be simple to run under Gnu/Linux.
here is some code - in a text file - and the picture it produces.
#flow chart for 'if' boxtop 300 100 text 40 or above? boxleft 200 200 text cout "fail" boxright 400 200 text cout "pass" boxbot 300 300 text cout "end of results" arrow boxtop.b1 boxleft.t arrow boxtop.b3 boxright.t arrow boxleft.b boxbot.t arrow boxright.b boxbot.t iboxfalse 200 150 text false iboxtrue 400 150 text trueXML picture here.
Eg:
gram infile.txt outfile.xml
The infile has gram instructions, the outfile can be viewed by a web browser - you can copy/paste the image from the browser (and shrink/enlarge as well).
Sample files and pictures are provided with this doc - see elsewhere.
The drawing area has 0,0 at the top left. A typical small diagram might be e.g 300 by 300 units.
For shapes, you provide the coordinates of their centres, This makes it easy to line them up. They expand to show your required text, but the centre does not move. So your first task is to sketch the diagram (I use paper) and choose numbers for the centres of each shape.
Here are the shapes. Their first letter denotes the kind of shape.
It surrounds your given text with a rectangle. Note that each line of your text is centred, not left-justified.
Start the box name with a 'b', then any letters, digits, e.g:
b12 box1 bHeading
Provide 2 absolute coords for centre.
Provide 1 line of text, or several lines, ending them by 'endtext'. 2 examples:
b23 300 400 text The black cat b21 333 450 lines The cat sat on the mat. endtext
Use 'text' for 1 line (after the word 'text') or use 'lines'. If the text includes any special XML/HTML characters, (such as 'less than') you need to use the ampersand version. The numbers can be negative (only useful if you use 'set' to shift the origin).
Invisible box. Start with 'i', e.g iHeader, i234
Use like a box, but the rectangle is not drawn:
ititle 234 456 text My Picture
Start with a 'c', e,g circle, c66. Use like box.
c66 444 555 text some words
Start with a 'p'. Like a circle, with no text given. You can use this to join lines.
p88 500 800
Joins 2 shapes. You do NOT provide numbers. Instead, you refer to shape names. Here is how we join 2 circles:
line c66 cBig
The word 'line' is compulsory. For circles, just use their name. (They must have been created before the line instruction is obeyed.)
For boxes, use a '.' to precede a point on the side of the box, as in:
t0 t1 t2 t3 t4/r0 (top) l0 r0 l1 (left) r1 (right) l2 r2 l3 r3 l4/ r4/ b0 b1 b2 b3 b4 (bottom )
So:
line c66 b44.b0
draws from a circle to the bottom left corner of a box. There are 5 points on an edge.
The edges are named t b l r - top bottom left right. (nb left is a lower-case 'L', not a 'one'). If we omit the number, as in b44.t the line is drawn to the midpoint of the edge (like t2).
Corner points have 2 names - e.g b0 is the same as l4
A circle or point cannot have a dotted edge position.
Along with line, we have arrow and midarrow.
Arrow has an arrow at the end of the line (the 'to' end.)
midarrow has an arrow in the middle.
For special shapes (e.g. triangles) there is a fixedline, where you specify the 4 absolute cooridinates x1 y1 x2 y2:
fixedline 22 33 444 555
There are a few set commands:
set xorigin 100 set yorigin 200
These change the top left coords to your chosen value.
set fontsize 14
The initial font size is 16. You can change this. - it is untested.
set scale 90
shrinks the distance between shapes by a percentage (set initially to 100.