Tailles et positionnement des éléments de la page

Il existe deux façons d'obtenir et de modifier la taille et la position d'un élément de page:

  1. Utiliser ses fonctions getter et setter pour la taille et la position.
  2. Manipuler sa transformation affine à l'aide de ses fonctions getTransform() et setTransform() tout en préservant la taille inhérente.

Lire les propriétés des éléments de page

Dimensionnement et rotation

Comme le montre la figure, la taille et la position sont mesurées par rapport au cadre de délimitation d'un élément de page affiché en l'absence de rotation:

  • Gauche et Haut: mesures entre l'angle supérieur gauche de la page et l'angle supérieur gauche du cadre de délimitation sans rotation. Utilisez getLeft() et getTop() pour lire les valeurs.
  • Largeur et Hauteur: largeur et hauteur du cadre de délimitation sans rotation. Utilisez getWidth() et getHeight() pour lire les valeurs.
  • Rotation: rotation dans le sens des aiguilles d'une montre par rapport à la ligne verticale autour du centre du cadre de délimitation. Utilisez getRotation() pour lire la valeur.

Toutes les longueurs sont mesurées en points (pt). La rotation est mesurée en degrés (°).

Définir les propriétés des éléments de page

Vous pouvez définir la taille et la position d'un élément de page lorsque vous le créez à l'aide d'une méthode d'insertion telle que insertShape(). Pour une forme existante, vous pouvez définir la taille, la position et la rotation. Vous pouvez également définir la mise à l'échelle d'un élément pour le redimensionner ou le refléter le long de l'un de ses bords.

À la création

Vous pouvez fournir des informations de position et de taille lorsque vous créez un élément de page.

var slide = SlidesApp.getActivePresentation().getSlides()[0];
var shape = slide.insertShape(SlidesApp.ShapeType.TEXT_BOX, 100, 200, 300, 60);
Logger.log('Left: ' + shape.getLeft() + 'pt; Top: '
                    + shape.getTop() + 'pt; Width: '
                    + shape.getWidth() + 'pt; Height: '
                    + shape.getHeight() + 'pt; Rotation: '
                    + shape.getRotation() + ' degrees.');

Le script ci-dessus crée une forme sur la première diapositive de la présentation active avec la position et la taille spécifiées, et lit les informations de position et de taille de la forme. Le journal attendu est le suivant:

Left: 100pt; Top: 200pt; Width: 300pt; Height: 60pt; Rotation: 0 degrees.

Taille, position et rotation

Vous pouvez mettre à jour la taille et la position d'un élément de page après sa création:

  • Utilisez setLeft() et setTop() pour définir la position de l'angle supérieur gauche du cadre de délimitation sans rotation.
  • Utilisez setWidth() et setHeight() pour définir la largeur et la hauteur de rendu du cadre de délimitation.
  • Utilisez setRotation() pour définir la rotation dans le sens des aiguilles d'une montre du cadre de délimitation autour de son centre.

Le script suivant crée une forme sur la première diapositive de la présentation active, utilise des setters pour mettre à jour sa position, sa taille et sa rotation, et lit les informations de position et de taille de la forme.

var slide = SlidesApp.getActivePresentation().getSlides()[0];
var shape = slide.insertShape(SlidesApp.ShapeType.RECTANGLE);
shape.setLeft(100).setTop(200).setWidth(50).setHeight(60).setRotation(90);
Logger.log('Left: ' + shape.getLeft()
                    + 'pt; Top: ' + shape.getTop()
                    + 'pt; Width: ' + shape.getWidth()
                    + 'pt; Height: ' + shape.getHeight()
                    + 'pt; Rotation: ' + shape.getRotation() + '\u00B0.');

La sortie de journal attendue de ce script est la suivante:

Left: 100pt; Top: 200pt; Width: 50pt; Height: 60pt; Rotation: 90°.

Les setters de taille, de position et de rotation peuvent être utilisés dans n'importe quel ordre ou combinaison. Si vous remplacez la troisième ligne ci-dessus par le script suivant, vous obtiendrez le même résultat:

shape.setWidth(55);
shape.setRotation(90).setHeight(60).setLeft(100);
shape.setWidth(50).setTop(200);

Mise à l'échelle

Au lieu d'utiliser setWidth() et setHeight() ci-dessus pour définir la taille de la forme sur une valeur absolue, scaleWidth() et scaleHeight() peuvent être utilisés pour étirer ou compresser un élément de page avec un facteur de mise à l'échelle relatif.

shape.scaleHeight(0.5).scaleWidth(2);

