19
93
7
初露锋芒
;;修正了一个错误。 ;;这个更快,可以连接线条。 ;;消除合并重复线条 (defun c:ovl (/ old_osmode old_cmdecho ss ssLine ssArc) (vl-load-com) (setq *AcadDocument* (vla-get-activeDocument (vlax-Get-Acad-Object))) (vla-StartUndoMark *AcadDocument*) (setq old_osmode (getvar "osmode") old_cmdecho (getvar "cmdecho") ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (setq ss (GetSelToUnite) ssLine (car ss) ssArc (cadr ss) ) (setvar "osmode" 0) (command ".ucs" "w") (if (> (sslength ssLine) 1) (UniteLine ssLine) ) (if (> (sslength ssArc) 1) (UniteArc ssArc) ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (if (> (sslength ssLine) 0) (pEdit ssLine) ) (if (> (sslength ssArc) 0) (pEdit ssArc) ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (setvar "osmode" old_osmode) (setvar "cmdecho" old_cmdecho) (vla-EndUndoMark *AcadDocument*) (prin1) ) (defun pedit (ss / i en vn startPt endPt ss1 ss2) (setq i 0) (repeat (sslength ss) (setq en (ssname ss i) i (1+ i) ) (if (and (not (null (entget en))) (not (vlax-curve-isClosed (setq vn (vlax-ename->vla-object en))))) (progn (setq startPt (vlax-curve-GetStartPoint vn) endPt (vlax-curve-GetEndPoint vn) ) (setq ss1 (ssget "_c" (polar startPt (* pi 0.25) 0.01) (polar startPt (* pi 1.25) 0.01))) (setq ss2 (ssget "_c" (polar endPt (* pi 0.25) 0.01) (polar endPt (* pi 1.25) 0.01))) (if (equal (strcase (vla-Get-ObjectName vn)) (strcase "AcDbPolyline")) (vl-cmdf "pedit" en "j" ss1 ss2 "") (vl-cmdf "pedit" en "y" "j" ss1 ss2 "" "") ) ) ) ) ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun GetSelToUnite (/ ss1 ssArc ssLine ss1 ss i en ss2) (setq ss1 (ssget "x") ssArc (ssadd) ssLine (ssadd) ss (ssget '((0 . "line,lwpolyline,arc"))) i -1 ) (setvar "cmdecho" 0) (repeat (sslength ss) (setq en (ssname ss (setq i (1+ i)))) (if (equal (strcase (cdr (assoc 0 (entget en)))) (strcase "lwpolyline")) (command "explode" en) ) ) (setq ss2 (ssget "x") i -1 ) (repeat (sslength ss2) (setq en (ssname ss2 (setq i (1+ i)))) (if (or (not (ssmemb en ss1)) (ssmemb en ss)) (cond ((equal (cdr (assoc 0 (entget en))) (strcase "line")) (ssadd en ssLine)) ((equal (cdr (assoc 0 (entget en))) (strcase "arc")) (ssadd en ssArc)) (t (princ "\n There is a error occured")) ) ) ) (list ssLine ssArc) ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun UniteArc (ss / i en) (vla-StartUndoMark *AcadDocument*) ;;; (while (not (setq ss (ssget '((0 . "arc")))))) (setq i 0) (repeat (sslength ss) (setq en (ssname ss i) i (1+ i) ) (if (not (null (entget en))) (JoinArc en) ) ) (vla-EndUndoMark *AcadDocument*) ) ;;;;;;;;; (defun JoinArc (en / vn cenPt Radius AngLst i ss MinPt MaxPt StartAngle EndAngle em vm) (setq vn (vlax-ename->vla-object en) cenPt (cdr (assoc 10 (entget en))) Radius (vla-get-radius vn) AngLst '() i -1 ss (ssadd) ) (vla-GetBoundingBox vn 'MinPt 'MaxPt) (setq MinPt (vlax-safearray->list MinPt) MaxPt (vlax-safearray->list MaxPt) ) (setq ss (ssget "c" MinPt MaxPt (list '(0 . "arc") (append (list 10) cenPt) (cons 40 Radius)))