Operacje przekształcania

Interfejs Google Slides API umożliwia manipulowanie położeniem, rozmiarem i orientacją PageElement (pól tekstowych, obrazów, tabel i kształtów podstawowych) na stronie, przy jednoczesnym zachowaniu prostych linii oraz punktów i linii równoległych. Są to tzw. transformacje afiniczne. Przykłady pokazują typowe operacje przekształcania elementów strony za pomocą metody presentations.batchUpdate.

W tych przykładach używamy tych zmiennych:

  • PRESENTATION_ID– wskazuje, gdzie podajesz identyfikator prezentacji. Wartość tego identyfikatora znajdziesz w adresie URL prezentacji.
  • PAGE_ID– wskazuje, gdzie podajesz identyfikator obiektu strony. Wartość tego parametru możesz pobrać z adresu URL lub za pomocą żądania odczytu interfejsu API.
  • PAGE_ELEMENT_ID – wskazuje miejsce, w którym podajesz identyfikator obiektu elementu strony. Możesz określić ten identyfikator dla tworzonych elementów (z pewnymi ograniczeniami) lub zezwolić interfejsowi Slides API na automatyczne utworzenie identyfikatora. Identyfikatory elementów można pobrać za pomocą żądania odczytu interfejsu API.

Przykłady te są przedstawione jako żądania HTTP, aby były niezależne od języka. Aby dowiedzieć się, jak wdrożyć aktualizację zbiorczą w różnych językach za pomocą bibliotek klienta interfejsu Google API, przeczytaj artykuł Dodawanie kształtów i tekstu.

Przykładowy kształt strzałki

W przypadku poniższych przykładów załóżmy, że istnieje przykładowy element strony w kształcie strzałki o tych rozmiarach i danych przekształcenia (które można znaleźć za pomocą żądania metody presentations.pages.get). W przykładzie kształtu użyto jednostek miary unit EMU (English Metric Unit) i pt (punkt).

{
  "objectId": PAGE_ELEMENT_ID,
  "size": {
    "width": {
      "magnitude": 3000000,
      "unit": "EMU"
    },
    "height": {
      "magnitude": 3000000,
      "unit": "EMU"
    }
  },
  "transform": {
    "scaleX": 0.3,
    "scaleY": 0.12,
    "shearX": 0,
    "shearY": 0,
    "translateX": 2000000,
    "translateY":  550000,
    "unit": "EMU"
  },
  "shape": {
    "shapeType": "RIGHT_ARROW"
  }
}

Wyrównywanie elementu z innym

Poniższy przykładowy kod presentations.batchUpdate pokazuje, jak za pomocą metody CreateShapeRequest tworzyć nowe kształty w odpowiednich pozycjach, które są wyrównane z przykładowym kształtem strzałki na stronie. W obu przypadkach należy obliczyć współrzędne X i Y lewego górnego rogu nowego kształtu.

Pierwsze żądanie tworzy prostokąt o wymiarach 100 x 50 pt, który jest wyrównany do lewej krawędzi kształtu strzałki, ale znajduje się 50 pt (50 * 12 700 = 635 000 EMU) poniżej górnej krawędzi strzałki. Współrzędna X nowego prostokąta powinna być taka sama jak współrzędna X strzałki, aby zachować wyrównanie lewej krawędzi. Współrzędna Y jest taka sama jak współrzędna Y strzałki plus 50 pt, ponieważ odległość jest mierzona od góry strzałki. Współrzędne prostokąta to:

x" = 2000000 EMU
y" = 550000 + (50 * 12700) = 1185000 EMU

Drugie żądanie tworzy okrąg o szerokości 40 punktów, który ma taką samą poziomą linię środkową jak przykładowa strzałka, ale jest umieszczony 100 punktów (1 270 000 EMU) na prawo od prawej krawędzi strzałki. Współrzędna X okręgu to suma współrzędnej X strzałki, szerokości strzałki i 100 pt. Wymaganie wyrównania do linii środkowej w przypadku nowego okręgu wymaga uwzględnienia wysokości zarówno strzałki, jak i okręgu. Współrzędna Y okręgu to współrzędna Y strzałki plus połowa wysokości strzałki minus połowa wysokości okręgu. W obu przypadkach należy też uwzględnić współczynniki skalowania powiązane ze strzałką, ponieważ wpływają one na jej renderowaną szerokość i wysokość. Współrzędne okręgu to:

x = 2000000 + (0.3 * 3000000) + (100 * 12700) = 4170000 EMU
y = 550000 + (0.5 * 0.12 * 3000000) - (0.5 * 40 * 12700) = 476000 EMU

Oto protokół żądania, który umożliwia wyrównanie elementu z innym elementem:

