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ą one nazywane transformacjami afinicznymi. 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 jego automatyczne utworzenie. 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 (angielskiej jednostki metrycznej) 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 względem innego elementu

Poniższy przykładowy kod presentations.batchUpdate pokazuje, jak za pomocą metody CreateShapeRequest tworzyć nowe kształty w odpowiednich miejscach, 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 pt, który ma taką samą poziomą linię środkową jak przykładowa strzałka, ale jest umieszczony 100 pt (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ę we współrzędnych 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 odzwierciedlić element strony przykładu kształtu strzałki 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. Dla jasności przesunięcie i odbicie układu odniesienia są pokazane w 3 oddzielnych wywołaniach 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 zwiększyć przejrzystość.

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 kod presentations.batchUpdate pokazuje, jak użyć metody UpdatePageElementTransformRequest, aby zmienić rozmiar elementu strony example arrow shape tak, 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 skalowaniaukładzie odniesienia elementu. Aby zachować przejrzystość, przesunięcie i skalowanie ramki odniesienia są przedstawione za pomocą 3 oddzielnych wywołań metody UpdatePageElementTransformRequest. Bardziej efektywne jest jednak wstępne obliczenie iloczynu tych macierzy przekształceń, a następnie zastosowanie go w ramach jednego żą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 zwiększyć przejrzystość.

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 zwiększyć przejrzystość.

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"
        }
      }
    }
  ]
}