[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste

Ausrichten am Dokumentenraster per Skript

Martin Fischer
  
Beiträge gesamt: 12783

3. Okt 2019, 14:29
Bewertung:

gelesen: 6914

Beitrag als Lesezeichen
Hallo faxinger,

es hat mir keine Ruhe gelassen und ich hab noch etwas rumgebastelt.

Wenn Du Lust hast, kannst Du die folgende Version etwas intensiver testen und ggf. Denk-/Umsetzungsfehler zurückmelden.

Code
if (app.documents.length == 0)   
error_exit('Achtung!\nBitte öffnen Sie eine InDesign-Datei.');

var doc = app.documents.firstItem(),
i = 0,
h_grid = doc.gridPreferences.horizontalGridlineDivision/doc.gridPreferences.horizontalGridSubdivision, // Distanz horizontale Rasterlinien mit Unterteilung
v_grid = doc.gridPreferences.verticalGridlineDivision/doc.gridPreferences.verticalGridSubdivision, // Distanz vertikale Rasterlinien mit Unterteilung
pi = doc.layoutWindows.firstItem().activeSpread.pageItems,
gb = null, // Geometrie pageItem
ref = [], // Koordinaten Rasterlinien
v_diff = 0, // vertikale Verschiebung
h_diff = 0, // horizontale Verschiebung
pb = null, // Geometrie Seite
m_top = null, // Seitenrand oben
m_btm = null, // Seitenrand unten
sr_am_bd = null, // Seitenrand zum Bund
sr_weg_bd = null, // Seitenrand weg vom Bund
rl_am_bd = null, // Rasterlinie nach Seitenrand am Bund
rl_weg_bd = null, // Rasterlinie vor Seitenrand weg vom Bund
rl_btm = null; // Rasterlinie vor Seitenrand weg vom Bund

var restoreViewPrefs = setupViewPrefs(doc);

for (i = 0; i < pi.length; i++)
{
if (pi[i].parentPage == null || pi[i].appliedObjectStyle.name != 'Frame')
continue;

gb = pi[i].geometricBounds; // Geometrie pageItem
pb = pi[i].parentPage.bounds; // Geometrie Seite
m_top = pi[i].parentPage.marginPreferences.top; // oberer Seitenrand
m_btm = pb[2] - pi[i].parentPage.marginPreferences.bottom; // unterer Seitenrand

// vertikal
// =============
// Prüfung Orientierung oberer Seitenrand
if ( gb[0] < Math.round(m_top / v_grid) * v_grid ) // Oberkante PageItem über erster horizontaler Rasterlinie unterhalb des Seitenrands
ref[0] = m_top;
else if ( gb[2] > Math.round(m_btm / v_grid ) * v_grid ) // Unterkante PageItem unter letzer horizontaler Rasterlinie oberhalb des unteren Seitenrands
ref[0] = m_btm - (gb[2] - gb[0]);
else
ref[0] = Math.round(gb[0] / v_grid) * v_grid; // PageItem liegt zwischen der ersten Rasterlinie nach dem oberen und vor der letzten Rasterlinie vor dem unteren Seitenrand

v_diff = ref[0] - gb[0];

// horizontal
// =============
ref[1] = Math.round(gb[1] / h_grid) * h_grid;
h_diff = ref[1] - gb[1];


// zusätzliche Prüfung an äußeren und inneren Seitenrändern
// ---------------------------------------------------------

// Objekte auf Seiten links vom Bund
if (pi[i].parentPage.side == PageSideOptions.LEFT_HAND)
{
sr_am_bd = pb[3] - pi[i].parentPage.marginPreferences.right; // Seitenrand am Bund
sr_weg_bd = pb[1] + pi[i].parentPage.marginPreferences.left; // Seitenrand weg vom Bund
rl_am_bd = Math.round(sr_am_bd / h_grid - 1) * h_grid; // Rasterlinie nach Seitenrand am Bund
rl_weg_bd = Math.round(sr_weg_bd / h_grid ) * h_grid; // Rasterlinie vor Seitenrand weg vom Bund
if ( gb[3] > rl_am_bd ) // rechte Kante PageItem rechts von der letzten Rasterlinie vor dem rechten Seitenrand
h_diff = sr_am_bd - gb[3];
else if ( gb[1] < rl_weg_bd ) // linke Kante PageItem vor der ersten Rasterlinie nach dem linken Seitenrand
h_diff = sr_weg_bd - gb[1];
}

// Objekte auf Seiten rechts vom Bund
else
{
sr_am_bd = pb[1] + pi[i].parentPage.marginPreferences.left; // Seitenrand am Bund
sr_weg_bd = pb[3] - pi[i].parentPage.marginPreferences.right; // Seitenrand weg vom Bund
rl_am_bd = Math.round(sr_am_bd / h_grid + 1) * h_grid; // Rasterlinie nach Seitenrand am Bund
rl_weg_bd = Math.round(sr_weg_bd / h_grid ) * h_grid; // Rasterlinie vor Seitenrand weg vom Bund
if ( gb[1] < rl_am_bd ) // linke Kante PageItem vor der ersten Rasterlinie nach dem linken Seitenrand
h_diff = sr_am_bd - gb[1];
else if ( gb[3] > rl_weg_bd ) // rechte Kante PageItem rechts von der letzten Rasterlinie vor dem rechten Seitenrand
h_diff = sr_weg_bd - gb[3];
}

// Verschiebung
pi[i].move(undefined, [h_diff, v_diff]);
}
restoreViewPrefs();

//================================================================
// Funktionen
//================================================================

// ---------------------------------------------------------------
// Ausstieg mit Fehlermeldung
// ---------------------------------------------------------------
function error_exit(message)
{
if (arguments.length > 0)
alert(message);
exit();
}

// -----------------------------------------------------------------------------------
// Ansichtseinstellungen sichern und neu setzen
// -----------------------------------------------------------------------------------
function setupViewPrefs( doc )
{
with ( doc ) {
var vp = viewPreferences.properties;
var zp = zeroPoint;

var mm = MeasurementUnits.MILLIMETERS;
var pt = MeasurementUnits.POINTS;
viewPreferences.properties = {
horizontalMeasurementUnits: mm,
verticalMeasurementUnits : mm,
rulerOrigin : RulerOrigin.SPREAD_ORIGIN,
pointsPerInch : 72
};
zeroPoint = [0,0];
}

return function ()
{
with ( doc ) {
viewPreferences.properties = vp;
zeroPoint = zp;
}
}
}


Hoffentlich kommst Du mit den Kommentaren einigermaßen klar.

(Dieser Beitrag wurde von Martin Fischer am 3. Okt 2019, 19:17 geändert)
Änderungsverlauf:
Beitrag geändert von Martin Fischer (Moderator) am 3. Okt 2019, 14:37
Beitrag geändert von Martin Fischer (Moderator) am 3. Okt 2019, 14:42
Beitrag geändert von Martin Fischer (Moderator) am 3. Okt 2019, 19:17