Forenindex » Programme » Print/Bildbearbeitung » Adobe InDesign Skriptwerkstatt » Objekte löschen anhand einer Farbe

Objekte löschen anhand einer Farbe

faxinger
Beiträge gesamt: 241

31. Mai 2019, 11:23
Bewertung:

gelesen: 4749

Beitrag als Lesezeichen
Hallo liebes Forum,

ich bitte euch wieder mal um eure Mithilfe.

Mein Ziel ist:
Ich habe ein Dokument mit einer Doppelseite oder Einzelseite (das kann von Dokument zu Dokument variieren) und mehreren Ebenen. In diesem Dokument sollen alle Elemente (Polygone) die mit 100 % Yellow gefüllt sind gelöscht werden.

Nur ist mir nicht klar wie ich diese Elemente auswählen könnte. Das Gelb ist zwar in den Farbfeldern definiert, hat aber keinen "richtigen" Namen sondern nur die Farbwerte als Namen.



Habt ihr eine Idee?

Vielen Dank.
LG faxinger

Objekte löschen anhand einer Farbe

WernerPerplies
Beiträge gesamt: 2383

31. Mai 2019, 12:35
Bewertung:

gelesen: 4726

Beitrag als Lesezeichen
Hallo faxinger,

Zitat Nur ist mir nicht klar wie ich diese Elemente auswählen könnte. Das Gelb ist zwar in den Farbfeldern definiert, hat aber keinen "richtigen" Namen sondern nur die Farbwerte als Namen.

Das was Du siehst, ist der Name, also wo genau ist Dein Problem?

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

Objekte löschen anhand einer Farbe

faxinger
Beiträge gesamt: 241

31. Mai 2019, 13:38
Bewertung:

gelesen: 4711

Beitrag als Lesezeichen
Danke Werner,

ich habe mich geirrt, ich muss nur alle Polygone auswählen und löschen unabhängig von der Farbe.

Was ich noch wissen müsste ist wie ich an alle Polygone rankomme.
Also alle Polygone auf allen Seiten und allen Ebenen.
Ich habe zwar schon etwas Code aber der funktioniert schon von der Auswahl her nicht:
Code
var _dok= app.activeDocument; 

var _polys = _dok.polygons.everyItem().getElements();
alert (_polys.length);



if(!_polys.parentPage == null){_polys.remove()};


Bitte um kurze Antwort.

Danke
LG
faxinger

(Dieser Beitrag wurde von faxinger am 31. Mai 2019, 13:40 geändert)

Objekte löschen anhand einer Farbe

WernerPerplies
Beiträge gesamt: 2383

31. Mai 2019, 14:12
Bewertung:

gelesen: 4699

Beitrag als Lesezeichen
Bitte,

also dann vielleicht so:
Code
main(); 

function main() {
try{
var /*Array*/pIs = app.documents[0].allPageItems, /*Int*/l = pIs.length,
/*Array*/allPolygons = [];

for (var i = 0; i < l; i++){
if (wpsInnerConstructorName(pIs[i]) == "Polygon"){
allPolygons.push(pIs[i]);
}
}
alert(allPolygons.length);
}
catch (error){
alert(error.message + "\nin Zeile: \n" + error.line);
}
// DESCRIPTION gets the inner constructor name of an object, e. g. pageItem -> TextFrame, Rectangle ...
// Dateiname: wpsInnerConstructorName.jsx
// [modified]
// created:Fri Aug 25 2017 15:31:53 GMT+0200
// for this Script
// © 2017 by Werner Perplies, EDV-Anwendungsberatung,
// http://www.weepee.de, email: werner.perplies@weepee.de
// #include "C:/Users/WernerPerplies/Source/Workspaces/Singles/wpsInnerConstructorName.jsx";
// [end of header]


// #include "C:/Users/WernerPerplies/Source/Workspaces/Singles/ErrorHandling/wpsHandleError.jsx";

/*String*/function wpsInnerConstructorName(/*Object*/o)
{
try
{
if (typeof(o) != "object")
{
var r = (typeof o ).toString().split("");
r[0] = r[0].toUpperCase();
return r.join("");
}
var constructorName = o.constructor.name;
if (!("getElements" in o))
return constructorName;
while (constructorName != o.getElements()[0].constructor.name)
{
if (!("getElements" in o))
break;
o = o.getElements()[0];
constructorName = o.constructor.name;
}
return constructorName;
}
catch (error)
{
if (error.number == 21)
return "Null";
// throw wpsHandleError(error, $.stack, "wpsInnerConstructorName");
// throw error;
}
}
}


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

Objekte löschen anhand einer Farbe

faxinger
Beiträge gesamt: 241

31. Mai 2019, 14:20
Bewertung:

gelesen: 4690

Beitrag als Lesezeichen
Danke Werner,

aber leider funktioniert das Skript nicht. Es werden keine polygone gelöscht.

Die anzahl der Polygone wird ausgegeben.

LG
faxinger

Objekte löschen anhand einer Farbe

WernerPerplies
Beiträge gesamt: 2383

31. Mai 2019, 14:34
Bewertung:

gelesen: 4680

Beitrag als Lesezeichen
Darauf habe ich Dir geantwortet:

Zitat Was ich noch wissen müsste ist wie ich an alle Polygone rankomme.


löschen müsste so funktionieren:
Code
... 
for (var i = 0; i < l; i++){
if (wpsInnerConstructorName(pIs[i]) == "Polygon"){
pIs[i].remove();
}
}
...


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

Objekte löschen anhand einer Farbe

Hans Haesler
  
Beiträge gesamt: 5747

31. Mai 2019, 20:34
Bewertung: ||

gelesen: 4606

Beitrag als Lesezeichen
Hallo faxinger,

Antwort auf: Was ich noch wissen müsste ist wie ich an alle Polygone rankomme.

Versuche es bitte mal damit:

Code
var allPolys = app.documents[0].polygons; 
var nPolys = allPolys.length;
for (var p=nPolys-1; p>-1; p--) {
allPolys[p].remove();
}

Auch mit diesem Einzeiler sollte es klappen:

Code
app.documents[0].polygons.everyItem().remove(); 

Voraussetzungen: Die Objekte sind nicht gruppiert. Weder Ebenen noch Objekte sind gesperrt.

Gruss, Hans

(Dieser Beitrag wurde von Hans Haesler am 1. Jun 2019, 08:03 geändert)

Objekte löschen anhand einer Farbe

faxinger
Beiträge gesamt: 241

3. Jun 2019, 09:06
Bewertung:

gelesen: 3526

Beitrag als Lesezeichen
Hallo Hans, hallo Werner,

vielen Dank für eure Antworten. Ich muss gestehen dass mir der Einzeiler bzw. das Kurzscript von Hans besser gefällt, da ich dabei auch navollziehen kann was genau passiert, was ich bei Werners Script leider nicht kann. Das ist für mich zu hoch. ;-)

Es ist zwar schön etwas Einblick in die Hohe Kunst des JS zu bekommen, aber Verständnis geht für mich vor.

Danke für eure Bemühungen.

@Hans: Die Variable runterzuzählen in der for-Schleife hat wahrscheinlich den Grund das Objekte gelöscht werden und somit die Anzahl der zu löschenenden Objekte bei jedem Durchgang kleiner wird, oder?

LG
faxinger

Objekte löschen anhand einer Farbe

Hans Haesler
  
Beiträge gesamt: 5747

3. Jun 2019, 09:39
Bewertung: ||

gelesen: 3517

Beitrag als Lesezeichen
Hallo faxinger,

bitte sehr. Und Deine Auslegung ist richtig.

Wenn die Schleife durch den Array vorwärts läuft ...

Code
var allPolys = app.documents[0].polygons; 
var nPolys = allPolys.length;
for (var p=0; p<nPolys; p++) {
allPolys[p].remove();
}

