TechDraw TemplateGenerator

Introduction
This tutorial describes how to generate a simple template to use with the TechDraw workbench out of some lines of Python code.

Any text editor can be used to code. My choice is Atom, but FreeCAD's built-in editor works well, too.

The following code examples can be copied and pasted into an empty text file and then saved under a name of your choice as a *.py or *.FCMacro file.

A template provides a background for the drawing tasks and its dimensions are used by the printer drivers to scale the drawing correctly.

The templates are svg-files and so a macro has to compose some lines of svg code (which is a subset of xml code).

Structure of a simple blank page
The SVG format is a subset of the XML format. That is why an SVG file, like any XML file, consists of two parts:
 * Head, a format declaration
 * Body, containing the information what to show and where to place it
 * (I don't know why there should be a headline, the svg-file is still a valid template file without it...)

Head
The head is just one line to declare which version of the XML language an interpreter should use to handle the instructions in the body.

Body
The Body starts with an opening tag which contains information about name spaces and about the size of the template and where to place it. And it finishes with a closing tag.


 * xmlns="http://www.w3.org/2000/svg": External link to the xml name space to look up standard xml commands
 * version="1.1": Used xml version is 1.1
 * xmlns:freecad="Svg Namespace": External link to FreeCAD's name space extension to look up special commands that are only used inside a FreeCAD environment e.g. for editable texts.
 * "freecad:" will be prefixed to attribute names to have them handled by said special commands.
 * width="420mm": Width of the drawing area
 * height="297mm": Height of the drawing area
 * viewBox="0 0 420 297": Position of the upper left corner (0;0) and the lower right corner (420;297) in the svg construction space (in svg units).
 * Width, height, and viewBox in this combination set 1 svg-unit to 1 mm for the whole document. A dimensional unit can be omitted from now on.
 * In this case 420 and 297 give an A3 page. Customise these values to generate other page sizes.

For a blank page size DIN A3 in landscape orientation that's all.

Python code...
Before any code is generated a folder is needed to store the new template file.

The user should have selected a template folder. Its path is then stored in the TechDraw preferences. It is not necessary to know where the preferences are store, because FreeCAD has commands to address needed parameters directly.

parameter_path receives the path to the "folder" within the configuration file where "TemplateDir" parameter can be found. template_path receives the content of "TemplateDir" which is the path to the template directory. template_name recieves the name of the template to be created.

Now the template name needs to be linked to the template path in a way that is compatible to unix based OSs and Windows. This is done with the "os.path.join" command and stored into the template_file.

... to create a blank page
This macro shows the principle how an svg-file can be put together. (Format is A3)


 * The main principle is:
 * to open a file for writing and so start an svg-file from scratch, write the header line and close the file as a first step.
 * and then to repeatedly open the file to append further segments and then close it again after appending.
 * The macro is made of several functions which are called from the main section.
 * Additional functions could be inserted before the EndSvg function and the needed calls are put before the EndSvg call.
 * We need to have an eye on the number of spaces used with the write operations for a correct indentation.
 * We need to have an eye on the number of spaces used with the write operations for a correct indentation.

... to create a page with some ink
To make a drawing out of a blank page we need:
 * Frames i.e. rectangles created with the rect instruction
 * a title block and more made of lines created with the path instruction
 * simple texts for indexes and labeling title block cells
 * editable texts like part number or part name

Normally these graphical elements are used repeatedly and so the generating code is put into functions.

svgrect function
To draw a rectangle we just need to call the svgrect function and hand over the values for width, height, and position of the upper left corner. That is better readable than the content of the svgline which had to be used instead.

svgpath function
To draw a line we just need to call the svgpath function and hand over the coordinates of the start point and the endpoint of a line.

Instead of the end point coordinates we can hand over a tag to draw a horizontal (h) or vertical (v) line followed by the length of the line or the tag to draw a horizontal (H) or vertical (V) line followed by the x or y ordinate of the end point.

Each path starts at the origin and the first action is a movement with "raised pen" (not drawing) to the start point. In this case the relative movement and the absolute movement are the same and so it is irrelevant whether the m-tag is upper or lower case.

svgtext function
To draw a piece of text we just need to call the svgtext function and hand over the coordinates of the text's anchor point and the text string itself.

(The text alignment is controlled by the surrounding group tag or left-aligned as default).

FCeditext function
To draw a piece of editable text we just need to call the FCeditext function and hand over a name, the coordinates of the text's anchor point, and the text string itself.

FreeCAD creates a dictionary object with every inserted template, and each entry has a name (key) and a value.

(The text alignment is controlled by the surrounding group tag or left-aligned as default).

CreateXxxx functions
These functions start with code to open a file in append mode and to write the group opening tag.

Then follows a section to set and calculate values and with write instructions that call the above functions to generate svg-code.

And finally the group closing tag followed by an instruction to close the file.

Resulting macro
This macro adds some basic graphical elements needed for proper templates i.e. line elements, texts, and editable texts.

And this is the svg-code coming out of this macro:

And what it should look like when inserted (plus magnified title block):