Adobe XD でとりあえず何か作りたくて学んだこと

#まえおき
この記事はAdobe XD Plugin Advent Calendar 19日目の記事です。

投稿が遅くなり申し訳ありません。
XDのプラグインを何か作りたいと思い もともと英語にとても長けているわけではない中で[Adobe XD Platform](https://adobexdplatform.com/)のQuick Startを見ながら、ノロノロペースでおぼろげながら進めていましたプラグイン開発。でも、[はじめてのAdobe XDプラグイン開発](https://connpass.com/event/109735/) と  [「Adobe XD meeting extra 2」](https://xd-study.connpass.com/event/109863/) に参加できたお陰で開発環境の構築方法やmain.jsの書き方などなど、再確認してさらに深く知ることができました。

参考になるかどうか分かりませんが、開発環境やプラグインの作り方などなどで学んだことを書かせていただければと思っております。よろしくお願い致します！

#開発環境で使っているもの
Mac
Adobe XD 14.0
Sublime Text3
Github
Adobe xdpm

# 環境の準備
そのまま開発をすると Adobe XD の開発用フォルダで開発することとなるので、Adobe xdpmを入れることをおすすめします。なお、npmのプラグインのためNode.jsのインストール環境が必要です。

## 自分のフォルダの設定
Adobe XD の開発フォルダで開発するのと同じように、自分の開発用フォルダに同じファイルを用意して開発できる準備をします。

## インストール
開発フォルダは"XD"にしましたので、"XD"に移動してインストールします。
xdpmは以下よりインストールできます。
[Adobe xdpm](https://github.com/AdobeXD/xdpm)

```
npm install -g @adobe/xdpm
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/70116/c6f8a3c4-280c-1e7d-23b4-e0960f5dc481.png)

## データの更新方法
自分の開発環境のmain.jsやmanifest.jsonのコードを更新したら、プラグインのコマンドでAdobe XD　の　Developer フォルダデータを更新します。

```
xdpm install                            # Install the current folder into Adobe XD
xdpm install path/to/plugin             # Install the specified folder into Adobe XD
xdpm install -w release                 # Install to Adobe XD CC Release (`r` is also valid; default)
xdpm install -w prerelease              # Install to Adobe XD CC Prerelease (`p` is also valid)
xdpm install -o                         # Overwrite plugin if it exists
xdpm install -c                         # Install cleanly (remove existing)
```

初回の更新は `xdpm install` で更新されますが、２回目以上更新する場合は引数 `-o` をつけないとエラーが出たりして、少し面倒なので更新を監視する ` watch ` でDeveloperフォルダを更新するのがおすすめです。

```
xdpm watch                            # Watch current folder and install changes into Adobe XD
xdpm watch path/to/plugin             # Watch the specified folder and install changes into Adobe XD
xdpm watch -w release                 # Install to Adobe XD CC Release (`r` is also valid; default)
xdpm watch -w prerelease              # Install to Adobe XD CC Prerelease (`p` is also valid)
xdpm watch -c                         # Perform clean installs when watching
```
xdpmで更新内容をdevelopフォルダに反映したら、再読み込みでプラグインをリロードすれば、更新内容を確認できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/70116/42ddcfef-cc51-d949-a0ab-6304e79364e9.png)


# 開発
## 準備とかいろいろ
開発をするのにあたり、XDのサンプルを公式からダウンロード。

サンプルに最低限の内容が入っているので、サンプルを元にすると作りやすいかと思います。
[https://console.adobe.io/](https://console.adobe.io/)

### 開発データの中身
ダウンロードしたサンプルの中身は以下のようになっています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/70116/d185ce5e-b14d-a0d6-512e-30a5d6e684b5.png)

それぞれのファイルは以下のような役割です。
#### manifest.json
アプリの定義を記述するファイルでプラグインの対応バージョンやプラグイン名前、ディスクリプション、アイコンなどの設定を記述するファイル。
なお、内容に関しては [@aoisa](https://qiita.com/aoisa)さんの１０日目のアドベントカレンダー「[manifest.json の書き方](https://qiita.com/aoisa/items/5cb8cf2707b2aa884bbb)」がとても分かりやすく解説されてます。
#### images/
アイコンのイメージが入っています。
#### main.js
メインで動かすスクリプトを記述するファイル。メインループの導線を書き加えます。サンプルの中身は以下のようになっています。

```
/*
 * Sample plugin scaffolding for Adobe XD.
 *
 * Visit http://adobexdplatform.com/ for API docs and more sample code.
 */

var {Rectangle, Color} = require("scenegraph");

function myPluginCommand(selection) {
    // Go to Plugins > Development > Developer Console to see this log output
    console.log("Plugin command is running!");

    // Insert a red square at (0, 0) in the current artboard or group/container
    var shape = new Rectangle();
    shape.width = 100;
    shape.height = 100;
    shape.fill = new Color("#f00");
    selection.insertionParent.addChild(shape);
}

module.exports = {
    commands: {
        myPluginCommand: myPluginCommand
    }
};

```
ざっくり説明すると、一番下のmodule.exportsの箇所にmanifest.jsonで指定した、コマンドを紐付けます。module.exportsでcommandsに設定した名前がXDから選ぶメニュー名と同じにすると紐付け完了です。コマンドを増やす時は、manifest.jsonに記述を増やして、module.exportsの記述も同じように追記します。
APIでの操作などは [@risay](https://qiita.com/risay)さんの5日目のアドベントカレンダー「[Adobe XD APIで選択しているオブジェクトを操作する](https://qiita.com/risay/items/5d06d8f0dba823a98b61)」がとても分かりやすく説明してくださってます。

## ダイアログライブラリの追加
ダイアログを追加して、APIを動かした後の結果や操作を表示するオブジェクトはプラグインを追加することで使うことができます。
 [Adobe XD Plugin Helpers](https://github.com/AdobeXD/plugin-toolkit)

### インストール
```
npm install @adobe/xd-plugin-toolkit
```
### main.jsへの読み込み
ツールキットをインストール後、main.jsの上部にrequest();の記述があります。その下あたりにプラグインの読み込みします。

```
require('./lib/[module].js')
```

[module]には利用するライブラリのファイル名を指定します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/70116/02064c28-cf0b-373e-9f53-62326283919d.png)
ダイアログを使う時は dialogs.jsを指定します。

ダウンロードしたlib/はmain.jsと同じ階層に入れてあげるのが良いかなと。でもrequire（）でパスの設定ができるので、開発しやすいところに置くのが一番良いですね。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/70116/b930fd45-107c-ae74-54ff-7db1b033b460.png)

### manifest.jsonの記述
manifest.jsonダイアログを使用するためのコマンドを追記します。

```
  "uiEntryPoints": [
      {
      "type": "menu",
      "label": "hello color",
      "commandId": "helloCommand"
    },
      {
      "type": "menu",
      "label": "show an alert",
      "commandId": "showAlert"
    },
    {
      "type": "menu",
      "label": "show an error",
      "commandId": "showError"
    }
  ]

```
"uiEntryPoints"にアラート、またはエラーのメニューを追記します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/70116/3987a526-c244-a164-fdea-b4a90960e88c.png)
manifest.jsonのラベルが表示される


### main.jsの記述
module.exportsにダイアログのコマンドを追記。
XDのプラグインメニューから実行するための記述。

```
module.exports = { // コマンドIDとファンクションの紐付け
  commands: {
    helloCommand: helloHandlerFunction,
    showAlert: showAlertFunction,
    showError: showErrorFunction
  }
};
```

```
async function showAlertFunction() {
    /* we'll display a dialog here */
    console.log("アラート");
    await alert("Connect to the Internet", //[1]
    "In order to function correctly, this plugin requires access to the Internet. Please connect to a network that has Internet access."); //[2]
}

async function showErrorFunction() {
    /* we'll display a dialog here */
    console.log("エラー");
    await error("Synchronization Failed", //[1]
    "Failed to synchronize all your changes with our server. Some changes may have been lost.",
    "Steps you can take:",
    "* Save your document",
    "* Check your network connection",
    "* Try again in a few minutes"); //[2]

}
```

なお、ダイアログの中身はHTML+CSSで構築できます。
DOM操作にjQueryが使えるそうで、私はとても嬉しい。
また、[@clockmaker](https://qiita.com/clockmaker)さんの１１日目のアドベントカレンダー[Adobe XDプラグインをVueとBabel/TypeScriptで開発する方法](
https://qiita.com/clockmaker/items/6ded50e81a7b9f556ae7)には、開発しやすいVueでのユーザーインターフェース(UI)について書かれています。Vueの方が開発しやすい事が分かりやすく説明されています。Vueで作ろうかな。

ダイアログの公式チュートリアル
https://adobexdplatform.com/plugin-docs/tutorials/how-to-show-an-alert/?h=dialog

## Developer Console
プラグインメニューから開くことができるDeveloper Consoleスクリプトを動かして、数値がとれているかどうかは、ここで確認できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/70116/1b610c28-6775-a78b-f490-bc5696950b44.png)

# 最後に学んだリンク集
## 基礎
- [Adobe XD Platform](https://adobexdplatform.com/plugin-docs/tutorials/quick-start/)
-  [ Adobe XD Plugin「Scenegraph」の操作とDialogの作り方 by @yoshikinoko ](https://www.slideshare.net/yoshikinoko/adobe-xd-pluginscenegraphdialog?ref=https://connpass.com/event/109735/presentation/)
- https://github.com/yoshikinoko/XDPluginMeetupJapan
- [manifest.json の書き方](https://qiita.com/aoisa/items/5cb8cf2707b2aa884bbb)
- [XD Pluginお役立ちリンク集](https://qiita.com/ten_A_cclab/items/d610e4a8834ff962cc84)

## 応用
- [Adobe MAX 2018 XD Plugin API Labsでプラグインを作ってきた！](https://medium.com/@risayuguchi/max-2018-xd-plugin-api-lab-report-61b430e6b75e)
- [Adobe XDプラグインをVueとBabel/TypeScriptで開発する方法](
https://qiita.com/clockmaker/items/6ded50e81a7b9f556ae7)
- [計画がゆるふわ はじめてのAdobe XDプラグイン開発](https://xd.adobe.com/view/fd20bca4-99a2-4346-7c86-3ac29c36608f-8b11/?fbclid=IwAR2rPRGdj2GLH2rwl3KMKWeXePF8eQlRym_WNbt9bfquk6PXfXpT5-74DlE)

# 最後に
作りたいものが他に特に思いつかないので、すでにリリースされている色のコントラスト比を測るツールを作成中です。コントラスト比を出す方程式をJavaScriptに置き換えまでとりあえず進めたので、まずは、今の段階で結果を返すダイアログに結果を渡して表示できるようにこれから構築します。
完成は、来年になりそうかな。まだ先は長いです・・・・。