Vectorworks開発者サイトにて公開されているPython Pacakge Catalogから、高品質のグラフを生成するPythonの外部ライブラリplotlyをマリオネットで使ってみました。
バージョン2023のマリオネットツールでは、ノードの実行に必要なPythonライブラリを自動的にインストールする機能が新たに追加されました。
これまで難易度の高かったマリオネットでの外部ライブラリの利用が容易になりました。Pythonの強みともいえる豊富なライブラリをマリオネットでもフルに活用することができるようになりました。
Vectorworks開発者サイトではPython Pacakge CatalogとしてVectorworks2023のマリオネットツールでの利用に適したPythonライブラリとそのバージョンが公開されています。
このカタログの中で、個人的に初見のものがありましたので自動インストール機能の練習も兼ねて使ってみました。
34-1. plotly
plotlyはPythonでクオリティの高いグラフ作図してhtml上でインタラクティブに動かすことができるライブラリです。折れ線グラフ、散布図、面積グラフ、棒グラフ、箱ひげ図、ヒートマップ、バブルチャートなど、非常に多くの種類のグラフを扱うことができます。
34-2. 外部ライブラリの自動インストール
34-2-1. 自動インストールを定義する
plotlyの自動インストールを試すために、Passノードをベースにカスタムノードを一つ作ります。
まずはPassノードを配置して編集画面を開き、ノードの名前を変更します。この時、コードの1行目は削除して編集内容を保存します。
ノードのコンストラクタにライブラリの依存関係を定義します。Python Pacakge Catalogを見ながら、ライブラリの名前とバージョンをオプションのパラメータとして記述します。
-
- ノードの名前(任意) : plotly_graph
- ローカライズ名(任意) : 空欄
- ノードのバージョン(任意) : 1.0.0
- ライブラリの名前 : plotly
- ライブラリのバージョン : 5.5.0
34-2-2. 自動インストールを実行する
ノード定義に外部ライブラリの依存が記述された状態のノードが実行された時、対象のライブラリが利用可能かどうかチェックされます。チェック時にライブラリのインストールが確認できない場合は、必要なライブラリのインストールが実行されます。
それでは、34-2-1で作成したplotly_graphノードを実行します。
Pythonパッケージのインストールの画面が表示されました。環境にplotlyのライブラリが不足しているようです。「はい」を選択してインストールを実行します。この瞬間はワクワクしますね。
あれ?失敗しました。。。
もう一度チャレンジ。今度は成功しました。
詳細を見みると、plotlyの他にtenacityとsixというライブラリもインストールされています。plotlyの中でも外部ライブラリを利用しているということですね。
どうやら初回実行時にwhlファイルを置いておくフォルダが無いのが原因で、該当のフォルダは無ければ自動生成するようですがタイミングがちょっと遅く初回はうまくいかないようです。現状では、初めて自動インストールをする時はノードを2度実行する必要があります。ノードを配布する際は注意が必要ですね。
もう一度ノードを実行して、何も起こらないことを確認します。これで必要なライブラリが環境に揃っていることを確認できました。
34-3. plotlyでグラフを作る
34-3-1. sinカーブを描く
plotlyを利用してグラフを作成するノードを実装してみます。ここではsinカーブのグラフを描いてみます。
plotly_graphの編集画面を開いてコーディングします。RunNodeの#script以下に次のコードを入力してください。
#script import plotly # 最初にplotlyライブラリをimportする import math # 数学の標準ライブラリもimportする # 0~πの間のsinカーブの頂点データ(100点)を作成する x_data = [] y_data = [] for n in range( 100 ): x = 2*math.pi/100 * n x_data.append( x ) y_data.append( math.sin(x) ) # グラフ領域を定義 fig = plotly.graph_objects.Figure( data=[plotly.graph_objects.Scatter(x=x_data, y=y_data, name="sin")] ) # グラフを表示 fig.show()
編集内容を保存して、ノードを実行します。デフォルトのブラウザが起動してsinカーブのグラフが表示されます。
グラフ上でのマウス操作やブラウザの右上のアイコンからグラフをインタラクティブに動かすことができます。
34-3-2. 3Dのグラフを描く
plotlyでは複雑なグラフの表現も可能です。plotlyのWebサイトにいくつかサンプルコードが公開されていますので、これを利用して3Dのグラフを作図してみます。
※サンプルコードの中には、pandasなど別途ライブラリが必要なものがあります。必要に応じてライブラリのインストールをしてください。
次のコードをplotly_graphノードのRunNode内にコピペします。
Configure Surface Contour Levels
import plotly.graph_objects as go fig = go.Figure(go.Surface( contours = { "x": {"show": True, "start": 1.5, "end": 2, "size": 0.04, "color":"white"}, "z": {"show": True, "start": 0.5, "end": 0.8, "size": 0.05} }, x = [1,2,3,4,5], y = [1,2,3,4,5], z = [ [0, 1, 0, 1, 0], [1, 0, 1, 0, 1], [0, 1, 0, 1, 0], [1, 0, 1, 0, 1], [0, 1, 0, 1, 0] ])) fig.update_layout( scene = { "xaxis": {"nticks": 20}, "zaxis": {"nticks": 4}, 'camera_eye': {"x": 0, "y": -1, "z": 0.5}, "aspectratio": {"x": 1, "y": 1, "z": 0.2} }) fig.show()
ノードを実行します。3Dのグラフが生成されます。
34-3-3. データを受け取ってグラフ化する
最後に入力ポートから受け取ったデータの散布図を作成するノードを作成します。
次のデータを受け取るための入力ポートを設置します。
-
- x軸のデータ
- y軸のデータ
RunNodeには受け取ったデータから散布図を生成するコードを記述します。
def RunNode(self): #inputs x_data = self.Params.x.value y_data = self.Params.y.value #script import plotly.graph_objects as go fig = go.Figure( data=[ go.Scatter(x=x_data, y=y_data, mode="markers") ] ) fig.show() #outputs
コードの記述が完了したら、保存して編集画面を出ます。
次に、入力するデータを用意します。今回は簡単に100個のランダム値を生成します。0〜100のランダム値をxとyそれぞれ100個ずつ生成して、plotly_graphノードに入力します。
プログラムを実行します。生成されたランダム値がグラフにプロットされました。
今回Python Pacakge Catalogからplotlyを使用してみました。少し気になる不具合もありましたが、マリオネットでも外部ライブラリが使いやすい環境が整ってきたと感じます。
plotlyもまだまだ研究のしがいがありそうですし、マリオネットの外部ライブラリ活用については続報をお待ちください。
この機能を利用できる製品
Vectorworks Architect建築設計や内装、ディスプレイデザインに対応した先進的なBIM・インテリア設計支援機能、拡張機能、さらには豊富な建築向けのデータライブラリを搭載した建築/内装業界向け製品 |
|
Vectorworks Landmark地形モデルや多彩な植栽、灌水設備計画等に対応するランドスケープデザイン機能、さらには豊富な造園向けのデータライブラリを搭載した都市計画/造園業界向け製品 |
|
Vectorworks Spotlightステージプランニングやライティング計画に対応した先進的な舞台照明計画支援機能、さらには各種メーカー製のトラスや照明機材、音響機器等の豊富なデータライブラリを搭載したエンタテインメント業界向け製品 |
|
Vectorworks Design Suite専門分野別(建築設計/ディスプレイデザイン、ランドスケープデザイン、ステージデザイン&スポットライトプランニング)の設計支援機能、拡張機能、さらには豊富なデータライブラリを搭載した最上位の製品 |