<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>diary NET. 1mg</title>
    <link rel="alternate" type="text/html" href="http://www.milligramme.cc/weblog/" />
    <link rel="self" type="application/atom+xml" href="http://www.milligramme.cc/weblog/atom.xml" />
    <id>tag:www.milligramme.cc,2009-12-16:/weblog//3</id>
    <updated>2010-09-03T12:40:58Z</updated>
    <subtitle>InDesign と ExtendScript でいろいろ実験中
（旧：1/1000gのにっき）</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type 4.27-ja</generator>

<entry>
    <title>InDesign_ScriptUI版セル幅高さ調整スクリプト</title>
    <link rel="alternate" type="text/html" href="http://www.milligramme.cc/weblog/2010/09/indesign-110.html" />
    <id>tag:www.milligramme.cc,2010:/weblog//3.787</id>

    <published>2010-09-03T12:45:30Z</published>
    <updated>2010-09-03T12:40:58Z</updated>

    <summary>前回のとりあえずから実用へ（InDesignプロンプト版セル幅調整スクリプト）の...</summary>
    <author>
        <name>mg</name>
        
    </author>
    
        <category term="InDesign" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="JavaScript" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="ScriptUI" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="indesign" label="InDesign" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="javascript" label="JavaScript" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="scriptui" label="ScriptUI" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="table" label="Table" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.milligramme.cc/weblog/">
        <![CDATA[前回の<br /><a href="http://www.milligramme.cc/weblog/2010/09/post-11.html">とりあえずから実用へ（InDesignプロンプト版セル幅調整スクリプト）</a>の続き<br />せっかくなので高さも調整できるようにしてみる。<br /><br /><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="setsizewithcals.png" src="http://www.milligramme.cc/weblog/img/setsizewithcals.png" class="mt-image-none" style="" width="360" height="340" /></span><br /><br />
 
<pre class="brush: js;">/**
 *  cells size setter (with cals) 
 * 
 */
if(app.documents.length == 0 || app.selection.length == 0){exit();}

var cellColumn, cellRow;
selObj = app.selection[0];
switch(selObj.constructor.name){
	case "Table":
		cellColumn = selObj.columnCount;
		cellRow = selObj.bodyRowCount + selObj.headerRowCount + selObj.footerRowCount;
		break;
	case "Cell":
		cellColumn = selObj.columnSpan;
		cellRow = selObj.rowSpan;
		break;
	default :// TableとCell以外は無視
		alert("choose table or cells");
		break;
}
//結合セルも個別セルとして幅と高さを取得
var eachCellW = selObj.columns.everyItem().width;
var eachCellH = selObj.rows.everyItem().height;

//edittextの大きさ,パネルのマージンなどを設定
var editbox = {'w': 60, 'h': 20}; //edittextの大きさ
var startPt; //edittext作成の開始点
var pnlMargin = [10,10,10,15]; //パネルのマージン
var gutter = 5; //edittextの間隔
var wArr = [];
var hArr = [];

var dlg = new Window('dialog',"cells size setter",undefined);
dlg.pnl = dlg.add('panel',undefined);//サイズは仮

//幅用のedittext
startPt = [pnlMargin[0], pnlMargin[1]];
startPt[0] += editbox['w'] + gutter;//開始点を右にずらす

for (var ic=0; ic &lt; cellColumn; ic++) {
	var wValue = dlg.pnl.add('edittext',[startPt[0], startPt[1], startPt[0]+editbox['w'], startPt[1]+editbox['h']],eachCellW[ic]);
	startPt[0] = startPt[0] + editbox['w'] + gutter;
	wArr.push(wValue);
}
var pnlW = startPt[0]+pnlMargin[2];//dlg.pnl width

//高さ用のedittext
startPt = [pnlMargin[0], pnlMargin[1]];
startPt[1] += editbox['h'] + gutter;//開始点を下にずらす

for (var ir=0; ir &lt; cellRow; ir++) {
	var hValue = dlg.pnl.add('edittext',[startPt[0], startPt[1], startPt[0]+editbox['w'], startPt[1]+editbox['h']],eachCellH[ir]);
	startPt[1] = startPt[1] + editbox['h'] + gutter;
	hArr.push(hValue);
}
var pnlH = startPt[1]+pnlMargin[3];//dlg.pnl height

dlg.pnl.bounds = [0, 0, pnlW, pnlH];//パネルのサイズを設定

dlg.grp = dlg.add('group')
dlg.okButton = dlg.grp.add('button',undefined,'ok',{name: 'ok'});
dlg.cancelButton = dlg.grp.add('button',undefined,'cancel',{name: 'cancel'});

dlg.okButton.onClick = function(){
	dlg.close();
	flg = true;
}
dlg.cancelButton.onClick = function(){
	dlg.close();
	flg = false;
}
dlg.center();
dlg.show();

if(flg == true){
	for (var iw=0; iw &lt; wArr.length; iw++) {
		if (eval(wArr[iw].text)*1 &gt; 1) {
			selObj.columns[iw].width = eval(wArr[iw].text) * 1;
		}
	}
	for (var ih=0; ih &lt; hArr.length; ih++) {
		if (eval(hArr[ih].text)*1 &gt; 1) {
			selObj.rows[ih].height = eval(hArr[ih].text) * 1;
		}
	}
}
</pre><div><br /></div>]]>
        
    </content>
</entry>

<entry>
    <title>とりあえずから実用へ（InDesignプロンプト版セル幅調整スクリプト）</title>
    <link rel="alternate" type="text/html" href="http://www.milligramme.cc/weblog/2010/09/post-11.html" />
    <id>tag:www.milligramme.cc,2010:/weblog//3.786</id>

    <published>2010-09-03T11:57:17Z</published>
    <updated>2010-09-03T12:40:20Z</updated>

    <summary>web系のスクリプトと違い、dtp系のスクリプトの場合とりあえず目の前の仕事をつ...</summary>
    <author>
        <name>mg</name>
        
    </author>
    
        <category term="InDesign" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="JavaScript" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="indesign" label="InDesign" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="javascript" label="JavaScript" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="table" label="Table" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.milligramme.cc/weblog/">
        <![CDATA[web系のスクリプトと違い、dtp系のスクリプトの場合とりあえず目の前の仕事をつぶすために動けばいいレベルのことが多いと思います。<br /><br />例えばたくさんの表組のセル幅を不規則な値に設定しないといけない場合。<br />表パネルから数値入力していたら、セルを選択＞数値入力＞セル移動＞数値入力...の繰り返し。<br />面倒なので簡単なスクリプトを書いて、後からいろいろと機能を追加してみる。<br /><br /> 

<pre class="brush: js;">var selObj = app.selection[0];
var celObj = selObj.cells;
var currentW = celObj.everyItem().width;

var eachWPrompt = prompt(",で区切ったセル幅を入力",currentW);
if(eachWPrompt != undefined){
	for (var i=0, iL=celObj.length; i &lt; iL ; i++) {
		celObj[i].width = eachWArr[i]*1;
	}
}
</pre>

３分で書いて、こんなので乗り切ります。<br /><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="tableprompt.png" src="http://www.milligramme.cc/weblog/img/tableprompt.png" class="mt-image-none" style="" width="514" height="226" /></span><br />処理のイメージできれば書き捨てなものの書出しはいつもこんな感じです。<br />
使い方を気をつければ実用的に使えますが、これじゃあんまりなのでいじっていきます。<br /><div><br /></div>]]>
        <![CDATA[エラー処理と機能追加をしていく

<pre class="brush: js;">//ドキュメントを開いていない、選択していないならやめる
if(app.documents.length == 0 || app.selection.length == 0){exit();}
var selObj = app.selection[0];
//選択しているのが表組かどうか
switch(selObj.constructor.name){
	case "Table":
	case "Cell":
		if(selObj.rows.length == 1){
			main (selObj)//--条件がそろったここに処理をいれる
			}
		else{
			alert("一行のみ選択して下さい");
			exit();
			}
		break;
	default :// TableとCell以外は無視
		alert("セルを選択して下さい");
		break;
}
//switch文の中に式がずらずらあるとわかりにくくなるのでとっとと関数にする
function main (selObj) {
	var celObj = selObj.cells;
	var currentW = celObj.everyItem().width;

	var eachWPrompt = prompt(",で区切ったセル幅を入力",currentW);
	if(eachWPrompt != undefined){
		var eachWArr = eachWPrompt.split(",");
		for (var i=0, iL=celObj.length; i &lt; iL ; i++) {
			if(eachWArr[i]*1 &gt; 1){
				celObj[i].width = eachWArr[i]*1;
			}
		}
	}
}
</pre>

これでまーまー動きます。<br />
でも、自分が使わないと
<ul>
<li>プロンプトの内容とセルの数が不整合</li>
<li>プロンプトの内容が数値じゃない。全角数字とか</li>
<li>プロンプトの内容に計算式をいれてみる</li>
</ul>人がいたりするわけでその辺をちょこちょこっと追加していく

セルの数と合っているか
<pre class="brush: js;">if(eachWArr.length == celObj.length){
	//プロンプトの入力とセルの数が一致したら実行
}
</pre>

入力された値が１以上の数値かのチェック
<pre class="brush: js;">if(eachWArr[i]*1 &gt; 1){
	//プロンプトの内容が１以上の数値なら実行
}
else{
	//数値以外が入力されたときの処理（処理しない＝最初に取得したセル幅にする）
}
</pre>

計算式を反映させたいのでプロンプトの文字列を数値化する前にeval()で計算してみる
<pre class="brush: js;">eval(eachWArr[i])*1
</pre>


これらを追加、
さらに結合セルの場合（処理自体は可能だけど不都合があるときもある）はスキップしたいとかを追加するとこんな感じになります。<br /><br />

<pre class="brush: js;">/**
 * InDesignで選択したセルの幅をまとめて変える
 * 実行するとプロンプトが出るのでカンマ区切りで数値を入力する。（計算式も可）
 * 
 * 条件
 * ・表組セルが１行だけ選ばれている
 * ・結合セルが含まれていない
 */

if(app.documents.length == 0 || app.selection.length == 0){exit();}

var selObj = app.selection[0];
switch(selObj.constructor.name){
	case "Table":
	case "Cell":
		if(selObj.rows.length == 1){
			main(selObj);
			}
		else{
			alert("一行のみ選択して下さい");
			exit();
			}
		break;
	default :// TableとCell以外は無視
		alert("セルを選択して下さい");
		break;
}
function main (selObj) {
	var celObj = selObj.cells;
	if(cellMergedCheck(celObj) == true){
		alert("結合セルが含まれてます");
		exit();
	}
	var currentW = celObj.everyItem().width;
	var eachWPrompt = prompt(",で区切ったセル幅を入力",currentW);
	if(eachWPrompt != undefined){//prompt cancel =&gt; undefined
		var j = 0;
		var eachWArr = eachWPrompt.split(",");
		if(eachWArr.length == celObj.length){//セルとプロンプトの数が合っているか
			for (var i=0, iL=celObj.length; i &lt; iL ; i++) {
				// alert(eval(eachWArr[i]));計算式でも
				if(eval(eachWArr[i])*1 &gt; 1){
					celObj[i].width = eval(eachWArr[i])*1;
				}
				else{
					j++;
				}
			}	
			if(j &gt; 0){
				alert(j+"個のセルの値が不適切だったので処理しませんでした");
			}
		}
		else{
			alert("セル数と一致しません");
		}
	}
}
function cellMergedCheck (cellObj) {
	var mergeChecker = new Array();
	for(var i=0; i &lt; cellObj.length; i++){
		mergeChecker.push(1);
		}
	if(cellObj.everyItem().columnSpan == mergeChecker.toString()){
		return false;
	}
	else{
		return true;
	}
}
</pre>

後からダイアログをScript UIにしたいとか、パレットで常時出しておきたいとか、そういうのはスクリプトの汎用性とかもからんでくるので、また別の機会で...]]>
    </content>
