乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 88|回复: 7

[编程交流] 如何进行多实体修改

[复制链接]

17

主题

72

帖子

55

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
85
发表于 2022-7-5 18:12:24 | 显示全部楼层 |阅读模式
我一直在使用一段代码来修改dtext对象的文本字符串,然后将其转换为多行文字。
 
  1. (defun c:efg ( / a e o s x d oldd new-dxf)
  2.    (if (setq s (ssget "_:L" '((0 . "TEXT"))))
  3.        (repeat (setq i (sslength s))
  4.            (setq e (ssname s (setq i (1- i)))
  5.                  x (entget e)
  6.                  a (assoc 1 x)
  7.                  oldd (assoc 41 x)
  8.            )
  9.             (entmod (subst (cons 1 (strcat "{\\H0.15;"(substr (cdr a) 1 4)"}" "{\\H0.15;(0.--"  "x0.--" ")}")) a x))
  10.             
  11.             (command "_.txt2mtxt" e "")
  12.        )
  13.    )
  14.    (princ)
  15. )

 
然而,我注意到,在将其转换为多行文字后,对象的标识符发生了变化,我相信由于这个原因,我不能再次使用entmod。所以我想在转换成多行文字后再做一次身份识别,就像这样
 
 
  1. (defun c:efg ( / a e o s x d oldd new-dxf b n m)
  2.    (if (setq s (ssget "_:L" '((0 . "TEXT"))))
  3.        (repeat (setq i (sslength s))
  4.            (setq e (ssname s (setq i (1- i))) ;first identity grab
  5.                  x (entget e)
  6.                  a (assoc 1 x)
  7.                  
  8.            )
  9.             ;;;; do stuff on all the identities
  10.             (entmod (subst (cons 1 (strcat "{\\H0.15;"(substr (cdr a) 1 4)"}" "{\\H0.15;(0.--"  "x0.--" ")}")) a x))
  11.             (command "_.txt2mtxt" e "")
  12.          
  13.            (setq b (ssname n (setq i (1- i))) ;second identity grab
  14.                  m (entget b)
  15.                  oldd (assoc 41 m)
  16.           new-dxf '(41 . 1.5)
  17.                  d (subst new-dxf oldd m)
  18.                  
  19.            )
  20.            ;;;; modify the width of the mtext
  21.           (entmod d)            
  22.            
  23.        )
  24.    )
  25.    (princ)
  26. )

 
(41.是多行文字宽度的代码组)
 
第二次抓取似乎不起作用,有什么提示吗?
 
编辑:对代码进行了一些更正,现在我得到了一个错误的参数:lselsept
我还注意到,有一个if条件可能无法使用,因为我正在排队mtext,所以我创建了一个单独的if循环
 
  1. (defun c:efg ( / a e o s x d oldd new-dxf b n m)
  2.    (if (setq s (ssget "_:L" '((0 . "TEXT"))))
  3.        (repeat (setq i (sslength s))
  4.            (setq e (ssname s (setq i (1- i))) ;first identity grab
  5.                  x (entget e)
  6.                  a (assoc 1 x)
  7.            )
  8.             ;;;; do stuff on all the identities
  9.             (entmod (subst (cons 1 (strcat "{\\H0.15;"(substr (cdr a) 1 4)"}" "{\\H0.15;(0.--"  "x0.--" ")}")) a x))
  10.             (command "_.txt2mtxt" e "")
  11.          
  12.        )
  13.    )
  14.    (if (setq n (ssget "_:L" '((0 . "MTEXT"))))
  15.        (repeat (setq i (sslength s))           
  16.            (setq b (ssname n (setq i (1- i))) ;second identity grab
  17.                  m (entget b)
  18.                  oldd (assoc 41 m)
  19.           new-dxf '(41 . 1.5)
  20.                  d (subst new-dxf oldd m)
  21.                  
  22.            )
  23.            ;;;; modify the width of the mtext
  24.           (entmod d)            
  25.        )
  26.    )
  27.    (princ)
  28. )

仍然得到参数错误
回复

使用道具 举报

28

主题

317

帖子

292

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
140
发表于 2022-7-5 18:29:16 | 显示全部楼层
你好。你的“第二次抓取”不起作用,因为。。。你不再抓取,你只是在同一个选择集中再次迭代!首先,使用ssget为“抓取”的所有内容创建一个选择集。
  1. (setq s (ssget "_:L" '((0 . "TEXT"))))

基本上,您的选择集包含您使用ssget获得的文本的珐琅。当您将其更改为多行文字时,这些文字(不再存在)以及包含已不存在实体的名称的选择集将不再有用。
我要做的是在将两个entmod传递到text-to-mtext命令之前创建它们,请看这个
  1. (defun c:efg ( / a e o s x d)
  2.    (if (setq s (ssget "_:L" '((0 . "TEXT"))))
  3.        (repeat (setq i (sslength s))
  4.            (setq e (ssname s (setq i (1- i)))
  5.                  x (entget e)
  6.                  a (assoc 1 x)
  7.            )
  8.             (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
  9.             (entmod (subst '(41 . 1.5) (assoc 41 x) x));do the 2nd modification
  10.             (command "_.txt2mtxt" e "")
  11.        )
  12.    )
  13.    (princ)
  14. )

您也不必存储旧的assoc 41,因为您可以直接在subst中调用(assoc 41 x)。我也从局部变量中删除了“新dxf”,因为您不需要为entmod创建新变量。越少越好!
 
我希望这有帮助!
干杯,新年快乐!
杰夫!
回复

使用道具 举报

17

主题

72

帖子

55

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

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

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-5 18:41:24 | 显示全部楼层
为什么不创建一个新的多行文字对象,而不是输入dxf代码?如果我没记错的话,entmod’ing dxf 41基本上不起作用。
回复

使用道具 举报

17

主题

72

帖子

55

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

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

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-5 19:03:00 | 显示全部楼层
忘记命令txt2mtxt,使用Entmake(x)创建多行文字。
回复

使用道具 举报

17

主题

72

帖子

55

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
85
发表于 2022-7-5 19:11:03 | 显示全部楼层
我会看一看,谢谢!
 
哦,上帝。。它会从无到有地创建一个对象吗?很不错的。。再多编一点程序,我会让它运行起来。我只需要原始文本中的坐标和文本字符串,对吗?
回复

使用道具 举报

28

主题

317

帖子

292

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

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

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-12 20:38 , Processed in 1.115807 second(s), 68 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表