InDesign居残り補習室

どれだけ勉強しても上達しない管理人の、InDesign備忘録を中心に。たまにブックレビューなども。

スポンサーサイト  --/--/--

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


[JS]CropMarksを改造してみた  2008/11/06

変なバグが見つかったからバグではないがエントリ起こしてみました。
何かというと、InDesign CS3のサンプルスクリプトとして添付されている、
CropMarks.jsx”という、選択オブジェクトの周囲にトンボを描くスクリプトがあるのですが……。
WS000176.jpg
これを日本語化(←あまり意味ないけど)、
ミリ対応(ポイントが嫌いなのではありません。ミリが好きなんです)
ドブ用に線を追加(CropMarksは裁ちトンボしか描いてくれない)
のスクリプトへと書き換え、動作チェックをして気付いたんです。

JavaScript中で手っ取り早くミリをエディットボックスの初期値に使おうと思ったら、
editValueにミリをポイントに換算した数値をセットし、
editUnits:MeasurementUnits.millimeters
としておけばよいはずでした。

ところが、線の太さだけ、スクリプト中でセットした数値がそのままドキュメントの単位の数値としてInDesignに渡ってしまうのです。
追記の最後に書きましたが、これはスクリプトの記述が不足していたためでした。

具体的には、トンボなので線の太さを0.1mmにしようと思い、初期値を0.2835としました。
こいつを走らせると……
WS000177.jpg
ダイアログには確かにmmに換算後の数値である0.1が入力されています。
しかーし。
WS000178.jpg
太いやんけ。

そこで、スクリプト中で線の太さだけ、0.1と記述することにしました。
そのままだと、エディットボックスには0.035と表示されやがります。(実際に描画される線の太さは0.1mmとなることを確認しました/証拠の画像省略)
でも万が一0.12mmとか0.08mmにしたいとき、面倒じゃないですか。
もちろん、エディットボックス内で0.035*1.2とか0.035*0.8とか入力してやればいいんですけどね。

渋々、数値は0.1と記述、単位はpointsとしてやり、再度実験。
WS000179-1.jpg
当然、エディットボックスには0.1ptと表示されることになります。
それなのに、描画される線の太さは0.1mmです。
WS000180-1.jpg
バグですよ。多分CS2も同様。
CSの時はきちんと一致しましたから。
ま、こういう気持ち悪い部分が残っちゃうことを承知で、改造版CropMarksを追記に置いておきます。
追記に紹介したスクリプトは不完全版です。
線幅の単位がきちんと一致する修正版がこちらに置いてあります。








サンプルスクリプトCropMarks.jsxの改造版
  1. ダイアログの日本語化
  2. ミリ対応
  3. ドブ用に線を追加


