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

8. Jun 2019, 20:20
Beitrag # 46 von 57
Beitrag ID: #570645
Bewertung:
(6030 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;
}



als Antwort auf: [#570644]
X

Objekte löschen anhand einer Farbe

Hans Haesler
  
Beiträge gesamt: 5826

8. Jun 2019, 23:18
Beitrag # 47 von 57
Beitrag ID: #570646
Bewertung:
(6013 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: 5826

8. Jun 2019, 23:19
Beitrag # 48 von 57
Beitrag ID: #570647
Bewertung:
(6011 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: 2762

9. Jun 2019, 08:43
Beitrag # 49 von 57
Beitrag ID: #570648
Bewertung:
(5970 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.


als Antwort auf: [#570646]

Objekte löschen anhand einer Farbe

Hans Haesler
  
Beiträge gesamt: 5826

9. Jun 2019, 10:39
Beitrag # 50 von 57
Beitrag ID: #570649
Bewertung:
(5954 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: 5826

9. Jun 2019, 10:43
Beitrag # 51 von 57
Beitrag ID: #570650
Bewertung: |||
(5953 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: 5316

9. Jun 2019, 10:45
Beitrag # 52 von 57
Beitrag ID: #570651
Bewertung:
(5947 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;
};



als Antwort auf: [#570645]

Objekte löschen anhand einer Farbe

WernerPerplies
Beiträge gesamt: 2762

9. Jun 2019, 10:51
Beitrag # 53 von 57
Beitrag ID: #570652
Bewertung:
(5943 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. :-)


als Antwort auf: [#570651]

Objekte löschen anhand einer Farbe

faxinger
Beiträge gesamt: 246

11. Jun 2019, 16:59
Beitrag # 54 von 57
Beitrag ID: #570667
Bewertung:
(5756 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]

Objekte löschen anhand einer Farbe

faxinger
Beiträge gesamt: 246

3. Jul 2019, 09:01
Beitrag # 55 von 57
Beitrag ID: #570915
Bewertung:
(5015 mal gelesen)
URL zum Beitrag
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


als Antwort auf: [#570650]

Objekte löschen anhand einer Farbe

Hans Haesler
  
Beiträge gesamt: 5826

3. Jul 2019, 09:45
Beitrag # 56 von 57
Beitrag ID: #570919
Bewertung:
(5006 mal gelesen)
URL zum Beitrag
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


als Antwort auf: [#570915]

Objekte löschen anhand einer Farbe

faxinger
Beiträge gesamt: 246

3. Jul 2019, 09:58
Beitrag # 57 von 57
Beitrag ID: #570921
Bewertung:
(4995 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

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


Vielen vielen Dank.

Schönen Tag noch.


LG
faxinger


als Antwort auf: [#570919]
X