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

Nota: Devi essere registrato per poter inserire un messaggio.
Per registrarti, clicca qui. La Registrazione è semplice e gratuita!

Larghezza finestra:
Nome Utente:
Password:
Modo:
Formato: GrassettoCorsivoSottolineatoBarrato Aggiungi Spoiler Allinea a  SinistraCentraAllinea a Destra Riga Orizzontale Inserisci linkInserisci EmailInserisci FlashInserisci Immagine Inserisci CodiceInserisci CitazioneInserisci Lista
   
Icona Messaggio:              
             
Messaggio:

  * Il codice HTML è OFF
* Il Codice Forum è ON

Faccine
Felice [:)] Davvero Felice [:D] Caldo [8D] Imbarazzato [:I]
Goloso [:P] Diavoletto [):] Occhiolino [;)] Clown [:o)]
Occhio Nero [B)] Palla Otto [8] Infelice [:(] Compiaciuto [8)]
Scioccato [:0] Arrabbiato [:(!] Morto [xx(] Assonnato [|)]
Bacio [:X] Approvazione [^] Disapprovazione [V] Domanda [?]
Seleziona altre faccine

    
 
   

V I S U A L I Z Z A    D I S C U S S I O N E
AlessandroVignale Inserito il - 16 luglio 2011 : 21:48:25
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!!
14   U L T I M E    R I S P O S T E    (in alto le più recenti)
Terminator Inserito il - 18 luglio 2011 : 13:50:42
Giusto per tagliare la testa al toro l'ho lasciato all'interno della funzione, ho visto che non c'erano messaggi di errore.

joseph Inserito il - 18 luglio 2011 : 13:45:17
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à.
Terminator Inserito il - 18 luglio 2011 : 13:04:16
(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.
joseph Inserito il - 18 luglio 2011 : 08:05:33
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
Terminator Inserito il - 18 luglio 2011 : 07:51:41
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>")
		  )
	  )
)
joseph Inserito il - 17 luglio 2011 : 15:53:50
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
Terminator Inserito il - 17 luglio 2011 : 11:25:33
Il grande problema del comando AREA è che puoi aggiungere solo un'entità alla volta. La storia diventa leggermente rompente se bisogna selezionare 300 polilinee...
Giuseppe Mauro Inserito il - 17 luglio 2011 : 08:05:14
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
AlessandroVignale Inserito il - 17 luglio 2011 : 00:26:05
riuscito con Autolisp. Grazie mille per i consigli!!
Terminator Inserito il - 16 luglio 2011 : 23:22:53
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
AlessandroVignale Inserito il - 16 luglio 2011 : 23:15:28
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)
AlessandroVignale Inserito il - 16 luglio 2011 : 22:51:09
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
joseph Inserito il - 16 luglio 2011 : 22:27:25
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.
Jotar Inserito il - 16 luglio 2011 : 22:02:45
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".

TuttoCAD Forum © 2001-2010 CADLandia Torna all'inizio della Pagina
Pagina generata in 2,12 secondi.