[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt Objekte löschen anhand einer Farbe

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

Objekte löschen anhand einer Farbe

WernerPerplies
Beiträge gesamt: 2339

8. Jun 2019, 20:20
Beitrag # 46 von 54
Beitrag ID: #570645
Bewertung:
(816 mal gelesen)
URL zum Beitrag
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


als Antwort auf: [#570644]
Hier Klicken X

Objekte löschen anhand einer Farbe

Hans Haesler
  
Beiträge gesamt: 5730

8. Jun 2019, 23:18
Beitrag # 47 von 54
Beitrag ID: #570646
Bewertung:
(799 mal gelesen)
URL zum Beitrag
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


als Antwort auf: [#570638]

Objekte löschen anhand einer Farbe

Hans Haesler
  
Beiträge gesamt: 5730

8. Jun 2019, 23:19
Beitrag # 48 von 54
Beitrag ID: #570647
Bewertung:
(797 mal gelesen)
URL zum Beitrag
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


als Antwort auf: [#570644]

Objekte löschen anhand einer Farbe

WernerPerplies
Beiträge gesamt: 2339

9. Jun 2019, 08:43
Beitrag # 49 von 54
Beitrag ID: #570648
Bewertung:
(756 mal gelesen)
URL zum Beitrag
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


als Antwort auf: [#570646]

Objekte löschen anhand einer Farbe

Hans Haesler
  
Beiträge gesamt: 5730

9. Jun 2019, 10:39
Beitrag # 50 von 54
Beitrag ID: #570649
Bewertung:
(740 mal gelesen)
URL zum Beitrag
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


als Antwort auf: [#570648]

Objekte löschen anhand einer Farbe

Hans Haesler
  
Beiträge gesamt: 5730

9. Jun 2019, 10:43
Beitrag # 51 von 54
Beitrag ID: #570650
Bewertung: |||
(738 mal gelesen)
URL zum Beitrag
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


als Antwort auf: [#570635]

Objekte löschen anhand einer Farbe

Uwe Laubender
Beiträge gesamt: 4416

9. Jun 2019, 10:45
Beitrag # 52 von 54
Beitrag ID: #570651
Bewertung:
(732 mal gelesen)
URL zum Beitrag
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


als Antwort auf: [#570645]

Objekte löschen anhand einer Farbe

WernerPerplies
Beiträge gesamt: 2339

9. Jun 2019, 10:51
Beitrag # 53 von 54
Beitrag ID: #570652
Bewertung:
(728 mal gelesen)
URL zum Beitrag
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


als Antwort auf: [#570651]

Objekte löschen anhand einer Farbe

faxinger
Beiträge gesamt: 218

11. Jun 2019, 16:59
Beitrag # 54 von 54
Beitrag ID: #570667
Bewertung:
(541 mal gelesen)
URL zum Beitrag
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


als Antwort auf: [#570650]
X

Aktuell

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
24.06.2019 - 25.06.2019

Frankfurt/M
Montag, 24. Juni 2019, 09.30 Uhr - Dienstag, 25. 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/

Veranstaltungen
26.06.2019

Frankfurt/M
Mittwoch, 26. Juni 2019, 09.30 Uhr

Schulung, Seminar

Mit WordPress ist es möglich, ohne große Kosten und ohne Programmierkenntnisse eine ansprechende Webseite zu erstellen, die allen Anforderungen des modernen Webdesigns – besonders unter Beachtung der Suchmaschinenoptimierung (SEO) – gerecht wird. Unsere Schulung Webdesign mit WordPress zeigt Ihnen, wie Sie hochwertige Webseiten mit WordPress erstellen.

Ja

Organisator: Cleverprinting.de

https://www.cleverprinting.de/schulungen/schulung-webdesign-mit-wordpress/

Suchmaschinen-optimiertes Webdesign mit WordPress