MAXScript と Dotnet の値の変換

MAXScript は、ネイティブ値から DotNet 値へ、および DotNet 値から MAXScript 値への変換を自動的に行います。

さらに、値の変換は、3ds Max 2010 以降 の専用の関数を使用して明示的に行うこともできます。

自動変換

次の表は、ネイティブの MAXScript の値の型と、3ds Max 9以降 で変換された DotNet 値の型を示したものです。

MAXScript の型 DotNet の型
Integer, Integer64, IntegerPtr,
Float, Double, MSTime Byte, SByte, Decimal,
Int16, UInt16, Int32, UInt32,
IntPtr, UIntPtr, Int64, UInt64,
Single, Double
Boolean Boolean
String String, Char array

次の表は、DotNet の値の型と、変換されたネイティブの MAXScript の値の型を示したものです。

DotNet の型 MAXScript の型
Byte, SByte, Decimal,
Int16, UInt16, Int32, UInt32 Integer
Int64, UInt64 Integer64
IntPtr, UIntPtr IntegerPtr
Single Float
Double Double
Boolean Boolean
String, Char array String

明示的な変換

以下のメソッドは、MAXScript 値を DotNet 値に変換するものです。

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

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

最初の引数として渡された MAXScript 値を、2 つ目の引数として指定された型の DotNet オブジェクトに変換し、dotNetObject 値を返します。

3ds Max 2018.2 Update 以降で使用可能: 一部の .NET ライブラリは、一部の MAXScript タイプをネイティブでサポートしないため、それらは .NET 配列に変換されます。Point2Point3Point4QuatEulerAngles、および Matrix3 タイプはすべて float\[\] または double\[\] 配列に変換されます。

注: EulerAngle は角度で表示されますが、内部的にはラジアンで保存されます。そのため変換された .NET 値はラジアン単位になります。

このメソッドを使用することにより、MAXScript 配列から簡単に DotNet 配列を作成できます。

<value> dotnet.DotNetArrayToValue <dotNetObject> <Matrix3 | Point2 | Point3 | Point4 | Quat | EulerAngles>

3ds Max 2018.2 Update 以降で使用可能: .net 配列を指定した mxs 値タイプの値に変換します。 .net 配列は浮動小数点型または double 型にする必要があります。Matrix3 の場合は .net 配列のサイズを[4,4]に、Point2 の場合は[2]に、Point3 および EulerAngles の場合は[3]に、Point4 および Quat の場合は[4]にする必要があります。

<value> dotnet.DotNetObjectToValue <dotNetObject>

3ds Max 2018.2 Update 以降で使用可能: .NET オブジェクトを MAXScript 値に変換します。

例:

    type = dotNetClass "System.Int32[]"
    --> dotNetClass:System.Int32[]
    res = dotnet.ValueToDotNetObject #(11,12,23) type
    --> dotNetObject:System.Int32[]
    res.length
    --> 3
    res.getvalue 2 --DotNet arrays are zero-based.
    --> 23
    typef = dotnetclass "System.Single[]" --> dotNetClass:System.Single[]
    vf = dotnet.ValueToDotNetObject x_axis typef --> dotNetObject:System.Single[]
    vf.get 0 --> 1.0
    typed = dotnetclass "System.Double[]" --> dotNetClass:System.Double[]
    vd = dotnet.ValueToDotNetObject x_axis typed --> dotNetObject:System.Double[]
    vd.get 0 --> 1.0d0
    typefa = dotnetclass "System.Single[][]" --> dotNetClass:System.Single[][]
    vfa = dotnet.ValueToDotNetObject #([1,2],
        [1,2,3],
        [1,2,3,4],
        (quat 0.854433 0.00437304 0.0050751 0.519518),
        (eulerAngles -117.399 -0.757267 0.126046)
        )  typefa  --> dotNetObject:System.Single[]
    vfa0 = vfa.get 0 --> #(1.0, 2.0)
    vfa1 = vfa.get 1 --> #(1.0, 2.0, 3.0)
    vfa2 = vfa.get 2 --> #(1.0, 2.0, 3.0, 4.0)
    vfa3 = vfa.get 3 --> #(0.854433, 0.00437304, 0.0050751, 0.519518)
    vfa4 = vfa.get 4 --> #(-2.049, -0.0132168, 0.00219992)
    typef2 = dotnetclass "System.Single[]"
    vfa2 = dotnet.ValueToDotNetObject (matrix3 [0.99991,0.0127462,0.00412892]
        [0.00219972,-0.460163,0.887832]
        [0.0132164,-0.887743,-0.46015]
        [90,0,-45]) typef2  --> dotNetClass:System.Single[,]
    vfa2.get 0 0 --> 0.99991