Connect failed: Connection timed out

[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: 246

21. Apr 2019, 09:00
Beitrag # 1 von 11
Bewertung:
(6916 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: 12779

21. Apr 2019, 16:34
Beitrag # 2 von 11
Beitrag ID: #569840
Bewertung:
(6893 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.


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: 246

21. Apr 2019, 22:08
Beitrag # 3 von 11
Beitrag ID: #569841
Bewertung:
(6869 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: 12779

22. Apr 2019, 08:46
Beitrag # 4 von 11
Beitrag ID: #569844
Bewertung:
(6737 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
}
};



als Antwort auf: [#569841]

Ungruppieren von nur bestimmten Gruppen die ein bestimmtes Objekt enthalten

Uwe Laubender
Beiträge gesamt: 5316

23. Apr 2019, 14:26
Beitrag # 5 von 11
Beitrag ID: #569854
Bewertung:
(6654 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!


als Antwort auf: [#569841]

Ungruppieren von nur bestimmten Gruppen die ein bestimmtes Objekt enthalten

Uwe Laubender
Beiträge gesamt: 5316

23. Apr 2019, 14:35
Beitrag # 6 von 11
Beitrag ID: #569855
Bewertung:
(6648 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.


als Antwort auf: [#569844]

Ungruppieren von nur bestimmten Gruppen die ein bestimmtes Objekt enthalten

Martin Fischer
  
Beiträge gesamt: 12779

23. Apr 2019, 14:46
Beitrag # 7 von 11
Beitrag ID: #569856
Bewertung:
(6639 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.


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: 246

26. Apr 2019, 14:38
Beitrag # 8 von 11
Beitrag ID: #569892
Bewertung:
(6536 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: 2760

26. Apr 2019, 15:12
Beitrag # 9 von 11
Beitrag ID: #569895
Bewertung:
(6532 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.


als Antwort auf: [#569892]

Ungruppieren von nur bestimmten Gruppen die ein bestimmtes Objekt enthalten

Uwe Laubender
Beiträge gesamt: 5316

29. Apr 2019, 10:06
Beitrag # 10 von 11
Beitrag ID: #569913
Bewertung: |||
(6401 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 );

};



als Antwort auf: [#569892]

Ungruppieren von nur bestimmten Gruppen die ein bestimmtes Objekt enthalten

faxinger
Beiträge gesamt: 246

4. Mai 2019, 20:05
Beitrag # 11 von 11
Beitrag ID: #569984
Bewertung:
(6169 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