乐筑天下

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

[编程交流] 块匹配/复制属性

[复制链接]

1

主题

1

帖子

0

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 20:18:28 | 显示全部楼层 |阅读模式
大家好,我是新手。
一直在尝试宏和LISP。主要通过谷歌搜索!
我一直坚持的一件事是,找不到类似的东西:
 
键入LISP命令,将所有属性从“REV”块复制到“REVHISTORY”块。(所有ATT标签都是相同的,只是名称)。
 
我见过他们,你选择一个源和目标块,但不是基于块名,这可以做到吗?
 
提前感谢
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 20:44:34 | 显示全部楼层
2种方法首先使用标记获取块1属性写入块2属性,第二种方法更简单,如果块2是块1的副本,则在创建时,您可以使用VL获取“属性”,然后将每个属性放入另一个块中。
 
为了进一步解释,无论块外观如何,autocad都会按创建顺序保留块属性信息,以便(vlax ename->vla object(ssname SS1 0))'getattributes)检索它们。可以对任意两个块执行此操作,只要它们具有相同数量的属性。是,选择区块1选择区块2全部完成。
 
请张贴图纸
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 20:59:13 | 显示全部楼层
看看这个,你需要在代码中向下滚动到我的代码部分http://www.cadtutor.net/forum/showthread.php?90519-用于从csv文件编译块属性的AutoLisp
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 21:16:11 | 显示全部楼层
以下假设活动布局中每个块只有一个参考,并且两个块都不是动态的:
  1. (defun c:attcopy ( / a b e i l s v x )
  2.    (if
  3.        (setq s
  4.            (ssget "_X"
  5.                (list
  6.                   '(0 . "INSERT")
  7.                   '(66 . 1)
  8.                   '(2 . "REV,REVHISTORY")
  9.                    (cons 410 (getvar 'ctab))
  10.                )
  11.            )
  12.        )
  13.        (progn
  14.            (setq i -1)
  15.            (while (not (or (and a b) (not (setq e (ssname s (setq i (1+ i)))))))
  16.                (set (if (= "REV" (cdr (assoc 2 (entget e)))) 'a 'b) e)
  17.            )
  18.            (if (and a b)
  19.                (progn
  20.                    (setq l
  21.                        (mapcar '(lambda ( x ) (cons (vla-get-tagstring x) (vla-get-textstring x)))
  22.                            (vlax-invoke (vlax-ename->vla-object a) 'getattributes)
  23.                        )
  24.                    )
  25.                    (foreach x (vlax-invoke (vlax-ename->vla-object b) 'getattributes)
  26.                        (if (setq v (cdr (assoc (vla-get-tagstring x) l)))
  27.                            (vla-put-textstring x v)
  28.                        )
  29.                    )
  30.                )
  31.                (if a
  32.                    (princ "\nREVHISTORY block not found in the current layout.")
  33.                    (princ "\nREV block not found in the current layout.")
  34.                )
  35.            )
  36.        )
  37.        (princ "\nNeither REV nor REVHISTORY blocks found in the current layout.")
  38.    )
  39.    (princ)
  40. )
  41. (vl-load-com) (princ)
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 21:27:58 | 显示全部楼层
这里是从一个块到另一个块的副本,唯一的条件是,基于OP的原始语句,它们都具有相同数量的属性。第二个块与第一个块相同
 
  1. (setq sublst '())
  2. (setq blk1 (car (entsel "\nPick block 1")))
  3. (foreach att (vlax-invoke (vlax-ename->vla-object blk1) 'getattributes)
  4. (setq sublst (cons (vla-get-textstring att ) sublst))
  5. )
  6. (setq sublst (reverse sublst))
  7. (setq x -1)
  8. (setq blk2 (car (entsel "\nPick block 2")))
  9. (foreach att (vlax-invoke (vlax-ename->vla-object blk2) 'getattributes)
  10. (setq x (+ x 1))
  11. (vla-put-textstring att (nth x sublst))
  12. )
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-11 08:59 , Processed in 0.754521 second(s), 62 queries .

© 2020-2025 乐筑天下

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