Un informazione a riguardo di GH , il file creato segmenti.gh e nelle varie creazioni in Gh quando si crea l automazione se cosi si può chiamare la geometria che si genera è possibile poi salvarla per ambiente Rhino e averla dentro Rhino o è solamente visiva ?
Grazie 1000 ho sistemato l allocazione dei file e adesso non mi da piu errore , avevo provato a salvare a modo mio ma ovviamente non funzionava .
Grazie ancora delle spiegazioni.
Nell ambiente GH si possono utilizzare tutti i comandi presenti in Rhino , oppure solo qualcuno supportati tipo la storia ?
Probabilmente sarà una domanda banale…
Ora che abbiamo la possibilità di aprire il file txt , se la mia domanda è lecita e non troppo impegnativa ovviamente , i dati che si leggono nel file txt che abbiamo creato in modo che si gestiscono , vanno usati come valore ad ogni costruzione geometrica e si possono recuperare tramite locazione tipo posizione cella , o impostati come variabili oppure in altro modo ?
CIao Grazie
Si’, usiamo delle variabili, e usiamo la posizioni nelle linee di testo lette.
Qui ho aggiunto alcune istruzioni per ricavare i dati dal testo:
( Ovviamente questo e’ solo uno dei tanti modi di procedere )
import rhinoscriptsyntax as rs
def main():
name = rs.OpenFileName( 'File da leggere ?' )
if not name:
return
file = open( name, 'r' )
text = file.read()
text = text.strip()
lines = text.split( '\n' )
rad = []
lng = []
deg = []
for line in lines:
wrd = line.strip().split( ',' )
num = [ float( wr ) for wr in wrd ]
rad.append( num[ 0 ] / 2 )
lng.append( num[ 2 ] )
deg.append( num[ 3 ] )
rad.append( num[ 1 ] / 2 )
# controllo
print( 'rad: ' + str( rad ) )
print( 'lng: ' + str( lng ) )
print( 'deg: ' + str( deg ) )
main()
Come accennavo, in Python e’ comodo usare le liste.
Qui salviamo i dati su 3 liste. In particolare:
Una lista per i raggi iniziali e finali dei vari tratti.
Una per le lunghezze dei vari tratti
Una per l’angolo rispetto al tratto precedente
Le chiamiamo rad , lng e deg
La coppia di parentesi quadre [ ] indica la lista vuota.
Qui inizializziamo queste liste appunto come liste vuote.
Usiamo un ciclo for per processare tutte le linee di testo lette dal file.
La funzione split serve per scomporre una stringa in una lista di stringhe, fornendo la stringa di separazione tra i vari valori da ricavare.
Qui il separatore tra i vari numeri e’ la virgola split restituisce una lista contenente le stringhe ottenute scomponendo la stringa originale.
Questa lista la chiamiamo wrd
Ora usiamo la cosiddetta ‘list comprehension’ che in pratica fa il lavoro di un ciclo con una sola istruzione.
Usiamo la list comprehension perche’ l’operazione da fare nel ciclo e’ molto semplice: dobbiamo solo convertire le stringhe contenute in wrd in numeri.
(volendo, potremmo benissimo usare un ciclo, il risultato non cambia)
Se non sbaglio e’ l’operazione che in Lisp si fa con map.
Il risultato di questa operazione e’ una lista di numeri, in particolare numeri floating point, quindi decimali.
In Python questo tipo di dati si indica con float,
e qui la funzione float serve appunto a convertire (quando possibile) un valore in un numero floating point.
La sintassi della list comprehension non e’ di immediata comprensione, secondo me.
Bisogna studiarsela un poco. ( In Lisp e’ piu’ semplice )
EDIT:
Dimenticavo: i numeri li salviamo nella lista num.
Essendoci 4 numeri in ogni linea di testo, ogni lista conterra’ 4 valori: num[ 0 ] , num[ 1 ] , num[ 2 ] , num[ 3 ] (vedi sotto)
/EDIT
Ottenuti i numeri dalla linea di testo, li salviamo nelle nostre 3 liste rad , lng e deg.
La funzione append serve ad aggiungere un valore in fondo ad una lista.
La indicizzazione tramite indice scritto tra parentesi quadre ( ad esempio [ 0 ] ) e’ il modo di Python di accedere ai vari elementi contenuti nella lista.
Gli indici partono da zero, cioe’ zero indica il primo elemento della lista.
Dato che abbiamo usato una sola lista per i raggi iniziali e finali dei vari tratti, per avere l’elenco completo dei raggi, finito il ciclo for aggiungiamo alla lista dei raggi il raggio finale dell’ultimo tratto, che mancava.
Per ora mi fermo qui.
Le istruzioni di controllo stampano semplicemente le 3 liste ottenute.
Come al solito, spiegazione stringatissima …
Per tutto cio’ che manca o non si capisce, chiedi pure
Nell esempio i valori sono numeri interi , i valori possono essere anche con almeno 1 decimale dopo la virgola tipo 30,2 come valore numerico della lista del file da importare nel caso serve per la definizione variabili.
Non posso che dare conferma , non è semplice se parti da solo poi devi studiare e starci sopra , sono cose che necessitano di tempo come su ogni cosa se dedichi impegno qualcosa si ottiene.
Ho aggiunto dei piccoli commenti per mè presi dalle tue preziose spiegazioni , che ovviamente devo apprendere per bene e completare…
Si’, hai ragione.
Ho preferito usare i float per poter utilizzare lo script anche in caso di valori decimali.
( Per i numeri interi il tipo Python e’ int )
Se vuoi puoi provare a sostituire la list comprehension con un ciclo.
Ottima idea, ovviamente.
Nel caso di questo ciclo non usiamo contatori perche’ non c’e’ bisogno.
In Python for cicla direttamente su una lista.
Qui il ciclo usa la variabile line caricandoci ad ogni iterazione un valore dalla lista lines
Il for di Python e’ simile al foreach di VBScript.
Esatto.
Quando serve una variabile, inizi a utilizzarla direttamente, senza bisogno di dichiarazioni.
Per cui se nel file txt avessimo anche 30 dati in ogni caso vengono memorizzati essendo liste e alla fine usate come valori per generare le geometrie .
Correggimi se ho capito male ?
Esatto, leggiamo tutte le linee dal file e tutti i dati saranno caricati nelle 3 liste.
Il numero di linee nel file puo’ essere diverso.
Le liste risulteranno piu’ lunghe o piu’ corte a seconda di quanti valori ci saranno nel file.
Non so detto in sincerita se ci riuscirei rapidamente , ma se vuoi posso provare se lo ritieni che debba esercitarmi su questa strada ci provo.
La cosa importante è il risultato finale poi il modo vada per meno complessità.
Capire i passaggi ovviamente lo ritengo importante altrimenti è come un copia e incolla …
Ciao e grazie Buona domenica
Esatto, ti ho accennato al for e a map per quello.
L’importante e’ sapere che ci sono alternative.
Se poi ti servisse o volessi cambiare, sai che si puo’ fare.
CIao Emilio , abbiamo un metodo di verificare il valore assegnato alla varabile all interno del codice o bisogna usare Print e verificarlo all esterno .
[quote=“emilio, post:68, topic:6079”]
Per tutto cio’ che manca o non si capisce, chiedi pure
Per cui ora che abbiamo i valori che sono memorizzati in variabili assegnate ad una lista vengono memorizzati in modo incrementale tipo rad1 rad2 rad3 lng1 lng2 …, oppure non ho capito un cavolo ?
C’e’ il debugger di EditPythonScript, nel menu c’e’ una voce Debug.
Ma purtroppo non lo conosco … sono abituato ai print.
e di solito non uso nemmeno EditPythonScrip … sorry.
Non uso i debugger, ma credo che funzionino grosso modo settendo dei punti in cui l’esecuzione si interrompe, e a quel punto hai modo di verificare il valore delle variabili.
Agli elementi contenuti in una lista in Python puoi accedere con una sintassi che prevede un indice (un numero intero) tra parentesi quadre.
E’ una cosa analoga alla Array di VBScript, che pero’ usano parentesi tonde.
Mi sembra che anche il Pascal usi le parentesi quadre per le array …
La variabile e’ una sola e contiene la lista (anche se ‘contiene’ non e’ la parola corretta per Python, ma ogin cosa a suo tempo ).
Dicevo: la variabile e’ unica, la lista e’ unica e contine diversi elementi (cioe’ valori)
Al primo elemento della lista accedi con la sintassi
num[ 0 ]
e cosi’ via.
Questa sintassi la usi per leggere il valore o per settarlo:
print( num[ 2 ] )
oppure
num[ 3 ] = 55
Trovi certo maggiori info ed esempi sulle liste nei vari tutorial e documentazione per Python
Programmi o hai programmato in Python , fuori Rhino ?
Ho visto che molti usano Visual studio Code , Anaconda ma non ho ancora avuto tempo di starci sopra , periodaccio …
Devo cominciare a guardarlo bene altrimenti , solo farti le domande non va bene .
Sta sera ci guardo e faccio la prova sicuramente …
Ne sai , ne sai altro che , io non so nulla a confronto , per cui ho solo da imparare .
Chi può competere con una documentazione scritta da 100 persone …, penso che per lo scopo che abbiamo posto come diciamo argomentazione , hai gia fatto molto ad aver preso i dati da un file esterno…