halam 发表于 2022-7-5 17:35:37

“x”上的反向选择集

大家好,
是我,又回来了。。
 
 
有人能解释一下这个选择是怎么起作用的吗?
李有一些很好的解释,但这一个它找不到
 
(setq ss1(ssget“x”'((60.1)));查找任何不可见的对象
 
 
其想法是制作一个函数来扭转显示的不可见/可见对象。。。
 
我非常感谢你
 
http://www.lee-mac.com/selsetprocessing.html

Grrr 发表于 2022-7-5 17:40:04

嗨,就我个人而言,我会这样做:
(if
(and
        (setq SS-invis (ssget "_X" (list (cons 60 1))))
        (setq SS-vis (ssget "_X" (list (cons 60 0))))
)
(initget 1 "visible invisible")
(progn
        (setq ans (getkword "\nWhich selection to grip ?"))
        (cond
                ((= ans "visible")
                        (sssetfirst nil SS-vis)
                )
                ((= ans "invisible")
                        (sssetfirst nil SS-invis)
                )
        )       
)
)

halam 发表于 2022-7-5 17:44:03

谢谢你,Grrr先生。
这似乎是一个非常符合逻辑的句子。
尝试直接插入,但正如预期的那样,它无法立即插入
如何将ss INVI/ss vis设置为代码中的ss1选择集?
 
这个想法是你有两个状态。
不可见的选择集和可见的选择集。
如果我有一个例程,它会反转这些状态
我可以用它做一些漂亮的3D建模…;-)
 
 
(很抱歉我的lisp技能不是很好,我非常感谢任何帮助我获得一些好代码的人。)
 
 
我似乎有代码作为一部分,但我不能组装这些非常好。
因为我是一个“普鲁士”…;-)
 
 

..
..
(your advice for the if)
..
..
(if ss1
   (progn
   (setq counter 0)
   (while (<= counter (- (sslength ss1) 1))
       (setq en (ssname ss1 counter))
       (setq look_for en)
       (setq LOOK_FOR_DXF (entget LOOK_FOR))
       (setq LOOK_FOR_LAYER (cdr (assoc 8 LOOK_FOR_DXF)))
       (setq LAYER_LOCK_STATUS
            (CDR
                (ASSOC 70
                     (tblsearch "LAYER" LOOK_FOR_LAYER)
                )
            )
       )
       (If (= LAYER_LOCK_STATUS 4)
         (progn
         (command "layer" "unlock" LOOK_FOR_LAYER "")
         ) ; End progn
       )
       (setq LOOK_FOR_DXF
            (subst (cons 60 0)
                     (assoc 60 LOOK_FOR_DXF)
                     LOOK_FOR_DXF
            )
       )
       (entmod LOOK_FOR_DXF)
       (If (= LAYER_LOCK_STATUS 4)
         (progn
         (command "layer" "lock" LOOK_FOR_LAYER "")
         ) ; End progn
       )
       (setq counter (+ counter 1))
   ) ; End of while
   ) ; End progn
) ; End if   
(command "redrawall")
(command "undo" "end")
(princ)
(princ)
) ; End defun,


; ..this code makes it visible..

(PRINC)



顺便说一句,我没有锁定选定对象的层。

Grrr 发表于 2022-7-5 17:46:55

呜呜。。。这太酷了!!!多棒的作品啊!。将在3D建模期间受益。非常感谢你的努力。
反函数肯定有效!!就像第二个可用的模型空间
如果您喜欢Revit,请使用Revit中的灯泡功能。
 
 
 
 
https://knowledge.autodesk.com/support/revit-lt/learn-explore/caas/CloudHelp/cloudhelp/2015/ENU/RevitLT-DocumentPresent/files/GUID-B61C4920-0F8D-4243-9AD5-C75EC5BF0C53-htm.html

halam 发表于 2022-7-5 17:49:14

您可以使用以下两个函数来缩短上述代码和函数:
 



(setq ss1 (ssget)) ; Select objects
(if ss1 ; If user has selected object(s) then
   (progn ; start this progn
   (setq counter 0) ; set-up a counter starting at 0
   (while (<= counter (- (sslength ss1) 1))
; While the counter is less than the total number of blocks in the SS1 selection set plus 1
       (setq en (ssname ss1 counter))
; find the entity name of the entity at counter number ?
       (setq look_FOR en) ; Set Look_FOR to the same as en
       (setq LOOK_FOR_DXF (entget LOOK_FOR))
; Get the DXF list from the LOOK_For
       (setq LOOK_FOR_LAYER (cdr (assoc 8 LOOK_FOR_DXF)))
; Get the Layer information out of the DXF list of the entity
       (setq LAYER_LOCK_STATUS
; Find the layer status for the entities layer
            (CDR
                (ASSOC 70
                     (tblsearch "LAYER" LOOK_FOR_LAYER)
                )
            )
       )
       (If (= LAYER_LOCK_STATUS 4)
; If the entities layer is locked then
         (progn ; do the following Progn
         (command "layer" "unlock" LOOK_FOR_LAYER "")
; Unlock the entities Layer
         ) ; End progn
       )
       (setq LOOK_FOR_DXF
            (subst (cons 60 1)
                     (assoc 60 LOOK_FOR_DXF)
                     LOOK_FOR_DXF
            )
       )
       (setq tocon (cons 60 1))
       (setq ToModify (append LOOK_FOR_DXF (list tocon)))
       (entmod ToModify)
       (If (= LAYER_LOCK_STATUS 4)
         (progn
         (command "layer" "lock" LOOK_FOR_LAYER "")
; Lock the LOOK_FOR_LAYER
         ) ; End progn
       )
       (setq counter (+ counter 1))
; add one to the counter for next item to process
   ) ; End of while
   ) ; End progn
) ; End if
(command "undo" "end")
(princ)
) ; End of defun



要测试上述功能,请执行以下操作:
; test-isolate
; test-hide
; test-all-visible
; test-inverse

;isos
(defun C:test-isolate ( / SSL SSX )
(vl-load-com)
(setq acadobject (vlax-get-Acad-Object))
(setq acdoc (vla-get-activedocument acadobject))
(if
        (and
                (princ "\nSelect objects to isolate: ")
                (setq SSL (ssget "_:L"))
                (setq SSX (ssget "_X" ))
        );and
        (progn
                (PutEverythingInvisible SSX)
                (PutEverythingVisible SSL)
                (vla-Regen acdoc :vlax-true)
        );progn
)
(princ)
);defun       

; ozbs
(defun C:test-hide ( / SSL )
(vl-load-com)
(setq acadobject (vlax-get-Acad-Object))
(setq acdoc (vla-get-activedocument acadobject))
(if
        (and
                (princ "\nSelect objects to hide: ")
                (setq SSL (ssget "_:L"))
        );and
        (progn
                (PutEverythingInvisible SSL)
                (vla-Regen acdoc :vlax-true)
        );progn
)
(princ)
);defun       

;zb
(defun C:test-all-visible ( / SSL SSX )
(vl-load-com)
(setq acadobject (vlax-get-Acad-Object))
(setq acdoc (vla-get-activedocument acadobject))
(if
        (and
                (princ "\nSetting everything to visible! ")
                (setq SSX (ssget "_X" ))
        );and
        (progn
                (PutEverythingVisible SSX)
                (vla-Regen acdoc :vlax-true)
        );progn
)
(princ)
);defun       

(defun C:test-inverse ( / SSL SSX )
(vl-load-com)
(setq acadobject (vlax-get-Acad-Object))
(setq acdoc (vla-get-activedocument acadobject))
(if
        (and
                (princ "\nInversing the visibility! ")
                (setq SSX (ssget "_X" ))
        );and
        (progn
                (ReverseVisibility SSX)
                (vla-Regen acdoc :vlax-true)
        );progn
)
(princ)
);defun       


(defun PutEverythingInvisible ( SS / ent enx vla-obj )
(repeat (setq i (sslength SS))
        (setq ent (ssname SS (setq i (1- i))))
        (setq enx (entget ent))
        (setq vla-obj (vlax-ename->vla-object ent))
       
        (if
                (and (vlax-property-available-p vla-obj "Visible") (= (vlax-get-property vla-obj 'Visible) :vlax-true))
                (vla-put-Visible vla-obj :vlax-false)
        )
)
)

(defun PutEverythingVisible ( SS / ent enx vla-obj )
(repeat (setq i (sslength SS))
        (setq ent (ssname SS (setq i (1- i))))
        (setq enx (entget ent))
        (setq vla-obj (vlax-ename->vla-object ent))
       
        (if
                (and (vlax-property-available-p vla-obj "Visible") (= (vlax-get-property vla-obj 'Visible) :vlax-false))
                (vla-put-Visible vla-obj :vlax-true)
        )
)
)

(defun ReverseVisibility ( SS / ent enx vla-obj )
(repeat (setq i (sslength SS))
        (setq ent (ssname SS (setq i (1- i))))
        (setq enx (entget ent))
        (setq vla-obj (vlax-ename->vla-object ent))
       
        (cond
                ((and (vlax-property-available-p vla-obj "Visible") (= (vlax-get-property vla-obj 'Visible) :vlax-false))
                        (vla-put-Visible vla-obj :vlax-true)
                )
                ((and (vlax-property-available-p vla-obj "Visible") (= (vlax-get-property vla-obj 'Visible) :vlax-true))
                        (vla-put-Visible vla-obj :vlax-false)
                )
        )
)
)
 
以及反转对象的可见性:

(defun PutEverythingInvisible ( ss vs / i k)
(setq k (if vs 1 0))
(repeat (setq i (sslength ss))
   (entmod (append (entget (ssname ss (setq i (1- i)))) (list (cons 60 k))))
   )
)

Grrr 发表于 2022-7-5 17:52:03

谢谢你的建议Tharwat!
不幸的是,我不像你那样是列表处理大师,更像是你和李的学生
我看到您的示例回到了纯lisp,作为OP的原始代码,但我觉得使用VLA更舒服。

halam 发表于 2022-7-5 17:57:02

这里有一个简短的演示如何使用它。
感觉就像是第二个模型空间。
我使用了一些荷兰语命令快捷方式:
 
 
-rew:回放/反转显示=>测试反转
-ozbs:这个模型视图是无形的。。它的优点是,在反转它=>测试隐藏后,它将变得可见
-isos:隔离对象选择=>测试隔离
 
 
很高兴为AutoCAD comm发布此消息。

Tharwat 发表于 2022-7-5 17:58:30

谢谢你,Grrr。
 
就我个人而言,除非我被迫使用VLisp函数,否则我不会使用VLisp函数,否则纯lisp速度更快,可以与旧版本的AutoCAD一起使用,而VLisp则不能。

Grrr 发表于 2022-7-5 18:03:23

你很好,哈勒姆!
在我做的每一个代码的技巧背后都有塔瓦和李·麦克,所以也许可以加上他们的名字。很高兴这有帮助。

halam 发表于 2022-7-5 18:05:51

好啊我是跟随者;-)将监视您提供的代码,查看它对某些对象定义的行为是否奇怪,以及速度性能。
我真的不在乎是vla还是lisp。如果我以后想更多地使用Bricscad,也许可以把它转换成lisp。
页: [1] 2
查看完整版本: “x”上的反向选择集