图层名称到文字
大家好,我发现了这个李Mac的Lisp程序,我正在寻找一些帮助来修改它。它工作得很好,只是需要调整它,以满足我的需要。
我一直从几个城镇收到税务地图,每个地块都在自己的图层上,图层名称是地块和区块。例如:层名称:2003298-10,其中2003年为年份,298为区块,10为地块。
我希望修改代码,这样当我选择其中一个批次(顺便说一句,这是一条多段线)时,它会适当地标记多段线。
到目前为止,代码可以工作,并用图层名标记线。我想修改它,这样它会提示用户输入文本大小,通过删除前四个字符来打破标签,在接下来的三个字符中添加Block,删除-并在最后两个字符中添加lot。然后尽可能将文字放置在多段线地块的中心,文字旋转角度设置为snapang或viewtwist变量。
我希望我能解释清楚,在这些方面有任何帮助都会很好。
谢谢
气缸0509
;; LayText.lsp by Lee McDonnell, 03.12.2009
;; Function will display layer information
;; at midpoint of every line selected.
(defun c:LayText (/ *error* mk_txt
DOC ENT I IPT LANG OFAC P SPC SS TOBJ TSZE UFLAG)
(vl-load-com)
(setq oFac 0.7) ;; Offset Factor
(setq tSze nil) ;; Text Size ~ nil for TEXTSIZE Variable
(defun *error* (msg)
(and uFlag (vla-EndUndoMark doc))
(or (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*")
(princ (strcat "\n** Error: " msg " **")))
(princ))
(defun mk_txt (p v) (vla-addText spc v (vlax-3D-point p) tSze))
(setq doc (vla-get-ActiveDocument
(vlax-get-Acad-Object))
spc (if (zerop (vla-get-activespace doc))
(if (= (vla-get-mspace doc) :vlax-true)
(vla-get-modelspace doc)
(vla-get-paperspace doc))
(vla-get-modelspace doc)))
(or tSze (setq tSze (getvar "TEXTSIZE")))
(if (setq i -1 ss (ssget '((0 . "*LINE,ARC,CIRCLE,ELLIPSE"))))
(progn
(setq uFlag (not (vla-StartUndoMark doc)))
(while (setq ent (ssname ss (setq i (1+ i))))
(setq iPt (vlax-curve-getPointatDist ent
(/ (- (vlax-curve-getDistatParam ent
(vlax-curve-getEndParam ent))
(vlax-curve-getDistatParam ent
(vlax-curve-getStartParam ent))) 2.)))
(setq lAng (angle '(0 0 0) (vlax-curve-getFirstDeriv ent
(vlax-curve-getParamatPoint ent iPt))))
(if (equal lAng (/ pi 2.) 0.001) (setq lAng (/ pi 2.)))
(if (equal lAng (/ (* 3 pi) 2.) 0.001) (setq lAng (/ (* 3 pi) 2.)))
(cond ( (and (> lAng (/ pi 2)) (<= lAng pi)) (setq lAng (- lAng pi)))
( (and (> lAng pi) (<= lAng (/ (* 3 pi) 2))) (setq lAng (+ lAng pi))))
(setq tObj (mk_txt (setq p (polar iPt (+ lAng (/ pi 2.)) (* oFac tSze)))
(vla-get-Layer (vlax-ename->vla-object ent))))
(vla-put-Alignment tObj acAlignmentMiddleCenter)
(vla-put-TextAlignmentPoint tObj (vlax-3D-point p))
(vla-put-Rotation tObj lAng))
(setq uFlag (vla-EndUndoMark doc))))
(princ)) 好的,我已经知道了如何提示输入文本大小,并将标签设置为图形的捕捉角度。它工作得很好。但我仍在努力解决如何将文本集中在对象上,以及如何将层名称截断为我想要的格式。
;; LayText.lsp by Lee McDonnell, 03.12.2009
;; Function will display layer information
;; at midpoint of every line selected.
(defun c:LBLL (/ *error* mk_txt
DOC ENT I IPT LANG OFAC P SPC SS TOBJ TSZE UFLAG)
(vl-load-com)
(setq oFac 0.7) ;; Offset Factor
(setq tSze (getint "Enter the text size for the label: "))
(defun *error* (msg)
(and uFlag (vla-EndUndoMark doc))
(or (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*")
(princ (strcat "\n** Error: " msg " **")))
(princ))
(defun mk_txt (p v) (vla-addText spc v (vlax-3D-point p) tSze))
(setq doc (vla-get-ActiveDocument
(vlax-get-Acad-Object))
spc (if (zerop (vla-get-activespace doc))
(if (= (vla-get-mspace doc) :vlax-true)
(vla-get-modelspace doc)
(vla-get-paperspace doc))
(vla-get-modelspace doc)))
(if (setq i -1 ss (ssget '((0 . "*LINE,ARC,CIRCLE,ELLIPSE"))))
(progn
(setq uFlag (not (vla-StartUndoMark doc)))
(while (setq ent (ssname ss (setq i (1+ i))))
(setq iPt (vlax-curve-getPointatDist ent
(/ (- (vlax-curve-getDistatParam ent
(vlax-curve-getEndParam ent))
(vlax-curve-getDistatParam ent
(vlax-curve-getStartParam ent))) 2.)))
(setq lAng (getvar "snapang"))
(setq tObj (mk_txt (setq p (polar iPt (+ lAng (/ pi 2.)) (* oFac tSze)))
(vla-get-Layer (vlax-ename->vla-object ent))))
(vla-put-Alignment tObj acAlignmentMiddleCenter)
(vla-put-TextAlignmentPoint tObj (vlax-3D-point p))
(vla-put-Rotation tObj lAng))
(setq uFlag (vla-EndUndoMark doc))))
(princ))
要截断字符串,请使用SUBTR函数。
嗨,塔瓦,
我明白了,但我遇到的问题是,由于没有更好的术语,我在代码中从哪里开始“格式化”。
谢谢
气缸0509
我建议你转向注释性文本(我想是在2008年引入的),这样,您可以在模型和纸张中获得所需的文本高度,而不会出现任何问题。然后使用图层名为lisp的一些标签线。然后使用find并替换为find命令。关于添加块,不知道你的意思? 您有一个层名称,正如您在2003298-10之前提到的,首先您要删除代表年份的前四个数字。那么剩下的呢?
如。
(substr "2003298-10" 5)返回;
"298-10"
给我看看你想要的最终字符串。
谢谢Tharwat,
我想用同一个例子实现的最终格式是:两行10号地块298。
我也在努力让用户选择标签的位置。 在给出任何解决方案之前,让我们先弄清楚这一点。可以
所有层名称的字符格式或长度是否相同?我的意思是,四个数字=年份,三个数字=区块,两个数字=地块?
你说的是一层,还是所有其他层都有相同长度的字符? 它们确实略有不同。它总是四个数字=年份,三个数字=区块,变量=地块,但地块可以是“-”之后的所有内容。
https://www.cadtutor.net/c:%5CCapture.png
好吧,那没用。。。想给你看一张图层对话框的图片。 附件是图层对话框的图像
页:
[1]
2