[Therion] Scaling text and text orientation

Stacho Mudrak s.m at group-s.sk
Fri Nov 16 11:13:51 CET 2007


Quoting Bruce Mutton <bruce.mutton at paradise.net.nz>:

> Is there a way to place a text label, say ON a pitch line, and tell therion,
> label this pitch "10 P" and left justify the text it out to the right-hand
> side, just beyond the displayed passage wall, so that it always displays
> just clear of the drawing?

If you are using line label - there is no possibility, but if you are using
point label - you can use -align option as for any other point object. E.g. you
may also place "stalactites" aligned left to passage wall.

> Also I notice that text with orientation 0 degrees prints at an angle equal
> to the declination, which is 22 degrees here abouts these days.  Is there a
> better way to straighten the text than give it all an orientation of 338
> degrees to compensate?

Again - please use rather -align then orientation option. E.g.:

point 0 0 label -text "label above some feature" -align top

If map will be rotated due to orientation, this alignment should be
automatically rotated also.

> If I want to present two maps, say one at 1:500 scale, and one at 1:2000
> scale, I would want many labels on the former and few labels on the latter.
> Can this be done with one set of scraps, or would I have to create
> duplicates and adjust the labels in one of the sets?

Currently, there is no straight way how to hadle this situation, but there
exists workaround using generic attributes and a little bit of magic metapost
code copied from "mpost/thText.mp" file and modified a little bit.

1. Make sure to add some label importance flag to all labels. E.g.

point 0 0 label -text "Important label" -attr importance 1
point 123 456 label -text "Unimportant label"

2. Then use following magic :) code in 1:2000 layout:

code metapost
vardef p_label@#(expr txt,pos,rot,mode) =
  if ATTR_importance = 1:
  if (mode=1) or (mode=7): interim labeloffset:=(u/8) fi;
  lab:=thelabel@#(txt, pos);
  if mode>1: pickup PenD fi;
  if mode=1:
    pickup pencircle scaled (u/6);
    drawdot(pos);
    process_label(pos,0);
  elseif mode=2: process_uplabel;
  elseif mode=3: process_downlabel;
  elseif mode=4: process_updownlabel;
  elseif mode=5: process_circledlabel;
  elseif mode=6: process_boxedlabel;
  elseif mode=7: process_label(pos,rot);  % station name
  elseif mode=8: process_filledlabel(pos, rot);
  else: process_label(pos,rot); fi;
  fi;
enddef;
endcode

I hope this will help you.

Regards, S.



More information about the Therion mailing list