La figure ci-dessous illustre le fonctionnement du code ci-dessus sur une forme carrée ayant fait l'objet d'une rotation à 45°. Notez que l'angle supérieur gauche du cadre de délimitation est fixe lors de la mise à l'échelle.

Scaling de Slides

Reflet le long du bord

L'argument dans scaleWidth() et scaleHeight() peut être négatif pour pouvoir inverser un élément de page horizontalement ou verticalement.

shape.scaleWidth(-1); // Flip horizontally along the left edge of the bounding box.
shape.scaleHeight(-1); // Flip vertically along the top edge of the bounding box.

La figure ci-dessous montre comment le code ci-dessus fonctionne sur une forme faisant l'objet d'une rotation à 45°. Notez que l'élément de page est retourné le long de l'un des bords de son cadre de délimitation, mais pas au centre.

Réflexion sur les diapositives

Rotation des lignes

Comme les autres éléments de la page, la rotation d'une ligne n'est pas l'angle vertical de la ligne, mais la rotation de son cadre de délimitation. Lorsque vous créez une ligne avec des points de début et de fin spécifiés, sa rotation est toujours de 0°. Faire glisser les extrémités de la ligne dans l'interface utilisateur de Google Slides modifie son angle vertical, ainsi que la taille et la position de son cadre de délimitation, mais ne modifie pas sa rotation. L'utilisation de setRotation() permet de faire pivoter le cadre de délimitation de la ligne, ce qui modifie son angle vertical. Deux lignes peuvent donc avoir le même angle vertical visuel, mais des cadres de délimitation différents et donc des valeurs de taille, de position et de rotation différentes.

Limites

Certaines méthodes de dimensionnement et de positionnement ne sont pas compatibles avec certains types d'éléments de page. Le tableau ci-dessous récapitule les méthodes non compatibles avec certains types d'éléments de page.

Méthodes Forme Vidéo Table
getHeight() et getWidth(). NO (renvoie une valeur nulle)
setHeight(), setWidth() NON
setRotation() NON NON
scaleHeight(), scaleWidth() NON

Toutes les méthodes de dimensionnement et de positionnement peuvent donner des résultats inattendus si l'élément de la page présente un cisaillement. Toutes les limites sont susceptibles d'être modifiées. Consultez la documentation de référence pour obtenir des informations à jour.

Utiliser des transformations affine

Pour un contrôle avancé, la taille et la position d'un élément de page peuvent également être calculées et ajustées via sa taille inhérente (native) et la transformation affine.

L'interface de Google Apps Script est semblable à celle de l'API Google Slides.

  • Pour en savoir plus, cet article décrit les concepts de la transformation affine, et explique comment déduire la taille de rendu à partir de la taille et la transformation inhérentes (natives) des éléments de page. Dans Apps Script, utilisez :
    • getInherentWidth() et getInherentHeight() pour la taille native des éléments de page ;
    • getTransform() pour la transformation affine des éléments de la page.
  • Pour écrire, cet article explique comment dimensionner et positionner les éléments d'une page à l'aide de la transformation affine pour obtenir un scaling, une rotation, une réflexion, etc. Dans Apps Script, utilisez
    • setTransform() pour définir la transformation affine des éléments de page (semblable au mode ABSOLUTE) ;
    • preconcatenateTransform() pour préconcaténer une transformation affine dans la transformation actuelle des éléments de page (semblable au mode RELATIVE).

Le script suivant crée une forme, définit sa transformation, lit sa taille inhérente et lit sa transformation affine.

var slide = SlidesApp.getActivePresentation().getSlides()[0];
var shape = slide.insertShape(SlidesApp.ShapeType.RECTANGLE);
shape.setTransform(SlidesApp.newAffineTransformBuilder()
                   .setScaleX(2)
                   .setScaleY(1)
                   .setTranslateX(100)
                   .setTranslateY(200)
                   .build());
Logger.log('Inherent width: ' + shape.getInherentWidth()
                              + 'pt; Inherent height: '
                              + shape.getInherentHeight() + 'pt.');

La sortie de journal attendue de ce script est la suivante:

Inherent width: 236.2pt; Inherent height: 236.2pt.

La forme obtenue aura la transformation, ainsi que la taille et la position de rendu suivantes:

AffineTransform{scaleX=2.0, scaleY=1.0, shearX=0.0, shearY=0.0, translateX=100.0, translateY=200.0}
Left: 100pt; Top: 200pt; Width: 472.4pt; Height: 236.2pt; Rotation: 0°.