[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

10. Jul 2017, 17:45
Beitrag # 1 von 35
Bewertung:
(11892 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Leute,

ich habe in InDesign ein eigenes Panel laufen, bei dem ich mit Buttons verschiedene JSX ausführen kann, die sich auf das geöffnete InDesign-Dokument auswirken.

Jetzt möchte ich aber, dass in dem Panel selber was passiert. Zum Beispiel, dass er mir im Panel den Namen des gerade ausgewählten Objektes anzeigt. Ich weiß, dass ich das auch über die Ebenen-Palette sehen kann - allerdings wird das unübersichtlich, wenn ich dort viele Ebenen habe, die teilweise zugeklappt sind.

Hat da jemand eine Idee?

Danke und Grüße
X

Interaktives Panel

drerol74
Beiträge gesamt: 507

12. Jul 2017, 00:46
Beitrag # 2 von 35
Beitrag ID: #558578
Bewertung:
(11420 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo,

um welches Panel handelt es sich denn, HTML? Bzw. welche InDesign-Version?

Schöne Grüße
Roland


als Antwort auf: [#558552]

Interaktives Panel

tsone
Beiträge gesamt: 70

12. Jul 2017, 08:15
Beitrag # 3 von 35
Beitrag ID: #558580
Bewertung:
(11237 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Roland,

es handelt sich um InDesign CC 2017 also ein HTML-Panel.


als Antwort auf: [#558578]

Interaktives Panel

drerol74
Beiträge gesamt: 507

12. Jul 2017, 18:42
Beitrag # 4 von 35
Beitrag ID: #558599
Bewertung:
(10973 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
So sollte es gehen. Hier wrid als Beispiel nach Klick auf den Button der Constructor der aktuellen InDesign-Auswahl angezeigt:

JavaScript:

Code
(function () { 

'use strict';

var csInterface = new CSInterface();
var output = document.getElementById("constructor-name");

document.getElementById('test-button').addEventListener('click', function () {
csInterface.evalScript('__main()');
});

csInterface.addEventListener("custom_event", function(event) {
output.innerHTML = event.data;
});

}());



ExtendScript:

Code
function __main() { 

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

var _selection = app.selection;
if(!_selection) { return false; }

var _constructorName = _selection[0].constructor.name;

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

if(!_externalObjLib) { return false; }

var _csxsEventObj = new CSXSEvent();

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

return;
} /* END function __main */



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>
<button id="test-button">Hier klicken</button>
</div>

<script src="js/libs/CSInterface.js"></script>
<script src="js/main.js"></script>
</body>
<html>



Die Webseite von Davide Barraca ist dazu sehr zu empfehlen, dort gibt es viele Beispiele zu ähnlichen Sachen. Und nicht zu vergessen sein Buch.

https://www.davidebarranca.com

Schöne Grüße
Roland


als Antwort auf: [#558580]

Interaktives Panel

tsone
Beiträge gesamt: 70

13. Jul 2017, 09:23
Beitrag # 5 von 35
Beitrag ID: #558610
Bewertung:
(10420 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Roland,

kann ich das "JavaScript" mit in die "index.html" packen und das "ExtendScript" in eine JSX?

Meine aktuellen Scripte rufe ich so auf:

index.html
Code
<button id="btn_PNGTODESKTOP72" onClick="onClickButton('PNGTODESKTOP72')">72</button> 


export.jsx:
Code
$._ext_PNGTODESKTOP72={ 
run : function() {
/********** Replace below sample code with your own JSX code **********/
var Dateiname = app.activeDocument.name.split(".")[0];
var Buchstabe_klein = Dateiname.charAt(0).toLowerCase();
var Buchstabe_gross = Dateiname.charAt(0).toUpperCase();
app.pngExportPreferences.transparentBackground = true;
app.pngExportPreferences.exportResolution = 72;
app.pngExportPreferences.pngQuality = PNGQualityEnum.HIGH;
app.activeDocument.exportFile(ExportFormat.PNG_FORMAT, File(new File("~/Desktop/" + Dateiname + ".png")));
/************************************************************************/
return appName; }, };


Danke und Grüße


als Antwort auf: [#558599]

Interaktives Panel

tsone
Beiträge gesamt: 70

13. Jul 2017, 13:05
Beitrag # 6 von 35
Beitrag ID: #558619
Bewertung:
(10254 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Ah, hab mit ein bisschen Basteln was hinbekommen.

Jetzt muss das auch so funktionieren, dass ich nicht extra nen Button klicken muss. Sprich - wenn ich ein Objekt auswähle, soll er im Panel den Objekt-Namen anzeigen.


als Antwort auf: [#558610]

Interaktives Panel

drerol74
Beiträge gesamt: 507

13. Jul 2017, 14:33
Beitrag # 7 von 35
Beitrag ID: #558621
Bewertung:
(10186 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Antwort auf: kann ich das "JavaScript" mit in die "index.html" packen


Du kannst den js-Code auch in dei Index-Datei schreiben. Bezüglich Wartung finde ich die Verlinkung und Auslagerung in eine eigene Datei aber praktischer.


Antwort auf: und das "ExtendScript" in eine JSX?


So war es gedacht ;)


Antwort auf: Jetzt muss das auch so funktionieren, dass ich nicht extra nen Button klicken muss. Sprich - wenn ich ein Objekt auswähle, soll er im Panel den Objekt-Namen anzeigen.


Mit dem EventListener »afterSelectionChanged«, meinst du das? Der Button war nur zur Demonstration.

Schöne Grüße
Roland


als Antwort auf: [#558619]

Interaktives Panel

tsone
Beiträge gesamt: 70

13. Jul 2017, 14:36
Beitrag # 8 von 35
Beitrag ID: #558622
Bewertung:
(10183 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hab ein wenig mit afterSelectionChanged rumgespielt.

Über das Panel passiert gar nichts. Über ein externe Skriptdatei bekomme ich auch bei verschiedenen eventListener nur Fehlermeldungen, dass das Objekt nicht mehr verfügbar ist.


als Antwort auf: [#558619]

Interaktives Panel

Dirk Becker
Beiträge gesamt: 193

13. Jul 2017, 20:12
Beitrag # 9 von 35
Beitrag ID: #558632
Bewertung:
(9946 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Zitat Fehlermeldungen, dass das Objekt nicht mehr verfügbar ist


Vermutlich fehlt da die targetengine Anweisung.
https://www.google.de/...ndesign+targetengine


als Antwort auf: [#558622]

Interaktives Panel

tsone
Beiträge gesamt: 70

14. Jul 2017, 07:18
Beitrag # 10 von 35
Beitrag ID: #558634
Bewertung:
(9527 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Dirk,

mit
Code
#targetengine "session" 

hat es geklappt. Allerdings bekomme ich beim InDesign öffnen, dass "undefined is not an object" ist.
Vermute mal, dass das kommt, weil noch kein Objekt ausgewählt ist.

Außerdem muss ich erst Rolands Button zweimal im Panel klicken, bis auch der "afterSelectionChanged" funktioniert.

Danach

Aber vielen Dank euch für die Hilfe!!!


als Antwort auf: [#558632]

Interaktives Panel

Uwe Laubender
Beiträge gesamt: 5316

14. Jul 2017, 09:58
Beitrag # 11 von 35
Beitrag ID: #558636
Bewertung:
(9389 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Antwort auf [ tsone ] … Allerdings bekomme ich beim InDesign öffnen, dass "undefined is not an object" ist. Vermute mal, dass das kommt, weil noch kein Objekt ausgewählt ist.


Hallo tsone,
was heißt "beim InDesign öffnen" genau?
Du startest InDesign und erwartest, dass die Arbeit mit app.selection funktioniert? Genau das ist aber nicht der Fall solange kein Dokument geöffnet ist.

Lass mal das hier als Startup-Script laufen:

Code
#targetengine uwe-test 

app.addEventListener("afterSelectionChanged", doSomething);

function doSomething(evt)
{

// THIS WILL FAIL AFTER STARTUP OF INDESIGN:
// Do nothing if nothing is selected:
if(app.selection.length == 0){return};

// OPTIONAL:
// Do nothing if text is selected:
if(app.selection[0].hasOwnProperty("baselineShift")){return};

// Final action:
alert(app.selection.length);
};


Und dann ändere das Startup-Script zu dem hier:

Code
#targetengine uwe-test 

app.addEventListener("afterSelectionChanged", doSomething);

function doSomething(evt)
{
// Do nothing if no document is open:
if(app.documents.length == 0){return};

// OPTIONAL:
// Do nothing if nothing is selected:
if(app.selection.length == 0){return};

// OPTIONAL:
// Do nothing if text is selected:
if(app.selection[0].hasOwnProperty("baselineShift")){return};

// Final action:
alert(app.selection.length);
};


Dazwischen natürlich InDesign neustarten.

[b]Warum versuche ich Textauswahlen auszublenden?
Der Listener liefert mit Textauswahlen quasi jeden "Pups". Also zum Beispiel wenn die Einfügemarke im Text bewegt wird. Oder wenn der Anwender Text tippt, dann gilt bei jeder neuen Einfügemarke: "Hallihallo! Die Auswahl hat sich geändert!" Wirklich nach jedem Zeichen! Kann nervig werden. Braucht man jetzt nicht so rigoros umsetzen wie ich das hier mache, aber man sollte darauf gefasst sein, dass jede Menge Meldungen in kurzer Zeit auf einen zukommen können.

Es wäre zu überlegen, ob Du überhaupt mit afterSelectionChanged arbeiten solltest.
Stattdessen könntest Du ein [b]IdleTask der app hinzufügen und dem einen listener für [b]IdleEvent.ON_IDLE mit einer entsprechenden Handler-Funktion mitgeben, die die Auswahl prüft und auswertet. Da könnte man sogar einen Intervall für's Nachschauen einbauen.

Doku hier:
http://jongware.mit.edu/...c_IdleTasks.html#add
http://jongware.mit.edu/...6js/pc_IdleTask.html

Schnipsel da:

Code
var newIdleTask = app.idleTasks.add 
(
{
name : "DoSomethingIfIdleEverySecond" ,
sleep : 1000
}
);

var onIdleListener = newIdleTask.addEventListener( IdleEvent.ON_IDLE , doSomeThing , false);

function doSomeThing(evt)
{
// Your functionality goes here:
if(app.documents.length == 0){return};
if(app.selection.length > 1)
{
// Notify my panel
}

};



als Antwort auf: [#558634]

Interaktives Panel

tsone
Beiträge gesamt: 70

14. Jul 2017, 10:33
Beitrag # 12 von 35
Beitrag ID: #558637
Bewertung:
(9363 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Uwe,

das mit dem IdleTask schaue ich mir mal.

Danke und Grüße
Timo


als Antwort auf: [#558636]

Interaktives Panel

Uwe Laubender
Beiträge gesamt: 5316

14. Jul 2017, 11:16
Beitrag # 13 von 35
Beitrag ID: #558639
Bewertung:
(9333 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Timo,

ergänzend zu dem vorher gesagten:

1. Ich hatte ja nur vermutet, dass Du bei der Aktivierung des Listeners kein Dokument offen hast. Oder den Fall: Der Benutzer schließt alle Dokumente. Dann sollte der Listener ja ohne Fehlermeldung einfach weiterlaufen.
Bis der Benutzer entscheidet das Panel zu schließen.

2. Um eine echte Fehlerbehandlung zu machen, könntest Du mit try-catch arbeiten um den Fehler zu untersuchen.

Falls kein Dokument geöffnet ist, wirft das hier einen Fehler:
Code
app.selection.length 


Welche Fehlernummer?

Code
try 
{
app.selection.length;
}
catch(e)
{
alert(e.number);
};

// 90884


Du könntest darauf reagieren, und den weiteren Code nicht ausführen.
Ob das für alle Situationen reicht? Möglicherweise nicht.

Code
#targetengine uwe-test 

app.addEventListener("afterSelectionChanged", doSomething);

function doSomething(evt)
{
try
{
app.selection.length;
}
catch(e)
{
if(e.number == 90884)
{

// Known error.

// e.message
// "Es sind keine Dokumente geöffnet."

// app.findKeyStrings("Es sind keine Dokumente geöffnet.")
// $ID/NoDocumentOpenError

return
};
else
{
alert( "Error: "+e.number +"\r"+ e.message );
return
};
}
};


Im Falle des Schließens eines Dokuments bekomme ich einen weiteren Fehler geworfen: "Es sind keine Dokumentenfenster geöffnet" mit Fehlernummer 90886.

Den könntest Du dann auch in die Kategorie der "bekannten" Fehler einordnen.
Vielleicht treten ja noch andere auf, die Du behandeln möchtest.

Also: Testen!


als Antwort auf: [#558637]

Interaktives Panel

Uwe Laubender
Beiträge gesamt: 5316

15. Jul 2017, 09:31
Beitrag # 14 von 35
Beitrag ID: #558650
Bewertung:
(8488 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Kleine Korrektur meiner Formulierung:

"Es sind keine Dokumentenfenster geöffnet" muss heißen:
"Es sind keine Dokumentfenster geöffnet."
$ID/NoWindowOpenError

Dieser Fehler wird auch geworfen, wenn Du beispielsweise mit mehreren Fenstern eines Dokuments arbeitest und eines davon schließt. Ob Textansicht oder Layoutansicht macht keinen Unterschied.

Die Formulierung der Meldung ist ein wenig widersprüchlich. Könnte etwas präziser sein. "Das Fenster der Auswahl ist nicht mehr geöffnet." wäre vielleicht besser…

Experimentiere auch mal mit dem Seitenwerkzeug während der Listener läuft.
Weiss nicht, ob Du auch ausgewählte Seiten in Deinem Panel aufnehmen möchtest.


als Antwort auf: [#558639]

Interaktives Panel

Uwe Laubender
Beiträge gesamt: 5316

17. Jul 2017, 16:55
Beitrag # 15 von 35
Beitrag ID: #558671
Bewertung:
(7521 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Antwort auf: Hallo Uwe,

das mit dem IdleTask schaue ich mir mal.

Danke und Grüße
Timo


Hallo Timo,
hast Du neue Erkenntnisse?

afterSelectionChanged vs IdleTask

Die Hauptunterschiede dürften sein:

1. Mit der IdleTask fragst Du, bzw. kannst Du im Intervall abfragen wie es um die Auswahl bestellt ist. Und da InDesign im Moment der Abfrage "idle" ist, also nichts macht, wird der Anwender auch nicht ausgebremst. So jedenfalls die Theorie.

2. Mit dem afterSelectionChanged eventhandler wirst Du vermutlich stärker filtern müssen, wenn es um Textauswahlen geht. Es steht zu befürchten, dass das auf die Performance gehen könnte. Davon abgesehen: Du kannst den auch an das activeDocument hängen und musst ihn nicht unbedingt an der Application festmachen.

Was bei beiden passieren kann:
Wenn Du mal einen Zähler mitlaufen lässt, wirst Du feststellen, dass der handler mal "durchrutscht". Soll heißen, dass manche events zwar registriert, der Zähler hochgezählt, die Aktion im handler aber nicht ausgeführt wird. Ist mir bei meinen Tests jedenfalls so ergangen.


als Antwort auf: [#558637]
X