(defun c:Sezi (/ Px Pprec lista-puntiZ) (setvar "cmdecho" 0) (setq P T ListaPt nil) (while P (if Px (setq P(getpoint Px "\n Selezionare un punto della sezione: ")) (setq P(getpoint "\n Selezionare un punto della sezione: ")) ) (if P (progn (if Px (grvecs (list 2 Px P))) (setq Px P) (setq ListaPt(cons P ListaPt)) ) ) ) (setq ListaPt(reverse ListaPt)) (setq r 0) (repeat (- (length ListaPt) 1) (setq V1(nth r ListaPt)) (setq V2(nth (1+ r) ListaPt)) (setq GruppoPoly(ssget "_F" (list V1 V2) (list (cons -4 "")))) (if GruppoPoly (progn (setq i 0) (repeat (sslength GruppoPoly) (setq Polyx (ssname GruppoPoly i)) (if (/= (cdr (assoc 0 (entget Polyx))) "LINE") (forma-lista-puntiXYZ Polyx) (setq lista-punti (list (cdr(assoc 10 (entget Polyx))) (cdr(assoc 11 (entget Polyx))))) ) (setq ii 0) (repeat (- (length lista-punti) 1) (setq C1(nth ii lista-punti)) (setq C2(nth (+ ii 1) lista-punti)) (if (> (caddr C1) (caddr C2)) (setq Zalta (caddr C1) Zbassa (caddr C2) Prif (list (car C2) (cadr C2))) (setq Zalta (caddr C2) Zbassa (caddr C1) Prif (list (car C1) (cadr C1))) ) (setq Dislivello(- Zalta Zbassa)) (setq Dist1(distance (list (car C1) (cadr C1)) (list (car C2) (cadr C2)))) (if (/= dist1 0.0)(setq pendenza(/ Dislivello Dist1))(setq pendenza 0.00)) (setq puntoInt(inters V1 V2 (list (car C1) (cadr C1)) (list (car C2) (cadr C2)))) ;;; ho trovato una intersezione reale... (if (/= puntoInt nil) (progn (setq D1(distance Prif PuntoInt)) (setq X1(car PuntoInt)) (setq Y1(cadr PuntoInt)) (setq Q1(+ (* pendenza D1) Zbassa)) (setq lista-puntiZ(cons (list X1 Y1 Q1) lista-puntiZ)) ;(princ (strcat "\n Punto: " (rtos X1 2 2) "," (rtos Y1 2 2) "," (rtos Q1 2 2))) ;(if Pprec (command "_line" Pprec (list X1 Y1 Q1) \r)) ;(setq Pprec (list X1 Y1 Q1)) ) ) (setq ii(+ ii 1)) ) (setq i (1+ i)) ) )) (setq r(1+ r)) ) (if lista-puntiZ (progn (setq lista-puntiZ(reverse lista-puntiZ)) (setq lista-puntiZ(vl-sort lista-puntiZ (function (lambda (e1 e2) (< (car e1) (car e2)) ) ) ) ) (CreaPolilinea lista-puntiZ "Poly_Sezione") )) (redraw) (princ) ) ;;; (defun CreaPolilinea (lista-vertici piano) (entmake (list (cons 0 "POLYLINE") (cons 8 piano) (cons 70 8) ) ) (setq k 0) (repeat (length lista-vertici) (setq V(nth k lista-vertici)) (setq VX(car V)) (setq VY(cadr V)) (setq VQ(caddr V)) (entmake (list (cons 0 "VERTEX") (cons 8 piano) (cons 10 (list VX VY VQ)) (cons 70 32) ) ) (setq k(+ k 1)) ) (entmake (list (cons 0 "SEQEND") (cons 8 piano))) ) ;;; (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 lista-punti(cons (list (cadr cod) (caddr cod) (cdr(assoc 38 Ramo))) 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 SEZI per lanciare il programma!") (princ)