</entry>

<entry>
    <title>InDesign_サンプルテキスト割付け機能でパターン生成</title>
    <link rel="alternate" type="text/html" href="http://www.milligramme.cc/weblog/2010/08/indesign-109.html" />
    <id>tag:www.milligramme.cc,2010:/weblog//3.785</id>

    <published>2010-08-19T11:45:22Z</published>
    <updated>2010-08-19T11:47:29Z</updated>

    <summary> 絵本みたいなのをジェネレートしたくて、InDesignのサンプルテキスト割り付...</summary>
    <author>
        <name>mg</name>
        
    </author>
    
        <category term="InDesign" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="JavaScript" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="font" label="Font" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="indesign" label="InDesign" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jpeg" label="Jpeg" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="text" label="Text" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="epub" label="ePub" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.milligramme.cc/weblog/">
        <![CDATA[ 絵本みたいなのをジェネレートしたくて、<br />InDesignのサンプルテキスト割り付け機能を使ってランダムな文字列を生成、文字を変え、色を変え、半透明にして重ねてみた。<br /><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="a9.jpg" src="http://www.milligramme.cc/weblog/img/a9.jpg" class="mt-image-none" style="" width="531" height="531" /></span><br />それをページごとにjpeg書き出しして、またインラインオブジェクトとして読み込む。<br />html書出しをしてから少々検索置換でタグを変換してから、sigilに読み込みepub変換。<br />（こういう画像配置するようなパターンなら直接htmlで書いて読み込みした方が早い）<br /><br />書き出されたjpegはこんな。文字化けも素材を活かします。<br />
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="efon_images.png" src="http://www.milligramme.cc/weblog/img/efon_images.png" class="mt-image-none" style="" width="540" height="525" /></span>
<br /><br />できたepubはこんな（約11MB）。&gt;&gt; 　<span class="mt-enclosure mt-enclosure-file" style="display: inline;"><a href="http://www.milligramme.cc/weblog/img/efon.epub">efon.epub</a></span>
<br />なんて無駄なものができてしまったのだろう。<br /><br /><pre class="brush: js;">/**
 * creat textpat 
 * サンプルテキスト機能をつかったランダムテキストパターンの実験
 */

#target "InDesign"

var fon = app.fonts;
var draw_area = 50; //描写領域　50 x 50
var layered = 12; //レイヤー数
var page_len = 40; //ページ数 = パターンの数
var max_range = 36; //max size = min size(9) + max_range あまり大きすぎると描写領域に対してサンプルテキストが割り付けられない

var ma = [ //アプリケーションデフォルトのマージン
	app.marginPreferences.top,
	app.marginPreferences.left,
	app.marginPreferences.bottom,
	app.marginPreferences.right
	];
	
var doc = app.documents.add();
var ddp = doc.documentPreferences;
with(ddp){
	pageWidth = draw_area + ma[1] + ma[3];
	pageHeight = draw_area + ma[0] + ma[2];
	pagesPerDocument = page_len;
	facingPages = false;
}

var c, m, y;
try{
	c = doc.colors.add({
		model:ColorModel.PROCESS, 
		space:ColorSpace.CMYK, 
		colorValue:[100,0,0,0], 
		name:"C"});
}catch(e){c = doc.swatches.item('C');}
try{
	m = doc.colors.add({
		model:ColorModel.PROCESS, 
		space:ColorSpace.CMYK, 
		colorValue:[0,100,0,0], 
		name:"M"});
}catch(e){m = doc.swatches.item('C');}
try{
	y = doc.colors.add({
		model:ColorModel.PROCESS, 
		space:ColorSpace.CMYK, 
		colorValue:[0,0,100,0], 
		name:"Y"});
}catch(e){y = doc.swatches.item('C');}
var cmy = [c, m, y];

var tfBon = [ //マージン内にテキストフレームをつくる
	ma[0],
	ma[1],
	ma[0] + draw_area,
	ma[1] + draw_area
	];

for(var j=0; j &lt; page_len; j++){
	for (var i=0; i &lt; layered; i++) {
		var tf = doc.pages[j].textFrames.add({geometricBounds: tfBon });
		with(tf.parentStory){
			pointSize = 9 + ( max_range * Math.random() ) + "pt"; //(9 ~ 81 pt)
			leading = tf.parentStory.pointSize;
			
			try{
				appliedFont = fon[Math.floor(fon.length * Math.random())]
			}catch(e){}

			//line
			// strokeWeight = "0.3 pt";
			// strokeColor = cmy[Math.floor(cmy.length * 10 * Math.random() / 10)];
			// fillColor = "None";

			//fill
			strokeColor = "None";
			fillColor = cmy[Math.floor(cmy.length * Math.random() )];
		}
		//set dummy text
		tf.contents = TextFrameContents.placeholderText;//1346925688; 
		tf.transparencySettings.blendingSettings.blendMode = BlendMode.MULTIPLY;
		tf.transparencySettings.blendingSettings.opacity = 25;
	}
};
//デスクトップにフォルダを作成してその中に、InDesignドキュメントの各ページをjpeg書出し
exportJepgEachPage (doc);
//書き出したjpegをアンカー付きオブジェクトにして取り込み
placeAnchordImageToDoc (imgFolder);

function exportJepgEachPage (doc) {
	with(app.jpegExportPreferences){
		jpegExportRange = ExportRangeOrAllPages.EXPORT_ALL;
		jpegQuality = JPEGOptionsQuality.MAXIMUM;
		jpegRenderingStyle = JPEGOptionsFormat.BASELINE_ENCODING;
		resolution = 150;
		exportingSpread = false;
		}
	imgFolder = new Folder("~/Desktop/" + new Date().getTime());
	imgFolder.create();
	if(imgFolder){
		fileObj = new File (imgFolder + "/a" + ".jpg");//なにかprefixがないとdot fileの .jpgが生成されてしまう
		if(fileObj){
			doc.exportFile(ExportFormat.JPG, fileObj, false);
		}
	}
}

// doc.close(SaveOptions.NO);
function placeAnchordImageToDoc (impSrc) {
	var doc2 = app.documents.add();
	var tf2 = doc2.textFrames.add();
	var impSrc = imgFolder;
	var impSrc_fs = new File(impSrc).fsName;
	var impSrc_list = File(impSrc_fs).getFiles(
		function (file){ return /^[^\.]+\.jpg$/i.test(file.name)}
		);
	if(impSrc)
	for (var i=0; i &lt; impSrc_list.length; i++) {
		var ob = tf2.parentStory.insertionPoints[-1].rectangles.add();
		tf2.parentStory.insertionPoints[-1].contents = "\n";
		ob.place(impSrc_list[i]);
		ob.anchoredObjectSettings.anchoredPosition = AnchorPosition.ANCHORED;
		ob.fit(FitOptions.FRAME_TO_CONTENT);
	};

}


</pre><div><br /></div><div><br /></div>]]>
        
    </content>
