Stampa Pagina | Chiudi Finestra

Calcolare area totale di più polilinee insieme

Stampato da: TuttoCAD Forum
URL Discussione: http://www.cadlandia.com/topic.asp?TOPIC_ID=14122
Stampato il: 04 agosto 2020

Discussione:


Autore Discussione: AlessandroVignale
Oggetto: Calcolare area totale di più polilinee insieme
Inserito il: 16 luglio 2011 21:48:25
Messaggio:

Salve a tutti! Sto disperatamente cercando il modo di calcolare l'area totale di circa 350 polilinee che rappresentano lo sviluppo urbano di una città, por poterne calcolare le tendenze. Ho provato con >proprietà ma non funziona, >area me ne fa calcolare una per volta, >blocco non va bene, >estrudi mi da info su un'area di riferimento ma non quella esatta delle polilinee....aiutatemi! grazie!!

Risposte:


Autore Risposta: Jotar
Inserita il: 16 luglio 2011 22:02:45
Messaggio:

Ciao Alessandro...
come sono queste polilinee?

sono unite tra loro?

Formano un poligono chiuso?

Probabilmente non sono unite tra loro, allora devi prima unirle con il comando EDITPL e poi, selezionata la prima polilinea entri nel sottocomando "Unisci".


Autore Risposta: joseph
Inserita il: 16 luglio 2011 22:27:25
Messaggio:

Se non conosci Autolisp e non ti ci vuoi avventurare e non devi ripetere più volte questa operazione, ti basta digitare questo frammento di codice:

Comando: area
Specificare primo angolo o [Oggetto/Aggiungi area/Sottrai area] <Oggetto>: INVIO
Selezionare oggetti: (ssget '((0 . "*line"))) INVIO
Selezionare oggetti: Crea una finestra di selezione che comprenda tutte le polilinee che ti interessano INVIO
RIsultato:
Area = xxxxx, Perimetro = yyyy

Se invece conosci Autolisp troverai sicuremente, da solo, in rete parecchi files Autolisp che soddisferanno la tua richiesta, anche se sono convinto che altri utenti si faranno in 4 per fornirteli direttamente.

----
P.S. Certo, ho supposto che tutte le polilinee siano chiuse, come ha osservato Jotar precedendomi, mentre stavo digitando, con molta calma, la risposta.


Autore Risposta: AlessandroVignale
Inserita il: 16 luglio 2011 22:51:09
Messaggio:

si sono tutte unite. ho controllato anche con il comando superfici
sono tutte polilinee ok...con il comando (ssget '((0 . "*line"))) mi calcola solo l'area della maggiore! non quella totale


Autore Risposta: AlessandroVignale
Inserita il: 16 luglio 2011 23:15:28
Messaggio:

ho provato il comando polyarea seguente
Mi da il risultato in square units!! cosa sarebbero?

;;POLYAREA.LSP - (c) 1997-2001 Tee Square Graphics
;;
;; Calculates the area of one or more closed polylines and
;; displays the result in an AutoCAD Alert Window.
;;
(defun C:POLYAREA (/ a ss n du)
(setq a 0
du (getvar "dimunit")
ss (ssget '((0 . "*POLYLINE"))))
(if ss
(progn
(setq n (1- (sslength ss)))
(while (>= n 0)
(command "_.area" "_o" (ssname ss n))
(setq a (+ a (getvar "area"))
n (1- n)))
(alert
(strcat "The total area of the selected\nobject(s) is "
(if (or (= du 3)(= du 4)(= du 6))
;
;The following 2 lines translate the area to square inches and feet
;for users using US engineering or architectural units:
;
(strcat (rtos a 2 2) " square inches,\nor "
(rtos (/ a 144.0) 2 3) " square feet.")
;
;In the following line, change the word "units" to whatever units
;you are using - meters, millimeters, feet, etc.
;
(strcat (rtos a 2 3) " square units.")))))
(alert "\nNo Polylines selected!"))
(princ)
)
(alert
(strcat "POLYAREA.LSP (c) 1997-2001 Tee Square Graphics"
"\n\n Type POLYAREA to start"))
(princ)


Autore Risposta: Terminator
Inserita il: 16 luglio 2011 23:22:53
Messaggio:

Carica il comando con (load "APOLI")
Per farlo partire digita APOLI.

(defun C:APOLI ()
 (setq grupoli(ssget '((0 . "LWPOLYLINE")))
       area 0.00
       index 0
 )      
 (repeat (sslength grupoli)
  (if (= (vla-get-Closed (vlax-ename->vla-object (ssname grupoli index))) :vlax-true)
   (setq area(+ area (vla-get-area (vlax-ename->vla-object (ssname grupoli index)))))
  )
  (setq index(1+ index))
 )
 area
)


PS: square unit sono i nostri metri quadrati


Autore Risposta: AlessandroVignale
Inserita il: 17 luglio 2011 00:26:05
Messaggio:

riuscito con Autolisp. Grazie mille per i consigli!!


Autore Risposta: Giuseppe Mauro
Inserita il: 17 luglio 2011 08:05:14
Messaggio:

Messaggio inserito da AlessandroVignale

ho provato il comando polyarea seguente
Mi da il risultato in square units!! cosa sarebbero?

Sarebbe correttamente il risultato.
Tu disegni in unita', quindi il comando ti da' l'area un Unita' al quadrato.

Se una unita' equivale ad 1mm allora avrai l'area in mmq, se 1 unita' e 1 metro, allora l'area sara' in mq.
Ma se disegni con 1 unita' allora 2m.. allora succede un casotto, perche ti dara' l'area in mezzimetriquadri (unita' difficile da comprendere)

Comunque con il comando Area e poi Aggiungi -> oggetto, ottieni lo stesso risultato, man mano che aggiungi oggetti sara' aggiornata l'area totale, senza scomodare il lisp


Autore Risposta: Terminator
Inserita il: 17 luglio 2011 11:25:33
Messaggio:

Il grande problema del comando AREA è che puoi aggiungere solo un'entità alla volta. La storia diventa leggermente rompente se bisogna selezionare 300 polilinee...


Autore Risposta: joseph
Inserita il: 17 luglio 2011 15:53:50
Messaggio:

Per farmi perdonare la cantonata presa con SSGET applicato ad Area, mi sono divertito a stendere 2 soluzioni stringate, che sono nient'altro che semplici varianti alla funzione "APoli" di Terminator.

(defun C:Atot1 ()
(setq sel (ssget '((0 . "lwpolyline") (70 . 1)))) ;solo polilinee chiuse, fare UNA SOLA selezione!!!
(setq lst-ent (reverse (cdr (reverse (mapcar 'cadr (ssnamex sel))))) ;viene eliminata l'informazione sulla modalità di selez.
Lst-obj (mapcar 'vlax-ename->vla-object lst-ent)
areaTot (apply '+ (mapcar 'vla-get-area Lst-obj)))
)

(defun C:Atot2 ()
(setq sel (ssget "X" '((0 . "lwpolyline") (70 . 1)))); TUTTE le polilinee chiuse dell'intero database
(setq lst-ent (mapcar 'cadr (ssnamex sel)))
Lst-obj (mapcar 'vlax-ename->vla-object lst-ent)
areaTot (apply '+ (mapcar 'vla-get-area Lst-obj)))
)

Ciao a tutti


Autore Risposta: Terminator
Inserita il: 18 luglio 2011 07:51:41
Messaggio:

Solo due cose:

1) Ottima informazione, Jo! .
Ecco una funzione (ssnamex) di cui ignoravo l'esistenza e che permette di fare cose mooooolto interessanti. Alla fine si impara sempre...

2) Nella selezione inserirei anche il codice (70 . 129) come alternativa al (70 . 1). Il codice riguarda la generazione del tipo di linea ad ogni vertice.

Comando: _pedit
Selezionare la polilinea o [Polilinee]:
Digitare un'opzione [Apri/Unisci/Larghezza/Edita
vertici/CUrva/Spline/Rettifica/Tipolinea gen./ANnulla]:

A seconda che il valore dell'opzione sia ON oppure OFF, cambia anche il codice autolisp associato al 70. Nel caso di polilinee tratteggiate la differenza si vede, ma nel caso di polilinee continue è assolutamente indistinguibile e corro il rischio che queste polilinee non siano inserite nell'insieme di selezione. Figuriamoci poi nel calcolo delle aree...

(setq sel (ssget '((0 . "LWPOLYLINE")
		   (-4 . "<OR")
		   (70 . 1)
		   (70 . 129)
		   (-4 . "OR>")
		  )
	  )
)


Autore Risposta: joseph
Inserita il: 18 luglio 2011 08:05:33
Messaggio:

Potevi pure correggere direttamente il mio codice.

(defun C:Atot1 ()
(setq sel (ssget '((0 . "LWPOLYLINE") (-4 . "<OR") (70 . 1) (70 . 129) (-4 . "OR>"))))
;solo polilinee chiuse, fare UNA SOLA selezione!!!
(setq lst-ent (reverse (cdr (reverse (mapcar 'cadr (ssnamex sel))))) ;viene eliminata l'informazione sulla modalità di selez.
Lst-obj (mapcar 'vlax-ename->vla-object lst-ent)
areaTot (apply '+ (mapcar 'vla-get-area Lst-obj)))
)

(defun C:Atot2 ()
(setq sel (ssget "X" '((0 . "LWPOLYLINE") (-4 . "<OR") (70 . 1) (70 . 129) (-4 . "OR>"))))
; TUTTE le polilinee chiuse dell'intero database
(setq lst-ent (mapcar 'cadr (ssnamex sel)))
Lst-obj (mapcar 'vlax-ename->vla-object lst-ent)
areaTot (apply '+ (mapcar 'vla-get-area Lst-obj)))
)

Ecco fatto.
Ciao


Autore Risposta: Terminator
Inserita il: 18 luglio 2011 13:04:16
Messaggio:

(defun C:Atot1 ()
 (setq sel     (ssget '((0 . "LWPOLYLINE") (-4 . "<OR") (70 . 1) (70 . 129) (-4 . "OR>")))
       lst-ent (vl-remove-if '(lambda (elemento) (equal (type elemento) 'LIST))(mapcar 'cadr (ssnamex sel)))
       Lst-obj (mapcar 'vlax-ename->vla-object lst-ent)
       areaTot (apply '+ (mapcar 'vla-get-area Lst-obj))
 )
)

(defun C:Atot2 ()
 (setq sel     (ssget "x" '((0 . "LWPOLYLINE") (-4 . "<OR") (70 . 1) (70 . 129) (-4 . "OR>")))
       lst-ent (vl-remove-if '(lambda (elemento) (equal (type elemento) 'LIST))(mapcar 'cadr (ssnamex sel)))       
       Lst-obj (mapcar 'vlax-ename->vla-object lst-ent)
       areaTot (apply '+ (mapcar 'vla-get-area Lst-obj))
 )
)


Adesso la selezione può essere effettuata in tutti i modi possibili, rimuovendo di fatto il limite della selezione unica.


Autore Risposta: joseph
Inserita il: 18 luglio 2011 13:45:17
Messaggio:

In realtà nel secondo caso non occorrerebbe VL-REMOVE-IF perchè non esiste alcun riferimento al metodo di selezione e quindi manca l'ultimo elemento nella lista delle entità.


Autore Risposta: Terminator
Inserita il: 18 luglio 2011 13:50:42
Messaggio:

Giusto per tagliare la testa al toro l'ho lasciato all'interno della funzione, ho visto che non c'erano messaggi di errore.


TuttoCAD Forum : http://www.cadlandia.com/

© 2001-2010 CADLandia

Chiudi Finestra