Deviazione tra superfici

buongiorno a tutti,
pongo un quesito riguardante la deviazione tra due superfici, se voglio sapere la distanza massima e minima tra due superfici e ricorro al comando point deviation l’unico valore che mi pare mi restituisca la distanza tra le due è il valore Median distance (che mi da la distanza media tra le due superfici)
e nel caso di una superfice offsettata già non capisco come mai il valore non corrisponda a quello dell’offset (allego un esempio di offset senza loose nelle impostazioni di 75mm e che se confrontato con il point deviation mi da appunto 75.28 come valore di distanza media…)


offset75mm.3dm (108,4 KB)

inoltre la domanda è: ma se dovessi sapere la deviazione minima e massima tra due superfici o meglio ancora tra due polisuperfici esiste un comando o una procedura?
point deviation mi pare che si basi sempre su set di punti (quindi cloud di punti o appunto nell’esempio postato attivando i control point di una superfice che per definizione non giaciono sulla superfice eccezion fatta per quelli di perimetro della superficie primitiva)
grazie in anticipo per chi ha esperienza e contribuisce a chiarirmi il dubbio

Ciao Marco

Premesso che forse il comando c’e’, eventualmente combinando piu’ comandi,
ma io non riesco a capire come fare … :confused:

( Sarebbe strano se non ci fosse )

Comunque per estrarre dei punti da una superficie ti consiglierei di usare una mesh ausiliaria.
Ricavi la mesh dalla superficie e poi i punti dalla mesh, cosi’ ottieni punti che giacciono sulla superficie.

Dicevo … dato che non so (non mi ricordo) come fare usando i comandi, ho imbastito una piccola definizione … che non funziona :roll_eyes:
( Ma credo che la cosa sia risolvibile )

srfsrfdist

srfsrfdist.gh (9,8 KB)

Il problema con la definizione e’ che non riesco a estrarre l’ultimo elemento dalla lista ( che contiene le distanze tra i punti e la superficie )

Non riesco a sottrarre 1 da 121 per avere 120 … OK con GH sono un niubbo eterno …:smile:
( Cioe’ 121 in questo caso di mesh 10 X 10, poi certo il valore varia )

Se qualche esperto ci dice come fare, credo che poi la definizione possa servire per verificare le distanze che cerchi.

EDIT

Aspetta, ho visto che prende anche indici negativi …

srfsrfdist2

srfsrfdist2.gh (10,4 KB)

Cosi’ sembra che funzioni.

( La prova e’ fatta con un offset di 1 mm, quindi l’offset sembra OK )

Lascio comunque anche la prima versione ‘buggy’ perche’ in ogni caso vorrei sapere dagli esperti cosa sbaglio. :slight_smile:

Grazie !

1 Mi Piace

Grazie Emilio, sei sempre un mito!
Purtroppo io neppure non novello di gh posso definirmi… e mi auguravo di capire come fare a ottenere le distanze in modo snello in rhino senza ricorrere a gh, tipo fare un check veloce di distanza tra due superfici rapido e frequente…
Estrarre i punti da mesh mi pare già un buon consiglio per poi eseguire il point deviation, anche se mi rimane il dubbio di come mai nell’esempio da me postato il responso della distanza media sia differente dal valore di offset usato per generare la superficie in oggetto… mistero

Si’, certo.
Si puo’ fare la stessa cosa con uno script.
Credo che cambi solo il modo di definire la mesh …
Se riesco provo poi a scrivere qualcosa, ma non prometto … sorry. :neutral_face:
Ma forse qualcuno mi precede. :slight_smile:

Quale delle due superfici ?
Ci sono due offset nel file postato.
Provando con la definizione, a me risulta un errore di circa 3 centesimi per la superficie piu’ ‘fitta’, con 34 x 18 CV
E un errore oltre il mm per l’altra, con 5 x 9 CV.
( Usando una mesh di 10 x 10 facce )

I punti per calcolare le distanze come il hai ricavati ?
Se sono i CV, come mi sembra di capire, ovviamente, come hai detto tu, non sono tutti sulla superficie, quindi non servono.

Ciao Marco

Se vuoi provare questo …

import rhinoscriptsyntax as rs

def main():
  su0 = rs.GetObject( 'Reference surface ?', 8, True )
  if not su0:
    return
  rs.UnselectAllObjects()
  su1 = rs.GetObject( 'Surface to check ?', 8 )
  if not su1:
    return
  rs.UnselectAllObjects()
  rs.EnableRedraw( False )
  rs.SelectObject( su1 )
  rs.Command( '_Mesh' )
  rs.UnselectAllObjects()
  me = rs.FirstObject()
  ves = rs.MeshVertices( me )
  rs.DeleteObject( me )
  rs.EnableRedraw( True )
  diss = []
  for ve in ves:
    uv = rs.SurfaceClosestPoint( su0, ve )
    if uv:
      pt = rs.EvaluateSurface( su0, uv[ 0 ], uv[ 1 ] )
      dis = rs.Distance( ve, pt )
      diss.append( dis )
  diss.sort()
  msg = 'Min. distance: %.4f - Max. distance: %.4f' % ( diss[ 0 ], diss[ -1 ] )
  print msg