</entry>

<entry>
    <title>TextMate_colors_add.tmSnippet（InDesign JS用）</title>
    <link rel="alternate" type="text/html" href="http://www.milligramme.cc/weblog/2010/08/textmate-colors-addtmsnippetindesign-js.html" />
    <id>tag:www.milligramme.cc,2010:/weblog//3.784</id>

    <published>2010-08-14T11:32:03Z</published>
    <updated>2010-08-14T21:14:06Z</updated>

    <summary>InDesignのExtendScript (JavaScript)などは、ふだ...</summary>
    <author>
        <name>mg</name>
        
    </author>
    
        <category term="InDesign" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="TextMate" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="indesign" label="InDesign" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="textmate" label="TextMate" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="tmsnippet" label="tmSnippet" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.milligramme.cc/weblog/">
        <![CDATA[InDesignのExtendScript (JavaScript)などは、ふだんTextMateで書いているのですが、<br />スニペット機能が便利で思いついた（＝面倒くさいと思った）ときにちょろちょろ作ってたりします。<br />せっかく　<a href="http://kanemu1117nc.blogspot.com/2010/06/extendscript-textmate-bundle.html">ExtendScript TextMate Bundle</a> を公開してくれたので援護射撃気味に.tmSnippetを<br />アップしていこうと思います。<br /><br />とりあえずはInDesignの[Color Object]の作成編<br />

<pre class="brush: js;">docObj.colors[TAB]
</pre>
↑このあとタブ押しで↓のように展開、「Process/Spot/Registration/MixedInkmodel」の部分を選択状態にして待機してくれます。入力後またタブ押しで次のプロパティの値へと順に選択していきます。<br />便利さが伝わるかな？<br />
<pre class="brush: js;">docObj.colors.add({
	model:ColorModel.Process/Spot/Registration/MixedInkmodel, 
	space:ColorSpace.CMYK/RGB/LAB/MixdInk, 
	colorValue:[0,0,0,0], 
	name:""});
</pre>

<span class="mt-enclosure mt-enclosure-file" style="display: inline;"><a href="http://www.milligramme.cc/weblog/img/colors_add.tmSnippet">colors_add.tmSnippet</a></span>
ダウンロード後、ダブルクリックでインストール<br />中身はこんな感じ↓<br /><pre class="brush: xml;"><plist version="1.0"><dict>
	<key>content</key>
	<string>colors.add({
	model:ColorModel.${1:Process/Spot/Registration/MixedInkmodel}, 
	space:ColorSpace.${2:CMYK/RGB/LAB/MixedInk}, 
	colorValue:[${3:0,0,0,0}], 
	name:"${4:}"});</string>
	<key>name</key>
	<string>colors.add</string>
	<key>scope</key>
	<string>source.js</string>
	<key>tabTrigger</key>
	<string>colors</string>
	<key>uuid</key>
	<string>300A7A4D-CEA8-4AFF-B231-17CBADD7C0A8</string>
</dict>
</plist>

</pre>]]>
        
    </content>
</entry>

<entry>
    <title>ScriptUI_コンテンツに応じてのびのびするダイアログ</title>
    <link rel="alternate" type="text/html" href="http://www.milligramme.cc/weblog/2010/07/scriptui-2.html" />
    <id>tag:www.milligramme.cc,2010:/weblog//3.783</id>

    <published>2010-07-23T12:33:57Z</published>
    <updated>2010-07-26T08:28:58Z</updated>

    <summary> のびのびと育ってほしいので、ScriptUIのダイアログをのびるようにしてみま...</summary>
    <author>
        <name>mg</name>
        
    </author>
    
        <category term="InDesign" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="JavaScript" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="ScriptUI" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="indesign" label="InDesign" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="javascript" label="JavaScript" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="regex" label="Regex" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="scriptui" label="ScriptUI" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.milligramme.cc/weblog/">
        <![CDATA[ のびのびと育ってほしいので、ScriptUIのダイアログをのびるようにしてみました。<br /><br />ダイアログに表示する内容に合わせてサイズを可変させます。当然、項目が多すぎるとディスプレイからはみ出します。<br /><br /><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="stretch_dialog_input.png" src="http://www.milligramme.cc/weblog/img/stretch_dialog_input.png" class="mt-image-none" style="" width="632" height="484" /></span><br /><br />おまけ、正規表現で設定した内容以外は頑として受け付けません。<br /><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="sd_regex_alert.png" src="http://www.milligramme.cc/weblog/img/sd_regex_alert.png" class="mt-image-none" style="" width="554" height="266" /></span><br />機能はあくまでサンプルなので実用的かどうかは別問題です。それ以前に、素直にResource Specificationsつかえばいいのに。って声が聞こえてきそう<br /><br /><b>20100726(Mon)1730頃：</b>cancelButtonの記述がおかしかったのを修正<br />
<pre class="brush: js;">/**
 * のびのびダイアログ
 * コンテンツに応じてダイアログのサイズを可変させるサンプル
 * 機能：
 * InDesign のスウォッチとレイヤーの名前をリネームする
 */

var docObj = app.documents[0];
var swatchObj = unReservedSwatch(docObj);
var layObj = docObj.layers;

//create dialog
//dialogはpanelのサイズに合わせて自動調整
var dlg = new Window('dialog',"stretch dialog", undefined);
//swatch panel
dlg.panel = dlg.add('panel',[5,5,340,320],"Swaaaaaaaaaatch");
var sw_panelbon = dlg.panel.bounds;

var y1 = 0, swArr = [];
for (var isw=0; isw &lt; swatchObj.length; isw++) {
	swatchObjName = dlg.panel.add('statictext', [20,20+y1,180,40+y1], ''+swatchObj[isw].name);
	swRenameName = dlg.panel.add('edittext', [180,20+y1,320,40+y1], '',{multiline: false});
	y1 += 25;
	swArr.push([swatchObjName, swRenameName]);
}
var py = y1 +35;
//panelのサイズを拡張のびーる
dlg.panel.bounds = [sw_panelbon[0], sw_panelbon[1], sw_panelbon[2], py];

var ly_panelbon = [5, py, 340, py +100];//swatchのパネルの下端から作成、高さはとりあえず100
//layer panel
dlg.panel2 = dlg.add('panel', ly_panelbon, "Layeeeeeeeeeeeer");

var y2 = 0, lyArr = [];
for (var ily=0; ily &lt; layObj.length; ily++) {
	layObjName = dlg.panel2.add('statictext', [20,20+y2,180,40+y2], ''+layObj[ily].name);
	lyRenameName = dlg.panel2.add('edittext', [180,20+y2,320,40+y2], '',{multiline: false});
	y2 += 25;
	lyArr.push([layObjName, lyRenameName]);
	}
var py2 = y2 + 30;
//panel2のサイズを拡張のびーる
dlg.panel2.bounds = [ly_panelbon[0], ly_panelbon[1], ly_panelbon[2], ly_panelbon[1]+py2];

dlg.okButton = dlg.add('button',undefined,"ok",{name: 'ok'});
dlg.cancelButton = dlg.add('button',undefined,"cancel",{name: 'cancel'});

dlg.center();
var flg;
dlg.okButton.onClick = function(){
	flg = true
	dlg.close();	
}
dlg.cancelButton.onClick = function(){
	flg = false
	dlg.close();	
}

dlg.show();

if(flg == true){
	renameswatchObj(docObj, swArr);
	renamelayerObj(docObj, lyArr);
	}


/**
 * raname object (swatch)
 * @param {Object} doc Document
 * @param {Array} array ==&gt; [object, string] 
 */
function renameswatchObj (doc, array) {
	for (var i=0; i &lt; array.length; i++) {
		var stylename = array[i][0].text;
		var renamename = array[i][1].text;
		if(renamename.length &gt; 0){
			var styleObj = doc.swatches.item(stylename);
			retryRename (styleObj, renamename); //Fnへ
			}
		}
}
/**
 * raname object (layer)
 * @param {Object} doc Document
 * @param {Array} array ==&gt; [object, string] 
 */
function renamelayerObj (doc, array) {
	for (var i=0; i &lt; array.length; i++) {
		var stylename = array[i][0].text;
		var renamename = array[i][1].text;
		if(renamename.length &gt; 0){
			var styleObj = doc.layers.item(stylename);
			retryRename (styleObj, renamename); //Fnへ
			}
		}
}
/**
 * regex check and retry rename
 * @param {Object} obj such as Swatch, Layers, ParagraphStyles(exist name property object)
 * @param {String} string rename string
 */
function retryRename (obj, string) {
	//リネームの正規表現チェック
	var regexCheck = string.match(/^[A-Za-z][0-9A-Za-z_-]*/g);
	if(regexCheck != string){
		reg_retry = prompt("ルールにマッチしません",string);
		if(reg_retry){
			string = reg_retry;
			retryRename (obj, string);
			}
		else{exit();}
		}
	//リネームの重複チェック
	try{
		obj.name = string;
		}
	catch(e){
		var retry = prompt("変更前「"+obj.name+"」：\r名前は既にあります。変更して下さい。",string);	
		if(retry){
			retryRename(obj, retry);
			}
		else{exit();}
		}
	
}
/**
 * unreserved swatch
 * @param {Object} doc Document
 * @returns {Array} otherSw the return value 
 */
function unReservedSwatch(doc){
	var swObj = doc.swatches;
	var otherSw = new Array();
	if(swObj.length-4 &gt; 0){
		for(var i=0; i &lt; swObj.length; i++){
			switch(swObj[i].name){
				case "None":
				case "Paper":
				case "Black":
				case "Registration": break;
				default : 
					otherSw.push(swObj[i]);
					break;
				}
			}
		}
	return otherSw;
}
</pre><div><br /></div>]]>
        
    </content>
