我已经用以下3段代码完成了我在之前和之后的图片中描述的内容。到目前为止,99.999%的代码归功于李。
- ;; Intersections in Set - Lee Mac
- ;; Returns a list of all points of intersection between all objects in a supplied selection set.
- ;; sel - [sel] Selection Set
- (defun LM:intersectionsinset2 (sel / id1 id2 ob1 ob2 rtn)
- (repeat (setq id1 (sslength sel))
- (setq ob1 (vlax-ename->vla-object (ssname sel (setq id1 (1- id1)))))
- (if (= (setq ob1type (vla-get-ObjectName ob1)) "AcDbLine")
- (princ)
- (progn
- (setq sslist (cons (ssname sel id1) sslist))
- (repeat (setq id2 id1)
- (setq ob2 (vlax-ename->vla-object
- (ssname sel (setq id2 (1- id2)))
- )
- )
- (if (= (setq ob2type (vla-get-ObjectName ob2)) "AcDbCircle")
- (princ)
- (LM:intersections ob1 ob2 acextendnone)
- ) ;end if
- ) ;end repeat
- ) ;progn
- ) ;end if
- ) ;end repeat
- ;(apply 'append (reverse rtn))
- )
- ;; Intersections - Lee Mac
- ;; Returns a list of all points of intersection between two objects
- ;; for the given intersection mode.
- ;; ob1,ob2 - [vla] VLA-Objects
- ;; mod - [int] acextendoption enum of intersectwith method
- (defun LM:intersections (ob1 ob2 mod / lst rtn int)
- (setq lst (vlax-invoke ob1 'intersectwith ob2 mod))
- (repeat (/ (length lst) 3)
- (setq rtn (cons (list (setq a (car lst))
- (setq b (cadr lst))
- (setq c (caddr lst))
- )
- rtn
- )
- int (vlax-3d-point lst)
- )
- (vla-ScaleEntity ob1 int newrad)
- )
- )
- ;; Test Program - Lee Mac
- ;;;(defun c:interset ( / sel )
- ;;; (if (setq sel (ssget))
- ;;; (foreach pnt (LM:intersectionsinset sel)
- ;;; (entmake (list '(0 . "POINT") (cons 10 pnt)))
- ;;; )
- ;;; )
- ;;; (princ)
- ;;
- ;;;(vl-load-com) (princ)
- (defun c:interset (/ sel)
- (setvar "cmdecho" 0)
- (setq cc1 (ssget "_X" '((0 . "CIRCLE"))))
- (command "-insert" "*clover chain.dwg" pause 1 "")
- (setq circle (ssname cc1 0))
- (setq rad (cdr (assoc 40 (entget circle))))
- (setq newrad (/ rad 0.5))
- (setq sel (ssget "X" '((0 . "CIRCLE,LINE") (8 . "daisy chain"))))
- (LM:intersectionsinset2 sel)
- (command "._erase" (ssget "X" '((0 . "LINE") (8 . "daisy chain"))) "")
- (setvar "cmdecho" 1)
- (princ)
- )
- (vl-load-com)
- (princ)
现在,进入下一步。我试图找到一种方法来移动所有物体,如前一幅后图所示,靠得更近,使每个圆的边缘相距1英寸,如果没有任何用户输入,则用户输入最少。我可以使用“偏移”和“拉伸”命令将所有碎片靠得更近,我想知道是否有不同的编码方式来实现这一点?下面是我在完成代码时想要的:
目前我的想法是一次在两个圆周围使用边界框,首先是底部的水平圆,然后是垂直的右圆,以此类推。使用边界框的角点作为交叉窗口的点,使用“拉伸”命令选择要移动的对象。如果有人有任何意见或想法,我很乐意看到他们。我将继续研究这个()并看看我能想出什么并发回。
起草人Joe |