コモノExtendScript100本ノック

超初心者のDTPオペレーターが週にひとつスクリプトを書くブログ

034.【ID】塗り/線の色が共通のオブジェクトを一括選択

Aiの選択>共通を再現したかった。

書いたコード

//@targetengine selectByColor

var i = 0;
var doc = app.activeDocument;
var sel = app.selection[0];

if (app.selection.length !== 1) {
  alert("1つのオブジェクトを選択してください。");
  exit();
}

if (sel.constructor.name === "Text") {
  alert("オブジェクトを選択してください。");
  exit();
}

var dialog = new Window("palette");
dialog.text = "選択-共通";
dialog.orientation = "column";
dialog.alignChildren = ["center", "top"];
var group1 = dialog.add("group")
group1.orientation = "column";
group1.alignChildren = ["left", "top"];
var radiobutton1 = group1.add("radiobutton");
radiobutton1.text = "カラー(塗り)(F)";
radiobutton1.shortcutKey = "f";
var radiobutton2 = group1.add("radiobutton");
radiobutton2.text = "カラー(線)(S)";
radiobutton2.shortcutKey = "s";
var button1 = dialog.add("button");
button1.text = "実行";
dialog.show();

button1.onClick = function () {
  if (radiobutton1.value) {
    var fTint = sel.fillTint;
    if (sel.fillColor.constructor.name === "Swatch") {
      var fColor = sel.fillColor.name;
      app.select(findByFillColor(fColor, fTint));
    } else {
      var fColor = sel.fillColor.colorValue;
      app.select(findByFillColor2(fColor, fTint))
    }
  } else if (radiobutton2.value) {
    var sTint = sel.strokeTint;

    if (sel.strokeColor.constructor.name === "Swatch") {
      var sColor = sel.strokeColor.name;
      app.select(findByStrkColor(sColor, sTint));
    } else {
      var sColor = sel.strokeColor.colorValue;
      app.select(findByStrkColor2(sColor, sTint))
    }
  }
  dialog.close();
}


function findByFillColor(clr, tnt) {
  app.findObjectPreferences = NothingEnum.NOTHING;
  app.findObjectPreferences.fillColor = clr;
  app.findObjectPreferences.fillTint = tnt;
  var result = app.findObject();
  app.findObjectPreferences = NothingEnum.NOTHING;
  return result;
}

function findByStrkColor(clr, tnt) {
  app.findObjectPreferences = NothingEnum.NOTHING;
  app.findObjectPreferences.strokeColor = clr;
  app.findObjectPreferences.strokeTint = tnt;
  var result = app.findObject();
  app.findObjectPreferences = NothingEnum.NOTHING;
  return result;
}

function findByFillColor2(clr, tnt) {
  var result = [sel];
  var items = doc.allPageItems;
  for (var i = 0; i < items.length; i++) {
    if (items[i].fillColor.constructor.name === "Color") {
      if (items[i].fillColor.colorValue.toString() === clr.toString() && items[i].fillTint === tnt) {
        result.push(items[i]);
      }
    }
  }
  return result;
}

function findByStrkColor2(clr, tnt) {
  var result = [sel];
  var items = doc.allPageItems;
  for (var i = 0; i < items.length; i++) {
    if (items[i].strokeColor.constructor.name === "Color") {
      if (items[i].strokeColor.colorValue.toString() === clr.toString() && items[i].strokeTint === tnt) {
        result.push(items[i]);
      }
    }
  }
  return result;
}

メモ

分かったこと

  • findObjectPreferences.fillColorに[object swatch]を渡すと止まる(Win10 CS6環境下)
app.findObjectPreferences.fillColor=doc.swatches.itemByName("test");
app.findObjectPreferences.fillColor=doc.swatches.itemByID(19);
// =>セットのプロパティ 'fillColor' の値が無効です。予想される値は Swatch, String or NothingEnum enumerator ですが、値 nothing を受け取りました。

このときデータブラウザでfindObjectPreferencesを見てもfillColorの項目が無い

$.writeln(app.findObjectPreferences.fillColor.name); 
// =>現在の状態でこのプロパティを適用できません。

反省点

  • 無名カラーのことを失念していた。
    後から無名カラー用の処理を足したので冗長になってしまった。
    カラー関連(color, swatch, tint...)が複雑なのはわかっていたことなので、
    おさらいしてから取り掛かるべきだった。
  • 詰んだときの調べ方がよくなかった。
    英語版フォーラムを先に見ていれば遠回りせずに済んだはず。
    普通にググってしまったので英語以外の言語&古いバージョンの情報ばかりを追っかけることになってしまった。

積み残し

  • オブジェクト検索かページアイテム総当たりかどちらかに統一する?
  • グラデーションや濃淡スウォッチにも対応
  • CCではどうなってるか確認

参考