//TomboCS3_win.js
//An InDesign CS3 JavaScript
//選択オブジェクト(単一または複数)のまわりにレジストレーションのトンボを発生
main();
function main(){
if (app.documents.length != 0){
if (app.selection.length > 0){
switch(app.selection[0].constructor.name){
case "Rectangle":
case "Oval":
case "Polygon":
case "GraphicLine":
case "Group":
case "TextFrame":
case "Button":
myDisplayDialog();
break;
default:
alert("ページアイテムを選んでから実行してください");
break;
}
}
else{
alert("オブジェクトを選んでから実行してください");
}
}
else{
alert("まずドキュメントを開き、オブジェクトを選んでから実行してください");
}
}
function myDisplayDialog(){
var myDialog = app.dialogs.add({name:"トンボ描画"});
with(myDialog){
with(dialogColumns.add()){
var myCropMarksGroup = enablingGroups.add({staticLabel:"裁ちトンボ", checkedState:true});
with (myCropMarksGroup){
with(borderPanels.add()){
staticTexts.add({staticLabel:"選択項目:"});
with (dialogColumns.add()){
staticTexts.add({staticLabel:"長さ:"});
staticTexts.add({staticLabel:"ドブ幅:"});
staticTexts.add({staticLabel:"線の太さ:"});
}
with (dialogColumns.add()){
var myCropMarkLengthField = measurementEditboxes.add({editValue:19.842, editUnits:MeasurementUnits.millimeters});
var myCropMarkOffsetField = measurementEditboxes.add({editValue:8.504, editUnits:MeasurementUnits.millimeters});
var myCropMarkWidthField = measurementEditboxes.add({editValue:0.1, editUnits:MeasurementUnits.points});
}
}
}
var myRegMarksGroup = enablingGroups.add({staticLabel:"センタートンボ", checkedState:true});
with (myRegMarksGroup){
with(borderPanels.add()){
staticTexts.add({staticLabel:"選択項目:"});
with (dialogColumns.add()){
staticTexts.add({staticLabel:"内円半径:"});
staticTexts.add({staticLabel:"十字半径:"});
staticTexts.add({staticLabel:"ドブ幅:"});
}
with (dialogColumns.add()){
var myRegMarkInnerRadiusField = measurementEditboxes.add({editValue:2.835, editUnits:MeasurementUnits.millimeters});
var myRegMarkOuterRadiusField = measurementEditboxes.add({editValue:8.504,editUnits:MeasurementUnits.millimeters});
var myRegMarkOffsetField = measurementEditboxes.add({editValue:8.504, editUnits:MeasurementUnits.millimeters});
}
}
}
with(borderPanels.add()){
staticTexts.add({staticLabel:"一つずつ? 全体?:"});
var myRangeButtons = radiobuttonGroups.add();
with(myRangeButtons){
radiobuttonControls.add({staticLabel:"一つずつ", checkedState:true});
radiobuttonControls.add({staticLabel:"全体"});
}
}
}
}
var myReturn = myDialog.show();
if (myReturn == true){
//ダイアログボックスに入力した数値を変数にセット
var myDoCropMarks = myCropMarksGroup.checkedState;
var myDoRegMarks = myRegMarksGroup.checkedState;
var myCropMarkLength = myCropMarkLengthField.editValue;
var myCropMarkOffset = myCropMarkOffsetField.editValue;
var myCropMarkWidth = myCropMarkWidthField.editValue;
var myRegMarkInnerRadius = myRegMarkInnerRadiusField.editValue;
var myRegMarkOuterRadius = myRegMarkOuterRadiusField.editValue;
var myRegMarkOffset = myRegMarkOffsetField.editValue;
var myRange = myRangeButtons.selectedButton;
myDialog.destroy();
//"||" は JavaScript における論理和
if ((myDoCropMarks != false) || (myDoRegMarks != false)){
myDrawPrintersMarks(myRange, myDoCropMarks, myDoRegMarks, myCropMarkLength, myCropMarkOffset, myCropMarkWidth, myRegMarkInnerRadius, myRegMarkOuterRadius, myRegMarkOffset);
}
else{
alert("どっちかオプション選ぼうよ (^^;");
}
}
else{
myDialog.destroy();
}
}
function myDrawPrintersMarks(myRange, myDoCropMarks, myDoRegMarks, myCropMarkLength, myCropMarkOffset, myCropMarkWidth, myRegMarkInnerRadius, myRegMarkOuterRadius, myRegMarkOffset){
var myBounds, myX1, myY1, myX2, myY2, myObject;
var myDocument = app.activeDocument;
var myOldRulerOrigin = myDocument.viewPreferences.rulerOrigin;
myDocument.viewPreferences.rulerOrigin = RulerOrigin.spreadOrigin;
//ドキュメントの寸法単位を記憶
var myOldXUnits = myDocument.viewPreferences.horizontalMeasurementUnits;
var myOldYUnits = myDocument.viewPreferences.verticalMeasurementUnits;
//寸法単位をpointsに変換
myDocument.viewPreferences.horizontalMeasurementUnits = MeasurementUnits.points;
myDocument.viewPreferences.verticalMeasurementUnits = MeasurementUnits.points;
//トンボを格納するレイヤーを作製(未作製の場合)
var myLayer = myDocument.layers.item("TOMBO");
try{
myLayerName = myLayer.name;
}
catch (myError){
var myLayer = myDocument.layers.add({name:"TOMBO"});
}
//トンボの色設定用にレジストレーションと「なし」スウォッチを参照
var myRegistrationColor = myDocument.colors.item("Registration");
var myNoneSwatch = myDocument.swatches.item("None");
//選択オブジェクトからトンボ作製領域を得るための変数をセット
myBounds = myDocument.selection[0].visibleBounds;
for(var myCounter = 0; myCounter < myDocument.selection.length; myCounter ++){
myObject = myDocument.selection[myCounter];
myBounds = myObject.visibleBounds;
//最初の選択領域を評価
if ((myRange != 0)&&(myCounter==0)){
myX1 = myBounds[1];
myY1 = myBounds[0];
myX2 = myBounds[3];
myY2 = myBounds[2];
}
if(myRange == 0){
if (myDoCropMarks == true){
myDrawCropMarks (myBounds[1], myBounds[0], myBounds[3], myBounds[2], myCropMarkLength, myCropMarkOffset, myCropMarkWidth, myRegistrationColor, myNoneSwatch, myLayer);
}
if (myDoRegMarks == true){
myDrawRegMarks (myBounds[1], myBounds[0], myBounds[3], myBounds[2], myRegMarkOffset, myRegMarkInnerRadius, myRegMarkOuterRadius, myCropMarkWidth,myRegistrationColor, myNoneSwatch, myLayer);
}
}
else{
//先に評価した選択領域との比較
//左上座標が最初のものより小さい場合、および
//右下座標が最初のものより大きい場合、
//一方または両方の座標を、新たな選択領域へ置換
if (myBounds[0] < myY1){
myY1 = myBounds[0];
}
if (myBounds[1] < myX1){
myX1 = myBounds[1];
}
if (myBounds[2] > myY2){
myY2 = myBounds[2];
}
if (myBounds[3] > myX2){
myX2 = myBounds[3];
}
}
}
if(myRange != 0){
if (myDoCropMarks == true){
myDrawCropMarks (myX1, myY1, myX2, myY2, myCropMarkLength, myCropMarkOffset, myCropMarkWidth,myRegistrationColor, myNoneSwatch, myLayer);
}
if (myDoRegMarks == true){
myDrawRegMarks (myX1, myY1, myX2, myY2, myRegMarkOffset, myRegMarkInnerRadius, myRegMarkOuterRadius, myCropMarkWidth, myRegistrationColor, myNoneSwatch, myLayer);
}
}
myDocument.viewPreferences.rulerOrigin = myOldRulerOrigin;
//記憶した寸法単位へ戻す
myDocument.viewPreferences.horizontalMeasurementUnits = myOldXUnits;
myDocument.viewPreferences.verticalMeasurementUnits = myOldYUnits;
}
function myDrawCropMarks (myX1, myY1, myX2, myY2, myCropMarkLength, myCropMarkOffset, myCropMarkWidth, myRegistrationColor, myNoneSwatch, myLayer){

//左上トンボ
myDrawLine([myY1, myX1-myCropMarkOffset, myY1, myX1-(myCropMarkOffset + myCropMarkLength)], myCropMarkWidth, myRegistrationColor, myNoneSwatch, myLayer);
myDrawLine([myY1-myCropMarkOffset, myX1, myY1-myCropMarkOffset, myX1-(myCropMarkOffset + myCropMarkLength)], myCropMarkWidth, myRegistrationColor, myNoneSwatch, myLayer);
myDrawLine([myY1-myCropMarkOffset, myX1, myY1-(myCropMarkOffset+myCropMarkLength), myX1], myCropMarkWidth, myRegistrationColor, myNoneSwatch, myLayer);
myDrawLine([myY1, myX1-myCropMarkOffset, myY1-(myCropMarkOffset+myCropMarkLength), myX1-myCropMarkOffset], myCropMarkWidth, myRegistrationColor, myNoneSwatch, myLayer);

//左下トンボ
myDrawLine([myY2, myX1-myCropMarkOffset, myY2, myX1-(myCropMarkOffset+myCropMarkLength)], myCropMarkWidth, myRegistrationColor, myNoneSwatch, myLayer);
myDrawLine([myY2+myCropMarkOffset, myX1, myY2+myCropMarkOffset, myX1-(myCropMarkOffset+myCropMarkLength)], myCropMarkWidth, myRegistrationColor, myNoneSwatch, myLayer);
myDrawLine([myY2+myCropMarkOffset, myX1, myY2+myCropMarkOffset+myCropMarkLength, myX1], myCropMarkWidth, myRegistrationColor, myNoneSwatch, myLayer);
myDrawLine([myY2, myX1-myCropMarkOffset, myY2+myCropMarkOffset+myCropMarkLength, myX1-myCropMarkOffset], myCropMarkWidth, myRegistrationColor, myNoneSwatch, myLayer);

//右上トンボ
myDrawLine([myY1, myX2+myCropMarkOffset, myY1, myX2+myCropMarkOffset+myCropMarkLength], myCropMarkWidth, myRegistrationColor, myNoneSwatch, myLayer);
myDrawLine([myY1-myCropMarkOffset, myX2, myY1-myCropMarkOffset, myX2+myCropMarkOffset+myCropMarkLength], myCropMarkWidth, myRegistrationColor, myNoneSwatch, myLayer);
myDrawLine([myY1-myCropMarkOffset, myX2, myY1-(myCropMarkOffset+myCropMarkLength), myX2], myCropMarkWidth, myRegistrationColor, myNoneSwatch, myLayer);
myDrawLine([myY1, myX2+myCropMarkOffset, myY1-(myCropMarkOffset+myCropMarkLength), myX2+myCropMarkOffset], myCropMarkWidth, myRegistrationColor, myNoneSwatch, myLayer);

//右下トンボ
myDrawLine([myY2, myX2+myCropMarkOffset, myY2, myX2+myCropMarkOffset+myCropMarkLength], myCropMarkWidth, myRegistrationColor, myNoneSwatch, myLayer);
myDrawLine([myY2+myCropMarkOffset, myX2, myY2+myCropMarkOffset, myX2+myCropMarkOffset+myCropMarkLength], myCropMarkWidth, myRegistrationColor, myNoneSwatch, myLayer);
myDrawLine([myY2+myCropMarkOffset, myX2, myY2+myCropMarkOffset+myCropMarkLength, myX2], myCropMarkWidth, myRegistrationColor, myNoneSwatch, myLayer);
myDrawLine([myY2, myX2+myCropMarkOffset, myY2+myCropMarkOffset+myCropMarkLength, myX2+myCropMarkOffset], myCropMarkWidth, myRegistrationColor, myNoneSwatch, myLayer);
}

