Illustratorのドキュメントサイズにマスクを作成するスクリプト|入稿チェックやデザイン確認に便利!

スポンサーリンク
素材・テンプレ
スポンサーリンク

Illustratorでチラシやバナーを作っていると、

「アートボードからはみ出した部分だけ隠したい」

「入稿前に仕上がりサイズで確認したい」

「毎回長方形を作ってマスクするのが面倒…」

と思うことはありませんか?

そんな時に便利なのが、ドキュメントサイズに合わせてマスクを自動作成するIllustratorスクリプトです。

この記事では、現在のアートボードサイズぴったりのクリッピングマスクを作るスクリプトを紹介します。

公開方法はコピペ方式

難しい設定なしで使えますよ。

Illustratorでドキュメントサイズのマスクを作るメリット

Illustratorでデザインをしていると、アートボードの外にはみ出した素材が気になることがあります。

素材自体にマスクをかければいいのですが、それだと微調整したいときにしにくかったりしますよね。

特に以下のような場面では、ドキュメントサイズのマスクがあると便利です。

  • 入稿前の仕上がり確認
  • SNS画像やバナーの見え方チェック
  • チラシやポスターのデザイン確認
  • アートボード外の不要な要素を一時的に隠したい時
  • クライアント確認用の見た目を整えたい時

通常は、長方形ツールでアートボードサイズの四角形を作り、前面に配置して、クリッピングマスクを作成します。

でも、毎回この作業をするのは地味に面倒ですよね。

そこでスクリプト化しておくと、かなり時短できます。

今回作成するスクリプトの内容

今回のスクリプトでは、以下のことができます。

  • 現在選択しているアートボードを対象にする
  • アートボードサイズの長方形を自動作成
  • その長方形を使ってクリッピングマスクを作成
  • マスク用の四角形の色は設定可能(CMYK)
  • グループ化してマスク状態にする

つまり、選択したデザインをアートボードサイズで切り抜くスクリプトです。

入稿前の確認用としてかなり使いやすいですね。

ドキュメントサイズにマスクを作成するスクリプト

以下のコードをそのままコピーして使ってください。

Illustratorスクリプトの使い方

手順1:スクリプトをコピーする

#target illustrator

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

    var doc = app.activeDocument;

    var LAYER_NAME = "マスク(印刷しない)";
    var PREVIEW_NAME = "__outer_mask_preview__";
    var FINAL_NAME   = "__outer_mask_final__";

    var DEFAULT_MARGIN_MM = 3;
    var isUpdatingPreview = false;

    function mmToPt(mm) {
        return mm * 2.834645669291339;
    }

    function clamp100(v) {
        v = parseFloat(v);
        if (isNaN(v)) v = 0;
        if (v < 0) v = 0; if (v > 100) v = 100;
        return v;
    }

    function getOrCreateLayer() {
        var lyr;
        try {
            lyr = doc.layers.getByName(LAYER_NAME);
        } catch (e) {
            lyr = doc.layers.add();
            lyr.name = LAYER_NAME;
        }

        lyr.locked = false;
        lyr.visible = true;
        try { lyr.printable = false; } catch (e2) {}

        return lyr;
    }

    function findPageItemByName(container, name) {
        var i;

        for (i = container.pageItems.length - 1; i >= 0; i--) {
            if (container.pageItems[i].name === name) {
                return container.pageItems[i];
            }
        }
        return null;
    }

    function removePageItemByName(container, name) {
        var item = findPageItemByName(container, name);
        if (item) {
            try { item.remove(); } catch (e) {}
        }
    }

    function removePreview() {
        var layer = getOrCreateLayer();
        removePageItemByName(layer, PREVIEW_NAME);
    }

    function removeFinal() {
        var layer = getOrCreateLayer();
        removePageItemByName(layer, FINAL_NAME);
    }

    function makeCMYK(c, m, y, k) {
        var col = new CMYKColor();
        col.cyan = c;
        col.magenta = m;
        col.yellow = y;
        col.black = k;
        return col;
    }

    function buildKnockoutMask(marginMM, c, m, y, k, itemName) {
        var layer = getOrCreateLayer();

        removePageItemByName(layer, itemName);

        var abIndex = doc.artboards.getActiveArtboardIndex();
        var ab = doc.artboards[abIndex];
        var r = ab.artboardRect; // [left, top, right, bottom]

        var marginPt = mmToPt(marginMM);

        var outerLeft   = r[0] - marginPt;
        var outerTop    = r[1] + marginPt;
        var outerRight  = r[2] + marginPt;
        var outerBottom = r[3] - marginPt;

        var outerW = outerRight - outerLeft;
        var outerH = outerTop - outerBottom;

        var innerLeft = r[0];
        var innerTop = r[1];
        var innerW = r[2] - r[0];
        var innerH = r[1] - r[3];

        // 複合パス本体
        var cp = layer.compoundPathItems.add();
        cp.name = itemName;

        // 複合パスの中に外側・内側パスを作る
        var outerRect = cp.pathItems.rectangle(outerTop, outerLeft, outerW, outerH);
        var innerRect = cp.pathItems.rectangle(innerTop, innerLeft, innerW, innerH);

        // 穴あき用設定
        outerRect.stroked = false;
        outerRect.filled = true;
        outerRect.evenodd = true;
        outerRect.polarity = PolarityValues.POSITIVE;

        innerRect.stroked = false;
        innerRect.filled = true;
        innerRect.evenodd = true;
        innerRect.polarity = PolarityValues.NEGATIVE;

        var fillCol = makeCMYK(c, m, y, k);

        // 複合パス内の見た目を統一
        outerRect.fillColor = fillCol;
        innerRect.fillColor = fillCol;

        return cp;
    }

    function getValues() {
        var margin = parseFloat(etMargin.text);
        if (isNaN(margin) || margin < 0) margin = 0;

        return {
            margin: margin,
            c: clamp100(etC.text),
            m: clamp100(etM.text),
            y: clamp100(etY.text),
            k: clamp100(etK.text)
        };
    }

    function redrawPreview() {
        if (isUpdatingPreview) return;

        if (!chkPreview.value) return;

        isUpdatingPreview = true;
        try {
            removePreview();

            var v = getValues();
            buildKnockoutMask(v.margin, v.c, v.m, v.y, v.k, PREVIEW_NAME);

            app.redraw();
        } catch (e) {
        }
        isUpdatingPreview = false;
    }

    // =========================
    // UI
    // =========================
    var dlg = new Window("dialog", "外側マスク作成(CMYK)");
    dlg.orientation = "column";
    dlg.alignChildren = ["fill", "top"];

    var panelSize = dlg.add("panel", undefined, "サイズ");
    panelSize.orientation = "row";
    panelSize.alignChildren = ["left", "center"];
    panelSize.margins = 15;
    panelSize.add("statictext", undefined, "外側へ広げるサイズ(mm)");
    var etMargin = panelSize.add("edittext", undefined, String(DEFAULT_MARGIN_MM));
    etMargin.characters = 8;

    var panelColor = dlg.add("panel", undefined, "塗り色(CMYK)");
    panelColor.orientation = "row";
    panelColor.alignChildren = ["left", "center"];
    panelColor.margins = 15;

    panelColor.add("statictext", undefined, "C");
    var etC = panelColor.add("edittext", undefined, "0");
    etC.characters = 4;

    panelColor.add("statictext", undefined, "M");
    var etM = panelColor.add("edittext", undefined, "0");
    etM.characters = 4;

    panelColor.add("statictext", undefined, "Y");
    var etY = panelColor.add("edittext", undefined, "0");
    etY.characters = 4;

    panelColor.add("statictext", undefined, "K");
    var etK = panelColor.add("edittext", undefined, "0");
    etK.characters = 4;

    var chkPreview = dlg.add("checkbox", undefined, "プレビュー");
    chkPreview.value = true;

    var btns = dlg.add("group");
    btns.alignment = "right";
    var okBtn = btns.add("button", undefined, "OK", {name: "ok"});
    var cancelBtn = btns.add("button", undefined, "キャンセル", {name: "cancel"});

    etMargin.onChanging = redrawPreview;
    etC.onChanging = redrawPreview;
    etM.onChanging = redrawPreview;
    etY.onChanging = redrawPreview;
    etK.onChanging = redrawPreview;

    chkPreview.onClick = function () {
        if (chkPreview.value) {
            redrawPreview();
        } else {
            removePreview();
            app.redraw();
        }
    };

    okBtn.onClick = function () {
        try {
            var v = getValues();

            removePreview();
            removeFinal(); // 完成版も毎回置き換え

            buildKnockoutMask(v.margin, v.c, v.m, v.y, v.k, FINAL_NAME);

            app.redraw();
            dlg.close(1);
        } catch (e) {
            alert("作成中にエラーが発生しました。\n" + e);
        }
    };

    cancelBtn.onClick = function () {
        removePreview();
        app.redraw();
        dlg.close(0);
    };

    redrawPreview();
    dlg.show();
})();

