マリオネット解説講座

第8回「外部ライブラリの使い方」

ArchitectLandmarkSpotlightDesigner2020

マリオネットではノードに埋め込まれたPythonコードのプログラムを直接編集することでオリジナルのノードを作成することができます。Pythonでは外部のライブラリを使うことによって機能を拡張することができます。これをマリオネットのプログラムで利用する方法をご紹介します。

今回は上級者向けの内容です。Pythonのコーディングの知識が必要となります。

Pythonの世界では外部ライブラリの開発が盛んに行われています。AIをはじめ、幾何学計算や物理演算、画像解析など高機能のもの、ファイル操作、GUIの表示、メモリの管理など様々な用途のライブラリを見つけることができます。
これらのライブラリは「PyPI」というPythonのサードパーティパッケージが管理されているWebサイトで取得することができます。PyPI以外では、「Python 外部ライブラリ」や「Python AI」など直接検索しても欲しいライブラリが簡単にヒットします。

8-1. 環境を整える

まずは、お使いのVectorworksでPythonの外部ライブラリが利用できるように環境を整備します。

8-1-1. Vectorworks Python のバージョン確認

ライブラリ使用するためには、ライブラリが要求するバージョンと実行するPythonのバージョンを合わせる必要があります。Vectorworks上で次のPythonスクリプトを実行して確認します。

import sys
vs.AlrtDialog( sys.version )

1. リソースブラウザでスクリプトを新規作成

2. 言語をPythonに設定

3. コードを記述してOKで閉じる

4. スクリプトを実行

5. Pythonのバージョンが表示される

この場合、Pythonのバージョンは”3.5.2″となります。

8-1-2. 外部ライブラリインストールモジュール(pip)のアップデート

この手順は、Windows環境でのみ必要な作業となります。

1. コマンドプロンプトの起動

2. VectorworksPythonのパスに移動するコマンドを入力

>cd "C:¥Program files¥Vectorworks2020¥Python35"

2. pipバージョンアップのコマンドを入力

>python -m pip install --upgrade pip

8-1-3. Pythonパスの設定

プログラムからライブラリを呼び出すことができるように、ライブラリの置き場所を設定します。

1. 任意の場所に「Python Externals」フォルダを作成します。

2. Vectorworksを起動します。

3. ツール > プラグイン > スクリプトオブション メニューを実行します。

4. 追加…ボタンから、先ほど作成した「Python Externals」を指定します。

5. パスが追加されたことを確認してOKでダイアログを閉じます。

8-2. 外部ライブラリのインストールと使用

マリオネットに用意された外部ライブラリ用の関数を使用してインストールを行います。

Marionette.VerifyOrGetLib( libname, whlpath )

Marionette.VerifyOrGetLibは指定した名前のライブラリが利用可能かどうかチェックします。利用不可であればライブラリのインストールがされていない状態であると判断して、必要なライブラリのダウンロードを自動的に実行する関数です。

この関数では引数にライブラリのwhlファイルのURLを指定します。whlファイルのURLはpyplにアクセスして取得することができます。今回は、例としてデータをグラフ化できるライブラリ「matplotlib」をインストールします。

8-2-1. whlファイルURLの取得

1. PyPIにアクセス
https://pypi.org/

2. matplotlibを検索

3. Release historyからmatplotlibのバージョン2.2.5を表示

4. Download filesを表示

5. 環境にあったwhlファイルを探す

whlファイルの名前から判別します。MacOSでVectorworksPythonがバージョン3.5の場合は次のファイルとなります。

matplotlib-2.2.5-cp35-cp35m-macosx_10_6_intel.whl

6. リンクのURLを取得

8-2-2. ライブラリを使用可能にするためのコーディング

取得したwhlファイルのURLを使って次のようにコーディングします。

whlpath = 'https://files.pythonhosted.org/〜〜.whl'
libname = 'matplotlib'
if Marionette.VerifyOrGetLib( libname, whlpath ):
    ライブラリを使用する処理

