[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt Ungruppieren von nur bestimmten Gruppen die ein bestimmtes Objekt enthalten

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

Ungruppieren von nur bestimmten Gruppen die ein bestimmtes Objekt enthalten

faxinger
Beiträge gesamt: 203

21. Apr 2019, 09:00
Beitrag # 1 von 11
Bewertung:
(1842 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo und frohe Ostern euch allen!

Leider durschaue ich Javascript nicht und bitte um Entschuldigung für meine dauernden Fragen.

Folgendes möchte ich erreichen:

Entgruppiere mir alle Textrahmen die Teile einer Gruppe sind und das Objektformat Preis haben. Alle anderen Gruppen belasse so wie sie sind.

Das:
Code
app.documents[0].groups.everyItem().ungroup(); 

hilft mir nicht weiter da ja hier alle Gruppen aufgelöst werden.

Ich habe es dann so versucht:
Code
// The active document:  
var doc = app.documents[0];
var nameOfObjectStyle = "preis";


var alltexts = doc.pages[0].textFrames;
var objectStyle = doc.objectStyles.itemByName(nameOfObjectStyle);


// Loop all TextFrames:
for(var n=0;n<alltexts.length;n++)

{
if(alltexts[n].appliedObjectStyle == objectStyle && alltexts[n].parent ==Group);
{
// ungroup:
alltexts[n].ungroup();

}
};


Ich glaube mein Problem ist dass nur PageItems entgruppiert werden können nicht aber Textrahmen als Teil einer Gruppe?

Wie könnte das funktionieren?

Vielen vielen Dank für eure Antworten.

LG faxinger und noch einen schönen Ostersonntag.

Ps. Gibt es Buchempfehlungen von euch zum Thema JS.
Das Buch von Gregor Fellenz habe ich schon, aber vielleicht gibt es noch andere.
X

Ungruppieren von nur bestimmten Gruppen die ein bestimmtes Objekt enthalten

Martin Fischer
  
Beiträge gesamt: 12028

21. Apr 2019, 16:34
Beitrag # 2 von 11
Beitrag ID: #569840
Bewertung:
(1819 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Vielleicht einfacher:
Gewünschte Objekte duplizieren (z.B. auf eine neue Ebene) und danach das Original (in der Gruppe) löschen.

Zur Literatur:
Besser zunächst ein Buch intensiv durchackern und zu begreifen suchen als viele querzulesen und zu überfliegen.

Viele Grüße
Martin




als Antwort auf: [#569836]
(Dieser Beitrag wurde von Martin Fischer am 21. Apr 2019, 16:37 geändert)

Ungruppieren von nur bestimmten Gruppen die ein bestimmtes Objekt enthalten

faxinger
Beiträge gesamt: 203

21. Apr 2019, 22:08
Beitrag # 3 von 11
Beitrag ID: #569841
Bewertung:
(1795 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Martin,

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


als Antwort auf: [#569840]

Ungruppieren von nur bestimmten Gruppen die ein bestimmtes Objekt enthalten

Martin Fischer
  
Beiträge gesamt: 12028

22. Apr 2019, 08:46
Beitrag # 4 von 11
Beitrag ID: #569844
Bewertung:
(1663 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo faxinger,

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:
Code
// The active document:   
var doc = app.documents[0];
var nameOfObjectStyle = "preis";

var all_page_items = doc.pages[0].allPageItems; // allPageItems statt pageItems
var objectStyle = doc.objectStyles.itemByName(nameOfObjectStyle);

// Loop all TextFrames:
for (var n = 0; n < all_page_items.length; n++)
{
if(
all_page_items[n].appliedObjectStyle == objectStyle && // Prüfung Objektstil
all_page_items[n].hasOwnProperty('parentStory') && // Prüfung Textrahmen
all_page_items[n].parent.constructor.name == "Group" // Prüfung Teil einer Gruppe
)
{
// ungroup:
all_page_items[n].parent.ungroup();
all_page_items = doc.pages[0].allPageItems; // Zurücksetzen Variable für allPageItems
n = 0; // Zurücksetzen des Zählers
}
};


Viele Grüße
Martin




als Antwort auf: [#569841]

Ungruppieren von nur bestimmten Gruppen die ein bestimmtes Objekt enthalten

Uwe Laubender
Beiträge gesamt: 4390

23. Apr 2019, 14:26
Beitrag # 5 von 11
Beitrag ID: #569854
Bewertung:
(1580 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
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


als Antwort auf: [#569841]

Ungruppieren von nur bestimmten Gruppen die ein bestimmtes Objekt enthalten

Uwe Laubender
Beiträge gesamt: 4390

23. Apr 2019, 14:35
Beitrag # 6 von 11
Beitrag ID: #569855
Bewertung:
(1574 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Martin,

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


als Antwort auf: [#569844]

Ungruppieren von nur bestimmten Gruppen die ein bestimmtes Objekt enthalten

Martin Fischer
  
Beiträge gesamt: 12028

23. Apr 2019, 14:46
Beitrag # 7 von 11
Beitrag ID: #569856
Bewertung:
(1565 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Uwe,

danke für den guten Hinweis.

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




als Antwort auf: [#569855]
(Dieser Beitrag wurde von Martin Fischer am 23. Apr 2019, 14:47 geändert)

Ungruppieren von nur bestimmten Gruppen die ein bestimmtes Objekt enthalten

faxinger
Beiträge gesamt: 203

26. Apr 2019, 14:38
Beitrag # 8 von 11
Beitrag ID: #569892
Bewertung:
(1462 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Martin, hallo Uwe,

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


als Antwort auf: [#569856]

Ungruppieren von nur bestimmten Gruppen die ein bestimmtes Objekt enthalten

WernerPerplies
Beiträge gesamt: 2318

26. Apr 2019, 15:12
Beitrag # 9 von 11
Beitrag ID: #569895
Bewertung:
(1458 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Faxinger,

das Zauberwort heißt "rekursiv".

Schau Dir mal das Skript in diesem Beitrag an:

Kopieren von ganzen Ordnern
und stelle Dir vor, Verzeichnisse wären Gruppen, Dateien PageItems der Gruppe.

Dies soll keine komplette Lösung, sondern nur ein Denkanstoß sein.

Einen schönen Tag wünscht

Werner Perplies
Auftragsprogrammierung und Skripte für Adobe InDesign
neu: WpsProjectHandler 15.06.2018, Version 1.75, neue Funktionen
Aktuelles
XING


als Antwort auf: [#569892]

Ungruppieren von nur bestimmten Gruppen die ein bestimmtes Objekt enthalten

Uwe Laubender
Beiträge gesamt: 4390

29. Apr 2019, 10:06
Beitrag # 10 von 11
Beitrag ID: #569913
Bewertung: |||
(1327 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Faxinger,

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:

Code
app.scriptPreferences.userInteractionLevel = UserInteractionLevels.interactWithAll; 

app.doScript
(
ungroupWhenTextFrameFound,
ScriptLanguage.JAVASCRIPT,
[],
UndoModes.ENTIRE_SCRIPT,
"Ungroup when TextFrame is found | SCRIPT"
);

function ungroupWhenTextFrameFound()
{

var doc = app.documents[0];

// Script Menu Action "ungroup" :
var ungroupMenuItem = app.scriptMenuActions.itemByID(118845);
// Applied Object Style of TextFrame :
var objectStylePreis = doc.objectStyles.itemByName( "Preis" );

// Get all groups that are not anchored or pasted inside graphic frames:
var groups = doc.groups.everyItem().getElements();

// Container for found ids:
var relevantGroupsIDs = [];

// Loop all groups:
for( var n=0; n<groups.length; n++ )
{
// Get all page items of group; also group in groups:
var allPageItemsGroup = groups[n].allPageItems;

// Loop to find one instance of a text frame that has the object style applied:
for( var a=0; a<allPageItemsGroup.length; a++ )
{
if
(
allPageItemsGroup[a].constructor.name == "TextFrame"
&&
allPageItemsGroup[a].appliedObjectStyle == objectStylePreis
)
{
// If found feed the container array with a simple ID number:
relevantGroupsIDs[relevantGroupsIDs.length++] = groups[n].id ;
// Go on to the next group:
break;
}
}
};

// Loop the relevant groups:
for( var n=0; n<relevantGroupsIDs.length; n++ )
{
// Reset selection to null:
doc.select( null );
// Select the page item, a group:
doc.select( doc.pageItems.itemByID( relevantGroupsIDs[n]) );
// Invoke the script menu action until all groups of the selection are ungrouped:
while( ungroupMenuItem.enabled ){ ungroupMenuItem.invoke() };
};

doc.select( null );

};

*****
Mit herzlichem Gruß,
Uwe Laubender


als Antwort auf: [#569892]

Ungruppieren von nur bestimmten Gruppen die ein bestimmtes Objekt enthalten

faxinger
Beiträge gesamt: 203

4. Mai 2019, 20:05
Beitrag # 11 von 11
Beitrag ID: #569984
Bewertung:
(1095 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Uwe,

vielen vielen Dank für das Skript. Ja genau das wollte ich erreichen.

Wie du richtig vermutet hast befinden sich keine verankerten Textrahmen in Gruppen.

Vielen vielen Dank!!

Ps. Manchmal dauert es etwas länger bis ich wieder zum Antworten komme. Sorry dafür,


LG
faxinger


als Antwort auf: [#569913]
X

Aktuell

Photoshop / Lightroom
starkeMarken_300

Veranstaltungen

Hier können Sie Ihre Anlässe eintragen, welche einen Zusammenhang mit den Angeboten von HilfDirSelbst.ch haben. Die Einträge werden moderiert freigeschaltet. Dies wird werktags üblicherweise innert 24 Stunden erfolgen. pdf-icon Hier eine kleine Anleitung.

Veranstaltungen
03.06.2019

Nürnberg
Montag, 03. Juni 2019, 09.30 Uhr

Schulung, Seminar

Freisteller zählen seit den Anfangsjahren der elektronischen Bildbearbeitung zu den wichtigsten EBV-Techniken. Im Lauf der Jahre haben sich verschiedene Techniken entwickelt, und auch Photoshop hat mit zahlreichen Freistell-Werkzeugen die Arbeit mit Freistellern vereinfacht. In diesem Seminar lernen Sie die wichtigsten Freistell- und Maskierungstechniken kennen, um Ihre Bilddaten schnell und effizient freizustellen.

Ja

Organisator: Cleverprinting.de

https://www.cleverprinting.de/schulung-freistellen-tipps-und-tricks/

Freistellen – die besten Strategien, Tipps, Tricks
Veranstaltungen
03.06.2019 - 04.06.2019

Düsseldorf
Montag, 03. Juni 2019, 09.30 Uhr - Dienstag, 04. Juni 2019, 17.30 Uhr

Schulung, Seminar

Unsere Schulung „Zweitägige Weiterbildung zum Cleverprinting-Reinzeichner“ bietet allen Anwendern, die in Agenturen oder freiberuflich als Reinzeichner bzw. in der Reinzeichnung arbeiten, topaktuelles Grafik- und PrePress-Fachwissen rund um das Thema „Druckdatenerstellung mit InDesign, Photoshop, Acrobat“.

Ja

Organisator: Cleverprinting.de

https://www.cleverprinting.de/zweitaegige-weiterbildung-zum-cleverprinting-reinzeichner/

Zweitägige Weiterbildung zum Cleverprinting-Reinzeichner