RACCOON TECH BLOG

株式会社ラクーンホールディングスのエンジニア/デザイナーから技術情報をはじめ、世の中のためになることや社内のことなどを発信してます。

Illustratorユーザー必見!AI入稿時のチェックを効率化するスクリプトをつくる!

こんにちは、デザイン戦略部のオオイです。

みなさんは普段、イラストレーターを使用したai入稿のチェックにどれくらいの時間をかけていますか?
今回はイラレで使用できる「入稿時のチェックを自動化するスクリプト」の作成方法を紹介します。

スクリプト作成の目的

入稿前チェックでは誤字脱字など定量的でないチェックも必要となりますが、一方で「ドキュメントのカラーモードがCMYKか」「フォントはアウトライン化されているか」など定量的なチェックも多々あります。

今回のスクリプトは後者の定量的なチェックをスクリプトに任せることによる業務効率化を目的とします。
繰返しの作業は機械に任せて楽をしましょう!!

STEP1 チェック項目を決める

まずは概要として「何をチェックするか」を決めます。
入稿前にはどういったチェックがあり、どのチェックなら機械(スクリプト)に任せられそうかを判断します。今回は次のようなチェックをするスクリプトを作成しようと思います。

何をチェックしてもらうかを決めたので、より具体的に「何をチェックしているのか」「チェックに引っかかるオブジェクトをどうするのか」を考えましょう。

チェック項目 NG条件 引っかかった際の処理 備考
ドキュメントのカラーモード ドキュメントのカラーモードがRGBであればNG 色味が変わる可能性があるので何もしない
非表示オブジェクトの有無 オブジェクトが非表示になっていたらNG 非表示オブジェクトは削除 入稿直前の最終チェックを
想定しているので、
この時点で表示されていなくて
問題のないものは削除します。
フォントのアウトライン化 テキストがパスオブジェクトになっていなければNG テキストオブジェクトのアウトライン化を行う
孤立点の有無 パスポイントが孤立していたらNG 孤立点は削除
墨ベタのオブジェクトの有無 C=0, M=0, Y=0, K=100であればNG 抽出し、選択できるようにする

STEP2 スクリプトを書く準備

実際にスクリプトを書く前に準備をします。

必要なもの

あると楽なもの

具体的に何をするのか

illustratorでオブジェクトを選択するとプロパティパネルやその他パネルに色々な情報が出てきます。X軸Y軸の座標、大きさ、塗りの色、線の色 etc...。こういったオブジェクトを画面上に描画するためのあらゆるデータをillustratorは持っています。そして描画用のデータは樹形図のようになっているので、これを辿っていきます。

予備知識

STEP3 実際の処理を書く

check.jsxというファイルを作成してC:\Program Files\Adobe\Adobe Illustrator 20**\Presets\ja_JP\スクリプトに配置してください。(**はメジャーバージョンの年数の下2桁)

ドキュメントのカラーモード

書く処理の内容

  • ドキュメントのカラーモード
    • ドキュメントのカラーモードがRGBであればNG
    • 色味が変わる可能性があるので何もしない

 

はじめにドキュメントのカラーモードをチェックしていきます。まずは、アプリケーションから開いているドキュメントにたどり着かなければいきません。毎回、開いているドキュメントまでは辿らなければいけないので、これは変数に代入しておいて使いまわします。
また、オブジェクトにロックがかかった状態だと処理が行えない可能性があるので、メニューコマンドを使用してすべてのオブジェクトのロックを解除します。

// ドキュメント全体
var doc = app.activeDocument;
// メニューコマンドを使用してすべてのロックを解除
app.executeMenuCommand('unlockAll');

開いているドキュメントのカラーモードの情報はdocumentColorSpaceに入っています。

// 結果一覧に表示させる用の変数
var resultColorMode = "";

function checkDocumentColorMode (){
  // 現在のドキュメントのカラーモードがCMYKでないか
  if (doc.documentColorSpace !== DocumentColorSpace.CMYK) {
    // CMYKではない
    resultColorMode = "ドキュメントのカラーモードがCMYKではありません。";
  }else{
    // CMYKである
    resultColorMode = "ドキュメントのカラーモードはCMYKです。";
  }
}

非表示オブジェクトの有無

書く処理の内容

  • 非表示オブジェクトの有無
    • オブジェクトが非表示になっていたらNG
    • 非表示オブジェクトは削除

 

次は非表示オブジェクトを削除します。非表示かどうかはhiddenで判断します。trueであれば非表示になっている状態、falseなら表示されている状態です。削除にはremove()関数を使用します。非表示オブジェクトの判断はすべての種類のオブジェクトをチェックする必要があるのでpageItemで判断します。

// 結果一覧に表示させる用の変数
resultHiddenItem = [];

function checkHiddenItem() {
  // ドキュメント上のページアイテム(オブジェクト)
  objectPageItems = doc.pageItems;
  // ドキュメント上のページアイテムの数
  numPageItem = objectPageItems.length;
  // 結果判定のためのflag、1つでも非表示オブジェクトを削除すればtrueにする
  flagHiddenItem = false;

  for (var i = 0; i < numPageItem; i++) {
    // i番目のオブジェクトが非表示かどうか
    if (objectPageItems[i].hidden) {
      objectPageItems[i].remove();
      flagHiddenItem = true;
    }
  }

  if (flagHiddenItem) {
    resultHiddenItem = "非表示オブジェクトを削除しました。";
  }else{
    resultHiddenItem = "非表示オブジェクトはありませんでした。";
  }
}

非表示オブジェクトが残っていると「選択状態にできない」など他のチェックに影響が出る場合があるので、なるべく前に持ってきています。

フォントのアウトライン化

書く処理の内容

  • フォントのアウトライン化
    • テキストがパスオブジェクトになっていなければNG
    • テキストオブジェクトのアウトライン化を行う

 

つづいてアウトライン化されていないフォントを抽出しアウトライン化します。アウトライン化したパスオブジェクトはpathItems、テキストオブジェクトはtextFramesです。
アウトライン化する方法はメニューコマンドを実行するapp.executeMenuCommand('outline');と、関数のcreateOutline()があります。体感ですがメニューコマンドでできるものはメニューコマンドを使用した方が軽いので、今回はapp.executeMenuCommand('outline');を使います。また、テキストオブジェクトの選択もメニューコマンドapp.executeMenuCommand('Text Objects menu item');を使用します。

// 結果一覧に表示させる用の変数
resultOutline = "";

function checkOutline() {
  // ドキュメント上のテキストフレーム
  var objectTextFrames = doc.textFrames;
  // ドキュメント上のテキストフレームの数
  var numTextFrames = objectTextFrames.length;

  // テキストフレームの数が1以上かどうか
  if (numTextFrames >= 1) {
    // 選択を空にする
    doc.selection = [];
    // メニューコマンドを使用してテキストオブジェクトを選択
    app.executeMenuCommand('Text Objects menu item');
    // メニューコマンドを使用してアウトライン化
    app.executeMenuCommand('outline');
    resultOutline = "テキストオブジェクトをアウトライン化しました。";
  }else{
    resultOutline = "テキストオブジェクトはありませんでした。";
  }
}

孤立点の有無

書く処理の内容

  • 孤立点の有無
  • パスポイントが孤立していたらNG
  • 孤立点は削除

 

孤立点もメニューコマンドapp.executeMenuCommand('Stray Points menu item');で選択可能です。メニューコマンド実行後にremove()関数で削除します。

// 結果一覧に表示させる用の変数
resultStrayPoints = [];

function checkStrayPoints() {
  // 選択を空にする
  doc.selection = [];
  // メニューコマンドを使用して孤立点を選択
  app.executeMenuCommand('Stray Points menu item');

  // 選択中のオブジェクトが1個以上かどうか
  if (doc.selection.length >= 1) {
    //! for文の中で削除するので逆順で処理。先頭から実行するとインデックスがずれます。
    for (var i = doc.selection.length - 1; i >= 0; i--) {
      doc.selection[i].remove();
      resultStrayPoints = "孤立点を削除しました。"
    }
  }else{    
    resultStrayPoints = "孤立点はありませんでした。"
  }
}

墨ベタのオブジェクトの有無

書く処理の内容

  • 墨ベタのオブジェクトの有無
  • C=0, M=0, Y=0, K=100であればNG
  • 抽出し、選択できるようにする

 

墨ベタ(k=100)はオブジェクトの塗りと線をチェックする必要があります。塗りはfillColor、線はstrokeColorで、さらにその中のblackcyanmagentayellowをチェックします。(入稿前の最終チェック以外でも使用する想定であればtextFrameの塗りと線をチェックするのを忘れないでください。)
また、今まではチェックの結果を文章で設定していましたが、墨ベタに関してのみ最終的に選択状態にするので配列に入れます。
加えて複合パス(CompoundPathItem)に墨ベタのオブジェクトが含まれている場合を考慮する必要があります。複合パス自体は色の情報を持っていないようなので複合パスに含まれている個々のパスオブジェクトをチェックする必要がありますが、最後選択状態にする際は複合パスを選択しなければいけません。

// 後で選択するために墨ベタのオブジェクトを格納する
arraySolidBlack = [];

function checkSolidBlack() {
  objectPageItems = doc.pageItems;
  numPageItem = objectPageItems.length;

  for (var i = 0; i < numPageItem; i++) {
      if (funcSolidCheck(objectPageItems[i])) {
          // 対象のオブジェクトの親が複合パスかどうか
          if (objectPageItems[i].parent.typename == "CompoundPathItem") {
              // 対象のオブジェクトの1つ前が複合パスかどうか
              if (objectPageItems[i -1].typename == "CompoundPathItem") {
                  // 複合パスの中にいくつのパスが入っているか分からないので、複合パスの1つ次のオブジェクトから1つ遡り複合パスごと配列に入れる
                  arraySolidBlack.push(objectPageItems[i -1]);
              }
          }else{
              arraySolidBlack.push(objectPageItems[i]);
          }
      }
  }

  // チェック用の関数。trueかfalseかの真偽値を返す。
  function funcSolidCheck(object) {
    return (
      (object.fillColor && 
       object.fillColor.black === 100 && 
       object.fillColor.cyan === 0 && 
       object.fillColor.magenta === 0 && 
       object.fillColor.yellow === 0)||
      (object.strokeColor &&
       object.strokeColor.black === 100 &&
       object.strokeColor.cyan === 0 &&
       object.strokeColor.magenta === 0 &&
       object.strokeColor.yellow === 0)
    );
  }

  if (arraySolidBlack.length >= 1) {
    doc.selection = []
    resultSolidBlack = "墨ベタのオブジェクトがありました。";
  }else{
    resultSolidBlack = "墨ベタのオブジェクトはありませんでした。";
  }
}

チェック用の関数についてですが、複合パスのように色の情報を持たないオブジェクトが存在する可能性があるのでhoge.fillColorで「塗り色が存在するか」、hoge.strokeColorで「線の色が存在するか」をチェックした方が良いです。


これでチェックの処理については一通り完成しました。

checkDocumentColorMode();
checkHiddenItem();
checkOutline();
checkStrayPoints();
checkSolidBlack();

STEP4 結果表示用のダイアログを追加する

最後に結果を一覧で確認できるようにダイアログを表示させます。

ダイアログの作成はscriptUIというものを使って書きます。詳しい仕様はadobeのドキュメントにも載っていないので、こちらのサイトで実際に作ってからソースをコピペします。

var dialog = new Window("dialog"); 
    dialog.text = "入稿前チェック"; 
    dialog.orientation = "column"; 
    dialog.alignChildren = ["center","top"]; 
    dialog.spacing = 10; 
    dialog.margins = 16; 

var colorMode = dialog.add("statictext", undefined, undefined, {name: "colorMode"}); 
    colorMode.text = resultColorMode; 

var outline = dialog.add("statictext", undefined, undefined, {name: "outline"}); 
    outline.text = resultOutline; 

var hidden = dialog.add("statictext", undefined, undefined, {name: "hidden"}); 
    hidden.text = resultHiddenItem; 

var strayPoints = dialog.add("statictext", undefined, undefined, {name: "strayPoints"}); 
    strayPoints.text = resultStrayPoints; 

var solidBlack = dialog.add("statictext", undefined, undefined, {name: "solidBlack"}); 
    solidBlack.text = resultSolidBlack; 

dialog.show();

スクリプト内で使用したarraySolidBlackという配列はスクリプト終了後、今回だとダイアログを消すと同時に消えてしまいます。スクリプト終了後にスクリプト内の変数を使用して処理を行いたい場合はbridgeTalkという機能を使います。本来はadobeの異なるアプリ間(illustrator ⇔ photoshopなど)でスクリプトを実行する際に使用される機能です。

  var bt = new BridgeTalk();
  // 今回はターゲットをillustratorに設定する
  bt.target="illustrator";
  if (arraySolidBlack.length >= 0) {
      bt.body = "doc.selection = arraySolidBlack;";
  }
  bt.send();
  // ↑dialog.show()の直前に書きます

  dialog.show();

これで実行結果のdialogが表示され、dialogを削除すると墨ベタのオブジェクトが選択された状態になります。

まとめ

簡易的ではありますがadobe illustratorで使用できる入稿前チェック用スクリプトの作成方法を紹介させていただきました。
少しでもお役に立ったでしょうか?

スクリプトを使用することでアクションではできないような複雑なこともできるので、ぜひ他にも色々なことを試してみてください!

現在ラクーンホールディングスではエンジニア・デザイナーを募集中です!興味を持っていただいた方は是非こちらからエントリーをお願いします。カジュアル面談も実施中です!

一緒にラクーンのサービスを作りませんか? 採用情報を詳しく見る

関連記事

運営会社:株式会社ラクーンホールディングス(c)2000 RACCOON HOLDINGS, Inc