CesarA 发表于 2022-7-5 18:12:24

如何进行多实体修改

我一直在使用一段代码来修改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)
)
仍然得到参数错误

Jef! 发表于 2022-7-5 18:29:16

你好。你的“第二次抓取”不起作用,因为。。。你不再抓取,你只是在同一个选择集中再次迭代!首先,使用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创建新变量。越少越好!
 
我希望这有帮助!
干杯,新年快乐!
杰夫!

CesarA 发表于 2022-7-5 18:34:24

谢谢杰夫,它很整洁,但有一个问题。它不起作用,因为41是多行文字的代码组,而不是文字。因此,当你在文本中更改它时,它可能会更改其他一些不是多行文字宽度的内容。这就是为什么我想在转换成多行文字后做这样的改变。
 
还有一个问题,当我使用该命令转换为多行文字时,我的autocad清楚地显示“删除了1个对象,添加了1个多行文字”。这就是他不保留相同物体标识的原因。大问题。
 
有人对如何解决这个问题有什么建议吗?

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

为什么不创建一个新的多行文字对象,而不是输入dxf代码?如果我没记错的话,entmod’ing dxf 41基本上不起作用。

CesarA 发表于 2022-7-5 18:50:38

我不理解你的问题,当我使用txt2mtxt时,会创建一个新的多行文字对象。此外,entmod'ing是我知道的编辑对象的唯一方式(我已经在这里呆了4天)。创建新对象实际上是个问题,因为当我这样做时,身份会发生变化。这意味着,到目前为止,在使用该命令后,我无法更改之前选择的对象的任何内容。
我错了吗?(我希望如此)

Tharwat 发表于 2022-7-5 19:03:00

忘记命令txt2mtxt,使用Entmake(x)创建多行文字。

CesarA 发表于 2022-7-5 19:11:03

我会看一看,谢谢!
 
哦,上帝。。它会从无到有地创建一个对象吗?很不错的。。再多编一点程序,我会让它运行起来。我只需要原始文本中的坐标和文本字符串,对吗?

Jef! 发表于 2022-7-5 19:18:25

Jef!。。。无双ff
txt/mtext上的dxf 41是相对的X比例因子。它会影响任何对齐文字/多行文字的宽度,并会影响多行非对齐多行文字上换行符的位置,这不可能是您的情况,因为您的每个多行文字都是由多行文字中翻译的单行文字组成的。。我没有进一步挖掘就拿走了你的数字。
 
我不确定我完全理解你想要做什么,但正如塔瓦特所说,你可以从这些文本中收集所有你需要的东西(内容、位置、可能还有方向、文本高度和文本样式),并使用任何适合你需要的属性,将它们提供给entmake。你可以把多行文字放在与原文相同的层上,或者利用这个机会,让我们说,把所有的多行文字放在所说的层上,文字风格,以符合你的实际标准。这取决于你!
页: [1]
查看完整版本: 如何进行多实体修改