Ciao scriptomani.
Volevo vedere se riuscivo a usare il Lisp (una specie) per scriptare Rhino,
e ho provato a farmi semplicemente uno script in Python in grado di eseguire istruzioni Lisp.
In rete si trova diverso materiale a riguardo.
E ovviamente si tratta di cose molto piuā serie e ben fatte.
Ad esempio:
Ma, parlando di script per Rhino, a me interessava in particolare
lāinterazione con Rhino ⦠cioeā vedere come fare per utilizzare le librerie per Python
sviluppate da McNeel che utilizziamo normalmente nei nostri script.
Dai miei primi (e forse ultimi ) test, direi che la cosa funziona siā e no ā¦
Le funzioni rhinoscriptsyntax si usano abbastanza comodamente.
Mentre per RhinoCommon la cosa eā piuā complicata ā¦
In pratica conviene richiamarlo passando al Lisp il testo con lāistruzione in Python.
⦠Pure un poā modificata se dobbiamo usare delle variabili (Lisp).
Non il massimo della comoditaā ā¦
Come dicevo, ho fatto solo qualche piccola prova, anche percheā non sono abituato a usare il Lisp e ci fatico parecchio.
Ma, dato che ho bellāe che finito le ferie, faccio che postare quello che ho adesso, nella remota possibilitaā che lāargomento interessi qualcuno ā¦
⦠Anche se lo script eā molto rozzo e incompleto, per non parlare di tutti i bug che ci saranno.
Ho cercato di ispirarmi, per quanto possibile, ad AutoLISP, ma non solo ā¦
ho āattintoā qualcosa anche dal Common Lisp ⦠e da un paio di vecchi libri sul Lisp.
Oltre alle normali funzioni (e forme speciali) Lisp, ci sono delle funzioni ausiliarie, utili, ad esempio, per lāoutput delle informazioni, per il debug ecc.
Queste funzioni iniziano con la lettera āAā maiuscola.
Qui ci sono un paio di brevi script ātradottiā nel nostro Lisp, con il testo originale in Python sotto.
Il primo usa rhinoscriptsyntax e il secondo RhinoCommon.
(defun a2l(lines)
(cond(lines
(setq line(car lines))
(setq p0(rs "CurveStartPoint" line))
(setq p1(rs "CurveEndPoint" line))
(rs "AddLine" p0 p1)
(rs "DeleteObject" line)
(a2l (cdr lines)))))
(setq lis(rs "GetObjects" "Arcs to transform ?" 0 T T))
(cond((null lis)(exit)))
(a2l lis)
; import rhinoscriptsyntax as rs
; def main():
; lis = rs.GetObjects( 'Arcs to transform ?' )
; for lin in lis:
; if rs.IsArc( lin ):
; p0 = rs.CurveStartPoint( lin )
; p1 = rs.CurveEndPoint( lin )
; rs.AddLine( p0, p1 )
; rs.DeleteObject( lin )
; main()
(setq reslin(py "Rhino.Input.RhinoGet.GetLine()"))
(setq res(car reslin))
(setq lin(cadr reslin))
(cond((null lin)(quit)))
(setq resnum(py "Rhino.Input.RhinoGet.GetNumber('Circle Diameter ?',True,10)"))
(setq res(car resnum))
(setq num(cadr resnum))
(cond((not(equal res(py 'Rhino.Commands.Result.Success)))(quit)))
(setq rad(/ num 2.0))
(setq respnt(py "Rhino.Input.RhinoGet.GetPoint('Circle Centre ?',True)"))
(setq res(car respnt))
(setq pnt(cadr respnt))
(cond((null pnt)(quit)))
(setq pla(py "Rhino.Geometry.Plane(var('pnt'),var('lin').Direction)"))
(setq cir(py "Rhino.Geometry.Circle(var('pla'),var('rad'))"))
(setq gid(py "scriptcontext.doc.Objects.AddCircle(var('cir'))"))
(py "scriptcontext.doc.Views.Redraw()")
; import Rhino
; import scriptcontext
; def main():
; res, lin = Rhino.Input.RhinoGet.GetLine()
; if not lin:
; return
; res, num = Rhino.Input.RhinoGet.GetNumber( 'Circle Diameter ?', True, 10 )
; if res != Rhino.Commands.Result.Success:
; return
; rad = num / 2.0
; res, pnt = Rhino.Input.RhinoGet.GetPoint( 'Circle Center ?', True )
; if not pnt:
; return
; pla = Rhino.Geometry.Plane( pnt, lin.Direction )
; cir = Rhino.Geometry.Circle( pla, rad )
; gid = Rhino.RhinoDoc.ActiveDoc.Objects.AddCircle( cir )
; scriptcontext.doc.Views.Redraw()
; main()
Per chi volesse provare, lo script si usa naturalmente come un normale script Python.
Nel pulsante possiamo scrivere semplicemente:
-RunPythonScript lisplike.py
In questo caso lo script mostra delle opzioni:
PickFile: per scegliere lo script Lisp da eseguire.
RunConsole: per eseguire comandi Lisp in modo interattivo.
SaveDocs: per salvare su file la (ridottissima) documentazione sulle funzioni Lisp disponibili.
ViewFile: per vedere il contenuto di un file in una finestra di dialogo.
Invece di scegliere unāopzione possiamo scrivere direttamente il nome dello script Lisp da eseguire.
E ovviamente possiamo farci dei pulsanti customizzati per eseguire una delle opzioni o un particolare script Lisp.
Ad esempio:
-RunPythonScript lisplike.py RunConsole
-RunPythonScript lisplike.py SaveDocs
Eccetera.
Oppure per eseguire uno script particolare (āarcs2lines.rlsā):
-RunPythonScript lisplike.py arcs2lines.rls
Allāinizio dello script ci sono degli alias per i nomi delle funzioni.
Ognuno puoā adattarli alle sue preferenze/necessitaā.
Non mi dilungo oltre.
Nel caso, per le altre informazioni o segnalazioni di bug ecc., chiedete qui.
Ciao !
lisplike.py (88,2 KB)