MAXScript には多くの組み込み関数があり、3ds Max でアクセスできるクラスについての情報を表示することができます。これらの関数は、3ds Max の中心的なクラスをオンラインで参照する場合に便利です。また、サード パーティ製のプラグイン クラス内でアクセス可能なプロパティを確認するには、これらの関数を使用する必要があります。
apropos
apropos()
関数は、名前のパターンと内容のクラスでグローバル変数に関する情報を検索し、出力します。
この関数の形式は次のとおりです。
apropos <pattern_string> [ to:<stream> ]
<pattern_string>
引数は、グローバル変数の検索に使用するワイルド カードを含む文字列です。
形式は次のとおりです。
<variable_name_pattern_string[:class_name_pattern_string]>
グローバル変数名のパターンは、オプションの「:」にクラス名パターンを続けます。
オプションのクラス名パターンを指定すると、指定されたクラスの値を含むグローバル変数だけが出力されます。
apropos()
関数は、パターンの最初と最後にワイルドカード「*」があるとみなします。つまり、指定されたパターンを「含む」マッチングを実行します。パターン文字列には、名前の文字列、「*」および「?」を使用できます。
出力結果は、グローバル変数名、その後にシステム変数または const (変更不可)変数の区別と現在の値のクラスが()内に示され、最後に値が表示されます。
例:
|
apropos "light" -- 'light' が使われている変数名を出力します。
apropos ":float" -- 浮動小数点の値を含む変数を出力します。
apropos "" to:f -- すべての変数をストリーム f へダンプします。
apropos "controller:super" -- コントローラ スーパークラスのリストを出力します。
apropos "foo:control" -- 名前に 'foo' が使用され、
-- コントローラ クラスを含む変数を出力します。
|
最初の例の出力例を次に示します。
|
lights (const ObjectSet): $lights
lightLevel (system Float): 1.0
Sunlight (const MAXClass): Sunlight
Directionallight (const MAXClass): Directionallight
lightLevelController (system Control): Controller:Bezier_Float
light (const MAXSuperClass): light
NewLight (const Primitive): NewLight()
lightTintColor (system Color): (color 255 255 255)
Volume_Light (const MAXClass): Volume_Light
lightTintColorController (system Control): Controller:Bezier_Color
gw.getMaxLights (Primitive): getMaxLights()
gw.setLight (Primitive): setLight()
|
スクリプトを簡単に記述および使用できるようにするために、ScriptTool 関数の Help が追加されました。apropos のエイリアスです。
Help "Box" と入力すると、BOX という名前の付いたすべてのコマンドが表示されます。
showClass
showClass()
関数は、指定された 1 つまたは複数の 3ds Max クラスについての情報を出力します。この関数の形式は次のとおりです。
showClass <pattern_string> [ to:<stream> ]
<pattern_string> は、3ds Max クラス名、スーパークラス名およびプロパティ名にあてはまるワイルド カード パターンを含む文字列です。 オプションの to:<stream> キーワードの引数には、表示内容を出力する ストリーム値 を指定します。
このパターン文字列の形式は次のとおりです。
"<class_name>[:<superclass_name>][.<property_name>]"
例:
|
showClass "path*" -- 「path」で始まるすべての 3ds Max クラス
showClass "noise.*" -- Noise テクスチャ マップ上のアクセス可能な
-- プロパティを出力します。
showClass "*:mod*" -- すべてのモディファイヤ クラスを出力します。
showClass "*.*rad*" -- プロパティ名に 'rad' を含む
-- すべてのクラスを出力します。
showClass "*.*" to:f -- すべてをファイルに出力します。
showClass "*:*controller*" -- スーパークラス名に "controller" を含む
-- すべてのクラスを
-- 出力します。
|
最後の例の出力結果には、3ds Max の重要なコントローラおよびサード パーティ製のプラグイン コントローラが含まれます。複雑なプラグインの埋め込みコントローラ(Character Studio Biped など)も
showClass()
一覧に表示されることがあります。これらのコントローラを個別に作成したり使用しないでください。システム例外となります。
スーパークラス パターン(
':'
の部分)を省略すれば、これはすべてのスーパークラスに一致します。プロパティ パターン (
'.'
の部分)を省略すると、クラス名だけを出力できます。
注:この関数は、一致する MAXWrapper クラス(ノード、モディファイヤ、マテリアルなど)だけ を表示します。MAXScript の基本クラス(浮動小数点、整数、配列、Point3 など)は表示しません。
次に
showClass()
の出力例を示します。
スクリプト:
|
showclass "box*" -- 名前が「box」で始まるすべてのクラスを表示します。
showclass "box.*" -- box クラスのすべてのプロパティを表示します。
|
出力:
|
Box : GeometryClass {10,0} -- 1 行目の出力を開始します。
BoxGizmo : helper {3bc31904,67d74ec9}
OK -- 1 行目から返された結果です。
Box : GeometryClass {10,0} -- 2 行目の出力を開始します。
.height : float
.length : float
.lengthsegs : integer
.width : float
.widthsegs : integer
.mapCoords : boolean
.heightsegs : integer
OK -- 2 行目から返された結果です。
|
showProperties
showProperties()
関数を使用すると、MAXWrapper クラスのインスタンスである特定のオブジェクトのプロパティを表示できます。この関数は、実際のオブジェクトを取得できる場合に
showClass()
の代わりに使われますが、
showClass()
とは異なり、ダイナミック プロパティを表示できます。これは、シーン内でオブジェクトを操作すると、各オブジェクト内に現れます。 リスト コントローラ内のサブ コントローラや、FFD モディファイヤ内のアニメートされたコントロール ポイントなどがその例です。
showProperties()
関数の形式は次のとおりです。
showProperties <maxwrapper_object> [ <property_pattern> ] [ to :<stream> ]
<maxwrapper_object> は、調査される 3ds Max 図形です。オプションの <property_pattern> は、調査されるプロパティを指定するワイルド カード パターンです。オプションの to:<stream> キーワードの引数には、表示内容を出力するストリーム値を指定します。
プロパティ名パターンが与えられない場合は、すべてのプロパティが一覧されます。
スクリプト:
|
showProperties $foo.bend -- オブジェクト foo 上のベンド モディファイヤのプロパティを表示します。
ffdmod = $baz.'FFD_box__4x4x4' -- オブジェクト baz 上の FFD モディファイヤをポイントします。
showProperties ffdmod "disp*" to:log -- FFD モディファイヤで "disp" で始まるプロパティを表示します。
showProperties $foo.pos.controller -- 位置リスト コントローラ内のサブコントローラのプロパティを表示します。
|
注:
指定された 3ds Max の図形がノード($box01 など)の場合、この関数は基本オブジェクトのプロパティ だけを表示します。オブジェクトに適用される変換コントローラ、モディファイヤ、あるいはマテリアルのプロパティは表示しません。これらのオブジェクトのプロパティを表示するには、上記の例で示したように、オブジェクトが 3ds Max の図形として指定されている必要があります。
3ds Max 8 以降、showProperties には、FPS インタフェースで定義されるプロパティが含まれています。「調査 インタフェース プロパティ」の例を参照してください。
次に
showProperties
の出力例を示します。
スクリプト:
|
b = box() -- ボックスを作成します。
ffd_mod = ffdBox() -- ffdBox モディファイヤを作成します。
addmodifier b ffd_mod -- ffdBox モディファイヤをボックスに適用します。
showproperties b -- ボックスの全プロパティを表示します。
showproperties ffd_mod -- ffdBox モディファイヤの全プロパティを表示します。
|
出力:
|
$Box:Box07 @ [0.0000,0.0000,0.0000] -- 1 行目の結果です。
FFD_box__4x4x4:FFD(box) 4x4x4 -- 2 行目の結果です。
OK -- 3 行目の結果です。
.height : float -- 4 行目の出力を開始します。
.length : float
.lengthsegs : integer
.width : float
.widthsegs : integer
.mapCoords : boolean
.heightsegs : integer
OK -- 4 行目の結果です。
.dispLattice (Lattice) : boolean -- 5 行目の出力を開始します。
.dispSource (Source Volume) : boolean
.deformType (<unknown>) : integer
.falloff : float
.tension : float
.continuity : float
.inPoints (Inside Points) : boolean
.outPoints (Outside Points) : boolean
.offset : float
.lattice_transform : transform
OK -- 5 行目の結果です。
|
スクリプトを簡単に記述および使用できるようにするために、ScriptTool 関数の「Show」が追加されました。
Show は、ShowProperties の入力を簡単にするための関数です。
例:
|
Show $ --選択したオブジェクトのプロパティがされます。
|
getPropNames
getPropNames()
関数は、特定のオブジェクトのプロパティ名を配列として返す点を除けば、
showProperties()
関数に似ています。この関数は、
showProperties()
とは異なり、オブジェクトのダイナミック プロパティの名前だけを返すかどうかを指定できます。
getPropNames
関数の形式は次のとおりです。
getPropNames <maxwrapper_obj> [ #dynamicOnly]
getPropNames()
関数は、オブジェクトでアクセス可能なプロパティ名の配列を返します。
例:
|
次のようにアニメートされたコントロール ポイントを持つ FFD(Box)モディファイヤを球に適用する場合、
|
getPropNames $sphere01.'FFD(box) 4x4x4'
|
結果は次のようになります。
|
#(#dispLattice, #dispSource, #deformType, #falloff, #tension, #continuity, #inPoints, #outPoints, #offset, #Lattice_Transform, #Control_Point_49, #Control_Point_50, #Control_Point_51, #Control_Point_52, #Control_Point_53)
|
注:
指定された 3ds Max の図形がノード($box01 など)の場合、この関数は基本オブジェクトのプロパティ だけを返します。オブジェクトに適用される変換コントローラ、モディファイヤ、あるいはマテリアルのプロパティは返しません。これらのオブジェクトのプロパティを返すには、上記の例で示したように、オブジェクトが 3ds Max の図形として指定されている必要があります。
3ds Max 8 以降、getPropNames には、FPS インタフェースで定義されるプロパティが含まれています。「調査 インタフェース プロパティ」の例を参照してください。
ボックス、ライン、またはベンドなどの MAXWrapper クラスで
getPropNames()
を呼び出すと、そのクラスのすべてのインスタンスに共通するプロパティを返します。3ds Max の図形で
getPropNames()
を呼び出すと、その図形に対して定義されているプロパティを返します。オプションのキーワード
#dynamicOnly
を図形に対する
getPropNames()
呼び出しに追加した場合は、そのインスタンスに固有のダイナミック プロパティを返します。
例:
|
次のようにアニメートされたコントロール ポイントを持つ FFD(Box)モディファイヤを球に適用する場合、
|
getPropNames $sphere01.'FFD(box) 4x4x4' #dynamicOnly
|
結果は次のようになります。
|
#(#Lattice_Transform, #Control_Point_49, #Control_Point_50, #Control_Point_51, #Control_Point_52, #Control_Point_53)
|
注:前の例で返されたラティス変換およびコントロール ポイントのプロパティ名は、
#dynamicOnly
が指定された場合は返されません。これらのプロパティは、特定の FFD モディファイヤに固有です。
特別な場合として、スーパークラス「ノード」上で
getPropNames()
を呼び出して、
.position
、
.name
、または
.wireColor
などのすべてのシーン ノードに共通するプロパティの一覧を取得できます。
getPropNames およびインタフェース
getPropNames
メソッドは、さまざまなインタフェース値を扱うために拡張されました。このメソッドは、インタフェースに表示されたプロパティの名前を返します。
例:
|
getpropnames s.inode
#(#boneEnable, #posTaskWeight, #rotTaskWeight, #boneAutoAlign, #boneFreezeLength, #boneScaleType, #stretchTM, #boneAxis, #boneAxisFlip, #primaryVisibility, #secondaryVisibility, #applyAtmospherics, #vertexColorType, #showVertexColors, #shadeVertexColors, #handle, #posInParent, #rotInParent, #scaleInParent, #scaleOrientInParent)
|
getProperty および setProperty
getProperty()
および
setProperty()
関数により、計算されたプロパティ名を使用してプロパティにアクセスし、そのプロパティを設定できます。
各関数の形式は次のとおりです。
getProperty <obj> <property_name>
setProperty <obj> <property_name> <value>
プロパティ名は、
#length
などの名前か
"length"
などの文字列のいずれかになります。 そのため、プロパティ名は文字列演算子で構成することができます。
例:
|
getProperty foo #x -- foo.x と同じです。
setProperty $foo "radius" 23 -- $foo.radius = 23 と同じです。
getProperty $foo.ffd_2x2x2 ("control_point_" + n as string)
|
getPropNames()
関数を
getProperty()
関数とともに使用すると、任意オブジェクトのすべてのプロパティを反復し、必要に応じてそれらを出力できるオブジェクトの「ダンプ」ツールを作成することができます。
例:
|
for p in getPropNames $foo do
format "% = %\n" p (getProperty $foo p)
|
プロパティが割り当てられたコントローラ値へのアクセスおよび設定を行う場合も、同じ関数を使用します。
getPropertyController <value> <string_or_name>
setPropertyController <value> <string_or_name> <controller>
値の指定したプロパティに割り当てられたコントローラを取得および設定します。コントローラがプロパティに割り当てられていない場合、undefined 値が返されます。
hasProperty
hasProperty()
関数を使用すると、オブジェクトに指定のプロパティ名があるかどうかをテストできます。
isProperty()
とは異なり、プロパティ名文字列ではワイルドカード パターンがサポートされます。
hasProperty <obj> <prop_name_or_pattern_string>
オブジェクトに指定したプロパティがある場合、または文字列パターンに一致するプロパティがある場合は、
true
を返します。
例:
|
hasProperty $Box01 "height" --ボックスの高さをテストします。
--> true
hasProperty $Box01 "radius" --ボックスの半径をテストします。
--> false
hasProperty $Sphere01 "radius" --球の半径をテストします。
--> true
hasProperty $Sphere01 "rad*" --球において「rad」で始まる
--> true --すべてのプロパティ名をテストします。
|
isProperty
isProperty()
関数を使用すると、オブジェクトに指定のプロパティがあるかどうかをテストできます。
isProperty <MAXWrapper_object> <property_name_or_string>
isProperty()
は、指定のプロパティが MAXWrapper オブジェクトのプロパティである場合は
true
を、それ以外の場合は
false
を返します。プロパティ名は、
#length
などの名前か
"length"
などの文字列のいずれかになります。 そのため、プロパティ名は文字列演算子で構成することができます。
例:
|
isProperty $Box01 #height --ボックスの高さをテストします。
--> true
isProperty $Box01 #radius --ボックスの半径をテストします。
--> false
isProperty $Sphere01 #radius --球の半径をテストします。
--> true
|
hasProperty および isProperty の違い
hasProperty と isProperty は、まったく異なった動作をします。
例:
|
hasProperty $Box01 "name"
--> false
isProperty $Box01 "name"
--> true
|
hasProperty は、
showPropeties()
と同じコードを使用しますが、検出されたプロパティのリストを返さずに、指定したパターンと一致する最初のプロパティ名で true を返します。 showProperties は、ボックスのベース オブジェクトおよび MAXClass 定義を調べます。上位レベルのプロパティは調査しません(3ds Max 8 より前のバージョンでは、FPS インタフェースで公開されているプロパティは調査されません)。
それに対し、isProperty は、指定された名前を含む指定のオブジェクトに実際にアクセスし、アクセスが正常に行われたかエラーになったかを検出しようとします。
isPropertyAnimatable
isPropertyAnimatable <obj> <string_or_name>
プロパティが見つかり、それがアニメート可能である場合は
true
を返します。プロパティが見つからない場合、またはアニメート可能でない場合は
false
を返します。
例:
|
s = Sphere() --球を作成します。
--> $Sphere:Sphere01 @ [0.000000,0.000000,0.000000]
isPropertyAnimatable s #radius --半径がアニメート可能かどうかを調べます。
--> true
isPropertyAnimatable s #mapCoords --UV 座標がアニメート可能かどうかを調べます。
--> false
|
別の例:
|
s = Sphere() --球を作成します。
--球のすべてのプロパティと
--それらがアニメート可能であるかどうかのリストを出力します。
for i in getPropNames s do
format "% Property: % - Animatable: %\n"s.name i (isPropertyAnimatable s i)
|
結果:
|
Sphere01 Property: #smooth - Animatable: true
Sphere01 Property: #radius - Animatable: true
Sphere01 Property: #mapCoords - Animatable: false
Sphere01 Property: #segs - Animatable: true
Sphere01 Property: #slice - Animatable: false
Sphere01 Property: #hemisphere - Animatable: true
Sphere01 Property: #sliceFrom - Animatable: true
Sphere01 Property: #sliceTo - Animatable: true
Sphere01 Property: #chop - Animatable: false
Sphere01 Property: #recenter - Animatable: false
OK
OK
|
SubAnim および ParamBlock
3ds Max は、subAnims と呼ばれる構造体のオブジェクトのプロパティをすべて保存します。subAnim は、別のネストされた subAnim を含むこともあり、標準マテリアルで使用されることがあります。標準マテリアルを 3ds Max オブジェクトに適用し、マテリアルを表示するためにトラック ビュー内でオブジェクトのトラックを展開した場合、3 つのトラック ビュー ノードが表示されます。これらのトラック ビュー ノードは Parameters、Maps、Shader であり、各ノードは標準マテリアルのクラスで定義された
subAnim です。これらの 3 つのノードを展開すると、さまざまなプロパティが一覧で表示されます。これらのプロパティは、ParamBlock という構造体内でネストされた subAnims ごとに定義されます。
MAXScript は、オブジェクトに関連する ParamBlock 内でアニメート可能プロパティを自動的に検索します。これらのプロパティにアクセスするには、MAXScript のプロパティの参照時にトラック ビューに表示されているのと同じネスト構造を使用します。
例:
|
MAXScript の標準マテリアル内の Ambient Color プロパティにアクセスするには、次のようにします。
|
$box01.material.shader.diffuse_color
|
MAXScript でのアニメート可能なプロパティへのアクセスの詳細については、「3ds Max オブジェクトでのアニメート可能なプロパティへのアクセス」を参照してください。
さまざまな種類の値におけるアクセス可能なプロパティが各クラスごとに説明されています。MAXScript のほとんどの基本クラス(Point3、カラーなど)は、特殊な種類のネストされたプロパティの割り当てをサポートします。これにより、ノードの
.position
プロパティの
.x
、
.y
、
.z
座標のようなオブジェクト プロパティ上のサブプロパティを、個別にまたは直接設定することができます。詳細は、「ネストされたオブジェクトのプロパティ」を参照してください。