... kommt eine Fehlermeldung, wenn mehr als ein Polygon vorhanden ist.

Angenommen, im Dokument sind drei Polygons:
– Beim ersten Durchgang wird ein Polygon entfernt. Es verbleiben zwei.
– Beim zweiten Durchgang wird eines davon entfernt. Es verbleibt eines.
– Beim dritten Durchgang versucht das Script das dritte Polygon (von dreien) zu löschen.
Aber das gelingt nicht, weil nur noch eines vorhanden ist.

Bitte ausprobieren!

*****
Wenn die Schleife rückwärts läuft, muss als Startwert die Anzahl Objekte minus eins verwendet werden, weil das letzte Objekt mit "0" adressiert wird:
– Durchgang 1: lösche Objekt 2;
– Durchgang 2: lösche Objekt 1;
– Durchgang 3: lösche Objekt 0;

Also nochmals:
Code
var allPolys = app.documents[0].polygons; 
var nPolys = allPolys.length;
for (var p=nPolys-1; p>-1; p--) {
allPolys[p].remove();
}

Gruss, Hans

Objekte löschen anhand einer Farbe

WernerPerplies
Beiträge gesamt: 2383

3. Jun 2019, 10:58
Bewertung:

gelesen: 3499

Beitrag als Lesezeichen
Hallo faxinger,

jetzt muss ich doch mal nachfragen:

Hans Beispiel zeigt wirklich alle Polygone einer Datei an?

Bei meiner Beispieldatei gilt:

Hans Methode: 3

Meine Methode: 40!

Und Du fragtest doch nach allen Polygonen, oder?

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

Objekte löschen anhand einer Farbe

faxinger
Beiträge gesamt: 241

3. Jun 2019, 17:20
Bewertung:

gelesen: 3448

Beitrag als Lesezeichen
Hallo Werner,

du hast Recht, mit deiner Methode bekomme ich mehr Ergebnisse.

Aber ich bin zu blöd den "Löschcode" richtig einzusetzen.

Code
for (var i = 0; i < l; i++){  
if (wpsInnerConstructorName(pIs[i]) == "Polygon"){
pIs[i].remove();
}
}


Ersetzt dieser Code den Code ?:
Code
     for (var i = 0; i < l; i++){  
if (wpsInnerConstructorName(pIs[i]) == "Polygon"){
allPolygons.push(pIs[i]);
}
}


Falls ja hat das bei mir nicht geklappt.

Und wofür benötige ich den "InnerConstructionName"?


Danke
LG
faxinger

Objekte löschen anhand einer Farbe

WernerPerplies
Beiträge gesamt: 2383

3. Jun 2019, 17:35
Bewertung:

gelesen: 3439

Beitrag als Lesezeichen
Hallo faxinger,

Zitat du hast Recht, mit deiner Methode bekomme ich mehr Ergebnisse.

Ich weiß! :-)

Ich hätte jetzt gerne den Block zitiert, aber wieder einmal schafft das der Editor des Forums nicht.

Also Kurzfassung:

Ja, so müsste es eigentlich klappen:
Code
 allPolygons.push(pIs[i]);  wird durch pIs[i].remove(); 

ersetzt.

Was klappt denn nicht, wird ein Fehler geworfen?
Mit welchem Polygon klappt es nicht?

Zitat Und wofür benötige ich den "InnerConstructionName"?


In PageItem ist ein Sammelbegriff für Rectangles, Textframes, Polygons usw.

InnerConstructorName ermittelt den Typ des PageItems.

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

(Dieser Beitrag wurde von Gerald Singelmann am 7. Jun 2019, 12:19 geändert)

Objekte löschen anhand einer Farbe

WernerPerplies
Beiträge gesamt: 2383

4. Jun 2019, 06:18
Bewertung:

gelesen: 3379

Beitrag als Lesezeichen
Moin faxinger,

