ich glaube ich habe mein Vorhaben nicht gut erklärt:
Ich habe ein Dokument mit zB. 30 einzelnen Gruppierungen.
Manche dieser Gruppierungen enthalten einen Textrahmen der das Objektformat "Preis" hat.
Und genau diese Gruppierungen möchte ich entgruppieren und nicht alle. Ich will aber keine Textrahmen löschen oder duplizieren oder auf eine andere Ebene schieben.
LG faxinger
Ungruppieren von nur bestimmten Gruppen die ein bestimmtes Objekt enthalten
Du hast recht. Die Aufgabenstellung "Entgruppiere mir alle Textrahmen, die Teile einer Gruppe sind und das Objektformat Preis haben." hatte ich irrtümlicherweise so verstanden, dass die speziellen Textrahmen aus der Gruppe herausgelöst werden sollten (statt die Gruppe gänzlich aufzulösen).
Mit "var alltexts = doc.pages[0].textFrames;" erwischt Du nur die Textrahmen auf der ersten Seite, die sich ungruppiert auf der Seite befinden. Für Textrahmen innerhalb von Gruppen bedarf es einer Superklasse. Eine Superklasse "allTextFrames" gibt es nicht. Aber es gibt eine Superklasse "allPageItems" (Textrahmen Graphikrahmen, unbestimmte Rahmen). Als Textrahmen können diese z.B. über die Eigenschaft "parentStory" identifiziert werden.
Aufgelöst werden soll die Gruppe, in der sich das entsprechende allPageItem befindet, und nicht das allPageItem selbst (all_page_items[n].parent, nicht all_page_items[n]).
Innerhalb der Schleife gilt es die Tatsache der Veränderung der Indices der allPageItems bei Auflösung einer Gruppe zu berücksichtigen. Eine (Not-)lösung besteht im Zurücksetzen der Variablen für allPageItems und dem Zähler. Diese Notlösung hat zur Konsequenz, dass die Schleife so lange neu gestartet wird, bis während einem Schleifendurchgang keine Gruppe mehr aufgelöst wurde (also viele allPageItems unnötigerweise wiederholt geprüft werden). Das sollte aber bei einer begrenzten Zahl an Objekten auf einer Seite hinsichtlich der Ausführungsgeschwindigkeit nicht zu sehr ins Gewicht fallen.
Hier ein Beispiel:
Viele Grüße Martin
Ungruppieren von nur bestimmten Gruppen die ein bestimmtes Objekt enthalten
Hallo faxinger, der Vorschlag von Martin mit den Duplikaten ist gar nicht so verkehrt. Bedenke, dass sich Gruppen, die innerhalb einer Struktur verschachtelt sind, nicht mit Methode ungroup() behandeln lassen.
Was meine ich mit verschachtelt?
Verankerte Gruppen in Text. Gruppen, die in grafische Rahmen eingefügt wurden. Gruppen, die selbst Teil einer Gruppe sind.
Wird eine solche Gruppe gefunden über meinetwegen doc.allPageItems, parent der Gruppe ist nicht Spread, könnte man die Gruppe duplizieren und entgruppieren. Das Orginal einfach löschen. Möglicherweise muss man das Duplikat der Gruppe noch auf die korrekte Ebene und auf die korrekte Position bringen, bevor man das Original löscht.
Also Vorsicht, app.generalPreferences.ungroupRemembersLayers beachten! ***** Mit herzlichem Gruß, Uwe Laubender
Ungruppieren von nur bestimmten Gruppen die ein bestimmtes Objekt enthalten
um das Zurücksetzen von Variablen zu vermeiden, könntest Du erst mal die ids aller relevanten Gruppen in ein Array speichern und dann das Array mit doc.pageItems.itemByID() durchgehen, um jede Gruppe einzeln zu behandeln. ***** Mit herzlichem Gruß, Uwe Laubender
Ungruppieren von nur bestimmten Gruppen die ein bestimmtes Objekt enthalten
Nach Versenden des Beitrags bin ich beim Nachgrübeln auf diese Idee gekommen, hab's dann aber nicht mehr weiter geprüft.
Du hast Recht: dort wo durch Änderungen während der Skriptausführung Indizes von Arrays oder Sammlungen durcheinandergeraten ist es eine gute Idee, alternativ auf die IDs der Objekte zurückzugreifen.
Viele Grüße Martin
(Dieser Beitrag wurde von Martin Fischer am 23. Apr 2019, 14:47 geändert)
Ungruppieren von nur bestimmten Gruppen die ein bestimmtes Objekt enthalten
danke für eure ausführlichen und informativen Antworten. Leider komme ich erst jezt dazu zu antworten.
Es ist natürlich so dass diese Textrahmen mit dem Objektformat "preis" auch Teile einer verschachtelten Gruppe sein können. Sprich der Preistextrahmen ist mit ein oder 2 anderen Rahmen gruppiert und diese Gruppe ist wiederum Teil einer anderen Gruppe. Oder sie sind eben nur Teil einer Gruppe (hierarchisch gleich).
Wo ich aufgrund meiner bescheidenen Skriptkenntnisse scheitere ist die Idee mit den IDs. Wie speichere ich die IDs der "relevanten" Gruppen, bzw. wie kann ich dann nur diese auflösen wenn sie mehrere Hierarchien haben?
Das glaube ich übersteigt bei weitem meinen Horizont. ;-)
Ich könnte das Skript aber mehrmals laufen lassen bis alle entsprechenden Gruppen aufgelöst sind...
Vielleicht gibt es überhaupt eine andere Herangehensweise?
Danke für euer Bemühen.
LG faxinger
Ungruppieren von nur bestimmten Gruppen die ein bestimmtes Objekt enthalten
ich entnehme Deinen Ausführungen, dass Du auch eine "Supergruppe" auflösen möchtest sofern ein Textrahmen innerhalb dieser Gruppe den Kriterien entspricht.
Wieweit kann denn die Verschachtelung gehen? Kann die Supergruppe auch verankert in einem Textrahmen sein? Oder in ein Grafikobjekt eingefügt sein? ( In Auswahl einfügen. )
Falls nicht, dann kannst Du einfach alle Gruppen des Dokuments durchsuchen. Mit allPageItems der Gruppe hast Du schon mal alle Elemente der Gruppe, auch die der Untergruppen.
Wird ein entsprechender Textrahmen gefunden, lässt sich der "ungroup"-Befehl über ein Menü aufrufen sofern die Gruppe ausgewählt wird. Solange er verfügbar ist, also solange Gruppen vorhanden sind, mehrmals. Das ist die "bequeme" Version der Skriptausführung :-) Nicht für InDesign Server geeignet.
Hier mal ein Beispiel, das auch die IDs speichert, funktioniert mit allen Gruppen, die nicht verankert oder in ein Grafikelement eingefügt wurden:
***** Mit herzlichem Gruß, Uwe Laubender
Ungruppieren von nur bestimmten Gruppen die ein bestimmtes Objekt enthalten