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ではどうなってるか確認