乐筑天下

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

[编程交流] 字符串覆盖

[复制链接]

21

主题

155

帖子

135

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
105
发表于 2022-7-5 18:44:37 | 显示全部楼层 |阅读模式
我需要一个lisp来覆盖文字/多行文字
 
它将提示用户输入字符串[(getstring“\n输入要覆盖的文本”)]
 
然后选择要覆盖的窗口或拾取实体。
 
这是我到目前为止得到的:
 
  1. ;; STRing OverWrite for text/mtext strings to user specified string
  2. ;;
  3. (defun C:STROW (/ d t x))
  4. (setq x (getstring "\nEnter text to overwrite"))
  5. (setq t (ssget "_:L" (list '(0 . "TEXT,MTEXT"))))
  6.    (repeat (setq t (sslength t))
  7.       (setq d (entget (ssname t 0))
  8.         (entmod (subst (cons 1 x) (assoc 1 d)d)
  9.     ); end setq
  10.     (entmod d)
  11.     (ssdel (ssname t 0) t)
  12. ); end repeat
  13. (princ)
  14. ); end defun
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 18:52:09 | 显示全部楼层
粗略一看,您发布的代码看起来是正确的——这里有另一种编写相同内容的方法:
  1. (defun c:strow ( / i s x )
  2.    (if (and (/= "" (setq x (getstring t "\nEnter text to overwrite: ")))
  3.             (setq s (ssget "_:L" '((0 . "TEXT,MTEXT"))))
  4.        )
  5.        (repeat (setq i (sslength s))
  6.            (vla-put-textstring (vlax-ename->vla-object (ssname s (setq i (1- i)))) x)
  7.        )
  8.    )
  9.    (princ)
  10. )
  11. (vl-load-com) (princ)
回复

使用道具 举报

21

主题

155

帖子

135

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
105
发表于 2022-7-5 18:58:24 | 显示全部楼层
效果完美。谢谢你,李
回复

使用道具 举报

4

主题

2143

帖子

2197

银币

限制会员

铜币
-24
发表于 2022-7-5 19:01:39 | 显示全部楼层
请阅读代码发布指南并编辑您的帖子,将代码包含在代码标签中。
回复

使用道具 举报

21

主题

155

帖子

135

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
105
发表于 2022-7-5 19:07:17 | 显示全部楼层
有人知道如何修改上述lisp以包含选定的属性吗?我尝试过更改代码,但没有成功:
  1. "TEXT,MTEXT,attdef"
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 19:11:14 | 显示全部楼层
由于ssget不允许选择属性等子实体,因此您需要使用nentsel选择(单个对象),或允许选择属性块(插入),然后迭代块持有的属性,例如:
  1. (defun c:strow ( / i o s x )
  2.    (if (and (/= "" (setq x (getstring t "\nEnter text to overwrite: ")))
  3.             (setq s (ssget "_:L" '((-4 . "<OR") (0 . "TEXT,MTEXT") (-4 . "<AND") (0 . "INSERT") (66 . 1) (-4 . "AND>") (-4 . "OR>"))))
  4.        )
  5.        (repeat (setq i (sslength s))
  6.            (setq o (vlax-ename->vla-object (ssname s (setq i (1- i)))))
  7.            (if (= "AcDbBlockReference" (vla-get-objectname o))
  8.                (foreach a (vlax-invoke o 'getattributes) (vla-put-textstring a x))
  9.                (vla-put-textstring o x)
  10.            )
  11.        )
  12.    )
  13.    (princ)
  14. )
  15. (vl-load-com) (princ)
回复

使用道具 举报

21

主题

155

帖子

135

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
105
发表于 2022-7-5 19:13:07 | 显示全部楼层
我又来救援了!
再次感谢你,李,它完全按照需要工作
-哈里
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 19:19:23 | 显示全部楼层
不客气,哈利!
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 19:23:23 | 显示全部楼层
不记得是在2007年找到的会做你想做的事情的一个Autocad命令。
回复

使用道具 举报

21

主题

155

帖子

135

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
105
发表于 2022-7-5 19:26:41 | 显示全部楼层
好吧,我输了。我一直在尝试创建一个lisp,它使用Lee Mac上面建议的“nentsel”修改单个属性。我能想到的最好的方法是如下所示,但在运行lisp时,我很难放入“while”或“repeat”语句来修改多个属性。
-哈里
PS为什么代码标签按钮[#]不再工作了?
 
 
 
 
  1. (defun c:catt (/ new existing)
  2. (setq new "ref")  
  3. (setq existing(entget (car(nentsel "\nselect attribute text to replace :"))))
  4.   (setq existing
  5. (subst (cons 1 new)
  6. (assoc 1 existing)
  7. existing)
  8. )
  9. (entmod existing)
  10. (princ)
  11. );end defun
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-12 13:27 , Processed in 1.101454 second(s), 72 queries .

© 2020-2025 乐筑天下

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