danglar 发表于 2022-7-5 16:38:51

通过lisp选择上一个组

大家好。
 
这个lisp(附加的一个)可以绘制样条线,选择其中/交叉的对象,并删除用于选择的样条线。
 
在这种情况下,我需要在样条线内重新选择以前选择的实体,然后从这些对象创建组。。
 
但现在我需要选择上一组。。如果我在命令行中使用GROUP命令,这是可能的,但通过lisp执行这项操作对我来说是有问题的
 
你知道怎么做吗?
 
我感谢你的快速反应和你花时间帮助我。谢谢
套索选择测试。lsp

Jef! 发表于 2022-7-5 17:12:21

你好。
 
有时,通过直接发布代码(当然是在代码标签之间,以避免众神和终结者的愤怒…)可以获得更多视图而不是附加它,强制用户登录以实际查看它。
 
因此,如果我理解正确的话,您试图实现的唯一一件事就是删除样条曲线,并最终得到最初由lisp进行的选择。由于在lisp中已经有一个包含样条曲线的var(e),只需添加我添加的绿色线,在选择并返回之前删除样条曲线,就可以轻松实现。那里不需要额外里程!
还有一点需要注意的是:一个lisp例程一旦执行,就会更改设置,而在最后又不恢复设置,这可能会让人恼火。最佳实践:查看并将其原始值存储在变量中,根据需要更改var,然后使用创建的变量中的原始值将其更改回来。(见添加的红色代码)。
 
;;; Make Lasso Selection (draw spline and Select Objects Within/Crossing it)
;;; Special thanks to Alan J. Thompson


(defun c:SWC (/ _pac add ss i e temp it o a b pts tempC i3 ec)
;; Select Objects Within/Crossing Curve
;; Alan J. Thompson, 03.31.11
;; Slightly modified by Igal Averbuh 2017 (added option for splines)
;; Slightly modified by Jef! 2017 (erased spline + osmode restoration)
(vl-load-com)

(defun _pac (e / l v d lst)
   (setq d (- (setq v (/ (setq l (vlax-curve-getDistAtParam e (vlax-curve-getEndParam e))) 100.))))
   (while (< (setq d (+ d v)) l)
   (setq lst (cons (vlax-curve-getPointAtDist e d) lst))
   )
)

(initget 0 "Crossing Within")
(setq *SWC:Opt*
      (cond ((getkword (strcat "\nSpecify selection method witin curve <"
                                 (cond (*SWC:Opt*)
                                       ((setq *SWC:Opt* "Crossing"))
                                 )
                                 ">: "
                         )
               )
            )
            (*SWC:Opt*)
      )
)
(princ "\nSelect closed curves to select object(s) within: ")
(if (setq add (ssadd)
         ss(ssget "L"
               )
   )
   (progn (repeat (setq i (sslength ss))
            (if (setq temp (ssget "_WP" (_pac (setq e (ssname ss (setq i (1- i)))))))
            (repeat (setq i2 (sslength temp)) (ssadd (ssname temp (setq i2 (1- i2))) add))
            )

            (if (eq *SWC:Opt* "Crossing")
            (progn (vla-getboundingbox (setq o (vlax-ename->vla-object e)) 'a 'b)
                     (setq pts (mapcar 'vlax-safearray->list (list a b)))
                     (if (setq tempC (ssget "_C"
                                          (list (caar pts) (cadar pts) 0.)
                                          (list (caadr pts) (cadadr pts) 0.)
                                     )
                         )
                     (repeat (setq i3 (sslength tempC))
                         (if (vlax-invoke
                               o
                               'Intersectwith
                               (vlax-ename->vla-object (setq ec (ssname tempC (setq i3 (1- i3)))))
                               acExtendNone
                           )
                           (ssadd ec add)
                         )
                     )
                     )
            )
            )
          )
          (vla-delete (vlax-ename->vla-object e))
          (sssetfirst nil add)
          (ssget "_I")
   )
)
(princ)
)

(defun C:LAT ( / oldosmode )
(setq oldosmode (getvar 'osmode))
(setvar "osmode" 16384)
(command "_.spline")
(while (> (getvar "CmdActive") 0)
   (command pause)
)
(c:swc)
(if oldosmode
   (setvar 'osmode oldosmode)
)
(princ)
)
 
干杯

danglar 发表于 2022-7-5 17:37:46

谢谢你,杰夫!你的笔记和方法

Jef! 发表于 2022-7-5 17:47:08

不客气!
页: [1]
查看完整版本: 通过lisp选择上一个组