このサイトはアフィリエイト広告を利用してます

トリムマークとマージンガイド

作業効率向上!Illustratorスクリプトでトリムマークとガイドを作成

【2023/12/18更新】
いつも訪問していただきありがとうございます。

  • トリムマークを作る手間を無くしたい
  • マージンガイドを作る手間を無くしたい
  • 一度の操作でトリムマークとマージンガイドを同時に作成したい

入稿するさいに必要になってくる【トリムマーク】やデザインを見やすくする【マージンガイド】の作成は、デザインするうえで欠かせませんよね

しかし、毎回レイヤーを追加して【トリムマークやマージンガイド】を作成するのは、手間のかかる作業です。Illustratorに備わっているアクション機能でも作成できますが、アートボードのサイズが違うと上手く動作してくれません

そこでこの記事では、アートボードのサイズと数を自動で計測して【トリムマークとマージンガイド】を作成してくれるIllustratorスクリプトを紹介します。スクリプトの動作フローと処理条件が理解できるソースコードも合わせて紹介するので、ぜひ参考にしてください。

Profile
この記事を書いている私は、DTPデザイナーとしてIllustratorの操作経験が15年以上あり、スクリプトも自分の業務で必要になったものを自ら作成し、デザイン作業の効率化を図っています。
最近では、当ブログでも自作スクリプトを公開しています。

作業時間が短縮できて少し余裕ができたら、自分のスキルをもっと活かせる仕事探しをしてみるのもおすすめです。
もし「Illustratorのスキルを活かせる職場を見つけたい」と感じているなら、デザイナー向けの転職サービスをチェックしてみてください。
一般の求人サイトでは出会えない、クリエイティブ職やデザイン関連の非公開求人が多く掲載されています。
おすすめの転職サイトはこちら → HIGH-FIVE

1.【トリムマークとマージンガイドを作成する】スクリプトの概要

スクリプトの概要
ここでは、スクリプトの概要について解説していきます。
まず、このスクリプト(スクリプト名: Trim_and_margin.jsx)は、私がJavaScriptベースで自作したIllustrator用のスクリプトです。

スクリプトのポイント

本スクリプトのポイントはつあります。

・アートボードサイズに合わせてトリムマークを作成してくれる
・アートボード枚数に合わせてトリムマークを作成してくれる
・アートボードの内側に指定された数値でマージンガイドを作成してくれる
・レイヤーを追加して名称も変更してくれる

スクリプトの入手方法

本スクリプトは、以下からサンプルとしてダウンロードすることができます。
ダウンロードと使用については「注意事項と免責事項」に記載していますので、必ずお読みください

ダウンロード:Trim_and_margin102.jsx

スクリプトの使い方

本スクリプトは、下記の5STEPで使うことができます。

  • STEP1.新規レイヤーを作成
  • STEP2.ファイルメニューからスクリプトを選択
  • STEP3.【トリムマークとマージンガイド】スクリプトを起動する
  • STEP4.ウインドウパネルが立ち上げるので、必要な設定をおこなう
  • STEP5.【OK】ボタンをクリックして実行

操作レビュー
※レイヤー名やマージンサイズなどは、変更できます。
※キャンセルする際は【クリアー】ボタンを押して下さい

なお、次の記事ではそもそもIllustratorスクリプトってどうやって使うのか、活用事例を交えて紹介しているので良ければ参考にしてください。

次のセクションでは、スクリプトのソースコードを紹介します。

2.【トリムマークとマージンガイドを作成する】スクリプトのソースコード

スクリプトのソースコード
ここからはスクリプトの動作フローと処理条件がわかるソースコードを紹介します。
説明用のコメントアウトも書いてありますので参考にしてください。

なお下記の記事では、Illustratorスクリプトを自作する方法についてソースコードの事例を交え解説しているのでよければ参考にしてください。


var docObj = app.activeDocument;

// レイヤー作成
function layObj(name) {
    var layer;
    try {
        layer = docObj.layers.getByName(name.text);//既存レイヤー名を取得
    } catch (e) {//在しない場合は新規レイヤーを作成
        layer = docObj.layers.add();
        layer.name = name.text;
    }
    return layer;
}



// レジストレーションスウォッチを安全に取得
function getColor(){
 var regSwatch = null;//値がない
 var targetColor;

    try{     
    // スウォッチを検索
        for (var i = 0; i < docObj.swatches.length; i++) {
            if (docObj.swatches[i].name === "[レジストレーション]") {
                regSwatch = docObj.swatches[i];
                break;
            }
        }
        // カラーを決定
        if (regSwatch) {
            targetColor = regSwatch.color;
        } else {
            // 代替カラー(CMYK 100%)
            targetColor = new CMYKColor();
            targetColor.cyan = 100;
            targetColor.magenta = 100;
            targetColor.yellow = 100;
            targetColor.black = 100;
        }
    } catch (e) {}
    return targetColor;
}

// 線描画
function drawLine(startPoint, middlePoint, endPoint) {
    var line = docObj.pathItems.add();
    line.setEntirePath([startPoint, middlePoint, endPoint]);
    line.filled = false;
    line.strokeWidth = 0.425;
    line.strokeColor = getColor();
    return line;
}

//線の単位を取得
function getStrokeUnits() {
    try {
        // 線単位のキーは "strokeUnits"
        var strokeUnitCode = app.preferences.getIntegerPreference("strokeUnits");

        // コードをわかりやすい名前に変換
        var strokeUnitName;
        switch (strokeUnitCode) {
           case 0: strokeUnitName = "in"; break;
            case 1: strokeUnitName = "mm"; break;
            case 2: strokeUnitName = "pt"; break;
            case 3: strokeUnitName = "pc"; break;
            case 4: strokeUnitName = "cm"; break;
            case 5: strokeUnitName = "Q"; break;
            case 6: strokeUnitName = "px"; break;
            default: strokeUnitName = "不明";
        }
        return strokeUnitName;

    } catch (e) {
        alert("線単位の取得中にエラーが発生しました: " + e.message);
        return null;
    }
}

// 単位変換
function point(num) {
    var objUV = new UnitValue(num, getStrokeUnits());
    return objUV.as("pt");
}

function os(size) {
    return size * 2;
}

// UIパネル設定
var dialog = new Window("dialog", "トリムマークとオフセット");

// ガイドオフセットパネル
var guidePanel = dialog.add("panel", undefined, "オフセット");
guidePanel.orientation = "column";
guidePanel.alignChildren = "left";
guidePanel.margins = 10;

var checkBox1 = guidePanel.add("checkbox", undefined, "オフセットを作成");

var offsetGroup = guidePanel.add("group");
offsetGroup.add("statictext", undefined, "オフセット値:");
var offSet = offsetGroup.add("edittext", undefined, "10");
offSet.characters = 5;
offsetGroup.add("statictext", undefined, getStrokeUnits());

var layerGroup1 = guidePanel.add("group");
layerGroup1.add("statictext", undefined, "レイヤー名:");
var layerName1 = layerGroup1.add("edittext", undefined, "offset");
layerName1.characters = 10;

// トリムマークパネル
var trimPanel = dialog.add("panel", undefined, "トリムマーク");
trimPanel.orientation = "column";
trimPanel.alignChildren = "left";
trimPanel.margins = 10;

var checkBox2 = trimPanel.add("checkbox", undefined, "トリムマークの作成");

var layerGroup2 = trimPanel.add("group");
layerGroup2.add("statictext", undefined, "レイヤー名:");
var layerName2 = layerGroup2.add("edittext", undefined, "trimMark");
layerName2.characters = 10;

// アートボード選択パネル
var artboardPanel = dialog.add("panel", undefined, "アートボード選択");
artboardPanel.orientation = "column";
artboardPanel.alignChildren = "left";
artboardPanel.margins = 10;

var artboardOptions = artboardPanel.add("dropdownlist", undefined, ["全てのアートボード", "選択中のアートボード"]);
artboardOptions.selection = 0; // デフォルトは「全てのアートボード」

// ボタン
var buttonGroup = dialog.add("group");
buttonGroup.alignment = "center";
var btnOK = buttonGroup.add("button", undefined, "OK", { name: "ok" });
var btnCancel = buttonGroup.add("button", undefined, "Cancel", { name: "cancel" });

// 初期値
offSet.active = true;
checkBox1.value = true;
checkBox2.value = true;

// キャンセル処理
btnCancel.onClick = function () {
    dialog.close();
};

// OK処理
btnOK.onClick = function () {
    dialog.close();

    var artboardsToProcess = [];
    if (artboardOptions.selection.index === 0) {
        // 全てのアートボード
        for (var i = 0; i < docObj.artboards.length; i++) {
            artboardsToProcess.push(i);
        }
    } else {
        // 選択中のアートボード
        artboardsToProcess.push(docObj.artboards.getActiveArtboardIndex());
    }

    for (var i = 0; i < artboardsToProcess.length; i++) {
        var abIndex = artboardsToProcess[i];
        docObj.artboards.setActiveArtboardIndex(abIndex);
        app.coordinateSystem = CoordinateSystem.ARTBOARDCOORDINATESYSTEM;

        var rect = docObj.artboards[abIndex].artboardRect;
        var left = rect[0], top = rect[1], right = rect[2], bottom = rect[3];
        var width = right - left;
        var height = top - bottom;
        var centerX = left + width / 2;
        var centerY = top - height / 2;

        if (checkBox1.value) {
            var offsetLayer = layObj(layerName1);
            docObj.activeLayer = offsetLayer;
            offsetLayer.locked = false;

            var figures;
            try {
                figures = eval(offSet.text);
                if (isNaN(figures)) throw new Error("NaN");
            } catch (e) {
                alert("オフセット値が無効です。数値を入力してください。");
                return;
            }

            var rectObj = docObj.activeLayer.pathItems.rectangle(
                top - point(figures),
                left + point(figures),
                width - os(point(figures)),
                height - os(point(figures))
            );
            rectObj.guides = true;
            offsetLayer.locked = true;
        }

        if (checkBox2.value) {
            var trimLayer = layObj(layerName2);
            docObj.activeLayer = trimLayer;
            trimLayer.locked = false;

            var trimGroup = docObj.groupItems.add();
            var lines = [];

            // 四隅
            lines.push(drawLine([left - point(12), top], [left - point(3), top], [left - point(3), top + point(12)]));
            lines.push(drawLine([left - point(12), top + point(3)], [left, top + point(3)], [left, top + point(12)]));
            lines.push(drawLine([right + point(12), top], [right + point(3), top], [right + point(3), top + point(12)]));
            lines.push(drawLine([right + point(12), top + point(3)], [right, top + point(3)], [right, top + point(12)]));
            lines.push(drawLine([left - point(12), bottom], [left - point(3), bottom], [left - point(3), bottom - point(12)]));
            lines.push(drawLine([left - point(12), bottom - point(3)], [left, bottom - point(3)], [left, bottom - point(12)]));
            lines.push(drawLine([right + point(12), bottom], [right + point(3), bottom], [right + point(3), bottom - point(12)]));
            lines.push(drawLine([right + point(12), bottom - point(3)], [right, bottom - point(3)], [right, bottom - point(12)]));

            // 中央上下
            lines.push(drawLine([centerX - point(12.7), top + point(6.35)], [centerX, top + point(6.35)], [centerX + point(12.7), top + point(6.35)]));
            lines.push(drawLine([centerX, top + point(4.233)], [centerX, top + point(6.35)], [centerX, top + point(12.7)]));
            lines.push(drawLine([centerX - point(12.7), bottom - point(6.35)], [centerX, bottom - point(6.35)], [centerX + point(12.7), bottom - point(6.35)]));
            lines.push(drawLine([centerX, bottom - point(4.233)], [centerX, bottom - point(6.35)], [centerX, bottom - point(12.7)]));

            // 中央左右
            lines.push(drawLine([left - point(6.35), centerY + point(12.7)], [left - point(6.35), centerY], [left - point(6.35), centerY - point(12.7)]));
            lines.push(drawLine([left - point(4.233), centerY], [left - point(6.35), centerY], [left - point(12.7), centerY]));
            lines.push(drawLine([right + point(6.35), centerY + point(12.7)], [right + point(6.35), centerY], [right + point(6.35), centerY - point(12.7)]));
            lines.push(drawLine([right + point(4.233), centerY], [right + point(6.35), centerY], [right + point(12.7), centerY]));

            for (var j = 0; j < lines.length; j++) {
                lines[j].move(trimGroup, ElementPlacement.PLACEATEND);
            }

            trimLayer.locked = true;
        }
    }
};

