Il free-form non e’ il mio campo, pero’ …
L’idea di Rino la trovo molto interessante …
… se non altro per giocarci un po’
Ho buttato giu’ un mezzo script che, dato il poco tempo, tanto per provare si limita a prendere l’elenco dei raggi di curvatura da una lista inserita nello script stesso ( sorry … )
Gli si da’ la lunghezza degli archi approssimanti ( con L=~50 si capisce qualcosa … ) e lui disegna la sequenza di archi.
E’ solo una prova … volendo si puo’ poi provare ad usare gli archi o i loro punti medi per costruire una curva con metodi vari.
… Curva che credo alla fine avra’ comunque parecchi CV … ahi ahi ahi … ma questo problema lo lascio a voi esperti.
A me da’ l’idea che la cosa sarebbe adatta a GH ( o viceversa, va beh … ), No ?
Certo, come dici giustamente, disegnare direttamente la curva pare arduo.
Pero’ forse per imbastire delle curve-test o curve-guida potrebbe essere utile … mah.
Qui c’e’ lo script
import math
import rhinoscriptsyntax as rs
import Rhino
def planefromxz( pnt, xax, zax ):
yax = rs.VectorRotate( xax, 90, zax )
return rs.PlaneFromFrame( pnt, xax, yax )
def planefromyz( pnt, yax, zax ):
xax = rs.VectorRotate( zax, 90, yax )
return rs.PlaneFromFrame( pnt, xax, yax )
def dracrvax( cur, leng ):
pt = rs.CurveMidPoint( cur )
uu = rs.CurveClosestPoint( cur, pt )
mip = rs.EvaluateCurve( cur, uu )
tan = rs.CurveTangent( cur, uu )
vec = rs.VectorRotate( tan, 90, [ 0, 0, 1 ] )
p0 = mip - ( vec * ( leng / 2.0 ) )
p1 = mip + ( vec * ( leng / 2.0 ) )
gid = rs.AddLine( p0, p1 )
def draarc( pnt, tan, rad, leng ):
sik = cmp( rad, 0 )
rad = abs( rad )
rads = leng / rad
degs = math.degrees( rads )
tan2 = rs.VectorRotate( tan, degs, [ 0, 0, 1 ] )
len2 = rad * math.tan( rads / 2.0 )
pnt2 = pnt + ( tan * len2 )
pnt3 = pnt2 + ( tan2 * len2 )
toc = rs.VectorRotate( tan, -90 * sik, [ 0, 0, 1 ] )
cen = pnt + ( toc * rad )
pla = planefromyz( cen, tan, [ 0, 0, -1 * sik ] )
gid = rs.AddArc( pla, rad, degs )
return gid
def dranexarc( arc, rad, leng ):
u0, u1 = rs.CurveDomain( arc )
p1 = rs.CurveEndPoint( arc )
t1 = rs.CurveTangent( arc, u1 )
return draarc( p1, t1, rad, leng )
def draprearc( arc, rad, leng ):
u0, u1 = rs.CurveDomain( arc )
p0 = rs.CurveStartPoint( arc )
t0 = rs.CurveTangent( arc, u0 )
return draarc( p0, -t0, -rad, leng )
def dranexarcbak( arc, rad, leng ):
u0, u1 = rs.CurveDomain( arc )
p1 = rs.CurveEndPoint( arc )
t1 = rs.CurveTangent( arc, u1 )
return draarc( p1, -t1, rad, leng )
def draprearcbak( arc, rad, leng ):
u0, u1 = rs.CurveDomain( arc )
p0 = rs.CurveStartPoint( arc )
t0 = rs.CurveTangent( arc, u0 )
return draarc( p0, t0, -rad, leng )
def main():
col = [ [ 31, 31, 255 ], [ 31, 255, 31 ] ]
le = rs.GetReal( 'Length ?' )
ras = [ 100, 90, 80, 75, 80, 90, 100 ]
arc = draarc( Rhino.Geometry.Point3d.Origin,
Rhino.Geometry.Vector3d( 0, -1, 0 ),
-ras[ 0 ], le / 2.0 )
noarc = arc
cnt = 0
arc = dranexarcbak( arc, ras[ 0 ], le )
rs.ObjectColor( arc, col[ cnt % 2 ] )
rs.AddPoint( rs.CurveMidPoint( arc ) )
dracrvax( arc, le / 2.0 )
for ra in ras[ 1 : ]:
cnt += 1
arc = dranexarc( arc, ra, le )
rs.ObjectColor( arc, col[ cnt % 2 ] )
rs.AddPoint( rs.CurveMidPoint( arc ) )
dracrvax( arc, le / 2.0 )
rs.DeleteObject( noarc )
main()
Ciao ragazzi !