変換オペレーション

Google Slides API を使用すると、ページ上の PageElement(テキスト ボックス、画像、表、基本図形)の位置、サイズ、向きを操作できます。このとき、線はまっすぐに保たれ、点と平行線は維持されます。これらはアフィン変換と呼ばれます。次の例では、presentations.batchUpdate メソッドを使用して、一般的なページ要素の変換オペレーションを示します。

これらの例では、次の変数を使用します。

  • PRESENTATION_ID - プレゼンテーション ID を指定する場所を示します。この ID の値は、プレゼンテーションの URL から確認できます。
  • PAGE_ID - ページ オブジェクト ID を指定する場所を示します。この値は、URL から取得するか、API 読み取りリクエストを使用して取得できます。
  • PAGE_ELEMENT_ID - ページ要素オブジェクト ID を指定する場所を示します。この ID は、作成する要素に指定することも(いくつかの制限あり)、Slides API に自動的に作成させることもできます。要素 ID は、API 読み取りリクエストで取得できます。

これらの例は、言語に依存しない HTTP リクエストとして示されています。Google API クライアント ライブラリを使用してさまざまな言語でバッチ更新を実装する方法については、図形とテキストを追加するをご覧ください。

矢印の形状の例

以下の例では、次のサイズと変換データを持つ矢印の形のページ要素の例が存在すると仮定します(これは presentations.pages.get メソッド リクエストで取得できます)。この例のシェイプでは、unit EMU(English Metric Unit)と pt(ポイント)という測定単位を使用しています。

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

要素を別の要素に合わせる

次の presentations.batchUpdate コードサンプルは、CreateShapeRequest メソッドを使用して、ページ上の矢印の例に沿って正しい位置に新しい図形を作成する方法を示しています。どちらの場合も、新しいシェイプの左上隅の X 座標と Y 座標を計算する必要があります。

最初のリクエストでは、矢印の左の境界線に揃えられ、矢印の上端から 50 pt(50 * 12,700 = 635,000 EMU)下に配置された 100 × 50 pt の長方形が作成されます。新しい長方形の X 座標は、矢印の X 座標と同じにして、左の境界線を揃える必要があります。矢印の上部から距離を測定するため、Y 座標は矢印の Y 座標に 50 pt を加えた値になります。したがって、長方形の座標は次のようになります。

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

2 番目のリクエストでは、例の矢印と同じ水平方向の中心線を持つ、幅 40 ポイントの円を作成します。ただし、矢印の右端から 100 ポイント(1,270,000 EMU)右に配置されます。円の X 座標は、矢印の X 座標、矢印の幅、100 pt の合計です。新しい円の中心線の配置を強制するには、矢印と円の両方の高さを考慮する必要があります。円の Y 座標は、矢印の Y 座標に矢印の高さの半分を足し、円の高さの半分を引いた値になります。どちらの場合も、矢印に関連付けられたスケーリング係数も考慮する必要があります。これは、矢印のレンダリングされた幅と高さに影響するためです。したがって、円の座標は次のようになります。

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

要素を別の要素に合わせるリクエスト プロトコルは次のとおりです。

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

要素を移動する

次の presentations.batchUpdate コードサンプルは、UpdatePageElementTransformRequest メソッドを使用して、矢印の例のページ要素を 2 つの異なる方法で変換する方法を示しています。

バッチの最初のリクエストは、矢印を(X、Y)=(2000000、150000)EMU 座標に移動します(絶対変換 applyMode を使用)。バッチの 2 番目のリクエストは、矢印をそこから移動します。今回は 40,000 EMU 右に、35,000 EMU 上に移動します(相対変換 applyMode を使用)。使用される変換 1 行列は、要素のサイズと向きを変更しないように構築されています。

両方のリクエストを実行すると、矢印の左上隅は (X,Y) = (2040000, 115000) EMU 座標に配置されます。

要素を移動するリクエスト プロトコルは次のとおりです。

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

要素を反転する

次の presentations.batchUpdate コードサンプルは、UpdatePageElementTransformRequest メソッドを使用して、矢印の例の図形のページ要素を、ページ上の位置やスケーリングを変更せずに、中心に沿って水平方向に反転する方法を示しています。

これは、要素の参照フレーム基本的な反射変換を使用することで実現されます。わかりやすくするために、参照フレームのシフトと反射は UpdatePageElementTransformRequest メソッドへの 3 つの別々の呼び出しで示されていますが、これらの変換行列の積を事前に計算し、その積を 1 つのリクエストとして適用する方が効率的です。

変換の場合、矢印の形状の中心が原点との間で移動します。パラメータ値は、わかりやすくするために計算式で表しています。

要素を反映するリクエスト プロトコルは次のとおりです。

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

要素のサイズを変更する

次の presentations.batchUpdate コードサンプルは、UpdatePageElementTransformRequest メソッドを使用して、矢印の図形のページ要素を 50% 幅広にし、高さを 80% に縮小しながら、矢印の中心を同じ位置に保ち、向きを維持する方法を示しています。

これは、要素の参照フレーム基本的なスケーリング変換を使用することで行われます。わかりやすくするために、基準フレームのシフトとスケーリングは UpdatePageElementTransformRequest メソッドへの 3 つの別々の呼び出しで示されていますが、これらの変換行列の積を事前に計算し、その積を 1 つのリクエストとして適用する方が効率的です。

変換の場合、矢印の形状の中心が原点との間で移動します。パラメータ値は、わかりやすくするために計算式で表しています。

要素のサイズを変更するリクエスト プロトコルは次のとおりです。

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

要素を中心を軸に回転させる

次の presentations.batchUpdate コードサンプルは、UpdatePageElementTransformRequest メソッドを使用して、矢印の中心を同じ位置に保ち、サイズを維持しながら、矢印の形のページ要素の例を反時計回りに 35 度回転させる方法を示しています。

これは、要素の基準フレーム基本的な回転変換を使用することで実現されます。わかりやすくするために、基準フレームのシフトと回転は UpdatePageElementTransformRequest メソッドへの 3 つの別々の呼び出しで示されていますが、これらの変換行列の積を事前に計算し、その積を 1 つのリクエストとして適用する方が効率的です。

変換の場合、矢印の形状の中心が原点との間で移動します。パラメータ値は、わかりやすくするために計算式で表しています。

要素を中心を軸に回転させるリクエスト プロトコルは次のとおりです。

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