2017.08.02.WED


Pure Python(CPython) によるRhinocerosの外部操作
IronpythonでNumpyが使えなくなり、機械学習系のライブラリもCPythonにしか対応していないため、RhinoでCPythonがどうにか使えないか調べてみた。

RhinocerosはCOMインターフェイスを公開しているため、Rhino5.tlb(タイプライブラリ)からRhinoScriptインターフェイスにアクセスできることがわかった。COMとは、Microsoft社が提唱している「ソフトウェアの部分的な機能に外部からアクセスするため仕様」だそうです。これはRhinoに限らず、ExcelやIllustratorにも用意されているようなので、調べてみると色々なアプリケーションが自動化できそう。

C#からRhinoへ接続する事例はあるが、CPythonでの事例が見つからなかったので、下記に記しておく。

用意されているインターフェイスは全てRhinoScriptのコマンドのようだが、ほぼrhinoscriptsyntaxと同じコマンドがありそうなので問題はなさそう。

インターフェイスの一覧はWindownsSDKに付属している「OleView.exe」のTypeLibraryから確認できる。

■動作環境
Wiondows 10
Pycharm
Anaconda 4.3.0
Python 2.7.13

■使用ライブラリ
comtypes

Rhino(32bit)を起動した状態で下記サンプルコードを実行

----------------------------------------------------------------------------------------------------------------
# coding:utf-8
from comtypes.client import CreateObject
from comtypes.client import GetModule

tlb = "C:\Program Files (x86)\Rhinoceros 5\System\Rhino5.tlb"
tls = "C:\Program Files (x86)\Rhinoceros 5\Plug-ins\RhinoScript.tlb"
IRhino = GetModule(tlb)
IRhinoScript = GetModule(tls)

interface_name = "Rhino5.Interface"
RhinoInterfaceObject = CreateObject(interface_name)

# Interface
RI = RhinoInterfaceObject.QueryInterface(IRhino.IRhino5Interface)
RS = RI.GetScriptObject()
rs = RS.QueryInterface(IRhinoScript.IRhinoScript)

pt = [10.0, 10.0, 10.0]
rs.AddPoint(pt)
rs.Print("Hello Rhino")

----------------------------------------------------------------------------------------------------------------


■問題点
・実行しないとtlbファイルが読み込まれないためか、インターフェイスのコード補完が出ない。
・RhinoCommonへ接続するインターフェイスは用意されていないため、RhinoDoc関係をいじれない。