# Da macro a script

**URL:** <https://it.discourse.mcneel.com/t/da-macro-a-script/458>\
**Category:** Scripting e Programmazione\
**Created:** [21 Gennaio 2015, 11:27am UTC](https://it.discourse.mcneel.com/t/da-macro-a-script/458 "2015-01-21T11:27:30Z")\
**Posts on this page:** 15\
**Page:** 1

<div class="post-metadata">

**Author:** ![Bruni](https://avatars.discourse-cdn.com/v4/letter/b/48db29/32.png) [@Bruni](https://it.discourse.mcneel.com/u/Bruni)\
**Post date:** [21 Gennaio 2015, 11:27am UTC](https://it.discourse.mcneel.com/t/da-macro-a-script/458/1 "2015-01-21T11:27:30Z")

</div>

Ciao a tutti,  
sono nuovo del forum e degli script in python ma con grande curiosita’ e voglia di imparare (spero…)  
Vorrei capire come trasformare in script questa macro:

```
_Points _PersistentOnPolysurface
_Pause
_Pause
_Pause
_SelLast
_projectToCplane
_Pause
_Enter
_Pause
_Line _Pause _Pause
_SelLast
_Pipe C=P T=L 0.15 0.3
_Enter
_Delete
_Enter

```

In pratica:

1. La macro chiede di selezionare una superficie ed inserire un punto sulla stessa (\_Points \_PersistentOnPolysurface).
2. Proietta lo stesso punto sul CPlane (\_projectToCplane).
3. Chiede di collegare una line tra i 2 punti (a mano, uff…)
4. Crea un pipe

Sono proprio curioso di vedere come lo script gestisce il \_PersistentOnPolysurface, e pure la creazione in automatico del pipe tra i 2 punti.

Grazie Mille!  
Luca

---

<div class="post-metadata">

**Author:** ![giuseppe](https://sea3.discourse-cdn.com/mcneel/user_avatar/it.discourse.mcneel.com/giuseppe/32/16416_2.png) [@giuseppe](https://it.discourse.mcneel.com/u/giuseppe)\
**Post date:** [21 Gennaio 2015, 2:15pm UTC](https://it.discourse.mcneel.com/t/da-macro-a-script/458/2 "2015-01-21T14:15:25Z")

</div>

Ciao Luca,  
…praticamente pari-pari dall’help di Py (GetPointOnSurface)

import rhinoscriptsyntax as rs

surface = rs.GetObject(“Seleziona superfice”)

if surface:

…point = rs.GetPointOnSurface(surface, “Punto su superfice”)

…if point: rs.AddPoint(point)

---

<div class="post-metadata">

**Author:** ![emilio](https://sea3.discourse-cdn.com/mcneel/user_avatar/it.discourse.mcneel.com/emilio/32/16095_2.png) [@emilio](https://it.discourse.mcneel.com/u/emilio)\
**Post date:** [21 Gennaio 2015, 2:42pm UTC](https://it.discourse.mcneel.com/t/da-macro-a-script/458/3 "2015-01-21T14:42:06Z")

</div>

Si’ … va beh … ma forse Luca, essendo nuovo dell’argomento, voleva vedere uno script completo … 😄  
Che se non sbaglio richiede il Command() per eseguire la macro … almeno, io non trovo funzioni rhinoscriptsyntax per disegnare le Pipe …

Ho provato con RhinoCommon, ma non riesco a disegnare la Pipe … mi da’ errore.  
Cerchero’ info in merito.  
Intanto ho aggirato con un Loft, ammesso che la pipe sia giusta … non ho capito bene come devono essere le opzioni … sorry.

```python
import Rhino

def main():
  # input superficie
  gob = Rhino.Input.Custom.GetObject()
  gob.AcceptNothing( True )
  gob.SetCommandPrompt( 'Superficie ?' )
  gob.GeometryFilter = ( 
      Rhino.DocObjects.ObjectType.Surface |
      Rhino.DocObjects.ObjectType.Brep )
  gob.Get()
  if gob.CommandResult() == Rhino.Commands.Result.Cancel:
    return
  res = gob.Result()
  if res == Rhino.Input.GetResult.Nothing:
    return
  elif res == Rhino.Input.GetResult.Object:
    obref = gob.Object( 0 )
    brep = obref.Brep()
  # input punto
  gep = Rhino.Input.Custom.GetPoint()
  gep.AcceptNothing( True )
  gep.SetCommandPrompt( 'Punto sulla superficie ?' )
  gep.Constrain( brep, -1, -1, False )
  gep.Get()
  if gep.CommandResult == Rhino.Input.GetResult.Cancel:
    return
  res = gep.Result()
  if res == Rhino.Input.GetResult.Nothing:
    return
  elif res == Rhino.Input.GetResult.Point:
    pa = gep.Point()
  # proietta
  view = Rhino.RhinoDoc.ActiveDoc.Views.ActiveView
  cplane = view.ActiveViewport.ConstructionPlane()
  xform = Rhino.Geometry.Transform.PlanarProjection( cplane )
  pb = Rhino.Geometry.Point3d( pa )
  pb.Transform( xform )
  # cerchi
  ca = Rhino.Geometry.Circle( cplane, pa, 0.15 )
  cb = Rhino.Geometry.Circle( cplane, pb, 0.3 )
  cua = Rhino.Geometry.ArcCurve( ca )
  cub = Rhino.Geometry.ArcCurve( cb )
  # tronco di cono
  breps = Rhino.Geometry.Brep.CreateFromLoft(
      [cua, cub],
      Rhino.Geometry.Point3d.Unset,
      Rhino.Geometry.Point3d.Unset,
      Rhino.Geometry.LoftType.Normal,
      False )
  toler = Rhino.RhinoDoc.ActiveDoc.ModelAbsoluteTolerance
  brep = breps[0].CapPlanarHoles( toler )
  # disegna
  Rhino.RhinoDoc.ActiveDoc.Objects.AddBrep( brep )
  Rhino.RhinoDoc.ActiveDoc.Views.Redraw()

main()

```

Adesso sono di fretta …  
Vediamo se qualcuno trova il tempo per lo script completo in rhinoscriptsyntax … 😃

Ciao a tutti

---

<div class="post-metadata">

**Author:** ![Bruni](https://avatars.discourse-cdn.com/v4/letter/b/48db29/32.png) [@Bruni](https://it.discourse.mcneel.com/u/Bruni)\
**Post date:** [21 Gennaio 2015, 3:42pm UTC](https://it.discourse.mcneel.com/t/da-macro-a-script/458/4 "2015-01-21T15:42:59Z")

</div>

@ Giuseppe:  
ho speso ore cercando il comando sbagliato… 😓

@ Emilio:

grande, funziona!!  
Mi puoi dire la differenza tra RhinoCommon e rhinoscriptsyntax?  
Non è possibile vederlo scritto in rhinoscriptsyntax cosi’ me/ce lo posso/iamo studiare??

Grazie a tutti!!  
Luca

---

<div class="post-metadata">

**Author:** ![giuseppe](https://sea3.discourse-cdn.com/mcneel/user_avatar/it.discourse.mcneel.com/giuseppe/32/16416_2.png) [@giuseppe](https://it.discourse.mcneel.com/u/giuseppe)\
**Post date:** [21 Gennaio 2015, 4:28pm UTC](https://it.discourse.mcneel.com/t/da-macro-a-script/458/5 "2015-01-21T16:28:57Z")

</div>

> [@emilio](#):
>
> Ho provato con RhinoCommon, ma non riesco a disegnare la Pipe … mi da’ errore.Cerchero’ info in merito.

Avevo solo fatto la parte che risolveva “OnSrf”… 😉

---

<div class="post-metadata">

**Author:** ![emilio](https://sea3.discourse-cdn.com/mcneel/user_avatar/it.discourse.mcneel.com/emilio/32/16095_2.png) [@emilio](https://it.discourse.mcneel.com/u/emilio)\
**Post date:** [21 Gennaio 2015, 6:24pm UTC](https://it.discourse.mcneel.com/t/da-macro-a-script/458/6 "2015-01-21T18:24:10Z")

</div>

> [@giuseppe](#):
>
> Avevo solo fatto la parte che risolveva “OnSrf”

… E hai fatto bene. 😃  
Era quello che non mi ricordavo … 😊

Ho provato a completare in qualche modo, alla buona, quello che hai iniziato,  
cosi’ Luca puo’ cominciare a farsi un’idea …

```python
import rhinoscriptsyntax as rs

surface = rs.GetObject("Seleziona superfice")
if surface:
    point = rs.GetPointOnSurface(surface, "Punto su superfice")
    if point: 
        rs.EnableRedraw( False )
        p0 = rs.AddPoint(point)
        rs.UnselectAllObjects()
        rs.SelectObject( p0 )
        rs.Command( '_ProjectToCPlane N' )
        p1 = rs.FirstObject()
        li = rs.AddLine( p0, p1 )
        rs.UnselectAllObjects()
        rs.SelectObject( li )
        rs.Command( '_Pipe C=F 0.15 0.3 Enter' )
        rs.DeleteObjects( [p0, p1, li] )
        rs.EnableRedraw( True )

```

Ciao !

[EDIT]

p.s. ho cambiato le opzioni di Pipe rispetto all’originale di Luca solo per provare lo script su Rhino in inglese …

[/EDIT]

---

<div class="post-metadata">

**Author:** ![emilio](https://sea3.discourse-cdn.com/mcneel/user_avatar/it.discourse.mcneel.com/emilio/32/16095_2.png) [@emilio](https://it.discourse.mcneel.com/u/emilio)\
**Post date:** [21 Gennaio 2015, 6:37pm UTC](https://it.discourse.mcneel.com/t/da-macro-a-script/458/7 "2015-01-21T18:37:11Z")

</div>

Ciao Luca,

> [@Bruni](#):
>
> Mi puoi dire la differenza tra RhinoCommon e rhinoscriptsyntax?

Dunque … Giuseppe potra’ essere piu’ preciso … ma ti dico che grosso modo RhinoCommon e’ la libreria di classi usata per scrivere i plug-in. E ora, per fortuna, disponibile anche per gli script in Python.

Pur non essendo ancora completa, permette di lavorare su molte cose: oggetti ‘astratti’, cioe’ indipendenti dal documento Rhino, ovviamente oggetti Rhino (presenti nel documento), loro attributi (layer, colore etc), viste e relativi attributi (cplane etc )  
Permette di costruire comandi con le stesse opzioni dei comani nativi Rhino.  
Piu’ altre cose piu’ complicate che non conosco (tipo display conduit etc)

rhinoscriptsyntax e’ una libreria di funzioni scritta usando RhinoCommon, che cerca di replicare i metodi del vecchio sistema di scripting: RhinoScript su VBScript.

E’ decisamente piu’ limitata, ma permette di scrivere piu’ velocemente certe operezioni (che sono piu’ simili ai comandi Rhino veri e proprii)  
Puoi usare solo gli oggetti geometrici presenti nel documento Rhino (oltre ad aggiungerne di nuovi ovviamente) e puoi fare diverse operazioni su attributi vari, viste, layer eccetera.

Adesso devo interrompere.  
Spero che qualche anima buona ti posti i link per le documentazioni delle due librerie …  
Ciao !

[EDIT]

Il file chm per rhinoscriptsyntax io ce l’ho in:  
[C:\Program Files\Rhinoceros 5.0\Plug-ins\IronPython](http://C:%5CProgram%20Files%5CRhinoceros%205.0%5CPlug-ins%5CIronPython)

La documentazione sul Web per RhinoCommon e’ qui:  
[http://4.rhino3d.com/5/rhinocommon/](http://4.rhino3d.com/5/rhinocommon/)

Puo’ esser anche interessante e utile il codice Python di rhinoscriptsyntax. io ce l’ho in:  
[C:\Users\computer\AppData\Roaming\McNeel\Rhinoceros\5.0\Plug-ins\IronPython (814d908a-e25c-493d-97e9-ee3861957f49)\settings\lib\rhinoscript](http://C:%5CUsers%5Ccomputer%5CAppData%5CRoaming%5CMcNeel%5CRhinoceros%5C5.0%5CPlug-ins%5CIronPython%20%28814d908a-e25c-493d-97e9-ee3861957f49%29%5Csettings%5Clib%5Crhinoscript)

Questo su Win, per il Mac non conosco i percorsi esatti …

Per gli esempi, cerca sul Wiki. Puoi partire da qui:  
[http://wiki.mcneel.com/developer/home](http://wiki.mcneel.com/developer/home)

… e naturalmente per discutere di tutto questo … vieni qui sul forum 😃

[/EDIT]

---

<div class="post-metadata">

**Author:** ![giuseppe](https://sea3.discourse-cdn.com/mcneel/user_avatar/it.discourse.mcneel.com/giuseppe/32/16416_2.png) [@giuseppe](https://it.discourse.mcneel.com/u/giuseppe)\
**Post date:** [22 Gennaio 2015, 2:26pm UTC](https://it.discourse.mcneel.com/t/da-macro-a-script/458/8 "2015-01-22T14:26:32Z")

</div>

> [@Bruni](#):
>
> @ Giuseppe: ho speso ore cercando il comando sbagliato…

…con le stesse ore imparavi a farlo con Grasshopper e ti divertivi pure !!!  
😄

---

<div class="post-metadata">

**Author:** ![Bruni](https://avatars.discourse-cdn.com/v4/letter/b/48db29/32.png) [@Bruni](https://it.discourse.mcneel.com/u/Bruni)\
**Post date:** [22 Gennaio 2015, 3:46pm UTC](https://it.discourse.mcneel.com/t/da-macro-a-script/458/9 "2015-01-22T15:46:37Z")

</div>

Ciao a Tutti,

@ Emilio  
grazie per lo script, l’ho studiato e capito (credo).

@ Giuseppe

> …con le stesse ore imparavi a farlo con Grasshopper e ti divertivi pure !!!

con Grasshopper ti diverti ma vuoi mettere la soddisfazione di farti uno script? (sempre se ci arrivero’…) 😅

ho imparato:

1. Alcuni comandi rhinoscript
2. La possibilita’ di inserire un comando rhino all’interno dello script attraverso Command()
3. Gestire le variabili all’interno dello script
4. Differenza tra RhinoCommon e Rhinoscriptsyntax

Domandina:  
GetPointOnSurface() gestisce solo un punto, c’è un modo per gestire piu’ punti?

Grazie per la pazienza!!!

Luca

---

<div class="post-metadata">

**Author:** ![emilio](https://sea3.discourse-cdn.com/mcneel/user_avatar/it.discourse.mcneel.com/emilio/32/16095_2.png) [@emilio](https://it.discourse.mcneel.com/u/emilio)\
**Post date:** [22 Gennaio 2015, 5:45pm UTC](https://it.discourse.mcneel.com/t/da-macro-a-script/458/10 "2015-01-22T17:45:52Z")

</div>

> [@Bruni](#):
>
> con Grasshopper ti diverti ma vuoi mettere la soddisfazione di farti uno script?

Hehe … grande Luca !  
… Mi azzardo ad ipotizzare la nascita di una certa rivalita’ tra scriptomani e grasshopperisti …  
Prevedo una dura lotta tra componenti e metodi …  
Hahahahahahaha … dai , che ci divertiamo … 😉  
(… cioe’ …quando troviamo un po’ di tempo …)

---

<div class="post-metadata">

**Author:** ![emilio](https://sea3.discourse-cdn.com/mcneel/user_avatar/it.discourse.mcneel.com/emilio/32/16095_2.png) [@emilio](https://it.discourse.mcneel.com/u/emilio)\
**Post date:** [22 Gennaio 2015, 6:30pm UTC](https://it.discourse.mcneel.com/t/da-macro-a-script/458/11 "2015-01-22T18:30:55Z")

</div>

> [@Bruni](#):
>
> GetPointOnSurface() gestisce solo un punto, c’è un modo per gestire piu’ punti?

Puoi usare un ciclo **while** :

```python
import rhinoscriptsyntax as rs

surface = rs.GetObject("Seleziona superfice")
if surface:
    while True:
        point = rs.GetPointOnSurface(surface, "Punto su superfice")
        if not point:
            break 
        rs.EnableRedraw( False )
        p0 = rs.AddPoint(point)
        rs.UnselectAllObjects()
        rs.SelectObject( p0 )
        rs.Command( '_ProjectToCPlane N' )
        p1 = rs.FirstObject()
        li = rs.AddLine( p0, p1 )
        rs.UnselectAllObjects()
        rs.SelectObject( li )
        rs.Command( '_Pipe C=F 0.15 0.3 Enter' )
        rs.DeleteObjects( [p0, p1, li] )
        rs.EnableRedraw( True )

```

Per terminare, dai Enter invece di cliccare sulla superficie

Ciao !

---

<div class="post-metadata">

**Author:** ![giuseppe](https://sea3.discourse-cdn.com/mcneel/user_avatar/it.discourse.mcneel.com/giuseppe/32/16416_2.png) [@giuseppe](https://it.discourse.mcneel.com/u/giuseppe)\
**Post date:** [23 Gennaio 2015, 12:51pm UTC](https://it.discourse.mcneel.com/t/da-macro-a-script/458/12 "2015-01-23T12:51:42Z")

</div>

> [@emilio](#):
>
> Hehe … grande Luca !.. Mi azzardo ad ipotizzare la nascita di una certa rivalita’ tra scriptomani e grasshopperisti …Prevedo una dura lotta tra componenti e metodi …Hahahahahahaha … dai , che ci divertiamo … (… cioe’ …quando troviamo un po’ di tempo …)

AHAHAHA…!!!  
La guerra dei mondi

---

<div class="post-metadata">

**Author:** ![Bruni](https://avatars.discourse-cdn.com/v4/letter/b/48db29/32.png) [@Bruni](https://it.discourse.mcneel.com/u/Bruni)\
**Post date:** [23 Gennaio 2015, 1:00pm UTC](https://it.discourse.mcneel.com/t/da-macro-a-script/458/13 "2015-01-23T13:00:43Z")

</div>

Ciao!  
“While”: parola santa! 🙏

Tanto per giocare , sulla base del primo script fatto da Emilio, ho fatto alcune modifiche collegando il pipe tra due superfici, e… funziona! 😛

```
#Collega un Pipe tra 2 superfici

import rhinoscriptsyntax as rs

surface = rs.GetObject("Select first surface")
if surface:
    point = rs.GetPointOnSurface(surface, "Point on surface 1")
surface1 = rs.GetObject("Select second surface")
if surface1:
    point1 = rs.GetPointOnSurface(surface1, "Point on surface 2")
    if point and point1:
        rs.EnableRedraw( False )
        p0 = rs.AddPoint(point)
        p1 = rs.AddPoint(point1)
        li = rs.AddLine( p0, p1 )
        rs.UnselectAllObjects()
        rs.SelectObject( li )
        rs.Command( '_Pipe C=R 0.15 0.3 Enter' )
        rs.DeleteObjects( [p0, p1, li] )
        rs.EnableRedraw( True )

```

Che soddisfazione!!!  
Luca

---

<div class="post-metadata">

**Author:** ![emilio](https://sea3.discourse-cdn.com/mcneel/user_avatar/it.discourse.mcneel.com/emilio/32/16095_2.png) [@emilio](https://it.discourse.mcneel.com/u/emilio)\
**Post date:** [23 Gennaio 2015, 10:30pm UTC](https://it.discourse.mcneel.com/t/da-macro-a-script/458/14 "2015-01-23T22:30:46Z")

</div>

Ottimo.  
Hehe … ormai sei uno scriptomane a tutti gli effetti. 😃

Se permetti suggerisco un modo per semplificare il tuo script:  
In questo caso non e’ necessario disegnare i punti nel documento Rhino.  
Per disegnare la linea possiamo usare direttamente i punti ottenuti da GetObject()

```python
import rhinoscriptsyntax as rs

surface = rs.GetObject("Select first surface")
if surface:
    point = rs.GetPointOnSurface(surface, "Point on surface 1")
surface1 = rs.GetObject("Select second surface")
if surface1:
    point1 = rs.GetPointOnSurface(surface1, "Point on surface 2")
    if point and point1:
        rs.EnableRedraw( False )
        li = rs.AddLine( point, point1 )
        rs.UnselectAllObjects()
        rs.SelectObject( li )
        rs.Command( '_Pipe C=R 0.15 0.3 Enter' )
        rs.DeleteObject( li )
        rs.EnableRedraw( True )

```

In questo rhinoscriptsyntax ha delle caratteristiche un po’ particolari …  
( che possono facilmente confondere … )  
in quanto spesso consente di usare come parametri valori di tipo diverso.  
AddLine() ad esempio, come abbiamo visto, consente di partire sia da ObjectId ( Guid ), sia da oggetti Point3d (da RhinoCommon), sia da liste con tre valori (con significato X,Y,Z)  
Questo grazie alla funzione coerce3dpoint(), come possiamo vedere dal listato di AddLine():

```python

def AddLine(start, end):
    """Adds a line curve to the current model.
    Parameters:
      start, end = end points of the line
    Returns:
      id of the new curve object
    """
    start = rhutil.coerce3dpoint(start, True)
    end = rhutil.coerce3dpoint(end, True)
    rc = scriptcontext.doc.Objects.AddLine(start, end)
    if rc==System.Guid.Empty: raise Exception("Unable to add line to document")
    scriptcontext.doc.Views.Redraw()
    return rc

```

… per la serie: “Curiosita’ e pettegolezzi sugli script per Rhino” … 😉

---

<div class="post-metadata">

**Author:** ![Bruni](https://avatars.discourse-cdn.com/v4/letter/b/48db29/32.png) [@Bruni](https://it.discourse.mcneel.com/u/Bruni)\
**Post date:** [26 Gennaio 2015, 9:39am UTC](https://it.discourse.mcneel.com/t/da-macro-a-script/458/15 "2015-01-26T09:39:12Z")

</div>

Grazie Emilio,  
in questa maniera elimino 2 variabili inutili. Funziona anche con le mesh.

```
    rimport rhinoscriptsyntax as rs

mesh = rs.GetObject("Pick a mesh", rs.filter.mesh)

if mesh:

    point = rs.GetPointOnMesh(mesh, "First Point on mesh")

    if point: rs.AddPoint( point )
    point1 = rs.GetPointOnMesh(mesh, " Second Point on mesh")
    if point1: rs.AddPoint( point1 )
    rs.EnableRedraw( False )
    li = rs.AddLine( point, point1 )
    rs.UnselectAllObjects()
    rs.SelectObject( li )
    rs.Command( '_Pipe C=R 0.15 0.3 Enter' )
    rs.DeleteObject( li )
    rs.EnableRedraw( True )

```

Step successivo: integrazione del ciclo while. 👌

Ciao!!  
Luca
