[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt Ausrichten am Dokumentenraster per Skript

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Print/Bildbearbeitung - Photos, Layout, Design
Themen
Beiträge
Moderatoren
Letzter Beitrag

Ausrichten am Dokumentenraster per Skript

faxinger
Beiträge gesamt: 241

14. Mär 2018, 14:51
Beitrag # 1 von 15
Bewertung:
(1477 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo,

ist es möglcih alle Objekte die ein Objektformat "Kasten" haben automatisch am Dokumentenraster auszurichten?

Beim Layoutieren kommt es leider immer wieder vor, dass diese Objekte nicht exakt ausgerichtet sind, meist ein paar 10el Millimeter neben oder unter/bzw. oberhalb des Rasters.

Gibt es villeicht schon so ein Skript?

Danke
LG
faxinger
X

Ausrichten am Dokumentenraster per Skript

faxinger
Beiträge gesamt: 241

1. Okt 2019, 15:12
Beitrag # 2 von 15
Beitrag ID: #572031
Bewertung:
(808 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo,

ich würde geren dieses Thema nocheinmal aufgreifen.

Wobei es mir dabei geht ist jetzt nicht ein fertiges Skript zu erhalten, sondern mal eine Art Leitfaden aufzustellen, wie man soetwas realisieren könnte.

Annahme:
Ein Dokument, mit einer Einzelseite/Doppelseite.
Mehrere Rahmen über die Doppelseite verteilt mit dem bereits zugeweisenem Objektformat "Frame".


Diese Rahmen wurden mehr oder weniger exakt auf dem Raster ausgerichtet.

Ziel: Die Rahmen sollen exakt am Raster ausgerichtet werden.

Hierbei gibt es mehrere Hürden zu überwinden, die ich gerne diskutieren würde.

Hürde 1: wie beginne ich? Sollen die geometricBounds des aktuellen Rahmens einzeln durchgegangen werden?

Hürde 2: ab wann (welchem Abstand zum Raster) wird der aktuelle Rahmen verschoben und wohin? -> gehe ich nur mit der Unterkante auf den Raster wenn es oben richtig ist oder verschiebe ich zuerst den gesamten Rahmen und passe dann nochmals an?
Dasselbe gilt für links/rechts

Ich bitte euch hierzu nur mal um ein paar Gedanken wie ihr das angehen würdet.

Danke
LG
faxinger


als Antwort auf: [#562818]

Ausrichten am Dokumentenraster per Skript

faxinger
Beiträge gesamt: 241

1. Okt 2019, 17:04
Beitrag # 3 von 15
Beitrag ID: #572035
Bewertung:
(789 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo,

Bilder sagen mehr als tausend Worte, daher sende ich euch mal eine idml mit der Ausgangssituation und eine mit dem Ziel wie es fertig aussehen soll.

LG
faxinger


als Antwort auf: [#572031]
Anhang:
Ausganssituation.idml (43.7 KB)   Ziel.idml (43.8 KB)

Ausrichten am Dokumentenraster per Skript

Martin Fischer
  
Beiträge gesamt: 12137

1. Okt 2019, 20:34
Beitrag # 4 von 15
Beitrag ID: #572038
Bewertung:
(760 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo faxinger,

nun habe ich versucht, gemäß Deiner Anweisung "Ziel: Die Rahmen sollen exakt am Raster ausgerichtet werden" einen Entwurf für ein Skript zu skizzieren und hatte zunächst nur mit Deiner Ausgangssituation.idml gearbeitet. Erst nach Fertigstellung der Skizze schaute ich mir Dein "Ziel.idml" an und stellte fest, dass die Aufgabenstellung eine andere ist, als ich sie verstanden hatte (Ausrichtung nicht am Raster, sondern an den nächstliegenden[?] Seitenrändern + Verteilung dazwischen).

Egal, hier meine Skizze für die Ausrichtung der linken oberen Ecken der Seitenobjekte des aktiven Druckbogens am Dokumentraster.

Die Dimensionen der Seitenobjekte bleiben erhalten. Die Objekte werden so verschoben, dass jeweils die linke obere Ecke an dem nächstliegenden Schnittpunkt im Raster liegt.

Code
var doc    = app.documents.firstItem(), 
i = 0,
h_grid = doc.gridPreferences.horizontalGridlineDivision,
v_grid = doc.gridPreferences.verticalGridlineDivision,
pi = doc.layoutWindows.firstItem().activeSpread.pageItems,
gb = null,
new_x = 0,
new_y = 0;

for (i = 0; i < pi.length; i++)
{
gb = pi[i].geometricBounds;
new_x = Math.round(gb[1] / h_grid) * h_grid;
new_y = Math.round(gb[0] / v_grid) * v_grid;
pi[i].move([new_x, new_y]);
}



Vielleicht dient Dir der Ansatz als ein Ausgangspunkt.

Für Deine Aufgabenstellung aus der Ziel.idml müsstest Du Dich statt am Dokumentraster an den Seitenrändern orientieren. Außerdem müsstest Du unterscheiden zwischen den Objekten, die den einzelnen Seitenrändern am nächsten liegen (also, die Objekte ganz oben, ganz rechts, ganz unten, ganz oben) und denjenigen, die zwischen diesen Objekten liegen. Letztere sollen nicht mehr an den Rändern, sollen relativ zur Position der äußeren Objekte justiert werden (horizontal und vertikal verteilen).

Viele Grüße
Martin




als Antwort auf: [#572035]
(Dieser Beitrag wurde von Martin Fischer am 1. Okt 2019, 20:52 geändert)

Ausrichten am Dokumentenraster per Skript

Martin Fischer
  
Beiträge gesamt: 12137

1. Okt 2019, 20:43
Beitrag # 5 von 15
Beitrag ID: #572039
Bewertung: |||
(757 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hier noch eine Variante, bei der auch die rechte untere Ecke an den nächstliegenden Rasterschnittpunkt verschoben wird.

Code
var doc    = app.documents.firstItem(), 
i = 0,
h_grid = doc.gridPreferences.horizontalGridlineDivision,
v_grid = doc.gridPreferences.verticalGridlineDivision,
pi = doc.layoutWindows.firstItem().activeSpread.pageItems,
gb = null,
new_x1 = 0,
new_y1 = 0,
new_x2 = 0,
new_y2 = 0;

for (i = 0; i < pi.length; i++)
{
gb = pi[i].geometricBounds;
new_x1 = Math.round(gb[1] / h_grid) * h_grid;
new_y1 = Math.round(gb[0] / v_grid) * v_grid;
new_x2 = Math.round(gb[3] / h_grid) * h_grid;
new_y2 = Math.round(gb[2] / v_grid) * v_grid;
pi[i].geometricBounds = [new_y1, new_x1, new_y2, new_x2];
}


Damit verändert sich in der Regel die Dimension (Höhe und Breite) der Objekte.

Viele Grüße
Martin




als Antwort auf: [#572038]
(Dieser Beitrag wurde von Martin Fischer am 1. Okt 2019, 20:54 geändert)

Ausrichten am Dokumentenraster per Skript

faxinger
Beiträge gesamt: 241

2. Okt 2019, 16:57
Beitrag # 6 von 15
Beitrag ID: #572049
Bewertung:
(680 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Martin,

vielen Dank für dein Skript, das ist ja schon viel vielmehr als ich erwartet hatte.

Ein paar Anmerkungen noch dazu:

Die Lösung mit den Schnittpunkten der Rasterlinien ist genial - darauf wäre ich never eever gekommen.

Das funktioniert perfekt!

Ich würde gerne noch das verwendete Objektformat berücksichtigen. D.h. Es sollen nicht alle pageItems ausgerichtet werden sondern nur die die das Objektformat "Frame" zugewiesen haben.

Das habe ich auch versucht in deinem Skript umzusetzen, kam aber dann irgendwie durcheinander.

Kannst du mir dazu nochmal helfen bitte.

Was dann noch in weiterer Zukunft als Ziel für mich ansteht:

Die Seitenränder (Satzspiegel) sollen nur oben, unten und im Bund als Ausrichtungskante dienen. Da habe ich noch gar keinen Plan.

Und wie du richtig erkannt hast, sollte der Abstand der einzelnen Kästen immer nur ein Rasterabstand sein. Da muss ich auch noch tüfteln.

Aber danke schon mal vorab für das großartige Skript!!!

LG
faxinger


als Antwort auf: [#572039]

Ausrichten am Dokumentenraster per Skript

Martin Fischer
  
Beiträge gesamt: 12137

2. Okt 2019, 17:30
Beitrag # 7 von 15
Beitrag ID: #572050
Bewertung: |||
(673 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo faxinger,

Antwort auf: Es sollen nicht alle pageItems ausgerichtet werden sondern nur die die das Objektformat "Frame" zugewiesen haben.


Füge unmittelbar nach dem Start der Schleife die entsprechende Bedingung ein:

Code
for (i = 0; i < pi.length; i++)  
{
if (pi[i].appliedObjectStyle.name == 'Frame')
{
// tu was
}
}


Vielleicht möchtest Du ergänzend zum Dokumentenraster auch noch die Unterbereiche berücksichtigen:

Code
var h_grid = doc.gridPreferences.horizontalGridlineDivision/doc.gridPreferences.horizontalGridSubdivision;  
var v_grid = doc.gridPreferences.verticalGridlineDivision/doc.gridPreferences.verticalGridSubdivision;


Antwort auf: Die Seitenränder (Satzspiegel) sollen nur oben, unten und im Bund als Ausrichtungskante dienen. Da habe ich noch gar keinen Plan.

Es wäre von Vorteil, wenn diese Ränder ebenfalls im Dokumentraster lägen.
Du kannst aber auch hingehen und prüfen, ob bei einem PageItem die obere Kante "in der Nähe" des Seitenrands liegt (also die Differenz des y1-Werts des PI und dem oberen Seitenrand innerhalb einer bestimmten Toleranz liegt). Dann nicht den y-Wert der nächstliegenden Rasterlinie verwenden, sondern den oberen Seitenrand.
Dasselbe dann für die x2- bzw. x1-Kante der PageItems in der Nähe des Bundstegs.

Etwas schwieriger wird vermutlich die Ausrichtung der inneren Objekte – wenn deren Dimensionen (Höhe und Breite) nicht ein Vielfaches des Rasters betragen. Das auszutüfteln mit all den zu berücksichtigenden und zu diskutierenden Unabwägbarkeiten würde meine Kapazitäten derzeit sprengen.

Viele Grüße
Martin




als Antwort auf: [#572049]

Ausrichten am Dokumentenraster per Skript

faxinger
Beiträge gesamt: 241

3. Okt 2019, 14:03
Beitrag # 8 von 15
Beitrag ID: #572061
Bewertung:
(622 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Martin,

danke für den Tipp mit der if Abfrage, hatte ich zwar auch schon ähnlich, jedoch nicht innerhalb der for-Schleife.

Deine Version funktioniert wunderbar. Danke.

Die Ausrichtung an den Seitenrändern werde ich vielleicht als 2. Step mal an das vorhandene Skript anfügen. Eventuell kann ich da das Standardskript "align to page" dahingehend verbiegen.


Danke nochmals für deine Bemühungen.

LG und schönen Feiertag.
faxinger


als Antwort auf: [#572050]

Ausrichten am Dokumentenraster per Skript

Martin Fischer
  
Beiträge gesamt: 12137

3. Okt 2019, 14:29
Beitrag # 9 von 15
Beitrag ID: #572062
Bewertung: |||
(614 mal gelesen)
URL zum Beitrag
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.

Viele Grüße
Martin




als Antwort auf: [#572061]
(Dieser Beitrag wurde von Martin Fischer am 3. Okt 2019, 19:17 geändert)

Ausrichten am Dokumentenraster per Skript

faxinger
Beiträge gesamt: 241

4. Okt 2019, 11:18
Beitrag # 10 von 15
Beitrag ID: #572076
Bewertung:
(561 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Martin,

vielen vielen Dank für das neue Skript. Du bist ein Wahnsinn. Damit hatte ich nicht gerechnet.

Wenn ich für die Antwort 10 Punkte vergeben könnte würde ich es tun :-)

Das ist spitze. DANKE DANKE

Ich bin gestern gerade noch bis zur Ausrichtung auf der linken Seite am Satzspiegel gekommen, aber das was du lieferst ist echt grandios.

Die Kommentare sind selbsterklärend, somit ist auch das ganze Skript für mich nachvollziehbar. DANKE auch dafür.

Ich hab das Skript schon mal kurz angetestet und leider fiel mir dabei ein kleiner Fehler auf:

Es werden scheinbar nicht alle Rahmen ausgerichtet.

Wenn du mein idml "Ausgangssituation" hernimmst siehst du es :-)
z.B auf der linken Seite liegen die Rahmen mit der rechten Kante nicht auf dem Raster.

Die untere Kante wird auch nur bei manchen Rahmen auf den Raster verschoben aber nicht bei allen, auch wenn sie noch weit vom
Rand/Steg unten entfernt sind.


Vielleicht liegt es am "move"? Im ursprünglichen Skript wurden ja ausschließlich die Dimensionen der Rahmen geändert und das war auch gut so.

Ich hoffe dass die Lösung für dieses Problem nicht allzuviel Aufwand erfordert, da du ja ohnehin schon so viel geleistet hast.

LG
faxinger


als Antwort auf: [#572062]

Ausrichten am Dokumentenraster per Skript

Martin Fischer
  
Beiträge gesamt: 12137

4. Okt 2019, 12:27
Beitrag # 11 von 15
Beitrag ID: #572077
Bewertung:
(554 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo faxinger,

hab Dank für Deine Lorbeeren.

Allerdings reduzieren Deine willkommenen Kritikpunkte unten die Pluspunkte oben. ;-)

Möglicherweise habe ich die Regeln nicht alle richtig verstanden oder umgesetzt.

Hier die Regeln, die ich versucht habe, umzusetzen:

1. die Dimensionen (Höhe x Breite) der Objekte bleiben unverändert; das bedeutet, dass ein Objekt hinterher z.B. links im Raster liegt, die rechte Kante jedoch nicht (analog oben im Raster, unten nicht);

2. der Bezugspunkt ist in der Regel (mit Ausnahmen s.u.) der Eckpunkt links oben;

3. der Eckpunkt links oben wird an den nächstliegenden Schnittpunkt der Rasterlinien verschoben;

4. Ausnahmen
a. der Eckpunkt links oben liegt oberhalb des oberen Seitenrands oder zwischen oberen Seitenrand und der nächsten horizontalen Rasterlinie; dann wird der Eckpunkt links oben an der Satzspiegeloberkante justiert;

b. der Eckpunkt links oben liegt links außerhalb des Satzspiegels oder zwischen linkem Seitenrand und der nächsten vertikalen Rasterlinie; dann wird der Eckpunkt links oben an der linken Satzspiegelkante justiert;

c. die Ausnahmen a. und b. gelten auch horizontal spiegelverkehrt für den rechten oberen Eckpunkt in der Nähe der rechten Satzspiegelkante;

d. unten sieht es ähnlich aus: liegt die Unterkante des Objekts unterhalb der unteren Satzspiegelkante oder der nächsten darüberliegenden Rasterlinie, wird die Unterkante auf die untere Satzspiegelkante justiert.
------
Allerdings gibt es noch ein paar Situationen, die noch nicht abgefangen werden:
- Objekt höher oder breiter als Satzspiegel
- Objektunterkante ragt nach der Justierung an der Rasterline oben an der nächstliegenden Rasterlinie (Orientierung an der Oberkante) über die untere Satzspiegelkante hinaus.

Gegen Abend könnte ich mich nochmal etwas vertiefen.
Mir wäre es eine Hilfe, wenn Du mir eine Version des Nachherzustands Deiner Ausgangsdatei (also nach Ausführung des Skripts) zukommen lassen würdest, wo die Objekte, die Deiner Meinung nach nicht richtig justiert wurden, hervorgehoben werden (Objektstil mit anderer Füllfarbe).
Eventuell mit Bezeichnern (Nummern), auf die Du Dich in Anmerkungen dazu beziehst.

Du kannst mir auch eine andere Ausgangsdatei (vorher) mit einer Nachher-Datei mit hervorgehobenen Reklamationen zukommen lassen.

Dann könnte ich prüfen, ob da tatsächlich Umsetzungsfehler vorliegen oder ob ich Dir die Umsetzung gemäß der Regeln, wie ich sie verstanden habe, erklären kann. ;-)

Viele Grüße
Martin




als Antwort auf: [#572076]
(Dieser Beitrag wurde von Martin Fischer am 4. Okt 2019, 12:28 geändert)

Ausrichten am Dokumentenraster per Skript

faxinger
Beiträge gesamt: 241

4. Okt 2019, 13:48
Beitrag # 12 von 15
Beitrag ID: #572079
Bewertung:
(548 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Martin,

vielen Dank für deine ausführliche Antwort.

Ich glaube wir haben da wirklich etwas aneinander vorbeigeredet:

Zu deinen Punkten:
Antwort auf: 1. die Dimensionen (Höhe x Breite) der Objekte bleiben unverändert; das bedeutet, dass ein Objekt hinterher z.B. links im Raster liegt, die rechte Kante jedoch nicht (analog oben im Raster, unten nicht);


Das wird nicht benötigt. Die Dimensionen dürfen sich ruhig ändern.
Es sollen alle Eckpunkte des aktuellen Rahmens[i] auf dem Raster liegen, bis auf die Ausnahmen. siehe weiter unten.


Antwort auf: 2. der Bezugspunkt ist in der Regel (mit Ausnahmen s.u.) der Eckpunkt links oben;


Das ist mir nicht klar. Es sollten alle Eckpunkte auf Rasterhaltigkeit geprüft werden.

Meine Vorgehensweise wäre das ganze in 2 Schrittenabzuhandeln:

1. Alle items am Raster ausrichten
2. Die Ausnahmen behandeln, sprich an den Satzspiegelkanten ausrichten. Das kann ja individuell ein anderer Eckpunkt sein, je nachdem wo der entsprechende Rahmen auf der Seite liegt.

D.h. Wenn wir mal alle Elemente durchgehen: von links oben, der erste Rahmen. Dann kann der linke Eckpunkt oben dieses Rahmens , oberhalb oder unterhalb des Steges oben (Satzspiegelkante) liegen und er kann links oder rechts vom Außensteg (Satzspiegelkante)liegen.

Nach Überprüfung sollte die Höhe und Breite so angepasst werden, dass die untere Rahmenkante bleibt wo sie ist und die rechte Rahmenkante bleibt wo sie ist. Diese beiden Kanten liegen ja schon durch die erste for-Schleife am Raster.

Im Prinzip geht es um eine Überprüfung ob ein Eckpunkt in der Nähe einer Satzspiegelkante liegt oder nicht. Den Begriff Nähe würde ich so definieren: Alles was kleiner als eine Rastereinheit ist.

Antwort auf: 3. der Eckpunkt links oben wird an den nächstliegenden Schnittpunkt der Rasterlinien verschoben;


Das passiert schon in der ersten for-Schleife.

Antwort auf: 4. Ausnahmen
a. der Eckpunkt links oben liegt oberhalb des oberen Seitenrands oder zwischen oberen Seitenrand und der nächsten horizontalen Rasterlinie; dann wird der Eckpunkt links oben an der Satzspiegeloberkante justiert;


Es kann auch sein, dass die obere Kante des Rahemns am Raster unterhalb der Satzspiegelkante liegt. Auch hier müsste die obere Kante des Rahmens an die Satzspiegelkante verschoben werden.

Vielleicht ganz einfach gesagt:
Liegt eine Kante des jeweiligen Rahmens in der Nähe des Satzspiegels, soll diese jeweilige Kante am Satzspiegel ausgerichtet werden. Alle anderen Kanten bleiben am Raster.

Übrigens: Rasterunterteilungen müssen nicht berücksichtigt werden.

Ich habe dir nun 2 neue Dateien mal angehängt.

In der Ausgangsdatei sind alle möglichen Vorkommnisse von Rahmenpositionen dargestellt.

In der Zieldatei wäre der Wunschzustand.
Mir ist klar dass es aber hier ohne Handarbeit nicht gehen wird.

Der Punkt: Abstand der Rahmen zueinander ist aber in erster Linie nicht so wichtig. Es wäre nicht schlimm wenn hier auch 2 oder 3 Rastereinheiten mal zwischendurch zwischen den Rahmen lägen, so wie es sich halt ergibt wenn dein erstes Skript suageführt wird.

Vielen vielen Dank schon mal im voraus.
Es hat absolut keine Eile.

LG
faxinger


als Antwort auf: [#572077]
(Dieser Beitrag wurde von Martin Fischer am 9. Okt 2019, 16:49 geändert)

Anhang:
ausgang_neu.idml (55.1 KB)   ziel_neu.idml (52.9 KB)

Ausrichten am Dokumentenraster per Skript

faxinger
Beiträge gesamt: 241

9. Okt 2019, 15:29
Beitrag # 13 von 15
Beitrag ID: #572139
Bewertung:
(261 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Nachtrag:

Hallo Martin,

toll wäre auch wenn nur die PageItems der aktiven Ebene in der Geommetrie verändert würden.

Die Frage ist ob ich das auch in der if Abfrage mit unterbringe oder ob man von vornherein nur diese pageitems aufnimmt.
So gehts es leider nicht:
Code
  
pi = doc.layoutWindows.firstItem().activeSpread.activelayer.everyItem().getElements(),


Da ich ja auch noch andere Elemente auf verschiedenen Ebenen habe, die teilweise auch gesperrt sind, bricht er mir die for-Schleife sonst ab.

LG
faxinger


als Antwort auf: [#572079]
(Dieser Beitrag wurde von faxinger am 9. Okt 2019, 15:30 geändert)

Ausrichten am Dokumentenraster per Skript

Martin Fischer
  
Beiträge gesamt: 12137

9. Okt 2019, 16:47
Beitrag # 14 von 15
Beitrag ID: #572141
Bewertung:
(249 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo faxinger,

der Ansatz, alle Kanten an den Rasterlinien auszurichten – unter Inkaufnahme einer Änderung von Höhe und Breite der Objekte, ist ein anderer als der, den ich bisher eingerichtet hatte.

Zwar hatte ich gestern noch etwas getüftelt und eine Lösung für die überwiegende Mehrzahl der Fälle entwickelt. Allerdings gibt es darüberhinaus Sonderfälle zu beachten:
Durch die Änderungen der Breiten und Höhen ist es möglich, dass der "Magnetismus" der Rasterlinien zu einer Breite und/oder Höhe der pageItems nmit kleinen Maßen (und groben Raster) von 0 (!) führt.
Diese Fälle müssen abgefangen und korrigiert werden. Es gibt da keine Standardlösung, sondern die Lösungen hängen von der Lage der PageItems ab:
1. mit 0 mm Höhe am Seitenrand oben,
2. mit 0 mm Höhe auf der ersten Rasterlinie nach dem Seitenrand oben
3. mit 0 mm Höhe auf der letzten Rasterlinie vor dem unteren Seitenrand
4. mit 0 mm Höhe auf dem unteren Seitenrand
5. die anderen Positionen dazwischen (Standardfälle).

Dasselbe gibt horizontal.
Und zwar einmal auf Seiten links vom Bund und dann auf Seiten rechts vom Bund.

Zwar reizt mich die Aufgabenstellung nach wie vor, aber die Zeit dafür ist mittlerweile nicht mehr vorhanden.
Es kann deshalb durchaus sein, dass hier für ne Weile von mir nichts mehr kommt.

Allerdings könnte ich Dir meinen bislang unfertigen Code zum Selberweitertüfteln per email zukommen lassen.

Viele Grüße
Martin




als Antwort auf: [#572139]
(Dieser Beitrag wurde von Martin Fischer am 9. Okt 2019, 16:51 geändert)

Ausrichten am Dokumentenraster per Skript

faxinger
Beiträge gesamt: 241

9. Okt 2019, 17:24
Beitrag # 15 von 15
Beitrag ID: #572143
Bewertung:
(242 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Martin,

vielen Dank schon mal fürs Tüfteln.

Zu den Sonderfällen:
Das kann ich nicht ganz nachvollziehen:

Meine Pageitems haben mindestens eine Höhe/Breite von mehr als 6 Rastereinheiten. Also kann sich meines Erachtens auch nie eine Höhe oder Breite von 0 ergeben.

Mein Ansatz war, zuerst alle Pageitems am Raster auszurichten und dann in weiteren for-Schleifen die einzelnen Saztpiegelkanten abzuklappern.
D.H. 4 weitere for-Schleifen pro Seite, bzw. insgesamt 8 for-Schleifen, da ich ja Doppelseiten habe.

Übrigens die Abfrage nach den pageItems auf der aktiven Ebene habe ich so umgesetzt:
Code
pi     = doc.layoutWindows.firstItem().activeLayer.pageItems, 

und die Steghöhe bzw. den Versatz von der Seitenkante so:

Code
var ph = doc.pages.firstItem().bounds[2]; 
var _stegunten = ph - doc.pages[0].marginPreferences.bottom;


Und das wäre die erste for Schleife nach der Rasterausrichtung:

Code
for (j = 0; j < pi.length; j++)  
if (pi[j].geometricBounds[3] > _stegunten && pi[j].appliedObjectStyle.name == "frame")

{
gb = pi[j].geometricBounds;
new_x1a = Math.round(gb[1] / h_grid) * h_grid;
new_y1a = Math.round(gb[0] / v_grid) * v_grid;
new_x2a = Math.round(gb[3] / h_grid) * h_grid;
new_y2a = _stegunten;
pi[j].geometricBounds = [new_y1a, new_x1a, new_y2a, new_x2a];
} ;


So würde ich mich dann durchhanteln.

LG
faxinger


als Antwort auf: [#572141]
X
Hier Klicken

Veranstaltungskalender

Hier können Sie Ihre Anlässe eintragen, welche einen Zusammenhang mit den Angeboten von HilfDirSelbst.ch wie z.B. Adobe InDesign, Photoshop, Illustrator, PDF, Pitstop, Affinity, Marketing, SEO, Büro- und Rechtsthemen etc. haben. Die Einträge werden moderiert freigeschaltet. Dies wird werktags üblicherweise innert 24 Stunden erfolgen.

pdf-icon Hier eine kleine Anleitung hinsichtlich Bedeutung der auszufüllenden Formularfelder.

Veranstaltungen
21.10.2019 - 22.10.2019

München
Montag, 21. Okt. 2019, 09.30 Uhr - Dienstag, 22. Okt. 2019, 17.30 Uhr

Schulung, Seminar

Wer hochwertige und farbechte Ergebnisse im Digitaldruck erzielen will, der braucht umfassende Colormanagemement- und PDF-Kenntnisse. Selbst wenn die Maschine kalibriert und das Rip richtig konfiguriert ist, lassen die Ergebnisse oft zu wünschen übrig. Der Grund hierfür liegt zu 90 % in den Daten und in falsch eingestellten Anwendungsprogrammen, auch in falschen Einstellungen im Druckmenü.

Nein

Organisator: Cleverprinting.de

https://www.cleverprinting.de/zweitaegige-weiterbildung-zum-digitaldruck-operator/

Zweitägige Weiterbildung zum Digitaldruck-Operator
Veranstaltungen
21.10.2019 - 23.10.2019

Riga, die Hauptstadt Lettlands
Montag, 21. Okt. 2019, 09.32 Uhr - Mittwoch, 23. Okt. 2019, 09.33 Uhr

VIP-Event

Jedes Jahr haben Sie die Möglichkeit, beim VIP-Event mehr über die Produkte von axaio software, callas software und andere Lösungen zu erfahren, die Four Pees anbietet.

Diejenigen, die uns bereits kennen, wissen, dass wir gerne Business mit Genuss kombinieren. Wir sind schon sehr gespannt und wollen Ihnen deshalb gern einen Blick hinter die Kulissen gewähren ...

Die Stadt der gotischen Türme
Das diesjährige Ziel ist Riga, die Hauptstadt Lettlands. Die gotischen Türme, die das Stadtbild Rigas dominieren, haben den Anschein von Strenge, aber das trifft nicht zu. Diese pulsierende, kosmopolitische Stadt ist die größte der drei baltischen Hauptstädte und beherbergt einige Szenebars und experimentelle Restaurants. Das klingt doch nach einem perfekten Rahmen für unser nächstes VIP-Event, oder?

Nein

Organisator: callas

https://www.callassoftware.com/de/events/2019/10/vip-event-riga

Sind Sie für das nächste VIP-Event bereit?
Hier Klicken