Jump to content
koram80

Estrusione ad altezze variabili

Recommended Posts

Salve ragazzi, l'ambiente di lavoro è Autocad, ho migliaia di polilinee da trasformare in solidi a mimare casette, il mio problema è come fare ad estruderle simultaneamente e ad altezze variabili.

Tempo fa ho seguito una discussione dove un altro utente mi pare abbia poi realizzato un apposito lisp (almeno credo), ma non riesco a trovarla!

Qualcuno mi potrebbe aiutare?

P.s....Qualcuno di voi magari starà pensando a come mai non passo ad ambiente Max o simile?! Beh, lo utilizzo gia, e avevo gia pensato a Grabble o building generator, ma sto lavorando in team e gli altri usano autocad, ho tantissime altre cose da fare e volevo far sbrigare la questione direttamente in autocad.

Share this post


Link to post
Share on other sites

Se hai le altezze dei singoli edifici conservate in un database catastale (ad es.Access o Excel), l'estrusione automatica e' possibile solo con un'apposita query in Autocad Map.

Se invece non hai un database, con _EXTRUDE ti crei i solidi, ma le altezze dovrai darle manualmente filtrando le selezioni per colore o layer.

;)

Share this post


Link to post
Share on other sites

Ciao :D Grazie per aver risposto

Beh, non ho un file catastale con le altezze, per velocità cercavo un metodo per filtrare le altezze da un range minimo ad un range massimo, senza doverle fare uno per uno a caso E un pò di tempo fa lessi nel forum una discussione dove si stava creando apposito lisp, purtroppo ho spulciato ma non lo riesco a trovare, può anche essere che io ricordi male e che il lisp lo stessero sviluppando su altra questione. Ma sarebbe utile una modifica simile per utilizzo cad.

Share this post


Link to post
Share on other sites

Invece di assegnare spessori "random", si potrebbe legarli proporzionalmente a qualche caratteristica dell'edificio, ad es. la sua area.

Supponendo che una casa sia rappresentata da un rettangolo 10x25 metri, allora la sua altezza d'estrusione verrebbe sqrt(250) ossia 15.81 m.

In altre parole: quanto maggiore la superficie in pianta, tanto piu' alto sara' lo spessore.

Con Autocad "normale" credo che cio' si possa ottenere con un lispino, per cui lascio la parola all'immenso GP.

smile.gif

Share this post


Link to post
Share on other sites

Quella della superficie mi sembra un'ottima idea.


(defun C:ES_POLY (/ SEL n POLY POLY_vl)

    (vl-load-com)

    (command "_UNDO" "_BEGIN")

    (setq SEL (ssget "_X" '((0 . "POLYLINE,LWPOLYLINE"))))

    (repeat (setq n (sslength SEL))

	(setq POLY (ssname SEL (setq n (1- n))))

	(setq POLY_vl (vlax-ename->vla-object POLY))

	(if (vlax-curve-isClosed POLY_vl)

	    (command "_EXTRUDE" POLY "" (sqrt (vlax-curve-getArea POLY_vl)))

	)

    )

    (command "_UNDO" "_END")

)

Se si vuole selezionare le poly da trattare togliere la "_X" dal codice.

:)

Share this post


Link to post
Share on other sites

La variante "random", assegnare i valori ad H_min e H_max :)