function myDrawRegMarks (myX1, myY1, myX2, myY2, myRegMarkOffset, myRegMarkInnerRadius, myRegMarkOuterRadius, myCropMarkWidth, myRegistrationColor, myNoneSwatch, myLayer){
var myBounds
var myXCenter = myX1 + ((myX2 - myX1)/2);
var myYCenter = myY1 + ((myY2 - myY1)/2);
var myTargetCenter = myRegMarkOffset+(myRegMarkOuterRadius);

//上部センタートンボ
myBounds = [myY1-(myTargetCenter+myRegMarkInnerRadius), myXCenter-myRegMarkInnerRadius, (myY1-myTargetCenter)+myRegMarkInnerRadius, myXCenter + myRegMarkInnerRadius];
myDrawTarget(myBounds, myCropMarkWidth, myRegistrationColor, myNoneSwatch, myLayer);
myBounds = [myY1-(myTargetCenter+myRegMarkOuterRadius), myXCenter, (myY1-myTargetCenter)+myRegMarkOuterRadius, myXCenter]
myDrawLine(myBounds, myCropMarkWidth, myRegistrationColor, myNoneSwatch, myLayer);
myBounds = [myY1-myTargetCenter, myXCenter-myRegMarkOuterRadius, myY1-myTargetCenter, myXCenter+myRegMarkOuterRadius]
myDrawLine(myBounds, myCropMarkWidth, myRegistrationColor, myNoneSwatch, myLayer);

//左部センタートンボ
myBounds = [myYCenter-myRegMarkInnerRadius, myX1-(myTargetCenter+myRegMarkInnerRadius), myYCenter+myRegMarkInnerRadius, (myX1 - myTargetCenter) + myRegMarkInnerRadius];
myDrawTarget(myBounds, myCropMarkWidth, myRegistrationColor, myNoneSwatch, myLayer);
myBounds = [myYCenter, myX1-(myTargetCenter+myRegMarkOuterRadius), myYCenter, myX1 -myRegMarkOffset]
myDrawLine(myBounds, myCropMarkWidth, myRegistrationColor, myNoneSwatch, myLayer);
myBounds = [myYCenter-myRegMarkOuterRadius, myX1-myTargetCenter, myYCenter+myRegMarkOuterRadius, myX1-myTargetCenter]
myDrawLine(myBounds, myCropMarkWidth, myRegistrationColor, myNoneSwatch, myLayer);

//下部センタートンボ
myBounds = [myY2+(myTargetCenter-myRegMarkInnerRadius), myXCenter-myRegMarkInnerRadius, myY2+ myTargetCenter+myRegMarkInnerRadius, myXCenter + myRegMarkInnerRadius];
myDrawTarget(myBounds, myCropMarkWidth, myRegistrationColor, myNoneSwatch, myLayer);
myBounds = [myY2+myRegMarkOffset, myXCenter, myY2+myTargetCenter+myRegMarkOuterRadius, myXCenter]
myDrawLine(myBounds, myCropMarkWidth, myRegistrationColor, myNoneSwatch, myLayer);
myBounds = [myY2+myTargetCenter, myXCenter-myRegMarkOuterRadius, myY2 + myTargetCenter, myXCenter+myRegMarkOuterRadius]
myDrawLine(myBounds, myCropMarkWidth, myRegistrationColor, myNoneSwatch, myLayer);

//右部センタートンボ
myBounds = [myYCenter-myRegMarkInnerRadius, myX2+(myTargetCenter-myRegMarkInnerRadius), myYCenter+myRegMarkInnerRadius, myX2 + myTargetCenter + myRegMarkInnerRadius];
myDrawTarget(myBounds, myCropMarkWidth, myRegistrationColor, myNoneSwatch, myLayer);
myBounds = [myYCenter, myX2+myRegMarkOffset, myYCenter, myX2+myTargetCenter+myRegMarkOuterRadius]
myDrawLine(myBounds, myCropMarkWidth, myRegistrationColor, myNoneSwatch, myLayer);
myBounds = [myYCenter-myRegMarkOuterRadius, myX2+myTargetCenter, myYCenter+myRegMarkOuterRadius, myX2+myTargetCenter]
myDrawLine(myBounds, myCropMarkWidth, myRegistrationColor, myNoneSwatch, myLayer);

}
function myDrawLine(myBounds, myStrokeWeight, myRegistrationColor, myNoneSwatch, myLayer){
app.activeWindow.activeSpread.graphicLines.add(myLayer, undefined, undefined,{strokeWeight:myStrokeWeight, fillColor:myNoneSwatch, strokeColor:myRegistrationColor, geometricBounds:myBounds})
}
function myDrawTarget(myBounds, myStrokeWeight, myRegistrationColor, myNoneSwatch, myLayer){
app.activeWindow.activeSpread.ovals.add(myLayer, undefined, undefined, {strokeWeight:myStrokeWeight, fillColor:myNoneSwatch, strokeColor:myRegistrationColor, geometricBounds:myBounds})
}



