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

x11start

Utente Standard
Professione: Disegnatore prefabbricati
Software: Autocad
Regione: Piemonte
#1
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
#3
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
#6
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
#7
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
#8
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
#9
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
#10
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
#11
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