Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision Next revisionBoth sides next revision | ||
metapost [2019/12/24 14:23] – typo tarquinwj | metapost [2020/09/22 13:43] – Added scalebar 2b beni | ||
---|---|---|---|
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: | + | [[user: |
< | < | ||
code metapost | code metapost | ||
vardef create_styled_label (expr plaintext, | vardef create_styled_label (expr plaintext, | ||
- | 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 " | ||
+ | |||
+ | Use " | ||
+ | |||
+ | 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' | ||
+ | |||
+ | < | ||
+ | code metapost | ||
+ | vardef create_styled_label (expr plaintext, | ||
+ | save textsize, style, thetext, sufx, athick; | ||
+ | string textsize; | ||
+ | if S = 0.5: | ||
+ | textsize: | ||
+ | elseif S = 0.7: | ||
+ | textsize: | ||
+ | elseif S = 1.4: | ||
+ | textsize: | ||
+ | elseif S = 2: | ||
+ | textsize: | ||
+ | else: % normal is 1 | ||
+ | textsize: | ||
+ | fi; | ||
+ | if known ATTR_labelstyle: | ||
+ | style: | ||
+ | else: | ||
+ | style: | ||
+ | fi; | ||
+ | picture thetext; | ||
+ | thetext: | ||
+ | % store the alignment suffix as a string, it will be turned back into a suffix with scantokens | ||
+ | string sufx; | ||
+ | if A = (-1,1): | ||
+ | sufx: | ||
+ | elseif A = (0,1): | ||
+ | sufx: | ||
+ | elseif A = (1,1): | ||
+ | sufx: | ||
+ | elseif A = (-1,0): | ||
+ | sufx: | ||
+ | elseif A = (1,0): | ||
+ | sufx: | ||
+ | elseif A = (-1,-1): | ||
+ | sufx: | ||
+ | elseif A = (0,-1): | ||
+ | sufx: | ||
+ | elseif A = (1,-1): | ||
+ | sufx: | ||
+ | else: | ||
+ | sufx: | ||
+ | fi; | ||
+ | if style >= 100: | ||
+ | % create the label, passing the alignment as a suffix | ||
+ | lab: | ||
+ | % process_label looks for a variable called " | ||
+ | process_label(P, | ||
+ | % define all the different ornamentations that you want | ||
+ | if style = 100: | ||
+ | pickup PenA; | ||
+ | athick: | ||
+ | % make bounding box measurements temporarily be larger than the object being measured | ||
+ | % " | ||
+ | % sure it gets reset to default correctly afterwards | ||
+ | interim bboxmargin: | ||
+ | % 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, | ||
+ | fi; | ||
+ | enddef; | ||
+ | endcode | ||
+ | </ | ||
=====Replacing legend drawings for existing symbols===== | =====Replacing legend drawings for existing symbols===== | ||
Line 572: | Line 646: | ||
===Magnetic effects=== | ===Magnetic effects=== | ||
- | [[user: | + | [[user: |
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: | + | |
- | | + | save scale, cthick, pointheight, |
- | pointheight: | + | |
- | pointwidth: | + | |
- | U: | + | pointheight: |
- | T:=identity aligned A rotated (R-20) scaled S shifted P; | + | pointwidth: |
- | % a circle | + | |
- | thdraw fullcircle scaled 2scale withpen PenC withcolor black; | + | cutwidth: |
- | % filled triangle | + | |
- | thfill (0, | + | T:=identity aligned A rotated (R-20) scaled S shifted P; |
- | % black triangle outline | + | % a circle |
- | | + | thdraw fullcircle scaled 2scale withpen PenC; |
- | thdraw | + | % filled triangle |
- | % spin arcs, a full circle is path 0-8, anticlockwise, | + | thfill (0, |
- | 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/ | ||
+ | thfill | ||
+ | % spin arcs, a full circle is path 0-8, anticlockwise, | ||
+ | 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(" | initsymbol(" | ||
Line 1046: | Line 1127: | ||
fi; | fi; | ||
else: | else: | ||
- | thdraw P; | + | |
+ | save type; | ||
+ | string type; | ||
+ | if known ATTR_type: | ||
+ | type: | ||
+ | else: | ||
+ | type: | ||
+ | fi; | ||
+ | if type = " | ||
+ | | ||
+ | else: | ||
+ | thdraw P; | ||
+ | fi; | ||
+ | endgroup; | ||
fi; | fi; | ||
enddef; | enddef; | ||
endcode | endcode | ||
</ | </ | ||
+ | |||
+ | Rope lines default to using the standard colour (black, unless you change it with " | ||
+ | |||
+ | * -attr type primary | ||
+ | * -attr type secondary = draws in grey | ||
+ | |||
+ | This allows you to have ropes with two different colours, useful if ropes are optional or follow an uncommon optional route. | ||
===Deviations=== | ===Deviations=== | ||
Line 2336: | Line 2437: | ||
thdraw tmp_pic scaled valscal rotatedaround(origin, | thdraw tmp_pic scaled valscal rotatedaround(origin, | ||
enddef; | enddef; | ||
+ | | ||
+ | | ||
+ | ===Northarrow 5=== | ||
+ | from Benedikt Hallinger for version 5.4. | ||
+ | This arrow is borrowed from an older wiki entry and was enhanced with the label box. | ||
+ | |||
+ | It will display the north reference based on the `north < | ||
+ | It can also optionally display the meridian grid convergence, | ||
+ | |||
+ | {{: | ||
+ | |||
+ | // distributed under the GNU General Public License.// | ||
+ | code metapost | ||
+ | def s_northarrow (expr rot) = | ||
+ | T:=identity scaled 1.0 rotated -rot; % scale your north arrow here | ||
+ | begingroup | ||
+ | thdraw (-.5cm, -1cm)--(0, 1.5cm)--(.5cm, | ||
+ | thfill (-.5cm, -1cm)--(0, 1.5cm)--(0, -.5cm)--cycle; | ||
+ | endgroup; | ||
+ | | ||
+ | begingroup | ||
+ | thfill ((-.6cm, -.35cm)--(-.6cm, | ||
+ | thdraw | ||
+ | interim defaultscale: | ||
+ | newinternal string dirText; dirText: | ||
+ | | ||
+ | if known northArrowShowGridConvergence: | ||
+ | label(dirText, | ||
+ | label(" | ||
+ | else: | ||
+ | | ||
+ | fi | ||
+ | endgroup; | ||
+ | | ||
+ | enddef; | ||
+ | endcode | ||
+ | |||
====Scalebars==== | ====Scalebars==== | ||
Line 2397: | Line 2535: | ||
endgroup; | endgroup; | ||
enddef; | enddef; | ||
+ | |||
+ | ===Scalebar 2b=== | ||
+ | By B. Hallinger; This is the same scalebar from above, except that it subdivides the first block. | ||
+ | |||
+ | {{: | ||
+ | |||
+ | code metapost | ||
+ | def s_scalebar (expr l, units, txt) = | ||
+ | % l = value of scale-bar length | ||
+ | % units = ?? | ||
+ | % txt = string representing units | ||
+ | begingroup | ||
+ | interim warningcheck: | ||
+ | tmpl:=l / Scale * cm * units / 2; | ||
+ | % tmpl = half plotted length of scale bar from central top insertion point | ||
+ | tmpx:=l / Scale * cm * units / 5; | ||
+ | tmph:=5bp; % bar height | ||
+ | endgroup; | ||
+ | pickup PenC; | ||
+ | draw (-tmpl, | ||
+ | p: | ||
+ | for i:=-0.5 step 2 until 2: % start drawing at the third block (leave space for smaller divisions) | ||
+ | fill p shifted (i * tmpx,0); | ||
+ | endfor; | ||
+ | | ||
+ | % Draw first part with subdivided blocks | ||
+ | p: | ||
+ | for i:=-2.5 step 2/5 until -0.75: | ||
+ | fill p shifted (i * tmpx,0) withcolor black; | ||
+ | endfor; | ||
+ | | ||
+ | % Label of scale: Scalebar top, values below | ||
+ | begingroup | ||
+ | interim labeloffset: | ||
+ | for i:=0 step (l/5) until (l-1): | ||
+ | tmpx:=tmpl * (i * 2 / l - 1); | ||
+ | label.bot(thTEX(decimal (i)), | ||
+ | endfor; | ||
+ | label.bot(thTEX(decimal (l) & " | ||
+ | label.top(thTEX(" | ||
+ | endgroup; | ||
+ | | ||
+ | enddef; | ||
+ | endcode | ||
+ | |||
===Scalebar Bar length adjustment=== | ===Scalebar Bar length adjustment=== |