TuttoCAD Forum

TuttoCAD Forum
[ Home | Registrati | Discussioni Attive | Discussioni Recenti | Segnalibro | Msg privati | Sondaggi Attivi | Utenti | Album Fotografico | Download | | Cerca | FAQ ]
Nome Utente:
Password:
Salva Password
Password Dimenticata?

 Tutti i Forum
 1 - TuttoCAD Software
 AutoCAD
 Calcolare area totale di più polilinee insieme
 Nuova Discussione  Rispondi
 Versione Stampabile Bookmark this Topic Aggiungi Segnalibro
I seguenti utenti stanno leggendo questo Forum Qui c'è:
Autore Discussione Precedente Discussione Discussione Successiva  

AlessandroVignale
Nuovo Arrivato



Regione: Emilia Romagna
Prov.: Reggio Emilia
Città: Carta di identità


4 Messaggi

Inserito il - 16 luglio 2011 : 21:48:25  Mostra Profilo  Clicca per vedere l'indirizzo MSN di AlessandroVignale Invia a AlessandroVignale un Messaggio Privato  Rispondi Quotando
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!!

AV

Jotar
Utente Master



Regione: Lazio
Prov.: Roma
Città: Roma


799 Messaggi

Inserito il - 16 luglio 2011 : 22:02:45  Mostra Profilo Invia a Jotar un Messaggio Privato  Rispondi Quotando
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".

Jotar
Torna all'inizio della Pagina

joseph
Utente Master



Regione: Lombardia
Prov.: Cremona
Città: Casalmaggiore


1884 Messaggi

Inserito il - 16 luglio 2011 : 22:27:25  Mostra Profilo Invia a joseph un Messaggio Privato  Rispondi Quotando
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.

Modificato da - joseph in data 16 luglio 2011 22:33:08
Torna all'inizio della Pagina

AlessandroVignale
Nuovo Arrivato



Regione: Emilia Romagna
Prov.: Reggio Emilia
Città: Carta di identità


4 Messaggi

Inserito il - 16 luglio 2011 : 22:51:09  Mostra Profilo  Clicca per vedere l'indirizzo MSN di AlessandroVignale Invia a AlessandroVignale un Messaggio Privato  Rispondi Quotando
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

AV
Torna all'inizio della Pagina

AlessandroVignale
Nuovo Arrivato



Regione: Emilia Romagna
Prov.: Reggio Emilia
Città: Carta di identità


4 Messaggi

Inserito il - 16 luglio 2011 : 23:15:28  Mostra Profilo  Clicca per vedere l'indirizzo MSN di AlessandroVignale Invia a AlessandroVignale un Messaggio Privato  Rispondi Quotando
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)

AV
Torna all'inizio della Pagina

Terminator
Utente Master



725 Messaggi

Inserito il - 16 luglio 2011 : 23:22:53  Mostra Profilo Invia a Terminator un Messaggio Privato  Rispondi Quotando
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
Torna all'inizio della Pagina

AlessandroVignale
Nuovo Arrivato



Regione: Emilia Romagna
Prov.: Reggio Emilia
Città: Carta di identità


4 Messaggi

Inserito il - 17 luglio 2011 : 00:26:05  Mostra Profilo  Clicca per vedere l'indirizzo MSN di AlessandroVignale Invia a AlessandroVignale un Messaggio Privato  Rispondi Quotando
riuscito con Autolisp. Grazie mille per i consigli!!

AV
Torna all'inizio della Pagina

Giuseppe Mauro
Amministratore



Regione: Campania
Prov.: Napoli


2707 Messaggi

Inserito il - 17 luglio 2011 : 08:05:14  Mostra Profilo Invia a Giuseppe Mauro un Messaggio Privato  Rispondi Quotando
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
Torna all'inizio della Pagina

Terminator
Utente Master



725 Messaggi

Inserito il - 17 luglio 2011 : 11:25:33  Mostra Profilo Invia a Terminator un Messaggio Privato  Rispondi Quotando
Il grande problema del comando AREA è che puoi aggiungere solo un'entità alla volta. La storia diventa leggermente rompente se bisogna selezionare 300 polilinee...
Torna all'inizio della Pagina

joseph
Utente Master



Regione: Lombardia
Prov.: Cremona
Città: Casalmaggiore


1884 Messaggi

Inserito il - 17 luglio 2011 : 15:53:50  Mostra Profilo Invia a joseph un Messaggio Privato  Rispondi Quotando
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
Torna all'inizio della Pagina

Terminator
Utente Master



725 Messaggi

Inserito il - 18 luglio 2011 : 07:51:41  Mostra Profilo Invia a Terminator un Messaggio Privato  Rispondi Quotando
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>")
		  )
	  )
)
Torna all'inizio della Pagina

joseph
Utente Master



Regione: Lombardia
Prov.: Cremona
Città: Casalmaggiore


1884 Messaggi

Inserito il - 18 luglio 2011 : 08:05:33  Mostra Profilo Invia a joseph un Messaggio Privato  Rispondi Quotando
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
Torna all'inizio della Pagina

Terminator
Utente Master



725 Messaggi

Inserito il - 18 luglio 2011 : 13:04:16  Mostra Profilo Invia a Terminator un Messaggio Privato  Rispondi Quotando
(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.
Torna all'inizio della Pagina

joseph
Utente Master



Regione: Lombardia
Prov.: Cremona
Città: Casalmaggiore


1884 Messaggi

Inserito il - 18 luglio 2011 : 13:45:17  Mostra Profilo Invia a joseph un Messaggio Privato  Rispondi Quotando
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à.
Torna all'inizio della Pagina

Terminator
Utente Master



725 Messaggi

Inserito il - 18 luglio 2011 : 13:50:42  Mostra Profilo Invia a Terminator un Messaggio Privato  Rispondi Quotando
Giusto per tagliare la testa al toro l'ho lasciato all'interno della funzione, ho visto che non c'erano messaggi di errore.

Torna all'inizio della Pagina
  Discussione Precedente Discussione Discussione Successiva  
 Nuova Discussione  Rispondi
 Versione Stampabile Bookmark this Topic Aggiungi Segnalibro
Vai a:
TuttoCAD Forum © 2001-2010 CADLandia Torna all'inizio della Pagina
Pagina generata in 0,62 secondi.