Operacje przekształcania

Interfejs API Prezentacji Google umożliwia manipulowanie lokalizacją, rozmiarem i orientacją PageElement (pola tekstowe, obrazy, tabele i podstawowe kształty) na stronie, przy jednoczesnym zachowaniu linii prostych i zachowując punkty oraz linie równoległe. Nazywamy je transformacjami afinicznymi. Przykłady pokazują typowe operacje transformacji elementów strony za pomocą metody presentations.batchUpdate.

W tych przykładach użyto tych zmiennych:

  • PRESENTATION_ID—wskazuje, gdzie należy podać identyfikator prezentacji. Wartość tego identyfikatora możesz znaleźć w adresie URL prezentacji.
  • PAGE_ID—Wskazuje, gdzie należy podać identyfikator obiektu strony. Wartość tej opcji możesz pobrać z adresu URL lub za pomocą żądania odczytu interfejsu API.
  • PAGE_ELEMENT_ID—Wskazuje, gdzie należy podać identyfikator obiektu elementu strony. Możesz podać ten identyfikator dla tworzonych elementów (z niektórymi ograniczeniami) lub pozwolić interfejsowi Slides API na automatyczne utworzenie identyfikatora. Identyfikatory elementów można pobrać za pomocą żądania odczytu interfejsu API.

Te przykłady są przedstawione jako żądania HTTP, aby były neutralne pod względem języka. Aby dowiedzieć się, jak zaimplementować aktualizację zbiorczą w różnych językach za pomocą bibliotek klienta interfejsu Google API, przeczytaj artykuł Dodawanie kształtów i tekstu.

Przykład kształtu strzałki

W przypadku przykładów poniżej przyjmij, że istnieje element strony w kształcie strzałki o tych danych dotyczących rozmiaru i przekształcenia (które można znaleźć w ramach żądania metody presentations.pages.get). Przykładowa figura używa jednostek unit EMU (angielskie jednostki metryczne) 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 jednego elementu do drugiego

W tym przykładowym kodzie presentations.batchUpdate pokazujemy, jak za pomocą metody CreateShapeRequest tworzyć nowe kształty w prawidłowych 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 pikseli, który jest wyrównany do lewej krawędzi kształtu strzałki, ale jest umieszczony 50 pikseli (50 * 12 700 = 635 000 EMU) poniżej górnej krawędzi strzałki. Aby zachować wyrównanie lewej krawędzi, współrzędna X nowego prostokąta powinna być taka sama jak współrzędna X strzałki. Składnik Y jest taki sam jak współrzędna Y strzałki plus 50 pikseli, ponieważ odległość jest mierzona od wierzchołka strzałki. Współrzędne prostokąta:

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

Drugie żądanie tworzy okrąg o szerokości 40 punktów, który ma tę samą poziomą środkową linię co 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 punktów. Wymuszenie wyrównania środka nowego okręgu do linii środkowej wymaga uwzględnienia wysokości strzałki i okręgu. współrzędna Y koła jest równa współrzędnej Y strzałki plus połowa wysokości strzałki minus połowa wysokości koła. W obu przypadkach należy wziąć pod uwagę współczynniki skalowania związane ze strzałką, ponieważ wpływają one na renderowaną szerokość i wysokość strzałki. Współrzędne okręgu:

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 służący do dopasowania jednego elementu do drugiego:

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

Ten przykładowy kod presentations.batchUpdate pokazuje, jak za pomocą metody UpdatePageElementTransformRequest przetłumaczyć element strony przykładowy kształt strzałki na 2 różne sposoby.

Pierwsze żądanie w zbiorze przesuwa strzałkę do współrzędnych (X,Y) = (2000000, 150000) EMU (za pomocą przesunięcia bezwzględnego applyMode). Drugie żądanie w zbiorze przesuwa strzałkę o 40 000 EMU w prawo i 35 000 EMU w górę (za pomocą przesunięcia względnego applyMode). Macierze transformacji1 użyte w tym przykładzie zostały skonstruowane tak, aby uniknąć zmiany rozmiaru i orientacji elementu.

Po wykonaniu obu żądań lewy górny róg strzałki znajduje się w sygnaturze 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"
        }
      }
    }
  ]
}

Odzwierciedlanie elementu

Ten przykładowy kod presentations.batchUpdate pokazuje, jak za pomocą metody UpdatePageElementTransformRequest odzwierciedlić element strony kształt strzałki poziomo wzdłuż jego środka, nie zmieniając jego położenia na stronie ani nie zmieniając jego skali.

Aby to zrobić, użyj podstawowej transformacji odbicia w ramce odniesienia elementu. Dla ułatwienia przesunięcie i odbicie układu odniesienia są pokazane za pomocą 3 oddzielnych wywołań metody UpdatePageElementTransformRequest, ale wydajniej jest najpierw obliczyć iloczyn tych macierzy przekształceń, a następnie zastosować go jako pojedyncze żądanie.

W przypadku przekształceń translacji środek kształtu strzałki jest przesuwany w kierunku lub od początku. Wartości parametrów są podawane w postaci obliczeń w celu zwiększenia przejrzystości.

Oto protokół żądania, który odzwierciedla 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 za pomocą metody UpdatePageElementTransformRequest zmienić rozmiar elementu strony przykładowy kształt strzałki tak, aby był szerszy o 50% i mniejszy o 20% od bieżącej wysokości, zachowując przy tym środek strzałki w tej samej pozycji i nie zmieniając jej orientacji.

Aby to zrobić, użyj podstawowej transformacji skalowania w ramce odniesienia elementu. Dla jasności przesunięcie i skalowanie układu odniesienia są pokazane za pomocą 3 osobnych wywołań metody UpdatePageElementTransformRequest, ale bardziej wydajne jest wstępne obliczenie iloczynu tych macierzy przekształceń, a następnie zastosowanie tego iloczynu jako pojedynczego żądania.

W przypadku przekształceń translacji środek kształtu strzałki jest przesuwany do punktu początkowego i z powrotem. Wartości parametrów są podawane w postaci obliczeń w celu zwiększenia przejrzystości.

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

Obrócenie elementu wokół jego środka

Ten przykładowy kod presentations.batchUpdate pokazuje, jak za pomocą metody UpdatePageElementTransformRequest obrócić element strony kształt strzałki o 35 stopni w przeciwnym kierunku ruchu wskazówek zegara, zachowując przy tym jego środek w tej samej pozycji i nie zmieniając jego rozmiaru.

W tym celu należy użyć podstawowej transformacji obrotu w ramce odniesienia elementu. Dla ułatwienia przesunięcie i obrót układu odniesienia są pokazane za pomocą 3 osobnych wywołań metody UpdatePageElementTransformRequest, ale wydajniej jest najpierw obliczyć iloczyn tych macierzy przekształceń, a następnie zastosować ten iloczyn jako pojedyncze żądanie.

W przypadku przekształceń translacji środek kształtu strzałki jest przesuwany do punktu początkowego i z powrotem. Wartości parametrów są podawane w postaci obliczeń w celu zwiększenia przejrzystości.

Oto protokół żądania służący do obracania 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"
        }
      }
    }
  ]
}