</entry>

<entry>
    <title>Illustrator_トップレベルのグループをさがす</title>
    <link rel="alternate" type="text/html" href="http://www.milligramme.cc/weblog/2010/07/illustrator-6.html" />
    <id>tag:www.milligramme.cc,2010:/weblog//3.782</id>

    <published>2010-07-23T08:36:08Z</published>
    <updated>2010-07-23T08:40:26Z</updated>

    <summary> InDesignのスクリプト書きに慣れていると、たまにIllustrator用...</summary>
    <author>
        <name>mg</name>
        
    </author>
    
        <category term="Illustrator" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="JavaScript" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="group" label="Group" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="illustrator" label="Illustrator" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="javascript" label="JavaScript" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.milligramme.cc/weblog/">
        <![CDATA[ InDesignのスクリプト書きに慣れていると、たまにIllustrator用に書こうとするとえらい苦労をします。<br /><br />今回は、Illustratorではページアイテムの取得したいのに入れ子のアイテムもひっくるめて全部返してくるので、選択ツール（黒い方）で選択したような戻り値を期待しても取得できないのに手間取ったのですが、達人たちはこんな時「選択アイテム限定」とすることで制御してるらいいのですが。<br />とりあえずグループアイテムを選択ツールで選択したときの数(app.selection.length)と同等のアイテムが取得できないものか試したときのメモ。<br /><br />グループアイテムを何個かまとめてグループ化したもの<br />→groupItems.lengthだと入れ子たちもふくまれちゃう。<br />→これで一個になってほしい。<br /><br />条件<br /><ul><li>親がレイヤー</li><li>子に何かしらのアイテムがある（一個でグループの場合も含む）</li></ul>こんなのでいいのかな？　<br /><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="groups_on_doc.png" src="http://www.milligramme.cc/weblog/img/groups_on_doc.png" class="mt-image-none" style="" width="400" height="375" /></span><br /><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="result_of_group_check.png" src="http://www.milligramme.cc/weblog/img/result_of_group_check.png" class="mt-image-none" style="" width="554" height="275" /></span><br />トップレベルのグループアイテムを取得する。<br />


<pre class="brush: js;">#target "Illustrator"

var doc = app.documents[0];
var topG = getTopGroup(doc.groupItems);
alert("top level group:"+topG.length+ "\r" +
	"PageItems:" + doc.pageItems.length + "\r" +
	"PathItems:" + doc.pathItems.length + "\r" +
	"CompoundPathItems:" + doc.compoundPathItems.length + "\r" +
	"GroupItems:" + doc.groupItems.length + "\r" +
	"Selection:" + doc.selection.length);

/**
 * get top level group items
 * @param {Array} group Array of GroupItem
 * @returns {Array} tgr Array of top level GroupItem
 */
function getTopGroup (group) {
	var tgr=[];
	for (var i=0; i &lt; group.length; i++) {
		//parent is Layer
		if(group[i].parent.typename == "Layer"){
			//group is formed with single path item
			if(group[i].pathItems.length == 1){
				tgr.push(group[i]);
			}
			//group is formed with compound path item
			if(group[i].compoundPathItems.length == 1){
				tgr.push(group[i]);
			}
			//group include any page items(textframe, pathitem)
			else if(group[i].pageItems.length != 0){
				tgr.push(group[i]);
				}
			}
		}
	return tgr;
}

</pre><div><br /></div>]]>
        
    </content>
</entry>

<entry>
    <title>ExtendScript_$.write()と$.writeln()とESTKとごめんなさい</title>
    <link rel="alternate" type="text/html" href="http://www.milligramme.cc/weblog/2010/07/extendscript-toolkit.html" />
    <id>tag:www.milligramme.cc,2010:/weblog//3.781</id>

    <published>2010-07-15T12:39:18Z</published>
    <updated>2010-07-15T12:41:34Z</updated>

    <summary> ごめんなさい、懺悔します。以前から一部の自前のスクリプトで何故かExtendS...</summary>
    <author>
        <name>mg</name>
        
    </author>
    
        <category term="Illustrator" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="InDesign" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="JavaScript" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Photoshop" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="extendscript" label="ExtendScript" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.milligramme.cc/weblog/">
        <![CDATA[ ごめんなさい、懺悔します。<br /><br />以前から一部の自前のスクリプトで何故かExtendScript Toolkitが勝手に立ち上がるときがあるなと思っていたのですが、最近はほとんどESTKを使わない日々が続き、今日やっと理由がわかりました。（今は<a href="http://macromates.com/">TextMate</a>使い）<br /><br />ExtendScript のスクリプトの中に $.writeln( ) や $.write( ) がある（コメントアウトされていない）と <br />InDesignのScriptPanelなどのアプリケーションから実行しても、裏で ExtendScript Toolkit が勝手に起動してしまう（CS3だとESTK2がDOMのXMLをちくちく読み込みに行き、そしてXML読み込みに失敗する）ことになるのを知りました。<br /><br /><br /><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="estk_xml.png" src="http://www.milligramme.cc/weblog/img/estk_xml.png" class="mt-image-none" style="" width="396" height="161" /></span><br /><br />$.writeln( ), $.write( )はちゃんとコメントアウトします。反省。<br /><br /><pre class="brush: js;">//ESTKを立ち上げていない状態で
//アプリケーションから実行すると、ESTKが立ち上がってくれます。
$.writeln("Hello ESTK from backyard");
</pre><div><br /></div>]]>
        
    </content>
</entry>

