見出し画像

Illustratorで選択しているオブジェクトを引き連れて新規ドキュメントを作成するスクリプト

Illustratorで「一息ついたので、選択しているオブジェクトのみを別のドキュメントにしたい」とき、次の手順を踏みます。

  1. 選択しているオブジェクトをコピー

  2. 新規ドキュメントを作成

  3. ペースト

または、次の方法。

  1. ファイルを閉じて、Finder上でファイルを複製

  2. 複製したファイルを開き、不要なオブジェクトを削除

どちらも面倒です。

  • 前者:コピーしたタイミングでIllustratorが落ちやすい

  • 後者:「あれ、残したいの、どれだっけ?」となりがち。というか、閉じるの面倒い…

そこで、ChatGPTに手伝ってもらってスクリプトを作成しました。

スクリプトの仕様

選択したオブジェクトのみを引き連れて新規ドキュメントを作成するスクリプトです。

  • ロックされたオブジェクト:引き連れる

  • 非表示のオブジェクト:引き連れない

  • レイヤー構造:そのまま

ファイル名

  • 元のファイルと同じディレクトリに「temp-元のファイル名.ai」を作成

  • すでにある場合には「-1」「-2」を付ける

その他

  • 元ファイルを保存していない場合には保存される

  • 元のファイルは閉じる(開いたままにできない)

  • オブジェクトを選択していない場合には、オブジェクトは削除しない

よい点

  • 速い!! ただし、オブジェクトがむっちゃあると遅かったり、エラーが出ることも。

  • ファイルを複製しているので、レイヤー構造などがそのまま。アートボードなども残る。

  • コピーを使わないので、Illustratorが落ちにくい

アートボード編

選択しているオブジェクトを引き連れて新規アートボードを作成するスクリプトはGorolib Designさんが公開されています。

「引き連れて」!?

《0.5秒を積み上げろ》さんのブログ記事に感化されて使いました。
言い得て妙です。

スクリプト

ファイルとして使うときには「.jsx」の拡張子を付けてください。

// スクリプト開始
if (app.documents.length > 0) {
    // 現在のドキュメントを取得
    var originalDoc = app.activeDocument;

    // 現在のドキュメントのパスと名前を取得
    var originalFilePath = originalDoc.fullName;
    var originalFileName = originalDoc.name;

    // ファイル名と拡張子を分割
    var fileNameParts = originalFileName.split('.');
    var baseName = fileNameParts[0];
    var extension = fileNameParts.length > 1 ? '.' + fileNameParts[fileNameParts.length - 1] : '';

    // 一時的なファイル名のベースを作成(「temp-」と元のファイル名)
    var tempFileNameBase = "temp-" + baseName;
    var tempFileName = tempFileNameBase + extension;
    var counter = 1;

    // ファイル名が重複していないかチェック
    while (File(originalFilePath.path + "/" + tempFileName).exists) {
        // 重複している場合は連番を付ける
        tempFileName = tempFileNameBase + "-" + counter + extension;
        counter++;
    }

    // 最終的な一時的なファイルパスを作成
    var tempFilePath = new File(originalFilePath.path + "/" + tempFileName);

    // 現在のドキュメントを一時的なファイルとして保存
    originalDoc.saveAs(tempFilePath);

    // 一時的なファイルを開く
    var duplicateDoc = app.open(tempFilePath);

    // 選択されているオブジェクトの参照を配列に格納
    var selectedItems = [];
    for (var i = 0; i < originalDoc.selection.length; i++) {
        selectedItems.push(originalDoc.selection[i]);
    }

    // 非表示のオブジェクトを削除
    removeHiddenItems(duplicateDoc.layers, selectedItems);

    // 元のドキュメントを閉じる処理は削除
} else {
    alert("開いているドキュメントがありません。");
}
// スクリプト終了

// 非表示のアイテムを削除する関数
function removeHiddenItems(layers, selectedItems) {
    for (var i = layers.length - 1; i >= 0; i--) {
        var layer = layers[i];
        if (!layer.visible) {
            layer.remove();
            continue;
        }

        for (var j = layer.pageItems.length - 1; j >= 0; j--) {
            var item = layer.pageItems[j];
            // 選択されていない、ロックされていない、かつ非表示のアイテムを削除
            if (!isItemSelected(item, selectedItems) && !item.locked && !item.visible) {
                item.remove();
            }
        }
    }
}

// アイテムが選択されているかをチェックする関数
function isItemSelected(item, selectedItems) {
    for (var i = 0; i < selectedItems.length; i++) {
        if (item === selectedItems[i]) {
            return true;
        }
    }
    return false;
}

用途によっては…

  • ロックされたオブジェクトも削除したいかも

  • レイヤーを統合したいかも

ダウンロード

スクリプトファイル

ここから先は

19字 / 1画像 / 2ファイル
月に10-20本くらいの記事を投稿しています。定期購読されると、更新のお知らせを受け取ったり、マガジン限定記事やサンプルファイルをダウンロードできます。 購読を開始した月に更新された記事から読むことができます(初月無料)。

DTP Transit 定期購読マガジン

¥100 / 月 初月無料

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

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