blog/
Копировать и отразить направляющие в InDesign
Одна из очень нужных функций, которой нет в InDesign — копировать направляющие зеркально на другую станицу. Ради этого я начал писать свой скрипт, но бросил на середине, найдя готовое бесплатное решение.
Скрипт для копирования направляющих написал Ганс Хеслер (Hans Haesler), но он на немецком (архив его скриптов лежит вот тут). Пришлось этот скрипт перевести на английский.
Код с переводом на англ. оставлю тут, чтобы не потерять этот очень полезный скрипт. Danke, Herr Haesler!
HilfslinienKopieren_505d.js in English:
// HilfslinienKopieren_505d.js // © 23.05.10 / Hans Haesler, Châtelard 52, CH-1018 Lausanne // DESCRIPTION: Copy selected guide lines to the selected page // Activate the display of dialogs as a preventive measure app.scriptPreferences.userInteractionLevel = UserInteractionLevels.interactWithAll; if (app.documents.length == 0) { alert ("There is no open document.", "Caution"); exit(); } // die Auswahl testen selItems = app.selection; nItems = selItems.length; if (nItems == 0) { alert ("Nothing is selected.", "Nothing is selected."); exit(); } var curDoc = app.documents[0]; // den Nullpunkt auf Null/Null setzen var zP = curDoc.zeroPoint; if (zP != [0,0]) { curDoc.zeroPoint = [0,0]; } // den Ursprung der Linealeinheiten auf "Seite" setzen var rO = curDoc.viewPreferences.rulerOrigin; if (rO != 1380143215) { curDoc.viewPreferences.rulerOrigin = RulerOrigin.pageOrigin; } // die gespeicherten Werte ausziehen var guideStr = ""; try { guideStr = curDoc.extractLabel("guideProps"); } catch (e) { } // verschiedene Eigenschaften speichern var allLayers = curDoc.layers; var allLNames = allLayers.everyItem().name; var nLayers = allLayers.length; var layerLocks = new Array (); if (nLayers > 1) { var curLayer = app.activeWindow.activeLayer.index; dlogLayers = ["Dieselbe(n)"].concat(allLNames); } // die Sperrung der Ebenen speichern und aufheben (falls notwendig) var layerLocks = new Array (); for (var i=0; i<nLayers; i++) { if (allLayers[i].locked == true) { allLayers[i].locked = false; layerLocks.push(true); } else { layerLocks.push(false); } } var curSpr = app.activeWindow.activeSpread; var docOff = (curSpr.pages[0].documentOffset)+1; var nPages = curSpr.pages.length; var pW = curDoc.documentPreferences.pageWidth; var curPage = app.activeWindow.activePage; var curName = curPage.name; var curParent = curPage.parent; var isMaster = false; if (curParent == "[object MasterSpread]") { isMaster = true; } var masNameList = new Array (); var masPageList = new Array (); masSpreads = curDoc.masterSpreads; var nSpreads = masSpreads.length; for (var s=0; s<nSpreads; s++) { masNameList.push(masSpreads[s].pages[0].name); nPag = masSpreads[s].pages.length; for (var p=0; p<nPag; p++) { curPage = masSpreads[s].pages[p].name + "" + (p+1); masPageList.push(curPage); } } // den Dialog vorbereiten var docList = curDoc.pages.everyItem().name; var pageList = masPageList.concat(docList); var propPage = -1; var targetPage; if (isMaster) { if (nPages > 1) { targetPage = (curSpr.pages.item(-1).name) + 2; } else { try { targetPage = curDoc.pages[docOff].name; } catch (e) { var targetPage = curDoc.pages[0].name; } } for (var i=0; i<masPageList.length; i++) { if (masPageList[i] == targetPage) { propPage = i; break; } if (propPage == -1) { propPage = 0; } } } else { if (nPages > 1) { var targetPage = curSpr.pages.item(-1).name; } else { try { var targetPage = curDoc.pages[docOff].name; } catch (e) { var targetPage = curDoc.pages[0].name; } } for (var i=0; i<pageList.length; i++) { if (pageList[i] == targetPage) { propPage = i; break; } if (propPage == -1) { propPage = 0; } } } var propLayer, rMir, rNor; if (guideStr != "") { var guideList = guideStr.split("#"); try { tmpLayer = guideList[0]*1; propLayer = tmpLayer; } catch (e) { propLayer = 0; } if (guideList[1] == "true") { rMir = 1; rNor = 0; } else { rMir = 0; rNor = 1; } } else { propLayer = 0; rMir = 1; rNor = 0; } // Dialoge löschen, welche offengeblieben sind try { app.dialogs.everyItem().destroy(); } catch (e) { } var aDialog = app.dialogs.add({name:"Copy guides"}); with (aDialog) { with (dialogColumns.add()) { if (nLayers == 1) { with (borderPanels.add()) { with (dialogColumns.add()) { with (dialogRows.add()) { staticTexts.add({staticLabel:"Landing page:"}); staticTexts.add({staticLabel:" "}); } var pageNames = dropdowns.add({stringList:pageList, selectedIndex:propPage}); } } } else { with (borderPanels.add()) { with (dialogColumns.add()) { with (dialogRows.add()) { staticTexts.add({staticLabel:"Landing page:"}); staticTexts.add({staticLabel:" "}); } var pageNames = dropdowns.add({stringList:pageList, selectedIndex:propPage, minWidth:150}); } } with (borderPanels.add()) { with (dialogColumns.add()) { with (dialogRows.add()) { staticTexts.add({staticLabel:"Landing page(n):"}); staticTexts.add({staticLabel:" "}); } var layerNames = dropdowns.add({stringList:dlogLayers, selectedIndex:propLayer, minWidth:150}); } } } with (dialogRows.add()) { staticTexts.add({staticLabel:" ", minWidth:8}); var mirButtons = radiobuttonGroups.add(); with (mirButtons) { radiobuttonControls.add({staticLabel:"mirrored", checkedState:rMir}); radiobuttonControls.add({staticLabel:"normal", checkedState:rNor}); } } } with (dialogColumns.add()) { staticTexts.add({staticLabel:" ", minWidth:4}); } } // den Dialog anzeigen und auswerten var dResult = aDialog.show(); var targetMaster = false; if (dResult == true) { var selPage = pageNames.selectedIndex; if (selPage <= masPageList.length) { masNamePg = pageList[selPage]; targetMaster = true; } else { selPage = selPage - masPageList.length; } var targetLayer; if (nLayers > 1) { storeLayer = (layerNames.selectedIndex); targetLayer = storeLayer-1; } else { storeLayer = 0; } var mirLabel = mirButtons.selectedButton; var mirBtn = mirLabel; if (mirBtn == 0) { mirror = true; } else if (mirBtn == 1) { mirror = false; } } else { aDialog.destroy(); resetAsBefore() exit(); } aDialog.destroy(); // das Ergebnis speichern guideStr = storeLayer + "#" + mirror; curDoc.insertLabel("guideProps", guideStr); // wenn Master als Ziel, den Namen und die Ziffer speichern if (targetMaster) { var masName = masNamePg.slice(0,-1); var masPage = (masNamePg.slice(-1)*1)-1; var masInd = 0; var nMas = masNameList.length; for (var m=0; m<nMas; m++) { if (masName == masNameList[m]) { masInd = m; break; } } } // Variablen deklarieren var curCol; var curItem; var curPos; var curProps; var curThr; var ftPage; var lock; var newGuide; var okay; var orient; var tgtLock = false; if (nLayers > 1) { app.activeWindow.activeLayer = curDoc.layers[targetLayer]; if (curDoc.layers[targetLayer].locked == true) { tgtLock = true; curDoc.layers[targetLayer].locked = false; } } var sameSpread = false; try { if (curSpr == curDoc.pages[selPage].parent) { sameSpread = true; } else { sameSpread = false; } } catch (e) { } // eine Wiederholungsschleife durch die Auswahl for (var i=0; i<nItems; i++) { okay = true; curItem = selItems[i]; // den Typen des aktuellen Objekts prüfen if (curItem.constructor.name == "Guide") { // die Attribute speichern curProps = curItem.properties; curCol = curProps.guideColor; curLay = curProps.itemLayer; curPos = curProps.location; curThr = curProps.viewThreshold; ftPage = curProps.fitToPage; lock = curProps.locked; orient = curProps.orientation; // prüfen ob horizontale Druckbogenhilfslinie if (orient == 1752134266 && ftPage == false) { // falls die Zielseite im gleichen Druckbogen ist, wird der flag 'okay' auf 'false' gesetzt if (sameSpread) { okay = false; } } if (okay) { lock = curProps.locked; if (targetMaster) { try { // wenn waagrecht if (orient == 1752134266) { // die neue Hilfslinie erzeugen if (targetLayer == -1) { newGuide = curDoc.masterSpreads[masInd].pages.item(masPage).guides.add(undefined, {itemLayer:curLay, orientation:HorizontalOrVertical.horizontal, location:curPos}); } else { newGuide = curDoc.masterSpreads[masInd].pages.item(masPage).guides.add(undefined, {orientation:HorizontalOrVertical.horizontal, location:curPos}); } } // sonst vertikal else { if (mirror) { // wenn gespiegelt, die Position ausrechnen curPos = pW-curPos; } // die neue Hilfslinie erzeugen if (targetLayer == -1) { newGuide = curDoc.masterSpreads[masInd].pages.item(masPage).guides.add(undefined, {itemLayer:curLay, orientation:HorizontalOrVertical.vertical, location:curPos}); } else { newGuide = curDoc.masterSpreads[masInd].pages.item(masPage).guides.add(undefined, {orientation:HorizontalOrVertical.vertical, location:curPos}); } } // weitere Attribute zuweisen: Druckbogen oder Seite, Farbe, Anzeigeschwellenwert, Sperrung newGuide.properties = {fitToPage:ftPage, guideColor:curCol, viewThreshold:curThr, locked:lock}; } catch (e) { } } else { try { // wenn waagrecht if (orient == 1752134266) { // die neue Hilfslinie erzeugen if (targetLayer == -1) { newGuide = curDoc.pages[selPage].guides.add(undefined, {itemLayer:curLay, orientation:HorizontalOrVertical.horizontal, location:curPos}); } else { newGuide = curDoc.pages[selPage].guides.add(undefined, {orientation:HorizontalOrVertical.horizontal, location:curPos}); } } // sonst vertikal else { if (mirror) { // wenn gespiegelt, die Position ausrechnen curPos = pW-curPos; } // die neue Hilfslinie erzeugen if (targetLayer == -1) { newGuide = curDoc.pages[selPage].guides.add(undefined, {itemLayer:curLay, orientation:HorizontalOrVertical.vertical, location:curPos}); } else { newGuide = curDoc.pages[selPage].guides.add(undefined, {orientation:HorizontalOrVertical.vertical, location:curPos}); } } // weitere Attribute zuweisen: Druckbogen oder Seite, Farbe, Anzeigeschwellenwert, Sperrung newGuide.properties = {fitToPage:ftPage, guideColor:curCol, viewThreshold:curThr, locked:lock}; } catch (e) { } } } } } resetAsBefore(); // die Änderungen zurücksetzen function resetAsBefore() { // den Ursprung der Linealeinheiten zurücksetzen if (rO != 1380143215) { try { curDoc.viewPreferences.rulerOrigin = rO; } catch (e) { } } // den Nullpunkt zurücksetzen (falls notwendig) if (zP != [0,0]) { curDoc.zeroPoint = zP; } // die Sperrung der Ebenen wiederherstellen (falls notwendig) for (var i=0; i<(nLayers); i++) { allLayers[i].locked = layerLocks[i]; } // wenn mehr als eine Ebene vorhanden ist if (nLayers > 1) { // die ursprünglich ausgewählte Ebene wieder auswählen app.activeWindow.activeLayer = curDoc.layers[curLayer]; } }
Как обычно, надо сохранить код в файл HilfslinienKopieren_505d.js из любого текстового редактора (например, блокнот).
А если вы хотите научиться круто работать в InDesign, вы можете записаться к нам на курс вёрстки для архитекторов.
Может быть интересно:
- Скрипт для выбора победителя в инстаграме (из лайков)
- Урок — Буквы от больших к маленьким в InDesign
- Поменять картинки местами в InDesign
- Скрипт для выбора победителя в инстаграме (из комментариев)
- Calculate inclination of a roof valley with Python