【まとめ】キーオブジェクトに整列・分布を実現するしくみ(Figmaプラグイン)

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る
キーオブジェクトの推察 概念図

こちらはFigma 開発 Advent Calendar 2022,23日目の記事です。

2022年12月に,キーオブジェクトに整列・分布するFigma/FigJam用プラグイン「Singari」を公開しました。すでにFigmaコミュニティの次のページからアクセス可能です。

FigmaプラグインSingari イメージ画像

Adobe Illustratorの同機能と似た,キャンバス上で追加選択したアイテムをキーオブジェクトとして扱う操作にこだわって開発しています。ぜひ使ってみてください。

使用方法など詳細は,別記事【解決】Figmaでもキーオブジェクトに整列・分布したい!にまとめました。興味があるかたはそちらをどうぞ。

今回の記事では開発者向けに,プラグインAPIでは不可能に見える 「キャンバス上で追加選択したアイテムをキーオブジェクトとして扱う操作」を実現した,そのしくみを解説します。

というのも,Figmaでは「こう考えて,こう開発しました」という内容の記事が公開されていて面白いのです。それに倣ってみようと思います。

そもそもキーオブジェクトに整列って何?

Adobe Illustratorにある機能です。アートボード上の特定のアイテム(キーオブジェクト)を基準とし,別のアイテムを動かしてそれに整列させます。キーオブジェクト自体の位置はそのまま変わりません。

次のように操作します。

  1. 整列したいアイテムをすべてを選択する
  2. キーオブジェクトにしたいアイテムを追加でタップする(修飾キーなどは不要)
  3. 上揃えなど,揃えたい方向のボタンを押す

ダイアログや文字入力を介さず,画面上の見た目がそのまま動作に反映されるのが使いやすさのポイントです。

Illustratorのキーオブジェクトに整列

Figmaにはキーオブジェクトの概念は存在しない

Figma自体が非対応なので当然のことながら,プラグインAPIにはキーオブジェクトを取得する機能はありません。何らかの別の方法で,特別扱いにするアイテムをプログラムから見分ける必要があります。

例えばAdobe XDの場合,プラグインAPIで選択アイテム一覧を取得すると,一覧はユーザーが選択した順番で並んでいます。最初か最後のアイテムを特別扱いするとわかりやすそうです。

しかしFigmaの選択アイテム(selection)仕様を見ると,順番は不特定なのであてにしてはいけないと書いてあります。さてどうしましょう。

ユーザーが選択を変更したときイベントが発生する

figma.onというイベントを司る部分の資料を見て,選択変更時に割り込み処理を入れられるとわかりました。つまり,そのとき選択アイテムを記録すれば最後に選択したアイテムは特定できます。それで行きましょう。

選択アイテムを記録するコードは次のようになります。

キーオブジェクトは論理的に推察する

記録した選択アイテム一覧を解析して,キーオブジェクトがどれか割り出します。条件は次の通りです。

  1. 最後に選択した1つのアイテムをキーオブジェクトとみなす
  2. 前回の選択アイテム今の選択アイテムを比べ,1つだけ増えたアイテムがあったらそれがキーオブジェクト
キーオブジェクトの推察 概念図

先程のコードを改造します。

整列・分布は地道に座標を計算してセットするだけ

キーオブジェクトが判明したら,それと整列対象アイテムの座標を調べて合わせるだけです。

Frameの中と外の座標系を揃えるため絶対座標で比較します。絶対座標は例えば次のようなfunctionで取得します。

取得した座標から移動先を算出したあと,整列対象アイテムのxやyのプロパティにセットして実際に移動します。

まとめ

このように,サービスに直接存在しない機能でも,単純な処理の組み合わせで案外実装できたりします。プログラミングは面白いですね。

作者に感謝を伝えたい!

Buy me a coffeeは、クレジットカード払いなどでクリエイターにコーヒーをおごれるサービスです。ツール・情報が役に立った! 感謝の気持ちを表現したい! というかた、おごっていただけましたら嬉しいです☕️

このサイトで配布しているスクリプトやその他のファイルを,無断で転載・配布・販売することを禁じます。
それらの使用により生じたあらゆる損害について,私どもは責任を負いません。
スクリプトやファイルのダウンロードを行った時点で,上記の規定に同意したとみなします。

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る

SNSでもご購読できます。

広告

コメントを残す