ich habe es gereade noch einmal selbst ausprobiert, bei mir klappt alles wie gewünacht:
Code
function main() { 
try{
var /*Array*/pIs = app.documents[0].allPageItems, /*Int*/l = pIs.length,
/*Array*/allPolygons = [];

for (var i = 0; i < l; i++){
if (wpsInnerConstructorName(pIs[i]) == "Polygon"){
// allPolygons.push(pIs[i]); // entkommentieren zur Ermittlung der Anzahl, kommentieren zum Löschen
// pIs[i].remove(); // kommentieren zur Ermittlung der Anzahl, entkommentieren zum Löschen
}
}
alert(allPolygons.length);
}
catch (error){
alert(error.message + "\nin Zeile: \n" + error.line);
}
// DESCRIPTION gets the inner constructor name of an object, e. g. pageItem -> TextFrame, Rectangle ...
// Dateiname: wpsInnerConstructorName.jsx
// [modified]
// created:Fri Aug 25 2017 15:31:53 GMT+0200
// for this Script
// © 2017 by Werner Perplies, EDV-Anwendungsberatung,
// http://www.weepee.de, email: werner.perplies@weepee.de
// #include "C:/Users/WernerPerplies/Source/Workspaces/Singles/wpsInnerConstructorName.jsx";
// [end of header]


// #include "C:/Users/WernerPerplies/Source/Workspaces/Singles/ErrorHandling/wpsHandleError.jsx";

/*String*/function wpsInnerConstructorName(/*Object*/o){
...


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

Objekte löschen anhand einer Farbe

WernerPerplies
Beiträge gesamt: 2383

4. Jun 2019, 08:09
Bewertung:

gelesen: 3357

Beitrag als Lesezeichen
Und um auf das ursprüngliche Thema zurückzukommen:
Zitat Objekte löschen anhand einer Farbe

Code
main(); 

function main() {
try{
var /*Array*/pIs = app.documents[0].allPageItems, /*Int*/l = pIs.length,
/*Array*/allPolygons = [], /*Array*/allPolygonsWithDefinedFillColor = [],
/*Array*/allPolygonsWithDefinedStrokeColor = [], /*Array*/deletedItems = [];

for (var i = 0; i < l; i++){
if (wpsInnerConstructorName(pIs[i]) == "Polygon"){
// allPolygons.push(pIs[i]); // entkommentieren zur Ermittlung der Anzahl, kommentieren zum Löschen
// pIs[i].remove(); // kommentieren zur Ermittlung der Anzahl, entkommentieren zum Löschen
// allPolygonsWithDefinedFillColor.push(pIs[i].fillColor.name);
// allPolygonsWithDefinedStrokeColor.push(pIs[i].fillColor.name);
// Polygon mit einer bestimmten StrokeColor löschen
// detect collection of pIs[i].strokeColor:
if (pIs[i].strokeColor == app.activeDocument.colors.itemByName("Black"))
{
deletedItems.push(pIs[i].strokeColor.name);
pIs[i].remove();
}
}
}
// alert(allPolygons.length);
// alert(allPolygonsWithDefinedFillColor.join("\n"));
// alert(allPolygonsWithDefinedStrokeColor.join("\n"));
alert(deletedItems.join("\n"));
}
catch (error){
alert(error.message + "\nin Zeile: \n" + error.line);
}
// DESCRIPTION gets the inner constructor name of an object, e. g. pageItem -> TextFrame, Rectangle ...
// Dateiname: wpsInnerConstructorName.jsx
// [modified]
// created:Fri Aug 25 2017 15:31:53 GMT+0200
// for this Script
// © 2017 by Werner Perplies, EDV-Anwendungsberatung,
// http://www.weepee.de, email: werner.perplies@weepee.de
// #include "C:/Users/WernerPerplies/Source/Workspaces/Singles/wpsInnerConstructorName.jsx";
// [end of header]


// #include "C:/Users/WernerPerplies/Source/Workspaces/Singles/ErrorHandling/wpsHandleError.jsx";

/*String*/function wpsInnerConstructorName(/*Object*/o){
...


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

Objekte löschen anhand einer Farbe

Uwe Laubender
Beiträge gesamt: 4491

4. Jun 2019, 10:35
Bewertung:

gelesen: 3338

Beitrag als Lesezeichen
Antwort auf: … Und wofür benötige ich den "InnerConstructionName"? …


Hallo Faxinger,
wenn Du nach pageItems fahndest, bekommst Du pageItems zurück.
Die Oberklasse gewissermaßen von "Rectangles", "Ovals", "Polygons" etc.pp.

Willst Du nun wissen, was ein bestimmtes pageItems nun eigentlich ist, kannst Du das beispielsweise so machen:

Code
pageItem.getElements()[0] 


InDesign ist dann gezwungen genau nachzusehen, um was es sich handelt.
Also haben wir's mit einem Rechteck, Polygon etc.pp. zu tun.

Code
var doc = app.documents.add(); 
var objectOnPage = doc.rectangles.add({geometricBounds: [0,0,100,100]});

$.writeln( doc.pageItems[0] ); // [object PageItem]
$.writeln( doc.pageItems[0].getElements()[0] ); // [object Rectangle]

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

Objekte löschen anhand einer Farbe

WernerPerplies
Beiträge gesamt: 2383

4. Jun 2019, 10:56
Bewertung:

gelesen: 2361

Beitrag als Lesezeichen
Moin Uwe,

und weil das nicht nur für PageItems gilt, sondern auch für eine Reihe von anderen Objekten (z. B. Colors), verwende ich meine Funktion InnerConstructorName, die, wenn immer möglich, einen ConstuctorName zurückgibt.

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

Objekte löschen anhand einer Farbe

Uwe Laubender
Beiträge gesamt: 4491

4. Jun 2019, 13:22
Bewertung:

gelesen: 2346

Beitrag als Lesezeichen
Hallo Werner,
danke für den Hinweis!

So, und jetzt machen wir mal 'was wirklich Lustiges:

Code
var doc = app.documents.add(); 
var objectOnPage = doc.rectangles.add({geometricBounds: [0,0,100,100]});

$.writeln( doc.pageItems[0] ); // [object PageItem]
$.writeln( doc.pageItems[0].getElements()[0] ); // [object Rectangle]

objectOnPage.convertShape( ConvertShapeOptions.CONVERT_TO_OVAL );

$.writeln( doc.pageItems[0] ); // [object PageItem]
$.writeln( doc.pageItems[0].getElements()[0] ); // [object Rectangle]


Gell, da staunt ihr.

InDesign behauptet nach der Aktion mit convertShape() immer noch, es handelt sich um ein Rechteck. Optisch wird das allerdings keinesfalls unterstützt. Die Seite zeigt einen Kreis!

Werners Funktion hilft dagegen leider auch nicht. Die arbeitet ja auch mit getElements()[0].
Ist aber nicht Werners Schuld. Möglicherweise beruht das Problem auf einem Bug in der Scripting-Engine.
*****
Mit herzlichem Gruß,
Uwe Laubender

Objekte löschen anhand einer Farbe

Uwe Laubender
Beiträge gesamt: 4491

4. Jun 2019, 13:54
Bewertung:

gelesen: 2335

Beitrag als Lesezeichen
Ach ja. Das noch nachgereicht:

InDesign behauptet fälschicherweise selbst nach Speichern und Wiederöffnen der Datei, es läge ein Rechteck vor. Obwohl doch jeder sehen kann, dass es sich bei pageItems[0] um einen Kreis handelt.

Diese Faxen hören auch dann nicht auf, wenn wir die Datei nach IDML exportieren und mit der IDML-Datei weiterarbeiten.
*****
Mit herzlichem Gruß,
Uwe Laubender

Objekte löschen anhand einer Farbe

WernerPerplies
Beiträge gesamt: 2383

4. Jun 2019, 14:07
Bewertung:

gelesen: 2326

Beitrag als Lesezeichen
:-)

Du ungläubiger Thomas!

objectOnPage sieht nur wie ein Kreis aus, ist aber ein Rectangle.

doc.rectangles.length -> 1
doc.ovals.length -> 0

Die Konvertierung bezieht sich nur auf das Aussehen, der Datentyp auf den Zeitpunkt der Entstehung.

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

Objekte löschen anhand einer Farbe

WernerPerplies
Beiträge gesamt: 2383

4. Jun 2019, 14:22
Bewertung: |||

gelesen: 2319

Beitrag als Lesezeichen
Ich finde, richtig spannend wird es hier:
Code
var doc = app.documents.add();  
var objectOnPage = doc.rectangles.add({geometricBounds: [0,0,100,100]});
objectOnPage.convertShape( ConvertShapeOptions.CONVERT_TO_OVAL );
doc.rectangles[0].contentType = ContentType.TEXT_TYPE;
alert(wpsInnerConstructorName(objectOnPage));

// DESCRIPTION gets the inner constructor name of an object, e. g. pageItem -> TextFrame, Rectangle ...
// Dateiname: wpsInnerConstructorName.jsx
// [modified]
// created:Fri Aug 25 2017 15:31:53 GMT+0200
// for this Script
// © 2017 by Werner Perplies, EDV-Anwendungsberatung,
// http://www.weepee.de, email: werner.perplies@weepee.de
// #include "C:/Users/WernerPerplies/Source/Workspaces/Singles/wpsInnerConstructorName.jsx";
// [end of header]


// #include "C:/Users/WernerPerplies/Source/Workspaces/Singles/ErrorHandling/wpsHandleError.jsx";

/*String*/function wpsInnerConstructorName(/*Object*/o){
try
{
if (typeof(o) != "object")
{
var r = (typeof o ).toString().split("");
r[0] = r[0].toUpperCase();
return r.join("");
}
var constructorName = o.constructor.name;
if (!("getElements" in o))
return constructorName;
while (constructorName != o.getElements()[0].constructor.name)
{
if (!("getElements" in o))
break;
o = o.getElements()[0];
constructorName = o.constructor.name;
}
return constructorName;
}
catch (error)
{
if (error.number == 21)
return "Null";
// throw wpsHandleError(error, $.stack, "wpsInnerConstructorName");
// throw error;
}
}


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

Objekte löschen anhand einer Farbe

Uwe Laubender
Beiträge gesamt: 4491

4. Jun 2019, 14:33
Bewertung:

gelesen: 2317

Beitrag als Lesezeichen
Zitat von Werner der Datentyp auf den Zeitpunkt der Entstehung.


Tja, wenn's für den Anwender nur so einfach wär:
Das Ebenen-Bedienfeld zeigt schließlich ein generisches <Kreis> an.

Möglicherweise auch nur die halbe Wahrheit :-)
*****
Mit herzlichem Gruß,
Uwe Laubender

Objekte löschen anhand einer Farbe

Uwe Laubender
Beiträge gesamt: 4491

4. Jun 2019, 14:36
Bewertung:

gelesen: 2315

Beitrag als Lesezeichen
Antwort auf: Ich finde, richtig spannend wird es hier:


Nun, da stimmt's wiederum.
Wir haben nun einen kreisförmigen Textrahmen.
*****
Mit herzlichem Gruß,
Uwe Laubender

Objekte löschen anhand einer Farbe

faxinger
Beiträge gesamt: 241

4. Jun 2019, 17:31
Bewertung:

gelesen: 2274

Beitrag als Lesezeichen
Hallo Werner,

so jetzt kam ich dazu es zu testen.

Es werden tatsächlich nicht alle Polygone gelöscht.

Die Ursache ist, dass der Inhalt der Polygone ja auch ein Textframe oder ein Grafikrahmen sein kann in Polygonform.

Ich glaube es muss ein neuer Ansatz her:
Anbei mal ein Beispiel als idml.


Die Ausgangssituation: Ich habe eine Doppelseite oder Einselseite (von Fall zu Fall unterschiedlich). Darauf befinden sich Polygone auf verschiedenen Ebenen.

(Im Original habe ich natürlich noch andere Elemente auf der Seite.)

Ziel: Die Polygone sollen gelöscht werden.

Das Problem dabei: meine "Polygone" könnten ja eigentlich Textrahmen oder Grafikrahmen oder Rahmen mit nicht zugewiesenem Inhalt mit vielen Pfadpunkten sein.

Ich ging davon aus dass man mit PageItems.polygons alle Rahmen mit vielen Pfadpunkten erwischt.

Aber da liegt der Fehler.

Ich glaube man muss die Auswahl über das Kriterium der Pfadpunkte (Anzahl größer als z.B 10 Punkte) treffen unabhängig vom jeweiligen Inhalt.

Vielleicht gibt es auch noch eine andere Möglichkeit.

Bin gespannt auf euren Input.

Danke
LG
faxinger

Anhang:
polygons_test.idml (212 KB)

Objekte löschen anhand einer Farbe

WernerPerplies
Beiträge gesamt: 2383

4. Jun 2019, 18:08
Bewertung:

gelesen: 2264

Beitrag als Lesezeichen
Hallo faxinger,

Du musst einfach innerhalb der Schleife mit einer oder mehrer If-Bedingungen die gewünschten PageItems herausfiltern und dann löschen.

Bitte habe Verständnis dafür, dass ich Dir gerne bei exakt definierten Teilproblemen Lösungsvorschläge mache, aber Dir kostenlos keine Komplettlösungen liefere.

So, wie Du vermutlich von Deiner Arbeit lebst, lebe ich von der Programmierung von Skripten.

Ich denke, wir haben Dir hier reichlich Tipps für Deine Problemstellung gegeben.

Viel Erfolg wünscht

Werner

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

Objekte löschen anhand einer Farbe

faxinger
Beiträge gesamt: 241

5. Jun 2019, 17:04
Bewertung:

gelesen: 2163

Beitrag als Lesezeichen
Hallo Werner und Hallo auch an alle anderen die sich so intensiv mit der Fragestellung auseinandergesetzt haben.

Danke für eure vielen und ausführlichen Antworten.

Natürlich verstehe ich, dass mir hier für so ein umfangreiches Problem keine Komplettlösung unentgeltlich geliefert werden kann.

Jeder muss seine Brötchen verdienen.

Ich glaube auch dass ich mit diesen vielen Beispielen mich schon weiterhanteln kann.


Danke nochmals und schönen Abend.
LG
faxinger

Objekte löschen anhand einer Farbe

Hans Haesler
  
Beiträge gesamt: 5747

6. Jun 2019, 08:21
Bewertung: |||

gelesen: 2125

Beitrag als Lesezeichen
Hallo faxinger,

Du hast richtig erkannt, dass nur durch die Prüfung der Pfadpunkte alle Polygons erwischt werden. Allerdings muss der Grenzwert tiefer als die genannten 10 angesetzt werden. Sonst wird ein normales Fünfeck nicht erfasst.

Wenn Gruppierungen vorkommen, müssen diese zuerst aufgehoben werden. Es sei denn man verwende allPageItems für den Array der Objekte, statt pageItems.

Weil mit 'allPageItems' nebst den Rahmen einer Gruppe auch eventuelle Bilder und die Gruppe selbst aufgelistet werden, muss die Pfadpunkte-Prüfung in einen try-Wickel gepackt werden. Sonst kommt eine Fehlermeldung, sobald die Gruppe an der Reihe ist.

Doch eine Pfadpunkte-Prüfung ist nicht so einfach zusammenzusetzen. Deshalb folgende kleine Hilfestellung:

Code
var allObj = app.documents[0].allPageItems; 
var nObj = allObj.length;

for (var n=nObj-1; n>-1; n--) {
try {
if (allObj[n].paths[0].pathPoints.length > 4) {
allObj[n].remove();
}
}
catch (e) {
}
}

Damit werden sowohl geschlossene als auch offene Pfade erfasst. Sollten letztere erhalten bleiben, müsste eine Prüfung eingefügt werden.

Gruss, Hans

Objekte löschen anhand einer Farbe

faxinger
Beiträge gesamt: 241

6. Jun 2019, 15:10
Bewertung:

gelesen: 2068

Beitrag als Lesezeichen
Hallo Hans,

jawohl, genau jetzt bin ich am Ziel. Vielen Dank!!!!

Es werden alle Polygone gelöscht.


Perfekt.

Ganz liebe Grüße
faxinger

Objekte löschen anhand einer Farbe

Uwe Laubender
Beiträge gesamt: 4491

6. Jun 2019, 16:36
Bewertung:

gelesen: 2039

Beitrag als Lesezeichen
Hallo zusammen,

denkt auch mal drüber nach, dass ein Objekt mehrere Pfade enthalten kann.
*****
Mit herzlichem Gruß,
Uwe Laubender

Objekte löschen anhand einer Farbe

Hans Haesler
  
Beiträge gesamt: 5747

6. Jun 2019, 17:41
Bewertung:

gelesen: 2021

Beitrag als Lesezeichen
Hallo Uwe,

daran hatte ich (ganz kurz :-) gedacht. Aber auch, dass ...
1. Solche Objekte sehr selten sind;
2. der gute Faxinger ein entsprechendes Versagen schon melden wird.

Gruss, Hans

Objekte löschen anhand einer Farbe

Thomas Richard
Beiträge gesamt: 18148

7. Jun 2019, 11:06
Bewertung:

gelesen: 1933

Beitrag als Lesezeichen
Sobald in Kurven gewandelte Schriften vorkommen, sind mehrere Pfade in einem Objekt aber das 'A' und 'O'.

Sorry, den Buchstabenkalauer konnt ich jetzt nicht für mich behalten ;-)


MfG

Thomas


Und wenn dir geholfen wurde, hilf uns, dies auch weiterhin zu können.
http://www.hilfdirselbst.ch/info/

Objekte löschen anhand einer Farbe

Uwe Laubender
Beiträge gesamt: 4491

7. Jun 2019, 12:37
Bewertung:

gelesen: 2418

Beitrag als Lesezeichen
Hallo zusammen,
ich weiss ja nicht, ob ihr mal in die von faxinger angehängte IDML-Datei reingeschaut habt, aber dort sind vier Objekte vertreten. Mit jeweils 114 oder 77 Pfaden pro Objekt.

https://www.hilfdirselbst.ch/...ostatt_id=9333;t=def
*****
Mit herzlichem Gruß,
Uwe Laubender

Objekte löschen anhand einer Farbe

faxinger
Beiträge gesamt: 241

7. Jun 2019, 14:37
Bewertung:

gelesen: 2399

Beitrag als Lesezeichen
Hallo ihr Lieben,

nun ist der Fall eingetreten, dass sich manche Polygone nicht per Skript löschen lassen.

Siehe anhängliche idml:

Alle roten Polygone werden nicht gelöscht nur das blaue Polygon wird gelöscht.
Meine Fragen: wieso und warum?
Hier nochmal das Skript das hier zur Anwendung kommt:
Code
var allObj = app.documents[0].allPageItems;  
var nObj = allObj.length;

for (var n=nObj-1; n>-1; n--) {
try {
if (allObj[n].paths[0].pathPoints.length > 4) {
allObj[n].remove();
}
}
catch (e) {
}
}


Vielen Dank und schönes Wochenende
LG
faxinger

Objekte löschen anhand einer Farbe

Hans Haesler
  
Beiträge gesamt: 5747

7. Jun 2019, 15:00
Bewertung:

gelesen: 2392

Beitrag als Lesezeichen
Hallo faxinger,

Antwort auf: Siehe anhängliche idml:

Das erwähnte Dokument ist nicht angehängt.

Würdest Du es bitte nochmals anhängen und den Button "Anhang speichern" betätigen?

@ Uwe: Ja das erste IDML habe ich angeschaut. Mit der aktuellen Version des Scripts werden alle vier Objekte entfernt.

Gruss, Hans

Objekte löschen anhand einer Farbe

faxinger
Beiträge gesamt: 241

7. Jun 2019, 15:12
Bewertung:

gelesen: 2386

Beitrag als Lesezeichen
Danke für den Hinweis,

ja ich hatte nicht auf die Dateigrößenbeschränkung geachtet.


die Datei ist jetzt dabei.


LG
faxinger

Anhang:
test3.idml (271 KB)

Objekte löschen anhand einer Farbe

WernerPerplies
Beiträge gesamt: 2383

7. Jun 2019, 15:14
Bewertung:

gelesen: 2385

Beitrag als Lesezeichen
Hallo faxinger,

Zitat
catch (e) {
}


Immer wenn ich so etwas sehe, sträuben sich meine Haare, so etwas macht man einfach nicht!

Code
	}   
