dotNet 構造体のメソッド

dotNet 構造体は、dotNet のオブジェクト、クラス、アセンブリ、イベント ハンドラなどを管理するための追加の MAXScript メソッドを提供しています。

3ds Max 9 以降で使用可能です。

アセンブリのロード:

<dotNetObject>dotNet.loadAssembly <assembly> [returnPassFail:bool]

このメソッドは、指定されたアセンブリをロードします。ロードするアセンブリは、アセンブリ名またはそのアセンブリを含んでいる dll のファイル名で指定します。

このメソッドはまず、アセンブリ名を使用してアプリケーション ディレクトリから、またはグローバル アセンブリ キャッシュからのアセンブリのロードを試みます。これでロードできない場合は、プライマリの .net アセンブリが含まれているディレクトリ内でアセンブリ名の付いた dll を検索します。

returnPassFail が false (既定値)になっていて、アセンブリが存在し、正常にロードされた場合は、.net アセンブリ値をラップする dotNetObject 値が返され、それ以外の場合は undefined 値が返されます。returnPassFail が true のときに、アセンブリがロードされた場合、このメソッドは true を返します。アセンブリがロードされなかった場合は、false を返します。

    dotnet.loadAssembly "system.xml"
    dotnet.loadAssembly "system.xml.dll"
    dotnet.loadAssembly "C:\\WINDOWS\\Microsoft.NET\\Framework\\v2.0.50727\\system.xml.dll"
    dotnet.loadAssembly "C:\\WINDOWS\\Microsoft.NET\\Framework\\v2.0.50727\\system.xml"
注:

既存の dotNet クラスを使用して同じ処理を行うこともできます。

    assembly = dotNetClass "System.Reflection.Assembly" r = assembly.loadfrom "F:\\FlashTrackBar\\bin\\Debug\\FlashTrackBar.dll"

アイコンのロード:

dotNet.LoadIcon <iconName> iconSize:<point2> enabled:<boolean> on:<boolean> applyUIScaling:<boolean>

アイコンが見つかった場合は、System::Drawing::Icon を返し、アイコンが見つからなかった場合は、undefined を返します。3ds Max 2017 以降で使用可能です。

iconName はアイコン ファイルのパス、または以前にロードされたアイコンのリソースです。

iconSize は 100% DPI スケールのアイコンのサイズです。指定しない場合の既定値は[24,24]です。

enabled パラメータは、ロードするアイコンのバージョン(有効または無効)を指定します。

on パラメータは、ロードするアイコンのバージョン(オンまたはオフ)を指定します。

applyUIScaling は、高 DPI ディスプレイのアイコンにスケールを適用するかどうかを指定します。既定値は true です。

    hForm = dotNetObject "System.Windows.Forms.Form"
    dotNetIcon = dotnet.loadIcon("PolyTools\TransformTools\PB_CW")
    hForm.Icon = dotNetIcon --set the title bar icon of the form
    hForm.show()
    --Result: an empty form with a clockwise rotation arrow as icon

イベント ハンドラ:

dotNet.addEventHandler <dotNetControl> <EventNameString> <function>

このメソッドは、1 番目の引数として渡された dotNetControl にイベント ハンドラを追加します。

2 番目の引数は文字列でイベント名を指定します。特定の dotNetControl で利用可能な全イベントのリストは、その dotNetControl 値に対して showEvents()を呼び出すことにより取得できます。

3 番目の引数は、イベントがトリガされたときに呼び出されるカスタム MAXScript 関数です。

ハンドラによって呼び出されたカスタム MAXScript 関数が 2 つの引数を要求する場合、1 番目の引数にはセンダー、2 番目の引数には eventArg が渡されます。

イベント ハンドラ関数が引数を 1 つだけを指定する場合、eventArg だけが渡されます。

イベント ハンドラ関数が引数を 1 つも指定しない場合、何も渡されません。

詳細はこのページの例を参照してください。

