[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt Interaktives Panel

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

Interaktives Panel

tsone
Beiträge gesamt: 70

17. Jul 2017, 17:49
Beitrag # 16 von 35
Beitrag ID: #558672
Bewertung:
(5059 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Uwe,

ich habe mich noch nicht weiter damit beschäftigen können. Scheint aber ne Wissenschaft für sich zu sein.

Muss mir noch überlegen, ob es für mich so überhaupt praktikabel ist, bzw. ob es meinen Arbeitsfluss unterstützt.

Trotzdem schon mal besten Dank an alle für die tolle Hilfe.

Grüße
Timo


als Antwort auf: [#558671]
X

Interaktives Panel

Uwe Laubender
Beiträge gesamt: 5316

18. Jul 2017, 11:43
Beitrag # 17 von 35
Beitrag ID: #558682
Bewertung:
(4852 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Timo,
ja, das ist 'ne "Wissenschaft für sich"…

Ich würde mich jedenfalls auf regen Gedankenaustausch freuen, wenn Du Dich weiterhin mit diesem Thema beschäftigst. Der Testaufwand ist nicht unerheblich.


als Antwort auf: [#558672]

Interaktives Panel

drerol74
Beiträge gesamt: 507

18. Jul 2017, 13:01
Beitrag # 18 von 35
Beitrag ID: #558683
Bewertung:
(4827 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Uwe,

ich hab's am Wochenende auch nochmal mit »After Selection Changed« ausprobiert, bei mir funktioniert das hier:

https://www.rolanddreger.net/...hp/s/5hpilI4FGNAQ6QT

index.html

Code
<!doctype html> 
<html>
<head>
<meta charset="utf-8"/>
<title>Interakives Panel</title>
<link rel="stylesheet" href="css/styles.css"/>
</head>
<body>
<div id="content">
<h1 id="constructor-name">Constructor erscheint hier ...</h1>
</div>
<script src="js/libs/CSInterface.js"></script>
<script src="js/main.js"></script>
</body>
<html>


indesign.jsx

Code
unction __main() { 

try {
var _externalObjLib = new ExternalObject("lib:\PlugPlugExternalObject");
} catch(_error) {
alert(_error);
}

if(!_externalObjLib) { return false; }

app.addEventListener(Application.AFTER_SELECTION_CHANGED, __afterSelectionChangeHandler);

return;
} /* END function __main */



function __afterSelectionChangeHandler(_event){

if(app.documents.length === 0 || app.layoutWindows.length === 0) { return false; }

var _selection;
var _constructorName;

_selection = app.selection;

if(!_selection || _selection.length === 0) {
_constructorName = "Es ist nichts ausgewählt.";
} else {
_constructorName = _selection[0].constructor.name;
}

var _csxsEventObj = new CSXSEvent();

_csxsEventObj.type = "idSelectionChanged";
_csxsEventObj.data = _constructorName;
_csxsEventObj.dispatch();

return;
} /* END function __afterSelectionChangeHandler */



main.js

Code
(function () { 

'use strict';

var _csInterface = new CSInterface();
var _output = document.getElementById("constructor-name");

_csInterface.addEventListener("idSelectionChanged", function(_event){
_output.innerHTML = _event.data;
});

_csInterface.evalScript("__main()");

}());


Schöne Grüße
Roland


als Antwort auf: [#558682]

Interaktives Panel

Uwe Laubender
Beiträge gesamt: 5316

18. Jul 2017, 20:00
Beitrag # 19 von 35
Beitrag ID: #558691
Bewertung:
(4745 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Roland,
ja, ich dachte auch erst, dass das so funktioniert.

Teste mal mit dem Story-Editor oder mit einem zweiten Fenster des gleichen Dokuments. Schließe dann den Story-Editor oder das zweite Fenster. Das wird einen Fehler werfen, den Du nicht abfängst.

Ich denke, dass wir beim afterSelectionChanged eventhandler nicht um ein ordentliches try/catch herumkommen.

Hier mal ein ScriptUi-Window vom Typ Palette, das dies mit Deinem Code verdeutlicht:

Code
#targetengine uwe 

var c = 0;
var _constructorName = "Es ist nichts ausgewählt.";

var w = new Window("palette");
var myStaticText = w.add ("statictext", [0,0,200,50], c+" : "+_constructorName , {multiline: true});
w.show();

app.addEventListener(Application.AFTER_SELECTION_CHANGED, __afterSelectionChangeHandler);

function __afterSelectionChangeHandler(_event){

if(app.documents.length === 0 || app.layoutWindows.length === 0) { return };

var _selection;
var _constructorName;

_selection = app.selection;

if(!_selection || _selection.length === 0) {
_constructorName = "Es ist nichts ausgewählt.";
} else {
_constructorName = _selection[0].constructor.name;
}

myStaticText.text = c+" : "+_constructorName;
c++;
return;
} /* END function __afterSelectionChangeHandler */



als Antwort auf: [#558683]

Interaktives Panel

drerol74
Beiträge gesamt: 507

18. Jul 2017, 23:26
Beitrag # 20 von 35
Beitrag ID: #558693
Bewertung:
(4708 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Du hast recht Uwe, da hat es was. Den Texteditor könnte man noch mit instanceof LayoutWindow abfangen, aber damit gibt es dann einen Fehler bei app.activeWindow.

Ich habe es jetzt mal damit versucht:

Code
_selection = app.layoutWindows[0].selection; 


statt

Code
_selection = app.selection; 



Mit dem Texteditor wird dann halt die aktuelle Auswahl nicht angezeigt. Muss mir das aber auch noch mal genauer ansehen, wenn etwas mehr Zeit ist.


Schöne Grüße
Roland


als Antwort auf: [#558691]

Interaktives Panel

drerol74
Beiträge gesamt: 507

19. Jul 2017, 00:26
Beitrag # 21 von 35
Beitrag ID: #558694
Bewertung:
(4685 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Oder gleich das »layout« weglassen ...

Code
_selection = app.windows[0].selection; 



als Antwort auf: [#558693]

Interaktives Panel

Uwe Laubender
Beiträge gesamt: 5316

19. Jul 2017, 07:13
Beitrag # 22 von 35
Beitrag ID: #558695
Bewertung:
(4617 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Roland,
was stört Dich an einem try/catch, das die beiden bekannten Fehler $ID/NoDocumentOpenError 90884 und $ID/NoWindowOpenError 90886 erkennt und abfängt und nur bei neuen Fehlern beispielsweise protokolliert?


als Antwort auf: [#558694]

Interaktives Panel

Uwe Laubender
Beiträge gesamt: 5316

19. Jul 2017, 07:41
Beitrag # 23 von 35
Beitrag ID: #558696
Bewertung:
(4614 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Antwort auf: Oder gleich das »layout« weglassen ...

Code
_selection = app.windows[0].selection; 



Hallo Roland,
habe ich mal getestet.
Funktioniert tadellos.

EDIT:
Leider doch nicht. Hab' mich zu früh gefreut.
Mag an der Implementierung liegen.


als Antwort auf: [#558694]
(Dieser Beitrag wurde von Uwe Laubender am 19. Jul 2017, 07:57 geändert)

Interaktives Panel

Uwe Laubender
Beiträge gesamt: 5316

19. Jul 2017, 08:44
Beitrag # 24 von 35
Beitrag ID: #558697
Bewertung:
(4602 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Es hatte an der Implementierung gelegen.

Hier die Version, die funktioniert.
Anmerkung: Ich benutze ein ScriptUI-Fenster vom Typ "palette" mit einem "statictext"-Element, das einen Rollbalken aufweist.

Der Rollbalken funktioniert mit CS6.
Aber nicht mehr mit CC oder höher.

Die Auswertung im Fenster enthält einen Zähler plus den Konstruktornamen aller ausgewählten Objekte. Das ist noch nicht sehr aussagekräftig für einen Anwender, dient nur dazu, das Konstrukt zu testen.

Code
#targetengine rolandsIdea 

var c = 0;

var w = new Window("palette");
var myStaticText =
w.add
(
"statictext",
[0,0,250,100],
c+" : "+"Es ist nichts ausgewählt." ,
{
multiline: true ,
scrolling : true // Will not work in CC and above. No scroll bar available.
}
);

w.show();

app.addEventListener(Application.AFTER_SELECTION_CHANGED, writeSelectionToPalette );

function writeSelectionToPalette(evt)
{
// Roland's idea:
if( app.documents.length == 0 || app.windows.length == 0 )
{
myStaticText.text = c+" : "+"Es ist nichts ausgewählt. Event A."
c++;
return
};
// Roland's idea:
var selection = app.windows[0].selection;

var result = [];

if(selection.length == 0)
{
myStaticText.text = c+" : "+"Es ist nichts ausgewählt. Event B." ;
c++
return
};

for(var n=0;n<selection.length;n++)
{
result[n] = c+" : "+selection[n].constructor.name
};

myStaticText.text = result.join("\r");

c++;
return;
};



Wobei ich sagen muss, dass ich mir noch nicht ganz sicher bin, weshalb das funktioniert und der Fehler $ID/NoWindowOpenError mit Nummer 90886 nicht geworfen wird.

Beim Schließen eines Storyeditor-Fensters konnte ich diesen in früheren Versionen provozieren. Diesmal nicht.


als Antwort auf: [#558696]

Interaktives Panel

drerol74
Beiträge gesamt: 507

19. Jul 2017, 23:28
Beitrag # 25 von 35
Beitrag ID: #558710
Bewertung:
(4539 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Antwort auf: was stört Dich an einem try/catch, das die beiden bekannten Fehler $ID/NoDocumentOpenError 90884 und $ID/NoWindowOpenError 90886 erkennt und abfängt und nur bei neuen Fehlern beispielsweise protokolliert?


An sich spricht – denke ich – in diesem Fall nichts dagegen, mit try/catch den Fehler zu umgehen. Wenn das mit windows[0].selection ginge, wäre es halt kürzer.


Antwort auf: Wobei ich sagen muss, dass ich mir noch nicht ganz sicher bin, weshalb das funktioniert und der Fehler $ID/NoWindowOpenError mit Nummer 90886 nicht geworfen wird.



Ich hab testweise an windows[0] und windows[1] (bei 2 Fenstern eines Dokuments) die EventListeners AFTER_ACTIVATE und BEFORE_DEACTIVATE angehängt.

Beim Schließen von windows[1] feuert zuerst AFTER_SELECTION_CHANGED. app.selection ergibt zu diesem Zeitpunkt schon einen Fehler.

Code
app.windows[0].selection.toSource() // Ergebnis: [] 
app.windows[1].selection // Fehler: Object is invalid
app.windows[1] == null // Ergebnis: true


Danach löst BEFORE_DEACTIVATE von windows[1] aus und daraufhin AFTER_ACTIVATE von windows[0]. In Folge ist app.selection dann wieder gültig.

Das ist jetzt auch nur Spekulation, aber app.selection könnte eigentlich über windows[1] auf die aktuelle Auswahl zugreifen. Als aktives Fenster wird noch app.windows[1] geführt, obwohl es gar nicht mehr aktiv ist. Dieser Fehler wird aber in app.selection nicht abgefangen und bleibt es dann hängen.

app.windows[0].selection ist allerdings zu jedem Zeitpunkt gültig, egal, ob jetzt ein oder zwei Fenster geöffnet sind oder welches gerade den Index 0 hat.

Ich denke, das ist einfach ein blöder Bug.

Schöne Grüße
Roland


als Antwort auf: [#558697]

Interaktives Panel

Uwe Laubender
Beiträge gesamt: 5316

20. Jul 2017, 22:22
Beitrag # 26 von 35
Beitrag ID: #558718
Bewertung:
(4439 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Roland,
hab Dank für's Testen. Ich muss aber mal nachfragen.

Zitat von Roland Ich hab testweise an windows[0] und windows[1] (bei 2 Fenstern eines Dokuments) die EventListeners AFTER_ACTIVATE und BEFORE_DEACTIVATE angehängt.


Ok.

Zitat von Roland Beim Schließen von windows[1] feuert zuerst AFTER_SELECTION_CHANGED. app.selection ergibt zu diesem Zeitpunkt schon einen Fehler.


Beim Schließen von windows[1] ? Also dasjenigen Fensters, das nicht das aktive ist? Das würde ich mal genauer begutachten wollen. Nur um nachzuvollziehen, wie Dein Versuchsaufbau war.

Hast Du das windows[1] per Mausklick über das UI geschlossen oder per Skriptbefehl mit windows[1].close() ?

Falls per Mausklick, wird ja dann windows[1] vermutlich kurzfristig zum aktiven Fenster.
Und erhält somit den index 0. Oder auch nicht. Siehe die Fälle A und B weiter unten.

Wir sollten an dieser Stelle erstmal Begrifflichkeiten klären.
Wenn Du von windows[0] und windows[1] sprichst, dann sprichst Du immer über die gleichen Fenster, oder?

Also Beispiel:

Dokument geöffnet. Zwei Fenster des gleichen Dokuments geöffnet.
Fenster 1: windows[0], das aktive Fenster mit Namen: Unbenannt-1:1 @ 50%
Fenster 2: windows[1], das nicht aktive Fenster: Unbenannt-1:2 @ 50%

Du schließt nun Fenster 2 per Mausklick. Wie?

A. Mit 2 Mausklicks?
Klick ins Fenster, um es dann mit einem zweiten Mausklick zu schließen?
Der Name von Fenster 1 ändert sich zu: Unbenannt-1 @ 53%

B. Mit 1 Mausklick?
Klick in das x des Tabs von Fenster 2 ?
Der Name von Fenster 1 ändert sich zu: Unbenannt-1 @ 53%

A. und B. könnten unterschiedliche Reihenfolgen von events auslösen.
Im Fall A ändert sich auch der Index des Fensters bis zum Zeitpunkt des Schließens zwingend. Bei B nicht.

Und ein weiterer Unterschied könnte sein, wenn Fenster 2 per methode close() geschlossen wird.
Könnte aber auch mit Fall B abgedeckt sein.

Vielleicht hab' ich ja am Wochenende ein weing Zeit, das genauer zu untersuchen.
Ich hoffe, mit meinen Fragen oder Bemerkungen nicht allzusehr zu verwirren.


als Antwort auf: [#558710]

Interaktives Panel

drerol74
Beiträge gesamt: 507

21. Jul 2017, 00:46
Beitrag # 27 von 35
Beitrag ID: #558719
Bewertung:
(4420 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Uwe,

zur späten Stunden nur ganz kurz zum Ablauf:

Ich hab in meinem Fall dem linken Fenster (zu Beginn aktiv) durch das Skript Window.AFTER_ACTIVATE angehängt und dem rechten Fenster Window.BEFORE_DEACTIVATE (beide gleiches Dok). Dann wurde das rechte Fenster aktiviert und über das UI (x) geschlossen.

Die Überlegung war einfach die, dass immer eines der Fenster den Index 0 aufweisen muss, auch wenn dieser zwischen den Fenstern wechselt.

Ich muss mich jetzt für ein paar Tage aus der Diskussion ausklinken, Urlaub \o/, bin eigentlich schon gar nicht mehr da ;) Vielleicht hast du bis dahin schon Genaueres herausgefunden.

Schöne Grüße
Roland


als Antwort auf: [#558718]

Interaktives Panel

Uwe Laubender
Beiträge gesamt: 5316

24. Jul 2017, 08:15
Beitrag # 28 von 35
Beitrag ID: #558734
Bewertung:
(4161 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Roland,
danke für die genauere Beschreibung.

Bei mir sieht es allerdings auch so aus als könnte ich mich die nächsten 14 Tage kaum um den Fall kümmern.

Aber vielleicht geht ja Timo noch mal ran an die Sache.

Dir wünsche ich einen schönen Urlaub!
Bei mir steht ein Umzug an. Zwar in der gleichen Stadt, aber trotzdem zeit- und nervenaufreibend. Lebe im Moment in einer Baustelle. Und das kann man wortwörtlich so nehmen.


als Antwort auf: [#558719]

Interaktives Panel

Stephan_M
Beiträge gesamt: 480

21. Feb 2018, 00:07
Beitrag # 29 von 35
Beitrag ID: #562510
Bewertung:
(2126 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Uwe,

dieses Thema trifft genau mein Problem, bei dem ich auch gerade hänge. Der "AfterSelectionChange"-Event tritt ein, wenn jemand ein Fenster schliesst - "app.selection" ist dann im EventHandler schon nicht mehr gültig. Gleiches Spiel mit app.activeDocument.
Du hast oben diese Try/Catch-Anweisung vorgeschlagen, um den Handler-Fehler abzufangen ... nur, bei mir stürtzt Indesign dann ab, wenn er es 'tried'! Läuft das bei Dir? Magst Du mir helfen?

(Ich werde wohl auch auf das Idle-Event gehen. Meh! Ist halt nicht so Echt-Zeit, aber wohl sinnvoll.)

Liebe Grüße,
Stephan

Hier mein Test-Script:
Code
#targetengine miscellaneous 
var w = new Window ("palette { text: 'Test Palette', preferredSize: [220,16], alignChildren:['fill','top']}");
w.sText = w.add( "statictext", undefined, 'Tell Selection' );

function getParas() {
if (app.documents.length == 0) {
desc = 'No documents are open.';
}
else {
try {
app.selection.length;
}
catch(e) {
if(e.number == 90884 || e.number == 90886) {
return "Closing"
};
else {
return "Error: "+e.number +"\r"+ e.message
};
}

try {
app.activeDocument;
}
catch(e) {
return "Error: "+e.number +"\r"+ e.message
};

var ad = app.activeDocument;
var s = app.selection;
}
return (s.length == 0)?('Nothing selected'):(s[0].constructor.name);
}


function updateSel() {
w.sText.text = getParas();
w.graphics.backgroundColor = w.graphics.newBrush (w.graphics.BrushType.SOLID_COLOR, [Math.random(), Math.random(), Math.random()]); // to show when updateSel is called
}


app.eventListeners.add("afterSelectionChanged", updateSel,{name:'paraStyleChanger_selChange'});

w.onClose = function() { app.eventListeners.itemByName('paraStyleChanger_selChange').remove();}
w.show();



als Antwort auf: [#558672]

Interaktives Panel

Uwe Laubender
Beiträge gesamt: 5316

21. Feb 2018, 10:19
Beitrag # 30 von 35
Beitrag ID: #562511
Bewertung:
(2064 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Stephan,
deinen Code hab' ich noch nicht getestet.
Mit welchem InDesign hast Du's probiert?

Da bei Dir bereits bei app.selection.length == 0 der Absturz kommt, kann ich an dieser Stelle einen Bug vermuten. Vielleicht funktionieren alternative Schreibweisen und ein sich Herantasten?

Sollte keinen Unterschied machen, aber wer weiß?:
Code
app.properties.selection.toString() == "" 


Vielleicht hilf ja auch das event-Objekt zu untersuchen?
Möglich, dass da was Brauchbares vorhanden ist.

Code
function updateSel( event ) 
{
var x , e ;
for( x in event )
{
try{ $.writeln( x +"\t"+ event[x].toString() ) }
catch(e){ $.writeln( x +"\t"+ e.message ) };
};
};



als Antwort auf: [#562510]
X