Intercepter les rotations de planche dans un script
March 10, 2010 | Snippets | fr | en
L'Affichage avec rotation de la planche est une fonctionnalité très appréciable introduite par InDesign CS4. Elle vous prémunira contre les torticolis chaque fois que vous aurez à travailler sur des éléments pivotés, tels que le dos d'une couverture de livre, un tableau en format paysage, etc. Tout cela est merveilleux, mais il y a une mauvaise nouvelle pour les scripteurs : le DOM d'InDesign ne fournit apparemment aucun moyen de détecter ou de contrôler ce mode d'affichage avec rotation. Pas de propriété, pas de méthode d'accès. So what ?
Pire encore, la face obscure de l'affichage avec rotation est qu'il impacte sensiblement les coordonnées géométriques que votre script est appelé à manipuler. Comme illustré dans cette discussion du forum InDesign Scripting vous ne pourrez plus faire confiance aux informations retournées dans les Page.bounds
et autres PageItem.geometricBounds
. Il est probable que vous devrez également vous méfier des unités de mesure permutées, prendre avec des pincettes les angles de rotation affectés aux objets, et ne pas vouer une foi absolue aux abscisses et ordonnées du « point zéro » (zeroPoint
).
Au final, un paquet de scripts actuellement en circulation risquent de présenter des dysfonctionnements sérieux lorsqu'ils seront invoqués depuis un mode d'affichage pivoté.
Script de calcul de la rotation de planche
Le moins que nous puissions faire, dans l'immédiat, est d'étendre le DOM de façon à ce que qu'une planche ou une page — Spread
/ MasterSpread
/ Page
— puissent nous informer de l'angle apparent qu'ils subissent lors d'une rotation de vue. Harbs propose une solution élégante, sous réserve que l'on autorise notre script à « normaliser » temporairement certaines préférences du document (viewPreferences
, zeroPoint
) afin de manipuler des coordonnées de page (Page.bounds
) dignes de confiance. Voici une autre approche exploitant la puissance de la méthode resolve
(voir aussi, en anglais, « Work Around the Width/Height Gap » ). L'astuce est élémentaire : nous traduisons les coordonnées d'un vecteur horizontal quelconque de la planche considérée dans l'espace de coordonnées de la table de montage, puis nous calculons l'angle correspondant. Cette méthode s'appuie sur le fait que la table de montage conserve un repère invariant pendant que des planches sont pivotées :
Passons au script :
Spread.prototype.getRotationAngle = MasterSpread.prototype.getRotationAngle = function() { if( !('resolve' in this) ) return 0; // CS3 compat. var solver = function(pt) { return this.resolve(pt, CoordinateSpaces.PASTEBOARD_COORDINATES)[0]; }; var o = solver.call(this, AnchorPoint.CENTER_ANCHOR); var m = solver.call(this, AnchorPoint.RIGHT_CENTER_ANCHOR); return ( m[0] != o[0] )? ( ( m[0] > o[0] )? 0 : 180 ): ( ( m[1] > o[1] )? -90 : 90 ); } Page.prototype.getRotationAngle = function() { return this.parent.getRotationAngle(); } // sample code //---------------------------- var myPage = app.activeWindow.activePage; alert( "Active Page Angle: " + myPage.getRotationAngle() );
Vous appliquerez la méthode .getRotationAngle()
à n'importe quel objet Spread
, MasterSpread
ou Page
visé par votre script. Elle renvoie l'angle mesuré en degrés : 0 (pas de rotation), +90 (dans le sens inverse des aiguilles d'une montre, dit sens trigonométrique), -90 (dans le sens des aiguilles d'une montre), or 180 (planche toute retournée).