【Photoshop Javascript】UnitValueのせいでDocuments.add出来なくてハマった話
Illustrator Javascript全然やってないのに突然PSの話です。
「フォルダパスを渡すと中身の画像の枚数を数えて、全部収まるサイズのドキュメントを作って自動で全部配置してくれる」という便利なスクリプトを作って使っていたのですが、他の人にも使って貰って居たところ、「動かないんですけど~」と言われたんですよ。でも自分のPCだと動くんですよ。
自分のPCだと動くもんだから原因の特定が大変だったのですが、どうも、Documents.add()するところで「無効な引数」というエラーが出ている様子。で、公式のリファレンスを泣きながら和訳して掘り掘りしたところ、UnitValueってやつがちゃんと扱えて居なかったようです。
むしろなんでそれで動くPCがあるんだ。という疑問は解決出来なかったのでおいておきます。
で、UnitValueってなんやねーん!というのが分からなくて右往左往したので知見をまとめておきますぴえんぱおん。
とりあえず結論だけ
myWidth = 400; // これはnumber型のただの数値
Documents.add(myWidth); // これだと動いたり動かなかったりする
myUnitValue = new UnitValue(myWitdh, "px"); // number型をUnitValue型に変換
Documents.add(myUnitValue); // これなら動く
Documents.add()とは
新規ドキュメントを作るメソッドです。
Documentsオブジェクトは、「開いているドキュメントのリストが入っているオブジェクト」です。
そのメソッドとして、「add()」があります。add()すると、新規ドキュメントを作ってDocumentsに追加します。
Documents.add()の引数
公式リファレンスを見てみると
(https://www.adobe.com/content/dam/acom/en/devnet/photoshop/scripting/Photoshop-CS6-JavaScript-Ref.pdf より。環境がCS6なのでCS6用です)
こんな感じになってます。基礎が出来てないとこれを理解出来るようになるまでに結構掛かるんですよね(かなり掛かりました)
左の「Method」にはメソッド名が太字で書いてあり、その下の()内には引数の名前と必須の有無。[]で囲まれている引数は「無くてもいいよ~」っていうものです。
で、その隣の「Parameter type」が、その引数に渡すべき変数の「型」なんですが、ここが大事です。
引数の型
ここが「number」とか「string」とか「bool」とかの黒文字のやつは、数値・文字列などをそのまま突っ込めるんですが、リンクが付いてる青文字のやつが要注意です。PS独自の型のオブジェクトを渡してやらないといけません。キエェェ。
Document.add()の第1、2引数のwidthとheightは、必須ではないのですが、指定する場合はUnitValueっていう型で渡してねと仰る。
リンク先を辿るとそのオブジェクトの取り扱いかたが書いてあります。よかったね。
よくない
で、UnitValueってどんな型~?と思ってリンク先クリックしてみるじゃないですか。
(https://www.adobe.com/content/dam/acom/en/devnet/photoshop/scripting/Photoshop-CS6-JavaScript-Ref.pdf#page=187&zoom=100,48,97)
なんて?
……いや落ち着いて「ここ見ろ」って書いてあるリンクを辿るんだ!
(https://www.adobe.com/content/dam/acom/en/devnet/photoshop/scripting/Photoshop-CS6-JavaScript-Ref.pdf#page=187&zoom=100,48,97)
これだけ?
……実際にはもう少し下にずらずら続くんですが、メソッドの一覧とかサンプルコードとかなしでひたすら英語に続く英語。泣きながら読んだところ、要するに、自分のPCの
ここを開いて見ろ。
ということらしく…………Oh……英語ネイティブレベルになりたいネ……
見てみよう
ありました。
色々なメソッドがあるようですが、とりあえずDocuments.add()に与える為に使う分には
myNumber = 400;
myUnitValue = new UnitValue(myNumber, "px");
だけ使えれば大丈夫そうです。
一回UnitValue作って置いてから、
myInch = myUnitValue.as("in");
とかすると単位変換も楽に出来るっぽいです。使う日が来たら。
この記事が気に入ったらサポートをしてみませんか?