<entry>
    <title>ScriptUI_EditTextとタブの関係</title>
    <link rel="alternate" type="text/html" href="http://www.milligramme.cc/weblog/2010/07/scriptui-1.html" />
    <id>tag:www.milligramme.cc,2010:/weblog//3.780</id>

    <published>2010-07-14T13:09:38Z</published>
    <updated>2010-07-14T13:20:06Z</updated>

    <summary>ScriptUIのダイアログでEditTextをfor ( )｛ ｝式で回してコ...</summary>
    <author>
        <name>mg</name>
        
    </author>
    
        <category term="ScriptUI" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="javascript" label="JavaScript" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="scriptui" label="ScriptUI" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.milligramme.cc/weblog/">
        <![CDATA[ScriptUIのダイアログでEditTextをfor ( )｛ ｝式で回してコンテンツに応じて生成しようとしたとき、入力時にタブで飛ばないことがあったのでメモ。<br /><br />普通EditTextはタブでフィールドを移動できます。<br />違うnameのEditText'であっても、生成順にタブ移動できるし、StaticTextとEditEextを織り交ぜても大丈夫。
でもCheckBox, DropDownList, RadioButtonが含まれるとダメみたい。<br />そんな時は、GroupやPanelで隔離すれば大丈夫になるので、別なfor ( ) ｛　｝式で生成すればよいみたい。<br /><br />
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="win12.png" src="http://www.milligramme.cc/weblog/img/win12.png" class="mt-image-none" style="" height="253" width="393" /><br /><br /></span>

<pre class="brush: js;">//タブで次のフィールドに飛ぶ
//edittext
var win = new Window('dialog',"edittext text",undefined);
var x=0;
for (var i=0; i &lt; 5; i++) {
	win.add('edittext',[5,5+x,300,25+x],"1",{name:"first"});
	win.add('edittext',[35,25+x,300,45+x],"2",{name:"second"});
	x += 35;
	};
win.add('button',undefined,"ok",{name:'ok'});
win.show();

//edittext + statictext
var win2 = new Window('dialog',"edittext + statictext test",undefined);
x=0;
for (var i=0; i &lt; 5; i++) {
	win2.add('edittext',[5,5+x,300,25+x], i);
	win2.add('statictext',[5,25+x,300,45+x],"text-"+i);
	x += 35;
	};
win2.add('button',undefined,"ok",{name:'ok'});
win2.show();
</pre>

<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="win345.png" src="http://www.milligramme.cc/weblog/img/win345.png" class="mt-image-none" style="" height="223" width="591" /><br /><br /></span>
<pre class="brush: js;">//タブが効かない。
//edittext + statictext + checkbox
var win3 = new Window('dialog',"edittext + statictext + checkbox test",undefined);
x=0;
for (var i=0; i &lt; 3; i++) {
	win3.add('edittext',[5,5+x,300,25+x],i);
	win3.add('checkbox',[5,25+x,300,45+x],"checbox-"+i);
	win3.add('statictext',[5,45+x,300,60+x],"text-"+i);
	x += 45;
	};
win3.add('button',undefined,"ok",{name:'ok'});
win3.show();

//edittext + statictext + dropdownlist
var win4 = new Window('dialog',"edittext + statictext + dropdown test",undefined);
x=0;
for (var i=0; i &lt; 3; i++) {
	win4.add('edittext',[5,5+x,300,25+x],i);
	win4.add('dropdownlist',[5,25+x,300,45+x],['a','b','c']);
	win4.add('statictext',[5,45+x,300,60+x],"text-"+i);
	x += 45;
	};
win4.add('button',undefined,"ok",{name:'ok'});
win4.show();

//edittext + statictext + radiobutton
var win5 = new Window('dialog',"edittext + statictext + radiobutton",undefined);
x=0;
for (var i=0; i &lt; 3; i++) {
	win5.add('edittext',[5,5+x,300,25+x],i);
	win5.add('radiobutton',[5,25+x,300,45+x]);
	win5.add('statictext',[5,45+x,300,60+x],"text-"+i);
	x += 45;
	};
win5.add('button',undefined,"ok",{name:'ok'});
win5.show();
</pre>

<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="win6.png" src="http://www.milligramme.cc/weblog/img/win6.png" class="mt-image-none" style="" height="247" width="195" /></span>
<pre class="brush: js;">//GroupやPanelで隔離すれば大丈夫になる。
//edittext + statictext + radiobutton
var win6 = new Window('dialog',"edittext + statictext + radiobutton",undefined);
x=0;
for (var i=0; i &lt; 3; i++) {
	win6.add('edittext',[5,5+x,300,25+x],i);
	win6.add('statictext',[5,45+x,300,60+x],"text-"+i);
	x += 35;
	};
var x2 = x + 10;
win6.group = win6.add('group',[5,x2,300,x2+130]);
var x3 = 0
for (var j=0; j &lt; 3; j++) {
	win6.group.add('radiobutton',[5,25+x3,300,45+x3],"radiobutton-" + j);
	x3 += 30;
};

win6.add('button',undefined,"ok",{name:'ok'});
win6.show();
</pre>
]]>
        
    </content>
</entry>

