Promenade sur le fil du temps
July 06, 2009 | Snippets | fr | en
Alors qu'il préparait le superbe ebook « Ibsen Brand », Klaus Nordby m'a demandé un petit gadget pour parachever son travail. Il lui fallait en bas de page une sorte de curseur temporel indiquant au lecteur sa progression dans l'ouvrage. Klaus voulait donc pour Noël (ou avant !) un script InDesign capable de calculer la position et de faire évoluer page à page cet élément. Voyons comment ses vœux furent exaucés...
Dans la mise en page conçue par Klaus, le curseur temporel apparaît sous la forme d'une petite barre verticale évoluant de page en page selon un minuscule incrément. L'animation ci-dessous illustre seulement les premiers pas. Dans le PDF complet, le curseur commence sa course en page 1 et l'achève en page 430, il y a donc 430 occurrences du composant. Vous vous voyez coller et positionner à la main 430 fois le même objet ?
La puissance du scripting est de réduire ce genre de corvée à un simple clic. Quelquefois un long développement sera nécessaire, ici la solution semble couler de source : l'utilisateur n'a qu'à créer et positionner l'objet à son emplacement initial, puis à en placer un duplicata à l'emplacement final, sur la même page. Il ne lui reste plus qu'à sélectionner le premier puis le second composant, et à lancer le script.
Côté script, nous demandons à l'utilisateur d'indiquer combien de pages l'objet va ainsi traverser. Notre tâche ne consiste qu'à calculer le déplacement parfait à appliquer d'une page à l'autre afin que l'objet atteigne la position prévue lorsqu'il sera instancié sur la dernière page.
Voici le pseudo-code du script :
var objs = [ app.selection[0] , app.selection[1] ]; // objs[0] reflects the object at its initial state // objs[1] reflects the final state and need to // be removed from the current page var b0 = objs[0].geometricBounds; // position of obj0 var b1 = objs[1].geometricBounds; // position of obj1 var d = [ b1[1]-b0[1] , b1[0] - b0[0] ]; var pg0 = app.activeWindow.activePage; var pgs = app.activeDocument.pages; var p1 = ... /*here we will ask the user for the last page*/; var p0 = pg0.documentOffset; var n = p1 - p0; // how many steps? var dx = d[0] / n; var dy = d[1] / n; for ( var i = 1 ; i <= n ; i++ ) { objs[0].duplicate(pgs[p0+i] , [i*dx,i*dy]); } objs[1].remove();
Comments
Amusant et graphique. Je vais te l'emprunter un de ces quatre…
I'm happy to see the page-walker (as I now call it for shorts) is alive and well, Marc! I used it again recently when I designed the PDF manual for the 3D-Coat application (http://www.3d-coat.com/download.htm...). Thanks again for your super work!
Hi Klaus,
Thanks for the link. Gorgeous design!
@+
Marc