Script per fare una sfera per punti

Buongiorno Scriptomani!

in uno script python devo trovare il raggio di una sfera che passa per una lista punti . La sola cosa che mi e’ venuta in mente e’ di usare il command “_Sphere _FitPoints” passando una lista di punti creata in precedenza.
Mal me ne incolse !
Ho provato varianti in tutte le salse ma non ne esco e quindi vi chiedo aiuto .

ecco lo script

# una lista di punti ,
L1= [[0,0,0],[0,1,0],[1,0,0],[2,0.5,1],[-3,0,2]]

#trasforma la lista in un testo del tipo "0,0,0 0,1,0 etc "
n=0
for i in L1:
p= str(i[0]) + “,” +str(i[1]) + “,” + str(i[2])
punti = punti + " " + p
n=n+1

txt = "_Sphere _FitPoints " + L1
rs.Command(txt)

vi saluto caramente
franco

Seguito:

ho provato anche con rhino.common :
"
L2=[]

L2.append([0,0,0])
L2.append([0,1,0])
L2.append([1,0,0])
L2.append([2,0.5,1])
L2.append([-3,0,2])

S=rg.FitSphereToPoints(L2)
"

risultato :

Message: attribute ‘FitSphereToPoints’ of ‘namespace#’ object is read-only

Se richiami i comandi di rhino fuori dall’ambiente script devi passargli degli oggetti come se tu stessi disegnando; quindi prima crea i punti, poi li selezioni e lanci il comando sphere fit points.

Ciao Franco.

… Quanto a RhinoCommon :

import Rhino

a = Rhino.Geometry.Point3d( 100, 0, 0 )
b = Rhino.Geometry.Point3d( -100, 0, 0 )
c = Rhino.Geometry.Point3d( 0, 100, 0 )
d = Rhino.Geometry.Point3d( 0, -100, 0 )
e = Rhino.Geometry.Point3d( 0, 0, 100 )
f = Rhino.Geometry.Point3d( 0, 0, -100 )
sp = Rhino.Geometry.Sphere.FitSphereToPoints(
    [ a, b, c, e, d, f ] )
Rhino.RhinoDoc.ActiveDoc.Objects.AddSphere( sp )
Rhino.RhinoDoc.ActiveDoc.Views.Redraw()

Cosi’ pare che funzioni.

Non so come hai definito

rg

nel tuo script, ma il problema potrebbe essere li’ …
E forse anche nei valori contenuti nella lista, che credo debbano essere oggetti Point3d.

( Per la macro ti ha gia’ spiegato Lucio)

Ciao

Ciao Lucio ed Emilio ,
emilio ha perfettamente ragione:

ho fatto 2 errori:

  1. l’ “rg” e’ Rhino.Geometry , non ho messo “.Sphere” davanti a “FitSphere…”
  2. effettivamente bisogna passare dei punti 3d e non liste .

Eccolo funzionante
""""

import Rhino.Geometry as rg

L2=[]

L2.append(rg.Point3d(0,0,0))
L2.append(rg.Point3d(0,1,0))
L2.append(rg.Point3d(1,0,0))
L2.append(rg.Point3d(2,0.5,1))
L2.append(rg.Point3d(-3,0,2))

S=rg.Sphere.FitSphereToPoints(L2)

r=S.Radius

print "raggio = " + str®

“”""
Grazie di tutto:
Ottimi come sempre:

grazie
franco