;;; inserisce un vertice lungo una polilinea (interpolandolo tra i due vertici pių vicini). (defun c:Int3D () (setvar "cmdecho" 0) (setq lista-punti nil) (setq lista-puntiZ nil) (setq clay(getvar "clayer")) (setq Poli2D(car(entsel "\n....... Seleziona la polilinea: "))) (if (/= Poli2D nil)(vai2)) (princ) ) (defun vai2 () (if (or (= (cdr (assoc 0 (entget Poli2D))) "POLYLINE") (= (cdr (assoc 0 (entget Poli2D))) "LWPOLYLINE"))(progn (forma-lista-puntiXYZ Poli2D) (command "_osnap" "_near" \r) (command "_osnap" "_int" \r) (initget (+ 1 2 128)) (setq Vnuovo(getpoint "\n....... Seleziona il nuovo vertice: ")) (setq XVN(car Vnuovo)) (setq YVN(cadr Vnuovo)) (setq VNxy(list XVN YVN)) (setq VV1 nil) (setq VV2 nil) (setq i 0) (repeat (- (length lista-punti) 1) (setq C1(nth i lista-punti)) (setq C2(nth (+ i 1) lista-punti)) (setq XC1(car C1)) (setq YC1(cadr C1)) (setq XC2(car C2)) (setq YC2(cadr C2)) (setq Xmax(max XC1 XC2)) (setq Xmin(min XC1 XC2)) (setq Ymax(max YC1 YC2)) (setq Ymin(min YC1 YC2)) (if (and (> XVN Xmin) (< XVN Xmax) (> YVN Ymin) (< YVN Ymax))(progn (setq VV1 C1) (setq VV2 C2) )) (setq i(+ i 1)) ) (if (/= VV1 nil)(progn (setq VV1xy(list (car VV1) (cadr VV1))) (setq VV2xy(list (car VV2) (cadr VV2))) (setq Z1(caddr VV1)) (setq Z2(caddr VV2)) (if (> Z1 Z2) (progn (setq Zalta Z1) (setq Zbassa Z2) (setq Prif VV2) ) (progn (setq Zalta Z2) (setq Zbassa Z1) (setq Prif VV1) ) ) (setq Dislivello(- Zalta Zbassa)) (setq Dist1(+ (distance VV1xy VNxy) (distance VNxy VV2xy))) (setq pendenza(/ Dislivello Dist1)) (setq D1(distance Prif VNxy)) (setq Q1(+ (* pendenza D1) Zbassa)) (setq NP(list XVN YVN Q1)) (setq kk 0) (repeat (- (length lista-punti) 1) (setq E1(nth kk lista-punti)) (if (= E1 VV1) (progn (setq lista-puntiZ(cons (list (car E1) (cadr E1) (caddr E1)) lista-puntiZ)) (setq lista-puntiZ(cons (list (car NP) (cadr NP) (caddr NP)) lista-puntiZ)) (setq kk(+ kk 1)) (setq E1(nth kk lista-punti)) )) (setq lista-puntiZ(cons (list (car E1) (cadr E1)(caddr E1)) lista-puntiZ)) (setq kk(+ kk 1)) ) (setq lista-puntiZ(reverse lista-puntiZ)) (EstraiPianoAllaPoly2D Poli2D) (command "_erase" Poli2D "" ) (CreaPolilinea lista-puntiZ) (setq Poli2D(entlast)) ) (princ "\n Il nuovo punto non č sull'allineamento di altri vertici!") ) )) ) (defun forma-lista-puntiXYZ (RF0) (setq lista-punti nil) (setq Xmin 100000000.00) (setq Ymin 100000000.00) (setq Xmax -100000000.00) (setq Ymax -100000000.00) (setq Ramo(entget RF0)) (if (= (cdr(assoc 0 Ramo)) "POLYLINE") (progn (setq 0ent0(entnext RF0)) (setq 0ent(entget 0ent0)) (setq 0entT(cdr(assoc 0 0ent))) (while (/= 0entT "SEQEND") (setq X(car (cdr(assoc 10 0ent)))) (setq Y(cadr (cdr(assoc 10 0ent)))) (setq Z(caddr (cdr(assoc 10 0ent)))) (setq lista-punti(cons (list X Y Z) lista-punti)) (setq 0ent0(entnext 0ent0)) (setq 0ent(entget 0ent0)) (setq 0entT(cdr(assoc 0 0ent))) (if (< X Xmin)(setq Xmin X)) (if (< Y Ymin)(setq Ymin Y)) (if (> X Xmax)(setq Xmax X)) (if (> Y Ymax)(setq Ymax Y)) ) ) ) (if (= (cdr (assoc 0 Ramo)) "LWPOLYLINE") (progn (setq lista-punti0(member (assoc 10 Ramo) Ramo)) (setq cont 0) (repeat (/ (- (length lista-punti0) 1) 4) (setq cod(nth cont lista-punti0)) (setq X(cadr cod)) (setq Y(caddr cod)) (setq lista-punti(cons (list (cadr cod) (caddr cod) 0) lista-punti)) (if (< X Xmin)(setq Xmin X)) (if (< Y Ymin)(setq Ymin Y)) (if (> X Xmax)(setq Xmax X)) (if (> Y Ymax)(setq Ymax Y)) (setq cont(+ cont 4)) ) )) ) (Princ "\n Digitare Int3D per lanciare il programma!") (Princ)