catch (e) {
if ((error.number == ?) || (error.number == ?) ||((error.number == ?))){
// diese Fälle dürfen hier übersprungen werden,
}
else{
// hier geht etwas fürchterlich schief!
alert(error.message);
}
}


Prüfe doch erst einmal, ob Fehler geworfen werden, und ob einer davon vielleicht die Antwort auf Deine Frage enthält!

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

Objekte löschen anhand einer Farbe

Hans Haesler
  
Beiträge gesamt: 5747

7. Jun 2019, 15:31
Bewertung:

gelesen: 2375

Beitrag als Lesezeichen
Hallo faxinger,

danke für die Datei. Eines der Objekte hat 46 Pfade!
Und der erste Pfad hat nur 3 Pfadpunkte. Deshalb wird das Objekt nicht entfernt.

Bevor ich versuche, eine Lösung zu finden, gehe ich jetzt auf eine Ausfahrt mit dem Rennrad.

Auf die Gefahr hin, dass mir Werner zuvorkommt ... :-))

Gruss, Hans

Objekte löschen anhand einer Farbe

faxinger
Beiträge gesamt: 241

7. Jun 2019, 15:32
Bewertung:

gelesen: 2374

Beitrag als Lesezeichen
Hallo,

Der Fehler lautet: "Ergebnis: undefined"

