[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt Schwierigkeit mit gradientStops

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

Schwierigkeit mit gradientStops

peterhenrich
Beiträge gesamt: 138

13. Mai 2014, 14:22
Beitrag # 1 von 8
Bewertung:
(2366 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo,

und schon wieder ein Problem, dass ich mir nicht erklären kann. Zum Testen dieses Scripts muss man im ID nur irgendein Rechteckaufziehen, dessen fillColor irgendein Verlauf sein muss. Danach mit dem Pfeil das Rechteck markieren und das Script starten:

Code
#target indesign; 

var selSwatch = app.activeDocument.selection[0].fillColor;
var output = "";
if(selSwatch.hasOwnProperty("gradientStops")) { //handelt es sich um einen Verlauf?
if(selSwatch.gradientStops.length > 0) { //sind überhaupt gradientStops vorhanden?
for(var i = 0; i < selSwatch.gradientStops.length; i++) {

if(selSwatch.gradientStops[i].hasOwnProperty("location")) { //hat der gS die Eigenschaft "location"?
if(selSwatch.gradientStops[i].location != "undefined") { //ist wohl auch nicht undefiniert
output += selSwatch.gradientStops[i].location + " / ";
}
}

if(selSwatch.gradientStops[i].hasOwnProperty("stopColor")) { //hat der gS die Eigenschaft "midpoint"?
if(selSwatch.gradientStops[i].stopColor != "undefined") { //ist wohl auch nicht undefiniert
output += selSwatch.gradientStops[i].stopColor.name + " / ";
}
}

if(selSwatch.gradientStops[i].hasOwnProperty("midpoint")) { //hat der gS die Eigenschaft "midpoint"?
if(selSwatch.gradientStops[i].midpoint != "undefined") { //ist wohl auch nicht undefiniert
output += selSwatch.gradientStops[i].midpoint + " / "; //hier steigt er aus
}
}

}
}
}


Ich bekomme immer bei der letzten Anfrage den Fehler:
„Diese Eigenschaft ist im aktuellen Status nicht zutreffend.“

Ich frage doch vorher ab, ob die Eigenschaft vorhanden und definiert ist. Wieso schmeißt er da einen Fehler?

Fragt sich

Peter
X

Schwierigkeit mit gradientStops

Uwe Laubender
Beiträge gesamt: 4853

13. Mai 2014, 15:11
Beitrag # 2 von 8
Beitrag ID: #527159
Bewertung:
(2344 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo, Peter!

Vielleicht hilft Dir das bereits weiter:

Bei einem Verlauf der über zwei gradientStops verfügt, ist die Eigenschaft midpoint beim ersten nicht zutreffend, beim zweiten jedoch definiert.

Teste mal:

Code
$.writeln(app.selection[0].fillColor.gradientStops[1].midpoint); 

//Ergebnis: 50


Ich würde mal davon ausgehen, dass die Eigenschaft midpoint beim ersten der gradientStops NIE zutreffend ist. So kommst Du also an alle midpoints:

Code
var myGradient = app.selection[0].fillColor; 

for(var n=1;n<myGradient.gradientStops.length;n++){
$.writeln(n+"\t"+myGradient.gradientStops[n].midpoint);
};

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


als Antwort auf: [#527157]

Schwierigkeit mit gradientStops

peterhenrich
Beiträge gesamt: 138

13. Mai 2014, 17:33
Beitrag # 3 von 8
Beitrag ID: #527172
Bewertung:
(2305 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Uwe,

danke für die Info. Ich habe das so umgesetzt.

Komisch, aber man wird damit leben müssen, dass man abfragen kann, dass es das Teil gibt und dass es nicht undefiniert ist, es dann aber bei einem Zugriff einem um die Ohren fliegt.

Gruß

Peter


als Antwort auf: [#527159]

Schwierigkeit mit gradientStops

Gerald Singelmann
  
Beiträge gesamt: 6247

13. Mai 2014, 22:11
Beitrag # 4 von 8
Beitrag ID: #527185
Bewertung:
(2268 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Die Abfrage
Code
.midpoint != "undefined" 

testet, ob das Objekt .midpoint ein String ist, in dem die Zeichenfolge "u" gefolgt von "n" usw. steht.

Testen gegen undefined bitte ohne Anführungsstriche.

Der Test, ob man ein InDesign-Objekt verwenden kann, ist übrigens object.isValid.

In diesem Fall müsste also (ohne das jetzt getestet zu haben)
Code
if(selSwatch.gradientStops[i].midpoint.isValid) { 

zum Erfolg führen.


als Antwort auf: [#527157]

Schwierigkeit mit gradientStops

peterhenrich
Beiträge gesamt: 138

14. Mai 2014, 06:59
Beitrag # 5 von 8
Beitrag ID: #527187
Bewertung:
(2209 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Gerd,

vielen Dank für die Analyse. Ich habe allerdings beim Übertragen ein Fehler gemacht. Das Beispielscript oben vergleicht wirklich den String, in meinem komplexeren Original, das ich der Verständlichhkeit halber zusammengestrichen habe, habe ich mit typeof verglichen:

Code
if(typeof selSwatch.gradientStops[i].midpoint != "undefined") 

Hat aber auch bloß nicht funktioniert :-)

Deine Alternative ...

Code
if(selSwatch.gradientStops[i].midpoint.isValid) { 


... habe ich getestet und sie funktioniert auch nicht.

Es führt m. E. kein Weg daran vorbei, entweder wie von Uwe vorgeschlagen bei 1 anfangen zu zählen, oder wenn das wie bei mir wegen anderer zu setzender Parameter nicht möglich ist, beim midpoint-Setzen abzufragen, ob der Zähler gleich 0 ist und dann eben den Wert nicht zu setzen.

Ist aber schon komisch, dass es die Eigenschaft gibt, aber weder typeof = "undefined" oder isValid weiterhelfen, oder?

Gruß

Peter


als Antwort auf: [#527185]
(Dieser Beitrag wurde von peterhenrich am 14. Mai 2014, 07:00 geändert)

Schwierigkeit mit gradientStops

WernerPerplies
Beiträge gesamt: 2552

14. Mai 2014, 07:05
Beitrag # 6 von 8
Beitrag ID: #527188
Bewertung:
(2207 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Guten Tag Herr Singelmann,

Zitat testet, ob das Objekt .midpoint ein String ist, in dem die Zeichenfolge "u" gefolgt von "n" usw. steht.

Testen gegen undefined bitte ohne Anführungsstriche.

Da haben Sie natürlich recht.

Zitat Der Test, ob man ein InDesign-Objekt verwenden kann, ist übrigens object.isValid.

Auch da haben Sie recht.

Allerdings ist die isValid eine Eigenschaft eines InDesign-Objektes und deshalb

Zitat In diesem Fall müsste also (ohne das jetzt getestet zu haben)
Code

if(selSwatch.gradientStops[Schleifenvariable:i].midpoint.isValid) {


zum Erfolg führen.

haben Sie hier gleich zweimal unrecht.

1. Die Eigenschaft midpoint ist Float und hat deshalb keine Eigenschaft isValid.
Zulässige Abfragen wären deshalb == undefined oder == null wenn, ja wenn

2. die Abfrage von InDesign überhaupt erlaubt wäre.
Wie InDesign uns mitteilt, erlaubt es uns die Abfrage für diesen GradientStop nicht.
Die Antwort auf das Warum hat uns Uwe bereits gegeben.
Zitat Bei einem Verlauf der über zwei gradientStops verfügt, ist die Eigenschaft midpoint beim ersten nicht zutreffend, beim zweiten jedoch definiert.


Wobei vermutlich diese Aussage etwas allgemeingültiger wäre:
Bei einem Verlauf der über gradientStops ist die Eigenschaft midpoint beim ersten nicht zutreffend, beim allen Folgenden jedoch definiert.

Dieser Sachverhalt wird Ihnen auch bei vielen anderen InDesign-Objekten begegnen, bei denen InDesign eine Eigenschaftsabfrage nur unter bestimmten Bedingungen erlaubt.

Spannend ist dann immer die Frage, welche Bedingungen es dann gerade sind.

Es stellt sich also jetzt die Frage, warum Indesign einen Error wirft und nicht einfach die Eigenschaft auf Null oder Undefined setzt?

Meine Vermutung:
InDesign will uns mitteilen, dass die normal gültige Eigenschaft manchmal nicht erlaubt ist, und wie will es das machen, ohne einen Fehler zu werfen?

Einen schönen Tag wünscht

Werner Perplies
Auftragsprogrammierung und Skripte für Adobe InDesign
neu: WpsProjectHandler 16.12.2020, Version 3.XX, neue Funktionen
Kundenstimmen


als Antwort auf: [#527185]

Schwierigkeit mit gradientStops

Uwe Laubender
Beiträge gesamt: 4853

14. Mai 2014, 09:08
Beitrag # 7 von 8
Beitrag ID: #527200
Bewertung:
(2167 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo, zusammen!

"Diese Eigenschaft ist im aktuellen Status nicht zutreffend" für eine Eigenschaft ist mir beim Scripten mit InDesign schon öfter begegnet. Bisher konnte ich solche Vorkomnisse nur mit einem try-catch-Szenario regeln (oder wie hier in diesem Fall, das Objekt erst gar nicht benutzen).

Schauen wir uns die Eigenschaft des ersten gradientStop-Objekts im konkreten Fall mal genauer an:

Code
/* 
stopColor [object Color]
location 0
midpoint Diese Eigenschaft ist im aktuellen Status nicht zutreffend.
isValid true
parent [object Gradient]
index 0
properties [object Object]
events [object Events]
eventListeners [object EventListeners]
isValid true
*/


Wobei der Wert "Diese Eigenschaft ist im aktuellen Status nicht zutreffend." bei midpoint vom ESTK hereingeschrieben über die Auswertung der Fehlermeldung hineingeschrieben wurde:

Angewählt war ein Rechteckrahmen, gefüllt mit einem einfachen Verlauf:

Code
var myGradient = app.selection[0].fillColor; 
var myFirstStop = myGradient.gradientStops[0];

for(x in myFirstStop){
try{
$.writeln(x+"\t"+myFirstStop[x]);
}catch(e){$.writeln(x+"\t"+e.message)};
};


Für den zweiten gardientStop ergibt sich dann folgendes Bild:

/*
stopColor [object Color]
location 100
midpoint 50
isValid true
parent [object Gradient]
index 1
properties [object Object]
events [object Events]
eventListeners [object EventListeners]
isValid true
*/

Adobe hat das so angelegt, dass der "midpoint" zwischen zwei gradientStops dem im Index höher liegenden gradientStop zugeschlagen wird.

Adobe hätte auch eine eigene Klasse firstGradientStops aufmachen können. Der würde dann die Egenschaft midpoint fehlen. Oder wäre mit null oder undefined definiert. Zuviel Aufwand, lieber die Eigenschaft blocken.

Oder andersherum: dem letzten der gradientStops wäre der Zugriff auf die Eigenschaft "midpoint" verwehrt, dafür dem ersten nicht.
*****
Mit herzlichem Gruß,
Uwe Laubender


als Antwort auf: [#527188]

Schwierigkeit mit gradientStops

WernerPerplies
Beiträge gesamt: 2552

14. Mai 2014, 09:23
Beitrag # 8 von 8
Beitrag ID: #527201
Bewertung:
(2165 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Uwe,

Zitat "Diese Eigenschaft ist im aktuellen Status nicht zutreffend" für eine Eigenschaft ist mir beim Scripten mit InDesign schon öfter begegnet. Bisher konnte ich solche Vorkomnisse nur mit einem try-catch-Szenario regeln (oder wie hier in diesem Fall, das Objekt erst gar nicht benutzen).


Das benutzen der try ... catch methode für zu erwartende Probleme hat den Nachteil, dass das Eintreten eines Catch-Ereignisses relativ viel Zeit kostet.

Deshalb ist die Methode, das Ereignis erst gar nicht eintreten zu lassen, die bessere.

Wenn man aber dazu nicht in der Lage ist, weil man nicht weiß, wie der unzulässige Status ermittelt werden kann, sollte man den Fehler exakt ermitteln, um andere Fehlerzustände nicht zu übersehen.

Das ginge in diesem Fall so:
Code
try 
{
output += selSwatch.gradientStops[Schleifenvariable:i].midpoint + " / "; //hier steigt er aus
}
catch (error)
{
// Fehlerbehandlung z. B.
if (error.number != 30615)
{
// Fehler erneut werfen
throw error;
}
}


Einen schönen Tag wünscht

Werner Perplies
Auftragsprogrammierung und Skripte für Adobe InDesign
neu: WpsProjectHandler 16.12.2020, Version 3.XX, neue Funktionen
Kundenstimmen


als Antwort auf: [#527200]
X

Aktuell

Veranstaltungskalender

Hier können Sie Ihre Anlässe eintragen, welche einen Zusammenhang mit den Angeboten von HilfDirSelbst.ch wie z.B. Adobe InDesign, Photoshop, Illustrator, PDF, Pitstop, Affinity, Marketing, SEO, Büro- und Rechtsthemen etc. haben. Die Einträge werden moderiert freigeschaltet. Dies wird werktags üblicherweise innert 24 Stunden erfolgen.

pdf-icon Hier eine kleine Anleitung hinsichtlich Bedeutung der auszufüllenden Formularfelder.

Veranstaltungen
21.01.2021 - 22.01.2021

Digicomp Academy AG, Bern oder Basel
Donnerstag, 21. Jan. 2021, 08.30 Uhr - Freitag, 22. Jan. 2021, 17.00 Uhr

Kurs

Dieser Basic-Kurs ist der perfekte Einstieg in die Welt von InDesign, dem vielseitigen Layout-Programm. Sie lernen, wie InDesign aufgebaut ist, wie saubere Dokumente erstellt werden und wie man korrekt mit gelieferten InDesign-Projekten umgeht.

Dauer: 2 Tage
Preis: CHF 1'400.–

Ja

Organisator: Digicomp Academy AG

Kontaktinformation: Kundenberater-Team, E-Mailkundenberatung AT digicomp DOT ch

digicomp.ch/d/INDEM1

Veranstaltungen
21.01.2021

Illustrator - das unbekannte Wesen

Online
Donnerstag, 21. Jan. 2021, 19.00 Uhr

Vortrag

Millionen Funktionen, und immer kommen neue dazu! Monika Gause ist jeden Januar aufs Neue ein gern gesehener Gast bei der IDUG Stuttgart. - Sie bringt alle Neuerungen mit, die 2020 dazukamen und jede Menge Tipps und Tricks. - Zudem wird sie uns informieren, was wir in Illustrator beachten müssen, wenn wir Daten fürs Web erstellen bzw. aufbereiten. - Wichtig zu wissen: "Dos and Don'ts" in Illustrator. Welche Fehler sollte man dringend vermeiden und was muss man unbedingt tun, damit es Spaß macht mit Illustrator zu arbeiten. - Dieses Jahr hast Du zusätzlich die Möglichkeit Monika im Voraus Fragen zu stellen. Fülle dieses Formular mit deinen Fragen; auch Beispieldateien sind anfügbar: https://forms.gle/fJmF8C6MjbDoEhED8

Nein

Organisator: InDesign Usergroup Stuttgart

Kontaktinformation: Christoph Steffens, E-Mailidug AT satzkiste DOT de

https://idugs67.eventbrite.de/

IDUGS #67 Illustrator mit Monika Gause

Neuste Foreneinträge


Umstieg auf Linux ...

Scannen mit Affinity Photo (V 1.8.3.641) in Win 10

Sommerurlaub ist nicht weit?

Anwendungsrahmen ausschalten auf Windows-PC?

[GREP] beliebige Zeichen finden und durch selbe Anzahl an Leerzeichen oder Anzahl Zeichen "x" ersetzen

ICC Profil für Papier Munken Print crema FSC 90 g/m² mit 1,5 Vol.

PSD CS6 (!) Mac: Dialog "Dateiinformationen" Fenster leer und Sackgasse

weitere peinliche Fragen zu Selbstverständlichkeiten

Hilfe

Bilder High> Low
medienjobs