dialog.center();
dialog.show();



3.注意事項と免責事項

注意している女性
本記事に記載してあるスクリプトを実行した結果生じるトラブルに関しては一切の責任を負いません。ご利用は自己責任にてお願いいたします。

またIllustratorのアップデートにより動作が変わってしまう可能性もあります。アップデートによる動作の不具合に関しては、対処しかねるので予めご理解ください。

最後に本記事で配布しているスクリプトを無断で転送・販売・配布することは禁止いたします。

動作チェックは

・IllustratorCS6【Win】
・Illustrator2024【mac】

で、おこなっています。

4.【トリムマークとマージンガイドを作成する】スクリプトのまとめ

SUMMARY
今回は、【トリムマークとマージンガイドを作成する】スクリプトをポイントを交えながら紹介しました。
ポイントをおさらいすると

・アートボードサイズに合わせてトリムマークを作成してくれる
・アートボード枚数に合わせてトリムマークを作成してくれる
・アートボードの内側に指定された数値でマージンガイドを作成してくれる
・レイヤーを追加して名称も変更してくれる

トリムマークとマージンガイドが自動で作成されることで、今まで手間がかかっていた作業がスムーズにおこえるので、ぜひこのスクリプトを活用していただければと思います。

なお、Illustratorスクリプトについて学んでみたいと思った方は、次の記事でおすすめの書籍とWEBサイトについて紹介しているので良ければ参考にしてください。

というわけで今回は以上です。
『作業効率向上!Illustratorスクリプトでトリムマークとガイドを作成』を最後までお読みいただきありがとうございました。

あなたの「働き方」も、アップデートしませんか?

スクリプトで作業を効率化したその先に―― 「もっとクリエイティブに集中したい」「ルーチンに縛られない働き方をしたい」 そんな思いが芽生えたなら、次は“働き方”を見直すタイミングかもしれません。

●「量より質」を重視した求人のご紹介
●「クリエイティブがわかっている」
●「求人企業を深く知る・密接な関係」

成長できる転職先を探すなら【HIGH-FIVE】がおすすめ

また、デザイナーとしての経験から、グラフィックデザイナーの「転職・独立をサポートする厳選3社」を紹介しています。

ガネメ現役サラリーマン

投稿者の過去記事

◇このブログでは、15年以上DTPデザイナーとして、学んできたデザインやパソコンのセキュリティ知識・参考になった書籍などを紹介しています。
たまに、脇道にそれることもあります。

◇このブログはアフィリエイト広告を利用しています

◇取得資格
・情報セキュリティマネジメント
・ITパスポート
・色彩検定 2級
・色彩検定 UC級
・屋外広告士
・第2種電気工事士
その他・・・・

プロフィール

face

ガネメ
鹿児島県在住
現役サラリーマン

◇このブログでは、15年以上DTPデザイナーとして、学んできたデザインやセキュリティ知識、参考になった書籍などを紹介しています。
たまに、脇道にそれることもあります

◇取得資格
・情報セキュリティマネジメント
・ITパスポート
・色彩検定 2級
・色彩検定 UC級
・屋外広告士
・第2種電気工事士
その他・・・・

詳しいプロフィールはこちら

アーカイブ

カテゴリー

使用中のレンタルサーバー

ピックアップ記事

  1. Illustratorスキルを活かせる仕事5選
    Illustratorを操作できるけど、今の仕事では名刺作成くらいしか活かせていない …
  2. 転職or独立迷ったらこのサービス
    「このまま今の会社にいてもいいのか…」「いっそフリーランスになるべき?」経験を積んだグラフィックデ…
  3. 屋外広告士に合格する勉強法
    忙しくてまとまった勉強時間がとれない デザインの実務経験はあるけど、試験対策のやり方が…




ブログランキング・にほんブログ村へ   
PAGE TOP