「H3DAPI と Python」の編集履歴(バックアップ)一覧はこちら
H3DAPI と Python - (2010/11/16 (火) 14:46:51) の最新版との変更点
追加された行は緑色になります。
削除された行は赤色になります。
#contents()
*シーングラフにPythonスクリプトを追加する
Pythonスクリプトは、PythonScriptノードを使用して、シーングラフに追加することができます。
&bold(){例:}
<Scene>
<PythonScript url="script1.py" />
<PythonScript url="script2.py"
</Scene>
上記のコードは、2つのPythonスクリプト「script2.py」と「script1.py」をシーングラフへ追加します。スクリプトは、シーングラフ初期化時に少なくとも一度は実行されます。
参照するフィールドの値としてノードを指定することによって、ノードの参照がPythonスクリプトに渡される事もあります。
&bold(){例:}
<Scene>
<Shape DEF="S">
<Appearance>
<Material DEF="M" />
</Appearance>
<Sphere radius="0.1" />
</Shape>
<PythonScript url="script.py">
<Shape USE="S" containerField="references" />
<Material USE="M" containerField="references" />
</PythonScript>
</Scene>
Shapeノードへの参照は、上記のPythonScriptの参照フィールドに値として指定することによって、スクリプトに渡されます。
ここで「containerField="references"」が行われていることに注目して下さい。「containerField」は、現在のノードに対応する親ノードのフィールドを定義します。
「references」の値は、スクリプト内でGetValueメソッドを呼び出すことによって取得することができます。
# script.py
shape, mat = references.getValue()
変数のshapeやmatは、ShapeとMaterialへの参照が含まれています。
*フィールドの値を入手、変更
フィールド参照によって、フィールドの値を変更するGetValueメソッドとSetValueフィールドメソッドを使用することができます。
先ほどの例では、すでにスクリプトでreferencesを取得するためにgetValueメソッドを使用しています。
&bold(){例:}
mat.diffuseColor.setValue( RGB(1, 0, 0) )
前の例で説明したように、matを使用しsetValueメソッドを呼びだすことで、MaterialノードのdiffuseColorにアクセスし、値を赤に変えます。
*シーングラフへのノードの追加、作成
Pythonに次の関数を利用することで、X3Dのノードを作成することができます。
-createX3DFromURL( url )
-createX3DFromString( string )
-createX3DNodeFromURL( url )
-createX3DNodeFromString( string )
各関数は1番目の要素にノードの参照を、2番目の要素にurlもしくはstringの字引を含む、長さ2の配列です。
Each of the function returns a list of length two, the first element containing a node reference and the second a dictionary of DEF-ed nodes in the url/string.
#contents()
*&bold(){シーングラフにPythonスクリプトを追加する}
Pythonスクリプトは、PythonScriptノードを使用して、シーングラフに追加することができます。
&bold(){例:}
<Scene>
<PythonScript url="script1.py" />
<PythonScript url="script2.py"
</Scene>
上記のコードは、2つのPythonスクリプト「script2.py」と「script1.py」をシーングラフへ追加します。スクリプトは、シーングラフ初期化時に少なくとも一度は実行されます。
参照するフィールドの値としてノードを指定することによって、ノードの参照がPythonスクリプトに渡される事もあります。
&bold(){例:}
<Scene>
<Shape DEF="S">
<Appearance>
<Material DEF="M" />
</Appearance>
<Sphere radius="0.1" />
</Shape>
<PythonScript url="script.py">
<Shape USE="S" containerField="references" />
<Material USE="M" containerField="references" />
</PythonScript>
</Scene>
Shapeノードへの参照は、上記のPythonScriptの参照フィールドに値として指定することによって、スクリプトに渡されます。
ここで「containerField="references"」が行われていることに注目して下さい。「containerField」は、現在のノードに対応する親ノードのフィールドを定義します。
「references」の値は、スクリプト内でGetValueメソッドを呼び出すことによって取得することができます。
# script.py
shape, mat = references.getValue()
変数のshapeやmatは、ShapeとMaterialへの参照が含まれています。
*&bold(){フィールドの値を入手、変更}
フィールド参照によって、フィールドの値を変更するGetValueメソッドとSetValueフィールドメソッドを使用することができます。
先ほどの例では、すでにスクリプトでreferencesを取得するためにgetValueメソッドを使用しています。
&bold(){例:}
mat.diffuseColor.setValue( RGB(1, 0, 0) )
前の例で説明したように、matを使用しsetValueメソッドを呼びだすことで、MaterialノードのdiffuseColorにアクセスし、値を赤に変えます。
*&bold(){シーングラフへのノードの追加、作成}
Pythonに次の関数を利用することで、X3Dのノードを作成することができます。
-createX3DFromURL( url )
-createX3DFromString( string )
-createX3DNodeFromURL( url )
-createX3DNodeFromString( string )
各関数は1番目の要素にノードの参照を、2番目の要素にurlもしくはstringのハッシュを含む、長さ2の配列です。
&bold(){例:}
s, d = createX3DNodeFromString(" \
<Shape> \
<Appearance> \
<Material /> \
<SmoothSurface DEF=\"SURFACE\" /> \
</Appearance> \
<Box DEF=\"BOX\" size=\"0.1 0.2 0.1\" /> \
</Shape>")
sはShapeへの参照が含まれており、dは["SURFACE"]と["BOX"]というDEFの値を持ったハッシュである。
シーン内の既存のノードの値としてそれらを設定することにより、シーングラフにノードを追加することができます。
また、既にスクリプトからの参照があるシーン内のGroupノードを持っているならば、そのGroupノードの子として、新しく作成されたShapeノードを追加することができます。
&bold(){例:}
g_node.addChildren.setValue( s )
上記のコードは、g_nodeのaddChildrenフィールドからsetValueメソッドを呼び出すことによって、g_nodeにShapeノードを新しい子ノードsとして設定します。
*&bold(){ルーティング・アンルーティング}
Pythonスクリプトでフィールド参照を使用している場合、ルーティングと同様のrootメソッドを使用して、Pythonでアンルーティングを行います。
field_1.route( field_2 )
field_1.unroute( field_2 )
*&bold(){参考}
[[H3DAPI Python FAQ >http://www.h3dapi.org/modules/mediawiki/index.php/H3DAPI_FAQ#Python]]