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.
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.
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.
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
(Dieser Beitrag wurde von Martin Fischer am 1. Okt 2019, 20:52 geändert)
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!!!
Füge unmittelbar nach dem Start der Schleife die entsprechende Bedingung ein:
Vielleicht möchtest Du ergänzend zum Dokumentenraster auch noch die Unterbereiche berücksichtigen:
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.
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.
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.
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
(Dieser Beitrag wurde von Martin Fischer am 4. Okt 2019, 12:28 geändert)
Ich glaube wir haben da wirklich etwas aneinander vorbeigeredet:
Zu deinen Punkten:
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.
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.
Das passiert schon in der ersten for-Schleife.
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.
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
(Dieser Beitrag wurde von Martin Fischer am 9. Okt 2019, 16:51 geändert)
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:
und die Steghöhe bzw. den Versatz von der Seitenkante so:
Und das wäre die erste for Schleife nach der Rasterausrichtung: