[Therion] Custom map connections
Tarquin Wilton-Jones
tarquin.wilton-jones at ntlworld.com
Sun Sep 11 08:44:40 CEST 2022
> My arrows have multiple colours. I will share the CC0 code later once I
> am back in front of my computer.
Attached. (Hope the list lets it through.) To use it, you need to set this:
symbol-assign line map-connection MY
Yes, that is the *line* not the point, because Therion turns each point
into a line if it is using offsets on its map.
Hopefully the comment at the start of the code is enough for you to use
it. But basically, it goes something like this. If Therion's bug ever
gets fixed, you can just create:
point mapconnection -attr theme 1
...
endpoint
But until Therion's bug is fixed, you can use my hack:
point mapconnection
...
endpoint
point u:mapconnectiondata -attr theme 1
endpoint
Therion gets it right with line mapconnection, so if you are using those
(eg. in an extended elevation as shown in the Therion book), you can
just set the -attr directly on the line mapconnection.
Each u:mapconnectiondata will only have its theme attribute used once.
So in this case, the first mapconnection point will use theme "default",
and the second one will use theme "1" (because Therion draws things in
reverse order).
point mapconnection
...
endpoint
point mapconnection
...
endpoint
point u:mapconnectiondata -attr theme 1
endpoint
Note that Therion draws "-clip off" objects out of sequence from the
rest of the objects, so if you set that property on a mapconnection
point, you would also need to set it on the u:mapconnectiondata.
Hopefully this is useful for your purposes.
Tarquin
-------------- next part --------------
#This MetaPost symbol definition is licensed under CC0 1.0. See the package LICENCE.txt for details.
# use with the following -attr type "value" options
# -attr theme default = draws in the default brown
# -attr theme inherit = draws in the symbol colour defined in the layout
# -attr theme 1 = draws in red
# Therion 6 does not support -attr on point mapconnection, so this code contains a hacky workaround;
# by placing a point u:mapconnectiondata below the point mapconnection, the -attr from that point
# will be used instead. (Note that it must appear below it in rendering order - that means any use of
# -clip must also be taken into account!)
#the next line is part of the hack
text en "point u:mapconnectiondata" ""
layout l_mapconnection_MY
code metapost
def l_mapconnection_MY (expr P) =
T:=identity;
begingroup;
save arrowsize, type, arrowhead;
%the length of the arrowhead, which must be bigger than the pen size by enough margin for the line's curved end not to poke past the walls of the arrowhead
arrowsize:=0.4u;
string theme;
if known ATTR_theme:
theme:=ATTR_theme;
%this is part of the hack
p_u_mapconnectiondata_ATTR_theme:="";
elseif known p_u_mapconnectiondata_ATTR_theme:
%the same attribute, passed using a point u:mapconnectiondata
%this is part of the hack
theme:=p_u_mapconnectiondata_ATTR_theme;
p_u_mapconnectiondata_ATTR_theme:="";
else:
theme:="default";
fi;
if (theme = "1"):
drawoptions( withcolor (1,0,0) dashed evenly ); %red
elseif (theme = "2"):
drawoptions( withcolor (1,0.6,0) dashed evenly ); %orange
elseif (theme = "3"):
drawoptions( withcolor (0.78,0.78,0) dashed evenly ); %dark yellow
elseif (theme = "4"):
drawoptions( withcolor (0.46,0.78,0) dashed evenly ); %spring green
elseif (theme = "5"):
drawoptions( withcolor (0,0.78,0) dashed evenly ); %green
elseif (theme = "6"):
drawoptions( withcolor (0,0.5,0.44) dashed evenly ); %greeny teal
elseif (theme = "7"):
drawoptions( withcolor (0,0.8,0.87) dashed evenly ); %sky blue
elseif (theme = "8"):
drawoptions( withcolor (0,0,1) dashed evenly ); %navy blue
elseif (theme = "9"):
drawoptions( withcolor (0.5,0,1) dashed evenly ); %violet
elseif (theme = "10"):
drawoptions( withcolor (1,0,1) dashed evenly ); %fuchia
elseif (theme = "inherit"):
drawoptions( dashed evenly ); %normally black, but can be coloured by the layout
else:
drawoptions( withcolor (0.4,0,0) dashed dashpattern(on .1u off .5u on .1u) ); %brown
fi;
%shorten the line by the size of the arrow head, so that it cannot bulge out of the sides of the arrowhead
thdraw ( subpath( arctime arrowsize of P, arctime ( ( arclength P ) - arrowsize ) of P ) of P ) withpen PenA;
drawoptions();
path arrowhead;
arrowhead:=(0,0)--( 2 * arrowsize / 5, arrowsize )--( -2 * arrowsize / 5, arrowsize )--cycle;
thfill arrowhead rotated ( angle( thdir( P, 0 ) ) - 90 ) shifted ( point 0 of P );
thfill arrowhead rotated ( angle( thdir( P, length P ) ) + 90 ) shifted ( point (length P) of P );
endgroup;
enddef;
initsymbol("l_mapconnection_MY");
%this is part of the hack
%store the attr
string p_u_mapconnectiondata_ATTR_theme;
def p_u_mapconnectiondata (expr P,R,S,A)=
if known ATTR_theme:
p_u_mapconnectiondata_ATTR_theme:=ATTR_theme;
fi;
enddef;
initsymbol("p_u_mapconnectiondata");
endcode
endlayout
More information about the Therion
mailing list