Hi guys,
Id like some help modifying the attached labelling lisp. I use it to label conoutrs (polylines) with their elevations. Currently it works fine however id like it to put the text on the contour rather than offset above it, and also take the alignment of the polyline (where i click on the polyline) rather than having to click a second time for the label alignment. A option for text height would also be awesome.
Thanks in advance.
Alex
Hello Alex
Please post here :
http://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/bd-p/130
Regards, Patrice (I am not an Autodesk Advisor)
Patrice BRAUD
You may be able to combine that with elements of this routine, by either taking its way of determining the rotation and putting it into yours, or taking the determining of the text content from yours and putting it into LabelTextMask.lsp.
Hi Mark,
Kent's Lisp code has all that is needed to implement what you mentioned.
Here is a bare-bone implementation that can help you understand the approach with option to set text height.
http://adndevblog.typepad.com/autocad/2015/04/aligning-mtext-with-picked-point-on-a-curve.html
Regards,
Balaji
Okay so ive tried modifying it myself but no go. Basically id really appreciate if someone could customise Kents code to do this contour labelling workflow in this order:
- Prompt for text height
- Prompt for elevation value (getreal)
- Ask to pick where i want to place the labels (with ability to click on multiple points to label contours with same elevation)
- Enter to get back to the "Enter elevation" prompt
I like kents code as it oncorporates a mask background instead of the polyline background of my old routine. His code for setting the angle also doesnt seem to have the problem that my old routine had in that with some files it gets confused with the rotation and doesnt align it properly.
Thanks in advance
Alex
@mark wrote:
Okay so ive tried modifying it myself but no go. Basically id really appreciate if someone could customise Kents code to do this contour labelling workflow in this order:
- Prompt for text height
- Prompt for elevation value (getreal)
- Ask to pick where i want to place the labels (with ability to click on multiple points to label contours with same elevation)
- Enter to get back to the "Enter elevation" prompt
....
Are your contours drawn at their actual elevation in 3D? If so, try this modification of the routine in the earlier link. The LEM command in LabelElevMask.lsp has a height option to take care of your first step, and once the height is set, you don't need to answer a prompt for it every time. It finds the elevation of the selected object for you, so you don't need to tell it what the text content should be [second step], and therefore don't need an option to enter a new elevation [fourth step]. And you can label as many as you want in one running of the command [third step]. [It also has a width factor option, because that was part of what the originator of that thread wanted, and Style and Layer options for the labels.] Look for the "<--EDIT as desired" and similar indications, to set up your typical defaults.
[I thought I had worked up something like that, but it's not on the Cadalyst CAD Tips site, and it was easier to find the other one there than to Search here, which is why the earlier link was to there rather than to wherever it is here. Your workflow list spurred me to do the Search here for the elevation-specific version.]
@Kent1Cooper wrote:
....Are your contours drawn at their actual elevation in 3D? If so, try this modification of the routine in the earlier link. The LEM command in LabelElevMask.lsp ....
So I looked through that, and found it was still using (command) for Undo End in the error handler, which is a no-no in Acad2015+. Here's an updated version [with a few other little tweaks] that should be good in any version.
Thanks for that Kent, however im now getting an error when i run the LEM command;
Error: bad argument type: numberp: nil
Any idea why? Im running Civil 3D 2016. Also how do I invoke the option to use the elevation of the polyline?
Thanks
Alex
@mark wrote:
Thanks for that Kent, however im now getting an error when i run the LEM command;
Error: bad argument type: numberp: nil
Any idea why? Im running Civil 3D 2016. Also how do I invoke the option to use the elevation of the polyline?
....
You probably haven't yet gone through and followed the instructions to EDIT various things for your initial defaults [see the advisory at the end of the longer paragraph in Post 6]. That error could be because you left it calling for ROMANS as a text Style [not the font, but a Style name to which, in our usual setup, that font happens to be assigned], but you don't have a Style defined in your drawing by that name.
@mark wrote:
.... Also how do I invoke the option to use the elevation of the polyline?
....
Forgot to address that part in my previous Reply....
There's no option for that -- LEM always and only uses the elevation of the selected object for the text content [the elevation at the point of selection, if it varies].
@mark wrote:
Kent, just a quick question. can the lisp be modified to drop the trailing zeros from the label?
....
Trailing zeros after a decimal point? It shouldn't be supplying any of those, unless you've changed this:
....
elevtxt (rtos (caddr inspt) 2 0);; <-- EDIT mode/precision as desired
; [mode 2 & precision 0 round to nearest integer, typical of use with contour lines]
....
to some value other than zero.
I have contours ranging from full meter intervals down to 1/8m intervals, but id like the labels to display as this to save space;
68
68.5
68.25
68.125
Is that possible to do?
Thanks
Alex
@mark wrote:
I have contours ranging from full meter intervals down to 1/8m intervals, but id like the labels to display as this to save space;
68
68.5
68.25
68.125
....
(vl-string-right-trim ".0" "YourString")
will take off all trailing zeros and decimals. BUT if you use it on something like "60.0000", it will turn that into just "6". So:
(if (= (rem (atof "YourString") 10.0) 0); it's a whole multiple of 10 [keep any zero(s) before the decimal]
(itoa (atoi "YourString")); then
(vl-string-right-trim ".0" "YourString"); else
); if
I really appreciate your help Kent, but i have no idea where to put that code in to make it work. As i said, i have no coding experience at all, im just an end user.
Alex
@mark wrote:
.... i have no idea where to put that code in to make it work. ....
Try this adjustment -- LabelElevMask2.lsp but using the same LEM command name [lightly tested]. You will still need to EDIT certain things for your preferences [Text Style name, etc.].
You are an absolute legend Kent. Thanks, works perfectly.
Many many thanks again.
Alex