2009年11月13日金曜日

InDesignのスクリプトでパスファインダを使う

ちょっと調べたことのメモ。
InDesignにも、Illustratorと同じようにパスファインダがある。

使用するには、オブジェクトのひとつを選択してメソッドを実行、引数に結合したいオブジェクトを配列で渡す。
var sels=app.activeDocument.selection;
var sel=sels.shift();

sel.addPath(sels);



種類は次の通り
  • PageItem.addPath (with:Array of PageItem )
    結合
  • PageItem.excludeOverlapPath (with:Array of PageItem )
    中マド
  • PageItem.intersectPath (with:Array of PageItem )
    交差
  • PageItem.minusBack (with:Array of PageItem )
    背面オブジェクトで型抜き
  • PageItem.subtractPath (with:Array of PageItem )
    前面オブジェクトで型抜き

2009年11月11日水曜日

if 文と switch 文の条件部分を関数で分ける。

Illustrator用のスクリプトを書いていて、if文の条件がやたらに長くなってしまい、どうしようかと思うことがあった。
例として、「塗りがC10、またはM10、またはY10のときは塗りを白に、塗りがC100,M100のときは塗りを黒にする」という変換を書いていたとする。
だいたいこんな感じになった。
#target "Illustrator"
var objs=app.activeDocument.selection;

for(var i=0;i<objs.length;i++){
var color=objs[i].fillColor;

if((Math.round(color.cyan)==10 && color.magenta==0
&& color.yellow==0 && color.black==0)
||(color.cyan==0 && Math.round(color.magenta)==10
&& color.yellow==0 && color.black==0)
||(color.cyan==0 && color.magenta==0
&& Math.round(color.yellow)==10 && color.black==0)){

color.cyan=0;
color.magenta=0;
color.yellow=0;
color.black=0;

}else if((color.cyan==100 && color.magenta==0
&& color.yellow==0 && color.black==0)
||(color.cyan==0 && color.magenta==100
&& color.yellow==0 && color.black==0)){

color.cyan=0;
color.magenta=0;
color.yellow=0;
color.black=100;
};

};
実際はもうちょっと複雑で、書きながらだからコードも汚い。見にくくてしょうがない。
ふと、「if文の答えは結局trueかfalseなんだから、その部分を分けてやればいいのでは?」と思い立ち、書いてみた。
下のような感じ。
#target "Illustrator"
// ----------if条件の定義----------
var check1=function(color){
var c=Math.round(color.cyan);
var m=Math.round(color.magenta);
var y=Math.round(color.yellow);
var k=Math.round(color.black);
var flag=false;
if(c==10 && m==0 && y==0 && k==0){
flag=true;
}else if(c==0 && m==10 && y==0 && k==0){
flag=true;
}else if(c==0 && m==0 && y==10 && k==0){
flag=true;
};
return flag;
};
var check2=function(color){
var c=Math.round(color.cyan);
var m=Math.round(color.magenta);
var y=Math.round(color.yellow);
var k=Math.round(color.black);
var flag=false;
if(c==100 && m==0 && y==0 && k==0){
flag=true;
}else if(c==0 && m==100 && y==0 && k==0){
flag=true;
};
return flag;
};
// --------------------
var objs=app.activeDocument.selection;
for(var i=0;i<objs.length;i++){
var color=objs[i].fillColor;

if(check1(color)){
color.cyan=0;
color.magenta=0;
color.yellow=0;
color.black=0;
}else if(check2(color)){
color.cyan=0;
color.magenta=0;
color.yellow=0;
color.black=100;
};

};
全体としては長くなったけれど、コードの役割がきちんと分割できて、ちょっと読みやすくなったと思う。
そこで「if文でできるならswitch-caseでもできるんじゃ?」と思って試す。
まずcaseの部分にfunctionを書き込んでみたが、上手くいかない。
switch-caseの場合はswitch(〜)の部分とcase 〜:の部分が同じかどうかをチェックして、trueなら処理をするという形だから。
ネットを探していると、phpの人がswitchに関数を使っているのを見つけた。
zuzara.com » PHPのswitchのcase文には関数が使える。
memo.xight.org - switch ,case文を読みやすくする
それで書いたのが以下のコード。
#target "Illustrator"

//----- check1、check2 は同上 -----

var objs=app.activeDocument.selection;
for(var i=0;i<objs.length;i++){
var color=objs[i].fillColor;

switch(true){ //trueで固定してしまう
case check1(color):
color.cyan=0;
color.magenta=0;
color.yellow=0;
color.black=0;
break;
case check2(color):
color.cyan=0;
color.magenta=0;
color.yellow=0;
color.black=100;
break;
default:
break;
};

};

2009年11月9日月曜日

InDesignを使ってPDFをページごとに分割

PDFをページごとに分割するのに、InDesignを使ってみる。
こういうことにInDesignを使う事はまず無い。普通はAcrobatや、ほかの便利なフリーウェアとか使うよね?
それでもInDesignでやりたいと思う事もあります。
#target "InDesign"

var pdfFile=File.openDialog ("PDFを選択して下さい", pdfCheck, false);
if(pdfFile){
//pdfを分割
var pageFileAry=burstPDF(pdfFile);
alert(pageFileAry.length+"ページにpdfを分割しました。");
};

function burstPDF(pdfFile){
//$.writeln(pdfFile);
//PDF読み込み設定:メディアサイズ
app.pdfPlacePreferences.pdfCrop=PDFCrop.CROP_MEDIA;
var actDoc=app.documents.add();
var imgObj= actDoc.textFrames.add();
//1ページ目を取り込む
var i=1
app.pdfPlacePreferences.pageNumber = i;
var ppdf=imgObj.place(pdfFile);
//$.writeln(ppdf);
//フィット
imgObj.fit(FitOptions.FRAME_TO_CONTENT);
//ページサイズを合わせる
var bounds=imgObj.geometricBounds;
actDoc.documentPreferences.pageWidth=bounds[3]-bounds[1];
actDoc.documentPreferences.pageHeight=bounds[2]-bounds[0];
imgObj.move([0,0]);
//pdf書き出し
var ary=[];
do{
var flag=true;
try{
var burstPdfPath=cutEx(pdfFile.fsName)[0]+"_"+i+".pdf";
var burstPdf=new File(burstPdfPath);
//$.writeln(burstPdfPath);
actDoc.exportFile(ExportFormat.pdfType, burstPdf, false, "PDFX1a 2001 JPN");
ary.push(burstPdfPath);
i++;
app.pdfPlacePreferences.pageNumber = i;
imgObj.place(pdfFile);
if(app.pdfPlacePreferences.pageNumber!=i){flag=false};
}catch(e){
//$.writeln(e);
flag=false
};
}while(flag);
actDoc.close(SaveOptions.NO);
return ary;
};

function pdfCheck(file){
//PDFを選択するフィルタ
var flag=false;
if(file.name.match(/\.pdf$/) || file instanceof Folder){flag=true};
return flag;
};

function cutEx(path){
//拡張子を切る
var pathTxt=path, exText="";
var dirCutNo=( (/\//.test(path))? path.lastIndexOf("/") : 0 );
if(/\./.test(path.slice(dirCutNo))){
pathTxt=path.slice(0, path.lastIndexOf("."));
exText=path.slice(path.lastIndexOf("."));
};
return [pathTxt,exText];
};