Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
metapost [2019/12/02 13:01] – Credits tarquinwj | metapost [2022/06/27 15:41] (current) – Update for a TeX change tarquinwj | ||
---|---|---|---|
Line 143: | Line 143: | ||
% show U alignment box light blue | % show U alignment box light blue | ||
q:= (xpart U, -ypart U) -- (xpart U, ypart U) -- (-xpart U, ypart U) -- (-xpart U, -ypart U) -- cycle; | q:= (xpart U, -ypart U) -- (xpart U, ypart U) -- (-xpart U, ypart U) -- (-xpart U, -ypart U) -- cycle; | ||
- | thdraw q shifted -(xpart alignment * xpart U, ypart alignment * ypart U) rotated -rotation withpen PenD withcolor 0.5blue+0.5white; | + | thdraw q shifted -(xpart alignment * xpart U, ypart alignment * ypart U) rotated -rotation withpen PenD withcolor 0.5[blue, |
% show u box grey | % show u box grey | ||
- | thdraw unitsquare scaled u shifted (-0.5u, -0.5u) withpen PenD withcolor 0.1black+0.5white; | + | thdraw unitsquare scaled u shifted (-0.5u, -0.5u) withpen PenD withcolor 0.2[black, |
% % % | % % % | ||
| | ||
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 224: | Line 224: | ||
fi; | fi; | ||
picture thetext; | picture thetext; | ||
- | thetext: | + | thetext: |
if A = (-1,1): | if A = (-1,1): | ||
p_label.ulft(thetext, | p_label.ulft(thetext, | ||
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 643: | Line 724: | ||
To set the text of the label, use "-attr text 17" in its options. You can also override the styling by using "-attr labelstyle 0" for each point. | To set the text of the label, use "-attr text 17" in its options. You can also override the styling by using "-attr labelstyle 0" for each point. | ||
+ | |||
+ | ===Walking and climbing man in scale on the map=== | ||
+ | |||
+ | From Juraj Halama for Therion 5.5.3 | ||
+ | |||
+ | {{: | ||
+ | |||
+ | picture u_man_c_pic; | ||
+ | u_man_c_pic := image ( | ||
+ | draw (0cm, -0cm) -- (-8cm, 27cm) -- (-36cm, 55cm) -- (-50cm, 99cm) withpen pencircle scaled 16cm; | ||
+ | draw (27cm, 48cm) -- (0, 64cm) -- (-29cm, 61cm) -- (-38cm, 102cm) | ||
+ | draw (-65cm, 48cm) -- (-75cm, 75cm) -- (-53cm, 106cm) -- (0, 106cm) withpen pencircle scaled 14cm; | ||
+ | draw (-44cm, 130cm) withpen pencircle scaled 27cm withcolor black; | ||
+ | ) shifted (20cm, -67cm); | ||
+ | | ||
+ | picture u_man_w_pic; | ||
+ | u_man_w_pic := image ( | ||
+ | draw (0, 0) -- (7.5cm, 36cm) -- (0cm, 69cm) -- (9cm, 99cm) withpen pencircle scaled 16cm; | ||
+ | draw (42cm, 9cm) -- (37.5cm, 42cm) -- (13.5cm, 69cm) -- (30cm, 102cm) withpen pencircle scaled 16cm; | ||
+ | draw (21.5cm, 100.5cm) -- (6.6cm, 69cm) withpen pencircle scaled 16cm; | ||
+ | draw (-24cm, 75cm) -- (-13.5cm, 102cm) -- (9cm, 112.5cm) -- (30cm, 108cm) -- (51cm, 87cm) -- (75cm, 93cm) withpen pencircle scaled 14cm; | ||
+ | draw (30cm, 132cm) withpen pencircle scaled 27cm withcolor black; | ||
+ | ) shifted (-20cm, -70cm); | ||
+ | | ||
+ | def p_u_man_c (expr P, R, S, A) = | ||
+ | U := (60cm, 85cm) scaled (0.01 / Scale); | ||
+ | T:=identity aligned A rotated R scaled S shifted P; | ||
+ | thdraw u_man_c_pic scaled (0.01 / Scale); | ||
+ | enddef; | ||
+ | | ||
+ | def p_u_man_w (expr P, R, S, A) = | ||
+ | U := (60cm, 80cm) scaled (0.01 / Scale); | ||
+ | T:=identity aligned A rotated R scaled S shifted P; | ||
+ | thdraw u_man_w_pic scaled (0.01 / Scale); | ||
+ | enddef; | ||
+ | | ||
+ | def p_u_man_c_legend = | ||
+ | draw u_man_c_pic scaled (u / 175cm) shifted ((.5, .5) inscale); | ||
+ | enddef; | ||
+ | | ||
+ | def p_u_man_w_legend = | ||
+ | draw u_man_w_pic scaled (u / 175cm) shifted ((.5, .5) inscale); | ||
+ | enddef; | ||
+ | | ||
+ | text en "point u: | ||
+ | text en "point u: | ||
+ | |||
+ | Notes: | ||
+ | Use " | ||
+ | Climbing one has center where the rope should go on the harness... | ||
+ | The scale on the map and in the legend is matching just for 1:500... | ||
+ | |||
+ | ===Region names symbol=== | ||
+ | In the Hirlatz cave we use this symbol to tell the name of the adjacent (preview) maps. | ||
+ | It is quite customizable and especially shows a way how to do label boxes. | ||
+ | By default it prints the current surveys name in a white-filled box with rounded corners. | ||
+ | You can adjust it per symbol by giving "-attr <var> < | ||
+ | |||
+ | From Benedikt Hallinger for Therion 6.0.3 | ||
+ | |||
+ | {{ :: | ||
+ | |||
+ | # Symbol to denote assigned survey. | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | def p_u_mappe(expr pos, theta, sc, al) = | ||
+ | T:=identity aligned al rotated theta scaled sc shifted pos; | ||
+ | begingroup; | ||
+ | % Basic config | ||
+ | bordersmooth: | ||
+ | bordermargin: | ||
+ | basescale: | ||
+ | fillsize: | ||
+ | if known(ATTR_bordersmooth): | ||
+ | if known(ATTR_bordermargin): | ||
+ | if known(ATTR_basescale): | ||
+ | if known(ATTR_fillsize): | ||
+ | | ||
+ | % GET LABEL TEXT: | ||
+ | string txt; | ||
+ | if known(ATTR_text): | ||
+ | txt := ATTR_text; | ||
+ | else: | ||
+ | txt := ATTR__survey; | ||
+ | fi; | ||
+ | | ||
+ | | ||
+ | % PREPARE LABEL: | ||
+ | lab: | ||
+ | pickup PenA; % border thickness | ||
+ | interim bboxmargin: | ||
+ | | ||
+ | % PREPARE BOX and DRAW BOX BACKGROUND: | ||
+ | % q is the box as drawed, but we fill the place first before drawing | ||
+ | q:=((bbox lab) smoothed bordersmooth) aligned al scaled (sc * basescale) rotated theta shifted pos; | ||
+ | if (fillsize <> -1.0): | ||
+ | % draw extending filled box around symbol | ||
+ | if known(MapBackground): | ||
+ | % from therion versions newer than 6.0.3+3551531+dev (23.11.2021) we use page background | ||
+ | thfill ((bbox lab) smoothed bordersmooth) scaled (sc * basescale * fillsize) withcolor MapBackground; | ||
+ | else: | ||
+ | thfill ((bbox lab) smoothed bordersmooth) scaled (sc * basescale * fillsize) withcolor label_fill_color; | ||
+ | fi; | ||
+ | fi; | ||
+ | % the following will draw the actual visible interiour-filling of the box | ||
+ | thfill ((bbox lab) smoothed bordersmooth) scaled (sc * basescale) withcolor label_fill_color; | ||
+ | | ||
+ | % DRAW BOX | ||
+ | draw q; | ||
+ | | ||
+ | % DRAW LABEL TEXT | ||
+ | lab:=lab aligned al; | ||
+ | lab:=lab scaled (sc * basescale); | ||
+ | lab:=lab rotated theta; | ||
+ | lab:=lab shifted pos; | ||
+ | process_label(pos, | ||
+ | endgroup; | ||
+ | enddef; | ||
+ | |||
+ | |||
+ | |||
+ | |||
====Line Symbols==== | ====Line Symbols==== | ||
===View whole centerline for underground=== | ===View whole centerline for underground=== | ||
Line 930: | Line 1136: | ||
zz3 := postcontrol t of P; | zz3 := postcontrol t of P; | ||
zz4 := precontrol t+1 of P; | zz4 := precontrol t+1 of P; | ||
+ | linecap_prev: | ||
linecap:=0; | linecap:=0; | ||
if (length(zz3-1/ | if (length(zz3-1/ | ||
Line 951: | Line 1158: | ||
draw zz1--zz2 withcolor background; | draw zz1--zz2 withcolor background; | ||
fi; | fi; | ||
+ | linecap: | ||
endfor; | endfor; | ||
enddef; | enddef; | ||
Line 1046: | Line 1254: | ||
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 1311: | Line 1539: | ||
{{ :: | {{ :: | ||
- | Select these as line type " | + | Select these as line type " |
text en "line u: | text en "line u: | ||
Line 1363: | Line 1591: | ||
text en "line u: | text en "line u: | ||
+ | |||
+ | ===Centreline that is only visible when not in a scrap=== | ||
+ | |||
+ | [[user: | ||
+ | |||
+ | Sometimes, you might want to show a centreline for a section of the cave where you do not have any wall data, if you are using [[tips# | ||
+ | |||
+ | < | ||
+ | code metapost | ||
+ | def l_survey_cave_MY(expr P) = | ||
+ | if ATTR__scrap_centerline: | ||
+ | l_survey_cave_SKBB(P); | ||
+ | fi; | ||
+ | enddef; | ||
+ | initsymbol(" | ||
+ | endcode | ||
+ | </ | ||
+ | |||
+ | You may notice the misleadingly named " | ||
+ | |||
+ | Use it with this line in your layout: | ||
+ | |||
+ | symbol-assign line survey:cave MY | ||
+ | |||
+ | You can use a similar approach for l_survey_surface_MY (surface survey legs), p_station_temporary_MY, | ||
+ | |||
+ | ===Break line=== | ||
+ | |||
+ | [[user: | ||
+ | |||
+ | When a section of are omitted or shortened, typically used with [[riggingtopos|rigging topos]], the common approach is to show a double line wherever the passage has been omitted. Usually, it is drawn at an angle of about 45 degrees. This can either be used on a single scrap with a double line over the passage to show that it is much longer than shown, or it is used to end the scrap, then a second double line is used to start the next scrap; this second version is normally used when the passage on either side of the break is of different dimensions. | ||
+ | |||
+ | This code is an example of how to extend a line beyond the defined ends, using additional points. It also shows how to cope with the fact that (as of the time of writing) Therion does not offer a variable that allows you to read the " | ||
+ | |||
+ | code metapost | ||
+ | def l_u_break(expr P)= | ||
+ | begingroup; | ||
+ | save mainpath, parallel, orientation, | ||
+ | T: | ||
+ | gapsize: | ||
+ | path mainpath; | ||
+ | %make the ends stick out beyond the passage | ||
+ | mainpath:=( (point 0 of P) + u * unitvector( thdir(P, 0) rotated 180 ) / 2 ) | ||
+ | -- P -- | ||
+ | ( (point (length P) of P) + u * unitvector( thdir(P, arclength P) ) / 2 ); | ||
+ | path parallel; | ||
+ | string orientation; | ||
+ | orientation: | ||
+ | if orientation = " | ||
+ | direction: | ||
+ | parallel: | ||
+ | else: | ||
+ | direction: | ||
+ | parallel: | ||
+ | fi; | ||
+ | if known fill_l_u_break: | ||
+ | thfill (mainpath -- (reverse parallel) -- cycle) withcolor fill_l_u_break; | ||
+ | else: | ||
+ | thunfill (mainpath -- (reverse parallel) -- cycle); | ||
+ | fi; | ||
+ | pickup PenC; | ||
+ | thdraw mainpath; | ||
+ | thdraw parallel; | ||
+ | endgroup; | ||
+ | enddef; | ||
+ | initsymbol(" | ||
+ | def l_u_break_legend = | ||
+ | l_wall_bedrock(((0, | ||
+ | l_wall_bedrock(((.7, | ||
+ | l_u_break(((.6, | ||
+ | enddef; | ||
+ | endcode | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Select this as line type " | ||
+ | |||
+ | Use it with this line in your layout: | ||
+ | |||
+ | text en "line u: | ||
+ | |||
+ | 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, | ||
+ | |||
+ | You cannot use "color fill_l_u_break;" | ||
+ | |||
+ | code metapost | ||
+ | rgbcolor fill_l_u_break; | ||
+ | fill_l_u_break: | ||
+ | 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" | ||
====Area Symbols==== | ====Area Symbols==== | ||
===Show area water in a different color=== | ===Show area water in a different color=== | ||
Line 1877: | Line 2196: | ||
A: Try this code: | A: Try this code: | ||
- | |||
- | def_transparent_rgb(tr_lgrey, | ||
def a_u_lgrey(expr P) = | def a_u_lgrey(expr P) = | ||
T: | T: | ||
- | thfill P withtransparentcolor tr_lgrey; | + | thfill P withcolor (0.7, 0.7, 0.7) withalpha 0.5; |
enddef; | enddef; | ||
- | There are a few predefined transparent colors, the most interesting of them is tr_bg (current scrap background). Standard opacity value (defined in the layout section) is applied. M. Budaj | ||
---- | ---- | ||
Line 2245: | Line 2561: | ||
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 | ||
+ | ===Shaded Compass Rose pointing to the magnetic North=== | ||
+ | from Juraj Halama for version 5.5.3 | ||
+ | |||
+ | {{: | ||
+ | |||
+ | // distributed under the GNU General Public License.// | ||
+ | |||
+ | def s_northarrow (expr rot) = | ||
+ | scale_value = 0.5; | ||
+ | decl := MagDecl; | ||
+ | T := identity; | ||
+ | | ||
+ | picture tmp_pic; | ||
+ | tmp_pic = image ( | ||
+ | pickup pencircle scaled 1; | ||
+ | thdraw fullcircle scaled 4cm; | ||
+ | thdraw fullcircle scaled 2.75cm; | ||
+ | pickup pencircle scaled .5; | ||
+ | thdraw fullcircle scaled 3.75cm; | ||
+ | for whereto=11.25 step 22.5 until 360: | ||
+ | thdraw dir(whereto)*2.75/ | ||
+ | endfor; | ||
+ | % arrows | ||
+ | path halfarrow; | ||
+ | halfarrow = (+.3cm, | ||
+ | for whereto = 45 step 90 until 315: | ||
+ | % thfill halfarrow scaled .85 rotated whereto withcolor .30; | ||
+ | pickup pencircle scaled 1; | ||
+ | for halfarrowgrad = 1 step -.05 until 0: | ||
+ | thdraw ((halfarrowgrad*.3cm, | ||
+ | endfor; | ||
+ | pickup pencircle scaled .5; | ||
+ | thdraw halfarrow scaled .85 rotated whereto;; | ||
+ | thfill halfarrow xscaled -1 scaled .85 rotated whereto withcolor white; | ||
+ | thdraw halfarrow xscaled -1 scaled .85 rotated whereto;; | ||
+ | endfor; | ||
+ | for whereto = 0 step 90 until 270: | ||
+ | % thfill halfarrow scaled 1.15 rotated whereto withcolor .30; | ||
+ | pickup pencircle scaled 1; | ||
+ | for halfarrowgrad = 1 step -.05 until 0: | ||
+ | thdraw ((halfarrowgrad*.3cm, | ||
+ | endfor; | ||
+ | pickup pencircle scaled .5; | ||
+ | thdraw halfarrow scaled 1.15 rotated whereto;; | ||
+ | thfill halfarrow xscaled -1 scaled 1.15 rotated whereto withcolor white; | ||
+ | thdraw halfarrow xscaled -1 scaled 1.15 rotated whereto;; | ||
+ | endfor; | ||
+ | % central circles | ||
+ | thfill fullcircle scaled .56cm withcolor 1white; | ||
+ | pickup pencircle scaled .5; | ||
+ | thdraw fullcircle scaled .56cm; | ||
+ | thfill fullcircle scaled .3cm withcolor .30; | ||
+ | % characters | ||
+ | label.bot(thTEX(" | ||
+ | label.lft(thTEX(" | ||
+ | label.rt (thTEX(" | ||
+ | label.top(thTEX(" | ||
+ | % space among characters | ||
+ | pickup pencircle scaled .5; | ||
+ | thdraw (dir(45)*2cm)--(dir(45)*2.5cm); | ||
+ | thdraw (dir(135)*2cm)--(dir(135)*2.5cm); | ||
+ | thdraw (dir(225)*2cm)--(dir(225)*2.5cm); | ||
+ | thdraw (dir(315)*2cm)--(dir(315)*2.5cm); | ||
+ | ); | ||
+ | | ||
+ | thdraw tmp_pic scaled scale_value rotatedaround (origin, - rot); | ||
+ | enddef; | ||
+ | |||
====Scalebars==== | ====Scalebars==== | ||
Line 2306: | Line 2727: | ||
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=== | ||
Line 2372: | Line 2838: | ||
endcode | endcode | ||
endlayout LayoutScalebar3 | endlayout LayoutScalebar3 | ||
+ | | ||
+ | ===Vertical scalebar=== | ||
+ | {{: | ||
+ | by Juraj Halama for version 5.5.3... | ||
+ | |||
+ | // distributed under the GNU General Public License.// | ||
+ | |||
+ | layout mapa_ext_500 | ||
+ | | ||
+ | scale-bar 170 m | ||
+ | % layout for map | ||
+ | copy mapa | ||
+ | overlap 0 cm | ||
+ | | ||
+ | code metapost | ||
+ | | ||
+ | def s_scalebar (expr l, units, txt) = | ||
+ | begingroup | ||
+ | tmpw = 3.0 bp; | ||
+ | tmp5m = 5 / Scale * units * cm; | ||
+ | tmpl = l / Scale * units * cm; | ||
+ | endgroup; | ||
+ | p := (0, 0) -- (tmpw, 0) -- (tmpw, - tmp5m) -- (0, - tmp5m) -- cycle; | ||
+ | pickup PenD; | ||
+ | for i := 0 step 1 until (l - 1) / 5: | ||
+ | if (i mod 2) <> 0: | ||
+ | unfill p shifted - (0, i * tmp5m); | ||
+ | else: | ||
+ | fill p shifted - (0, i * tmp5m); | ||
+ | fi; | ||
+ | draw p shifted - (0, i * tmp5m); | ||
+ | endfor; | ||
+ | pickup PenA | ||
+ | % draw (-tmpw, 0) -- (tmpw, 0); | ||
+ | % draw (-tmpw, -tmpl) -- (0, -tmpl); | ||
+ | fill (-2tmpw, tmpw) -- (-2tmpw, -tmpw) -- (0, 0) -- cycle; | ||
+ | fill (-2tmpw, -tmpl + tmpw) -- (-2tmpw, -tmpl + -tmpw) -- (0, -tmpl) -- cycle; | ||
+ | if ((l mod 10) > 5) or ((l mod 10) = 0): | ||
+ | draw (0, - tmpl) -- (tmpw, - tmpl) withcolor black; | ||
+ | else: | ||
+ | draw (0, - tmpl) -- (tmpw, - tmpl) withcolor white; | ||
+ | fi; | ||
+ | begingroup | ||
+ | interim labeloffset: | ||
+ | % interim defaultscale: | ||
+ | label.rt(thTEX(" | ||
+ | for i := 1 step 1 until l / 5: | ||
+ | if (i mod 10) = 0: | ||
+ | label.rt(thTEX(" | ||
+ | else: | ||
+ | if i * 5 = l: | ||
+ | label.rt(thTEX(" | ||
+ | else: | ||
+ | label.rt(thTEX(" | ||
+ | fi | ||
+ | fi; | ||
+ | endfor; | ||
+ | if (l mod 5) <> 0: | ||
+ | label.rt(thTEX(" | ||
+ | fi; | ||
+ | endgroup | ||
+ | enddef; | ||
+ | |||
+ | endcode | ||
+ | | ||
+ | code tex-map | ||
+ | | ||
+ | \def\maplayout{ | ||
+ | \legendbox{102.5}{100.4}{NW} | ||
+ | { | ||
+ | \scalebar | ||
+ | } | ||
+ | } | ||
+ | endcode | ||
+ | | ||
+ | endlayout | ||
====Gridlines==== | ====Gridlines==== | ||
===Change grid symbols from cross hairs to continuous lines=== | ===Change grid symbols from cross hairs to continuous lines=== | ||
Line 2383: | Line 2925: | ||
) -- ( | ) -- ( | ||
if xpos > 0: 0 else: xsize/2 fi, 0 | if xpos > 0: 0 else: xsize/2 fi, 0 | ||
- | ) withcolor 0.1black+0.5white; | + | ) withcolor 0.2[black, |
draw ( | draw ( | ||
0, if ypos < 0: 0 else: -ysize/2 fi | 0, if ypos < 0: 0 else: -ysize/2 fi | ||
) -- ( | ) -- ( | ||
0, if ypos > 0: 0 else: ysize/2 fi | 0, if ypos > 0: 0 else: ysize/2 fi | ||
- | ) withcolor 0.1black+0.5white; | + | ) withcolor 0.2[black, |
enddef; | enddef; | ||
endcode | endcode | ||
Line 2478: | Line 3020: | ||
thclean Path; | thclean Path; | ||
pickup PenD; | pickup PenD; | ||
- | if known colour_sump_bg: | + | if known colour_sump_bg: |
thfill Path withpattern pattern_sump; | thfill Path withpattern pattern_sump; | ||
%%thdraw Path; %outline, not needed as area drawn is defined by line border anyway | %%thdraw Path; %outline, not needed as area drawn is defined by line border anyway | ||
Line 2493: | Line 3035: | ||
T: | T: | ||
pickup pensquare scaled (1.0*u/10); | pickup pensquare scaled (1.0*u/10); | ||
- | if known colour_rope: | + | if known colour_rope: |
fi; | fi; | ||
pickup PenC; | pickup PenC; | ||
Line 2569: | Line 3111: | ||
Comment it out when you want black and white. | Comment it out when you want black and white. | ||
- | ---- | + | =====Symbols for plan and extended elevation===== |
- | ---- | + | |
+ | Juraj Halama 2020 for Therion 5.5.3\\ | ||
+ | |||
+ | {{: | ||
+ | |||
+ | It is not a regular point due to its size, but all the features of points are working... | ||
+ | |||
+ | def p_u_symbol_plan (expr pos, | ||
+ | U := (-3.25u, 3.25u); | ||
+ | T := identity aligned al rotated theta scaled sc shifted pos; | ||
+ | pickup PenB; | ||
+ | q := ((-3.26u, | ||
+ | | ||
+ | thdraw q; | ||
+ | q := ((-.175u, .5u) -- (0u, 0u) -- (.175u, .5u) .. (0u, .45u) .. cycle); | ||
+ | thfill q withcolor .5green; | ||
+ | thdraw q withcolor .5green; | ||
+ | thdraw (0u, 0u) -- (0u, 2.31u) withcolor .5green; | ||
+ | enddef; | ||
+ | |||
+ | def p_u_symbol_extend (expr pos, | ||
+ | U := (-2.5u, 2.5u); | ||
+ | T := identity aligned al rotated theta scaled sc shifted pos; | ||
+ | pickup PenB; | ||
+ | q := ((-2.346u, -2.480u) -- (-.48u, -2.116u) -- (-.48u, 1.573u) -- (-2.346u, 1.354u) -- cycle); | ||
+ | thfill q withcolor .85; | ||
+ | q := ((-1.551u, -2.878u) -- (1.438u, -.766u) -- (1.438u, 2.388u) -- (-1.551u, 1.118u) -- cycle); | ||
+ | thfill q withcolor .75; | ||
+ | thdraw q; | ||
+ | thdraw (-.48u, -2.116u) -- (-.48u, 1.573u) dashed evenly; | ||
+ | q := ((.446u, -1.461u) -- (2.120u, -1.094u) -- (2.120u, 2.184u) -- (.446u, 1.965u) -- cycle); | ||
+ | thfill q withcolor .85; | ||
+ | thdraw (.446u, -1.461u) -- (.446u, 1.965u) dashed evenly; | ||
+ | q := ((-.175u, .5u) -- (0u, 0u) -- (.175u, .5u) .. (0u, .45u) .. cycle) rotated -90; | ||
+ | thfill q withcolor .5green; | ||
+ | thdraw q withcolor .5green; | ||
+ | thdraw (0u, 0u) -- (2.31u, 0u) withcolor .5green; | ||
+ | enddef; | ||
+ | |||
+ | ...and do not forget to remove it from legend: | ||
+ | |||
+ | text sk "point u: | ||
+ | text sk "point u: | ||