POST https://slides.googleapis.com/v1/presentations/PRESENTATION_ID:batchUpdate
{
  "requests": [
    {
      "createShape": {
        "shapeType": "RECTANGLE",
        "elementProperties": {
          "pageObjectId": PAGE_ID,
          "size": {
            "width": {
              "magnitude": 100,
              "unit": "PT"
            },
            "height": {
              "magnitude": 50,
              "unit": "PT"
            }
          },
          "transform": {
            "scaleX": 1,
            "scaleY": 1,
            "translateX": 2000000,
            "translateY": 1185000,
            "unit": "EMU"
          }
        }
      }
    },
    {
      "createShape": {
        "shapeType": "ELLIPSE",
        "elementProperties": {
          "pageObjectId": PAGE_ID,
          "size": {
            "width": {
              "magnitude": 40,
              "unit": "PT"
            },
            "height": {
              "magnitude": 40,
              "unit": "PT"
            }
          },
          "transform": {
            "scaleX": 1,
            "scaleY": 1,
            "translateX": 4170000,
            "translateY":  476000,
            "unit": "EMU"
          }
        }
      }
    }
  ]
}

Przenoszenie elementu

Poniższy przykładowy kod presentations.batchUpdate pokazuje, jak użyć metody UpdatePageElementTransformRequest do przetłumaczenia elementu strony przykładu kształtu strzałki na 2 różne sposoby.

Pierwsza prośba w partii przesuwa strzałkę do współrzędnych (X,Y) = (2000000, 150000) jednostki EMU (za pomocą przesunięcia bezwzględnego applyMode). Druga prośba w partii przesuwa strzałkę o 40 000 jednostek EMU w prawo i 35 000 jednostek EMU w górę (za pomocą przesunięcia względnego applyMode). Użyte macierze transformation1 są skonstruowane tak, aby nie zmieniać rozmiaru ani orientacji elementu.

Po wykonaniu obu żądań lewy górny róg strzałki będzie znajdować się na współrzędnej EMU (X,Y) = (2040000, 115000).

Oto protokół żądania przeniesienia elementu:

POST https://slides.googleapis.com/v1/presentations/PRESENTATION_ID:batchUpdate
{
  "requests": [
    {
      "updatePageElementTransform": {
        "objectId": PAGE_ELEMENT_ID,
        "applyMode": "ABSOLUTE",
        "transform": {
            "scaleX": 0.3,
            "scaleY": 0.12,
            "translateX": 2000000,
            "translateY":  150000,
            "unit": "EMU"
        }
      }
    },
    {
      "updatePageElementTransform": {
        "objectId": PAGE_ELEMENT_ID,
        "applyMode": "RELATIVE",
        "transform": {
            "scaleX": 1,
            "scaleY": 1,
            "translateX":  40000,
            "translateY": -35000,
            "unit": "EMU"
        }
      }
    }
  ]
}

Odbijanie elementu

Poniższy przykładowy kod presentations.batchUpdate pokazuje, jak użyć metody UpdatePageElementTransformRequest, aby odbić element strony example arrow shape w poziomie wzdłuż jego środka bez zmiany jego położenia na stronie ani skalowania.

W tym celu w ramce odniesienia elementu używana jest podstawowa transformacja odbicia. Aby było to bardziej przejrzyste, przesunięcie i odbicie układu odniesienia są przedstawione za pomocą 3 oddzielnych wywołań metody UpdatePageElementTransformRequest, ale bardziej efektywne jest wstępne obliczenie iloczynu tych macierzy przekształceń, a następnie zastosowanie tego iloczynu jako pojedynczego żądania.

W przypadku przekształceń tłumaczenia środek kształtu strzałki jest przenoszony do i z punktu początkowego. Wartości parametrów są podane w postaci obliczeń, aby były bardziej przejrzyste.

Oto protokół żądania odzwierciedlający element:

POST https://slides.googleapis.com/v1/presentations/PRESENTATION_ID:batchUpdate
{
  "requests": [
    {
      "updatePageElementTransform": {
        "objectId": PAGE_ELEMENT_ID,
        "applyMode": "RELATIVE",
        "transform": {
            "scaleX":  1,
            "scaleY":  1,
            "translateX": -2000000 - 0.5 * 0.3  * 3000000,
            "translateY":  -550000 - 0.5 * 0.12 * 3000000,
            "unit": "EMU"
        }
      }
    },
    {
      "updatePageElementTransform": {
        "objectId": PAGE_ELEMENT_ID,
        "applyMode": "RELATIVE",
        "transform": {
            "scaleX": -1,
            "scaleY":  1,
            "unit": "EMU"
        }
      }
    },
    {
      "updatePageElementTransform": {
        "objectId": PAGE_ELEMENT_ID,
        "applyMode": "RELATIVE",
        "transform": {
            "scaleX":  1,
            "scaleY":  1,
            "translateX":  2000000 + 0.5 * 0.3  * 3000000,
            "translateY":   550000 + 0.5 * 0.12 * 3000000,
            "unit": "EMU"
        }
      }
    }
  ]
}