(defun C:ES_POLY (/ SEL n POLY POLY_VL H_min H_max )

    (vl-load-com)

    (command "_UNDO" "_BEGIN")

    (setq H_min 5.0)

    (setq H_max 20.0)

    (setq SEL (ssget "_X" '((0 . "POLYLINE,LWPOLYLINE"))))

    (repeat (setq n (sslength SEL))

	(setq POLY (ssname SEL (setq n (1- n))))

	(setq POLY_vl (vlax-ename->vla-object POLY))

	(if (vlax-curve-isClosed POLY_vl) (command "_EXTRUDE" POLY "" (random H_min H_max)))

    )

    (command "_UNDO" "_END")

)


(defun random (min max / #)

    (+ min (* (- max min) (- (setq # (* 1000000 (getvar "cdate"))) (fix #))))

)


Share this post


Link to post
Share on other sites

O Immenso,

manca 1 Enter ad entrambe le routine, qua in rosso:

(command "_EXTRUDE" POLY "" (sqrt (vlax-curve-getArea POLY_vl)) "")

(command "_EXTRUDE" POLY "" (random H_min H_max) "")

Una volta corrette, funzionano alla grande, ma ci sarebbe una ciliegina sulla torta.

Il lisp "random" estrude gli oggetti in maniera davvero troppo.. decimale: potresti fargli assegnare degli spessori multipli di 3 metri, in modo che siano piu' rispondenti alla realta'?

Grazie, buon tutto smile.gif

Share this post


Link to post
Share on other sites

...manca 1 Enter ad entrambe le routine...

Strano, non dovrebbe essere necessario, a me funziona.

A dire il vero la routine viene portata a termine anche inserendo l'enter, ma segnalando un beep di errore ad ogni ciclo (Comando sconosciuto "ES_POLY". Premere F1 per la Guida.)

Con la versione "ciliegia" la differenza "di piano" tra i palazzi rende, giustamente, un effetto più reale.


(defun C:ES_POLY (/ SEL n POLY POLY_VL H Hp1  )

    (vl-load-com)

    (command "_UNDO" "_BEGIN")

    (setq H_min (getint "\nInserire l'altezza minima: "))

    (setq H_max (getint "\nInserire l'altezza massima: "))

    (if (= Hp nil) (setq Hp "S"))

    (initget "S N")

    (prompt "\nInterpiano multiplo di 3 mt. (a partire dal più basso)  <")

    (prompt (strcase Hp)) (prompt "\>    ")            

    (initget "S N")

    (setq Hp1 (getkword ))              

    (if (/= Hp1 nil) (setq Hp Hp1))    

    (setq SEL (ssget '((0 . "POLYLINE,LWPOLYLINE"))))

    (repeat (setq n (sslength SEL))

	(setq POLY (ssname SEL (setq n (1- n))))

	(setq POLY_vl (vlax-ename->vla-object POLY))

	(if (vlax-curve-isClosed POLY_vl)

	    (progn

		(if (= Hp "S") (command "_EXTRUDE" POLY "" (random H_min (1+ H_max))))

		(if (= Hp "N") (command "_EXTRUDE" POLY "" (random1 H_min (1+ H_max))))

            )

        )

    )

    (command "_UNDO" "_END")

)


(defun random (min max / #)

	(setq H 1)

        (while (/= (rem (- H H_min) 3) 0)

	    (setq H 

                (fix (+ min (* (- max min) (- (setq # (* 1000000 (getvar "cdate"))) (fix #)))))

	    )

	)    

)


(defun random1 (min max / #)

    (fix (+ min (* (- max min) (- (setq # (* 1000000 (getvar "cdate"))) (fix #)))))

)



Edited by GP.

Share this post


Link to post
Share on other sites

Ragazzi siete stupefacenti!!! il linguaggio lisp mi affascina moltissimo, ma per ora purtroppo ho poco tempo da dedicare, ma mi ci metterò. Per ora provo quello che mi avete consigliato di fare e vedo se risponde alle mie esigenze. Vi faccio sapere al più presto e se ho in caso suggerimenti da dare a riguardo. Vi ringrazio :rolleyes:

Share this post


Link to post
Share on other sites

Ragazzi devo dire OTTIMO lavoro!!! In pochi click sono riuscito ad avere quel risultato di cui avevamo bisogno senza uscire pazzi facendo polilinea per polilinea!

Piccola parentesi: il comando funziona solo con le polilinee, ho dovuto trasformare le regioni, prima esplodendole e poi usando _mpedit per ridefinirle. Certo ho 12g di ram e sto lavoro me l'ha fatto più o meno velocemente, ma si potrebbe aggiungere al comando anche la selezione di regioni? Poi ho riscontrato problemi con l'utilizzo della funzione interpiano abilitata, non so perchè, ma provando, a volte me lo faceva, ma molto spesso alla fine non estrudeva nulla, come se il comando non venisse eseguito fino in fondo. Disabilitando la funzione interpiano invece il risultato è ottimale, una sequenza random di estrusioni tra range min e range max.

Share this post


Link to post
Share on other sites

Ora "dovrebbe" funzionare bene anche con le regioni e l'interpiano. :)



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;; Estrusione di Regioni e Polilinee chiuse ;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


(defun C:ESTR (/ SEL n OGG OGG_vl H Hp1 tipo_OGG) 

    (vl-load-com) 

    (command "_UNDO" "_BEGIN")

    (setq cmd (getvar "cmdecho"))

    (setvar "cmdecho" 0)    

    (setq H_min (getint "\nInserire l'altezza minima: ")) 

    (setq H_max (getint "\nInserire l'altezza massima: ")) 

    (if (= Hp nil) (setq Hp "S")) 

    (initget "S N") 

    (prompt "\nInterpiano di 3 mt. (a partire dal più basso)  <") 

    (prompt (strcase Hp)) (prompt "\>    ")             

    (initget "S N") 

    (setq Hp1 (getkword ))               

    (if (/= Hp1 nil) (setq Hp Hp1))     

    (setq SEL (ssget '((0 . "POLYLINE,LWPOLYLINE,REGION")))) 

    (repeat (setq n (sslength SEL)) 

        (setq OGG (ssname SEL (setq n (1- n)))) 

        (setq OGG_vl (vlax-ename->vla-object OGG))

	(setq tipo_OGG (vlax-get OGG_vl 'ObjectName))

	(if (or

		(= tipo_OGG "AcDbRegion")

		(and

		    (vl-position tipo_OGG '("AcDbPolyline" "AcDb2dPolyline" "AcDb3dPolyline"))

		    (vlax-curve-isClosed OGG_vl)

		)

            )

            (progn 

                (if (= Hp "S") (command "_EXTRUDE" OGG "" (random H_min (1+ H_max)))) 

                (if (= Hp "N") (command "_EXTRUDE" OGG "" (random1 H_min (1+ H_max)))) 

            ) 

        ) 

    )

    (setvar "cmdecho" cmd)

    (command "_UNDO" "_END") 

) 


(defun random (min max / #) 

        (setq H 100.5) 

        (while (/= (rem (- H H_min) 3) 0) 

            (setq H  

                (fix (+ min (* (- max min) (- (setq # (* 1000000 (getvar "cdate"))) (fix #))))) 

            ) 

        )     

) 


(defun random1 (min max / #) 

    (fix (+ min (* (- max min) (- (setq # (* 1000000 (getvar "cdate"))) (fix #))))) 

)



Edited by GP.

Share this post


Link to post
Share on other sites
Ora "dovrebbe" funzionare bene anche con le regioni e l'interpiano

Senza condizionale: funge, ma solo a condizione d'inserire un Enter come sopra (provato con Map2006).

Giusto per "caramellare" la ciliegina sulla torta: potresti imporre che l'input di altezza massima sia maggiore della minima?

Ad es., se gli dai min=5 e max=2 il programma non s'arrabbia (e non mi sorprende, visto che l'autore e' un pezzo di pane come Te).

smile.gif

Share this post


Link to post
Share on other sites

La versione caramello, con il controllo sull'inserimento delle altezze.

Per l'enter, hai ragione, sono riuscito a provare su Acad2006 e si è arrabbiato.

Ho inserito un controllo sulla versione, se ante 2007 inserisce l'enter, dando per scontato che da tale versione funzioni anche senza, ma questo ce lo potrà dire chi la usa. B)



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;; Estrusione di Regioni e Polilinee chiuse ;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


(defun C:ESTR (/ SEL n OGG OGG_vl H Hp1 tipo_OGG) 

    (vl-load-com) 

    (command "_UNDO" "_BEGIN")

    (setq cmd (getvar "cmdecho"))

    (setvar "cmdecho" 0)

    (prompt "\n ")

    (initget 7)

    (setq H_min (getint "\nInserire l'altezza minima: ")) 

    (setq H_max (getint "\nInserire l'altezza massima: "))

    (if (<= H_max H_min)

	(while (<= H_max H_min)

	    (prompt "\n ")

	    (princ "\nIl valore deve essere superiore a ")

	    (prompt (itoa H_min)) (prompt " (altezza minima)  ")

	    (setq H_max (getint "\nInserire l'altezza massima: "))

	)

    )

    (if (= Hp nil) (setq Hp "S")) 

    (initget "S N") 

    (prompt "\nInterpiano di 3 mt. (a partire dal più basso)  <") 

    (prompt (strcase Hp)) (prompt "\>    ")             

    (initget "S N") 

    (setq Hp1 (getkword ))               

    (if (/= Hp1 nil) (setq Hp Hp1))     

    (setq SEL (ssget '((0 . "POLYLINE,LWPOLYLINE,REGION")))) 

    (repeat (setq n (sslength SEL)) 

        (setq OGG (ssname SEL (setq n (1- n)))) 

        (setq OGG_vl (vlax-ename->vla-object OGG))

	(setq tipo_OGG (vlax-get OGG_vl 'ObjectName))

	(if (or

		(= tipo_OGG "AcDbRegion")

		(and

		    (vl-position tipo_OGG '("AcDbPolyline" "AcDb2dPolyline" "AcDb3dPolyline"))

		    (vlax-curve-isClosed OGG_vl)

		)

            )

            (progn 

                (if (= Hp "S") (command "_EXTRUDE" OGG "" (random H_min (1+ H_max))

					(if (< (atoi (getvar "ACADVER")) 17) ""))) 

                (if (= Hp "N") (command "_EXTRUDE" OGG "" (random1 H_min (1+ H_max))

					(if (< (atoi (getvar "ACADVER")) 17) ""))) 

            ) 

        ) 

    )

    (setvar "cmdecho" cmd)

    (command "_UNDO" "_END") 

) 


(defun random (min max / #) 

        (setq H 100.5) 

        (while (/= (rem (- H H_min) 3) 0) 

            (setq H  

                (fix (+ min (* (- max min) (- (setq # (* 1000000 (getvar "cdate"))) (fix #))))) 

            ) 

        )     

) 


(defun random1 (min max / #) 

    (fix (+ min (* (- max min) (- (setq # (* 1000000 (getvar "cdate"))) (fix #))))) 

)


(prompt "\n ") (prompt "\n ") (prompt "\n ")

(princ "\nEstrusione di Regioni e Polilinee chiuse.")

(princ "\nDigitare ESTR per lanciare il Lisp ")

(princ)

Share this post


Link to post
Share on other sites

Per gli appassionati, consiglio di eseguire la routine in vista assonometrica con _SHADEMODE settato su Gouraud+Edges, in modo da veder letteralmente "crescere" gli edifici come funghi.

A titolo di curiosita', mentre l'ultima versione "random" estrude uno dopo l'altro i contorni in tempo reale, la primissima legata alla radice quadrata dell'area li renderizza tutti assieme alla fine: perche' avviene questo..?

Caro GP, ancora complimenti! applausi.gif

Share this post


Link to post
Share on other sites

Grazie. :)

Credo quell'effetto si manifesti in relazione al tipo di visualizzazione e al numero di elementi da processare.

Sembra non succedere in Wireframe, mentre in ombreggiata il pc dopo un po' pare "freezare" nell'attesa dei calcoli e spara tutto alla fine.

Sarà un problema di scheda video.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...