Trovare le coordinate x y z del baricentro di una serie di oggetti selezionati

x11start

Utente Standard
Professione: Disegnatore prefabbricati
Software: Autocad
Regione: Piemonte
Vorrei fare un comando lisp che mi consenta di selezionare una serie di oggetti e poi ruotarli a step di 90° premendo i tasti X Y o Z.
Per far questo dovrei trovare un modo per ottenere il baricentro della mia selezione (che può essere ovviamente di vari elementi) in modo da utilizzarlo come "Perno".
Qualcuno saprebbe aiutarmi?
Grazie
 

x11start

Utente Standard
Professione: Disegnatore prefabbricati
Software: Autocad
Regione: Piemonte
Dove le trovo le coordinate del "Bounding box" di ogni oggetto (il parallelepipedo teorico che lo racchiude)? Saresti così gentile da scrivere un po' di codice che fa quel che mi dici? .... non saprei da dove cominciare!
In alternativa risolvo la cosa con un semplice "click" in un vertice qualunque degli oggetti selezionati....
tuttavia sarebbe interessante (almeno da parte mia!) imparare nuove cose sul lisp!
 

GP.

Utente Senior
Professione: Nientologo
Software: uozapp
Regione: Vercelli
Nella variabile perno viene memorizzato il punto base per la rotazione.
In coda al listato aggiungi il lisp di lee Mac di cui al link sopra (MinEncCircle.lsp)

Codice:
(defun c:test ( / sel n _p1 _p2 p perno)
    (if (and
            (princ "\nSelezionare gli oggetti da ruotare")
            (setq sel (ssget))
        )
        (progn
            (repeat (setq n (sslength sel))
                (vla-getboundingbox (vlax-ename->vla-object (ssname sel (setq n (1- n)))) 'p1 'p2)
                (setq _p1 (vlax-safearray->list p1))
                (setq _p2 (vlax-safearray->list p2))
                (setq p (cons (list (car _p1) (cadr _p1)) p))
                (setq p (cons (list (car _p2) (cadr _p1)) p))
                (setq p (cons (list (car _p2) (cadr _p2)) p))
                (setq p (cons (list (car _p1) (cadr _p2)) p))
            )
            (setq perno (car (LM:MinEncCircle p)))
        )
    )
)

(vl-load-com)
 

x11start

Utente Standard
Professione: Disegnatore prefabbricati
Software: Autocad
Regione: Piemonte
Gentilissimi come sempre!
Oggi provo ad assemblare il tutto... e poi metterò a disposizione del forum il risultato!
 

Cristallo

Utente Standard
Professione: Leggo e confronto
Software: Lettura critica
Regione: Fuori dalla cerchia
GP grande maestro :)

il lisp restituisce le coordinate del punto di rotazione, ma solo a linea di comando
La variabile perno è una locale... si autodistrugge al termine della procedura o_O
Le chiedo umilmente scusa, con la faccia sotto i piedi, e senza neanche chiederle di stare fermo :ROFLMAO:

Chapeaux

(defun c:test ( / sel n _p1 _p2 p perno)
(if (and
(princ "\nSelezionare gli oggetti da ruotare")
(setq sel (ssget))
)
(progn
(repeat (setq n (sslength sel))
(vla-getboundingbox (vlax-ename->vla-object (ssname sel (setq n (1- n)))) 'p1 'p2)
(setq _p1 (vlax-safearray->list p1))
(setq _p2 (vlax-safearray->list p2))
(setq p (cons (list (car _p1) (cadr _p1)) p))
(setq p (cons (list (car _p2) (cadr _p1)) p))
(setq p (cons (list (car _p2) (cadr _p2)) p))
(setq p (cons (list (car _p1) (cadr _p2)) p))
)
(setq perno (car (LM:MinEncCircle p)))

(command "_circle" perno 0.5)
(command "_rotate" sel "" perno)

)
)
)

(vl-load-com)
 

GP.

Utente Senior
Professione: Nientologo
Software: uozapp
Regione: Vercelli
La variabile perno è una locale... si autodistrugge al termine della procedura
E' per fornire a x11start il centro di rotazione, non so come lui intenda procedere poi con il lisp.
Per dovuta precisazione "perno" calcolato con il metodo del bounding box non è il vero centro degli oggetti selezionati, ma è funzionale all'uso del lisp (meglio che cliccare a caso).

