Allineare oggetti al centro del piano

Ciao a tutti,
vorrei creare uno script che prenda uno o piu’ oggetti e li allinei al centro del piano di costruzione. Per esempio: ho due cubi di dimensioni diverse, il cubo piccolo è posizionato sopra il cubo grande: selezionandoli entrambi (magari ragruppandoli) lo script dovrebbe prendere in considerazione il centro della faccia inferiore del cubo grande per portare i 2 solidi al centro del piano di costruzione.
Credo di essere molto lontano dalla soluzione, mi potete dare qualche spunto?

Grazie a tutti,
Luca.

Ciao. La premessa mi sembra in contraddizione con l’esempio.
A mio modesto avviso, per ogni script o definizione… è fondamentale che il quesito sia chiaro e univoco. Altrimenti oltre a non trovare la soluzione… non trovi nemmeno la strada.
Ipotizziamo che il piano sia XY?
Vuoi che l’allineamento sia rispetto ai centroidi dei pezzi e relativo al vettore Z? (Centroidi su asse Z)
Per ottenere il nuovo posizionamento i pezzi devono traslare solo in XY?
Banalmente: hai provato i comandi di allineamento di Rhino?

Ciao Giuseppe,
lo sapevo che non mi ero spiegato bene :disappointed_relieved:
In Rhinogold c’è un comando che si chiama GotoCenter, praticamente muove uno o piu’ oggetti al centro del cplane, ma lo fa considerando il centroide del pezzo o pezzi selezionati.
Ecco un esempio:

Io invece vorrei il posizionamento al centro del cplane considerando il centro della base dei solidi in oggetto, una cosa di questo tipo:

Sparo: :fireworks: Immagino che lo script debba costruire una boundingbox per determinare la base delle geometrie selezionate per poi utilizzare rs.MoveObjects per traslare il tutto, ma se fosse così come faccio a determinare il centro della base??? :cold_sweat: .

Grazie Mille!

Ciao Luca

lo puoi fare in questo modo:

bb = rs.BoundingBox( guid )
pnt = ( bb[ 0 ] + bb[ 2 ] ) / 2

Ciao !

1 Mi Piace

Ciao Luca,
Lo sai che ci sono già i comandi di allineamento in Rhino, e uno di questi fa esattamente quello che chiedi, vero?
Giusto per non lasciare nulla al caso…
Riccardo

@Riccardo_Gatti:
li ho provati ma non fanno quello che voglio, dove sbaglio?

@Emilio
Grazie!

bb = rs.BoundingBox( guid )
pnt = ( bb[ 0 ] + bb[ 2 ] ) / 2

considera i 2 vertici opposti alla base della BoundingBox trovandone il centro, giusto?

import rhinoscriptsyntax as rs
objs= rs.GetObjects("Seleziona gli oggetti") 
box = rs.BoundingBox(objs)
pnt = ( box[ 0 ] + box[ 2 ] ) / 2        
end = rs.GetPoint("Seleziona il punto")
translation = end-pnt
rs.MoveObjects (objs, translation)

Per ora questo funziona, solo vorrei che traslasse sulle coordinate 0,0,0 in automatico, senza selezionare il punto, come posso fare? :pray:
Grazie,
Luca

Prova questa macro.

_Align _Pause _Concentric 0,0,0 (centro delle coordinate o qualunque punto tu voglia.)

Se invece di 0,0,0 metti _pause ti chiederà di selezionare un punto sullo schermo.

-R-

1 Mi Piace

Ciao Riccardo,
la macro trasla in XY ma non in Z

Giusto !

credo che cosi funzioni (dovendo traslare sul punto 0,0,0 )':

translation = -pnt

Ciao !

Si, hai ragione, Align è un comando 2D, cioè opera rispetto al piano di lavoro.
Se ripeti la marco con un altra vista ottiene l allineamento sui 3 assi.

@Riccardo_Gatti
trovo piu’ comodo lo script, grazie cmq.

@emilio

è come dire: torna a casa Lassie :smile:
…e cmq funziona che è una meraviglia!
Grazie emilio :thumbsup:

:smile:

ciao Riccardo, grazie per questa macro molto utile😉