Копировать и отразить направляющие в InDesign

Ivan @ 15 / 11 / 2020 @ InDesign / Вёрстка / Программирование / Скрипты
( / / )

Время чтения: ~ 21 мин.

Одна из очень нужных функций, которой нет в 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, вы можете записаться к нам на курс вёрстки для архитекторов.


Может быть интересно:


Подпишитесь на нас в социальных сетях!

Instagram
VK
Facebook
YouTube!
Telegram!

Подпишитесь на обновления



* нажимая на кнопку «Подписаться», вы даете согласие на обработку своих персональных данных