Cogliere il vertex index di una mesh

buongiono , ecco un altro questito che riguarda le meshes:

data una mesh ho bisogno di esplorare la zona attorno ad un vertice che devo selezionare col mouse di volta in volta.

Esiste un modo per ottenere rapidamente il vertex index di un vertice , cliccandolo o passandoci vicino?

aspetto con fiducia, un saluto a tutti

franco

Ciao Ing!!!
In rhscriptsintax guarderei a
GetMeshFaces + GetMeshVertices

esattamente!

grazie ciao

franco

Giuseppe ! abbiamo cantato vittoria troppo presto!

se selezioni un vertice di da un indice che non corrisposnde alla vertex index : fai una mesh e prova prova questo script:

import rhinoscriptsyntax as rs

mesh = rs.GetObject(“Select mesh”, rs.filter.mesh)

listavertici = rs.MeshVertices(mesh)

if mesh:
indices = rs.GetMeshVertices(mesh)
if indices:
for index in indices:
print index
rs.AddTextDot(str(index),listavertici[index])

scopri che se selezioni un vertice , ti mette il dot su un vertice diverso:
dov’e’ l’inghippo?

ciao franco

Vero.
Sembra restituire un indice di tipo diverso.
Forse e’ un bug ?
Sentiamo Giuseppe …

hummmmmmmmmmm… mica sono sicuro che è un bug.
Nel senso che mi sono fatto una definizione elementare in GH per verificare alcune cose.
I numeri che si piazzano in GH sono giusti e così anche la lista che viene creando un semplice componente Py in GH.
La differenza grande è se i vertici sono o non sono saldati.
Mi sono spiegato a pene di segugio… ma se buttate un occhio agli allegati forse si rischiara la vallata…
meshvertex.3dm (57.4 KB) meshvertex.gh (12.5 KB)

Ciao Giuspa !
Adesso non riesco, provero’ poi a casa.
Comunque le varie liste restituite con vertici e facce non danno problemi.
E’ solo rs.GetMeshVertices() che non mi convince …
Per ora grazie !
Ciao

Ciao Giuseppe,

Ho provatoa saldare i vertici del tuo modellino , a triangolare la facce , a ricostruire la mesh , le sue normali , ma con uno script pyhton non si cava un ragno dl buoco. Credo che ci sia qualcosa che non va. Sembra che la vertex list che usa per GetMeshVertices() sia diversa dalla vertex list ottenuta con rs.MeshVertices().

speriamo di venirne fuori
ciao
franco

Rieccomi …
OK, la definizione GH funziona e non ho motivo di dubitare dei risultati.
Ma secondo me quello che sembra zoppicare e’ rs.GetMeshVertices().
Per cui ho provato a inserire le istruzioni di rs.GetMeshVertices() nello script di Franco,
leggermente modificate in modo da registrare anche il punto di selezione.
L’output dello script e’ cambiato in modo da mostrare 3 cose:

  1. L’indice del vertice restituito dal metodo
  2. Il punto di selezione (che dovrebbe corrispondere al vertice)
  3. La posizione del vertice con quell’indice, data da rs.MeshVertices()

Provando su questo file:
meshvertex2.3dm (53.8 KB)

Ottengo piu’ risultati errati che risultati esatti.

qui c’e’ lo script usato:

import rhinoscriptsyntax as rs
import scriptcontext
import Rhino

def GetMeshVertices(object_id ):
  scriptcontext.doc.Objects.UnselectAll()
  scriptcontext.doc.Views.Redraw()
  object_id = rs.coerceguid(object_id, True)
  class CustomGetObject(Rhino.Input.Custom.GetObject):
    def CustomGeometryFilter( self, rhino_object, geometry, component_index ):
      return object_id == rhino_object.Id
  go = CustomGetObject()
  go.GeometryFilter = Rhino.DocObjects.ObjectType.MeshVertex
  go.AcceptNothing(True)
  if go.GetMultiple(1,0)!=Rhino.Input.GetResult.Object: return None
  objrefs = go.Objects()
# rc = [item.GeometryComponentIndex.Index for item in objrefs]
###############################
  rc = []
  for obref in objrefs:
    index = obref.GeometryComponentIndex.Index
    point = obref.SelectionPoint()
    rc.append( [ index, point ] )
###############################
  go.Dispose()
  return rc

mesh = rs.GetObject("Select mesh", rs.filter.mesh)
listavertici = rs.MeshVertices(mesh)
if mesh:
  rc = GetMeshVertices(mesh)
