Ciao
Vediamo qualche operazione in piu’ per lo script:
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 )
################
sucnt = len( lng )
arot = [ deg[ 0 ] ]
for ix in range( 1, sucnt ):
arot.append( arot[ -1 ] + deg[ ix ] )
crot = [ arot[ 0 ] ]
for ix in range( sucnt - 1 ):
crot.append( ( arot[ ix ] + arot[ ix + 1 ] ) / 2 )
crot.append( arot[ -1 ] )
# controllo
print( 'arot: ' + str( arot ) )
print( 'crot: ' + str( crot ) )
main()
Eravamo rimasti con le variabili rad , lng e deg conteneti i valori per:
raggio della circonferenza
lunghezza del tratto
angolo rispetto al tratto precedente
Per disegnare il condotto ci servono le circonferenze.
Che potremo disegnare tramite rhinoscriptsyntax con:
RhinoScriptSyntax
Sorry, we were unable to generate a preview for this web page, because the following oEmbed / OpenGraph tags could not be found: description, image
I cerchi possiamo disegnarli gia’ nella giusta posizione oppure disegnarli tutti, ad esempio, sull’origine e poi spostarli e ruotarli.
Lo script sceglie questa seconda via, quindi ci servireranno altre due funzioni rhinoscriptsyntax:
RhinoScriptSyntax
Sorry, we were unable to generate a preview for this web page, because the following oEmbed / OpenGraph tags could not be found: description, image
e
RhinoScriptSyntax
Sorry, we were unable to generate a preview for this web page, because the following oEmbed / OpenGraph tags could not be found: description, image
In ogni caso, ci serviranno orientamento e posizione dei vari cerchi.
Per salvare questi valori useremo altre due variabili:
arot che rappresenta l’angolo di cui va ruotato l’asse del nostro tratto di condotto,
crot che rappresenta l’angolo di cui va ruotato il cerchio.
Ovviamente ci sara’ un cerchio in piu’ rispetto ai tratti di condotto.
E dato che la tabella che hai postato fornisce un solo angolo, supponiamo che l’asse del condotto appartenga ad un piano.
Qui usiamo il piano XY e gli angolo li misuriamo antiorari visti da Z+ ruotando attorno all’asse Z rispetto all’asse delle X. Cioe’ questo angolo per l’asse delle X vale zero gradi.
Settiamo anche una variabile sucnt che contiene il numero delle superfici da disegnare, quindi dei tratti di condotto. Solo per comodita’.
Come primo valore della lista arot prendiamo l’inclinazione del primo tratto come da tabella:
crot = [ arot[ 0 ] ]
Qui inizializziamo la lista arot come una lista che contiene un solo valore: il primo valore di arot
Ora con un ciclo for calcoliamo i vari valori per l’angolo del tratto di condotto come l’angolo del tratto precedente piu’ il delta angolo fornito da deg
L’espressione:
arot[ -1 ]
rappresente l’ultimo valore della lista.
In Python se l’indice che usi e’ negativo, si calcola dalla fine della lista, con -1 che indica l’ultimo elemento, -2 il penultimo e cosi’ via.
L’espressione:
range( 1, sucnt )
rappresenta una lista di interi che inizia col valore 1 e termina con sucnt - 1
( con incremento uguale a 1 )
Popodiche’ passiamo a crot
Come primo valore prendiamo l’angolo dell’asse del primo tratto di condotto.
In modo che il cerchio sia normale all’asse del condotto.
Gli altri valori, tramite il solito ciclo for, li calcoliamo come la media tra l’angolo dell’asse del tratto precedente il cerchio e quello dell’asse del tratto successivo.
Dopo il ciclo aggiungiamo ancora l’angolo per il cerchio finale: uguale all’angolo dell’asse dell’ultimo tratto.
L’espressione:
range( sucnt - 1 )
rappresenta la lista di interi che inizia con zero e termina con sucnt - 2.
Sempre con incremento 1.
Per ora finiamo qui …
E facciamo il solito controllo stampando le due liste appena ricavate.
Ciao