你好我想我已经使用了直观的变量名,所以我没有对代码进行注释,但是如果你不理解什么,只要问一下。。。我和其他人可能会给你正确的解释。。。
(defun c:softselvertmod ( / *error* barycent *adoc* ucsf osm 3dosm ss e ch pl p vl c r v v1 vln eg ex xx p1 p2 rf gr ux uy uc ) (vl-load-com) (defun *error* ( m ) (if ucsf (command "_.UCS" "_P") ) (if osm (setvar 'osmode osm) ) (if 3dosm (setvar '3dosmode 3dosm) ) (vla-endundomark *adoc*) (if m (prompt m) ) (princ) ) (defun barycent ( l ) (mapcar '(lambda ( x ) (/ x (length l))) (list (apply '+ (mapcar 'car l)) (apply '+ (mapcar 'cadr l)) (apply '+ (mapcar 'caddr l)))) ) (vla-startundomark (setq *adoc* (vla-get-activedocument (vlax-get-acad-object)))) (if (= (getvar 'worlducs) 0) (progn (command "_.UCS" "_W") (setq ucsf t) ) ) (setq osm (getvar 'osmode)) (if (getvar '3dosmode) (setq 3dosm (getvar '3dosmode)) ) (prompt "\nPick editable entity for softselvertmod (SPLINE,POLYLINE,MESH,POLYFACE MESH) on unlocked layer...") (setq ss (ssget "_+.:E:S:L" '((0 . "*POLYLINE,SPLINE,MESH")))) (while (not ss) (prompt "\nMissed - empty sel.set... Please pick editable entity for softselvertmod (SPLINE,POLYLINE,MESH,POLYFACE MESH) on unlocked layer...") (setq ss (ssget "_+.:E:S:L" '((0 . "*POLYLINE,SPLINE,MESH")))) ) (setq e (ssname ss 0)) (initget "Move-Stretch Twist Scale-Shrink") (setq ch (getkword "\nChoose mode [Move-Stretch/Twist/Scale-Shrink] <Move-Stretch> : ")) (if (null ch) (setq ch "Move-Stretch") ) (cond ( (= ch "Move-Stretch") (cond ( (= (cdr (assoc 0 (entget e))) "LWPOLYLINE") (setq pl (mapcar '(lambda ( p ) (trans (list (car p) (cadr p) (cdr (assoc 38 (entget e)))) e 0)) (mapcar 'cdr (vl-remove-if-not '(lambda ( x ) (= (car x) 10)) (entget e))))) (command "_.UCS" "_E" e) (while (< 0 (getvar 'cmdactive)) (command "") ) (setvar 'osmode 1) (while (setq p (getpoint "\nPick or specify main vertex-vertices for softselvertmod - ENTER TO FINISH : ")) (setq vl (cons (trans p 1 0) vl)) (print (trans p 1 0)) ) (setvar 'osmode 0) (setq c (barycent vl)) (prompt "\nPick or specify radius of softselvertmod : ") (command "_.CIRCLE" "_non" (trans c 0 1) "\") (setq r (cdr (assoc 40 (entget (entlast))))) (entdel (entlast)) (setq p1 (getpoint (trans c 0 1) "\nPick or specify start point of vector of softselvertmod : ")) (setq p2 (getpoint p1 "\nPick or specify end point of vector of softselvertmod : ")) (setq v (mapcar '- (trans p2 1 0) (trans p1 1 0))) (setq v1 (mapcar '/ v (list (distance '(0.0 0.0 0.0) v) (distance '(0.0 0.0 0.0) v) (distance '(0.0 0.0 0.0) v)))) (setq vl (vl-remove-if-not '(lambda ( x ) (< (distance c x) r)) pl)) (command "_.UCS" "_3P" "_non" p1 "_non" p2 "") (setq eg (entget e)) (while (= 5 (car (setq gr (grread t)))) (setq v (mapcar '* v1 (list (car (cadr gr)) (car (cadr gr)) (car (cadr gr))))) (setq vln (mapcar '(lambda ( p ) (mapcar '+ p (mapcar '* v (list (/ (- r (distance c p)) r) (/ (- r (distance c p)) r) (/ (- r (distance c p)) r))))) vl)) (setq ex (mapcar '(lambda ( x / xx ) (if (setq xx (vl-member-if '(lambda ( y ) (equal (cdr x) (mapcar '+ '(0.0 0.0) (trans y 0 e)) 1e-6)) vl)) (cons 10 (mapcar '+ '(0.0 0.0) (trans (nth (vl-position (car xx) vl) vln) 0 e))) x)) eg)) (entupd (cdr (assoc -1 (entmod ex)))) ) (command "_.UCS" "_P") (command "_.UCS" "_P") ) ( (and (= (cdr (assoc 0 (entget e))) "POLYLINE") (= "AcDb2dPolyline" (cdr (assoc 100 (reverse (entget e)))))) ;;; - it's old heavy 2D POLYLINE (command "_.CONVERTPOLY" "_L" e) (while (< 0 (getvar 'cmdactive)) (command "") ) (setq pl (mapcar '(lambda ( p ) (trans (list (car p) (cadr p) (cdr (assoc 38 (entget e)))) e 0)) (mapcar 'cdr (vl-remove-if-not '(lambda ( x ) (= (car x) 10)) (entget e))))) (command "_.UCS" "_E" e) (while (< 0 (getvar 'cmdactive)) (command "") ) (setvar 'osmode 1) (while (setq p (getpoint "\nPick or specify main vertex-vertices for softselvertmod - ENTER TO FINISH : ")) (setq vl (cons (trans p 1 0) vl)) (print (trans p 1 0)) ) (setvar 'osmode 0) (setq c (barycent vl)) (prompt "\nPick or specify radius of softselvertmod : ") (command "_.CIRCLE" "_non" (trans c 0 1) "\") (setq r (cdr (assoc 40 (entget (entlast))))) (entdel (entlast)) (setq p1 (getpoint (trans c 0 1) "\nPick or specify start point of vector of softselvertmod : ")) (setq p2 (getpoint p1 "\nPick or specify end point of vector of softselvertmod : ")) (setq v (mapcar '- (trans p2 1 0) (trans p1 1 0))) (setq v1 (mapcar '/ v (list (distance '(0.0 0.0 0.0) v) (distance '(0.0 0.0 0.0) v) (distance '(0.0 0.0 0.0) v)))) (setq vl (vl-remove-if-not '(lambda ( x ) (< (distance c x) r)) pl)) (setq eg (entget e)) (command "_.UCS" "_3P" "_non" p1 "_non" p2 "") (while (= 5 (car (setq gr (grread t)))) (setq v (mapcar '* v1 (list (car (cadr gr)) (car (cadr gr)) (car (cadr gr))))) (setq vln (mapcar '(lambda ( p ) (mapcar '+ p (mapcar '* v (list (/ (- r (distance c p)) r) (/ (- r (distance c p)) r) (/ (- r (distance c p)) r))))) vl)) (setq ex (mapcar '(lambda ( x / xx ) (if (setq xx (vl-member-if '(lambda ( y ) (equal (cdr x) (mapcar '+ '(0.0 0.0) (trans y 0 e)) 1e-6)) vl)) (cons 10 (mapcar '+ '(0.0 0.0) (trans (nth (vl-position (car xx) vl) vln) 0 e))) x)) eg)) (entupd (cdr (assoc -1 (entmod ex))))