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 poniższych przykładach używane są te zmienne:

  • PRESENTATION_ID—wskazuje, gdzie należy podać identyfikator prezentacji. Wartość tego identyfikatora można poznać 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 miejsce, w którym podajesz 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 pobierać za pomocą żądania odczytu interfejsu API.

Te przykłady są prezentowane jako żądania HTTP bez względu na język. Aby dowiedzieć się, jak zaimplementować aktualizację zbiorczą w różnych językach za pomocą bibliotek klienta interfejsów 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 kodziepresentations.batchUpdate pokazujemy, jak za pomocą metody CreateShapeRequesttworzyć 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. Współrzędna X nowego prostokąta powinna być taka sama jak współrzędna X strzałki, by jego lewa krawędź była wyrównana. 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 (1270 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 linii środkowej nowego okręgu wymaga uwzględnienia wysokości zarówno strzałki, jak 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 są więc następujące:

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 będzie spoczywany we współrzędnej (X,Y) = (2040000, 115000) EMU.

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

Odbicie elementu

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

Aby to zrobić, użyj podstawowej transformacji odbicia w ramce odniesienia elementu. Dla jasności przesunięcie i odbicie 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ć 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ą wyrażone 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 ramki referencyjnej i skalowanie są wyświetlane z 3 osobnymi wywołaniami metody UpdatePageElementTransformRequest, ale lepiej jest wstępnie obliczyć iloczyn tych macierzy przekształceń, a następnie zastosować je jako pojedyncze żądanie.

W przypadku przekształceń tłumaczenia środek kształtu strzałki jest przesuwany do punktu początkowego i z powrotem. Wartości parametrów są dla przejrzystości wyrażone jako obliczenia.

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 obroturamce odniesienia elementu. Dla jasności: przesunięcie ramki referencyjnej i rotacja są wyświetlane z 3 osobnymi wywołaniami metody UpdatePageElementTransformRequest, ale lepiej jest wstępnie obliczyć iloczyn tych macierzy przekształceń, a następnie zastosować go jako pojedyncze żądanie.

W przypadku przekształceń tłumaczenia środek kształtu strzałki jest przesuwany do punktu początkowego i z powrotem. Wartości parametrów są wyrażone 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"
        }
      }
    }
  ]
}