2008/11/25追記
線の太さの単位が変なのは、線の太さをポイントに変換する記述が抜けているため。
および書き直した内容を別ブログで紹介した。なお、editValue には 0.1*2.8346 という計算式を入れた。
スポンサーサイト

いきさん、おつかれさまでしたー。
私もミリ派です。
これ、例の「トンボの塗り足し」の件ですよね。
読んでて「何ていじわるなクライアントなんだろう?」と思っていました。
まあ、いきさんのご尽力により解決したからよかったものの、大変な作業になってしまったら、そんなところに労力を使うべきなんだろうか?てなりますよね。

るるさん、早速ありがとうございます^^
そうです、勉強部屋でレスした件です。
あのクライアントさん、いじわるというより細かすぎですよ(笑)
ドブのトンボの周囲がコンマ数ミリ程度白いからっていっても、塗り足しとしては充分なんですから。
それより、真っ黒な塗り足しの場合、白が出ないとトンボが見えない。そっちの方が問題だと思うんですけどね(謎)

>それより、真っ黒な塗り足しの場合、白が出ないとトンボが見えない。
>そっちの方が問題だと思うんですけどね(謎)
確かに!!(笑)気づかなかった。
あれ?他のアプリってどうなってたっけ?
インストールしたまま全く出番のないQX8.01でやってみました。
・・・あ、トンボ見えない(苦笑)。
なつかしのPageMaker(でもここ数日大活躍)ではどうでしょう。
・・・IDと同じです。
好みというか、慣れというか。印刷の現場ではどっちが好ましいんでしょうかね。

印刷の現場……というかウチとしては、規格サイズならトンボなくっても構わないんです。
変型サイズだと、トンボ見えないと困ると思いますよ(苦笑)
まあ、四隅のうち三箇所まで見えていれば問題ないのかも知れませんが。

連投すみません。
一部訂正します。
QXのトンボは、もともと塗り足しにかかっていませんでした。
塗り足しにかかる部分に線がありませんでした。

ああ、ちと遅かった。

うちの社の場合ですが、PDF入稿の場合、通常はトンボなし、実寸+塗り足し(あれば)天地左右3mmのサイズで作ってます。
ただ、未だにID直が駄目です・・・・(涙)

> 塗り足しにかかる部分に線がありませんでした。
ああ、なるほど!

> ただ、未だにID直が駄目です・・・・(涙)
うぅむ。まぁ、Distiller経由というのも慣れてしまえばルーチンワークですから……(^^;

コメントの投稿





管理者にだけ表示を許可する

トラックバック

http://kstation2.blog10.fc2.com/tb.php/313-52dd188a

(新しい記事)← タグ付きテキストと文字コード
[JavaScript]TableReplaceもどきコピペ版 →(古い記事)

 | HOME | 

カレンダー

09 | 2017/10 | 11
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -

FC2カウンター

2006年3月28日カウント開始

Amazon

FC2 Affiliate

動くPDF

プロフィール

あわせて読みたい

あわせて読みたいブログパーツ

最近の記事

最近のコメント

最近のトラックバック

Lc.ツリーリンク

RSSリンク

直感カテゴリーツリーV1.1

ブログ内検索

ブロとも一覧

marumi

神楽崎 ゆう


■ ブログ名:I'm writing NOVEL

七篠 銀字


■ ブログ名:風と夜空と氷の国

MS


■ ブログ名:へなちょこDTP

桜桃


■ ブログ名:追憶の桜吹雪

瑪瑙 輝遊


■ ブログ名:千里の道も一歩から

magatu


■ ブログ名:unsigned

暁 鷲 (あかつき しゅう)


■ ブログ名:空を裂け!

NewMark

C-Roll


FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。