Cerchi decrescenti su un percorso

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)
img1

2 Mi Piace

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)

img1

2 Mi Piace

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 … :wink:
( 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. :smile:

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 … :blush:

( Testato su Rhino 6 )

1 Mi Piace

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)

4 Mi Piace

Bravo Leo! :clap: :clap: :clap:

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 :joy: :joy: :rofl:
Come dice (diceva tempo fa …) @lucio_zadra: prepara i pop corn!
:rofl: :rofl: :rofl:

2 Mi Piace

Hehe … provero’ a impegnarmi maggiormente …
:confused: :smile:

1 Mi Piace

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 … :grinning:

Io provo con gli script perche’ con GH annaspo e non ho pazienza … :smile:

Ma fare una cosa piu’ seria tramite script, che consenta di cambiare alcuni parametri e vedere una preview ( in pratica quello che fa GH :slight_smile: ), sarebbe un lavoraccio, almeno per come la vedo io. :unamused:

2 Mi Piace

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 :confused:

eeee sarebbe carina la cosa :+1:

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 ! :grinning: :wink:

Alternativa con Flow.
spirale b.gh (13,0 KB)
img1

5 Mi Piace

magari :+1:

1 Mi Piace