<entry>
    <title>InDesign_Just Now なパラパラオブジェクトを作る</title>
    <link rel="alternate" type="text/html" href="http://www.milligramme.cc/weblog/2010/07/indesign-justnow.html" />
    <id>tag:www.milligramme.cc,2010:/weblog//3.779</id>

    <published>2010-07-13T13:08:39Z</published>
    <updated>2010-07-13T13:13:15Z</updated>

    <summary><![CDATA[&nbsp; InDesignで パラパラオブジェクトをつくる試み。以前につくっ...]]></summary>
    <author>
        <name>mg</name>
        
    </author>
    
        <category term="InDesign" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="JavaScript" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="gion" label="Gion" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="indesign" label="InDesign" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="javascript" label="JavaScript" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.milligramme.cc/weblog/">
        <![CDATA[<br /><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="paraindesign.png" src="http://www.milligramme.cc/weblog/img/paraindesign.png" class="mt-image-none" style="" width="115" height="725" /></span>&nbsp; <br /><br />InDesignで パラパラオブジェクトをつくる試み。<br />以前につくった「<a href="http://www.milligramme.cc/weblog/2009/11/indesign-59.html">InDesign_選択オブジェクトをグリグリ、ゲジゲジ</a>」スクリプトを時計風に加工してみました。現在の時刻を元にだいたいランダムなパラメーターを生成します。<br /><br />スクリプトで300ページのゲジゲジ時計を生成します。<br />Flashでパラパラできます（<span class="mt-enclosure mt-enclosure-file" style="display: inline;"><a href="http://www.milligramme.cc/weblog/img/parapara.swf">parapara.swf</a></span>）。PDFもパラパラできます。ePubはポリゴンオブジェクトの書出しがされないので残念ながらもうひと手間必要なようです。<br /><br />
<pre class="brush: js;">//Indesign Just now
//裏処理で新規ドキュメントを作成します。
var doc = app.documents.add(false);

//ドキュメント設定
doc.documentPreferences.pageWidth = 150;
doc.documentPreferences.pageHeight = 150;
doc.documentPreferences.facingPages = false;
doc.documentPreferences.pagesPerDocument = 300; //1-9999
doc.viewPreferences.rulerOrigin = RulerOrigin.SPREAD_ORIGIN;

var dSize = Math.min(doc.documentPreferences.pageWidth, doc.documentPreferences.pageHeight);
var pageCount = doc.documentPreferences.pagesPerDocument
var pageObj = doc.pages;

//ドキュメントのページ数を設定して、その中でループさせる。
for (var pg = 0; pg &lt; pageCount; pg++){
	var timeObj =  new Date();//いま！
	var h = timeObj.getHours();
	var m = timeObj.getMinutes();
	var s = timeObj.getSeconds();

	pi = Math.PI/180;//角度をラジアンに

	//3時から始まるので-90°する。
	var hRadian = (h/12*360 + m/60*360/12 - 90) * pi;
	var mRadian = (m/60*360 + s/60*360/60 - 90) * pi;
	var sRadian = (s/60*360 - 90) * pi;
	
	//盤の大きさ、針の長さ
	var baseL = dSize/2 * 0.6;
	var hL = baseL * 0.5;
	var mL = baseL * 0.75;
	var sL = baseL * 0.8;
	
	//盤と針
	var ov = pageObj[pg].ovals.add();
	ov.visibleBounds = [0,0,2*baseL,2*baseL];
	ov.convertShape (ConvertShapeOptions.CONVERT_TO_POLYGON, 60, 0);

	var houN = pageObj[pg].graphicLines.add()
	houN.paths[0].entirePath = [[baseL, baseL],[hL*Math.cos(hRadian)+baseL,hL*Math.sin(hRadian)+baseL]];

	var minN = pageObj[pg].graphicLines.add()
	minN.paths[0].entirePath = [[baseL, baseL],[mL*Math.cos(mRadian)+baseL,mL*Math.sin(mRadian)+baseL]];

	var secN =pageObj[pg].graphicLines.add()
	secN.paths[0].entirePath = [[baseL, baseL],[sL*Math.cos(sRadian)+baseL,sL*Math.sin(sRadian)+baseL]];

	//グループ化させてセンターに
	var grN = doc.pages[pg].groups.add([ov, houN, minN, secN]);
	grN.move([dSize/2 - baseL, dSize/2- baseL]);
	var sels = grN.allPageItems;
	//グループ化解除
	grN.ungroup();
	
	//パーツごとにぐりぐりする。
	for (var i = sels.length-1; i &gt;= 0 ; i--) {
		var vSpeed = Math.min(1 + s, dSize/10); //仮想移動速度。ちいさい程、分割数が多くなる（ステップ数が増える）
		var childArm = Math.min(1 + m, dSize/20) ; //だいたいの太さ
		var degreePerCount = 1 + h + Math.random() * 90; //ぐるぐると360°を分割してまわる角度
		var childRandom = true;//true げじげじ、 false ぐるぐる
	
		grin (doc, sels[i], vSpeed, childArm, degreePerCount, childRandom);
		sels[i].remove();
		}// eof sels
	}// eof page

//裏方処理をしたなら、表に出す。
if(doc.visible == false){doc.windows.add();}

//オブジェクトの線分をパスポイントに分割
function grin (doc, sel, vSpeed, childArm, degreePerCount, childRandom) {
	var page = doc.pages.itemByName(sel.parent.appliedSection.name + sel.parent.name);
	moArray = new Array();
	var startPoint, endPoint, moArr;
	for(var p = 0; p &lt; sel.paths[0].pathPoints.length-1; p++){
		if(p &lt; sel.paths[0].pathPoints.length-1){
			startPoint=sel.paths[0].pathPoints[p].anchor;
			endPoint=sel.paths[0].pathPoints[p+1].anchor;
			}
		moArr = getLocus(startPoint, endPoint, vSpeed);
		}
	if(sel.paths[0].pathType == PathType.CLOSED_PATH){
		startPoint = sel.paths[0].pathPoints[-1].anchor;
		endPoint = sel.paths[0].pathPoints[0].anchor;
		}
	moArr = getLocus(startPoint, endPoint, vSpeed);
	grinPlace(page, moArr, childArm, degreePerCount, childRandom);
}

//移動中の座標を取得して配列に追加していく
function getLocus(start, end, vSpeed){
	var selW = end[0]-start[0];
	var selH = end[1]-start[1];

	//アンカー間の距離と傾き
	var selDist = Math.sqrt (Math.pow(selW,2) + Math.pow(selH,2));
	var selRad = Math.atan(selH / selW);

	//移項（xの負の方向への移動のとき）
	var aljabr;
	if(selW &lt; 0){aljabr = -1;}
	else{aljabr = 1;}

	//設定した間隔で座標を取得
	for(var i = 0; i &lt; selDist/vSpeed; i++){
		var moX = start[0] + aljabr*vSpeed*i*Math.cos(selRad);
		var moY = start[1] + aljabr*vSpeed*i*Math.sin(selRad);

		moArray.push([moX, moY]);
		}
	//端数で終端に達しなかった時
	if(moArray[-1] != end){
		moArray.push(end);
		}
	return moArray;
}

//ぐりぐりを生成
function grinPlace(page, array, arm, degree, random){
	var chiArray = new Array();
	var childX, childY;
	for(var j = 0; j &lt; array.length; j++){
		for(var k = 0; k &lt; 360/degree; k++){
			if(random == true){
				childX = array[j][0] + arm*Math.cos(pi*degree*k)*Math.random();
				childY = array[j][1] + arm*Math.sin(pi*degree*k)*Math.random();
				}
			else{
				childX = array[j][0] + arm*Math.cos(pi*degree*k);
				childY = array[j][1] + arm*Math.sin(pi*degree*k);
				}
			chiArray.push( [childX, childY] );
			}
		}
		var chiObj = page.rectangles.add();
		chiObj.paths[0].entirePath = chiArray;
		chiObj.paths[0].pathType = PathType.OPEN_PATH;
		chiObj.fillColor = "None";
		chiObj.strokeWeight = 0.5;
		var clrArr = ["Black", "Cyan", "Magenta", "Yellow"];
		chiObj.strokeColor = clrArr[Math.floor(Math.random()*(clrArr.length-1))];
		chiObj.strokeTint = 50 + Math.random()*50;
}
</pre><div><br /></div>]]>
        
    </content>
</entry>

<entry>
    <title>InDesign_PNG書き出し</title>
    <link rel="alternate" type="text/html" href="http://www.milligramme.cc/weblog/2010/07/indesign-png.html" />
    <id>tag:www.milligramme.cc,2010:/weblog//3.777</id>

    <published>2010-07-02T12:00:12Z</published>
    <updated>2010-07-15T07:42:14Z</updated>

    <summary>InDesignの標準機能で png書き出しはないけど、スクリプトならできます。...</summary>
    <author>
        <name>mg</name>
        
    </author>
    
        <category term="InDesign" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="JavaScript" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="indesign" label="InDesign" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="javascript" label="JavaScript" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="png" label="PNG" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="epub" label="ePub" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.milligramme.cc/weblog/">
        <![CDATA[InDesignの標準機能で png書き出しはないけど、スクリプトならできます。<br />ただし、jpegやeps、pdf書き出しと違い、なぜかExportOptionsがないので細かい設定ができません。ドキュメント上の原寸サイズで、72ppiの透過png（レイヤー生きなら）が書き出されるようです。もうすこし高解像度にしたければ......（その方法は、ちょっと考えればわかると思います）。<br /><br />pngを何に使うかといえば、○○○○絡みでInDesignの○○○○書き出しのオプションで画像形式が、まだjpegとgifしか選択できないので、透過png使ってみたいなーなんて。あとInDesignのグラフィックツールで描画したオブジェクトが○○○○では無視されるんで、それの透過png書き出しとか......。<br /><br /><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="pngexport.png" src="http://www.milligramme.cc/weblog/img/pngexport.png" class="mt-image-none" style="" width="600" height="456" /></span><br /><br /><pre class="brush: js;">//PNG書き出し
var sel = app.selection[0];
var file = new File("~/Desktop/pudding.png");
var feedback = exportPNG(sel, file);
alert(feedback);//boolean

/**
 * exportPNG 
 * @param {Object} target Selected Object to export PNG
 * @param {Object} file Export File Destination
 * 
 * @returns {Boolean} true if success to export
 * 
 * export 72ppi transparent png no options exist
 */
function exportPNG (target, file) {
	if(target.allGraphics.length==1){
		var graphicObj = target.allGraphics[0];
		switch(graphicObj.constructor.name){
			case "PICT" :
			case "EPS" :
			case "WMF" :
			case "PDF" :
			case "Image" ://PSD/TIFF/JPEG/BMP
			case "ImportedPage" ://INDD
				try{
					target.exportFile(ExportFormat.PNG_FORMAT, file );
					return true;
				}catch(e){
					//$.writeln("saving was failed\r"+e);
					return false;
					}
			break;			
			default : return false;
			}
		}
	else{
		switch(target.constructor.name){
			case "Polygon":
			case "Rectangle":
			case "Oval":
			case "Group":
			case "GraphicLine" :
			case "TextFrame":
				try{
					target.exportFile(ExportFormat.PNG_FORMAT, file );
					return true;
				}catch(e){
					//$.writeln("saving was failed\r"+e);
					return false;
					}
				break;
			default : return false;
			}
		}
}
</pre>]]>
        
    </content>
</entry>

<entry>
    <title>InDesign_ストーリー内のアンカー付きオブジェクトの位置を探す。</title>
    <link rel="alternate" type="text/html" href="http://www.milligramme.cc/weblog/2010/07/indesign-108.html" />
    <id>tag:www.milligramme.cc,2010:/weblog//3.778</id>

    <published>2010-07-02T05:58:28Z</published>
    <updated>2010-07-02T06:17:02Z</updated>

    <summary> InDesign でストーリー中のアンカー付きオブジェクトが挿入されている場所...</summary>
    <author>
        <name>mg</name>
        
    </author>
    
        <category term="InDesign" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="JavaScript" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="anchoredobject" label="AnchoredObject" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="indesign" label="InDesign" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="javascript" label="JavaScript" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.milligramme.cc/weblog/">
        <![CDATA[ InDesign でストーリー中のアンカー付きオブジェクトが挿入されている場所を探すのに、<br />CharacterObjectでチコチコ PageItem がないか回していたら大変なので、String と indexOfでできないものか調べてみたのでメモ。<br /><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="an.png" src="http://www.milligramme.cc/weblog/img/an.png" class="mt-image-none" style="" width="378" height="143" /></span><br />
<pre class="brush: js;">var sel = app.selection[0];
for(var i=0; i &lt; sel.contents.length; i++){
	$.writeln(sel.contents.charCodeAt(i).toString(16));
	}
</pre>

<i>true <br />----結果----<br />3042<br />3093<br />3042<br />3093<br />fffc<br />3042<br />3093<br />----結果----</i><div><br />fffcが怪しい。<br />ためしに下のコードで合っているかためしてみると。<br /></div>

<pre class="brush: js;">$.writeln(app.selection[0].contents.indexOf(String.fromCharCode("0xfffc"),0));
</pre>

<i>true <br />----結果----<br />4<br />----結果----</i><div>いい感じ。<br />OBJECT REPLACEMENT CHARACTER っていうんだ。勉強になった。</div>]]>
        
    </content>
</entry>

<entry>
    <title>InDesign_アンカー付きオブジェクトだけ設定したオブジェクトスタイルを作る</title>
    <link rel="alternate" type="text/html" href="http://www.milligramme.cc/weblog/2010/06/indesign-107.html" />
    <id>tag:www.milligramme.cc,2010:/weblog//3.776</id>

    <published>2010-06-26T12:14:36Z</published>
    <updated>2010-07-10T00:54:45Z</updated>

    <summary> これから○○○○絡みで、アンカー付きオブジェクトって重要になってくるわけで、過...</summary>
    <author>
        <name>mg</name>
        
    </author>
    
        <category term="InDesign" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="JavaScript" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="anchoredobject" label="AnchoredObject" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="indesign" label="InDesign" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="javascript" label="JavaScript" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="style" label="Style" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="epub" label="ePub" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.milligramme.cc/weblog/">
        <![CDATA[ これから○○○○絡みで、アンカー付きオブジェクトって重要になってくるわけで、過去の資産を変換なんてことも必要になってくるはず。それに備えて InDesignのアンカー付きオブジェクト周りを調べてみました。
<br />アンカー付きオブジェクトのGUIそのままにややこしいです。
<br />あるプロパティのBoolean値によって、あるプロパティの値の意味が違ったりします。プロパティの共用しているので、名前に惑わされて思い通りに設定できなくてとても悩みます。<br />調べてみて一つわからなかったのが ObjectStyleSettings の VerticalAlignment 。名前から「行の上」のときの垂直揃えだと予測できるのですが、GUIでもそんな設定項目がなく、TopやBottomを設定しても無視されてCenterになってしまうのです。
<br /><br />とりあえず実行するとこんなオブジェクトスタイルができます。という関数のサンプル。<br />InDesign CS4 + OSX 10.6.4で試しました。<br /><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="anchobjObjStyle.png" src="http://www.milligramme.cc/weblog/img/anchobjObjStyle.png" class="mt-image-none" style="" width="600" height="507" /></span><br />


<pre class="brush: js;">/**
 * @description アンカー付きオブジェクトだけ設定したオブジェクトスタイルをドキュメントに作る
 * 
 * @param {Object} doc document object
 * @param {String} objStyleName object-style name
 * @example createObjStyl(app.documents[0],"ancho_only");
 */
function createObjStyl (doc, objStyleName) {
	var objStyle;
	try {
		objStyle = doc.objectStyles.add({name:objStyleName});
		}
	catch(e){
		var rep = confirm("already existed object-style named \'"+objStyleName+"\'.\rdo you replace to this?");
		if(rep){
			//問答無用で置換するなら、confirmとif/elseはいらない。下の一行だけでよし
			objStyle = doc.objectStyles.item(objStyleName);
			}
		else {
			alert("replacement was canceled by you");
			exit();
			}
		}
	with(objStyle){
		//アンカー付きオブジェクトを有効にする
		enableAnchoredObjectOptions = true;
		//それ以外を無効にしておく
		enableParagraphStyle = false;
		enableFill = false;
		enableStroke = false;
		enableStrokeAndCornerOptions = false;
		enableTextFrameGeneralOptions = false;
		enableTextFrameBaselineOptions = false;
		enableStoryOptions = false;
		enableTextWrapAndOthers = false;
		enableFrameFittingOptions = false;
		}

	with(objStyle.anchoredObjectSettings){
		anchoredPosition = AnchorPosition.ANCHORED;
			//親の文字からの間隔：カスタム、インライン、行の上
			//ANCHORED //INLINE_POSITION //ABOVE_LINE 

		anchorXoffset = 0;//Xオフセット（カスタム）
		anchorYoffset = 0;//Yオフセット（インライン／カスタム）、後ろスペース（行の上）
		anchorSpaceAbove = 0;//前スペース（行の上）

		lockPosition = false;//手動配置を防ぐ

		pinPosition = false;//段の上下境界線内に収める（カスタム）
		spineRelative = false;//ノド元を基準（カスタム/行の上）

		anchorPoint = AnchorPoint.CENTER_ANCHOR;
			//アンカー付き位置　基準点（カスタム）
			//TOP_CENTER_ANCHOR //TOP_LEFT_ANCHOR //TOP_RIGHT_ANCHOR
			//CENTER_ANCHOR //LEFT_ANCHOR //RIGHT_ANCHOR
			//BOTTOM_CENTER_ANCHOR //BOTTOM_LEFT_ANCHOR //BOTTOM_RIGHT_ANCHOR

		horizontalAlignment = HorizontalAlignment.CENTER_ALIGN;
			//揃え（行の上）　ノド元に〜〜はspineRelative = true と併用する
			//CENTER_ALIGN //LEFT_ALIGN //RIGHT_ALIGN //TEXT_ALIGN
			
		verticalAlignment = VerticalAlignment.CENTER_ALIGN;
			//垂直方向の揃え？？？
			//BOTTOM,TOPを設定しても、CENTER_ALIGN 1667591796 になる
			//BOTTOM_ALIGN //CENTER_ALIGN //TOP_ALIGN
			
		horizontalReferencePoint = AnchoredRelativeTo.COLUMN_EDGE;
			//アンカー付き位置　X基準（カスタム）
			//ANCHOR_LOCATION //COLUMN_EDGE //PAGE_EDGE 
			//PAGE_MARGINS //TEXT_FRAME

		verticalReferencePoint = VerticallyRelativeTo.COLUMN_EDGE;
			//アンカー付き位置　Y基準（カスタム）
			//CAPHEIGHT //COLUMN_EDGE
			//LINE_ASCENT //LINE_BASELINE //LINE_XHEIGHT
			//PAGE_EDGE //PAGE_MARGINS 
			//TEXT_FRAME //TOP_OF_LEADING	
	}
}</pre>
<div><br /></div>]]>
        
    </content>
</entry>

<entry>
    <title>InDesign_ドキュメントは何ページまでできるかを調べる</title>
    <link rel="alternate" type="text/html" href="http://www.milligramme.cc/weblog/2010/06/indesign-106.html" />
    <id>tag:www.milligramme.cc,2010:/weblog//3.775</id>

    <published>2010-06-22T09:05:45Z</published>
    <updated>2010-06-22T09:09:45Z</updated>

    <summary>InDesignのドキュメントっていったい何ページまで含むことができるのかを調べ...</summary>
    <author>
        <name>mg</name>
        
    </author>
    
        <category term="InDesign" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="JavaScript" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.milligramme.cc/weblog/">
        <![CDATA[InDesignのドキュメントっていったい何ページまで含むことができるのかを調べてみよう。<br />ページ足していってエラーになったら多分無理ってことで。<br /><br />
<pre class="brush: js;">//ページ追加の限界に挑戦する。
var doc = app.documents[0];
var ppd = doc.documentPreferences.pagesPerDocument;
try{
	for(var i = 0; i &lt; 9999; i++){
	doc.documentPreferences.pagesPerDocument +=1;
	$.writeln(ppd+i);
	}
}catch(e){
	alert((ppd+i)+"ページが限界です。");
	exit();
	}
</pre>

<br /><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="pageAlertScrpt.png" src="http://www.milligramme.cc/weblog/img/pageAlertScrpt.png" class="mt-image-none" style="" height="226" width="554" /></span><br /><b>「９９９９ページが限界のようです。」</b><br /><br />実は、上記のスクリプトなんか使わずに、UIから想像してみるという手で調べました。<br />（実際に処理したらアホみたいに時間がかかると思います。）<br />新規ドキュメント作成などで出るダイアログの「ページ数」のフィールドを見てみると入力は４桁が限度っぽいので試しに「9999」と入れてみます。仕様とUIが一致していたら10000ページは無理でしょう。<br /><br /><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="docSetting.png" src="http://www.milligramme.cc/weblog/img/docSetting.png" class="mt-image-none" style="" height="262" width="625" /></span><br /><div><br />9999ページ分の空ページ作るのも結構時間がかかります。<br />整いましたら、ページパネルなどでページ追加を試みます。<br /><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="pageAlertApp.png" src="http://www.milligramme.cc/weblog/img/pageAlertApp.png" class="mt-image-none" style="" height="226" width="554" /></span><br /></div><div><br />じゃん。やっぱり無理でした。そしてこっちの方が断然早かったりします。<br /><br />UIの意図を考えてみるというとか、そういう深い話ではないのですが、GUIの下も結局はプログラムがうごいているのだから、角度を変えてせめてみると解決策が隠れていたりするんだなと思ってみたりしたわけです。<br /></div><div><br /></div>]]>
        
    </content>