このよう記述することで、初回実行時にライブラリのダウンロードが実行されます。ダウンロードしたライブラリは、ユーザフォルダ直下の「Python Externals」に展開されます。

※ ユーザフォルダへのアクセス方法
ツール > オプション > 環境設定... > ユーザフォルフォルダタブ > フォルダを直接表示

ダウンロードしたライブラリのファイル群を、8-1-3.で作成したライブラリ置き場のフォルダに移動します。この操作で、次回の実行時にライブラリが利用可能な状態になります。

8-3. matplotlibのノード化

matplotlibを使用したプログラムをコーディングして、他のノードからデータを受け取ってグラフ化するオリジナルノードを作成します。

8-3-1. ベースノード(Pass)を配置

オリジナルノードのベースとなる任意のノードを配置します。Passノードはなにもしない(空の)ノードのためコードの追加・変更がやり易く、カスタマイズに適しています。

8-3-2. ノード編集の有効化

ノードの編集画面を開いて1行目の記述を削除します。READONLYREFFILEの記述を削除することで、編集内容の保存が可能になります。

8-3-3. ノードの名前を変更

オリジナルのノードであることが分かりやすいようにノードの名前を変更します。7行目の「’Pass’」を「’Histogram’」に変更します。

8-3-4. コーディング

グラフを作成する部分のコーディングしていきます。RunNode内の#scriptのかたまりに次のように記述します。

# matplotlibの利用可能チェック

whlpath = 'https://files.pythonhosted.org/packages/52/c1/727417e5b5297a3dfc0cdcd2f14f5a1e61884ef8464bd0aa2df69a711901/matplotlib-2.2.5-cp35-cp35m-macosx_10_6_intel.whl'
libname = 'matplotlib'
if Marionette.VerifyOrGetLib( libname, whlpath ):
    
    # matplotlibの呼び出し

    from matplotlib import pyplot as plt
    
    # ヒストグラムの描画
    
    fig = plt.figure()
    plt.hist(x,15)
    
    # Vectorworks図面上にプロット
    
    import os
    imgpath = os.path.join( vs.GetFolderPath(12), 'tmpimg.png' )
    fig.savefig( imgpath )
    vs.ImportImageFile(imgpath, (0,0))

8-3-5. プログラムを保存

コーディングが完了したら、エディタ左上の歯車のアイコンをクリックしてスクリプトのコンパイルを実行します。問題なければOKボタンを押して閉じます。

8-4. 部屋の面積分布を可視化する

8-3.で作成したヒストグラムのノードを使用して、部屋の面積分布を可視化します。

8-4-1. スペース図形を用いた図面の準備

今回は次のような単層の住居を使用します。

8-4-2. スペースの面積を取得する

面積の取得には、Get Record Fieldノードを使用します。Get Record Fieldは、指定した図形のパラメータの値を取得することができます。図形のハンドルと図形の種類、パラメータの名称を次のように指定します。

・”hObj”:スペースのハンドル(Objs by Critノード)
Objs by Critノードを使用してすべてのスペース図形のハンドルを取得します。


・”sRecName”:Space(Stringノード)
・”sFldName”:Area(Stringノード)

ノードの準備ができたらそれぞれ接続します。

8-4-3. パラメータの数値化

Get Record Fieldで取得する値は文字列型のデータです。この値をグラフ化するには実数値に変換する必要があります。文字列から実数値への変換にはfloatノードを使用します。

Get Record Fieldの”sFldValue”ポートをfloatノードに接続します。

8-4-4. Histogramノードと接続

面積のデータが作成できたら、グラフを作成するノードに入力します。floatノードの出力ポートを、Histogramノードの入力ポートに接続します。

8-4-5. プログラムの実行

プログラムが完成したら、オブジェクト情報パレットから実行します。面積の分布を示すヒストグラムが作成されました。

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください