Skip to main content
Participating Frequently
July 23, 2020
解決済み

選択した複数のオブジェクト全体の中心で回転させるscript

  • July 23, 2020
  • 返信数 3.
  • 1201 ビュー

複数のオブジェクトを選択し、グループ化はせずに選択した全体(バウンディングボックス)の中心を基準に回転させたいのですが、方法がわからなくて困っています。ループを回すやり方だとそれぞれのオブジェクトの中心基準になってしまうので、ループは使えません。

pageItem.rotateの引数transformationでアンカーポイントを定義できそうなのですが、それ以前に、そもそも複数選択したものをdocument.selectionで変数に格納したとして、それはpageItemと見なされるのかgroupItemなのか、それとも全く別物なのかがよくわかっていません。

このトピックへの返信は締め切られました。
解決に役立った回答 Ten A

簡単に説明すると回転行列を生成してアフィン変換すればオブジェクトの回転は可能です。その際、TXとTYを適切に設定してやれば複数選択したオブジェクト群のローカル座標系の中心を基準に回転可能です。
基本的に全部のオブジェクトのジオメトリより全体のバウンズを取得した上で中心点を求めます。そこを基準として全てのアンカーポイントを下のの式に当てはめて座標を変換すればθぶん回転します。アンカーを操作するのは面倒なのでこういったケースではmatrixを利用して回転しTXとTYの設定で適切な位置に移動するようにすればよいでしょう。

 

x' = x*cos(θ) - y*sin(θ)
y' = x*sin(θ) + y*cos(θ)

返信数 3

Ten A
Community Expert
Ten ACommunity Expert解決!
Community Expert
July 29, 2020

簡単に説明すると回転行列を生成してアフィン変換すればオブジェクトの回転は可能です。その際、TXとTYを適切に設定してやれば複数選択したオブジェクト群のローカル座標系の中心を基準に回転可能です。
基本的に全部のオブジェクトのジオメトリより全体のバウンズを取得した上で中心点を求めます。そこを基準として全てのアンカーポイントを下のの式に当てはめて座標を変換すればθぶん回転します。アンカーを操作するのは面倒なのでこういったケースではmatrixを利用して回転しTXとTYの設定で適切な位置に移動するようにすればよいでしょう。

 

x' = x*cos(θ) - y*sin(θ)
y' = x*sin(θ) + y*cos(θ)

Participating Frequently
July 30, 2020

皆様いろいろご教示頂きましてありがとうございます。

アフィン変換を理解できておらず、またmatrixの使い方も良くわかっていないので、以下のようにしてみました。

 

①選択したオブジェクト全体のvisibleBoundsを取得

②アートボードの中心の座標を選択

③差分を算出し、オブジェクト全体をアートボードの中心に移動

④rulerOriginをアートボードの中心に変更

⑤rulerOriginを軸として回転(rotate)

 

何だか単純な計算を積み重ねただけのような感じになってしまいましたが、今回は選択オブジェクトを新規ドキュメントに貼り付けるに当たり、必要に応じて回転させるというものを作りたかったので、一応これでも実現できそうです。

今後、ご教示頂いたアフィン変換についても学習したいと思います。

ajabon grinsmith
Community Expert
Community Expert
July 29, 2020

ちょっとコードを書く時間がないのですが、

任意に複数選択した状態で、メニューコマンドの回転 だけで済みそうな気がしております。

ajabon grinsmith
Community Expert
Community Expert
July 29, 2020

よく考えたら(ぜんぜん考えてませんでした)executeMenuCommandだとダイアログが開くだけで引数が設定できませんね…

 

コードを提示する余裕はないのですが、

選択オブジェクトをn°回転するアクションを作成、アクション実行、アクション削除

という一連の処理をスクリプトでできるはずです。

どうしても計算やループがめんどくさかったらこの路線でぐぐってコードをツギハギするのがラクです。

kawamoto_α
Participating Frequently
July 24, 2020

selection自体は配列で、配列の中身は選択してるものに応じてPathItemだったりGroupItemだったりと変わりますが、どれもPageItemの仲間なのでgeometricBounds等のプロパティ、rotate等のメソッドを持ってますから、この場合区別する必要ないですよ。
(テキスト選択時だけは別ですが)