Newsgroup: it.comp.software.cad
Titolo: R: lunghezza pline in lisp .. help!! Eccoti una possibile soluzioncina

AIUTATEMI GRAZIE 1K!!!
----------------------------------------------------------------------------
----
;;;-------------------------------------------------------------------------
---
;;;   LUN-POL.LSP
;;;   Copyright (C) 2000 by Giovanni Anzani  (e-mail:
giova...@tiscalinet.it
)
;;;
;;;  L'uso di tale programma e' libero cosi come il suo miglioramento
;;;  Fatene ciò che volete (tranne venderlo) lasciando traccia di me
;;;  come sviluppatore.
;;;  Sara' gradita una e-mail di ringraziamento.
;;;
;;;  Non mi assumo nessuna responsabilita' per eventuali problematiche
;;;  inerenti l'uso di tale programma cosi' come per l'eventuale suo non
;;;  funzionamento.
;;;-------------------------------------------------------------------------
---
;;;   DESCRIZIONE:
;;;   c:lp - calcola la lunghezza di una polilinea aperta o chiusa che sia
;;;   f-lp - e' una funzione a cui va passata l'entita' di cui si vuole
conoscere
;;;          la lunghezza.
;;;-------------------------------------------------------------------------
---
;;;   AVVERTENZE:
;;;   1) se la polilinea presenta archi al suo interno, nel calcolo saranno
;;;      sostituiti dalla retta congiungente i due punti dell'arco.
;;;   2) se e' stato fatto un fit/smooth della polilinea il programma non
sara'
;;;      in grado di calcolarne la lunghezza e restituira' 0, anche se la si
e' resa
;;;      nuovamente fatta di segmenti.
;;;   3) se la polilinea e' 3D il programma non sara' in grado di calcolarne
la
;;;      lunghezza e restituira' 0.
;;;   4) se interessasse un'implementazione di tal programma al fine
;;;      di tener conto di tali cose contattatemi, vedremo cosa si può fare.
;;;-------------------------------------------------------------------------
---
(defun c:lp (/ $1 $2 $3 v1 v2 v3 v4 v5 v6 v7 v8 v9)
  (setq $1 "\n LUNGHEZZA DI UNA POLILINEA:"
        $2 "\n selezionare la polilinea: "
 $3 "\n lunghezza totale: ")
  (princ $1)
  (setq v1 (entget(car(entsel $2)))
        v2 (if (= (cdr (assoc 70 v1)) 1) T nil)
 v3 (cdr (assoc 10 v1))
 v4 T)
  (while v4
    (setq v5 (cdr (assoc 10 v1))
          v1 (cdr (member (assoc 10 v1) v1))
          v4 (cdr (assoc 10 v1)))
    (if v4   (setq v6 (append v6 (list (list v5 v4)))) (setq v7 v5)))
  (if v2  (setq v6 (append v6 (list (list v7 v3)))))
  (setq v8 0)
  (foreach v9 v6 (setq v8 (+ v8 (distance (nth 0 v9)(nth 1 v9)))))
  (progn (princ $3)(princ v8)(princ)))
;;;-------------------------------------------------------------------------
---
(defun f-lp (v1 / v2 v3 v7 v5 v4 v6 v8)
  (setq v2 (if (= (cdr (assoc 70 v1)) 1) T nil)
 v3 (cdr (assoc 10 v1))
 v4 T)
  (while v4
    (setq v5 (cdr (assoc 10 v1))
          v1 (cdr (member (assoc 10 v1) v1))
          v4 (cdr (assoc 10 v1)))
    (if v4   (setq v6 (append v6 (list(list v5 v4)))) (setq v7 v5)))
  (if v2  (setq v6 (append v6 (list (list v7 v3)))))
  (setq v8 0)
  (foreach v9 v6 (setq v8 (+ v8 (distance (nth 0 v9)(nth 1 v9))))))
;;;-------------------------------------------------------------------------
---

 --------------------------------------------------------------------------
--
Allego sotto la risposta (spero) al problema sollevato.
Contattatemi pure per scambi di opinione su procedure lisp che
 spero fin d'ora essere proficui per entrambi.