Wenn ich die pathPoints.length von 5 auf 2 vermindere werden alle Objekte gelöscht. Aber leider auch Objekte die nicht gelöscht werden sollen.

Es erschließt sich mir leider nicht wieso die Objekte die eigentlich wesentlich mehr als 5 Pfadpunkte haben erst bei einer Abfrage ob sie mehr als 2 Pfadpunkte haben gelöscht werden.

Objekte löschen anhand einer Farbe

faxinger
Beiträge gesamt: 241

7. Jun 2019, 15:36
Bewertung:

gelesen: 2372

Beitrag als Lesezeichen
Hallo Hans, du bist mir zuvorgekommen mit der Antwort.

Ah ich verstehe. Aber es sind doch verknüpfte Pfade. -> somit ein Objekt.

Viel Spass beim Radfahren.

LG
faxinger

Ps. ich bin dann auch mal weg.
Schönes WE.

Objekte löschen anhand einer Farbe

WernerPerplies
Beiträge gesamt: 2383

7. Jun 2019, 15:51
Bewertung:

gelesen: 2365

Beitrag als Lesezeichen
Hallo faxinger,

probiere es mal so:
Code
var allObj = app.documents[0].allPageItems;   
var nObj = allObj.length;

for (var n=nObj-1; n>-1; n--) {
try {
if ("paths" in allObj[n]){
for (var i = 0; i < allObj[n].paths.length; i++)
{
if (allObj[n].paths[i].pathPoints.length > 4) {
allObj[n].remove();
break;
}
}
}
}
catch (e) {
alert(e.message)
}
}


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

Objekte löschen anhand einer Farbe

Hans Haesler
  
Beiträge gesamt: 5747

8. Jun 2019, 10:17
Bewertung:

gelesen: 2276

Beitrag als Lesezeichen
Hallo Werner,

geprüft und für recht gut befunden :-)

Der geniale if-Test von "path" vermeidet eine Fehlermeldung, wenn das aktuelle Objekt eine Gruppe oder ein Bild ist.

Die 'alert(e.message)' meldet eigentlich nur gesperrte Objekte, weil sich diese nicht entfernen lassen. Doch sie könnten vorher entsperrt werden. Mit oder ohne vorhergehende Gesperrt-Prüfung. Das wird funktionieren. Aber nur wenn sich solche Objekte nicht in einer Gruppe befinden.

*****
Deshalb ein neuer Ansatz: Vorgängig die Ebenen entsperren und alle Gruppen auflösen. Somit wäre 'allPageItems' nicht mehr zwingend. Aber mit 'pageItems' erreicht man verankerte Rahmen nicht.

Code
// das aktuelle Dokument 
var curDoc = app.documents[0];

// die Ebenen vorsorglich entsperren
var nLayers = curDoc.layers.length;
for (var n=0; n<nLayers; n++) {
curDoc.layers[n].locked = false;
}

// eventuelle Gruppen zählen
var nGroups = curDoc.groups.length;
// eine Schleife, bis keine Gruppe mehr da ist
while (nGroups > 0) {
for (var g=nGroups-1; g>-1; g--) {
curDoc.groups[g].ungroup();
}
nGroups = curDoc.groups.length;
}

// die 'allPageItems' auflisten und zählen
var allObj = curDoc.allPageItems;
var nObj = allObj.length;

// eine Schleife durch die 'allPageItems'
for (var n=nObj-1; n>-1; n--) {
// das aktuelle Objekt
var curObj = allObj[n];
// prüfen, ob das Objekt einen Pfad hat
if ("paths" in curObj) {
// die Pfade zählen
var nPaths = curObj.paths.length;
// eine Schleife durch die Pfade
for (var p=0; p<nPaths; p++) {
// wenn der aktuelle Pfad mehr als vier Pfadpunkte hat ...
if (curObj.paths[p].pathPoints.length > 4) {
// ist der Rahmen gesperrt ...
if (curObj.locked == true) {
// ... den Rahmen entsperren
curObj.locked = false;
}
// ... das Objekt entfernen
try {
curObj.remove();
}
catch (e) {
alert (e.message);
}
// die Schleife verlassen
break;
}
}
}
}

Den try-Wickel braucht es eigentlich nicht mehr. Aber vielleicht ist in den zu behandelnden Dokumenten nichts gesperrt und die vorsorglichen Zeilen zum Entsperren der Ebenen und Entgruppieren werden entfernt. Aber dann ist doch irgendwo etwas gesperrt.

Es kann auch sein, dass gewisse Objekte nicht entfernt werden dürfen. Dann kann man sie sperren und die Zeilen 36 bis 40 des Scripts entfernen. Oder den Test benutzen und nur löschen, wenn das Objekt nicht gesperrt ist.

Noch nicht gelöst ist das von Thomas Richard gemeldete Problem mit in Kurven gewandelten Schriften. Aber vielleicht kommen solche gar nicht vor. Zudem tritt es nur auf, wenn diese Objekte nicht in einem Textrahmen stecken.

Gruss, Hans

Objekte löschen anhand einer Farbe

WernerPerplies
Beiträge gesamt: 2383

8. Jun 2019, 10:38
Bewertung:

gelesen: 2265

Beitrag als Lesezeichen
Hallo Hans,

noch eine kurze Anmerkung zu Deinem "try-Wickel".

Meiner Meinung nach sollte immer eine Fehlerbehandlung vorgenommen werden, damit man überhaupt merkt, dass ein unerwarteter Fehler aufgetreten ist.

Erwartete Fehlermöglickeiten sollten durch eine vorausschauende Prüfung, wie z. B. oben mit der "Path-Prüfung" ausgeschlossen werden, also die von Dir genannte Fehlermöglichkeit des gesperrten Seitenobjektes.

In seltenen Fällen lässt sich in InDesign keine vorausschauende Prüfung vornehmen, dann landet das Skript in der Fehlerbehandlungsroutine, und man kann mit Hilfe der Fehlermeldung/-nummer ermitteln, ob in diesen wenigen Ausnahmefällen der Fehler ignoriert werden darf.

Try-Catch kostet ohne Auftreten eines Fehles extrem wenig Zeit, bei Auftreten eines Fehlers steigt die Laufzeit eines Skriptes erheblich an.

Auch deswegen ist leere Fehlerbehandlungsroutine (Catchzweig) ein Unding!

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

Objekte löschen anhand einer Farbe

Uwe Laubender
Beiträge gesamt: 4491

8. Jun 2019, 14:19
Bewertung:

gelesen: 2235

Beitrag als Lesezeichen
Antwort auf: …Deshalb ein neuer Ansatz: Vorgängig die Ebenen entsperren und alle Gruppen auflösen.


Hallo Hans,

alle Gruppen auflösen?
Vorsicht, das kann unschöne Auswirkungen haben.

Welche Probleme hast Du genau mit gesperrten Objekten?
Wann lassen sich gesperrte Objekte im Schleifendurchgang mit allPageItems nicht entsperren?
*****
Mit herzlichem Gruß,
Uwe Laubender

Objekte löschen anhand einer Farbe

Hans Haesler
  
Beiträge gesamt: 5747

8. Jun 2019, 14:52
Bewertung:

gelesen: 2226

Beitrag als Lesezeichen
Hallo Werner,

ich bin unterwegs. Werde mich im Laufe des Abends nochmals melden.

Gruss, Hans

Objekte löschen anhand einer Farbe

Hans Haesler
  
Beiträge gesamt: 5747

8. Jun 2019, 14:58
Bewertung:

gelesen: 2223

Beitrag als Lesezeichen
Hallo Uwe,

nur kurz: Wenn sich ein zu entfernendes Objekt in einer gesperrten Gruppe befindet, dann kann es nicht gelöscht werden. Ausprobieren! :-)

Habe Allerlei versucht, aber es nicht geschafft.

Abgesehen davon wird Faxinger wissen, ob das Auflösen notwendig ist.

Gruss, Hans

Objekte löschen anhand einer Farbe

Uwe Laubender
Beiträge gesamt: 4491

8. Jun 2019, 19:29
Bewertung:

gelesen: 2193

Beitrag als Lesezeichen
Hallo Hans,
ok. Stimmt.

Gilt beispielsweise auch für Objekte, die in einen gesperrten Grafikrahmen eingefügt wurden.

Was hilft, ohne dass irgendwelche Gruppen auseinandergenommen werden müssen: Zunächst mal den allPageItems array durchgehen und alle pageItems.locked auf false setzen.

Code
var doc = app.documents[0]; 
var allPageItemsArray = doc.allPageItems;
for( var n=0; n<allPageItemsArray.length; n++ )
{
try{ allPageItemsArray[n].locked = false }catch(e){};
};


Und in diesem Fall sollte es kein Problem machen, wenn der catch leer bleibt.
Ästhetisch unbefriedigend, meinetwegen…
*****
Mit herzlichem Gruß,
Uwe Laubender

Objekte löschen anhand einer Farbe

WernerPerplies
Beiträge gesamt: 2383

8. Jun 2019, 20:20
Bewertung:

gelesen: 2528

Beitrag als Lesezeichen
Moin Uwe,

grrrrrr! :-)

Zitat Und in diesem Fall sollte es kein Problem machen, wenn der catch leer bleibt.

Warum machst Du dann try-catch?

Das hat doch nicht mit Ästhetik zu tun!
Code
var doc = app.documents[0];  
var allPageItemsArray = doc.allPageItems;
for( var n=0; n<allPageItemsArray.length; n++ )
{
try{ alxlPageItemsArray[n].locked = false }catch(e){};
};

Lass doch mal dieses leicht modifizierte Skript laufen!

Und müsste man den Lock-Status nicht wieder herstellen?
Code
var /*Document*/doc = app.documents[0], /*Array*/allPageItemsArray = doc.allPageItems, 
/*Int*/l = allPageItemsArray.length, /*Int*/c = -1, /*Array*/stateChanged = new Array(l);
for( var n=0; n<l; n++ )
{
// unlock and remember state
try{
if (allPageItemsArray[n].locked){
allPageItemsArray[n].locked = false;
stateChanged[++c] = allPageItemsArray[n];
}
}
catch(error){
// Error: Diese Eigenschaft ist im aktuellen Status nicht zutreffend.
if (error.number != 30615){
alert(error.message);
}
}
}
// restore state
for (i = 0; i =< c; i++){
stateChanged[i] = true;
}


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

Objekte löschen anhand einer Farbe

Hans Haesler
  
Beiträge gesamt: 5747

8. Jun 2019, 23:18
Bewertung:

gelesen: 2511

Beitrag als Lesezeichen
Hallo Werner,

Antwort auf: noch eine kurze Anmerkung zu Deinem "try-Wickel".

Eine Fehlerbehandlung immer vornehmen? Nicht unbedingt. Das hängt von der Aufgabe ab.

Zunächst versuche ich, im voraus zu prüfen, ob die Voraussetzungen gegeben sind. Ist dabei etwas nicht wie es sollte, wird der Anwender informiert, bevor das Script die eigentliche Ausführung macht.

Wenn dann letztere läuft, ist es meistens störend, wenn der Anwender bei jedem Fehler informiert wird. Deshalb ziehe ich es vor, bei einem Fehler eine Zählervariable hochzuzählen. Und den Anwender am Schluss zu informieren, wieviele Probleme und welcher Art aufgetreten sind.

*****
Übrigens: Bei der vorliegenden Aufgabe konnte die Fehlerbehandlung nicht auf das Versagen hinweisen, als die Pfade-Monster-Rahmen nicht entfernt wurden.

*****
Es gibt aber auch Fälle, in welchen dem Anwender absichtlich nicht gesagt wird, dass etwa nicht klappte. Ich habe hier ein JavaScript, welches aktuell 26'486 Zeilen umfasst. Es wird vom Anwender gestartet, um die gelieferten Fernseh-Programm-Texte (welche beim Export aus einer Datenbank mit InDesign-Tags versehen werden) in die vorbereiteten Textrahmen zu importieren. Und gleich darauf werden sie editiert: Je nach Titel der Sendung wird die Beschreibung (oder die ganze Sendung) entfernt. Öfters muss die Numerierung von Serien hinter den Untertitel verschoben werden. Oder es ist eine Zusammenlegung von Sendungen mit dem gleichen Titel gewünscht, um Platz zu gewinnen usw. usf.

Es kommt ab und an vor, dass die Konstruktion eines Abschnitts nicht mehr der bisherigen entspricht. Im "schlimmsten" Fall ergibt das einen Fehler und die bisherige Korrektur wird nicht gemacht. Der Anwender bemerkt dies immer und korrigiert von Hand. Er ist das gewohnt, weil sowieso hier und dort eingegriffen werden muss.

Im Script, welches ich benutzte, um das Ergebnis zu prüfen, enthält jeder der 43 'catch'-Abschnitte zwei Alerts: der erste meldet den Fehler, der zweite zeigt den Inhalt des betroffenen Absatzes an. Das erleichtert die Anpassung des Scripts enorm.

