2008年2月24日日曜日

新規カラースウォッチ作成

app.activeDocument.colors.add ({name:"新規",colorValue:[20,0,0,0]});

「スウォッチを新規作成」だと思ってSwatchのメソッドを探してると深みにハマります。
カラーを新規作成する。

ほらね。

2008年2月20日水曜日

選択したオブジェクトのプロパティをテキスト保存

たまたま書けたスクリプト。これは使えるかも……
selObj = app.activeDocument.selection;
for (i=0; i<selObj.length; i++)
{
var pTextName="propaties"+"_"+(selObj.length-i);
var fileObj = new File("/"+pTextName+".txt");
var flag = fileObj.open("w");
if (flag){
fileObj.write(selObj[i].properties.toSource());
}
}

適当なオブジェクト(テキストフレームとか)を選択して実行すると、HD直下に「propaties_(番号).txt」を書き出す。開けてみるとこんな感じ。
({transparencySettings:resolve("/document[@name=¥"名称未設定-1¥"]//text-frame[@id=238]/@transparency-settings"), strokeTransparencySettings:resolve("/document[@name=¥"名称未設定-1¥"]//text-frame[@id=238]/@stroke-transparency-settings"), fillTransparencySettings:resolve("/document[@name=¥"名称未設定-1¥"]//text-frame[@id=238]/@fill-transparency-settings"), contentTransparencySettings:resolve("/document[@name=¥"名称未設定-1¥"]//text-frame[@id=238]/@content-transparency-settings"), geometricBounds:[76.5, 56, 119, 118], visibleBounds:[76.5, 56, 119, 118], parentStory:resolve("/document[@name=¥"名称未設定-1¥"]//story[@id=220]"), startTextFrame:resolve("/document[@name=¥"名称未設定-1¥"]//text-frame[@id=238]"), endTextFrame:resolve("/document[@name=¥"名称未設定-1¥"]//text-frame[@id=238]"), textFrameIndex:0, overflows:false, previousTextFrame:null, nextTextFrame:null, contents:"", textFramePreferences:resolve("/document[@name=¥"名称未設定-1¥"]//text-frame[@id=238]/@text-frame-preferences"), anchoredObjectSettings:resolve("/document[@name=¥"名称未設定-1¥"]//text-frame[@id=238]/@anchored-object-settings"), baselineFrameGridOptions:resolve("/document[@name=¥"名称未設定-1¥"]//text-frame[@id=238]/@baseline-frame-grid-options"), textWrapPreferences:resolve("/document[@name=¥"名称未設定-1¥"]//text-frame[@id=238]/@text-wrap-preferences"), contentType:1952412773, gridData:resolve("/document[@name=¥"名称未設定-1¥"]//text-frame[@id=238]/@grid-data"), associatedXMLElement:null, overridden:false, overriddenMasterPageItem:null, fillColor:resolve("/document[@name=¥"名称未設定-1¥"]//swatch[@id=14]"), fillTint:-1, strokeWeight:0, miterLimit:4, endCap:1650680176, endJoin:1835691886, strokeType:resolve("/document[@name=¥"名称未設定-1¥"]/stroke-style[@id=23081]"), leftLineEnd:1852796517, rightLineEnd:1852796517, strokeColor:resolve("/document[@name=¥"名称未設定-1¥"]//swatch[@id=14]"), strokeTint:-1, cornerRadius:4.23333333333333, gradientFillStart:[87, 97.75], gradientFillLength:0, gradientFillAngle:0, gradientStrokeStart:[87, 97.75], gradientStrokeLength:0, gradientStrokeAngle:0, gapColor:resolve("/document[@name=¥"名称未設定-1¥"]//swatch[@id=14]"), gapTint:-1, strokeAlignment:1936998723, nonprinting:false, itemLayer:resolve("/document[@name=¥"名称未設定-1¥"]//layer[@id=196]"), locked:false, localDisplaySetting:1147563124, allPageItems:[], allGraphics:[], rotationAngle:0, shearAngle:0, horizontalScale:100, verticalScale:100, absoluteRotationAngle:0, absoluteShearAngle:0, absoluteHorizontalScale:100, absoluteVerticalScale:100, frameFittingOptions:resolve("/document[@name=¥"名称未設定-1¥"]//text-frame[@id=238]/@frame-fitting-options"), flip:1852796517, absoluteFlip:1852796517, cornerOption:1852796517, appliedObjectStyle:resolve("/document[@name=¥"名称未設定-1¥"]//object-style[@id=135]"), lockState:1852796517, id:238, label:"", parent:resolve("/document[@name=¥"名称未設定-1¥"]//page[@id=204]"), index:0})

