Ecco lo script completo:
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 ] )
xax = [ 1, 0, 0 ]
zax = [ 0, 0, 1 ]
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()
Qualche breve cenno sulle linee aggiunte dall’ultima volta (sperando di non fare errori) :
Con xax e zax definiamo due vettori che rappresentano l’asse X e l’asse Z
In rhinoscriptsyntax i vettori 3D sono rappresentati da liste con 3 componenti:
le componenti X, Y e Z del vettore.
Utilizziamo la lista ccen per salvare i centri dei cerchi, il primo valore e’ 0,0,0
In un ciclo calcoliamo il vettore spostamento tra un cerchio e il successivo.
In pratica corrisponde l’asse del nostro tratto di condotto.
Usiamo questo vettore per ottenere il centro del cerchio.
Ora definiamo il punto 0,0,0 come variabile cen, ci servira’ poi.
Ricaviamo anche il piano YZ tramite rhinoscriptsyntax e lo salviamo in pla, serivra’ anche lui.
Inizializziamo una lista circ per salvare i Guid dei cerchi.
rhinoscriptsyntax usa i Guid per identificare gli oggetti nel documento Rhino
Ora col penultimo ciclo disegniamo i cerchi:
Usiamo le tre funzioni rhinoscriptsyntax viste l’altra volta.
Per fare cio’ ruotiamo l’asse X dell’angolo opportuno e lo scaliamo secondo la lunghezza del nostro tratto di condotto.
Usiamo il vettore ottenuto per spostare il punto 0,0,0 e ottenere il centro del cerchio.
- Disegniamo un cerchio nel piano YZ, centrato sull’origine, dandogli il giusto raggio.
- Lo ruotiamo attorno all’asse Z
- Lo spostiamo nella giusta posizione
E salviamo il suo Guid nella lista circ
Usiamo la lista sur per salvare le superfici che disegneremo, nel caso serva poi avere questi dati.
Con l’ultimo ciclo, tramite la funzione
https://developer.rhino3d.com/api/RhinoScriptSyntax/#surface-AddLoftSrf
disegniamo i vari Loft tra le coppie di cerchi consecutivi.
Infne cancelliamo i cerchi usati per la costruzione con
https://developer.rhino3d.com/api/RhinoScriptSyntax/#object-DeleteObjects
Volendo potremmo poi unire le superfici in una unica polisuperficie, sfruttando i dati salvati in sur.
Se vuoi, vedi se lo script funziona e poi vai con le domande …
A me come primo script sembra MOLTO tosto …
Ciao