In der Version. welche in der Produktion benutzt wird, sind die Alerts entfernt. Die Meldungen kämen zwar selten, wären aber störend. Vor allem im Batch-Betrieb, während welchem die Texte in die Dokumente einer ganzen Woche geladen werden.

Gruss, Hans

Objekte löschen anhand einer Farbe

Hans Haesler
  
Beiträge gesamt: 5747

8. Jun 2019, 23:19
Bewertung:

gelesen: 2509

Beitrag als Lesezeichen
Hallo Uwe,

danke für Deinen Input. Werde diesen Ansatz in die nächste Version des Scripts übernehmen.

Den ursprünglichen Status wiederherstellen? Nicht notwendig. Es sei denn, Faxinger wünscht es.

Gruss, Hans

Objekte löschen anhand einer Farbe

WernerPerplies
Beiträge gesamt: 2383

9. Jun 2019, 08:43
Bewertung:

gelesen: 2468

Beitrag als Lesezeichen
Hallo Hans,

ich habe das angefangen, und hoffe, dass wir das hier zu Ende bringen. Ist ja alles Off-Topic!

Aber ich bleibe dabei, eine leerer Catch-Zweig ist ein schwerer Programmierfehler.

Wo wir uns nicht ganz einig sind, ist offensichtlich, dass wir beide etwas unterschiedliches unter Fehlerbehandlung verstehen.

Was ist also eine Fehlerbehandlung?

Zuerst einmal, als Programmierer sollte man vermeiden, dass überhaupt Fehler auftreten:

Code
Also möglichst nicht sagen - Dieser Fall ist unwahrscheinlich, sondern auf eine Situation vorausschauend reagieren, also hier z. B.: 

1. Alle zu untersuchenden Objekte in einer Liste sammeln
2. Schleife über diese Liste
2.1. Ist Objekt gültig -> In der Regel Test auf null
2.1.1 nein, weiter mit nächstem Objekt
2.1.2 hat das Objekt eine oder mehrere Eigenschaften, die dass gewünschte Objekt nicht haben soll?
2.1.2.1 nein, weiter mit nächsten Objekt
2.2.2.2 ja, hat das Objekt alle gewünschten Eigenschaften
2.2.2.2.1 nein, weiter mit dem nächsten Objekt
2.2.2.2.2 ja, die gewünschten Aktionen (hier löschen) ausführen.

Jetzt kann ja eigentlich nicht mehr schiefgehen, oder?

Doch:
Testumgebungen sind selten vollständig, es können unerwartete Situationen eintreten, mit denen ein Skript kontrolliert umgehen muss.

Mögliche Fehlersituationen:
1. ein simpler Programierfehler in einem Programmzweig, der während der Testphase nicht durchlaufen wurde:
1.1. absolutes Abbruch-Kriterium, möglichst exakte Fehlerbeschreibung in eine Protokolldatei, Alert mit diesem Eintrag
1.2. Abbruch nicht notwendig, möglichst exakte Fehlerbeschreibung in eine Protokolldatei, Fehlerzähler inkrementieren.

Anwender sollte diese Fehlerbeschreibung (Log-Datei!) an den Programmierer schicken.
2. Runtime-Fehler:
2.1 nicht vorhersehbare unkritische Fehlersituation, die das Skriptergebnis nicht beeinflusst:
2.1.1 möglichst exakte Fehlerbeschreibung (als Warnung) in eine Protokolldatei
2.2 nicht vorhersehbare unkritische Fehlersituation, die das Skriptergebnis beeinflusst:
2.2.2 möglichst exakte Fehlerbeschreibung (als Fehler) in eine Protokolldatei, Fehlerzähler inkrementieren.
2.3. gefangener unkritischer Fehler, der eigentlich kein Fehler, sondern eine Info ist:
ignorieren.

Ok, ich hoffe ich habe nichts übersehen.


Zitat Wenn dann letztere läuft, ist es meistens störend, wenn der Anwender bei jedem Fehler informiert wird. Deshalb ziehe ich es vor, bei einem Fehler eine Zählervariable hochzuzählen. Und den Anwender am Schluss zu informieren, wieviele Probleme und welcher Art aufgetreten sind

Ja, das mache ich auch, s. o..

Zitat Es kommt ab und an vor, dass die Konstruktion eines Abschnitts nicht mehr der bisherigen entspricht. Im "schlimmsten" Fall ergibt das einen Fehler und die bisherige Korrektur wird nicht gemacht. Der Anwender bemerkt dies immer und korrigiert von Hand. Er ist das gewohnt, weil sowieso hier und dort eingegriffen werden muss.

Na ja, jeder Anwender sollte das Ergebnis prüfen, aber sollte man ihm nicht die Arbeit erleichtern, in dem man auf erkannte Fehler hinweist?

Zitat Im Script, welches ich benutzte, um das Ergebnis zu prüfen, enthält jeder der 43 'catch'-Abschnitte zwei Alerts: der erste meldet den Fehler, der zweite zeigt den Inhalt des betroffenen Absatzes an. Das erleichtert die Anpassung des Scripts enorm.

Du meinst während der Entwicklungsphase?

Ich baue immer die komplette Fehlernehandlung ein, setzte aber während der Entwicklung Breakpoints -> $.bp(true) in den Catch-Zweig, dann hält das Skript an, ich kann in der Konsole die Situation untersuchen und testweise Korrekturen vornehmen.

Zitat In der Version. welche in der Produktion benutzt wird, sind die Alerts entfernt. Die Meldungen kämen zwar selten, wären aber störend. Vor allem im Batch-Betrieb, während welchem die Texte in die Dokumente einer ganzen Woche geladen werden.



Da stimme ich Dir zu, Alerts gibt es nur in absoluten Abbruch-Situationen.

Die neueste Version meines WpsCreateAnchoredFrames-Skriptes sammelt Fundstellen von bestimmten Fehlersituaionen in einer DropDown-Liste, aus der der Anwender direkt an die problematischen Stellen springen kann. Dies funktioniert natürlich auch über mehrere InDesign-Dateien.

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

Objekte löschen anhand einer Farbe

Hans Haesler
  
Beiträge gesamt: 5747

9. Jun 2019, 10:39
Bewertung:

gelesen: 2452

Beitrag als Lesezeichen
Hallo Werner,

danke für Deine Ausführungen.

Antwort auf: (...) aber sollte man ihm nicht die Arbeit erleichtern, in dem man auf erkannte Fehler hinweist?

Das wäre in unserem Fall zu umständlich. Ein nichtentfernter Absatz, z.B., ist offensichtlich. Und rasch ausgewählt und gelöscht.

Antwort auf: Du meinst während der Entwicklungsphase?

Das erwähnte Script muss periodisch an neue Sendungen (vor allem Serien) angepasst werden. Dazu habe ich meine Testversion. Sobald die Anpassungen funktionieren, mache ich eine Kopie für die Produktion: Die Zeile aktivieren, welche den Pfad zu den Textdateien auf dem Server enthält. Und jene auskommentieren, welche zum meinem lokalen Verzeichnis führt. Und eben die Auswertungen eventueller Fehlermeldungen entfernen.

Ich habe auch ein kurzes Testscript, mit welchem eventuelle Varianten der Zusammensetzung getestet werden können. Je nach Länge des Titels und des Untertitels wird die Numerierung hinter den Untertitel verschoben oder auch nicht. Eventuell wird das Wort "Serie" entfernt, um eine Zeile zu sparen.
Mit diesem Script können auch die Zusammenlegungen von aufeinanderfolgenden Serien getestet werden. Die Numerierung, z.B. (5/18/24), verschieben, ab der zweiten bis zur letzten der Titel entfernen, der Uhrzeit wird "9 pt" zuweisen und die Returns (ausser dem letzten) in Zeilenschaltungen verwandeln, damit der Einzug stimmt.
Erschwert wird das Ganze durch ein Piktogramm, welches unveröffentlichte Sendungen kennzeichnet. Falls eingefügt, hat der Abschnitt einen Absatz mehr. Je nach Platz muss das Pikto hinter den Titel verschoben werden.

