Help from Vector to PointCloud RCommon Py

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”

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

Ci sono diversi costruttori:
Vector3d Structure (rhino3d.com)

Se vuoi ottenere il vettore come differenza di due punti, devi usare l’operatore Subtraction di Point3d:
Point3d.Subtraction Operator (Point3d, Point3d) (rhino3d.com)

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

import Rhino

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

Fai vedere cosa hai scritto, please. :slight_smile:

ero arrivato a questo punto:

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

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?

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.

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

Qui:
PointCloud Class (rhino3d.com)
ci sono dei costruttori.
Se vuoi costruire un oggetto, e’ la prima cosa da esaminare.

Emilio e che c’é voluto :triumph: :triumph:

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

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

il print ritorna “None”

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

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)

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.

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.

# 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.

Infatti quel metodo e’ dichiarato void
PointCloud.Add Method (Point3d) (rhino3d.com)

Quale esempio ? … E quali parentesi ? :wink:

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

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

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

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 … :confused:

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

PointCloud.Add Method (Point3d)

Quando mai nello script tu scrivi

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.

forse è sfuggita questa parte:

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

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

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