main()

Scusa … meglio cosi’:

import rhinoscriptsyntax as rs

def main():
  su0 = rs.GetObject( 'Reference surface ?', 8, True )
  if not su0:
    return
  rs.UnselectAllObjects()
  su1 = rs.GetObject( 'Surface to check ?', 8 )
  if not su1:
    return
  rs.EnableRedraw( False )
  fir = rs.FirstObject()
  rs.SelectObject( su1 )
  rs.Command( '_Mesh' )
  rs.UnselectAllObjects()
  me = rs.FirstObject()
  if me == fir:
    rs.EnableRedraw( True )
    print( 'Mesh command failed ... sorry' )
    return
  ves = rs.MeshVertices( me )
  rs.DeleteObject( me )
  rs.EnableRedraw( True )
  diss = []
  for ve in ves:
    uv = rs.SurfaceClosestPoint( su0, ve )
    if uv:
      pt = rs.EvaluateSurface( su0, uv[ 0 ], uv[ 1 ] )
      dis = rs.Distance( ve, pt )
      diss.append( dis )
  diss.sort()
  msg = ( 'Checked %d points - Min. distance: %.4f - Max. distance: %.4f' % 
      ( len( ves ), diss[ 0 ], diss[ -1 ] ) )
  print( msg )

main()
1 Mi Piace

ciao Emilio,
ho provato ad inserire il tuo script in un comando ma mi da questo errore


ho inserito direttamente lo script in un comando in questo modo

come indicato sull’help su internet e l’errore si riferisce alla riga 4

su0 = rs.GetObject( ‘Reference surface ?’, 8, True )

sicuramente mi sto sbagliando io in qualche punto nell’inserire lo script…

E’ uno script in Python, non VBScript.

Qui avevo provato a spiegare come usare ‘sti script.
( Perche’ ogni volta devo farlo io, McNeel pare si diverta a non divulgare le necessarie informazioni … )

sarò io impedito ma anche seguendo le indicazioni mi da questo errore

e il comando da tasto destro del bottone è inserito così

anche togliendo il ! iniziale il messaggio di errore resta lo stesso

e per permetterti di capire se sbaglio e dove ti copio il testo del comando da me inserito

_-RunPythonScript (

def main():
su0 = rs.GetObject( ‘Reference surface ?’, 8, True )
if not su0:
return
rs.UnselectAllObjects()
su1 = rs.GetObject( ‘Surface to check ?’, 8 )
if not su1:
return
rs.EnableRedraw( False )
fir = rs.FirstObject()
rs.SelectObject( su1 )
rs.Command( ‘_Mesh’ )
rs.UnselectAllObjects()
me = rs.FirstObject()
if me == fir:
rs.EnableRedraw( True )
print( ‘Mesh command failed … sorry’ )
return
ves = rs.MeshVertices( me )
rs.DeleteObject( me )
rs.EnableRedraw( True )
diss =
for ve in ves:
uv = rs.SurfaceClosestPoint( su0, ve )
if uv:
pt = rs.EvaluateSurface( su0, uv[ 0 ], uv[ 1 ] )
dis = rs.Distance( ve, pt )
diss.append( dis )
diss.sort()
msg = ( ‘Checked %d points - Min. distance: %.4f - Max. distance: %.4f’ %
( len( ves ), diss[ 0 ], diss[ -1 ] ) )
print( msg )

main()
)

E mi sa che è proprio strano. :zipper_mouth_face:

Mi hai fregato sul tempo, stavo giusto postando io uno script … :joy:
Emy, e chi ti batte sugli script??
Tra l’altro carino, molto più comodo della definizione GH.
Come detto, peccato non ci sia nulla in Rhino per questo tipo di controllo … qualcosa di analogo al CrvDeviation insomma.

ciao Gambler, riesci a spiegarmi perchè non riesco a far eseguire il comando?

Intendi lo script python?

si, quello postato da Emilio, ho provato a inserirlo in un comando e ho postato il testo perchè mi da errore nell’utilizzo

Non saprei, prova una cosa semplice.

Vai in: Tools-PythonScript-Edit
Incolla il testo dello script di Emilio in una file vuoto e salvalo con un nome dove sei comodo.
Poi torna in Tools-PythonScript-Run e lancia lo script.
Così funziona?

si, così funziona

ma non riesco a caricarlo editando un pulsante di rhino

EUREKA!!! ci son riuscito!!! miracolo!!!
caspita ma che impresa…
resta comunque il dubbio di come mai non riesca a inserire lo script direttamente nel comando ma è già oro che sia riuscito a farglielo caricare dal bottone

Ciao Marco.

Scusa la risposta … lenta. :wink:

Da quello che hai postato, mi sembra che nel pulsante manchi la prima linea dello script:

import rhinoscriptsyntax as rs

Se inserisci anche quella, credo che il pulsante possa funzionare. :slight_smile: