乐筑天下

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

[编程交流] Lisp合并和更新

[复制链接]

11

主题

48

帖子

40

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
54
发表于 2022-7-5 19:47:38 | 显示全部楼层 |阅读模式
请帮忙!
我需要一个lisp例程,它可以执行以下操作。。。
1) 选择一个块。
2) 从块中的两个独立标签获取信息
第一个标记:NODE\u ID
第二个标签:DEVICE-TYPE_ID
3) 然后,我需要将上面的两个标记与中间的破折号(-)组合。例子:
第一个标记:NODE_ID=1256
第二个标签:DEVICE-TYPE_ID=C5B3
最终=1256-C5B3
4) 然后我需要一个“暂停”来选择几个不同的块并更新以下标记。。。
标记:与组合结果一起处于活动状态。。
标签:激活=1256-C5B3
 
任何帮助都将不胜感激。
回复

使用道具 举报

1

主题

1069

帖子

1050

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
69
发表于 2022-7-5 19:58:13 | 显示全部楼层
试试这个
  1. ;; cca.lsp
  2. (defun C:CCA  (/ attent atttag attval elist en head pt ss tail)
  3. (setq osm (getvar "osmode"))
  4. (setvar "osmode" 513)
  5. (setq        pt (getpoint
  6.      "\n   ***   Specify point on the source block   ***"))
  7. (setq ss (ssget pt (list (cons 0 "INSERT") (cons 66 1))))
  8. (sssetfirst nil ss)
  9. (if ss
  10.    (progn
  11.      (setq en (ssname ss 0))
  12.      (setq elist (entget en))
  13.      (while (=        (cdr
  14.           (assoc 0
  15.                  (setq elist (entget (entnext
  16.                                        (setq attent (cdr (assoc -1 elist))))))))
  17.         "ATTRIB")
  18. (setq atttag (cdr (assoc 2 elist)))
  19. (setq attval (cdr (assoc 1 elist)))
  20. (cond ((eq "NODE_ID" atttag)
  21.        (setq head (cdr (assoc 1 elist))))
  22.       ((eq "DEVICE-TYPE_ID" atttag)
  23.        (setq tail (cdr (assoc 1 elist))))
  24.       (T nil)
  25.       )
  26. (ssdel en ss)
  27. )
  28.      )
  29.    (princ "\n   0 blocks selected")
  30.    )
  31. (sssetfirst nil nil)
  32. (setq ss nil)
  33. (prompt
  34.    "\n   ***   Select all target blocks you need to update   ***")
  35. (setq ss (ssget (list (cons 0 "INSERT") (cons 66 1))))
  36. (sssetfirst nil ss)
  37. (if (and head tail ss)
  38.    (progn
  39.      (while
  40. (setq en (ssname ss 0))
  41. (setq elist (entget en))
  42. (while        (= (cdr
  43.              (assoc 0
  44.                     (setq elist        (entget        (entnext
  45.                                           (setq attent (cdr (assoc -1 elist))))))))
  46.            "ATTRIB")
  47.    (setq atttag (cdr (assoc 2 elist)))
  48.    (if (eq "ACTIVE" atttag)
  49.      (progn
  50.        (entmod (subst (cons 1 (strcat head "-" tail))
  51.                       (assoc 1 elist)
  52.                       elist))
  53.        (entupd en)
  54.        )
  55.      )
  56.    (ssdel en ss)
  57.    )
  58. )
  59.      (sssetfirst nil nil)
  60.      )
  61.    (princ "\n   0 blocks selected")
  62.    )
  63. (setvar "osmode" osm)
  64. (princ)
  65. )
  66. (princ "   ***   Start command wit CCA   ***")
  67. (princ)

 
~'J'~
回复

使用道具 举报

11

主题

48

帖子

