metapost

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Next revisionBoth sides next revision
metapost [2019/12/24 00:32] – Break line tarquinwjmetapost [2020/03/01 22:57] – grammar tarquinwj
Line 200: Line 200:
 This function simplifies it all. Add it once, and then any of your custom points can call it to add a label. This function simplifies it all. Add it once, and then any of your custom points can call it to add a label.
  
-[[user:tarquinwj|Tarquin 2019]]+[[user:tarquinwj|Tarquin 2019-2020]]
  
 <code> <code>
 code metapost code metapost
   vardef create_styled_label (expr plaintext,P,R,S,A,defaultstyle)=   vardef create_styled_label (expr plaintext,P,R,S,A,defaultstyle)=
-    save textsize, style;+    save textsize, style, thetext;
     string textsize;     string textsize;
     if S = 0.5:     if S = 0.5:
Line 271: Line 271:
 For an example of code making use of this function, see [[#Rope lengths]] below. For an example of code making use of this function, see [[#Rope lengths]] below.
  
 +If you want to add custom label styles, you need to call "thelabel.suffix(thetext,position)" with the right alignment suffix, save the return value in a variable called "lab", then call "process_label(position,rotation)". After that, you can check "bbox lab" to get the bounding box of the text label as a path which can be used to draw the decoration. You can temporarily ("interim") set the internal "bboxmargin" variable to make the bounding box larger than the text. You should use "begingroup+endroup" within a "def" when using the "interim" operator to make sure it gets reset correctly afterwards, or use a vardef instead of a def.
 +
 +Use "rotatedaround (position,rotation)" when drawing the ornamentation to make sure it gets rotated and aligned the same as the label. Note that this applies the rotation around the point position, so alignment and rotation at the same time is weird. This is the same with regular labels though - known Therion bug - so at least this is consistent with Therion itself.
 +
 +Since this will require setting the suffix correctly for both the regular label styles and the custom label styles, there ends up being a lot of duplicated code. It is easier to store the suffix name as a string which can then be extracted with scantokens when calling the appropriate macro, which is what the example code below does. The custom decorations are specified using a style number starting from 100, so as not to clash with the numbers used for Therion's internal label styles.
 +
 +<code>
 +code metapost
 +  vardef create_styled_label (expr plaintext,P,R,S,A,defaultstyle)=
 +    save textsize, style, thetext, sufx, athick;
 +    string textsize;
 +    if S = 0.5:
 +      textsize:="\thtinysize";
 +    elseif S = 0.7:
 +      textsize:="\thsmallsize";
 +    elseif S = 1.4:
 +      textsize:="\thlargesize";
 +    elseif S = 2:
 +      textsize:="\thhugesize";
 +    else: % normal is 1
 +      textsize:="\thnormalsize";
 +    fi;
 +    if known ATTR_labelstyle:
 +      style:=scantokens(ATTR_labelstyle);
 +    else:
 +      style:=defaultstyle;
 +    fi;
 +    picture thetext;
 +    thetext:=thTEX("\thframed {" & textsize & plaintext & "}");
 +    % store the alignment suffix as a string, it will be turned back into a suffix with scantokens
 +    string sufx;
 +    if A = (-1,1):
 +      sufx:="ulft";
 +    elseif A = (0,1):
 +      sufx:="top";
 +    elseif A = (1,1):
 +      sufx:="urt";
 +    elseif A = (-1,0):
 +      sufx:="lft";
 +    elseif A = (1,0):
 +      sufx:="rt";
 +    elseif A = (-1,-1):
 +      sufx:="llft";
 +    elseif A = (0,-1):
 +      sufx:="bot";
 +    elseif A = (1,-1):
 +      sufx:="lrt";
 +    else:
 +      sufx:="";
 +    fi;
 +    if style >= 100:
 +      % create the label, passing the alignment as a suffix
 +      lab:=thelabel.scantokens(sufx)(thetext,P);
 +      % process_label looks for a variable called "lab"
 +      process_label(P,R);
 +      % define all the different ornamentations that you want
 +      if style = 100:
 +        pickup PenA;
 +        athick:=(xpart (lrcorner PenA)) - (xpart (llcorner PenA));
 +        % make bounding box measurements temporarily be larger than the object being measured
 +        % "interim" modifies internal variable, must be inside vardef or def+begingroup to make
 +        % sure it gets reset to default correctly afterwards
 +        interim bboxmargin:=5athick;
 +        % rounded rectangle
 +        % rotating around P is undesirable when alignment is also used, but this is what regular labels do
 +        draw ((bbox lab) smoothed 5athick) rotatedaround (P,R) dashed evenly;
 +      fi;
 +    else:
 +      % create the label, passing the alignment as a suffix
 +      p_label.scantokens(sufx)(thetext,P,R,style);
 +    fi;
 +  enddef;
 +endcode
 +</code>
 =====Replacing legend drawings for existing symbols===== =====Replacing legend drawings for existing symbols=====
  
Line 572: Line 646:
 ===Magnetic effects=== ===Magnetic effects===
  
-[[user:tarquinwj|Tarquin 2019]]+[[user:tarquinwj|Tarquin 2019-2020]]
  
 Certain rocks can cause a compass to give the wrong reading. This icon can be used to show areas where this happens (ie. where the survey may be unreliable as a result); a spinning compass: Certain rocks can cause a compass to give the wrong reading. This icon can be used to show areas where this happens (ie. where the survey may be unreliable as a result); a spinning compass:
Line 580: Line 654:
   % a spinning compass   % a spinning compass
   def p_u_magnetism (expr P,R,S,A)=   def p_u_magnetism (expr P,R,S,A)=
-    scale:=0.5u; +    begingroup; 
-    halfline:=(0.5u/20S); %half thickness of PenC - pen thicknesses do not scale with S +      save scale, cthick, pointheight, pointwidth, cutheight, cutwidth; 
-    pointheight:=scale*.9; +      scale:=0.5u; 
-    pointwidth:=scale*.4; +      cthick:=(xpart (lrcorner PenC)) (xpart (llcorner PenC)); 
-    U:=(scale,scale); +      pointheight:=scale*.9; 
-    T:=identity aligned A rotated (R-20) scaled S shifted P; +      pointwidth:=scale*.4; 
-    % a circle +      cutheight:=pointheight - (cthick / sind(angle(pointheight,pointwidth))); 
-    thdraw fullcircle scaled 2scale withpen PenC withcolor black+      cutwidth:=pointwidth - (cthick / sind(angle(pointwidth,pointheight))); 
-    % filled triangle +      U:=(scale,scale); 
-    thfill (0,pointheight)--(pointwidth,0)--(-pointwidth,0)--cycle withcolor black+      T:=identity aligned A rotated (R-20) scaled S shifted P; 
-    % black triangle outline +      % a circle 
-    thdraw (0,-pointheight+halfline)--(pointwidth-halfline,0) withpen PenC withcolor black; +      thdraw fullcircle scaled 2scale withpen PenC; 
-    thdraw (0,-pointheight+halfline)--(-pointwidth+halfline,0) withpen PenC withcolor black+      % filled triangle 
-    % spin arcs, a full circle is path 0-8, anticlockwise, starting from the right +      thfill (0,pointheight)--(pointwidth,0)--(-pointwidth,0)--cycle; 
-    thdraw subpath (2.4,3.5) of fullcircle scaled 1.5scale withpen PenC withcolor black+      % black triangle outline 
-    thdraw subpath (6.4,7.5) of fullcircle scaled 1.5scale withpen PenC withcolor black;+      % this can be drawn with mitred pens, but it still ends up needing calculations to get the centre position of the pen thickness 
 +      % therefore it is easier to just use a filled path 
 +      % pointheight/2 is used to stop the thin unpainted gap between shapes 
 +      thfill (0,-pointheight)--(pointwidth,0)--(0,pointheight/2)--(cutwidth,0)--(0,-cutheight)--(-cutwidth,0)--(0,pointheight/2)--(-pointwidth,0)--cycle
 +      % spin arcs, a full circle is path 0-8, anticlockwise, starting from the right 
 +      thdraw subpath (2.4,3.5) of fullcircle scaled 1.5scale withpen PenC; 
 +      thdraw subpath (6.4,7.5) of fullcircle scaled 1.5scale withpen PenC
 +    endgroup;
   enddef;   enddef;
   initsymbol("p_u_magnetism");   initsymbol("p_u_magnetism");
Line 1444: Line 1525:
   text en "line u:break" "passage omitted/offset"   text en "line u:break" "passage omitted/offset"
  
-By default, it will pick up the colour of the scrap background, to put between the double lines. However, it normally looks better with the map-bg colour between them. Unfortunately, Therion does not appear to expose this colour to MetaPost code (it is created in raw Tex). So you will need to do it manually. If you do not specify map-bg, it is white. If you have set it to a colour like "70", this is "(.7, .7, .7)" in MetaPost. If you have set it to a colour like "[70 35 50]", this is "(.7, .35, .5)" in MetaPost. The code will check for a variable called fill_l_u_break, and will try to use it as a fill colour if it exists.+By default, it will pick up the colour of the scrap background, to put between the double lines. However, it normally looks better with the map-bg colour between them. Unfortunately, Therion does not appear to expose this colour to MetaPost code (it is created in raw Tex). So you will need to do it manually. If you do not specify map-bg, it is white; "(1, 1, 1)" in MetaPost. If you have set it to a colour like "70", this is "(.7, .7, .7)" in MetaPost. If you have set it to a colour like "[70 35 50]", this is "(.7, .35, .5)" in MetaPost. The code will check for a variable called fill_l_u_break, and will try to use it as a fill colour if it exists.
  
 You cannot use "color fill_l_u_break;" in a "code metapost" section, because Therion will try to treat the keyword "color" as a Therion command instead of a MetaPost keyword. You can either write ";color fill_l_u_break;" with a leading semicolon which MetaPost will ignore, or use the synonym "rgbcolor fill_l_u_break;" which Metpost understands but Therion will not recognise. You cannot use "color fill_l_u_break;" in a "code metapost" section, because Therion will try to treat the keyword "color" as a Therion command instead of a MetaPost keyword. You can either write ";color fill_l_u_break;" with a leading semicolon which MetaPost will ignore, or use the synonym "rgbcolor fill_l_u_break;" which Metpost understands but Therion will not recognise.
Line 1453: Line 1534:
   endcode   endcode
  
 +By default, the break line is set up for use along a horizontal passage. This follows the usual style used in the UK; two parallel lines, separated by a horizontal gap, with the tops and bottoms horizontally aligned (no matter whether the lines are drawn vertically or tilted at 45 degrees or more). If you are using it on a vertical section of cave, you can set the "-attr orientation vertical" option on the line. This will cause it to leave a vertical gap between the lines, and to align them horizontally compared with each other. This makes only a tiny difference when tilted at 45 degrees, but it looks better, and matches the normal style used in rigging topos.
 ====Area Symbols====  ====Area Symbols==== 
 ===Show area water in a different color=== ===Show area water in a different color===
  • metapost.txt
  • Last modified: 21 months ago
  • by tarquinwj