pmxcad 发表于 2022-7-5 17:33:34

选择块内部或交叉点

你好
我在网上找到了一个lisp,很喜欢这个lisp,但我可以有第三个选项“both”,在里面和交叉。
 
(defun c:SWCC (/ _pac add ss i e temp it o a b pts tempC i3 ec)
;; Select Within/Crossing Curve
;; Alan J. Thompson, 03.31.11 / 05.11.11

(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 (trans (vlax-curve-getPointAtDist e d) 0 1) lst))
   )
)

(initget 0 "Crossing Within")
(setq *SWCC:Opt*
      (cond ((getkword (strcat "\nSpecify selection method witin curve <"
                                 (cond (*SWCC:Opt*)
                                       ((setq *SWCC:Opt* "Crossing"))
                                 )
                                 ">: "
                         )
               )
            )
            (*SWCC:Opt*)
      )
)

(princ "\nSelect closed curves to select object(s) within: ")
(if (setq add (ssadd)
         ss(ssget '((-4 . "<OR")
                        (0 . "CIRCLE,ELLIPSE")
                        (-4 . "<AND")
                        (0 . "*POLYLINE")
                        (-4 . "&=")
                        (70 . 1)
                        (-4 . "AND>")
                        (-4 . "OR>")
                     )
               )
   )
   (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 *SWCC: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)
                         )
                     )
                     )
            )
            )
          )
          (sssetfirst nil add)
          (ssget "_I")
   )
)
(princ)
)

 
谢谢
 
PmxCAD

pkenewell 发表于 2022-7-5 19:14:23

 
 
我不太确定你在问什么?当你说“两者”(这正是“交叉选择”(Crossing Selection)应该包括的内容)时,里面的对象和穿过边界的对象。
页: [1]
查看完整版本: 选择块内部或交叉点