40

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
54
发表于 2022-7-5 20:07:12 | 显示全部楼层
Fixo,
谢谢你的快速回复。我试了一下常规动作,上半场不错,但下半场不行。
我选择源块,然后选择需要更新的块,然后发生以下情况。。。。
第一个标记:NODE_ID(这会更新目标块/标记:Active[包括短划线])。
第二个源块标记:DEVICE-TYPE_ID(目标块/标记中缺少:Active[包括短划线])。
例子:
源块:第一个标记:NODE\u ID=1256
第二个标签:DEVICE-TYPE_ID=C5B3
==============================
更新后。。。
目标块:标记:ACTIVE=“1256-
目标块末端缺少“C5B3”。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 20:08:18 | 显示全部楼层
试试这个:
 
  1. (defun c:tagupd (/ bEnt aEnt aEntLst aNode aType nAtt ss entLst dAtt dAttLst)
  2. (vl-load-com)
  3. (if (and (setq bEnt (car (entsel "\nSelect Block to Retrieve Tag Values >  ")))
  4.       (= "INSERT" (cdr (assoc 0 (entget bEnt))))
  5.       (= 1 (cdr (assoc 66 (entget bEnt)))))
  6.    (progn
  7.      (setq aEnt (entnext bEnt))
  8.      (while (not (eq "SEQEND" (cdr (assoc 0 (setq aEntLst (entget aEnt))))))
  9.    (cond ((= "NODE_ID" (cdr (assoc 2 aEntLst)))
  10.           (setq aNode (cdr (assoc 1 aEntLst))))
  11.          ((= "DEVICE-TYPE_ID" (cdr (assoc 2 aEntLst)))
  12.           (setq aType (cdr (assoc 1 aEntLst)))))
  13.    (setq aEnt (entnext aEnt)))
  14.      (setq nAtt (strcat aNode (chr 45) aType))
  15.      (if (setq ss (ssget (list (cons 0 "INSERT") (cons 66 1)
  16.    (if (getvar "CTAB") (cons 410 (getvar "CTAB")) (cons 67 (- 1 (getvar "TILEMODE")))))))
  17.    (progn
  18.      (setq entLst (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
  19.      (foreach ent entLst
  20.        (setq dAtt (entnext ent))
  21.        (while (not (eq "SEQEND" (cdr (assoc 0 (setq dAttLst (entget dAtt))))))
  22.          (if (= "ACTIVE" (cdr (assoc 2 dAttLst)))
  23.        (setq dAttLst (subst (cons 1 nAtt) (assoc 1 dAttLst) dAttLst))
  24.        (entmod dAttLst))
  25.          (setq dAtt (entnext dAtt)))))
  26.    (princ "\n<!> No Destination Blocks Selected <!>")))
  27.    (princ "\n<!> No Attributed Block Selected <!>"))
  28. (command "_regenall")
  29. (princ))
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 20:18:13 | 显示全部楼层
对不起,遗漏了一件事:
 
  1. (defun c:tagupd (/ bEnt aEnt aEntLst aNode aType nAtt ss entLst dAtt dAttLst)
  2. (vl-load-com)
  3. (if (and (setq bEnt (car (entsel "\nSelect Block to Retrieve Tag Values >  ")))
  4.       (= "INSERT" (cdr (assoc 0 (entget bEnt))))
  5.       (= 1 (cdr (assoc 66 (entget bEnt)))))
  6.    (progn
  7.      (setq aEnt (entnext bEnt))
  8.      (while (not (eq "SEQEND" (cdr (assoc 0 (setq aEntLst (entget aEnt))))))
  9.    (cond ((= "NODE_ID" (cdr (assoc 2 aEntLst)))
  10.           (setq aNode (cdr (assoc 1 aEntLst))))
  11.          ((= "DEVICE-TYPE_ID" (cdr (assoc 2 aEntLst)))
  12.           (setq aType (cdr (assoc 1 aEntLst)))))
  13.    (setq aEnt (entnext aEnt)))
  14.      (setq nAtt (strcat aNode (chr 45) aType))
  15.      (if (setq ss (ssget (list (cons 0 "INSERT") (cons 66 1)
  16.    (if (getvar "CTAB") (cons 410 (getvar "CTAB")) (cons 67 (- 1 (getvar "TILEMODE")))))))
  17.    (progn
  18.      (setq entLst (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
  19.      (foreach ent entLst
  20.        (setq dAtt (entnext ent))
  21.        (while (not (eq "SEQEND" (cdr (assoc 0 (setq dAttLst (entget dAtt))))))
  22.          (if (= "ACTIVE" (cdr (assoc 2 dAttLst)))
  23.        (progn
  24.        (setq dAttLst (subst (cons 1 nAtt) (assoc 1 dAttLst) dAttLst))
  25.        (entmod dAttLst)))
  26.          (setq dAtt (entnext dAtt)))))
  27.    (princ "\n<!> No Destination Blocks Selected <!>")))
  28.    (princ "\n<!> No Attributed Block Selected <!>"))
  29. (command "_regenall")
  30. (princ))
回复

使用道具 举报

11

主题

48

帖子

40

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
54
发表于 2022-7-5 20:23:00 | 显示全部楼层
李,
工作完美!
非常感谢你。你帮我省了很多时间,我一个人想办法解决这个问题。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 20:33:34 | 显示全部楼层
 
 
没问题,cabltv,-你的LISP请求看起来都很简单,但都是很好的实践
回复

使用道具 举报

0

主题

2

帖子

2

银币

初来乍到

Rank: 1

铜币
0
发表于 2022-7-5 20:34:22 | 显示全部楼层
我有一个类似的需要,上述职位。我需要将属性字符串的平衡转移到另一个块。我已附加了一个AutoCAD文件,其中包含要传输到零件标记块的信息表。
ATT-传输。图纸
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 20:42:42 | 显示全部楼层
不是很确定你想要什么,但你可以用多个块做任何事情,这只是识别它们的一个例子,在你的情况下,你是说一个带有标签MM01的块要更新,但存在55次?
 
作为参考,我们有一个pit计划更新程序,它可以从各地获取信息,但无论单个计划在图形中的什么位置都会更新,这只是块名和标记的情况。
 
进一步研究自动更新属性。
回复

使用道具 举报

0

主题

2

帖子

2

银币

初来乍到

Rank: 1

铜币
0
发表于 2022-7-5 20:49:51 | 显示全部楼层
比加尔,我附上了一个新的CAD文件与我需要的方向。谢谢
物料清单。图纸
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

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

© 2020-2025 乐筑天下

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