Zmienianie rozmiaru elementu

Poniższy przykładowy kodpresentations.batchUpdate pokazuje, jak za pomocą metodyUpdatePageElementTransformRequest zmienić rozmiar elementu strony example arrow shape, aby był o 50% szerszy i miał tylko 80% obecnej wysokości, przy jednoczesnym zachowaniu środka strzałki w tym samym miejscu i utrzymaniu jej orientacji.

Odbywa się to za pomocą podstawowej transformacji skalowaniaramce odniesienia elementu. Aby było jaśniej, przesunięcie i skalowanie układu odniesienia są przedstawione za pomocą 3 oddzielnych wywołań metody UpdatePageElementTransformRequest, ale bardziej efektywne jest wstępne obliczenie iloczynu tych macierzy przekształceń, a następnie zastosowanie tego iloczynu jako pojedynczego żądania.

W przypadku przekształceń tłumaczenia środek kształtu strzałki jest przenoszony do i z punktu początkowego. Wartości parametrów są podane w postaci obliczeń, aby były bardziej przejrzyste.

Oto protokół żądania zmiany rozmiaru elementu:

POST https://slides.googleapis.com/v1/presentations/PRESENTATION_ID:batchUpdate
{
  "requests": [
    {
      "updatePageElementTransform": {
          "objectId": PAGE_ELEMENT_ID,
          "applyMode": "RELATIVE",
          "transform": {
              "scaleX":  1,
              "scaleY":  1,
              "translateX": -2000000 - 0.5 * 0.3  * 3000000,
              "translateY":  -550000 - 0.5 * 0.12 * 3000000,
              "unit": "EMU"
          }
      }
    },
    {
      "updatePageElementTransform": {
        "objectId": PAGE_ELEMENT_ID,
        "applyMode": "RELATIVE",
        "transform": {
            "scaleX": 1.5,
            "scaleY": 0.8,
            "unit": "EMU"
        }
      }
    },
    {
      "updatePageElementTransform": {
        "objectId": PAGE_ELEMENT_ID,
        "applyMode": "RELATIVE",
        "transform": {
            "scaleX":  1,
            "scaleY":  1,
            "translateX":  2000000 + 0.5 * 0.3  * 3000000,
            "translateY":   550000 + 0.5 * 0.12 * 3000000,
            "unit": "EMU"
        }
      }
    }
  ]
}

Obracanie elementu wokół jego środka

Poniższy przykładowy kodpresentations.batchUpdate pokazuje, jak za pomocą metodyUpdatePageElementTransformRequestobrócić element strony w postaci przykładowej strzałki o 35 stopni w kierunku przeciwnym do ruchu wskazówek zegara, zachowując przy tym położenie środka strzałki i jej rozmiar.

Odbywa się to za pomocą podstawowej transformacji obrotuukładzie odniesienia elementu. Dla jasności przesunięcie i obrót układu odniesienia są przedstawione za pomocą 3 oddzielnych wywołań metody UpdatePageElementTransformRequest, ale bardziej efektywne jest wstępne obliczenie iloczynu tych macierzy przekształceń, a następnie zastosowanie tego iloczynu jako pojedynczego żądania.

W przypadku przekształceń tłumaczenia środek kształtu strzałki jest przenoszony do i z punktu początkowego. Wartości parametrów są podane w postaci obliczeń, aby były bardziej przejrzyste.

Oto protokół żądania, który umożliwia obracanie elementu wokół jego środka:

POST https://slides.googleapis.com/v1/presentations/PRESENTATION_ID:batchUpdate
{
  "requests": [
    {
      "updatePageElementTransform": {
          "objectId": PAGE_ELEMENT_ID,
          "applyMode": "RELATIVE",
          "transform": {
              "scaleX":  1,
              "scaleY":  1,
              "translateX": -2000000 - 0.5 * 0.3  * 3000000,
              "translateY":  -550000 - 0.5 * 0.12 * 3000000,
              "unit": "EMU"
          }
      }
    },
    {
      "updatePageElementTransform": {
        "objectId": PAGE_ELEMENT_ID,
        "applyMode": "RELATIVE",
        "transform": {
            "scaleX":  cos(35 * (pi/180)),
            "scaleY":  cos(35 * (pi/180)),
            "shearX":  sin(35 * (pi/180)),
            "shearY": -sin(35 * (pi/180)),
            "unit": "EMU"
        }
      }
    },
    {
      "updatePageElementTransform": {
        "objectId": PAGE_ELEMENT_ID,
        "applyMode": "RELATIVE",
        "transform": {
            "scaleX":  1,
            "scaleY":  1,
            "translateX":  2000000 + 0.5 * 0.3  * 3000000,
            "translateY":   550000 + 0.5 * 0.12 * 3000000,
            "unit": "EMU"
        }
      }
    }
  ]
}