Hallo liebe Acronauten und Freunde des Portablen Dokumenten-Formats!
Meine Wenigkeit ist zwar nicht unbedingt völlig neu auf dem Sektor PDF, bisweilen jedoch in diesem Forum noch nicht aktiv in Erscheinung getreten, da ich mir Kraft dieses wirklich guten Forums hier bisher immer schnell eine Lösung zu eigen machen konnte. Danke vorweg an dieser Stelle!
Kürzlich bin ich auf ein PDF-Dokument gestoßen, welches eine sehr nützliche Funktion in sich birgt, die ich gern einmal zu durchleuchten wünsche. Und zwar handelt es sich um eine Datei mit 3D-Annotation, welche per Javascript über entsprechende Schaltflächen gesteuert werden. Beeindruckt hat mich hierbei die Tatsache, dass einer der vorhandenen Buttons mit gleich zwei Funktionen versehen war: Bei einmaligem Betätigen wurde ein Teil der im U3D-Modell hinterlegten Animation abgespielt und nach dem zweiten Betätigen ein weiterer Teil der Sequenz. Hier geht's zu diesem Beispiel …
der Button im Dokument verwendet folgenden Javascript-Befehl:
____________________________________
a3d = getAnnots3D(this.pageNum)[0];
if (a3d)
{
c3d = a3d.context3D;
if (c3d)
{
c3d.playSequenceAndSwitchReverse(*,*);
}
}
____________________________________
Das hat mich sehr beeindruckt, da mir hierzu gleich die Idee kam, künftig die Handhabung interaktiver PDF-Dokumente weitaus einfacher und mit entsprechend weniger Buttons zu erstellen. Triviales Beispiel: Play- und Pause-Button etwa ließen sich problemlos in einem zusammenfassen, wie man es aus der Praxis auch von etlichen Bedienelementen kennt.
Leider ist es mir bisher noch nicht geglückt, an das eingebettete Javascript zu gelangen, welches dem 3D-Modell unterliegt. Daran versuche ich mich aber garnicht erst länger; das ist meines Wissens nicht so ganz ohne Weiteres (mit Multivalent …?) möglich.
Zudem kenne ich mich mit Javascript leider auch zu wenig aus, als dass ich mir da konstruktive Resultate versprechen könnte.
Bisher verwende ich das von Adobe veröffentlichte AnimationContoller-Javascript aus diesem Beitrag hier. Damit lassen sich ja eine ganze Menge objektbezogene Ereignisse, wie auch ansatzweise beschrieben, mithilfe einzelner Buttons triggern.
Zur Frage:
[fontsize=2]Gibt es eine Möglichkeit den oben erwähnten Javascript-Befehl auf das AnimationController-Script angwendet zu bekommen, durch etwaige gegenseitige Ergänzungen oder sonstige Anpassung?
[/fontsize]
Zugegeben stoße ich beim Stöbern auf den etlichen auch sehr aufschlussreichen Seiten von Adobe oft mangels fehlender Programmierkenntnisse auf unüberwindbare Verständnisslücken, welche den persönlichen Horizont an Möglichkeiten leider einschränken.
Empfehlungen zu einer passend ausführlichen Lektüre o.ä. zum Thema sei natürlich jederzeit willkommen!
Das soweit vorab…
Danke & Gruß
Ricpat
Animationssequenz erst teilweise abspielen, dann weiter abspielen…
Animationssequenz erst teilweise abspielen, dann weiter abspielen…
Hatte es derweil nochmal hiermit – einem Skript von einem Bekannten – versucht, sprich also dem Button als Funktion "Javascript ausführen" zugewiesen:
____________________________________
private var an:boolean = true;
function Movie():void{
if (an==true){
// Spiele Film Vorwärtz
C3D = getAnnots3D(0)[0].context3D;
C3D.MyAnimation.setPlayRange(4,5);
C3D.MyAnimation.setCurrentPosition(0);
C3D.MyAnimation.setPlayForward(true);
C3D.MyAnimation.setPingPong(false);
C3D.MyAnimation.play();
an = false;
}else{
// Spiele Film Rückwärtz
C3D = getAnnots3D(0)[0].context3D;
C3D.MyAnimation.setPlayRange(0,4);
C3D.MyAnimation.setCurrentPosition(0);
C3D.MyAnimation.setPlayForward(true);
C3D.MyAnimation.setPingPong(false);
C3D.MyAnimation.setLoop(false);
C3D.MyAnimation.play();
an =true;
}
}
Movie();
____________________________________
Leider blieb auch dieses bisher erfolglos… Hierzu irgendwelche Ideen oder Anregungen?
Grüße
Ricpat
____________________________________
private var an:boolean = true;
function Movie():void{
if (an==true){
// Spiele Film Vorwärtz
C3D = getAnnots3D(0)[0].context3D;
C3D.MyAnimation.setPlayRange(4,5);
C3D.MyAnimation.setCurrentPosition(0);
C3D.MyAnimation.setPlayForward(true);
C3D.MyAnimation.setPingPong(false);
C3D.MyAnimation.play();
an = false;
}else{
// Spiele Film Rückwärtz
C3D = getAnnots3D(0)[0].context3D;
C3D.MyAnimation.setPlayRange(0,4);
C3D.MyAnimation.setCurrentPosition(0);
C3D.MyAnimation.setPlayForward(true);
C3D.MyAnimation.setPingPong(false);
C3D.MyAnimation.setLoop(false);
C3D.MyAnimation.play();
an =true;
}
}
Movie();
____________________________________
Leider blieb auch dieses bisher erfolglos… Hierzu irgendwelche Ideen oder Anregungen?
Grüße
Ricpat
Animationssequenz erst teilweise abspielen, dann weiter abspielen…
Inzwischen wurde eine Lösung gefunden, die sich beschreibt, wie folgt:
Und zwar habe ich jeweils eine JavaScript-Funktion unter dem Menüpunkt "Erweitert" >> "Dokumentverarbeitung" >> "Dokument-JavaScripts" angelegt.
Für das den sog. "Toggle-Button" der Animation, welcher jeweils einen Animations-, bzw. Zeitabschnitt im gegenseitigen Wechsel wiedergibt:
_____________________________________________
var stat = true;
function player()
{
console.println("PLAY - function - "+ stat);
C3D = getAnnots3D(0)[0].context3D;
if(stat){
C3D.MyAnimation.setPlayRange(0,4);
}else{
C3D.MyAnimation.setPlayRange(4,5);
}
C3D.MyAnimation.setCurrentPosition(0);
C3D.MyAnimation.setPlayForward(true);
C3D.MyAnimation.play();
stat = (stat==true) ? false : true;
}
_____________________________________________
Dem Button nebst der Annotation ist dann der Logik nach lediglich der Befehl "player();" zuzuweisen. Funktioniert bisher ohne Weiteres, wie gewünscht.
Für das Ein- und Ausblenden bestimmter Teile des 3D-Modells habe ich dann eine weitere JavaScript-Funktion unter "Dokument-JavaScripts" beigefügt:
_____________________________________________
var stat = true;
function onoff()
{
C3D = getAnnots3D(0)[0].context3D
C3D.scene.nodes.getByName("linke_Gehaeusehaelfte").opacity = (stat==true) ? 0.1 : 1;
stat = (stat==false) ? true : false;
}
_____________________________________________
Die Schalfläche triggert dann die Funktion durch den Befehl "onoff();" im JavaScript-Editor.
Selbiges werde ich zudem noch mit der Reihenschaltung mehrerer, verschieden perspektivischer Ansichten mit Hilfe eines einzelnen Buttons realisieren.
Hierbei bin ich mir noch nocht so ganz schlüssig, ob eine gänzliche JavaScript-Lösung notwendig ist – [fontsize=3]vielleicht kann sich speziell hierzu jemand zu Wort melden, der evtl. einen heißen Tipp zur Sache parat hat?[/fontsize]
Grüße
Ricpat
Und zwar habe ich jeweils eine JavaScript-Funktion unter dem Menüpunkt "Erweitert" >> "Dokumentverarbeitung" >> "Dokument-JavaScripts" angelegt.
Für das den sog. "Toggle-Button" der Animation, welcher jeweils einen Animations-, bzw. Zeitabschnitt im gegenseitigen Wechsel wiedergibt:
_____________________________________________
var stat = true;
function player()
{
console.println("PLAY - function - "+ stat);
C3D = getAnnots3D(0)[0].context3D;
if(stat){
C3D.MyAnimation.setPlayRange(0,4);
}else{
C3D.MyAnimation.setPlayRange(4,5);
}
C3D.MyAnimation.setCurrentPosition(0);
C3D.MyAnimation.setPlayForward(true);
C3D.MyAnimation.play();
stat = (stat==true) ? false : true;
}
_____________________________________________
Dem Button nebst der Annotation ist dann der Logik nach lediglich der Befehl "player();" zuzuweisen. Funktioniert bisher ohne Weiteres, wie gewünscht.
Für das Ein- und Ausblenden bestimmter Teile des 3D-Modells habe ich dann eine weitere JavaScript-Funktion unter "Dokument-JavaScripts" beigefügt:
_____________________________________________
var stat = true;
function onoff()
{
C3D = getAnnots3D(0)[0].context3D
C3D.scene.nodes.getByName("linke_Gehaeusehaelfte").opacity = (stat==true) ? 0.1 : 1;
stat = (stat==false) ? true : false;
}
_____________________________________________
Die Schalfläche triggert dann die Funktion durch den Befehl "onoff();" im JavaScript-Editor.
Selbiges werde ich zudem noch mit der Reihenschaltung mehrerer, verschieden perspektivischer Ansichten mit Hilfe eines einzelnen Buttons realisieren.
Hierbei bin ich mir noch nocht so ganz schlüssig, ob eine gänzliche JavaScript-Lösung notwendig ist – [fontsize=3]vielleicht kann sich speziell hierzu jemand zu Wort melden, der evtl. einen heißen Tipp zur Sache parat hat?[/fontsize]
Grüße
Ricpat