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

Ivan @ 15 / 11 / 2020 @ Blog / 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!

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



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