Gli Script

No ho sbagliato io.
In ogni caso leggi il Readme.
La configurazione che ho io è questa:

File Pufferfish3-0.gha
Cartella C:\Users\(utente)\AppData\Roaming\Grasshopper\Libraries\

Files .ghuser
Cartella C:\Users\(utente)\AppData\Roaming\Grasshopper\UserObjects\

1 Mi Piace

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 ?


Osservazione personale da Neofita di GH , mi sembra piuttosto complicato riuscire ad imparare i vari connettori dei vari moduli delle funzioni ,

Ciao grazie

Puoi esportare in Rhino qualunque geometria semplicemente cliccando sul componente che la produce col tasto destro, quindi cliccare Bake.

1 Mi Piace

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.

Salvataggio eseguito , fantastico molto bello . Molte Grazie Ciao

Nell ambiente GH si possono utilizzare tutti i comandi presenti in Rhino , oppure solo qualcuno supportati tipo la storia ?
Probabilmente sarà una domanda banale…

Ciao Grazie

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 :wink: )

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 :slight_smile:

Ciao.

1 Mi Piace

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…

Le variabili sono autodefinite ? Non serve dichiararle come stringhe , intere o reali ?

Ciao molte Grazie per la super spiegazione molto ben dettagliata

1 Mi Piace

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.

In alternativa, anche Python ha una funzione map

https://docs.python.org/2/library/functions.html#map

(come sempre, se servisse una dritta, dimmelo)

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.

Ciao

1 Mi Piace

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 ?

Ciao Grazie

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

Figurati !
Decidi tu cosa vuoi fare e quando. :slight_smile:

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
Buona domenica !

1 Mi Piace

Ok , ottimo va benissimo , comunque gli do un occhiata e mi documento su Map, sintassi procedura etc… che male non mi fa.

Grazie Ciao

1 Mi Piace

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 ?

Ciao Grazie

C’e’ il debugger di EditPythonScript, nel menu c’e’ una voce Debug.
Ma purtroppo non lo conosco … sono abituato ai print. :blush:
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 :wink: ).
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 :slight_smile:

1 Mi Piace

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 :cold_sweat: :cold_sweat: :cold_sweat:.

Sta sera ci guardo e faccio la prova sicuramente …

Ciao e Grazie

Pochissimo.
Ricordo solo un paio di brevi script per Windows.
Uno con Tkinter e l’altro con WX.

Dicevo che non uso EditPythonScript per gli script per Rhino, quindi lo conosco poco.

Non c’e’ nessun problema con le domande.
Casomai con le risposte. :wink:

Se una domanda richiede una risposta breve, la risposta che scrivo io puo’ essere sufficiente per capire la questione.

Se invece si tratta di un argomento un po’ piu’ ampio, non sono assolutamente in grado di competere con la documentazione … :blush:
:smile:

Ciao

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…

Ciao grazie