見出し画像

FigmaのPaste to ReplaceをIllustratorでも!

#朝までFigma にてPaste to Replaceが便利だ!と話題になりました。

  1. オブジェクトをコピー

  2. 置換したいオブジェクトを選択して⌘ + shift + Rキー

有料プラグイン

すぴかあやかさんがプラグインであったよ!とツイート(ポスト)されていました。

いろいろ細かいことができそうな反面、それが面倒そうでもあります。

スクリプト

次の条件でChatGPTが書いてくれました。

  • 対象となるオブジェクトの中心点に合わせる

  • ペースト時の大きさ変更は行わない

  • 対象となるオブジェクトは複数の場合がある

/**
 * 作成日:2024-10-27
 * 更新日:
 * 
 * スクリプト概要:
 * 選択した各オブジェクトを削除し、それぞれの中央座標にクリップボードの内容をペーストして置換します。
 * テキスト以外のオブジェクトが選択されている場合にのみ実行されます。
 * 
 * 制約:
 * - 選択されているのがテキストオブジェクトの場合、スクリプトは実行されません。
 * - クリップボードの内容が空の場合はエラーメッセージが表示されます。
 */

(function () {
    // ドキュメントが開かれているか確認
    if (app.documents.length === 0) {
        alert("ドキュメントが開かれていません。", "エラー");
        return;
    }

    var doc = app.activeDocument;
    var selection = doc.selection;

    // 選択されているオブジェクトが存在するか確認
    if (selection.length === 0) {
        alert("オブジェクトが選択されていません。", "エラー");
        return;
    }

    // テキストオブジェクトが選択されていないか確認
    if (isTextObjectSelected(selection)) {
        alert("テキストオブジェクトには対応していません。", "エラー");
        return;
    }

    try {
        // 選択された各オブジェクトを個別に処理
        for (var i = selection.length - 1; i >= 0; i--) {
            var target = selection[i];

            // オブジェクトの中央座標を取得
            var bounds = target.visibleBounds;
            var centerX = (bounds[0] + bounds[2]) / 2;
            var centerY = (bounds[1] + bounds[3]) / 2;

            // オブジェクトを削除
            target.remove();

            // クリップボードからペースト
            app.paste();

            // ペーストされたオブジェクトを取得
            var pastedItems = doc.selection;

            // 複数ペーストされる可能性があるため、全てを中央に移動
            for (var j = 0; j < pastedItems.length; j++) {
                var pastedItem = pastedItems[j];
                var pastedBounds = pastedItem.visibleBounds;
                var pastedCenterX = (pastedBounds[0] + pastedBounds[2]) / 2;
                var pastedCenterY = (pastedBounds[1] + pastedBounds[3]) / 2;

                // 中央座標に合わせるための移動量を計算
                var deltaX = centerX - pastedCenterX;
                var deltaY = centerY - pastedCenterY;

                // オブジェクトを移動
                pastedItem.position = [
                    pastedItem.position[0] + deltaX,
                    pastedItem.position[1] + deltaY
                ];
            }
        }

    } catch (e) {
        alert("エラーが発生しました:" + e.message, "エラー");
    }

    // 選択されたオブジェクトがテキストかどうかを確認する関数
    function isTextObjectSelected(selection) {
        for (var i = 0; i < selection.length; i++) {
            var item = selection[i];
            if (item.typename === "TextFrame" || item.typename === "LegacyTextItem") {
                return true;
            }
        }
        return false;
    }
})();

一応、動いています。

その他のソリューション

テキストなら

Gorolib Designさんのスクリプトが重宝します(100円)。

ダウンロード

Keyboard Maestroのマクロ化しました。

ここから先は

0字 / 1ファイル
月に10-20本くらいの記事を投稿しています。定期購読されると、更新のお知らせを受け取ったり、マガジン限定記事やサンプルファイルをダウンロードできます。

マガジン限定記事やサンプルファイルをダウンロードできます。

定期マガジンを購読されるとサンプルファイルをダウンロードいただけます。 https://note.com/dtp_tranist/m/mebd7eab21ea5