CropMarks修正版
居残り補習室の日記 [JS]CropMarksの改造 その2 において、InDesignCS3に標準添付されていたCropMarksを編集した際の問題点についてミシマバイカモさんからご指摘、ご指導をいただいた。
それらを踏まえ、修正版をアップしておく。
/* TomboCS3.js 2008.11.21 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:7*2.8346, editUnits:MeasurementUnits.millimeters}); var myCropMarkOffsetField = measurementEditboxes.add({editValue:3*2.8346, editUnits:MeasurementUnits.millimeters}); var myCropMarkWidthField = measurementEditboxes.add({editValue:0.1*2.8346, editUnits:MeasurementUnits.millimeters}); } } } 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:1*2.8346, editUnits:MeasurementUnits.millimeters}); var myRegMarkOuterRadiusField = measurementEditboxes.add({editValue:3*2.8346, editUnits:MeasurementUnits.millimeters}); var myRegMarkOffsetField = measurementEditboxes.add({editValue:3*2.8346, 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; var myOldWUnits = myDocument.viewPreferences.lineMeasurementUnits; //寸法単位をpointsに変換 myDocument.viewPreferences.horizontalMeasurementUnits = MeasurementUnits.points; myDocument.viewPreferences.verticalMeasurementUnits = MeasurementUnits.points; myDocument.viewPreferences.lineMeasurementUnits = 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; myDocument.viewPreferences.lineMeasurementUnits = myOldWUnits; } 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}) }