まず、上記のコードをすべてコピーします。

スポンサーリンク

抜けがあると動かないので、最初から最後までまとめてコピーしてください。

右上のマークからコピーできますよ。

手順2:テキストエディタに貼り付ける

Macなら「テキストエディット」、Windowsなら「メモ帳」でOKです。

貼り付けたら、ファイル名を以下のようにします。

document-size-mask.jsx
拡張子は必ず .jsx にしてください。

.txt のままだとIllustratorスクリプトとして認識されません。

手順3:Illustratorで実行する

Illustratorを開いたら、以下の手順で実行します。

  1. マスクしたいアートボードを選択する
  2. 上部メニューの「ファイル」をクリック
  3. 「スクリプト」を選択
  4. 「その他のスクリプト」をクリック
  5. 保存した .jsx ファイルを選ぶ
  6. 出てきたボックスに「外側へ広げるサイズ」と「マスクの塗り色」を入力
  7. プレビュー画面で確認してOK

これで、アートボードサイズのマスクが作成されます。

スクリプト使用時の注意点

このスクリプトは、アートボードだけをマスクします。

また、複数アートボードがある場合は、現在アクティブになっているアートボードのサイズを基準にします。

別のアートボードで使いたい場合は、対象のアートボードをクリックしてから実行してください。

このマスクは入稿時のデータ上では、必ず削除してください。

入稿データでマスクが付いたままだと、印刷事故の原因になります。

念のためマスクが作成されるレイヤー名は、『マスク(印刷しない)』となるようにしていますので、データ作成の際には気を付けてくださいね。

うまく動かない時のチェックポイント

うまくマスクが作成されない時は、以下を確認してみてください。

  • ファイルの拡張子が .jsx になっているか
  • ロックされたレイヤーやオブジェクトがないか
  • 非表示レイヤー上の素材を選んでいないか
  • アクティブなアートボードが正しいか

特に多いのが、拡張子が .txt になっているパターンです。

Windowsの場合は、拡張子が非表示になっていることもあるので注意しましょう。

まとめ

Illustratorでドキュメントサイズのマスクを毎回手作業で作るのは、意外と手間がかかります。

今回のスクリプトを使えば、選択したオブジェクトをアートボードサイズで一瞬でマスクできます。

入稿チェックやデザイン確認の時にかなり便利なので、よく使う方は保存しておくのがおすすめです。

作業を少しずつ自動化していくと、Illustratorの制作スピードはぐっと上がりますよ。

スポンサーリンク

コメント