getClassInstances

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> は、検索されているインスタンスを持つクラスを指定します。

processAllAnimatables:

3ds Max 2011 以降processAllAnimatables:true を指定すると、シーンに存在しないオブジェクトを含めたすべての既存オブジェクトが、指定したクラスのインスタンスかどうかテストされます。 これらのオブジェクトには、例えば Maxscript の値によって保持されるオブジェクトが含まれます。

processAllAnimatables:true が指定されている場合、他のキーワードのパラメータは適用されず、無視されます。

このパラメータの既定値は false です。

target :

target : が指定されていると、その対象の階層のみが検索されます。

target が指定されていないと、シーンのルート以下の全体のシーンが検索されます。この場合のシーンには、ノードの階層だけではなく、[マテリアル エディタ](Material Editor)、[トラック ビュー] (Track)などが含まれます。

asTrackViewPick:

asTrackViewPick:true を指定すると、クラス インスタンスが TrackViewPick 値として使用後その都度返されます。

asTrackViewPick:true が指定されていると、検索される階層はターゲット以下のアニメート可能なツリーになります。オブジェクトのサブアニメーションが、オブジェクトによって保持される参照のサブセットである場合が多く、シーン内で提示されるインスタンスが欠落してしまうことがあります。 アニメート可能なツリーはトラックビューに表示されるツリーです。

asTrackViewPick:false が指定されるか提示されないと、各クラス インスタンスが返され、検索される階層はターゲット以下の参照ツリーになります。

このパラメータの既定値は false です。

processChildren:

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])

getClassCounts()

3ds Max 2018 以降で使用可能な getClassCounts() 関数は DataPair インスタンスの配列を返します。ここで、v1 は MaxClass、v2 はシーン内に存在する対応するクラスのインスタンス数です。構文は次のようになります。

<array of datapair(maxclass,count)>getClassCounts()