3ds Max 7 の MAXScript 言語に関する改良点

以下では、3ds Max 7 での MAXScript 言語に対する内部変更と「微調整」について説明しています。ここで紹介する変更では、「新機能」のトピック以外の新しいオブジェクト、クラス、メソッド、インタフェースは導入されていませんが、MAXScript の内部の動作が変更されています。これらの変更では通常、パフォーマンスの向上またはプログラミングの単純化が図られています。

ノード アクセスの改良点

ノード名キャッシュが実装されました。MAXScript で、シーン ノードへのパス名 ($box01 など) を解決するために使用されます。この最適化は主に、パス名を使用するスクリプト コントローラで効果があります。5001 のノードと、5001 番目のノードを名前で 2 回参照するスクリプト コントローラがあるシーンでは、スクリプト コントローラの 10000 回の評価に要する時間が、147 秒から 1.6 秒になりました。

新しいチェックボックス[高速ノード名ルックアップを使用](Use Fast Node Name Lookup)が、[基本設定](Preference)ダイアログボックスの[MAXScript]パネルに追加されました。オンに設定した場合、シーン ノード名は MAXScript によってキャッシュされ、この結果、ノード値へのワイルドカードを使用しないパス名値($box01)の解決が大幅に高速化されます。オフに設定した場合、シーン ノードはひとつひとつ取り上げられ、パス名と一致するシーン ノード名が検索されます。

3ds Max 7 では、ノードが変更したという通知をその従属へ送信する前に、そのノードが既に無効になっているかどうかを調べる最適化が導入されました。特に新しいエクスポーズ トランスフォーム ヘルパーを含んだ複雑な装置を高速化しています。preferences.InvalidateTMOpt システム グローバル 変数によってコントロールされます。true に設定した場合、最適化が有効になり、複数の通知は送信されません。false に設定した場合、アニメーション システムは 3ds Max 6 以前と同様に動作します。既定値では有効になっています。

MakeNameUnique 関数が、Tab<int> ではなく std::set を使用するように変更されました。これにより、同じタイプのノードを 2500 作成する時間が、145 秒から 71 秒に短縮されました。ノードの作成時にノードの名前が変更される場合に 2500 のノードを作成する時間は、47 秒から 11 秒に短縮されました。

getNodeByName 関数が大幅に強化されました。

カスタム アトリビュート

refs.dependson は、オブジェクトのカスタム アトリビュートを返すようになりました。3ds Max 7 より前のバージョンでは、カスタム アトリビュートが技術的にオブジェクトに従属していないため、このメソッドはカスタム アトリビュートを考慮していませんでした。

classOf は、スクリプト カスタム アトリビュート インスタンスが渡された場合、カスタム アトリビュート定義(MSCustAttribDef)を返します。前のリリースでは、MAXClass の値を返していました。

MAXCustAttrib クラスの可視の名前は、CustAttrib から MAXCustAttrib に変更されました。「CustAttrib.classes」を使用してカスタム アトリビュート クラスにアクセスし、CustAttrib に照らしてカスタム アトリビュートのスーパークラスをテストすることができます。

.isPB2Based が、カスタム アトリビュート定義 MSCustAttribDef のプロパティとして追加されました。既に MAXClass と MSPluginClass のプロパティになっています。

.isMSPluginClass が、カスタム アトリビュート定義 MSCustAttribDef、MAXClass、および MSPluginClass の読み取り専用プロパティとして追加されました。MSPluginClass は、MAXClass から派生し、MSCustAttribDef は MSPluginClass から派生します。クラスが MSPluginClass または MSCustAttribDef の場合、プロパティは true です。以前に定義した isMSPluginClass() メソッドも参照してください。

.isMSCustAttribClass が、カスタム アトリビュート定義 MSCustAttribDef、MAXClass、および MSPluginClass の読み取り専用プロパティとして追加されました。クラスが MSCustAttribDef の場合、プロパティは true です。以前に定義した isMSCustAttribClass() メソッドも参照してください。

Mesh

3ds Max 7 以前のバージョンでは、update を呼び出す前に、メッシュを再度初期化して有効にする必要がありました。しかし、ユーザの多くは、メッシュを適切に再初期化するために必要なすべての作業を把握しているわけではありませんでした。このため、.numfaces の設定時または setNumFaces メソッドの呼び出し時に、再初期化が行われるようになりました。

when 変更ハンドラ

when parameters obj 変更ハンドラで、トポロジとジオメトリの変更も扱われるようになりました。

以前に扱われなかった理由は、オブジェクトがノードの場合、ほとんどのモディファイヤ (アトリビュート ホルダーなど) で変更のあったパラメータからのパラメータ変更メッセージは、ModApp によって、ジオメトリ変更メッセージに変更されていたためです。

関数公開システム メソッドの NULL 値

Material、RefTarg、INode、Object、または Control の値をとる FPS メソッド/プロパティの場合、「undefined」は許容値であり、NULL に変換されます。

getMAXFileObjectNames 文字列

getMAXFileObjectNames は、名前値の配列ではなく、文字列値の配列を返すようになりました。 mergeMaxFile で使用されるオブジェクト名では大文字と小文字が区別されますが、名前値ではラップされる文字列の大文字/小文字が必ずしも保持されません。「3ds Max ファイルのロードと保存」を参照してください。

マクロ レコーダ

マクロ レコーダ パス分析は、DeleteReference 復元オブジェクトか MAXScript MAXWrapper 値である参照を無視するように変更されました。従来は、パス分析で、シーンへの参照の前にこれらの参照が見つかった場合、マクロ レコーダ出力が生成されませんでした。

MAXPB2ArrayParam 値に関する InsertItem

insertItem メソッドは、MAXPB2ArrayParam 値を扱うように拡張されました。

例:

plugin helper testObj
name: "testObj"
classid:#(8788668,86769866)
extends:dummy
(
  parameters main
  (
    mtltab type:#materialtab tabsizevariable:true
  )
)

t1 = testObj parent:b1
append tabtest.materialTab (standard name: "1")
append tabtest.materialTab (standard name: "2")
append tabtest.materialTab (standard name: "3")
insertItem (standard name: "4") tabtest.materialTab 3

スクリプト プラグイン

スクリプト プラグインでの「extends」クラス タイプのテストが修正され、スクリプト プラグインが拡張できるようになりました。

simpleMod 'map' イベント ハンドラ コールは、マップ イベント ハンドラが定義されていない場合、明示的に使用不可になります。これによる実際の実行速度の増加はありません。マップ イベント ハンドラを最初に呼び出すと、Point3 ではない値を返し、この結果イベント ハンドラが使用不可になります。

remap キーワード引数が、スクリプト プラグインスクリプト カスタム アトリビュート定義に追加されました。

このキーワードによって、既存の定義を更新するときに、定義内のパラメータ名を変更できます。このキーワードは 2 要素配列を引数にとります。それぞれの要素には、文字列リテラルまたは名前値の配列が含まれます。2 つの配列のサイズは同じにする必要があります。

最初の配列内の名前は既存のパラメータ名で、2 番目の配列内の名前は新しいパラメータ名になります。

既存のプラグイン インスタンスの移行中にパラメータ名が読み込まれるため、パラメータ名は最初の配列内で検索されます。名前が見つかった場合、このパラメータに関連するデータは、2 番目の配列内の対応する場所にあるパラメータ名に移されます。

パラメータ名が最初の配列内で見つからなかった場合、パラメータ名は再マップされません。2 番目の配列内のパラメータ名が、新しい定義のパラメータ名に一致しない場合、このパラメータ データは、新しい定義には移されません。

文字列からブール値へのコアージョン

文字列からブール値へのコアージョンが追加されました。

このコアージョンの有効な文字列 (大文字と小文字を区別) は次のとおりです。