Gruss, Hans

Objekte löschen anhand einer Farbe

Hans Haesler
  
Beiträge gesamt: 5747

9. Jun 2019, 10:43
Bewertung: |||

gelesen: 2451

Beitrag als Lesezeichen
Hallo faxinger,

und hier eine neue Version. Die Gruppen werden nicht aufgelöst. Das von Uwe vorgeschlagene Entsperren wird nur bei Gruppen vorgenommen.

Code
//PolygonsEntfernen_CC_03d.js 
//© 08.06.2019 / Hans Haesler, Chatelard 52, CH-1018 Lausanne
//Versucht, Polygone zu entfernen

/*Credits:
– Danke an Werner Perplies für 'if ("paths" in curObj)'
– Uwe Laubender hatte die Idee zum Entsperren der Objekte
*/

// das aktuelle Dokument
var curDoc = app.documents[0];

// die Ebenen vorsorglich entsperren
var nLayers = curDoc.layers.length;
for (var n=0; n<nLayers; n++) {
curDoc.layers[n].locked = false;
}

// die 'allPageItems' auflisten und zählen
var allObj = curDoc.allPageItems;
var nObj = allObj.length;

// eventuell gesperrte Gruppen entsperren
for (var n=0; n<nObj; n++) {
var curObj = allObj[n];
if (curObj.constructor.name == "Group") {
if (curObj.locked == true) {
try {
curObj.locked = false;
}
catch (e) {
alert (e.message);
}
}
}
}

// eine Schleife durch die 'allPageItems'
for (var n=nObj-1; n>-1; n--) {
// das aktuelle Objekt
var curObj = allObj[n];
// prüfen, ob das Objekt einen Pfad hat
if ("paths" in curObj) {
// die Pfade zählen
var nPaths = curObj.paths.length;
// eine Schleife durch die Pfade
for (var p=0; p<nPaths; p++) {
// wenn der aktuelle Pfad mehr als vier Pfadpunkte hat ...
if (curObj.paths[p].pathPoints.length > 4) {
// ist der Rahmen gesperrt ...
if (curObj.locked == true) {
// ... den Rahmen entsperren
curObj.locked = false;
}
// ... das Objekt entfernen
try {
curObj.remove();
}
catch (e) {
alert (e.message);
}
// die Schleife verlassen
break;
}
}
}
}

Die Sperrung nichtgruppierter Objekte wird vor dem Entfernen aufgehoben.
Sollten weder Gruppen noch Sperrungen vorkommen, kannst Du das Script vereinfachen.

Gruss, Hans

Objekte löschen anhand einer Farbe

Uwe Laubender
Beiträge gesamt: 4491

9. Jun 2019, 10:45
Bewertung:

gelesen: 2445

Beitrag als Lesezeichen
Guten Morgen Werner,
nur auf die Schnelle, Dein Skript zur Wiederherstellung des Zustands wirft einen Fehler:
"unclosed token". Habe noch nicht herausgefunden, weshalb.

Beispieldatei, bei der das passiert:

Code
var doc = app.documents.add(); 
var rectOne = doc.rectangles.add( geometricBounds : [0,0,50,50] );
var rectTwo = doc.rectangles.add( geometricBounds : [50,50,100,100] );
var groupOne = doc.groups.add([rectOne,rectTwo]);
groupOne.locked = true;



Dein Skript umgeschrieben und ergänzt.
Für den Fall, dass mittlerweile Elemente gelöscht wurden:

Code
var doc = app.documents[0]; 
var allPageItemsArray = doc.allPageItems;
var stateChangedIDs = [];
var e;

for( var n=0;n<allPageItemsArray.length;n++ )
{
try
{
if( allPageItemsArray[n].locked )
{
allPageItemsArray[n].locked = false;
stateChangedIDs[ stateChangedIDs.length++ ] = allPageItemsArray[n].id;
};
}catch(e)
{
if( e.number != 30615 )
{ alert( "ERROR: "+e.message ) }

};
};

for( var n=0; n<stateChangedIDs.length; n++ )
{
var itemToChange = doc.pageItems.itemByID( stateChangedIDs[n] );
if( !itemToChange.isValid ){ continue };
itemToChange.locked = true;
};

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

Objekte löschen anhand einer Farbe

WernerPerplies
Beiträge gesamt: 2383

9. Jun 2019, 10:51
Bewertung:

gelesen: 2441

Beitrag als Lesezeichen
Moin Uwe,

Zitat nur auf die Schnelle, Dein Skript zur Wiederherstellung des Zustands wirft einen Fehler:
"unclosed token". Habe noch nicht herausgefunden, weshalb.


Vielleicht ein Kopierfehler?

Dein Version gefällt mir, besonders die Fehlerbehandlung! :-)

Man könnte allerdings noch ein try/catch über das gesamte Skript legen. :-)

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

Objekte löschen anhand einer Farbe

faxinger
Beiträge gesamt: 241

11. Jun 2019, 16:59
Bewertung:

gelesen: 2254

Beitrag als Lesezeichen
Hallo ihr fleißigen Skripter,

vielen Dank für die zahlreichen Antworten. Ich kann nur staunen.

Das skript von Hans funktioniert wunderbar, vielen Dank dafür und auch nochmals danke an alle anderen die sich so intensiv mit der Problematik auseinandergesetzt haben. Dachte nicht dass das Thema so große Wellen schlägt.

Ganz liebe Grüße
faxinger

Objekte löschen anhand einer Farbe

faxinger
Beiträge gesamt: 241

3. Jul 2019, 09:01
Bewertung:

gelesen: 1513

Beitrag als Lesezeichen
Hallo Hans,

mir ist etwas bei diesem Skript aufgefallen: Wie du auch schreibst werden die Gruppen nicht aufgelöst.

Das ist ja bei Gruppierungen von mehr als 2 Objekten wovon eines (nämlich das Objekt mit den vielen Pfadpunkten) gelöscht wird auch so gewollt.

Wenn ich aber z.B nur 2 Objekte in meiner Gruppe habe und eines davon gelöscht wird, habe ich eine Gruppe bestehend aus einem Objekt. Ich wusste gar nicht dass so etwas überhaupt möglich ist.

Kann man das umgehen?

LG
faxinger

Objekte löschen anhand einer Farbe

Hans Haesler
  
Beiträge gesamt: 5747

3. Jul 2019, 09:45
Bewertung:

gelesen: 1504

Beitrag als Lesezeichen
Hallo faxinger,

ja dem ist so. Wenn nach dem Entfernen eines Objekts (oder mehreren) einer Gruppe nur noch ein Objekt übrigbleibt, ist dieses immer noch als "Gruppe" definert.

Dieser Zustand kann entweder manuell aufgehoben werden oder durch das Ergänzen des Scripts durch folgende Zeilen:

Code
// die Gruppen feststellen 
var allGroups = curDoc.groups;
var nGroups = allGroups.length;
// eine Schleife durch die Gruppen
for (var g=nGroups-1; g>-1; g--) {
var curGroup = allGroups[g];
// wenn die aktuelle Gruppe nur *ein* 'pageItem' enthält ...
if (curGroup.pageItems.length == 1) {
// ... die Gruppierung aufheben
curGroup.ungroup();
}
}

Gruss, Hans

Objekte löschen anhand einer Farbe

faxinger
Beiträge gesamt: 241

3. Jul 2019, 09:58
Bewertung:

gelesen: 1493

Beitrag als Lesezeichen
Hallo Hans,

was lange währt wird endlich gut. :-)


Vielen vielen Dank.

Schönen Tag noch.


LG
faxinger