乐筑天下

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

[编程交流] lisp更改动态块v

[复制链接]

145

主题

590

帖子

446

银币

中流砥柱

Rank: 25

铜币
725
发表于 2022-7-6 06:51:37 | 显示全部楼层 |阅读模式
我试图通过lisp更改块可见性,并将其拼凑在一起。但它不起作用,我想知道是否有人可以找我。谢谢
 
  1. (defun c:Legend_Scale (/ LName BWild obj)
  2. (setq LName "dyn_legend") ;Get the layer's name
  3.        (setq BWild (strcat "*" LName "*")) ;Default to LName
  4.          (setq obj (ssget "_X" (list '(0 . "INSERT") (cons 2 BWild)))) ;And some blocks found
  5. (chgdynprop obj "visibility" "1:1000")
  6. (entupd obj)
  7. (princ)
  8. )
  9. (defun chgdynprop (e propname newval / obj v vval sal tot i)
  10. (setq obj (if (= (type e) 'vla-object) e (vlax-ename->vla-object e)))
  11. (if (= (vlax-get-property obj 'isdynamicblock) :vlax-true)
  12. (progn
  13. (setq v (vla-getdynamicblockproperties obj)
  14. vval (vlax-variant-value v)
  15. sal (vlax-safearray->list vval)
  16. tot (length sal)
  17. i 0
  18. );setq
  19. (while (< i tot)
  20. (if (= (vlax-get-property (nth i sal) "PropertyName")
  21. propname)
  22. (progn
  23. (vlax-put-property (nth i sal) "Value" newval)
  24. (setq i tot)
  25. );progn
  26. (setq i (1+ i))
  27. );endif
  28. );endwhile
  29. );progn
  30. );endif
  31. );chgdynprop
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-6 07:02:24 | 显示全部楼层
尝试一下:
 
  1. (defun c:FOO ( / ss dynProps val)
  2. (vl-load-com)
  3. (if (setq ss (ssget "_x" '((0 . "INSERT") ([color=blue]2[/color] . "[color=blue]*[/color]DYN_LEGEND[color=blue]*[/color]"))))
  4.    (progn
  5.      (vla-startundomark
  6.        (cond (*activeDoc*)
  7.              ((setq *activeDoc*
  8.                      (vla-get-activedocument
  9.                        (vlax-get-acad-object))))))
  10.      (vlax-for x (setq ss (vla-get-activeselectionset *activeDoc*))
  11.        (if (and (= :vlax-true (vla-get-isdynamicblock x))
  12.                 (vl-string-search
  13.                   "DYN_LEGEND"
  14.                   (strcase (vla-get-effectivename x)))
  15.                 (setq dynProps (car (vlax-invoke
  16.                                       x
  17.                                       'getdynamicblockproperties)))
  18.                 (vl-position
  19.                   (cond (val) ((setq val "1:1000")))
  20.                   (vlax-get dynProps 'allowedvalues)))
  21.           (vlax-put-property dynProps 'value val)))
  22.      (vla-endundomark *activeDoc*)
  23.      (vla-delete ss))
  24.    (prompt "\n** Nothing selected ** "))
  25. (princ))

 
注意,如果val(“1:1000”)不包括在动态块的允许值中,则不采取任何操作。
回复

使用道具 举报

145

主题

590

帖子

446

银币

中流砥柱

Rank: 25

铜币
725
发表于 2022-7-6 07:13:22 | 显示全部楼层
谢谢RenderMan。尽管如此,我还是得到了“没有选择”。我尝试过重命名块和不同的东西,但没有乐趣。有什么想法吗?
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-6 07:18:00 | 显示全部楼层

 
(8.“DYN_图例”)
(2.“DYN_图例”)
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-6 07:29:55 | 显示全部楼层
 
这意味着“DYN_LEGEND”层上没有块。也许我误解了你的原始代码。。。我接受了这句话:
 
 
... 也就是说,这将是块的层名称?因此,我包括以下内容:
 
 
... 其中DXF代码8是图元的图层名。尝试将红色代码替换为:
 
  1. (2 . "*DYN_LEGEND*")

 
... 否则,我们只需跨过所有块的SS。
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-6 07:40:53 | 显示全部楼层
 
不要忘记添加星号:眨眼:
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-6 07:46:08 | 显示全部楼层
 
当然
 
当做
回复

使用道具 举报

77

主题

298

帖子

232

银币

后起之秀

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

铜币
394
发表于 2022-7-6 07:51:45 | 显示全部楼层
嘿伙计们,
 
我自己刚刚发现了动态块的可见性状态,非常有趣,可能非常有用。
 
我只是在定制一张客户图纸,供我们办公室使用,我只是想了解如何在多个图形中批量切换块的可见性状态。
 
上面的例程看起来应该可以做到这一点,但不幸的是,当我运行它时,结果是“**未选择任何内容**”。
 
如果我从选择集中删除块名过滤器,例程似乎运行良好。
 
我的工作代码是…
 
  1. (defun c:test1 ( / ss dynProps val)
  2. (vl-load-com)
  3. (if (setq ss (ssget "_x" '((0 . "INSERT"))))
  4.    (progn
  5.      (vla-startundomark
  6.        (cond (*activeDoc*)
  7.              ((setq *activeDoc*
  8.                      (vla-get-activedocument
  9.                        (vlax-get-acad-object))))))
  10.      (vlax-for x (setq ss (vla-get-activeselectionset *activeDoc*))
  11.        (if (and (= :vlax-true (vla-get-isdynamicblock x))
  12.                 (vl-string-search
  13.                   "4057_STICKER"
  14.                   (strcase (vla-get-effectivename x)))
  15.                 (setq dynProps (car (vlax-invoke
  16.                                       x
  17.                                       'getdynamicblockproperties)))
  18.                 (vl-position
  19.                   (cond (val) ((setq val "For Client Review")))
  20.                   (vlax-get dynProps 'allowedvalues)))
  21.           (vlax-put-property dynProps 'value val)))
  22.      (vla-endundomark *activeDoc*)
  23.      (vla-delete ss))
  24.    (prompt "\n** Nothing selected ** "))
  25. (princ))

 
但我不明白为什么它没有检测到我的名为“4057_贴纸”的块。这和匿名的名字有关吗?
 
谢谢你的帮助。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-10 14:50 , Processed in 0.464668 second(s), 68 queries .

© 2020-2025 乐筑天下

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