KRBeckman 发表于 2022-7-6 10:06:10

块编辑Lisp

我工作的95%的图形只包含3个块:“(零件号)-2D”,“(零件号)-3D”,&“Reference”,我正试图想出一种快速方法来使用“编辑块到位”功能,当你右键单击一个选定的块时,对这些块中的每一个块都可用。以下是我目前掌握的信息:
 
(defun c:be ()
(setvar 'cmdecho 0)
(vl-load-com)
(initget "-2d -3d Reference")
(setq opt (nentselp "\nSelect block entity or [-2d/-3d/Ref]: "))
(if (eq (type opt) 'STR)
   (progn
   (setq ss (ssget "_x" (list (cons 0 "INSERT"))))
   (setq i 0)
   (while (or (not ent) (< i (sslength ss)))
(if (vl-string-search (strcase opt) (strcase (cdr (assoc 2 (entget (ssname ss i))))))
(setq ent (ssname ss i)))
(setq i (+ i 1))))
   (setq ent opt))
(vl-cmdf "_.-refedit" ent "_o" "" "")
(setvar 'cmdecho 1)
(princ))
 
这几乎可以工作,唯一的问题是我认为“-refedit”命令需要一个与选择相关的点以及实体名称(可能是nentselp?),但我不知道如何将其结合起来。
 
任何帮助都将不胜感激。

irneb 发表于 2022-7-6 10:11:51

为什么不使用BEdit命令呢?
 
如果必须使用RefEdit,那么您是正确的,它需要一个((点1)((X1 Y1 Z1)(X2 Y2 Z2)(X3 Y3 Z3)(点2))列表作为您从nentsel获得的结果。我想您可以创建这样的点,但如何从块中生成有意义的点,更不用说如何根据块的插入将块定义中实体上的点转换为WCS,然后计算转换矩阵?

pBe 发表于 2022-7-6 10:15:11

这几乎也奏效了。。
 

(defun c:test(/ opt)
(setvar 'cmdecho 0)
(vl-load-com)
(initget "DD EE FF Select")
(setq opt (getkword "\nSelect block entity or : "))
(cond
((or (= "DD" opt)
   (= "EE" opt)
   (= "EE" opt))
             (sssetfirst nil (ssget "_x" (list '(0. "INSERT") (cons 2 opt))))
(vl-cmdf "_.-refedit")
   (while (> (getvar "CMDACTIVE") 0)
    (command "_o" "" "")
)
)

((= "Select" opt)
(sssetfirst nil (ssget ":S" '((0 . "INSERT"))))
(vl-cmdf "_.-refedit")
   (while (> (getvar "CMDACTIVE") 0)
    (command "_o" "" "")
)
)
)
(setvar 'cmdecho 1)
(princ)
)
 
只有当只有一个块实例时,选择选项才能用于任何其他块。
为了爱我,我不记得在代码仍处于活动状态时将其搁置。。我知道我在什么地方读过ir。(可能在这个论坛上)
 

((or (= "DD" opt)
   (= "EE" opt)
   (= "EE" opt))
      (setq ss (ssget "_x" (list '(0. "INSERT") (cons 2 opt))))
(setq i -1)
       (while
    (sssetfirst nil (ssget "_x" (list (assoc 10 (entget (ssname ss (setq i (1+ i)))))
    (cons 2 opt))))
(vl-cmdf "_.-refedit")
   (while (> (getvar "CMDACTIVE") 0)
    (command "_o" "" "")
)
)
)


失败!!!
第一次计数后失败。。有人能猜出这个吗?

irneb 发表于 2022-7-6 10:17:42

也许是这样(command "_.refedit" "_o")
(while (> (getvar "cmdactive") 0) (command ""))

irneb 发表于 2022-7-6 10:22:47

你知道吗?这实际上给了我一个想法。。。我不知道为什么它不想通过lisp工作。但如果只是一个CUI宏,它似乎可以正常工作:
在自定义项中创建一个项。崔的双击动作组称为块。使用上述宏创建一个名为“Block-双击-RefEdit”的命令,然后将其拖动到已创建的块项上。自定义“应”覆盖ACAD。崔,如果没有,则只需从ACAD中删除块项。CUI(不太理想,但由于没有删除ACAD.CUI中的“块双击”命令,因此将其添加回并不困难)。

irneb 发表于 2022-7-6 10:26:11

或者你是指暂停动作(command "_.refedit" pause "_o" "" "")

irneb 发表于 2022-7-6 10:26:30

忘记了,您必须在双击动作组中添加BLOCKREF作为块项的对象名称。

pBe 发表于 2022-7-6 10:30:13

 
嗯。不过我确实用过了
我想要的是搁置Lisp代码。也许是反应堆的问题。。。。hmmmmnnnn(Pound Pound)

irneb 发表于 2022-7-6 10:34:08

对好这是一件需要处理的“大”事情。关闭参照编辑后,是否要执行某些操作?这可以通过以下两种方式之一实现:
 
[列表=1]
[*]重新定义RefClose命令。确保有相同的提示。执行你想做的任何事情,然后调用。从内部参照关闭。
[*]完成反应堆查看命令-测试refclose。
[/列表]
无论如何,你试过宏版本吗?它对我很有效。而且它的代码要少得多。

pBe 发表于 2022-7-6 10:39:18

 
我想你是对的。。再加上使用反应器会消耗大量内存
此外,这不是我的帖子无论如何,但它将是整洁的,以帮助OP了。
在while循环中。我能感觉到我几乎得到了它,但我不能完全把我的手指放在它上面。。。
页: [1] 2
查看完整版本: 块编辑Lisp