if rc:
  for xp in rc:
    ind, pnt = xp 
    p2 = listavertici[ ind ]
    info = 'Index %d\nPICK:\nX%.2f\nY%.2f\nZ%.2f\nVERTEX:\nX%.2f\nY%.2f\nZ%.2f' % (
        ind, pnt.X, pnt.Y, pnt.Z, p2.X, p2.Y, p2.Z )
    rs.AddTextDot(info,listavertici[ind])

OK, forse ho messo su’ un ragionamento un po’ contorto, ma … non riesco a fare di meglio … :blush:

La mia impressione e’ che il valore ottenuto in questa istruzione

    index = obref.GeometryComponentIndex.Index

possa non essere esatto …

Cosa vi sembra ? :smiley:
Ciao !

Ciao Emilio e Giuseppe,
effettivamente i risultati lasciano molto perplessi: inoltre se “saldi” i vertici della mesh ottieni risultati dubbi , ma differenti da quelli di prima.
Credo che Giuseppe dovrebbe parlarne con i programmatori

ciao
franco

OK. Ne parlo con i programmatori.
Sarò assente per lavoro dal lunedi 25 a lunedi 1 giugno. Spero di riuscire prima.

Thanks ! :smiley:

Ciao Giuseppe e ciao Emilio,

c’e qualche novita’ circa in nostro “vertex index” ?

ciao
franco

Ciao Ing.!
Sono stato fuori una settimana e non ho seguito. Non credo che ci sia stato il tempo per sistemarlo a Seattle. E’ comunque nel bugtracker.

Fatto:

Vi incollo direttamente la risposta che non è farina del mio sacco e pertanto riporto come doveroso virgolettata.

"Instead of the mesh vertices you need the mesh topology vertices because there can be multiple vertices at each location to express the normals of each connecting faces. In the mesh you provided there are 26 topology vertices and 54 ((8corners3 + 12edges2 + 6center) vertices.

So instead of:
listavertici = rs.MeshVertices(mesh)
you need
listavertici = (rs.coercemesh(mesh)).TopologyVertices

There’s no rs.MeshTopologyVertices(mesh_id)."

diavolo! mi sembrava impossibile che ci fosse un errore cosi’ grossolano! certo che una migliore documentazione da parte di chi programma non sarebbe male … Non credo che qualcuno del forum ci sarebbe arrivato da solo.

Mi pare che sia bene tenere sott’occhio “rs.coercemesh()” e tutti gli analoghi rs.coercequalcosa(). Anzi se qualcuno ha un po’ di documentazione con esempi in materia, sara’ un benemerito.

ciao
franco

Ho dato un’occhiata in giro e ho trovato nei forum queste brevi spiegazioni che chiariscono molto:

“”"
Helvetosaur
Sep '13

Python is a bit different than vb Rhinoscript, it is an
object-oriented language. Whereas in vb Rhinoscript a point is
represented by a simple array of three numbers, in Python, a 3dpoint
is a type of object. If you simply define a point in Python by a list
or tuple [x,y,z] or (x,y,z) it is not recognized as a 3dpoint object
by RhinoCommon. rs.coerce3dpoint will take a list or tuple of three
numbers - or even the object ID of an existing point object - and
return a real Python 3dpoint object.
Most of the Python rhinoscriptsyntax methods actually use
coerce3dpoint and other “coerce” methods behind the scenes
to make it easier for the user to use simple scripting methods
similar to vb Rhinoscript without having to worry too much about the
complexities of OOP in Python.
–Mitch

“”""

vedere anche il qui sotto link, dopo qualche scambio di battute si parla anche del “coerce…”

riciao franco

Hai ragione Franco…
perfettamente.
Però:
considera che neanche abbiamo finito di documentare Rhino Mac e GH…
Che quello che documenti poi lo devi tradurre e nota che su questo noi italiani siamo un caso disperato…
Dovremmo assumere un esercito di gente a documentare a scapito degli sviluppatori… e qualcuno comincerebbe a correrci dietro col badile…

Beh molto interessante il fatto che ci siano dei metodi “coerce” per sgattaiolare dalle rogne.
Sapendo che esistono e trovandosi di nuovo in condizioni di stallo, si può chiedere direttamente allo sviluppatore se esiste un metodo “coerce” per risolvere.
Un po’ come con i comandi “test-comando” che non sono pubblicizzati ma che a volte aiutano molto…
Ciao!

ciao Lucio,
cosa sono questi metodi “test-comando” ? sembrano essere interessanti…
ciao
franco