</entry>

<entry>
    <title>event_DTP Booster 014にいってきました編</title>
    <link rel="alternate" type="text/html" href="http://www.milligramme.cc/weblog/2010/06/event-dtp-booster-014.html" />
    <id>tag:www.milligramme.cc,2010:/weblog//3.774</id>

    <published>2010-06-21T03:45:21Z</published>
    <updated>2010-06-21T03:48:36Z</updated>

    <summary>神田ベルサールで行われた DTP Booster  01４（Omotesando...</summary>
    <author>
        <name>mg</name>
        
    </author>
    
        <category term="InDesign" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Miscellaneous" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="event" label="Event" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.milligramme.cc/weblog/">
        <![CDATA[神田ベルサールで行われた <a href="http://www.dtp-booster.com/vol14/">DTP Booster 
01４（Omotesando/100619）</a>に行ってきました。<br />今回は電子書籍特集、未だかつてないてんこ盛りな内容でした。<br />
    <br /><ol><li>小木　昌樹さん</li><li>境 祐司さん</li><li>Joel Ingulsrudさん（WoodWing）</li><li>森 裕司さん</li><li>岩本 崇さん（アドビ システムズ）</li><li>宮本　弘さん（プロフィールド ／ProBridgeDesigner-i）
</li><li>黒須　信宏さん（クロスデザイン）</li><li>田代 真人さん</li></ol>400人強もの参加者と６時間のタイムテーブル、スピーカーそれぞれの講演内容もコンパクトに凝縮されたもので、ついていくのがやっと。<br /><br />その中で感じたとこ。（特に時系列ではないです）<br /><ul><li>異業種間の情報交換が重要。これは自分のスキルを拡張する口実になってよさそう。</li><li>電子書籍の変革によって、影響がどこにドカーンと降り掛かるかまだ読めない。ブームとか流行って済ますほど楽観はできない重みがある。</li><li>新たなメディア／デバイスにはそれに見合った、新しい表現が必要。そのためにはhtml, cssで何ができるかを（書けなくても）知っておくことが必要。</li><li>新しい表現にともない仕事量が増大するのを省力化効率化でいかに軽減するかは、小手先のチューンナップと全体のチューンナップの両方を意識する必要がありそう。</li><li>CMS重要ということを組織全体がわかっていないとそこがボトルネックになるだろう。</li><li>制作担当の意識をCMS的に徐々に変える方向性でトレーニングしていく必要がありそう。</li><li>過去の資産には貧乏くじが大量に含まれていそう。妥協点をきめて極力省力化するという覚悟が必要。（文字詰めが気に入らないとか行っている場合でないことがある）</li><li>InDesignからのePub書き出し、バージョンCS3から可能ではあるが、書き出しオプションなどの違いにより本来できることまでcssをチューンアップするとなると、より新しいバージョンで作業した方が良さそう。まだまだ、検証するべきパターンが色々ある。（YUJIさんのセッションが終わったと同時に一部の人が詰め寄るあたり、みんないろいろ試しているんだろうなと思いました。）</li><li>InDesignからのePub書き出しに固執する必要がないということも覚えておくべき。<a href="http://code.google.com/p/sigil/">Sigil</a>などのエディターで直接制作編集、xmlからの生成など手段はいろいろある。</li><li>どっちみち中間／汎用／交換フォーマットが重要。</li><li>新しいデバイスの設計思想を理解してみるのは必要かも。なんでiPadは132pp？とか<br /></li><li>しかし、大根の話はいろいろ拡張できて楽しい。</li><li>出版社は取り次ぎと制度によって延命されている、だれにくっついているのが得策か？</li><li>電子出版の金額のからくり、なるほどと思う反面、これ必要って思うこともあった、いずれにしてもガチガチなんだ。</li><li>広報のしかたも安価に効果的な方向へ向かっていくのかな？</li></ul>などなど<br /><br />自分のできること？<br />１から組むため最適化されたワークフローはパッケージ化されるだろうけど、一番重要になってくるのは、貧乏くじ、爆弾の処理。たぶん地味に大変でお金になりにくいけど、ノウハウ蓄積が大切なのでがんばろう。<br />と思った一日でした<br /><br />関係者の皆様、当日お会いした皆様おつかれさまでした。<br />]]>
        
    </content>
</entry>

<entry>
    <title>InDesign_エラー処理について考えてみる</title>
    <link rel="alternate" type="text/html" href="http://www.milligramme.cc/weblog/2010/06/indesign-103.html" />
    <id>tag:www.milligramme.cc,2010:/weblog//3.769</id>

    <published>2010-06-02T04:41:38Z</published>
    <updated>2010-06-02T04:42:35Z</updated>

    <summary>行くことはできないのですがDTP Booster 13(Omotesando /...</summary>
    <author>
        <name>mg</name>
        
    </author>
    
        <category term="InDesign" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="JavaScript" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="event" label="Event" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="indesign" label="InDesign" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="javascript" label="JavaScript" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="pdf" label="PDF" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.milligramme.cc/weblog/">
        <![CDATA[行くことはできないのですが<br />DTP Booster 13(Omotesando / 2010060２)に出演される、たけうちとおるさんからのお題が出題されていたので解いてみました。<br /><a href="http://www.adg7.com/takenote_b/2010/05/dtp-booster-13-1.html">DTP Booster 13のお題 - たけうちとおるのスクリプトノート</a><br /><br /><blockquote>「開いているドキュメントをすべてPDF書き出しする」スクリプトを作って下さい。<br /></blockquote><blockquote><ul><li>書き出されるPDFはドキュメントと同じファイル名で（拡張子が.pdfになる）同一階層に保存されるとします。</li><li>PDF書き出しプリセットは「PDFx/1-a」です。</li><li>PDFを書き出したドキュメントは保存せずに閉じます。</li><li>20行以内で出来ると思います。</li><li>多少のエラー処理はしなくて結構です。</li></ul></blockquote><br />

<pre class="brush: js; ">//エラー処理しない
var doc=app.documents;
var pdfPreset=app.pdfExportPresets.item("PDFx1-a");
for(var i=doc.length-1; i &gt;= 0; i--){
	var pdfPath=doc[i].fullName.toString().replace(/\.indd$/,".pdf");
	var pdfFile=new File(pdfPath);
	doc[i].exportFile (ExportFormat.PDF_TYPE, pdfFile, false, pdfPreset);
	doc[i].close (SaveOptions.NO);
	}
</pre>

エラー処理をまずいっさい考えずに、書いてみて<br />せっかくなので、省略したエラー処理について考えてみると、いろいろ妄想が広がる。<br /><br />一行目で開かれたドキュメントが存在しているかどうか？<br />二行目でＰＤＦ書き出しプリセットが存在しているか？<br />四行目でドキュメントが一度でも保存されているか（保存先のパスが有効か）？<br />五行目でＰＤＦ用のパスが有効か？<br />六行目ではtry〜catch(e){}したほうがいいのかな？書き出し失敗したときのアラート出すとか<br /><br />


<pre class="brush: js; ">//エラー処理する
//ドキュメントが開かれているか
if(app.documents.length!=0){
	var doc=app.documents;
	try{//プリセットがあるかどうか？
		var pdfPreset=app.pdfExportPresets.add({name:"PDFx1-a"});
		}
	catch(e){
		var pdfPreset=app.pdfExportPresets.item("PDFx1-a");
		}
	for(var i=doc.length-1; i &gt;= 0; i--){
		//一度も保存してないとき
		if(doc[i].saved==false){
			var docPath=File.saveDialog ("save the document");
			if(docPath){
				doc[i].save(new File(docPath));
				}
			}
		//拡張子なしで保存した場合も考慮
		var pdfPath=doc[i].fullName.toString().replace(/($|\.indd$)/,".pdf");
		var pdfFile=new File(pdfPath);
		doc[i].exportFile (ExportFormat.PDF_TYPE, pdfFile, false, pdfPreset);
		doc[i].close (SaveOptions.NO);
		}
	}
</pre>]]>
        
    </content>
</entry>

</feed>
