hilfdirselbst.ch
Facebook Twitter gamper-media

**********************************************
        Facelifting HDS: Danke für deine Unterstützung!

**********************************************


« « 1 2 3 » »  
tsone
Beiträge: 47
10. Jul 2017, 17:45
Beitrag #1 von 35
Bewertung:
(7696 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Interaktives Panel


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
Top
 
X
drerol74 m
Beiträge: 387
12. Jul 2017, 00:46
Beitrag #2 von 35
Beitrag ID: #558578
Bewertung:
(7228 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Interaktives Panel


Hallo,

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

Schöne Grüße
Roland
als Antwort auf: [#558552] Top
 
tsone
Beiträge: 47
12. Jul 2017, 08:15
Beitrag #3 von 35
Beitrag ID: #558580
Bewertung:
(7045 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Interaktives Panel


Hallo Roland,

es handelt sich um InDesign CC 2017 also ein HTML-Panel.
als Antwort auf: [#558578] Top
 
drerol74 m
Beiträge: 387
12. Jul 2017, 18:42
Beitrag #4 von 35
Beitrag ID: #558599
Bewertung:
(6781 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Interaktives Panel


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] Top
 
tsone
Beiträge: 47
13. Jul 2017, 09:23
Beitrag #5 von 35
Beitrag ID: #558610
Bewertung:
(6228 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Interaktives Panel


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] Top
 
tsone
Beiträge: 47
13. Jul 2017, 13:05
Beitrag #6 von 35
Beitrag ID: #558619
Bewertung:
(6062 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Interaktives Panel


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] Top
 
drerol74 m
Beiträge: 387
13. Jul 2017, 14:33
Beitrag #7 von 35
Beitrag ID: #558621
Bewertung:
(5994 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Interaktives Panel


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] Top
 
tsone
Beiträge: 47
13. Jul 2017, 14:36
Beitrag #8 von 35
Beitrag ID: #558622
Bewertung:
(5991 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Interaktives Panel


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] Top
 
Dirk Becker
Beiträge: 156
13. Jul 2017, 20:12
Beitrag #9 von 35
Beitrag ID: #558632
Bewertung:
(5754 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Interaktives Panel


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] Top
 
tsone
Beiträge: 47
14. Jul 2017, 07:18
Beitrag #10 von 35
Beitrag ID: #558634
Bewertung:
(5335 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Interaktives Panel


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] Top
 
Uwe Laubender S
Beiträge: 4039
14. Jul 2017, 09:58
Beitrag #11 von 35
Beitrag ID: #558636
Bewertung:
(5197 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Interaktives Panel


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
}

};

*****
Mit herzlichem Gruß,
Uwe Laubender
als Antwort auf: [#558634] Top
 
tsone
Beiträge: 47
14. Jul 2017, 10:33
Beitrag #12 von 35
Beitrag ID: #558637
Bewertung:
(5171 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Interaktives Panel


Hallo Uwe,

das mit dem IdleTask schaue ich mir mal.

Danke und Grüße
Timo
als Antwort auf: [#558636] Top
 
Uwe Laubender S
Beiträge: 4039
14. Jul 2017, 11:16
Beitrag #13 von 35
Beitrag ID: #558639
Bewertung:
(5141 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Interaktives Panel


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!
*****
Mit herzlichem Gruß,
Uwe Laubender
als Antwort auf: [#558637] Top
 
Uwe Laubender S
Beiträge: 4039
15. Jul 2017, 09:31
Beitrag #14 von 35
Beitrag ID: #558650
Bewertung:
(4296 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Interaktives Panel


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.
*****
Mit herzlichem Gruß,
Uwe Laubender
als Antwort auf: [#558639] Top
 
Uwe Laubender S
Beiträge: 4039
17. Jul 2017, 16:55
Beitrag #15 von 35
Beitrag ID: #558671
Bewertung:
(3329 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Interaktives Panel


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.
*****
Mit herzlichem Gruß,
Uwe Laubender
als Antwort auf: [#558637] Top
 
« « 1 2 3 » »  
X