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
Ciao e grazie
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
Ciao e grazie
In caso di difficolta’, se ti va fai un fischio …
Ciao
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
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
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.
Dove ? Non l’ho visto …
Ciao
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
alternando con il progetto con la forma malefica …
CIao grazie
Se prima parlavi dei caratteri ‘strani’, prova a inserire questa come primissima linea del file:
# -*- coding: utf8 -*-
Io … da buon pigro … 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.
Si vede.
… Speriamo prima, comunque buon lavoro !
Ciao
Grazie per il sostegno a presto.
Ciao
… P.S.
Vedrai poi che con RhinoCommon c’e’ da divertirsi.
/ P.S.
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 …
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.
Se non e’ chiaro, chiama.
Ciao, buona domenica.
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.
E farsi gli script per il CAD e’ come essere hobbista …
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
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
Per inserire righe di commento io con GH farei così.
Mi sembra sia facilmente traducibile in uno script.
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 “?” ?
Ciao Salvio
Mi sa che questa cosa non la ricordo, o non la conosco … .
Hai un esempio ?.