注: dotNet.addEventHandler() を使用すれば、異なる数の引数を持つ複数の関数を同一のイベントに対して登録できます。
注: 追加できるのは、グローバル スコープ内にイベント ハンドラとして登録されている関数のみです。グローバル スコープに対して非表示になっている関数(構造体に含まれている関数など)を登録する必要がある場合は、この非表示関数を指すグローバル関数を定義する必要があります。

    struct dotNetStruct
    (
        myForm = dotNetObject "system.windows.forms.form",
        myButton = dotNetObject "system.windows.forms.button"
    )

    ui = dotNetStruct()

    ui.myForm.width = 100
    ui.myForm.height = 100
    ui.myButton.text = "Say Something"
    ui.myForm.controls.add ui.myButton

    -- A function "hidden" in a global struct
    struct functionStruct
    (
        fn printSomething a b =
        (
            print "something"
        )
    )

    myFunctionStruct = functionStruct()

    --- Create a new function in global scope to point to our "hidden" function
    fn theFunctionPrint a b = myFunctionStruct.printSomething a b

    DotNet.AddEventHandler ui.mybutton "click" theFunctionPrint


    ui.myForm.show()
dotNet.removeAllEventHandlers <dotNetControl>

指定された dotNetControl から、すべてのイベント ハンドラを削除します。

dotNet.removeEventHandler <dotNetControl> <EventNameString> <function>

指定されたイベント ハンドラ関数を指定された dotNetControl およびイベントから削除します。

引数リストは、dotNet.addEventHandler() の場合と同じです。

同じイベントに複数の関数を登録することができるため(上記の注を参照)、コールバック関数を 3 番目の引数として指定する必要があります。

特定のイベントに登録されたすべての関数を削除するには、以下のメソッドを参照してください。

dotNet.removeEventHandlers <dotNetControl> <EventNameString>

指定された dotNetControl のイベントに登録されているすべての関数を削除します。

例:

    (
    fn buttonPressed1 a1 a2 =
    (
    print "1. Button Pressed - Two Arguments"
    print a1
    print a2
    )
    fn buttonPressed2 a1 =
    (
    print "2. Button Pressed - One Argument"
    print a1
    )
    fn buttonPressed3 =
    (
    print "3. Button Pressed - No Arguments"
    )
    fn mouseEnter4 =
    (
    print "4. Mouse Entered The Button!"
    )
    fn mouseLeave5 =
    (
    print "5. Mouse Left The Button!"
    )
    local mButton = dotNetObject "System.windows.forms.button"
    mButton.text = "Press Me"
    mButton.size = dotNetObject "System.Drawing.Size" 100 100
    mButton.location = dotNetObject "System.Drawing.Point" 10 10
    local hForm = dotNetObject "System.Windows.Forms.Form"
    hForm.size = dotNetObject "System.Drawing.Size" 120 140
    hForm.controls.add mButton
    dotNet.addEventHandler mButton "click" buttonPressed1
    dotNet.addEventHandler mButton "click" buttonPressed2
    dotNet.addEventHandler mButton "click" buttonPressed3
    dotNet.addEventHandler mButton "MouseEnter" mouseEnter4
    dotNet.addEventHandler mButton "MouseLeave" mouseLeave5
    hForm.show()
    ok
    )

上のスクリプトを評価し、マウスをボタンの上に移動してクリックした後、マウスをボタンから離し、再びボタンの上に乗せてから離すとリスナー出力は次のようになります。

    OK
    "4. Mouse Entered The Button!"
    "1. Button Pressed - Two Arguments"
    dotNetObject:System.Windows.Forms.Button
    dotNetObject:System.Windows.Forms.MouseEventArgs
    "2. Button Pressed - One Argument"
    dotNetObject:System.Windows.Forms.MouseEventArgs
    "3. Button Pressed - No Arguments"
    "5. Mouse Left The Button!"
    "4. Mouse Entered The Button!"
    "5. Mouse Left The Button!"

1 つ目の関数(buttonPressed1)に以下の行を追加すると、ボタンを最初にクリックした後、1 つ目の on Click イベント ハンドラが削除されます。2 回目のクリックでは、2 つ目と 3 つ目の関数だけがリスナーへの出力を行います。

この関数内では、a1 引数に「センダー」、つまりトリガされたイベントが属する dotNetControl が含まれます。

    dotNet.removeEventHandlers a1 "click" buttonPressed1
    OK
    "4. Mouse Entered The Button!"
    "1. Button Pressed - Two Arguments"
    dotNetObject:System.Windows.Forms.Button
    dotNetObject:System.Windows.Forms.MouseEventArgs
    "3. Button Pressed - No Arguments"
    "2. Button Pressed - One Argument"
    dotNetObject:System.Windows.Forms.MouseEventArgs
    "3. Button Pressed - No Arguments"
    "2. Button Pressed - One Argument"
    dotNetObject:System.Windows.Forms.MouseEventArgs
    "3. Button Pressed - No Arguments"
    "5. Mouse Left The Button!"
    --additional clicks result in no output from function 1
    --but all others work