ずら〜りとプロパティの値が。
これでもう手探りでプロパティを探さなくてすむよ。

2008年2月18日月曜日

AppleScriptの中にJavaScriptを書き込む

set myJavaScript to "alert(\"成功です!\");"
tell application "Adobe InDesign CS3"
activate
do script myJavaScript language javascript
end tell

これでも良かった。
ダブルクォーテーションはバックスラッシュでエスケープ。

CS3付属の「InDesign CS3 スクリプティング ガイド AS.pdf」に詳しく書いてあったよ。

2008年2月17日日曜日

ターミナル、AutomatorからAdobeアプリ用JavaScriptを呼び出す

AppleScriptはできたので、今度はそれをターミナルから呼び出してみる。

InDesign用のAppleScriptを「sample.scpt」としてHD直下に保存。
ターミナルを立ち上げ、
$ osascript "/sample.scpt"
「成功です!」

おお、動いた。
今度は直接コマンドにAppleScriptを書き込む。
$ osascript -e 'tell application "Adobe InDesign CS3"'
-e 'activate' -e 'do script file "MacHD:sample.jsx" language javascript' -e 'end tell'
「成功です!」

OK。次。
Automatorには、「AppleScriptを実行」って項目があるので、そこに書き込んでみる。


「成功です!」
できた。これでいろいろできそう。

AppleScriptからAdobeアプリ用JavaScriptを呼び出す

OpenSpaceさんとこにあった
AppleScriptを使ってJavaScriptファイルを実行する
をCS3でやろうとしていた。

とりあえず、sample.jsxに
alert("成功です!");
とだけ書いてホーム直下に保存し、スクリプトエディタを立ち上げる。
tell application "Adobe Photoshop CS3"
activate
do javascript file "~/sample.jsx"
end tell
「成功です!」
tell application "Adobe Illustrator CS3"
activate
do javascript file "~/sample.jsx"
end tell
「成功です!」
tell application "Adobe InDesign CS3"
activate
do script file "~/sample.jsx" language javascript
end tell
「Adobe InDesign CS3 でエラーが起きました:構文エラー」
あれ?なぜ動かん。

いろいろ考えたあげく(2時間ぐらい)、例文通りにHD直下にsample.jsxを置いて、
tell application "Adobe InDesign CS3"
activate
do script file "MacHD:sample.jsx" language javascript
end tell
「成功です!」

……UNIX表記のパスを読み込んでくれないのかInDesign。
なんだかなぁ。

20100315追記:
tell application "Adobe InDesign CS3"
activate
do script "/Users/kanemu/Desktop/sample.jsx" as POSIX file language javascript
end tell
でいけるみたいです。
フルパスじゃないと通らないけれど…

2008年2月15日金曜日

小数点3桁以下を四捨五入

どうやっていいかわからなくてさんざん悩んで、わかってしまえばすごく簡単だったという事がある。

InDesignのJavaScriptであちこちの数値を取っていたのだが、きちんと整数になっていることは少なくて、小数点以下がだーーーっと並んでしまう。なので小数点3桁以下を四捨五入しようと考えた。
ところが、四捨五入する命令は「小数点以下を四捨五入」するroundしかない。
じゃあどうすればいいの?整数と少数部分に分けて、少数は3桁以降は切り捨てて、それを四捨五入?その方法は?
……その事で数時間ムダにしたのだけれど、出た結論はこんなふうだった。
function shousu2(p){
var myVal=Math.round(p*100);
myVal=myVal/100;
return myVal
}

var mathObj=132.6759258803;
shousuIka2Obj=shousu2(mathObj);
alert(shousuIka2Obj);

なんのことはない、数値に100かけて四捨五入した後、100で割ればいいだけ。
簡単じゃん!そりゃあroundしかいらないわけだ。プログラマーの人というのはこういう事をちゃんと知ってるんだな、きっと。