乐筑天下

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

[编程交流] ssget和动态块

[复制链接]

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 18:22:36 | 显示全部楼层 |阅读模式
你好
我编写/修改了一个简单的lisp例程,用于重新插入选定的块。
它工作正常,但在尝试重新插入具有修改的可见性状态的动态块时遇到了问题。
我的问题是:
无论其可见性状态如何,是否可以按名称获取选定块?
 
以下是惯例:
  1. (defun c:BLOCK-REINSERT ( / oldosmode blkname found pt1 )
  2. (setq oldosmode (getvar "osmode"))
  3. (if (and (setq blkname (cdr (assoc 2 (entget (car (entsel))))))
  4.           (setq found (ssget "x" (list (cons 2 blkname))))      
  5.           (while
  6.           (setvar "osmode" oldosmode)
  7.           (setq pt1 (getpoint "\nSpecify placement point: "))
  8.           (setvar "osmode" 0)
  9.             (command "_.INSERT" blkname pt1 "1" "1" "0" "" "" ))
  10.        )
  11.           (cond ((not found)
  12.           (princ "\n Block not found in drawing !!!")))
  13. )
  14. (setvar "osmode" oldosmode)
  15. (princ)
  16. )
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 18:31:06 | 显示全部楼层
请参阅此函数。
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 18:41:42 | 显示全部楼层
谢谢你的提示,李!
我想我仍然不能很好地修改lisp例程。有什么帮助或提示吗?
  1. (vl-load-com)
  2. (defun c:test ( / oldosmode blkname pt1 )
  3.   (setq oldosmode (getvar "osmode"))
  4.   (setq blkname
  5.       (vlax-get-property obj
  6.           (if (vlax-property-available-p obj 'effectivename)
  7.               'effectivename
  8.               'name
  9.           )
  10.       )
  11.   )
  12.           (while
  13.           (setvar "osmode" oldosmode)
  14.           (setq pt1 (getpoint "\nSpecify placement point: "))
  15.           (setvar "osmode" 0)
  16.           (command "_.INSERT" blkname pt1 "1" "1" "0" "" "" ))
  17.           )
  18.           (cond ((not found)
  19.           (princ "\n Block not found in drawing !!!")
  20.           )
  21. )
  22. (setvar "osmode" oldosmode)
  23. (princ)
  24. )
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 18:46:37 | 显示全部楼层
无需从我的函数中提取代码,只需从程序中调用函数,例如:
  1. (defun c:block-reinsert ( / att blk sel )
  2.    (if (setq sel (ssget "_+.:E:S" '((0 . "INSERT"))))
  3.        (progn
  4.            (setq blk (LM:al-effectivename (ssname sel 0))
  5.                  att (getvar 'attreq)
  6.            )
  7.            (setvar 'attreq 0)
  8.            (while (vl-cmdf "_.-insert" blk "_S" 1.0 "_R" 0.0 "\"))
  9.            (setvar 'attreq att)
  10.        )
  11.    )
  12.    (princ)
  13. )
  14. ;; Effective Block Name  -  Lee Mac
  15. ;; ent - [ent] Block Reference entity
  16. (defun LM:al-effectivename ( ent / blk rep )
  17.    (if (wcmatch (setq blk (cdr (assoc 2 (entget ent)))) "`**")
  18.        (if
  19.            (and
  20.                (setq rep
  21.                    (cdadr
  22.                        (assoc -3
  23.                            (entget
  24.                                (cdr
  25.                                    (assoc 330
  26.                                        (entget
  27.                                            (tblobjname "block" blk)
  28.                                        )
  29.                                    )
  30.                                )
  31.                               '("AcDbBlockRepBTag")
  32.                            )
  33.                        )
  34.                    )
  35.                )
  36.                (setq rep (handent (cdr (assoc 1005 rep))))
  37.            )
  38.            (setq blk (cdr (assoc 2 (entget rep))))
  39.        )
  40.    )
  41.    blk
  42. )

 
注意,您也可以使用ADDSELECTED命令。
回复

使用道具 举报

12

主题

152

帖子

140

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
60
发表于 2022-7-5 18:55:22 | 显示全部楼层
或者只是复制块。
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 18:57:23 | 显示全部楼层
谢谢李,现在我(也许还有其他人)将知道如何使用you'r网站上那些有用的功能!
iconeo:对不起,我是专门找重新插入的。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

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

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 19:15:31 | 显示全部楼层
我刚刚测试过,它很有魅力。
唯一的问题是退出while循环-我必须按住ESC键才能断开循环。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 19:20:22 | 显示全部楼层
 
是的,这就是在-INSERT命令中使用暂停等待用户输入的缺点-无法控制接收到的输入。
 
另一种方法是事先获得点,但牺牲了插入预览:
  1. (defun c:block-reinsert ( / att blk ins sel )
  2.    (if (setq sel (ssget "_+.:E:S" '((0 . "INSERT"))))
  3.        (progn
  4.            (setq blk (LM:al-effectivename (ssname sel 0))
  5.                  att (getvar 'attreq)
  6.            )
  7.            (setvar 'attreq 0)
  8.            (while (setq ins (getpoint "\nSpecify insertion point <exit>: "))
  9.                (command "_.-insert" blk "_S" 1.0 "_R" 0.0 "_non" ins)
  10.            )
  11.            (setvar 'attreq att)
  12.        )
  13.    )
  14.    (princ)
  15. )
  16. ;; Effective Block Name  -  Lee Mac
  17. ;; ent - [ent] Block Reference entity
  18. (defun LM:al-effectivename ( ent / blk rep )
  19.    (if (wcmatch (setq blk (cdr (assoc 2 (entget ent)))) "`**")
  20.        (if
  21.            (and
  22.                (setq rep
  23.                    (cdadr
  24.                        (assoc -3
  25.                            (entget
  26.                                (cdr
  27.                                    (assoc 330
  28.                                        (entget
  29.                                            (tblobjname "block" blk)
  30.                                        )
  31.                                    )
  32.                                )
  33.                               '("AcDbBlockRepBTag")
  34.                            )
  35.                        )
  36.                    )
  37.                )
  38.                (setq rep (handent (cdr (assoc 1005 rep))))
  39.            )
  40.            (setq blk (cdr (assoc 2 (entget rep))))
  41.        )
  42.    )
  43.    blk
  44. )

但是,请注意按ESC退出提示,因为如果没有错误处理程序,ATTREQ sys var将不会重置。
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 19:22:58 | 显示全部楼层
我尝试了两种程序,没有预览就有点糟糕(我并不总是需要它)。
通过调用“基点”选项,然后按ESC键,找到了一种更容易打破循环的方法。
谢谢你花时间,李!
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-12 19:42 , Processed in 0.949376 second(s), 72 queries .

© 2020-2025 乐筑天下

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