Cylis0509 发表于 2022-7-5 18:17:50

图层名称到文字

大家好,
 
我发现了这个李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))

Cylis0509 发表于 2022-7-5 18:21:52

好的,我已经知道了如何提示输入文本大小,并将标签设置为图形的捕捉角度。它工作得很好。但我仍在努力解决如何将文本集中在对象上,以及如何将层名称截断为我想要的格式。
 

;; 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))

Tharwat 发表于 2022-7-5 18:26:45

要截断字符串,请使用SUBTR函数。

Cylis0509 发表于 2022-7-5 18:28:59

 
嗨,塔瓦,
 
我明白了,但我遇到的问题是,由于没有更好的术语,我在代码中从哪里开始“格式化”。
 
谢谢
气缸0509

Zac Davis 发表于 2022-7-5 18:33:50

 
我建议你转向注释性文本(我想是在2008年引入的),这样,您可以在模型和纸张中获得所需的文本高度,而不会出现任何问题。然后使用图层名为lisp的一些标签线。然后使用find并替换为find命令。关于添加块,不知道你的意思?

Tharwat 发表于 2022-7-5 18:37:36

您有一个层名称,正如您在2003298-10之前提到的,首先您要删除代表年份的前四个数字。那么剩下的呢?
 
如。
(substr "2003298-10" 5)返回;
 
"298-10"
 
给我看看你想要的最终字符串。

Cylis0509 发表于 2022-7-5 18:39:08

 
 
谢谢Tharwat,
 
我想用同一个例子实现的最终格式是:两行10号地块298。
 
我也在努力让用户选择标签的位置。

Tharwat 发表于 2022-7-5 18:41:38

在给出任何解决方案之前,让我们先弄清楚这一点。可以
 
所有层名称的字符格式或长度是否相同?我的意思是,四个数字=年份,三个数字=区块,两个数字=地块?
 
你说的是一层,还是所有其他层都有相同长度的字符?

Cylis0509 发表于 2022-7-5 18:46:12

它们确实略有不同。它总是四个数字=年份,三个数字=区块,变量=地块,但地块可以是“-”之后的所有内容。
 
https://www.cadtutor.net/c:%5CCapture.png
 
好吧,那没用。。。想给你看一张图层对话框的图片。

Cylis0509 发表于 2022-7-5 18:49:11

附件是图层对话框的图像
页: [1] 2
查看完整版本: 图层名称到文字