Gli Script

Se è possibile e gradito proseguo con i post anche se saranno a rilento , poi se trovo grosse difificolta cosa probabile mi servira piu tempo .

Sicuramente ho l idea ma non idea di cosa mi aspetta :rofl: :rofl:

Ciao e grazie

1 Mi Piace

In caso di difficolta’, se ti va fai un fischio … :slightly_smiling_face:

Ciao

1 Mi Piace

Step uno , , lascio l aggiunta che ho fatto come script , cè la scelta di creare un piano oppure no e se si crea il piano lo rendo corrente e la forma che esce dal tuo codice Emilio dall apertura del file txt è sul piano creato.

Per creare piano conferma con s o S

Ci saranno sicuramente punti da rivedere visto l esperienza vado per quel che comprendo al volo qua e la e metto insieme ma ovviamente non cè nessun tipo di padronanza con Python al momento.

Ciao Grazie

Ecco il codice script :slight_smile:

NOn riesco a caricare il codice qui come font , carico il file python

Test Piani.py (3,9 KB)

Porco cane mi sono sbagliato test layer :cold_face: :cold_face: :cold_face: :cold_face: :cold_face: :cold_face: :cold_face:

Ciao Grazie

Bisogna scrivere prima dello script una linea:

``` python

e dopo lo script:

```

Gli apostrofi sono dei caratteri ‘backtick’, o ‘grave accent’: codice U+0066

Copio qui sotto lo script:


import rhinoscriptsyntax as rs

# Chiedi all'utente se desidera creare un nuovo layer
crea_nuovo_layer = rs.GetString("Vuoi creare un nuovo layer? (Sì/No)")

# Procedi solo se l'utente risponde "S" o "s"
if crea_nuovo_layer.lower() == 's':
    # Richiesta  all'utente di inserire un nome per il nuovo layer
    nome_layer = rs.GetString("Inserisci il nome del nuovo layer")

    # Verifica se l'utente ha inserito un nome
    if nome_layer:
        # Crea il nuovo layer se non esiste già 
        if not rs.IsLayer(nome_layer):
            rs.AddLayer(nome_layer)
            print("Layer '{}' creato con successo.".format(nome_layer))
        else:
            print("Layer '{}' esiste già .".format(nome_layer))
        
        # Rendi il nuovo layer il layer corrente
        rs.CurrentLayer(nome_layer)
        print("Layer '{}' è ora il layer corrente.".format(nome_layer))
    else:
        print("Operazione annullata: nessun nome inserito per il layer.")
else:
    print("Creazione del nuovo layer annullata dall'utente.")

#inizio funzione
def main():
    #rhinoscriptsyntax abbreviato rs
    name = rs.OpenFileName( 'File da leggere ?' )
    #condizione 
    if not name:
        return
        #apertura file tramite object
    file = open( name, 'r' )
    # Con il metodo read del file object leggiamo il contenuto del file
    text = file.read()
    # lo salviamo nella stringa text
    text = text.strip()
    # Ricaviamo varie linee di testo da text con metodo split delle stringhe
    # passiamo il carattere newline come separatore tra le linee
    lines = text.split( '\n' )
    # viene definito una variabile nome per riga file di importazione
    rad = [] # 
    lng = [] # lunghezza asse tronco di cono
    deg = [] # grado inclizazione 
    # Usiamo un ciclo for e una variabile cnt
    # come contatore per elencare le linee di testo lette
    for line in lines:
        # Creazione lista con le stringhe ottenute scomponendo stringa originale wrd
        wrd = line.strip().split( ',' )
        # lista di numeri ottenuti floating-point
        num = [ float( wr ) for wr in wrd ]
        # prendo valore primo 0 dalla lista , diametro 1 e trovo raggio
        rad.append( num[ 0 ] / 2 ) 
        # prendo valore 1 dalla lista ,lunghezza  
        lng.append( num[ 2 ] )
        # prendo il valore quattro 3 dalla lista , angolo piega
        deg.append( num[ 3 ] )
        # prendo valore secondo 1 dalla lista ,diametro 2 e trovo raggio 
    rad.append( num[ 1 ] / 2 )
################
    # controllo
    # print manda il testo alla command area di Rhino
    # Qui salviamo i dati su 3 liste
    # print( 'rad: ' + str( rad ) )
    # print( 'lng: ' + str( lng ) )
    # print( 'deg: ' + str( deg ) )
################
# arot angolo di rotazione line asse altezza cono
# crot angolo di rotazione cerchio
    sucnt = len( lng )
    arot = [ deg[ 0 ] ]
    for ix in range( 1, sucnt ):
        arot.append( arot[ -1 ] + deg[ ix ] )
        # primo valore in tabella
    crot = [ arot[ 0 ] ]
    for ix in range( sucnt - 1 ):
        crot.append( ( arot[ ix ] + arot[ ix + 1 ] ) / 2 )
    crot.append( arot[ -1 ] )

# controllo
    xax = [ 1, 0, 0 ]
    zax = [ 0, 0, 1 ]
    # usiamo la lista  per salvare i centri dei cerchi ,primo valore 0,0,0
    ccen = [ [ 0, 0, 0 ] ]
    for ix in range( sucnt ):
        vec = rs.VectorRotate( xax, arot[ ix ], zax )
        vec = rs.VectorScale( vec, lng[ ix ] )
        pnt = rs.VectorAdd( ccen[ -1 ], vec )
        ccen.append( pnt )
    cen = [ 0, 0, 0 ]
    pla = rs.WorldYZPlane()
    circ = []
    for ix in range( sucnt + 1 ):
        cir = rs.AddCircle( pla, rad[ ix ] )
        cir = rs.RotateObject( cir, cen, crot[ ix ], zax )
        cir = rs.MoveObject( cir, ccen[ ix ] )
        circ.append( cir )
    sur = []
    for ix in range( sucnt ):
        sur.append( rs.AddLoftSrf( [ circ[ ix ], circ[ ix + 1 ] ] )[ 0 ] )
    rs.DeleteObjects( circ )