1 つ目の関数(buttonPressed1)に以下の行を追加すると、最初にボタンをクリックした後、すべての on Click イベント ハンドラが削除されます。

2 回目のクリックではリスナーに何も出力されませんが、マウスをボタンの上に乗せたり離したりすると、他の 2 つの関数が出力を行います。

    dotNet.removeEventHandlers a1 "click"
    OK
    "4. Mouse Entered The Button!"
    "1. Button Pressed - Two Arguments"
    dotNetObject:System.Windows.Forms.Button
    dotNetObject:System.Windows.Forms.MouseEventArgs
    "2. Button Pressed - One Argument"
    dotNetObject:System.Windows.Forms.MouseEventArgs
    "3. Button Pressed - No Arguments"
    "5. Mouse Left The Button!"
    "4. Mouse Entered The Button!"
    "5. Mouse Left The Button!"
    --additional clicks result in no output
    --but moving the mouse prints to the Listener

1 つ目の関数(buttonPressed1)に以下の行を追加すると、最初にボタンをクリックした後、on Click、on MouseEnter、on MouseLeave を含むすべてのイベント ハンドラが削除されます。

    dotNet.removeAllEventHandlers a1
    OK
    "4. Mouse Entered The Button!"
    "1. Button Pressed - Two Arguments"
    dotNetObject:System.Windows.Forms.Button
    dotNetObject:System.Windows.Forms.MouseEventArgs
    "2. Button Pressed - One Argument"
    dotNetObject:System.Windows.Forms.MouseEventArgs
    "3. Button Pressed - No Arguments"
    --additional clicks result in no output

その他の調査関数:

dotNet.showConstructors [<dotNetClass> | <dotNetObject> | <dotNetControl>] [to:<stream>]

指定された DotNetClass、DotNetObject、または DotNetControl によって公開されるコンストラクタを表示します。

to が指定されていない場合はリスナーに出力され、それ以外の場合は指定されたストリームに出力されます。

dotNet.getType<type_string>

type_string に指定された System:Type をラップする dotNetObject 値を返します。

Enums:

dotnet.combineEnums {<dotNetObject> | <number>}+

System::Enum から派生する、ビット フィールドとして処理すべきオブジェクト(FlagsAttribute を持つもの)を結合します。System::Enum 派生オブジェクトは、すべて同一の種類である必要があります。戻り値も同じ種類です。数字を指定する場合は、少なくとも 1 つの System::Enum 派生オブジェクトも(種類を指定するために)同時に指定する必要があります。

dotnet.CompareEnums{<dotNetObject> | <number>} {<dotNetObject> | <number>}

2 つの値をビット レベルで比較します。それぞれの値の中に少なくとも 1 個の対応するビットが設定されている場合は true を返します。

    BindingFlags= dotNetClass "System.Reflection.BindingFlags"
    --> dotNetClass:System.Reflection.BindingFlags
    BindingFlags.Static.value__
    --> 8
    BindingFlags.Public.value__
    --> 16
    BindingFlags.FlattenHierarchy.value__
    --> 64
    res = dotNet.combineEnums BindingFlags.Static BindingFlags.Public 2
    --> dotNetObject:System.Reflection.BindingFlags
    res.value__
    --> 26
    dotNet.compareEnums res 1
    --> false
    dotNet.compareEnums res BindingFlags.Static
    --> true
    dotNet.compareEnums res BindingFlags.Public
    --> true
    dotNet.compareEnums res BindingFlags.FlattenHierarchy
    --> false

値変換:

dotNet.ValueToDotNetObject <value> { <dotNetClass> | <dotNetObject> }

詳細については、「MAXScript と Dotnet の値の変換」を参照してください。

3ds Max 2010以降で使用可能です。

寿命制御:

dotNet.setLifetimeControl {<dotNetObject> | <dotNetClass>} {#mxs | #dotnet}

詳細については、「DotNet オブジェクトおよびクラスの寿命制御」を参照してください。

3ds Max 2010以降で使用可能です。