• このフォーラムは、www.cad3d.it/forum1 - イタリアのデザインコミュニティの機械翻訳です。いくつかの用語は正しく翻訳されていません。

選択したオブジェクトの一連の中央のx y z座標を見つける

  • Thread starter Thread starter x11start
  • Start date Start date

x11start

Guest
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
 
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!
 
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)

Code:
(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)
 
gentilissimi come sempre!
oggi provo ad assemblare il tutto... e poi metterò a disposizione del forum il risultato!
 
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)
 
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
 
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!
 

Attachments

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.
 

Attachments

"...これを行うには、"pink"として使用するために、私の選択のセンターピースを取得する方法を見つける必要があります。 . . "

このリスペスの有用性を理解していない。 選択した固体の中心の座標 x、y、z を返すコマンド "mass" (または propmass) を使用することは容易ではありませんか?
 
急なペースの3Dオブジェクトをオンにするには、このリスペックが必要です。
 
[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]私が知っているものから "mass" コマンドは、オブジェクトを時間通りにします。 選択の途中で1つのポイントだけを必要とし、余分な「クリック」をしなくても回転の「ピン」を持っている! お問い合わせ 私はレイジーです!?
 
私が知っているものから "mass" コマンドは、オブジェクトを時間通りにします。 選択の途中で1点だけ必要で、回転の「ピン」を持ちます。

オブジェクトを一度に作りません。 選択したすべての項目のそれを作ると、すぐにセンターピースの3座標を返します。 そういうわけで、これらのすべてのステップの有用性を理解していないんです。
 
・・・ これらのすべてのステップの有用性を理解していません。
ステップ:
- lisp で 1 つ (pseudo)baricentro を取得するオブジェクトを選択します。
- propmass で重力の中心を得るために目的を選びます

質問:オプション2で保存した手順は?

ユーティリティは、コマンドの継続のために lisp に座標を渡すことですが、propmass は手順として?

しかし、問題は、このコマンドで重力の中心が返されることです。これは、リスペスの目的のために非機能的なポイントであり、画像では赤色点は、オブジェクトを含む最小円の中心であるため、回転の中心として適しています。
620.JPG
 

Forum statistics

Threads
46,674
Messages
380,976
Members
2
Latest member
loop80
このフォーラムは、www.cad3d.it/forum1 - イタリアのデザインコミュニティの機械翻訳です。いくつかの用語は正しく翻訳されていません。

Members online

No members online now.
Back
Top