main()

Cavoli !
Sembri gia’ esperto di Python, anche di rhinoscriptsyntax …

Tra poco tocchera’ a te rispondere per gli script sul forum. :grinning:

Dove ? Non l’ho visto … :confused:

Ciao

1 Mi Piace

Ma va figurati ci provo , solo non volevo ficcare troppo dentro il naso poi mi applico perchè mi piace e qualcosina ne esce ma , mi sa una botta di fortuna , anche se avevi fatto tutto tu anche con i Layer per cui non era molto da fare.

Appena riesco vediamo lo step 2 ma ci sentiamo sta volta fra 20 giorni mi sa :rofl: :joy: alternando con il progetto con la forma malefica …

CIao grazie

1 Mi Piace

Se prima parlavi dei caratteri ‘strani’, prova a inserire questa come primissima linea del file:

# -*- coding: utf8 -*-

Io … da buon pigro :smile: … aggiro il problema sul nascere:
utilizzo la tastiera USA, la trovo molto piu’ comoda per programmare.
Tanto per l’italiano l’unica aggiunta sono gli accenti … e per quello continuo a usare l’apostrofo come si faceva negli anni '80 con gli home computers.

:grinning:

Si vede. :slight_smile:

… Speriamo prima, comunque buon lavoro !

Ciao

1 Mi Piace

Grazie per il sostegno a presto.

Ciao

1 Mi Piace

… P.S.

Vedrai poi che con RhinoCommon c’e’ da divertirsi. :grinning:

/ P.S.

1 Mi Piace

Ti prendo in parola , grazie , nei momenti di pausa passo al notebook e curioso il progetto Script , ho una domanda da fare sullo script che hai fatto , sull importazione dati numerici dal file txt.
Cè la possibilità di inserire una riga di commento come promemoria nel file di importazione anche a meta dati ?
Oppure va fatta una condizione che se il valore è stringa allora è falso , per cui viene non considerata come valore da importare ?

Ciao Grazie e buona Domenica

Si’ a entrambe le domande … :wink:

Se il commento inizia con una lettera, potresti utilizzare str.isalpha()
Vedi qui:
5. Built-in Types — Python 2.7.18 documentation.
Io separerei nello script le due operazioni di strip() e split() qui:

        wrd = line.strip().split( ',' )

Prima eseguo solo strip, poi prendo il primo carattere dalla stringa indicizzando e controllo se e’ una lettera, tipo (non testato):
( split lo eseguo poi in seguito )

        wrd = line.strip()
        if wrd[ 0 ].isalpha():
            continue

l’istruzione continue salta alla prossima iterazione del ciclo:
https://docs.python.org/2.7/reference/simple_stmts.html#the-continue-statement

Ma certo si puo’ fare in diversi altri modi. :slight_smile:

Se non e’ chiaro, chiama.

Ciao, buona domenica.

1 Mi Piace

Grazie per le indicazioni , ci farò un pò di prove , come vedi vado con calma la rotazione la vedremo al momento che il frutto è maturo.
Sei proprio esperto , probabile in giornata che ci faccio qualche prova ,

Sicuramente no so se riesco al volo , ma come mi hai gia fatto comprendere se non ti applichi non impari per cui , ci provo , la testa è dura per cui avanti.

Molte grazie

DIciamo che sarebbe utile avere circa 4 commenti in modo non statico come posizione .

Ciao Grazie

Ormai essere esperti di un linguaggio e’ cosa per pochi.
I linguaggi sono diventati enormi (la maggior parte).
Ma per fortuna li puoi usare anche senza conoscerli bene.
Impari quello che ti serve e che preferisci usare.
E’ il vantaggio di essere hobbista … fai quello che ti pare. :grinning:
E farsi gli script per il CAD e’ come essere hobbista … :wink:

Be’, la procedura a cui ho accennato sopra e’ indipendente da numero e posizione delle righe di commento.

Ciao

Scusa, dimenticavo una cosa …
Se nel ciclo di lettura a un certo punto facciamo riferimento al primo caratterre della stringa, cioe’

wrd[ 0 ]

Quel carattere deve esserci, se no abbiamo un errore.
Quindi penso sia meglio, prima di quel riferimento, controllare che la stringa non sia vuota.
Nel caso ci fossero linee bianche nella nostra tabella.
Si puo’ fare in diversi modi, come:

if( wrd == '' ):
    continue

oppure puoi controllare la lunghezza della stringa:

if( len( wrd ) == 0 ):

ma si puo’ anche utilizzare il fatto che nella condizione di un if, Python converte tutto in bool, quindi scrivere solo:

if( not wrd ):

Dato che la stringa vuota come bool vale False.

Ciao

1 Mi Piace

Sicuramente , concordo.

Ok allora ottimo , avevo capito che verificava solo la prima riga.

CIao Grazie

No, quanto detto sopra si intende inserito nel ciclo di lettura della tabella.

Ciao

1 Mi Piace

Per inserire righe di commento io con GH farei così.
Mi sembra sia facilmente traducibile in uno script.

2 Mi Piace

Emilio, (probabile che ricordo male o spero di non confondermi con C#)
ma anche in Py non c’era quella funzione/metodo che provava un input utilizzando “?” ?

1 Mi Piace

Ciao Salvio

Mi sa che questa cosa non la ricordo, o non la conosco … :blush:.
Hai un esempio ?. :slightly_smiling_face: