Buonasera a tutti,
vorrei realizzare una spirale o comunque un percorso su cui si dispongono in sequenza dei cerchi ad una data distanza che vanno da un diametro massimo ad uno minimo ma non ho idea di come fare.
In pratica è un Array Along curve, però i cerchi dovrebbero crescere o decrescere in modo costante da inizio a fine della curva, impostando il diametro d’inizio e quello di fine.
Qualcuno ha qualche idea?
serie circ.gh (12,8 KB)
Sei stato velocissimo Leo, grazie!
Mi chiedevo, se si potesse fare su una spirale però in GH non la trovo…
Non è un granché.
spirale.gh (13,3 KB)
Grazie come sempre Leo!
Option Explicit
Call Main()
Sub Main()
'SELEZIONE DEL PERCORSO
Dim obj: obj = rhino.GetObject("selezione la curva", 4)
If isnull(obj) Then
rhino.Print "Comando annullato."
Exit Sub
End If
'RAGGIO INIZIALE
Dim r0: r0 = rhino.GetReal("Raggio iniziale", 1, rhino.UnitAbsoluteTolerance())
If Not isnumeric(r0) Then
rhino.Print "Comando annullato."
Exit Sub
End If
'RAGGIO FINALE
Dim r1: r1 = rhino.GetReal("Raggio finale", 1, rhino.UnitAbsoluteTolerance())
If Not isnumeric(r1) Then
rhino.Print "Comando annullato."
Exit Sub
End If
'NUMERO DI CERCHI
Dim n: n = rhino.GetInteger("Numero di cerchi", 2, 2)
If Not isnumeric(n) Then
rhino.Print "Comando annullato."
Exit Sub
End If
Dim pts: pts = Rhino.DivideCurve(obj, n)
Dim i,Plane,r
'DISEGNO DEI CERCHI
For i=0 To ubound(pts)
Plane = Rhino.MovePlane(Rhino.ViewCPlane, pts(i))
r = r0 + (r1 - r0) * i / (n)
rhino.AddCircle Plane, r
Next
End Sub
Soluzione in rhinoscript.
Alternativa in ambito script …
( Ma avviso subito che quello di Sergio e’ piu’ comodo da usare )
Una cosa piu’ generica, come da mia mania … : scalare oggetti lungo una curva.
Quindi i cerchi e la curva su cui giacciono vanno disegnati prima.
import rhinoscriptsyntax as rs
def main():
obs = rs.GetObjects( 'Objects to scale ?', preselect = True )
rs.UnselectAllObjects()
cu = rs.GetObject( 'Curve ?' )
tus = []
for ob in obs:
ps = rs.BoundingBox( ob )
cb = ( ps[ 0 ] + ps[ 6 ] ) * 0.5
uu = rs.CurveClosestPoint( cu, cb )
tus.append( ( uu, ob, cb ) )
tus.sort()
sc0 = rs.GetReal( 'Scale factor for first object ?', 1.0 )
sc1 = rs.GetReal( 'Scale factor for last object ?', 0.1 )
u0 = tus[ 0 ][ 0 ]
u1 = tus[ -1 ][ 0 ]
for tu in tus:
uu, ob, cb = tu
uf = ( uu - u0 ) / ( u1 - u0 )
sca = sc1 * uf + sc0 * ( 1.0 - uf )
rs.ScaleObject( ob, cb, ( sca, sca, sca ) )
main()
E’ uno script molto grezzo … oltre che incomprensibile, come dice il mio amico Sergio.
Bisogna selezionare gli oggetti da scalare (qui i cerchi)
E poi la curva su cui sono disegnati.
Infine digitare la scala per primo e ultimo oggetto.
Orientamento della curva a cura di chi usa lo script …
( Testato su Rhino 6 )
Mi sembra interessante distanziare i cerchi in base al loro diametro in modo da non lasciare troppi spazi vuoti.
Forse con uno script si riesce a fare meglio.
spirale a.gh (19,2 KB)
Spirale.gha (21 KB)(segnalato da Salvio)
Bravo Leo!
Mmm … non direi @emilio! Sarà che hai scritto il codice in un unica soluzione.
La tua cripticità si eleva a livelli degni del miglior offuscatore quando definisci
più def: secondarie
Come dice (diceva tempo fa …) @lucio_zadra: prepara i pop corn!
Hehe … provero’ a impegnarmi maggiormente …
Ciao Leopoldo.
Personalmente questo mi sembra un problema adatto a GH.
Ci consente di cambiare, ad esempio, numero dei cerchi o distanza, nonche’ diametri e volendo anche la curva base, e poi vedere cosa succede …
Io provo con gli script perche’ con GH annaspo e non ho pazienza …
Ma fare una cosa piu’ seria tramite script, che consenta di cambiare alcuni parametri e vedere una preview ( in pratica quello che fa GH ), sarebbe un lavoraccio, almeno per come la vedo io.
in Python usando ETO con i control slider?
(Emilio, giusto per parlare)
alternativa senza ETO:
creare un loop dove di ripetono i vari parametri che si possono modificare
quindi ad ogni modifica si cancella tutto quello fatto in precedenza
e viene ricreata la forma nuova con i nuovi parametri inseriti. . .
ma come funziona lo script?
Volendo, certo.
Oppure si possono usare anche delle semplici opzioni con un input Rhino.Input.Custom, editando i valori numerici e vedendo la preview con un DisplayConduit … credo
Questo:
DisplayConduit Class (rhino3d.com)
Mi sembra un argomento un po’ complesso per chi inizia con RhinoCommon …
Se ti interessa provo a cercare se trovo qualche script di esempio … ma non prometto !
Alternativa con Flow.
spirale b.gh (13,0 KB)
magari