"on" as booleanClass --> true
"off" as booleanClass --> false
"true" as booleanClass --> true
"false" as booleanClass --> false

他の文字列値はすべて、ランタイム エラーになります。

配列から文字列へのコアージョン

Array、MeshSelection、BigMatrix、および BigMatrixRowArray 一式を出力するか、文字列に強制的に置き換えるか、最初の 20 要素だけにするかをコントロールするために、MAXScript 変数 options.printAllElements とコンテキスト with printAllElements <bool> do <expr> が導入されました。

Name 値

Name 値 copy メソッドが定義されました。に定義されました。このメソッドは、同じ名前の値を返します。

SubAnim 値

subAnim 値に新しい読み取り専用プロパティ .parent および .index が追加されました。この親は subAnim を所有する真のオブジェクトであり、インデックスはこのオブジェクト内の subAnim インデックスになります。

注:

また、MAXScript では特定の種類の subAnims を非表示にするため、それに含まれる subAnim を自動的に上位に上げることになります。

例:

s=sphere()
sa = s.baseobject[1]
--> SubAnim:Radius
sa.parent
--> ReferenceTarget:ParamBlock
sa.index
--> 1
--The actual owner of the Radius subAnim is the sphere's parameter block.

ユーザ インタフェース コントロール

.text プロパティは、 .text を個別に定義しないすべてのロールアウト コントロール(たとえば、EditText コントロールには既に .text プロパティがあります)の .caption プロパティと同じになりました。ラベルのテキストを設定することはラベルのキャプションを設定することと同じです。これまでのリリースではテキストを設定しても UI は更新されませんが、内部の .caption 値は更新されます。

コンボボックスとドロップダウン リストを表示する高さの計算が改善されました。コンボボックス、ドロップダウン リスト、およびリストボックス コントロールの高さパラメータの最低値は、1 に固定されました。

#worldUnits は、スライダのタイプとして受け入れられ、 #float のタイプと同じになりました。

スピナー コントロールの align: #left では正しく配置されませんでした。スピナーの幅を変更すると、スピナーが右か左に移動し、ロールアウトからスピナーの一部が出てしまうことがよくあります。 幅を変更しても左揃えのスピナー コントロールが左に固定されるように、この問題が修正されました。

Group UI コントロールは、across: パラメータを使用するグループ内のコントロールを処理するように修正されました。グループの底線は、グループ内で最後のコントロールではなく、グループ内で最大のコントロールの下に描かれるようになりました。

例:

rollout test "test"
(
  group "Test Group"
  (
    radiobuttons rb_Test labels:#("AA","BB") columns:1 align:#left across:2
    label lb_test "Test Label:" align:#left offset:[40,0]
  )
)
createdialog test width:329

3ds Max 6 以前のバージョンでは、上記の結果は次のようになります。

3ds Max 7 では、次のような結果になります。

ロールアウト イベント ハンドラは、ロールアウトのプロパティとしてアクセスできるようになりました。たとえば、<rollout>.open() は、ロールアウトの open ハンドラを呼び出します。

プログラム フロー制御

複数のノード オブジェクト セットにわたってマップしているときの continue を修正しました。

例:

b=box();b2=box parent:b
for o in objects do (print o.name; continue)
for o in $* do (print o.name; continue)

この場合、3ds Max 6 以前では、Box01 だけが印刷され、Box02 は印刷されません。

現在では両方が印刷されます。

現在の例外の取得

新しい getCurrentException()メソッドは、catch() ステートメントとともに使用し、現在の例外のテキストを返します。

その他の微調整

no_max_maker が、ノードの MAXRefTarg 値の代わりに MAXNode 値を返すように修正されました。

getTransformAxis の最初の引数がノードではなく「 undefined 」という値である場合、ビューポートの共通の軸が返されます。

座標系の中心( getCoordCenter() によって返される)が #local であるか、参照座標システム( getRefCoordSys() によって返される)が #local、#parent 、または #gimbal である場合、最後に計算された共通軸が返されます。

関連事項