getClassInstances メソッド(3ds Max 7 以降で使用可能)は、シーン内に存在する、指定したクラスの全インスタンスの配列を返します。
これは、従来、Avguard DLX サード パーティ製の MAXScript 拡張機能で使用されていたものです。
3ds Max 2011 まで、この関数はアニメート可能なツリーを列挙してクラス インスタンスを検索していました。オブジェクトのサブアニメーションが、オブジェクトによって保持される参照のサブセットである場合が多く、シーン内で提示されるインスタンスが欠落してしまっていました。
3ds Max 2011 以降では、getClassInstances()
は引数に応じてさまざま方法でクラス インスタンスを検索できるようになりました。これらの引数には、processAllAnimatables:
および processChildren:
の 2 つの新しい引数が含まれます。
構文は次のようになります。
getClassInstances <MAXClass> processAllAnimatables:<boolean> target:<MAXObject> asTrackViewPick:<boolean> processChildren:<boolean>
<MAXClass>
は、検索されているインスタンスを持つクラスを指定します。
3ds Max 2011 以降で processAllAnimatables:true
を指定すると、シーンに存在しないオブジェクトを含めたすべての既存オブジェクトが、指定したクラスのインスタンスかどうかテストされます。 これらのオブジェクトには、例えば Maxscript の値によって保持されるオブジェクトが含まれます。
processAllAnimatables:true
が指定されている場合、他のキーワードのパラメータは適用されず、無視されます。
このパラメータの既定値は false
です。
target
: が指定されていると、その対象の階層のみが検索されます。
target
が指定されていないと、シーンのルート以下の全体のシーンが検索されます。この場合のシーンには、ノードの階層だけではなく、[マテリアル エディタ](Material Editor)、[トラック ビュー] (Track)などが含まれます。
asTrackViewPick:true
を指定すると、クラス インスタンスが TrackViewPick 値として使用後その都度返されます。
asTrackViewPick:true が指定されていると、検索される階層はターゲット以下のアニメート可能なツリーになります。オブジェクトのサブアニメーションが、オブジェクトによって保持される参照のサブセットである場合が多く、シーン内で提示されるインスタンスが欠落してしまうことがあります。 アニメート可能なツリーはトラックビューに表示されるツリーです。
asTrackViewPick:false
が指定されるか提示されないと、各クラス インスタンスが返され、検索される階層はターゲット以下の参照ツリーになります。
このパラメータの既定値は false
です。
3ds Max 2011 以降で processChildren:true
を指定すると、子のシーン ノードもアニメート可能または参照階層の一部として検索されます。
このパラメータの既定値は false
です。ただし、ターゲットが指定されていないか、シーン ルート ノード(rootNode)またはシーン ルート(rootScene)が指定されている場合は true
です。
例:
--Create two spheres, and an instance of one of the spheres: resetMaxFile #noPrompt s1 = sphere() s2 = sphere pos:[100,0,0] s3 = instance s1 s3.pos = [-100,0,0]
出力:
OK $Sphere:Sphere01 @ [0.000000,0.000000,0.000000] $Sphere:Sphere02 @ [100.000000,0.000000,0.000000] $Sphere:Sphere03 @ [0.000000,0.000000,0.000000] [-100,0,0]
実行:
tvps=getClassInstances sphere asTrackViewPick:true for tvp in tvps do ( print tvp.anim print tvp.client print tvp.subNum print tvp.name print tvp.client[tvp.subNum] )
出力:
#(TrackViewPick:"Object (Sphere)", TrackViewPick:"Object (Sphere)", TrackViewPick:"Object (Sphere)") Sphere $Sphere:Sphere001 @ [0.000000,0.000000,0.000000] 4 "Object (Sphere)" SubAnim:Object__Sphere Sphere $Sphere:Sphere002 @ [100.000000,0.000000,0.000000] 4 "Object (Sphere)" SubAnim:Object__Sphere Sphere $Sphere:Sphere003 @ [-100.000000,0.000000,0.000000] 4 "Object (Sphere)" SubAnim:Object__Sphere OK
実行中
objs=getClassInstances sphere for obj in objs do print (refs.dependents obj) #nomap
出力:
#(Sphere, Sphere) #($Sphere:Sphere003 @ [-100.000000,0.000000,0.000000], $Sphere:Sphere001 @ [0.000000,0.000000,0.000000], ReferenceTarget:NodeRefMgr) #($Sphere:Sphere002 @ [100.000000,0.000000,0.000000]) OK
結果
球の 1 つがインスタンス化されているため、TrackViewPick 値は 3 つ返されますが、クラス インスタンスは 2 つしか返されません。
引数の組み合わせを検索:
t1 = bitmaptex filename:"t1.bmp" name:#Sphere_DiffuseMap t2 = bitmaptex filename:"t2.bmp" name:#Teapot_DiffuseMap t3 = bitmaptex filename:"t3.bmp" name:#Displace t4 = bitmaptex filename:"t4.bmp" name:#VolSelect t5 = bitmaptex filename:"t5.bmp" name:#HairDens t6 = bitmaptex filename:"t6.bmp" name:#NoWhere t7 = bitmaptex filename:"t7.bmp" name:#MEdit t8 = bitmaptex filename:"t8.bmp" name:#NodeCustAttrib t9 = bitmaptex filename:"t9.bmp" name:#ObjCustAttrib s = sphere material:(standard showInViewport:true) t = teapot material:(standard showInViewport:true) pos:[0,50,0] parent:s s.material.diffusemap = t1 s.material.specularmap = t1 t.material.diffusemap = mix mask:t2 addModifier s (displace map:t3 strength:10) addModifier t (volumeSelect texture:t4) addModifier s (HairMod()) s.modifiers[1].maps[1] = t5 s.modifiers[1].mapEnables[1] = true meditmaterials[1] = t7 g=geosphere() testCADef = attributes testCA ( parameters main ( map type:#texturemap ) ) CustAttributes.add g testCADef BaseObject:false CustAttributes.add g testCADef BaseObject:true g.testCA.map = t8 g.baseobject.testCA.map = t9
出力:
Sphere_DiffuseMap:Bitmap Teapot_DiffuseMap:Bitmap Displace:Bitmap VolSelect:Bitmap HairDens:Bitmap NoWhere:Bitmap medit:Bitmap NodeCustAttrib:Bitmap ObjCustAttrib:Bitmap $Sphere:Sphere001 @ [0.000000,0.000000,0.000000] $Teapot:Teapot001 @ [0.000000,50.000000,0.000000] Sphere_DiffuseMap:Bitmap Sphere_DiffuseMap:Bitmap Mix:Mix OK OK OK HairDens:Bitmap true medit:Bitmap $GeoSphere:GeoSphere001 @ [0.000000,0.000000,0.000000] <AttributeDef:testCA> true true NodeCustAttrib:Bitmap ObjCustAttrib:Bitmap
テスト 1:
for b in getClassInstances bitmaptex do format "Name : %, Texture name : %, Affected Nodes : %\n" b.name b.filename (refs.dependentNodes b)
テスト 1 出力
Name : medit, Texture --> Name : t7.bmp , Affected Nodes : #() Name : Sphere_DiffuseMap, Texture --> Name : t1.bmp, Affected Nodes : #($Object:Sphere001 @ [0.000000,0.000000,0.000000]) Name : Teapot_DiffuseMap, Texture --> Name : t2.bmp, Affected Nodes : #($Editable_Mesh:Teapot001 @ [0.000000,50.000000,0.000000]) Name : VolSelect, Texture --> Name : t4.bmp, Affected Nodes : #($Editable_Mesh:Teapot001 @ [0.000000,50.000000,0.000000]) Name : Displace , Texture --> Name : t3.bmp, Affected Nodes : #($Object:Sphere001 @ [0.000000,0.000000,0.000000]) Name : HairDens, Texture --> Name : t5.bmp, Affected Nodes : #($Object:Sphere001 @ [0.000000,0.000000,0.000000]) Name : ObjCustAttrib, Texture name : t9.bmp, Affected Nodes : #() Name : NodeCustAttrib, Texture name : t8.bmp, Affected Nodes : #($GeoSphere:GeoSphere001 @ [0.000000,0.000000,0.000000])
テスト 2
for b in getClassInstances bitmaptex target:rootnode do format "Name : %, Texture name : %, Affected Nodes : %\n" b.name b.filename (refs.dependentNodes b)
テスト 2 出力
Name : VolSelect, Texture --> Name : t4.bmp, Affected Nodes : #($Editable_Mesh:Teapot001 @ [0.000000,50.000000,0.000000]) Name : Teapot_DiffuseMap, Texture --> Name : t2.bmp, Affected Nodes : #($Editable_Mesh:Teapot001 @ [0.000000,50.000000,0.000000]) Name : Displace, Texture --> Name : t3.bmp, Affected Nodes : #($Object:Sphere001 @ [0.000000,0.000000,0.000000]) Name : HairDens, Texture --> Name : t5.bmp, Affected Nodes : #($Object:Sphere001 @ [0.000000,0.000000,0.000000]) Name : Sphere_DiffuseMap, Texture --> Name : t1.bmp, Affected Nodes : #($Object:Sphere001 @ [0.000000,0.000000,0.000000]) Name : ObjCustAttrib, Texture name : t9.bmp, Affected Nodes : #() Name : NodeCustAttrib, Texture name : t8.bmp, Affected Nodes : #($GeoSphere:GeoSphere001 @ [0.000000,0.000000,0.000000])
テスト 3
for b in getClassInstances bitmaptex target:s do format "Name : %, Texture name : %, Affected Nodes : %\n" b.name b.filename (refs.dependentNodes b)
テスト 3 出力
Name : Displace, Texture --> Name : t3.bmp, Affected Nodes : #($Object:Sphere001 @ [0.000000,0.000000,0.000000]) Name : HairDens, Texture --> Name : t5.bmp, Affected Nodes : #($Object:Sphere001 @ [0.000000,0.000000,0.000000]) Name : Sphere_DiffuseMap, Texture --> Name : t1.bmp, Affected Nodes : #($Object:Sphere001 @ [0.000000,0.000000,0.000000])
テスト 4
for b in getClassInstances bitmaptex target:s processChildren:true do format "Name : %, Texture name : %, Affected Nodes : %\n" b.name b.filename (refs.dependentNodes b)
テスト 4 出力
Name : VolSelect, Texture --> Name : t4.bmp, Affected Nodes : #($Editable_Mesh:Teapot001 @ [0.000000,50.000000,0.000000]) Name : Teapot_DiffuseMap, Texture --> Name : t2.bmp, Affected Nodes : #($Editable_Mesh:Teapot001 @ [0.000000,50.000000,0.000000]) Name : Displace, Texture --> Name : t3.bmp, Affected Nodes : #($Object:Sphere001 @ [0.000000,0.000000,0.000000]) Name : HairDens, Texture --> Name : t5.bmp, Affected Nodes : #($Object:Sphere001 @ [0.000000,0.000000,0.000000]) Name : Sphere_DiffuseMap, Texture --> Name : t1.bmp, Affected Nodes : #($Object:Sphere001 @ [0.000000,0.000000,0.000000])
テスト 5
for b in getClassInstances bitmaptex target:g do format "Name : %, Texture name : %, Affected Nodes : %\n" b.name b.filename (refs.dependentNodes b)
テスト 5 出力
Name : ObjCustAttrib, Texture name : t9.bmp, Affected Nodes : #() Name : NodeCustAttrib, Texture name : t8.bmp, Affected Nodes : #($GeoSphere:GeoSphere001 @ [0.000000,0.000000,0.000000])
テスト 6
for b in getClassInstances bitmaptex processAllAnimatables:true do format "Name : %, Texture name : %, Affected Nodes : %\n" b.name b.filename (refs.dependentNodes b)
テスト 6 出力
Name : Sphere_DiffuseMap, Texture --> Name : t1.bmp, Affected Nodes : #($Object:Sphere001 @ [0.000000,0.000000,0.000000]) Name : Teapot_DiffuseMap, Texture --> Name : t2.bmp, Affected Nodes : #($Editable_Mesh:Teapot001 @ [0.000000,50.000000,0.000000]) Name : Displace, Texture --> Name : t3.bmp, Affected Nodes : #($Object:Sphere001 @ [0.000000,0.000000,0.000000]) Name : VolSelect, Texture --> Name : t4.bmp, Affected Nodes : #($Editable_Mesh:Teapot001 @ [0.000000,50.000000,0.000000]) Name : HairDens, Texture --> Name : t5.bmp, Affected Nodes : #($Object:Sphere001 @ [0.000000,0.000000,0.000000]) Name : NoWhere, Texture --> Name : t6.bmp, Affected Nodes : #() Name : medit, Texture --> Name : t7.bmp, Affected Nodes : #() Name : ObjCustAttrib, Texture name : t9.bmp, Affected Nodes : #() Name : NodeCustAttrib, Texture name : t8.bmp, Affected Nodes : #($GeoSphere:GeoSphere001 @ [0.000000,0.000000,0.000000])
テスト 7
for b in getClassInstances bitmaptex asTrackViewPick:true do format "Name : %, Texture name : %, Client: %, subAnim: %, Affected Nodes : %" b.anim.name b.anim.filename b.client b.subnum (refs.dependentNodes b.anim)
テスト 7 出力
Name : Sphere_DiffuseMap, Texture name : t1.bmp, Client: ReferenceTarget:ReferenceTarget, subAnim: 4 , Affected Nodes : #($Object:Sphere001 @ [0.000000,0.000000,0.000000]) Name : Sphere_DiffuseMap, Texture name : t1.bmp, Client: ReferenceTarget:ReferenceTarget, subAnim: 6 , Affected Nodes : #($Object:Sphere001 @ [0.000000,0.000000,0.000000]) Name : Teapot_DiffuseMap, Texture name : t2.bmp, Client: Mix:Mix, subAnim: 4, Affected Nodes : #($Editable_Mesh:Teapot001 @ [0.000000,50.000000,0.000000]) Name : medit, Texture name : t7.bmp, Client: #meditMaterials(), subAnim: 1, Affected Nodes : #() Name : Displace, Texture name : t3.bmp, Client: Displace:Displace, subAnim: 3, Affected Nodes : #($Object:Sphere001 @ [0.000000,0.000000,0.000000])
テスト 8
for b in getClassInstances bitmaptex target:s asTrackViewPick:true do format "Name : %, Texture name : %, Client: %, subAnim: %, Affected Nodes : %\n" b.anim.name b.anim.filename b.client b.subnum (refs.dependentNodes b.anim)
テスト 8 出力
Name : Displace, Texture name : t3.bmp, Client: Displace:Displace, subAnim: 3 , Affected Nodes : #($Object:Sphere001 @ [0.000000,0.000000,0.000000]) Name : Sphere_DiffuseMap, Texture name : t1.bmp, Client: ReferenceTarget:ReferenceTarget, subAnim: 4 , Affected Nodes : #($Object:Sphere001 @ [0.000000,0.000000,0.000000]) Name : Sphere_DiffuseMap, Texture name : t1.bmp, Client: ReferenceTarget:ReferenceTarget, subAnim: 6 , Affected Nodes : #($Object:Sphere001 @ [0.000000,0.000000,0.000000])
テスト 9
for b in getClassInstances bitmaptex target:s processChildren:true asTrackViewPick:true do format "Name : %, Texture name : %, Client: %, subAnim: %, Affected Nodes : %\n" b.anim.name b.anim.filename b.client b.subnum (refs.dependentNodes b.anim)
テスト 9 出力
Name : Displace, Texture name : t3.bmp, Client: Displace:Displace, subAnim: 3, Affected Nodes : #($Object:Sphere001 @ [0.000000,0.000000,0.000000]) Name : Sphere_DiffuseMap, Texture name : t1.bmp, Client: ReferenceTarget:ReferenceTarget, subAnim: 4, Affected Nodes : #($Object:Sphere001 @ [0.000000,0.000000,0.000000]) Name : Sphere_DiffuseMap, Texture name : t1.bmp, Client: ReferenceTarget:ReferenceTarget, subAnim: 6, Affected Nodes : #($Object:Sphere001 @ [0.000000,0.000000,0.000000]) Name : Teapot_DiffuseMap, Texture name : t2.bmp, Client: Mix:Mix, subAnim: 4, Affected Nodes : #($Editable_Mesh:Teapot001 @ [0.000000,50.000000,0.000000])
3ds Max 2018 以降で使用可能な getClassCounts()
関数は DataPair インスタンスの配列を返します。ここで、v1 は MaxClass、v2 はシーン内に存在する対応するクラスのインスタンス数です。構文は次のようになります。
<array of datapair(maxclass,count)>getClassCounts()