Houdini 20.0 Pythonスクリプト

ウェブページからHoudiniをスクリプト制御する方法

組み込みブラウザで閲覧したHTMLページに特別なJavaScriptオブジェクトを使用することで、Houdiniと通信させることができます。

On this page

Note

JavaScriptからPythonをコールするメソッドは、HoudiniがQt5 UIライブラリに切り替わったのでHoudini16で変更されました。 window.Pythonオブジェクトを使用するために記述されたスクリプトは、ブリッジを初期化して、エクスプレッションに対して非同期コールバックスタイルを使用するために書き換えが必要になります。

概要

組み込みブラウザでページを閲覧する時に、そのページのJavaScriptにwindow.PythonJavaScriptオブジェクトを使用することで、Pythonコードを実行させてHoudiniと通信させることができます。 これは組み込みブラウザでのみ動作します

これによって、HTMLインターフェースをセットアップして、Houdiniのシーンから情報を読み込んで、そのシーンを変更させることができます。

例:

// Javascript

if (window.Python) {
    // 現在のシーンを保存するPythonステートメントを実行します。
    Python.runStatements("__import__('hou').hipFile.save()");
}

初期化

JavaScriptからPythonコードを実行する前に、いくつかの初期化がWebページで必要になります。

  1. Webページにqwebchannel.jsファイルを読み込みます。例:

    <head>
        <script language="javascript" src="/path/to/qwebchannel.js"></script>
    </head>
    

    $HHP/bookish/static/jsからqwebchannel.jsのコピーを取得して、それをWebサーバーにインストールすることができます。

  2. そのページが読み込まれた時に、JavaScriptでWebチャンネル通信オブジェクトを作成します:

    window.onload = function() {
        if (!qt || !qt.webChannelTransport) {
            // Web Channel Transportが存在しないので、
            // 組み込みブラウザで実行することができません。
            return;
        }
    
        new QWebChannel(qt.webChannelTransport, function(channel) {
            // Pythonブリッジをwindowオブジェクトに割り当て、
            // それをグローバルに利用可能にします。
            window.Python = channel.objects.Python;
    
            // (オプション) ここでページを読み込み中にPythonをコールします。
            window.Python.runStatements("print 'Hello World.'");
        });
    }
    

How to

Qt4バージョンとは違い、Qt5でのJavaScriptブリッジのコールは 非同期 です。そのため、このコールはPythonコードが実行されるまで待たずに、すぐに返ります。 Pythonエクスプレッションの結果を取得するには、コールバック関数を登録する必要があります。

Pythonステートメントを実行する

if (window.Python) {
    window.Python.runStatements("__import__('hou').setFrame(5)");
}

JavaScriptコールはすぐに返り、Pythonは非同期で動作します。コールバックを登録することで、Pythonが終了した時に何かを実行することができます:

window.Python.runStatements(
    "__import__('hou').setFrame(5)",
    function() {
        alert("Frame is set!");
    }
);

文字列を返すPythonエクスプレッションを実行する

エクスプレッションの結果を取得するには、コールバック関数を渡す必要があります。ブリッジは、Pythonコードが終了した時に、その結果で関数をコールします。

if (window.Python) {
    window.Python.runStringExpression(
        "__import__('hou').node('/obj/geo1').path()",
        function(result) {
            alert("Path=" + result);
        }
    );
}

整数を返すPythonエクスプレッションを実行する

if (window.Python) {
    window.Python.runIntExpression(
        "__import__('hou').intFrame()",
        function(result) {
            alert("Integer Frame=" + result);
        }
    );
}

浮動小数点を返すPythonエクスプレッションを実行する

if (window.Python) {
    window.Python.runFloatExpression(
        "__import__('hou').time()",
        function(result) {
            alert("Time=" + result);
        }
    );
}

Tipsとテクニック

  • ステートメントの実行/評価とエクスプレッションの違いは、Python言語の定義を参照してください。主な違いは、ステートメントに関しては1行以上のステートメントを持つことができ、そこに制御フロー(例えば、if,for)を含めることができ、値を返さないということです。

  • houは、それが実行されるPythonコード内で自動的に利用可能にはなりません。そのコードの一部としてhouをimportする必要があります。

  • 基本的には エラーハンドリングがありません 。例外がPython側で発生した場合、Javascript関数は、単に(メソッドに応じて)空っぽの文字列またはゼロを返します。

古いQt4ブラウザでJavaScriptからPythonコードを実行する方法(廃止)

このセクションは情報提供のみを目的としています。

  • Qt4ビルドでは、JavaScriptブリッジを初期化する必要がありません。Qt4組み込みブラウザは、自動的にwindow.Pythonオブジェクトを作成します。

  • Qt4ブリッジでは、コールはコールバックを使わずに 非同期 で返ります。

window.Python.runStatements(String)null

指定した文字列を1行以上のPythonステートメントとして実行します。ステートメントは改行文字または;文字を使って分離させることができます。

window.Python.runStringExpression(String)String

指定した文字列をPythonエクスプレッションとして評価し、その結果をJavaScript文字列として返します。

window.Python.runIntExpression(string)Number

指定した文字列をPythonエクスプレッションとして評価し、その結果を整数として返します(JavaScriptではintとfloatの区別がありません)。

window.Python.runFloatExpression(string)Number

指定した文字列をPythonエクスプレッションとして評価し、その結果を可能な限り浮動小数点として返します(JavaScriptではintとfloatの区別がありません)。

Pythonスクリプト

はじめよう

次のステップ

リファレンス

  • hou

    Houdiniにアクセスできるサブモジュール、クラス、ファンクションを含んだモジュール。

導師レベル

Python Viewerステート

Pythonビューアハンドル

プラグインタイプ