Intersezione mesh in Rhino python


#1

Salve a tutti
Per un progetto mi trovo a dover scrivere uno programmino in ambiente Rhino python che mi esegua in un ciclo for l’intersezione di varie mesh.
Purtroppo però sono bloccato appunto nell’interazione dellle mesh che viene effettuata con il comando meshmeshintersection che come da testo dovrebbe restituire una array di punti 3d rappresentanti la polilinea di intersezione.
Quello che se vado a fare il print del risultato dell’intersezione non esce una lista, vettore o altro ma mi restituisce un oggetto un scritta che purtroppo ,essendo un neofita , non riesco ad interpretare, e peggio ancora non riesco a lavorare in quanto ogni funzione che vado ad eseguire mettendo per oggetto l’intersezione ottenuta,mi viene detto che quest’ultima non è un argomento valido.
Non so più dove sbattere la testa :sob:
Dove sbaglio? che qualcosa che non ho considerato?

P.s. facendo print dell’intersezione l’output è
[<Rhino.geometry.polyline object at 0x000000000000002C [Rhino.geometry.polyline]>]
Ringrazio in anticipo


#2

Devi postare il codice dello script che hai fatto per riuscire a capire dove sta il problema…
Anche un esempio di mesh che utilizzi durante la procedura di intersezione (magari lo script é corretto ma le geometrie no…)


#3

Dice che il valore in questione e’ un oggetto della classe Polyline
Vedi qui:

https://developer.rhino3d.com/api/RhinoCommon/html/T_Rhino_Geometry_Polyline.htm

Cos’e’ che non ti e’ chiaro in questo ? :slight_smile:

Hai familiarita’ con la programmazione ad oggetti ?

Non conosci RhinoCommon ?
E’ la libreria usata da Rhino (anche) per la geometria, in cui, tra l’altro, e’ definita la classe Polyline.

Esegui lo script in Rhino direttamente oppure in Grasshopper ?

Cosa devi farci poi con le intersezioni ?


#4

Ciao Lucio grazie per la risposta domani mattina metterò lo script che utilizzo , non aspettarti qualcosa di contorto è soltanto 2 funzioni getobject e un meshmeshintersection, perché prima volevo capire come far funzionare un programma base per poi svilupparlo in base alle esigenze


#5

Ciao Emilio ringrazio anche te per la risposta, l’unica cosa che non capisco è perché se il return della funzione meshmeshintersection deve essere un array che mi definisce i punti di una polilinea per quale motivo mi restituisce un oggetto? Come posso ricavare i punti da questo oggetto?
P.s. ho trovato un esempio di intersezione mesh sempre domani mattina posteró anche quello


#6

Chiedo scusa, prima ho scritto una scemenza …:blush:
Non e’ un oggetto Polyline, ma una lista contenente un oggetto Polyline

La documentazione di rs.MeshMeshIntersection dice:

Returns

List A list of 3-D point arrays that identify the vertices of the intersection curves (polylines) if successful.

E in effetti parla di una lista di arrays di punti 3-D.
Il polylines tra parentesi credo significhi che le arrays in questione sono in realta’ delle Polyline.

Certo, per capirlo e’ utile sapere che Polyline discende da Point3dList, come dice RhinoCommon:

Inheritance Hierarchy

System.Object
Rhino.Collections.RhinoList<Point3d>
Rhino.Collections.Point3dList
Rhino.Geometry.Polyline

Quindi la Polyline definita in RhinoCommon e’ anche una array di punti.

Ed rs.MeshMeshIntersection() restituisce una lista con delle polilinee
Per convertire una polilinea in una lista di Point3d, e’ sufficiente list()

import rhinoscriptsyntax as rs

a=rs.GetObject('?')
b=rs.GetObject('?')
ints=rs.MeshMeshIntersection(a,b)
print len(ints)
print ints[0]
print list(ints[0])

Ciao


#7

Di seguito inserisco lo script che sto usando con l’aggiunto di qualche modifica suggerita da Emilio e anche l’esempio trovato in rete.

#importo la libreria rhinoscriptsyntax
import rhinoscriptsyntax as rs 

#vado a selezionare la prima mesh da lavorare (risultato  = GUID)
mesh1 = rs.GetObject('selezionare la prima mesh da lavorare:')

#vado a selezionare la prima mesh da lavorare (risultato  = GUID)
mesh2 = rs.GetObject('selezionare la seconda mesh da lavorare:')


#creo come risultato l'intersezione delle mesh (risultato  = Rhino.object.polyline)
intersezione = rs.MeshMeshIntersection(mesh1,mesh2)

#vado a convertire l'oggetto intersezione in una lista 
punti_di_intersezione = list(intersezione)

print len(intersezione)
print intersezione[0]
print list(intersezione[0])

#mostro a schermo il contenuto della lista punti_di_intersezione
print (punti_di_intersezione)


#la parte successiva e un esempio che ho trovato in internet per ottenere una polilinea
#---------------------------------------------------------------
results = rs.MeshMeshIntersection(mesh1, mesh2)

if results:

    for points in results: 
        polilinea = rs.AddPolyline(points)
#---------------------------------------------------------------

#successivamente la parte che ho agguinto io per ottenere l'aggiunta di un punto
    print polilinea
    lista_di_punti = rs.PolylineVertices(polilinea)
    print lista_di_punti
    rs.AddPoint(lista_di_punti[1])

quello che non mi è chiaro :

  1. perchè facendo print list(intersezione[0]) non ottengo un singolo punto ma gli ottendo tutti?

  2. perchè devo aggiungere un ciclo for per ottenere una polilinea quando da quel che sò basterebbe il comando rs.AddPolyline(points) ?

  3. la variabile punto nel ciclo for perchè varia nell’intervallo dei punti di result dandomi una polilinea, mentre se io semplicemente vado a scrivere print punto al posto di polilinea = rs.AddPolyline(points) mi restituisce l’oggetto polilinea?

scusate le tante domande magari anche stupide ma sono alle prime armi, portate pazienza :sweat_smile:


#8

Credo di cominciare a vedere una luce in fondo al tunnel :joy:
dopo qualche altra prova sono riuscito a ricavare le coordinate dei singoli punti ottenuti dell’intersezione tramite

punti_di_intersezione = R.Collections.Point3dList(intersezione[0])

da sostituire alla riga 17
in questo modo se vado a scrivere :

print punti_di_intersezione[0]

ottendo esattamente le coordinate del punto 0 della lista :star_struck:
il mio problema fosse propio il non sapere che da una funzione contenuta in rhinoscriptsyntax si potesse ottenere un “oggetto” “lavorabile” solo con la libreria Rhino, buono a sapersi per il futuro :rofl:

ringrazio Emilio e Lucio per la disponibilita !!!


#9

Perche’ MeshMeshIntersection restituisce una lista di polilinee, come dice la documentazione:

Returns

List A list of 3-D point arrays that identify the vertices of the intersection curves (polylines) if successful.

Sempre perche’ hai una lista di polilinee, e per ottenere le varie poillinee usi un ciclo

Non sono punti, sono polilinee. Il nome points non va tanto bene qui …

Puoi anche scrivere semplicemente

No, ottieni una Polyline, ma una Polyline e’ anche una array di punti, che puoi usare direttamente con cicli o indicizzazioni o trasformare agevolmente in una lista di punti.
Non c’e’ bisogno di usare direttamente RhinoCommon, salvo che tu voglia fare operazioni che rhinoscriptsyntax non puo’ fare.

Di niente, figurati !
Se hai qualche dubbio, chiedi pure. :slight_smile:

Ciao !