In questa seconda rel. la lunghezza della polilyne e' ora comprensiva
dell'eventuale presenza di tratti arcuati, questo ha richiesto un certo
approfondimento della procedura, ma e' stato possibile farlo.
P.S. Scusatemi l'eventuale non rispondenza della mia alle regole del NG
Ciao Giovanni.  (e-mail: 
giova...@tiscalinet.it
)
;;;-------------------------------------------------------------------------
---
;;;   LUN-POL.LSP
;;;   Copyright (C) 2000 by Giovanni Anzani (e-mail:
giova...@tiscalinet.it
)
;;;   L'uso di tale programma e' libero cosi come il suo miglioramento
;;;   Fatene ciò che volete (tranne venderlo) lasciando traccia di me
;;;   come sviluppatore.
;;;   Sara' gradita una e-mail di ringraziamento.
;;;
;;;   Non mi assumo nessuna responsabilita' per eventuali problematiche
;;;   inerenti l'uso di tale programma cosi' come per l'eventuale suo non
;;;   funzionamento
;;;-------------------------------------------------------------------------
---
;;;   DESCRIZIONE
;;;   c:lp calcola la lunghezza di una polilinea aperta o chiusa che sia
;;;        tiene conto dell'eventuale presenza di archi ma non
;;;        dell'eventuale fit/smooth che se ne sia fatto.
;;;        USO: Command:lp
;;;   f-lp e' una funzione a cui va passata l'entita' di cui si vuole
conoscere
;;;        la lunghezza che verra' calcolata con le limitazioni di cui
sopra.
;;;-------------------------------------------------------------------------
---
(defun c:lp (/ v3 v4 v5 v1 v2)
  (setq v3 "\n LUNGHEZZA DI UNA POLILINEA "
        v4 "\n selezionare la polilinea:"
        v5 " OK\n lunghezza polilinea = ")
  (princ v3)
  (setq v1 (f:lp (entget (while (not v2)(setq v2 (car (entsel v4)))))))
  (princ v5) (princ v1)(princ))
;;;-------------------------------------------------------------------------
---
(defun f:lp (d1 / v0 v1 v2 v3 v4 v5 v6 v7 v8 v9)
  (setq  v1 (if (= (cdr (assoc 70 d1)) 1) T nil) v2 (cdr (assoc 10 d1)) v4
T)
  (while v4 (setq v8 (* 2 (atan (cdr (assoc 42 d1))))
           v3 (cdr            (assoc 10 d1))
           d1 (cdr (member    (assoc 10 d1) d1))
           v4 (cdr            (assoc 10 d1)))
     (if   v4 (setq v5 (append v5 (list (list v3 v4 v8))))))
  (if             v1 (setq v5 (append v5 (list (list v3 v2 v8)))))
  (setq  v9 0)
  (foreach v0 v5 (setq v6 (distance (nth 0 v0)(nth 1 v0))
                       v7 (if (/= (nth 2 v0) 0.0) (/ v6 (sin (nth 2 v0)))
nil)
                       v9 (+ v9 (if v7 (* v7 (nth 2 v0)) v6)))))
;;;-------------------------------------------------------------------------
---

Attenzione! la versione precedente aveva un bug ora corretto!
P.S. se si vuole la lunghezza di una polilinea che ha subito un
fit/smooth ci si dovra' rifare al comando cad LIST che fornisce la
lunghezza di qualsiasi polilinea.
Ciao Giovanni                            (e-mail: 
giova...@tiscalinet.it
)
----------------------------------------------------------------------------
;;;  LUN-POL2.LSP
;;;  Copyright (C) 2000 by Giovanni Anzani (e-mail:
giova...@tiscalinet.it
)
;;;  L'uso di tale programma e' libero cosi come il suo miglioramento
;;;  Fatene ciň che volete (tranne venderlo) lasciando traccia di me
;;;  come sviluppatore.
;;;  Sara' gradita una e-mail di ringraziamento.
;;;  Non mi assumo nessuna responsabilita' per eventuali problematiche
;;;  inerenti l'uso di tale programma cosi' come per l'eventuale suo non
;;;  funzionamento
;;;  -----------------------------------------------------------------------
;;;  DESCRIZIONE
;;;  c:lp calcola la lunghezza di una polilinea aperta o chiusa che sia
;;;         tiene conto dell'eventuale presenza di archi ma non
;;;         dell'eventuale fit/smooth che se ne sia fatto.
;;;         USO: Command:lp
;;;  f:lp  e' una funz. a cui va passata l'entita' di cui si vuole conoscere
;;;         la lung. che verra' calcolata con le limitazioni di cui sopra.
;;;  -----------------------------------------------------------------------
(defun c:lp (/ $1 $2 $3 v1 v2)
  (setq $1 "\n LUNGHEZZA DI UNA POLILINEA "
        $2 "\n selezionare la polilinea:"
        $3 " OK\n lunghezza polilinea = ")
  (princ $1)
  (setq v1 (f:lp (entget (while (not v2)(setq v2 (car (entsel $2)))))))
  (princ $3) (princ v1)(princ))
;;;  -----------------------------------------------------------------------
(defun f:lp (d1 / v0 v1 v2 v3 v4 v5 v6 v7 v8 v9)
  (setq  v1 (if (= (cdr (assoc 70 d1)) 1) T nil)
           v2 (cdr (assoc 10 d1))
           v4 T)
  (while v4
   (setq v3 (cdr                  (assoc 10 d1))