...con la faccia sotto i piedi, e senza neanche chiederle di stare fermo :ROFLMAO:
Pensavo di saltellare… :D
 

x11start

Utente Standard
Professione: Disegnatore prefabbricati
Software: Autocad
Regione: Piemonte
Ecco il risultato:si selezionano gli oggetti e poi si sceglie l'asse di rotazione. Dopo la prima scelta si può continuare a ruotare gli oggetti sullo stesso asse, premendo Invio.
Il tasto 'E' consente di uscire, mentre premendo 'Esc' si torna alla rotazione iniziale.

Subito avevo pensato di usare Invio per uscire... ma è più comodo usarlo per confermare lo stesso asse.
Un ulteriore miglioramento sarebbe far accettare direttamente X Y e Z senza dover dare l'invio:
pensavo allo scopo di "scomodare" GRREAD.... ci penserò quando avrò un attimo di tempo.

Grazie a tutti per l'aiuto!
 

Allegati

x11start

Utente Standard
Professione: Disegnatore prefabbricati
Software: Autocad
Regione: Piemonte
Ecco la nuova versione: ho inserito "GRREAD" per rilevare i tasti premuti, così ora non è più necessario confermarli con 'INVIO'.
Sostanzialmente ora si tratta di selezionare gli oggetti e poi farli ruotare nelle 3 direzioni, premendo i tasti X Y o Z, mentre Invio o Spazio servono per uscire (confermando la rotazione effettuata), mentre 'ESC' riporta alla rotazione iniziale.
 

Allegati

giulio1962

Utente poco attivo
Professione: disegnatore
Software: cad
Regione: Marche
"...Per far questo dovrei trovare un modo per ottenere il baricentro della mia selezione (che può essere ovviamente di vari elementi) in modo da utilizzarlo come "Perno"..."

Non ho ben capito l'utilità di questo lisp. Non sarebbe stato più semplice utilizzare il comando "massa" (o propmass) che restituisce le coordinate x, y, z del baricentro dei solidi selezionati?
 

x11start

Utente Standard
Professione: Disegnatore prefabbricati
Software: Autocad
Regione: Piemonte
Questo lisp mi serve per girare velocenente degli oggetti 3D, per poterli assemblare con altri.
 

x11start

Utente Standard
Professione: Disegnatore prefabbricati
Software: Autocad
Regione: Piemonte
[QUOTE="giulio1962,.... Non sarebbe stato più semplice utilizzare il comando "massa" (o propmass) che restituisce le coordinate x, y, z del baricentro dei solidi selezionati?[/QUOTE]
Il comando "Massa", da quel che so io, lo fa di un oggetto alla volta... a me serviva solo un punto in mezzo alla selezione, per avere un "perno" di rotazione, senza dover fare un "click" in più! Lo so.... sono un pigro! 😴
 

giulio1962

Utente poco attivo
Professione: disegnatore
Software: cad
Regione: Marche
"Il comando "Massa", da quel che so io, lo fa di un oggetto alla volta... a me serviva solo un punto in mezzo alla selezione, per avere un "perno" di rotazione, "

Non lo fa di un oggetto alla volta. Lo fa di tutti gli oggetti selezionati, e poi restituisce velocemente le 3 coordinate del baricentro. E per questo che non capisco l'utilità di tutti questi passaggi.
 

GP.

Utente Senior
Professione: Nientologo
Software: uozapp
Regione: Vercelli
...non capisco l'utilità di tutti questi passaggi.
Passaggi:
- con il lisp selezioni gli oggetti per ricavare uno (pseudo)baricentro
- con PROPMASS selezioni gli oggetti per ricavare il baricentro

Domanda: con l'opzione 2 quanti passaggi ho risparmiato?

Senza contare che l'utilità è passare le coordinate al lisp per la prosecuzione del comando, con PROPMASS come le passo?

Di solidi si è comunque parlato solo verso fine discussione (PROPMASS funziona solo su regioni o solidi), ma il problema è che con questo comando viene restituito il baricentro, ovvero un punto non funzionale allo scopo del lisp, nell'immagine il punto rosso è il baricentro, il punto giallo è il centro del minimo cerchio che contiene l'oggetto, quindi più idoneo come centro di rotazione.

620.JPG