本人水平有限,程序是在江南兄的代码上修改而来,借用了多位大师的代码,也记不住是谁了。弄得很啰嗦,现在自己看起来也很吃力。
-
- (defun xss2olst (ss / i e lst)
- (setq i -1)
- (while (setq e (ssname ss (setq i (1+ i))))
- (setq lst (cons (vlax-ename->vla-object e) lst))
- )
- )
- (defun xssobox (sso / ps xs ys lst)
- (setq ps (apply 'append
- (mapcar '(lambda (x)
- (vla-getboundingbox x 'll 'rr)
- (mapcar 'vlax-safearray->list (list ll rr))
- )
- sso
- )
- )
- xs (vl-sort (mapcar 'car ps) '<)
- ys (vl-sort (mapcar 'cadr ps) '<)
- lst (list (list (car xs) (car ys)) (list (last xs) (last ys)))
- )
- )
- (defun ZoomObject (objlst / dir ang 3x3 4x4 ptlst)
- (setq dir (trans '(0 0 1) 2 0 T)
- ang (- (getvar "viewtwist"))
- 3x3 (mxm (mapcar '(lambda (x) (trans x 0 dir))
- '((1 0 0) (0 1 0) (0 0 1))
- )
- (list (list (cos ang) (- (sin ang)) 0)
- (list (sin ang) (cos ang) 0)
- '(0 0 1)
- )
- )
- 4x4 (append (mapcar '(lambda (v o) (append v (list o))) 3x3 '(0 0 0))
- (list '(0 0 0 1))
- )
- )
- (foreach obj objlst
- (setq obj (vlax-ename->vla-object obj))
- (vla-TransformBy obj (vlax-tmatrix (trp 4x4)))
- (vla-getBoundingBox obj 'minpt 'maxpt)
- (vla-TransformBy obj (vlax-tmatrix 4x4))
- (setq ptlst (cons (vlax-safearray->list minpt)
- (cons (vlax-safearray->list maxpt) ptlst)
- )
- )
- )
- (vla-ZoomWindow
- (vlax-get-acad-object)
- (vlax-3d-point (mxv 3x3 (apply 'mapcar (cons 'min ptlst))))
- (vlax-3d-point (mxv 3x3 (apply 'mapcar (cons 'max ptlst))))
- )
- (vlax-invoke (vlax-get-acad-object) 'ZoomScaled 0.95 1)
- )
- (defun yad_ssadd (oldss ss / n)
- (setq n -1)
- (repeat (sslength ss)
- (ssadd (ssname ss (setq n (1+ n))) oldss)
- )
- oldss
- )
- (defun SSBoundingBox (ss / _GetBoundingBox _SStoObjects _Main)
- (defun _GetBoundingBox (object / p1 p2)
- (vl-catch-all-apply
- '(lambda ()
- (vlax-invoke-method object 'GetBoundingBox 'p1 'p2)
- )
- )
- (if p1
- ((lambda (data)
- (mapcar
- '(lambda (funcs)
- (mapcar '(lambda (func) (apply func data)) funcs)
- )
- '((caar cadar) (caadr cadar) (caadr cadadr) (caar cadadr))
- )
- )
- (list (mapcar 'vlax-safearray->list (list p1 p2)))
- )
- )
- )
- (defun _SStoObjects (ss / i objects)
- (if (eq 'pickset (type ss))
- (repeat (setq i (sslength ss))
- (setq objects
- (cons
- (vlax-ename->vla-object (ssname ss (setq i (1- i))))
- objects
- )
- )
- )
- )
- objects
- )
- (defun _Main (ss / boundingboxes)
- (cond
- ((setq boundingboxes
- (vl-remove-if
- 'null
- (mapcar '_GetBoundingBox (_SStoObjects ss))
- )
- )
- (mapcar
- '(lambda (func pair / lst)
- (list
- (apply (car pair)
- (mapcar 'car (setq lst (mapcar func boundingboxes)))
- )
- (apply (cadr pair) (mapcar 'cadr lst))
- )
- )
- '(car cadr caddr cadddr)
- '((min min) (max min) (max max) (min max))
- )
- )
- )
- )
- (_Main ss)
- )
- (defun get_touching (sscros lay / ss lst lstb lstc objl)
- (and
- (setq lstb (vl-remove-if 'listp (mapcar 'cadr (ssnamex sscros)))
- objl (mapcar 'vlax-ename->vla-object lstb)
- )
- (setq ss
- (ssget
- "_CP"
- (SSBoundingBox sscros)
- (list
- (cons 0
- "LINE,ARC,SPLINE,LWPOLYLINE,POLYLINE,CIRCLE,ELLIPSE"
- )
- (cons 8 lay)
- (cons 410 (getvar "ctab"))
- )
- )
- )
- (setq lst (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
- (setq lst (mapcar 'vlax-ename->vla-object lst))
- (mapcar
- '(lambda (x)
- (mapcar
- '(lambda (y)
- (if (not (vl-catch-all-error-p
- (vl-catch-all-apply
- '(lambda ()
- (vlax-safearray->list
- (vlax-variant-value
- (vla-intersectwith y x acextendnone)
- )
- )
- )
- )
- )
- )
- (setq lstc (cons (vlax-vla-object->ename x) lstc))
- )
- )
- objl
- )
- )
- lst
- )
- )
- lstc
- )
- (defun mx_getPtss (p0 hdist filter_list / e0)
- (if filter_list
- (if (and hdist (/= hdist 0))
- (progn (setq hdist (abs (/ hdist (sin (* 0.25 pi)))))
- (setq e0 (ssget "_C"
- (polar p0 (* 1.25 pi) hdist)
- (polar p0 (* 0.25 pi) hdist)
- (if (= (type filter_list) 'LIST)
- filter_list
- (list (cons 8 filter_list))
- )
- )
- )
- )
- (setq e0 (ssget p0
- (if (= (type filter_list) 'LIST)
- filter_list
- (list (cons 8 filter_list))
- )
- )
- )
- )
- (if (and hdist (/= hdist 0))
- (progn (setq hdist (abs (/ hdist (sin (* 0.25 pi)))))
- (setq e0 (ssget "_C"
- (polar p0 (* 1.25 pi) hdist)
- (polar p0 (* 0.25 pi) hdist)
- )
- )
- )
- (setq e0 (ssget p0))
- )
- )
- (if e0
- e0
- )
- )
- (defun sslist (f_sel)
- (if f_sel
- (progn
- (if (/= (type f_sel) 'PICKSET)
- (exit)
- )
- (setq f_ss_list nil
- f_loop -1
- )
- (repeat (sslength f_sel)
- (progn (setq f_loop (1+ f_loop))
- (setq
- f_ss_list (append f_ss_list (list (ssname f_sel f_loop)))
- )
- )
- )
- )
- nil
- )
- )
- ;; Returns a list with duplicate elements removed.
- (defun LM:Unique (l)
- (if l
- (cons (car l) (LM:Unique (vl-remove (car l) (cdr l))))
- )
- )
- (defun c:fss (/ fil sso p1 p2 ssx ss ss1 ssn a1 a2 b1 b2 fz lay box box1
- en etype lst)
- (defun addnext (en pt / next)
- (if (setq next (gotonexten en pt fz))
- (foreach a next
- (if (not (ssmemb (car a) ss))
- (progn (ssadd (car a) ss)
- (ZoomObject (sslist ss))
- (apply 'addnext a)
- )
- )
- )
- )
- )
- (setq
- fil '((0 . "LINE,POLYLINE,LWPOLYLINE,SPLINE,CIRCLE,ARC,ELLIPSE"))
- )
- (princ "\n粘连选集源:")
- (if (setq etype (ssget ":s" fil))
- (progn (setq sso (xss2olst etype))
- (setq en (vlax-vla-object->ename (car sso)))
- (ZoomObject (list en))
- (setq lay (dxf1 8 en))
- (or (setq fz (getdist "\n 阈值(负值不支持相交)/<10.0>:"))
- (setq fz 10.)
- )
- )
- )
- (if lay
- (setq fil (reverse (cons (cons 8 lay) fil)))
- )
- (setq box (* (/ (getvar "pickbox") (cadr (getvar "screensize")))
- ;;; (getvar "viewsize")
- 5000.
- )
- )
- (if en
- (progn
- (setq ss (ssadd))
- (ssadd en ss)
- (if (and (null (addnext en (vlax-curve-getstartpoint en)))
- (null (addnext en (vlax-curve-getendpoint en)))
- )
- (progn (setq ss_1 (mx_getPtss (vlax-curve-getstartpoint en) box lay)
- ss_2 (mx_getPtss (vlax-curve-getendpoint en) box lay)
- )
- (if ss_1
- (setq ss (yad_ssadd ss ss_1))
- )
- (if ss_2
- (setq ss (yad_ssadd ss ss_2))
- )
- (if (setq ss1 (LM:Unique (get_touching ss lay)))
- (foreach x ss1 (ssadd x ss))
- )
- (ZoomObject ss1)
- )
- )
- (setq ssn (ssadd))
- (foreach a (sslist ss)
- (setq sso (list (vlax-ename->vla-object a)))
- (while
- (apply
- 'or
- (mapcar
- '(lambda (x)
- (setq i -1
- kk nil
- k T
- )
- (while (and k (setq y (nth (setq i (1+ i)) sso)))
- (cond
- ((member x sso) (setq k nil))
- ((eq x y) nil)
- ((or (if (<= 0. fz)
- (vlax-invoke x 'intersectwith y acExtendNone)
- nil
- )
- (progn ;; v1.1 for 相切.端点相邻(支持阈值 fz)
- (setq a1 (vlax-curve-getstartpoint x)
- a2 (vlax-curve-getendpoint x)
- b1 (vlax-curve-getstartpoint y)
- b2 (vlax-curve-getendpoint y)
- )
- (or (equal a1 b1 fz)
- (equal a1 b2 fz)
- (equal a2 b1 fz)
- (equal a2 b2 fz)
- )
- )
- )
- (setq sso (cons x sso)
- kk T
- k nil
- )
- )
- (T nil)
- )
- )
- kk
- )
- (setq
- lst (xss2olst
- (ssget "c"
- (mapcar '-
- (car (setq box1 (xssobox sso)))
- (list box box)
- )
- (mapcar '+ (cadr box1) (list box box))
- fil
- )
- )
- )
- )
- )
- ;;; 对于大量实体,用zoom命令比用zoomobject要快,但会有遗漏的情况
- ;;; (command "._Zoom" "W" (car box1) (cadr box1) "._Zoom" "0.95x")
- (ZoomObject (mapcar 'vlax-vla-object->ename sso))
- )
- (foreach x (LM:Unique (mapcar 'vlax-vla-object->ename sso))
- (ssadd x ssn)
- )
- )
- (yad_ssadd ssn ss)
- (ZoomObject (sslist ssn))
- (sssetfirst nil ssn)
- )
- )
- (princ)
- )
|