如何进行多实体修改
我一直在使用一段代码来修改dtext对象的文本字符串,然后将其转换为多行文字。(defun c:efg ( / a e o s x d oldd new-dxf)
(if (setq s (ssget "_:L" '((0 . "TEXT"))))
(repeat (setq i (sslength s))
(setq e (ssname s (setq i (1- i)))
x (entget e)
a (assoc 1 x)
oldd (assoc 41 x)
)
(entmod (subst (cons 1 (strcat "{\\H0.15;"(substr (cdr a) 1 4)"}" "{\\H0.15;(0.--""x0.--" ")}")) a x))
(command "_.txt2mtxt" e "")
)
)
(princ)
)
然而,我注意到,在将其转换为多行文字后,对象的标识符发生了变化,我相信由于这个原因,我不能再次使用entmod。所以我想在转换成多行文字后再做一次身份识别,就像这样
(defun c:efg ( / a e o s x d oldd new-dxf b n m)
(if (setq s (ssget "_:L" '((0 . "TEXT"))))
(repeat (setq i (sslength s))
(setq e (ssname s (setq i (1- i))) ;first identity grab
x (entget e)
a (assoc 1 x)
)
;;;; do stuff on all the identities
(entmod (subst (cons 1 (strcat "{\\H0.15;"(substr (cdr a) 1 4)"}" "{\\H0.15;(0.--""x0.--" ")}")) a x))
(command "_.txt2mtxt" e "")
(setq b (ssname n (setq i (1- i))) ;second identity grab
m (entget b)
oldd (assoc 41 m)
new-dxf '(41 . 1.5)
d (subst new-dxf oldd m)
)
;;;; modify the width of the mtext
(entmod d)
)
)
(princ)
)
(41.是多行文字宽度的代码组)
第二次抓取似乎不起作用,有什么提示吗?
编辑:对代码进行了一些更正,现在我得到了一个错误的参数:lselsept
我还注意到,有一个if条件可能无法使用,因为我正在排队mtext,所以我创建了一个单独的if循环
(defun c:efg ( / a e o s x d oldd new-dxf b n m)
(if (setq s (ssget "_:L" '((0 . "TEXT"))))
(repeat (setq i (sslength s))
(setq e (ssname s (setq i (1- i))) ;first identity grab
x (entget e)
a (assoc 1 x)
)
;;;; do stuff on all the identities
(entmod (subst (cons 1 (strcat "{\\H0.15;"(substr (cdr a) 1 4)"}" "{\\H0.15;(0.--""x0.--" ")}")) a x))
(command "_.txt2mtxt" e "")
)
)
(if (setq n (ssget "_:L" '((0 . "MTEXT"))))
(repeat (setq i (sslength s))
(setq b (ssname n (setq i (1- i))) ;second identity grab
m (entget b)
oldd (assoc 41 m)
new-dxf '(41 . 1.5)
d (subst new-dxf oldd m)
)
;;;; modify the width of the mtext
(entmod d)
)
)
(princ)
)
仍然得到参数错误 你好。你的“第二次抓取”不起作用,因为。。。你不再抓取,你只是在同一个选择集中再次迭代!首先,使用ssget为“抓取”的所有内容创建一个选择集。
(setq s (ssget "_:L" '((0 . "TEXT"))))
基本上,您的选择集包含您使用ssget获得的文本的珐琅。当您将其更改为多行文字时,这些文字(不再存在)以及包含已不存在实体的名称的选择集将不再有用。
我要做的是在将两个entmod传递到text-to-mtext命令之前创建它们,请看这个
(defun c:efg ( / a e o s x d)
(if (setq s (ssget "_:L" '((0 . "TEXT"))))
(repeat (setq i (sslength s))
(setq e (ssname s (setq i (1- i)))
x (entget e)
a (assoc 1 x)
)
(setq x (entmod (subst (cons 1 (strcat "{\\H0.15;"(substr (cdr a) 1 4)"}" "{\\H0.15;(0.--""x0.--" ")}")) a x))); store the 1rst change into the dxf code back to x
(entmod (subst '(41 . 1.5) (assoc 41 x) x));do the 2nd modification
(command "_.txt2mtxt" e "")
)
)
(princ)
)
您也不必存储旧的assoc 41,因为您可以直接在subst中调用(assoc 41 x)。我也从局部变量中删除了“新dxf”,因为您不需要为entmod创建新变量。越少越好!
我希望这有帮助!
干杯,新年快乐!
杰夫! 谢谢杰夫,它很整洁,但有一个问题。它不起作用,因为41是多行文字的代码组,而不是文字。因此,当你在文本中更改它时,它可能会更改其他一些不是多行文字宽度的内容。这就是为什么我想在转换成多行文字后做这样的改变。
还有一个问题,当我使用该命令转换为多行文字时,我的autocad清楚地显示“删除了1个对象,添加了1个多行文字”。这就是他不保留相同物体标识的原因。大问题。
有人对如何解决这个问题有什么建议吗? 为什么不创建一个新的多行文字对象,而不是输入dxf代码?如果我没记错的话,entmod’ing dxf 41基本上不起作用。 我不理解你的问题,当我使用txt2mtxt时,会创建一个新的多行文字对象。此外,entmod'ing是我知道的编辑对象的唯一方式(我已经在这里呆了4天)。创建新对象实际上是个问题,因为当我这样做时,身份会发生变化。这意味着,到目前为止,在使用该命令后,我无法更改之前选择的对象的任何内容。
我错了吗?(我希望如此) 忘记命令txt2mtxt,使用Entmake(x)创建多行文字。 我会看一看,谢谢!
哦,上帝。。它会从无到有地创建一个对象吗?很不错的。。再多编一点程序,我会让它运行起来。我只需要原始文本中的坐标和文本字符串,对吗? Jef!。。。无双ff
txt/mtext上的dxf 41是相对的X比例因子。它会影响任何对齐文字/多行文字的宽度,并会影响多行非对齐多行文字上换行符的位置,这不可能是您的情况,因为您的每个多行文字都是由多行文字中翻译的单行文字组成的。。我没有进一步挖掘就拿走了你的数字。
我不确定我完全理解你想要做什么,但正如塔瓦特所说,你可以从这些文本中收集所有你需要的东西(内容、位置、可能还有方向、文本高度和文本样式),并使用任何适合你需要的属性,将它们提供给entmake。你可以把多行文字放在与原文相同的层上,或者利用这个机会,让我们说,把所有的多行文字放在所说的层上,文字风格,以符合你的实际标准。这取决于你!
页:
[1]