Inheritance |
|
このオブジェクトは、リジッドボディ、流体、布などです。 DOPオブジェクトのタイプとプロパティは、そのオブジェクトに取り付けられているサブデータで決まります。
メソッド ¶
name()
→ str
このDOPオブジェクトの名前を返します。
matches(pattern)
→ bool
このオブジェクトの名前がパターンに一致するかどうか返します。
*
は任意の文字数に一致し、?
は1文字に一致します。
このパターン文字列は1つのパターンしか含まないので、パターン内のスペースがオブジェクト名と比較されます。
>>> obj = hou.node("/obj/AutoDopNetwork").simulation().objects()[0] >>> obj.name() 'box_object1' >>> obj.matches("box*") True >>> obj.matches("c*") False >>> obj.matches("box* b*") False >>> obj.matches("b?x_object1") True
objid()
→ int
hou.DopSimulation.objectsの出力内のこのオブジェクトのインデックスを返します。
このメソッドはself.options().field("objid")
のショートカットです。
サンプルは、hou.DopData.idを参照してください。
DOPレコード内のいくつかのフィールドは、他のオブジェクトを参照するためにobjidを記録します。 以下の関数はobjidでオブジェクトを検索します:
def findObjectByObjid(dopnet_node, objid): return dopnet_node.simulation().objects()[objid]
transform(include_geometry_transform=True)
→ hou.Matrix4
このオブジェクトのトランスフォームマトリックスを返します。
include_geometry_transform
がFalse
の場合、その結果はオブジェクトのPositionデータで決まります。
そうでない場合、その結果は、オブジェクトのGeometryデータのトランスフォームの後にPositionトランスフォームが適用されたものになります。
単純なDopDataタイプに関しては、このメソッドをほぼ以下のように実装することができます:
def transform(self, include_geometry_transform=True): result = hou.hmath.identityTransform() geometry = self.findSubData("Geometry") if include_geometry_transform and geometry is not None: result *= geometry.record("Transform").field("transform") # 位置を取得します。Geometryデータがあれば、そのpositionpathフィールドを使用してSIM_Positionサブデータを取得します。 # なければ、Positionという名前のデータを探します。 position = None if geometry is not None: position = geometry.findSubData( geometry.options().field("positionpath")) if position is None: position = self.findSubData("Position") # 位置データが見つかれば、そのピボット、回転クォータニオン、移動量からトランスフォームを構築します。 if position is not None: options = position.options() rotation = hou.Matrix4(options.field("orient").extractRotationMatrix3()) result *= (hou.hmath.buildTranslate(-options.field("p")) * rotation * hou.hmath.buildTranslate(options.field("p")) * hou.hmath.buildTranslate(options.field("t"))) return result
Methods from hou.DopData ¶
subData()
→ dict of str
to hou.DopData
このデータに取り付けられたサブデータに対して、名前をDOPデータインスタンスにマップした辞書を返します。
# 以下のコードは、シェルフからボックスを作成し、シェルフの # Rigid Bodies > RBD Objectを使用して、そのボックスをリジッドボディにしたと仮定しています。 >>> obj = hou.node("/obj/AutoDopNetwork").simulation().objects()[0] >>> obj <hou.DopObject box_object1 id 0> >>> obj.recordTypes() ('Basic', 'Options', 'RelInGroup', 'RelInAffectors') >>> record = obj.record("Options") >>> record.fieldNames() ('name', 'groups', 'affectors', 'affectorids', 'objid') >>> record.field("name") 'box_object1' >>> obj.subData().keys() ['PhysicalParms', 'ODE_Body', 'Solver', 'Geometry', 'SolverParms', 'ODE_Geometry', 'Forces', 'Position', 'Colliders'] >>> obj.findSubData("Forces/Gravity_gravity1") <hou.DopData of type SIM_ForceGravity> >>> obj.findSubData("Forces/Gravity_gravity1").options().field("force") <hou.Vector3 [0, -9.80665, 0]>
findSubData(data_spec)
→ hou.DopData or None
このDOPデータに取り付けられた指定した名前のDOPデータを返します。そのようなデータがなければNone
を返します。
その名前は、ネスト化したサブデータにはスラッシュ区切りのパスも使うことができます。
サンプルは、hou.DopData.subDataを参照してください。
このメソッドはほぼ以下のように実装されています:
def findSubData(self, data_spec): data = self for name in data_spec.split("/"): if name not in data.subData(): return None data = data.subData()[name] return data
findAllSubData(data_spec, recurse=False)
→ dict of str
to hou.DopData
パターンを指定すると、そのパターンに一致した名前のサブデータすべてに対して、サブデータパスをDOPデータインスタンスにマップした辞書を返します。
recurse
がTrue
の場合、すべての孫サブデータが、その結果に追加されます。
# 以下のコードは、シェルフからボックスを作成し、シェルフの # Rigid Bodies > RBD Objectを使用して、そのボックスをリジッドボディにしたと仮定しています。 >>> obj = hou.node("/obj/AutoDopNetwork").simulation().objects()[0] >>> obj.findAllSubData("S*").keys() ['SolverParms', 'Solver'] >>> obj.findAllSubData("S*", recurse=True).keys() ['SolverParms', 'Solver/Random', 'SolverParms/ActiveValue', 'Solver'] >>> obj.findAllSubData("S*/*", recurse=True).keys() ['SolverParms/ActiveValue', 'Solver/Random']
freeze()
→ hou.DopData
このDopDataのフリーズしたバージョンを返します。このフリーズしたDopDataは、シミュレーションを更新しても更新されません。 その代わりに、これはフリーズした時のシミュレーションの状態を参照します。
既にフリーズされたDopDataオブジェクトに対してこのメソッドをコールしても構いません。
isFrozen()
→ bool
このデータがフリーズされているかどうか返します。
詳細は、hou.DopData.freezeを参照してください。
path()
→ str
Dopデータのツリー内のこのオブジェクトのパスを返します。このパスは、そのDOPオブジェクトまたはリレーションシップをパスの1番目の部分として含んでいます。
同じDOPデータを複数のツリーの場所に存在させることができます。 返されるパスは、Pythonオブジェクトに対してメソッドをコールする度に、そのオブジェクトがそのパスを使用して大元のデータを検索するため、 Python DopDataオブジェクト内に格納されたパスです。
このパスはフリーズされていないオブジェクトに対してのみ利用可能です。フリーズしたDopDataオブジェクトに対してこのメソッドをコールすると、 hou.OperationFailedを引き起こします。
selectionPath()
→ str
hou.SceneViewer.selectDynamics関数コールから返されたDopDataオブジェクトに関しては、
これは、データを作成したDOP Networkのパスと、このDopDataを固有に識別するDOPデータツリー内のパスの両方を含んだ文字列を返します。
この文字列は、hou.SceneViewer選択メソッドのprior_selection_paths
引数に渡すための特別な文字列です。
dataType()
→ str
このオブジェクトに含まれているデータのタイプを記述した文字列を返します。
>>> obj = hou.node("/obj/AutoDopNetwork").simulation().objects()[0] >>> obj.dataType() 'SIM_Object'
hou.DopData.dataTypeObjectも参照してください。
recordTypes()
→ tuple
of str
このDOPデータ内に格納されたレコードタイプを含んだ文字列のタプルを返します。 各DOPデータには、“Basic”と“Options”という名前のレコードと、追加レコードを含んだDOPデータのタイプをいくつか含みます。
record(record_type, record_index=0)
→ hou.DopRecord
レコードタイプ名を指定すると、そのレコードを返します。その名前のレコードがなければNone
を返します。
このDOPデータに、各レコードをスプレッドシートの行として見なすことができるこのレコードタイプ名のレコードが複数含まれていれば、
record_index
が、どのレコードを返すのか決めます。
len(self.records(record_type))
を使えば、このDOPデータ内にあるこのタイプのレコードの数を判断することができます。
hou.DopData.recordTypesを使えば、DOPデータ内のレコードタイプのタプルを取得することができます。 例えば、“Options”レコードに簡単にアクセスする方法は、hou.DopData.recordsとhou.DopData.optionsを参照してください。
records(record_type)
→ tuple
of hou.DopRecord
このレコードタイプのレコードすべてのタプルを返します。 hou.DopData.recordも参照してください。
このサンプルでは、グランド平面と衝突するリジッドボディのボックスの入力アフェクターのリストを取得します:
>>> obj = hou.node("/obj/AutoDopNetwork").simulation().objects()[-1] >>> obj.records("RelInAffectors") (<hou.DopRecord of type RelInAffectors index 0>, <hou.DopRecord of type RelInAffectors index 1>) >>> [record.field("relname") for record in obj.records("RelInAffectors")] ['merge1', 'staticsolver1_staticsolver1'] >>> obj.record("RelInAffectors", 1).field("relname") 'staticsolver1_staticsolver1'
options()
→ hou.DopRecord
Optionsレコードを返します。このメソッドは、self.record("Options")
のショートカットです。
simulation()
→ hou.DopSimulation
このDOPデータを含んだDOPシミュレーションを返します。このメソッドは、self.dopNetNode().simulation()
のショートカットです。
creator()
→ hou.DopNode
DOP Network内でこのDOPデータを作成したDOPノードを返します。
id()
→ str
このDOPデータのグローバルで固有な識別子(GUID)を返します。このメソッドは、self.record("Basic").field("uniqueid")
のショートカットです。
オブジェクトのインデックスが必要なら、hou.DopObject.objidを使用します。
>>> obj = hou.node("/obj/AutoDopNetwork").simulation().objects()[0] >>> obj.id() '0xD011E41C-0x000034AE-0x494C12E4-0x000018B9' >>> obj.objid() 0
createSubData(data_name, data_type="SIM_EmptyData", avoid_name_collisions=False)
→ hou.DopData
このデータの下に、指定した名前とタイプのサブデータを作成します。このメソッドはScript Solver DOPからコールします。
data_name
新しいデータの名前。この名前にスラッシュを含めれば、既存データ上にサブデータを作成することができます。
data_type
作成するデータタイプの名前またはhou.DopDataTypeインスタンスのどちらか。 空っぽのオプションのレコードを含んだ何かだけが欲しいのであれば、“SIM_EmptyData”を使用してください。
avoid_name_collisions
Trueで、指定した名前のデータが存在すれば、Houdiniは既存データを干渉しない固有の名前を作成します。
この名前のデータが既に存在すれば、hou.OperationFailedを引き起こします。 既存データを置換したい場合は、あなたの判断でまず最初にhou.DopData.removeDataをコールします。
Script Solver DOP外からコールすると、hou.PermissionErrorを引き起こします。
既存データの参照を作成するには、hou.DopData.attachSubDataを使用します。 既存データのコピーを作成するサンプルは、hou.DopData.copyContentsFromを参照してください。
attachSubData(data, new_data_name, avoid_name_collisions=False)
既存データをこのデータのサブデータにします。Houdiniはそのデータの複製を作成しません。 代わりに、そのデータの親とこのデータの両方が同じサブデータのインスタンスを参照します。Script Solver DOPからこのメソッドをコールします。
data
このデータのサブデータとなるDopData。
new_data_name
新しいサブデータの名前。
avoid_name_collisions
Trueで指定した名前のデータが存在した場合、Houdiniは既存データを干渉しない固有の名前を作成します。
この名前のデータが既に存在すれば、hou.OperationFailedを引き起こします。 既存データを置換したい場合は、あなたの判断でまず最初にhou.DopData.removeDataをコールします。
Script Solver DOP外からコールすると、hou.PermissionErrorを引き起こします。
既存データのコピーを作成するサンプルは、hou.DopData.copyContentsFromを参照してください。
removeSubData(data_spec)
指定した名前のサブデータを削除します。Script Solver DOP外からコールすると、hou.PermissionErrorを引き起こします。
その名前のデータが既に存在すれば、hou.OperationFailedを引き起こします。
copyContentsFrom(data)
指定したDopDataの内容をこのDopDataにコピーし、タイプが異なれば、そのデータに順応します。 このメソッドは、Script Solver DOPからコールします。
Script Solver DOP外からコールすると、hou.PermissionErrorを引き起こします。
hou.DopData.createSubDataと一緒にこのメソッドを使用すれば、既存のサブデータをコピーすることができます:
def copySubData(new_parent_data, data_to_copy, new_data_name, avoid_name_collisions=False): '''データのコピーを作成し、それを他のデータに取り付けます。''' new_data = new_parent_data.createSubData(new_data_name, data_to_copy.dataType(), avoid_name_collisions) new_data.copyContentsFrom(data_to_copy) return new_data
fieldGeometry(name)
→ hou.Geometry or None
スカラー、ベクトル、マトリックスのフィールドである名前のサブデータが存在した場合、
この関数は、その成分のボリュームを含んだ読み込み専用のhou.Geometryオブジェクトを返します。
存在しなかった場合、このメソッドはNone
を返します。
geometry(name="Geometry")
→ hou.Geometry or None
指定した名前のSIM_GeometryサブデータがこのDOPオブジェクトに含まれていた場合、それに該当する読み込み専用のhou.Geometryオブジェクトを返します。
含まれていなかった場合、このメソッドはNone
を返します。
editableGeometry(name="Geometry")
→ hou.EditableDopGeometryGuard or None
このメソッドをPython Solver DOPからコールして、指定した名前のSIM_Geometry(またはSIM_GeometryCopy)サブデータがそのDOPに含まれていた場合、Python guardオブジェクトを返します。
この返されたオブジェクトと"with"
ステートメントを併用することで、該当するhou.Geometryオブジェクトにアクセスしてそのオブジェクトを修正することができます。
Python 2.5では、with
ステートメントはデフォルトで有効になっていません。
有効にするには、スクリプト/モジュールの頭に以下の行を追加する必要があります:
from __future__ import with_statement
例えば、Python Solver DOPで以下のコードをコールすると、ジオメトリの原点にポイントを追加します:
with dop_object.editableGeometry() as geo: geo.createPoint()
このメソッドをPython Solver DOPからコールしなかった場合は、hou.PermissionErrorを引き起こします。