Illustratorのspots objectとか
色々忙しい日が続いているのですが、皆様はいかがお過ごしでしょうか。今日は少し冷えていますね。こんな日は体調を崩さない様に注意したいものです。あ〜あっつ熱のラーメンが食べたい。(まったく関係ないですね)
まあ、そんなこんなで日々は過ぎていく訳ですが、今回はforumで行き詰まったトピックに関連したものです。
Illustratorドキュメントに新しい特色を加えたいのだけど、色名が存在するかどうかを確認したい場合のおはなし。質問した方はisValidプロパティを利用したかったのですが、Illustratorにはありません。当然エラーが出て困る訳です。
そこでわたしが考えたのはそのまんまgetByNameしてエラーをキャッチしちゃおうって事。
色名が存在しなければ「そんなエレメントはねぇよ!」って帰ってくるはずなのでそれを捕まえて新しいスポットカラーを生成しちゃおうというのがコンセプト。
以下がそのスクリプト。ドキュメントに図形一個書いておいて走らせると特色の塗り「SpotRed」が適用されます。
var docRef = app.activeDocument;
try{
var mySpot = docRef.swatches.getByName(‘SpotRed’);
docRef.pathItems[0].fillColor = mySpot.color;
redraw();
} catch (e){
var myColor = new CMYKColor;
myColor.cyan = 0;
myColor.magenta = 100;
myColor.yellow = 20;
myColor.black = 0;
var thisSpot = docRef.spots.add();
thisSpot.name = ‘SpotRed’;
thisSpot.color = myColor
thisSpot.colorType = ColorModel.SPOT;
docRef.pathItems[0].fillColor = docRef.swatches.getByName(‘SpotRed’).color;
redraw();
}
少しくどいコードですが質問者のスキルを考えて、あえてこのような状態にしています。
これを少し整理しておきましょう。
var docRef = app.activeDocument;
try{
var mySpot = docRef.swatches.getByName(‘SpotRed’);
} catch (e){
var myColor = new CMYKColor;
myColor.cyan = 0;
myColor.magenta = 100;
myColor.yellow = 20;
myColor.black = 0;
var thisSpot = docRef.spots.add();
thisSpot.name = ‘SpotRed’;
thisSpot.color = myColor
thisSpot.colorType = ColorModel.SPOT;
mySpot = docRef.swatches.getByName(‘SpotRed’);
}
docRef.pathItems[0].fillColor = mySpot.color;
redraw();
さて、ここからが問題です。わたしの環境ではうまく動くのですが動かないといったフィードバックが来ました。どうも環境によってgetByNameでランタイムエラーが出てしまうようです。
色々とやってみましたが原因がつかめないままです。(というか、そもそもランタイムエラーが再現出来ていなかったりするのだけどね)
とはいえ、そのままってのも気が引けるので以下のような力技的総当たりファンクションを書いてお茶を濁してきました。
function isColorExist(colorName){
var clrs = app.activeDocument.swatches;
for (var i=0;i<clrs.length;i++){
if (clrs[i].name==colorName){
return true;
}
}
return false;
}
var docRef = app.activeDocument;
if (!isColorExist(‘SpotRed’){
var myColor = new CMYKColor;
myColor.cyan = 0;
myColor.magenta = 100;
myColor.yellow = 20;
myColor.black = 0;
var thisSpot = docRef.spots.add();
thisSpot.name = ‘SpotRed’;
thisSpot.color = myColor;
thisSpot.colorType = ColorModel.SPOT;
}
var mySpot= docRef.swatches.getByName(“SpotRed”);
docRef.pathItems[0].fillColor = mySpot.color;
redraw();<clrs.length;i++){ if="" (clrs[i].name="=colorName){" return="" true;="" }="" false;="" var="" docref="app.activeDocument;" (!iscolorexist('spotred'){="" mycolor="new" cmykcolor;="" mycolor.cyan="0;" mycolor.magenta="100;" mycolor.yellow="20;" mycolor.black="0;" thisspot="docRef.spots.add();" thisspot.name="SpotRed" ;="" thisspot.color="myColor;" thisspot.colortype="ColorModel.SPOT;" myspot="docRef.swatches.getByName("SpotRed");" docref.pathitems[0].fillcolor="mySpot.color;" redraw();
う〜ん、こんな場合どういったアプローチが最良なのでしょう?
わたし的には動けばおっけ〜って感じなのですが(基本、こころざし低いですw)