# Help from Vector to PointCloud RCommon Py

**URL:** <https://it.discourse.mcneel.com/t/help-from-vector-to-pointcloud-rcommon-py/5041>\
**Category:** Scripting e Programmazione\
**Created:** [23 Marzo 2023, 6:40pm UTC](https://it.discourse.mcneel.com/t/help-from-vector-to-pointcloud-rcommon-py/5041 "2023-03-23T18:40:46Z")\
**Posts on this page:** 12\
**Page:** 1

<div class="post-metadata">

**Author:** ![0904](https://avatars.discourse-cdn.com/v4/letter/0/b3f665/32.png) [@0904](https://it.discourse.mcneel.com/u/0904)\
**Post date:** [23 Marzo 2023, 6:40pm UTC](https://it.discourse.mcneel.com/t/help-from-vector-to-pointcloud-rcommon-py/5041/1 "2023-03-23T18:40:46Z")

</div>

![immagine](https://global.discourse-cdn.com/mcneel/uploads/mcneel_it/original/2X/c/cb8b7fcab0705b404ecf9674af6464680d7133b2.png)

> **[Vector3d Structure](https://developer.rhino3d.com/api/RhinoCommon/html/T_Rhino_Geometry_Vector3d.htm)**
>
> Represents the three components of a vector in three-dimensional space, using -precision floating point numbers.

 ![immagine](https://global.discourse-cdn.com/mcneel/uploads/mcneel_it/original/2X/8/856426c9c38f0adb30b931d60bac5ef9c885e55c.png)

> **[Vector3d Constructor (Point3d)](https://developer.rhino3d.com/api/RhinoCommon/html/M_Rhino_Geometry_Vector3d__ctor.htm)**
>
> Initializes a new instance of a vector, copying the three components from the three coordinates of a point.

mi aiutate a capire come funzionano i vettori in RCommon?

ho riletto altri post, dove si è accennatto alle **struct** e rivisto videi in cui si spiegava le differenze con le **classi** ora non so se sia solo questo il problema, ma una cosa che mi sfugge è il perché se un vettore indica una direzione, questa **struct** Vector3d richieda un solo punto invece che due come ho già fatto in VBS e Py?

ps ho anche provato con un solo punto ma mi da errore e poi ho notato che non riporta output possibile?  
error: “Message: expected PointCloud, got Point3d”

---

<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 Marzo 2023, 11:56pm UTC](https://it.discourse.mcneel.com/t/help-from-vector-to-pointcloud-rcommon-py/5041/2 "2023-03-23T23:56:50Z")

</div>

Non preoccuparti della **struct**.  
In Python funziona come una classe.

> [@0904](#):
>
> questa **struct** Vector3d richieda un solo punto invece che due come ho già fatto in VBS e Py?

Ci sono diversi costruttori:  
[Vector3d Structure (rhino3d.com)](https://developer.rhino3d.com/api/RhinoCommon/html/T_Rhino_Geometry_Vector3d.htm)

Se vuoi ottenere il vettore come differenza di due punti, devi usare l’operatore **Subtraction** di Point3d:  
[Point3d.Subtraction Operator (Point3d, Point3d) (rhino3d.com)](https://developer.rhino3d.com/api/RhinoCommon/html/M_Rhino_Geometry_Point3d_op_Subtraction.htm)

… che in pratica utilizzi con il segno meno tra due punti

```python
import Rhino

p0 = Rhino.Geometry.Point3d( 10, 15, 20 )
p1 = Rhino.Geometry.Point3d( 80, 75, 70 )
v0 = p1 - p0
print( type( v0 ) )
print( v0 )

```

> [@0904](#):
>
> ps ho anche provato con un solo punto ma mi da errore e poi ho notato che non riporta output possibile?  
> error: “Message: expected PointCloud, got Point3d”

Fai vedere cosa hai scritto, please. 🙂

---

<div class="post-metadata">

**Author:** ![0904](https://avatars.discourse-cdn.com/v4/letter/0/b3f665/32.png) [@0904](https://it.discourse.mcneel.com/u/0904)\
**Post date:** [24 Marzo 2023, 12:56am UTC](https://it.discourse.mcneel.com/t/help-from-vector-to-pointcloud-rcommon-py/5041/3 "2023-03-24T00:56:46Z")

</div>

> [@emilio](#):
>
> Fai vedere cosa hai scritto, please. 🙂

ero arrivato a questo punto:

```auto
import Rhino as rh
import scriptcontext as sc
a = rh.Input.RhinoGet.GetPoint("pt1", False)[1]
print a
b = rh.Input.RhinoGet.GetPoint("pt2", False)[1]
print b
pt = rh.Geometry.Point3d.Add(rh.Geometry.Point3d(b), rh.Geometry.Point3d(a))
print type(pt), "point"
vt = rh.Geometry.Vector3d(pt)
print type(vt), "vector"
#pc = rh.Geometry.PointCloud.Add(pt)
#print type(pc)

```

mi ricordavo le tue parole, che per la creazione di un vettore si deve sottrarre il secondo e primo punto  
in questo caso stavo provando con `Point3d.Add` giusto per provare il funzionamento dei metodi,  
quindi in RCommon non esiste crea vettore, come hai sempre detto basta fare la sottrazione.

sono arrivato a questo punto, il tutto era finalizzato per creare un PointCloud  
che non ho capito il perché non funziona, e pure punti e vettori si. . .

[https://developer.rhino3d.com/api/RhinoCommon/html/M\_Rhino\_Geometry\_PointCloud\_Add.htm](https://developer.rhino3d.com/api/RhinoCommon/html/M_Rhino_Geometry_PointCloud_Add.htm)

 ![immagine](https://global.discourse-cdn.com/mcneel/uploads/mcneel_it/original/2X/3/3a8cd12c908e0509af86501fa5dd22473b48410a.png)

ma non capisco, PointCloudAdd è un metodo? e perché non viene riportato un valore di ritorno?  
e perché, come parametro viene richiesto un solo punto, ma il codice postato non funziona?

---

<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:** [24 Marzo 2023, 1:08am UTC](https://it.discourse.mcneel.com/t/help-from-vector-to-pointcloud-rcommon-py/5041/4 "2023-03-24T01:08:41Z")

</div>

Come dice la pagina che riporti, **Add** e’ un metodo di **PointCloud** ,  
che serve ad aggiungere un punto al point cloud.  
Ma se tu prima non costruisci un oggetto PointCloud, non hai niente a cui aggiungere un punto.  
Non e’ un metodo statico (ci sarebbe scritto).  
E’ un normale metodo che richiede un oggetto con cui richiamarlo.  
**Prima** devi costruire un oggetto PointCloud, **dopo** puoi aggiungergli il punto.

---

<div class="post-metadata">

**Author:** ![0904](https://avatars.discourse-cdn.com/v4/letter/0/b3f665/32.png) [@0904](https://it.discourse.mcneel.com/u/0904)\
**Post date:** [24 Marzo 2023, 1:44am UTC](https://it.discourse.mcneel.com/t/help-from-vector-to-pointcloud-rcommon-py/5041/5 "2023-03-24T01:44:31Z")

</div>

> [@emilio](#):
>
> **Prima** devi costruire un oggetto PointCloud

è quello che sto cercando di fare da oggi pomeriggio,  
vabbè mo se ne parla domani, e vedo come va. . .

---

<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:** [24 Marzo 2023, 9:09am UTC](https://it.discourse.mcneel.com/t/help-from-vector-to-pointcloud-rcommon-py/5041/6 "2023-03-24T09:09:52Z")

</div>

Qui:  
[PointCloud Class (rhino3d.com)](https://developer.rhino3d.com/api/RhinoCommon/html/T_Rhino_Geometry_PointCloud.htm)  
ci sono dei costruttori.  
Se vuoi costruire un oggetto, e’ la prima cosa da esaminare.

---

<div class="post-metadata">

**Author:** ![0904](https://avatars.discourse-cdn.com/v4/letter/0/b3f665/32.png) [@0904](https://it.discourse.mcneel.com/u/0904)\
**Post date:** [24 Marzo 2023, 1:42pm UTC](https://it.discourse.mcneel.com/t/help-from-vector-to-pointcloud-rcommon-py/5041/7 "2023-03-24T13:42:15Z")

</div>

Emilio e che c’é voluto 😤 😤

per questo avevo chiesto inizialmente il funzionamento, è una modalità tutta nuova. . .

```auto
print rh.Geometry.PointCloud().Add(rh.Input.RhinoGet.GetPoint("pt", False)[1])

```

il print ritorna “None”

> [@0904](#):
>
> poi ho notato che non riporta output possibile?

parlo di PointCloud().Add che poi nell’esempio non vengono messe le parentesi non capisco come mai 🤔

quindi ricapitolando bisogna sì usare il metodo Add con i parametri ma anche PointCloud() con le parentesi,  
però in tutto questo ritorna “None” nemmeno le coordinate, ma usando scriptcontext aggiunge il PointCloud.

edit:  
la riga di codice con il print non riporta il PointCloud (ma il risultato del print è lo stesso)

```auto
ad = rh.Geometry.PointCloud()
print ad.Add(rh.Input.RhinoGet.GetPoint("pt", False)[1])
sc.doc.Objects.AddPointCloud(ad)

```

in questo modo mi ritorna il PointCloud, ma come dicevo col print ad.Add(. . . il risultato è sempre None

ps quindi da quel che vedo, funziona come il metodo Rhino.Input.Custom, bisogna compilare a strati.

---

<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:** [24 Marzo 2023, 2:04pm UTC](https://it.discourse.mcneel.com/t/help-from-vector-to-pointcloud-rcommon-py/5041/8 "2023-03-24T14:04:32Z")

</div>

> [@0904](#):
>
> è una modalità tutta nuova. . .

Forse parli di scrivere una singola istruzione con un costruttore e un metodo ( piu’ GetPoint ) …  
Ma nessuno ti obbliga a fare in questo modo.  
Puoi benissimo scrivere istruzioni piu’ semplici, che spesso sono piu’ facili da capire.

```python
# input del punto da aggiungere
pnt = rh.Input.RhinoGet.GetPoint( 'pt', False )[1]
# definisci una nuova PointCloud vuota
pcloud = rh.Geometry.PointCloud()
# aggiungi un punto alla PointCloud
pcloud.Add( pnt )

```

Io non vedo nessuna modalita’ nuova.  
Usiamo le classi di RhinoCommon per ottenere un input,  
per costruire una point cloud e infine per aggiungere un punto alla point cloud.

> [@0904](#):
>
> il print ritorna “None”

Infatti quel metodo e’ dichiarato **void**  
[PointCloud.Add Method (Point3d) (rhino3d.com)](https://developer.rhino3d.com/api/RhinoCommon/html/M_Rhino_Geometry_PointCloud_Add.htm)

> [@0904](#):
>
> parlo di PointCloud().Add che poi nell’esempio non vengono messe le parentesi non capisco come mai

Quale esempio ? … E quali parentesi ? 😉

---

<div class="post-metadata">

**Author:** ![0904](https://avatars.discourse-cdn.com/v4/letter/0/b3f665/32.png) [@0904](https://it.discourse.mcneel.com/u/0904)\
**Post date:** [24 Marzo 2023, 2:22pm UTC](https://it.discourse.mcneel.com/t/help-from-vector-to-pointcloud-rcommon-py/5041/9 "2023-03-24T14:22:10Z")

</div>

> [@emilio](#):
>
> Puoi benissimo scrivere istruzioni piu’ semplici, che spesso sono piu’ facili da capire.
> 
> ```auto
> # input del punto da aggiungere
> pnt = rh.Input.RhinoGet.GetPoint( 'pt', False )[1]
> # definisci una nuova PointCloud vuota
> pcloud = rh.Geometry.PointCloud()
> # aggiungi un punto alla PointCloud
> pcloud.Add( pnt )
> 
> ```

> [@0904](#):
>
> ```auto
> ad = rh.Geometry.PointCloud()
> print ad.Add(rh.Input.RhinoGet.GetPoint("pt", False)[1])
> sc.doc.Objects.AddPointCloud(ad)
> 
> ```

si infatti è stata la conclusione a cui ero arrivato che ho pubblicato, e credo sia l’unico modo corretto.

> [@emilio](#):
>
> Quale esempio ? … E quali parentesi ? 😉

```auto
import Rhino
print Rhino.Input.RhinoGet.GetPoint("pt", False)[1]

```

se io uso il print di questa riga mi ritornano le coordinate del punto  
e le parentesi le uso soltanto nella parte finale del codice per indicare i parametri

mentre nel caso sopra invece bisogna indicare prima Rhino.Geometry.PointCloud() con le parentesi  
poi utilizzare Add(point3d) con il suo parametro all’interno delle sue parentesi ovviamente

![immagine](https://global.discourse-cdn.com/mcneel/uploads/mcneel_it/original/2X/b/b40099835e787e881fa9fc9b74ed23f80dc22624.png)

ma nella descrizione viene riportato senza parentesi: PointCloud.Add, è vero che andando a leggere ci sarà spiegato tutto, però penso se avessero fatto in queto modo PointCloud().Add era più intuitivo “credo”

ps ovviamente sono mie considerazioni e gusti personali

---

<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:** [24 Marzo 2023, 2:39pm UTC](https://it.discourse.mcneel.com/t/help-from-vector-to-pointcloud-rcommon-py/5041/10 "2023-03-24T14:39:28Z")

</div>

> [@0904](#):
>
> mentre nel caso sopra invece bisogna indicare prima Rhino.Geometry.PointCloud() con le parentesi  
> poi utilizzare Add(point3d) con il suo parametro all’interno delle sue parentesi ovviamente

Come dicevamo, e’ una tua scelta scrivere una singola istruzione in cui richiami un costruttore (PointCloud()) e poi sul risultato del costruttore richiami un metodo (Add).

Non c’e’ nessun bisogno di fare in questo modo.  
Oltre tutto, cosi’ facendo ti perdi per strada la PointCloud.  
Con quella istruzione tu costruisci una PointCloud, ma dopo non puoi utilizzarla perche’ non la hai salvata in una variabile.  
Non mi sembra un modo di costruire la PointCloud molto utile … 😕

> [@0904](#):
>
> ma nella descrizione viene riportato senza parentesi: PointCloud.Add

Certo.  
Questa descrizione ti dice che sta parlando del metodo **Add** della classe **Point.Cloud**  
Non e’ un esempio. E’ una specie di titolo, di intestazione, dice solo che quanto scritto sono le informazioni relative al metodo **Add** di **PointCloud**.  
E’ la convenzione per individuare un metodo e la classe a cui appartiene.  
Si scrive il nome della classe, poi il punto e infine il nome del metodo (e in questo caso anche i parametri che richiede)

Vedi che scrive

```auto
PointCloud.Add Method (Point3d)

```

Quando mai nello script tu scrivi

```auto
Method

```

Non rappresenta una istruzione da copiare.  
Sono solo informazioni per il programmatore.  
Ti specifica la classe, il nome del metodo e i parametri richiesti.

---

<div class="post-metadata">

**Author:** ![0904](https://avatars.discourse-cdn.com/v4/letter/0/b3f665/32.png) [@0904](https://it.discourse.mcneel.com/u/0904)\
**Post date:** [24 Marzo 2023, 2:48pm UTC](https://it.discourse.mcneel.com/t/help-from-vector-to-pointcloud-rcommon-py/5041/11 "2023-03-24T14:48:45Z")

</div>

> [@emilio](#):
>
> Oltre tutto, cosi’ facendo ti perdi per strada la PointCloud.  
> Con quella istruzione tu costruisci una PointCloud, ma dopo non puoi utilizzarla perche’ non la hai salvata in una variabile.

forse è sfuggita questa parte:

> [@0904](#):
>
> > [@0904](#):
> >
> > ```auto
> > ad = rh.Geometry.PointCloud()
> > print ad.Add(rh.Input.RhinoGet.GetPoint("pt", False)[1])
> > sc.doc.Objects.AddPointCloud(ad)
> > 
> > ```
> 
> si infatti è stata la conclusione a cui ero arrivato che ho pubblicato, e credo sia l’unico modo corretto.

> [@emilio](#):
>
> ```auto
> PointCloud.Add Method (Point3d)
> 
> ```
> 
> Quando mai nello script tu scrivi
> 
> ```auto
> Method
> 
> ```
> 
> Non rappresenta una istruzione da copiare.  
> Sono solo informazioni per il programmatore.

spero che chi programma per lo meno la parola metodo sappia che non va inserita nel codice

per quanto riguarda a ciò che hai sottolineato “Sono solo informazioni per il programmatore.”  
appunto per questo se il titolo venisse riportato in questo modo: **PointCloud().Add**  
sarebbe una informazione importante da avere in modo da sapere subito  
che si tratta si un metodo come ho nominato prima da usare a strati.

ps ripeto sono solo mie osservazioni/congetture personali poi ognuno la vede come vuole

---

<div class="post-metadata">

**Author:** ![0904](https://avatars.discourse-cdn.com/v4/letter/0/b3f665/32.png) [@0904](https://it.discourse.mcneel.com/u/0904)\
**Post date:** [24 Marzo 2023, 9:29pm UTC](https://it.discourse.mcneel.com/t/help-from-vector-to-pointcloud-rcommon-py/5041/12 "2023-03-24T21:29:05Z")

</div>

> [@0904](#):
>
> ```auto
> import Rhino
> print Rhino.Input.RhinoGet.GetPoint("pt", False)[1]
> 
> ```

comunque non so questo esempio fino a che punto può essere valido, essendo che forse è un caso a parte

```auto
pt = Rhino.Input.Custom.GetPoint()
pt.SetCommandPrompt("pt 1")
pt.Get()

```

in questo caso **Rhino.Input.Custom.GetPoint()** funziona proprio come **Rhino.Geometry.PointCloud()**  
non so se è una peculiarità soltanto di **Rhino.Input.RhinoGet.GetPoint** che funziona in questo modo,  
oppure ci sono anche altri metodi con lo stesso funzionamento, ma proverò ad approfondire la cosa.

ps non lo avevo notato prima, ma tutti i metodi e proprietà della classe **RhinoGet** sono **Static member**
