①ダイアログを作成
まずはダイアログを表示してページサイズで作るか、見開きサイズで作るかを選択する。同時に裁ち落としサイズも入力する。
ダイアログについてはこちらで作りました。以前から気になっていて、使ってみたいと思っていました。
scriptui.joonas.me
github.com
なんとデスクトップ版もあるということなので早速ダウンロードして使ってみました。www.dropbox.com
こんな感じで作ったのですが、とにかく簡単で便利でした。
![](https://cdn-ak.f.st-hatena.com/images/fotolife/Y/YustinBieber/20241112/20241112162356.png)
コードはこんな感じになりました。
var dialog = new Window("dialog");
dialog.text = "グラフィックフレームを作成";
dialog.preferredSize.width = 187;
dialog.orientation = "column";
dialog.alignChildren = ["center","top"];
dialog.spacing = 10;
dialog.margins = 16;
var group1 = dialog.add("group", undefined, {name: "group1"});
group1.orientation = "row";
group1.alignChildren = ["left","center"];
group1.spacing = 10;
group1.margins = 0;
var radiobutton1 = group1.add("radiobutton", undefined, undefined, {name: "radiobutton1"});
radiobutton1.text = "ページサイズ";
radiobutton1.value = true;
var radiobutton2 = group1.add("radiobutton", undefined, undefined, {name: "radiobutton2"});
radiobutton2.text = "見開きサイズ";
var group2 = dialog.add("group", undefined, {name: "group2"});
group2.orientation = "row";
group2.alignChildren = ["left","center"];
group2.spacing = 10;
group2.margins = 0;
var statictext1 = group2.add("statictext", undefined, undefined, {name: "statictext1"});
statictext1.text = "裁ち落とし(mm): ";
var edittext1 = group2.add('edittext {properties: {name: "edittext1"}}');
edittext1.text = "0";
edittext1.preferredSize.width = 45;
var ok = dialog.add("button", undefined, undefined, {name: "ok"});
ok.text = "OK";
ok.preferredSize.width = 66;
②ページサイズで作る方法はわかったけど見開きサイズでつくるにはどうすればよい?
見開きサイズでつくるには右端の座標を2倍すればいいのではと思ってグラフィックフレームの右端の座標に*2としてみたものの、(左開きのドキュメントで)左ページで実行した場合は特に問題はなかったが、右ページで実行すると当然ながら図のような結果に。
![](https://cdn-ak.f.st-hatena.com/images/fotolife/Y/YustinBieber/20241112/20241112164044.png)
そりゃそうですよね…しかも幅が630mm…そりゃそうですよね…
いくら考えても分からなかったところでふと、最近はChatGPTを使ってスクリプトを書く方たちがいることを思い出す。
ChatGPTを使うことは今までゆるく・浅く(ときには深く)・コツコツと勉強してきた身としては、なんとなく自分に負ける気がして嫌だったのですが、みんな使い始めているのならいいのでは?と言ってくる自分もいて…
今更ですが、早速アカウントを作ってChatGPTに作ってもらいました。
(以下のコードは上記の続きです)
var dialogResult = dialog.show();
if (dialogResult !== 1) {
exit();
}
var result = Number(edittext1.text);
if (isNaN(result) || result < 0 || result > 100) {
alert("裁ち落とし幅は0?100mmの範囲で入力してください");
} else {
var myPage = app.activeWindow.activePage;
var num = result;
var useSpread = radiobutton2.value;
MakeFrame(myPage, num, useSpread);
}
function MakeFrame(myPage, num, useSpread) {
var matrix;
if (useSpread) {
var spread = myPage.parent;
var spreadBounds = getSpreadBounds(spread);
matrix = [
spreadBounds[0] - num,
spreadBounds[1] - num,
spreadBounds[2] + num,
spreadBounds[3] + num
];
} else {
matrix = [
myPage.bounds[0] - num,
myPage.bounds[1] - num,
myPage.bounds[2] + num,
myPage.bounds[3] + num
];
}
var rct = myPage.rectangles.add({
geometricBounds: matrix,
contentType: ContentType.graphicType
});
rct.select();
}
function getSpreadBounds(spread) {
var minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;
for (var i = 0; i < spread.pages.length; i++) {
var page = spread.pages[i];
var pageBounds = page.bounds;
minX = Math.min(minX, pageBounds[1]);
minY = Math.min(minY, pageBounds[0]);
maxX = Math.max(maxX, pageBounds[3]);
maxY = Math.max(maxY, pageBounds[2]);
}
return [minY, minX, maxY, maxX];
}
何度か修正指示を出したものの、作りたかったものが出来上がってビックリ。
特に自分では絶対に分からなかったのはここ↓
function getSpreadBounds(spread) {
var minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;
for (var i = 0; i < spread.pages.length; i++) {
var page = spread.pages[i];
var pageBounds = page.bounds;
minX = Math.min(minX, pageBounds[1]);
minY = Math.min(minY, pageBounds[0]);
maxX = Math.max(maxX, pageBounds[3]);
maxY = Math.max(maxY, pageBounds[2]);
}
return [minY, minX, maxY, maxX];
}
例えば仕上がりサイズA4の巻き三つ折りなんてドキュメントに見開きで作る場合はページを3つ並べるし、観音開きなら4ページにわたる見開きということも考えられますよね。さすがに自分ではここまで考えられませんでした。
![](https://cdn-ak.f.st-hatena.com/images/fotolife/Y/YustinBieber/20241112/20241112170428.png)
ChatGPTを使うことはなんとなく自分に負ける気がして嫌だったのですが、みんな使い始めているのならいいのでは?と言ってくる自分もいて…
ChatGPTを使うことはなんとなく自分に負ける気がして嫌だったのですが…
ChatGPTを使うことは…
今後わからないことは調べる時間を削ってすぐにChatGPTを使ってそうで嫌だなと思います。。。