本帖最后由 作者 于 2005-10-13 21:42:17 编辑
我想编一个局部放大的程序,跟这个也是有关系的,思路应该是一样的。
这是一个剪内圆的程式,请大家指教!
(defun c:t1 (/ loop en ss i sn snType) (princ "\nPlease select a Circle:") (vl-load-com) (setq *AcadDocument* (vla-Get-ActiveDocument (vlax-get-acad-object))) (setq loop t) (while (not (setq en (ssget ":s" '((0 . "circle"))))) (princ "\nPlease select a circle")) (setq en (ssname en 0)) (vla-StartUndoMark *AcadDocument*) (vla-GetBoundingBox (vlax-ename->vla-object en) 'MinPt 'MaxPt) (setq ss (ssget "_c" (vlax-safearray->list MaxPt) (vlax-safearray->list MinPt))) (setq i 0) (repeat (sslength ss) (setq sn (ssname ss i)) (setq snType (vla-Get-ObjectName (vlax-ename->vla-object sn))) (if (not (member snType '("AcDbBlock" "AcDbText" "AcDbMText" "AcDbDimension" "AcDbXline" "AcDbRay"))) (trim sn en) ) (setq i (1+ i)) ) (vla-EndUndoMark *AcadDocument*) (prin1) ) (defun trim (sn en / vs vn pts Err lstParam pts lstPt) (setq vs (vlax-ename->vla-object sn) vn (vlax-ename->vla-object en) ) (setq pts (vla-intersectwith vn vs acExtendNone)) (setq Err (vl-catch-all-apply 'vlax-safearray->list (list (vlax-variant-value pts)))) (if (not (vl-catch-all-error-p Err)) ;安璝Τ岿⊿Τユ翴玥ぃ暗安璝Τユ翴玥trim奔; (progn ;;; (alert "InterSectWith") (setq lstParam '() lstParam (append lstParam (list (vlax-curve-getStartParam vs))) lstParam (append lstParam (list (vlax-curve-getEndParam vs))) ) (setq pts (vlax-safearray->list (vlax-variant-value pts)) lstParam (GetParams pts lstParam vs) lstParam (vl-sort lstParam '<) ) (setq lstPt (GetPtFromParam lstParam vs)) (foreach pt lstPt (if (< (distance pt (vlax-safearray->list (vlax-variant-value (vla-get-center vn)))) (vla-Get-Radius vn) ) (command ".trim" en "" pt "") ) ) ) ) ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun GetParams (pts lstParam vs / num i pt) (setq num (/ (length pts) 3) i 0 ) (repeat num (setq pt (list (nth (+ i 0) pts) (nth (+ i 1) pts) (nth (+ i 2) pts)) lstParam (append lstParam (list (vlax-curve-getParamAtPoint vs pt))) i (+ i 3) ) ) lstParam ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun GetPtFromParam (lstParam vs / lst i num p1 p2 pm) (setq lst '() i 0 num (1- (length lstParam)) ) (repeat num (setq p1 (nth i lstParam) p2 (nth (1+ i) lstParam) pm (/ (+ p1 p2) 2) pt (vlax-curve-GetPointAtParam vs pm) lst (append lst (list pt)) i (1+ i) ) ) lst )
|