Maxscript_与DotNet交互

引用静态类,使用: dotnetClass “命名空间.类”

dnPath = dotnetClass "System.IO.Path"

show dnPath
-- 显示属性

showmethods dnPath
-- 显示方法

showevents dnPath
-- 显示事件

构造实例类,使用: dotnetObject “命名空间.类” [参数]

myFileInfo = dotnetObject "System.IO.FileInfo" (@"c:\aaa\aaa\myFile.ms")

show myFileInfo
-- 显示属性

showmethods myFileInfo
-- 显示方法

showevents myFileInfo
-- 显示事件

自己写DotNet库需要注意的 DotNet版本与Max的支持对应

  • 不同的3dsMax版本对DotNet版本的支持,

Max20 (2018)Max19 (2017)Max18 (2016)Max17 (2015)
-> dotnet: 4.5 +Max16 (2014)Max15 (2013)Max14 (2012)Max13 (2011)
-> dotnet: 3.5 +Max12 (2010)Max11 (2009)Max10 (2008)Max9
-> dotnet: 2.0 +

根据3dsMax版本对应能支持的DotNet版本,调整DotNet版本


  • C#例子

using System;namespace TestLibraryX
{
    public class TestObject
    {
        private string Name;
        public TestObject(string thisName)
        {
            Name = thisName;
        }
            public string GetLongName()
        {
            return( "You can call me "  + Name +  "!" );
        }
    }
}
  • 在Maxscript 中调用

--读取Dll
dotnet.loadAssembly ("C:\TestLibraryX.dll")

-- 引用类
ThisTestObject = dotNetObject "TestLibraryX.TestObject" "Hello"

-- 调用类中函数
print (ThisTestObject.GetLongName())

使用DotNet第3方窗口控件

  • 一般在Rollout中,可以使用一些简单的winform控件,例如 button,listView, treeView, 等等, 网上很多例子

  • 但是对于一些第3方的控件,Maxscript不一定支持,可以尝试使用
    System.Windows.Forms.ContainerControl 来解决这个问题

-- 先加载第3方窗口控件的Dll,加载成功之后才能下一步
-- 例如我这里使用了
ImageListView.dlldll_ImageListView = myDllPath + (@"\ImageListView.dll")
dotnet.loadAssembly dll_ImageListView

rollout rltMaxLibrary "TMaxLibrary"
(
    -- 声明一个DotnetContainer
    dotnetControl dnUIContainer "System.Windows.Forms.ContainerControl"
    
    -- 在Open事件中
    on rltMaxLibrary open do
    (
        -- 把外部的DotNet控件,添加进来
        dnUIContainer.controls.add  dnMaxLibraryImageListView
    )
)

用一个结构体成员做实例类的构造引用

  • 使用C#编写DotNet的类库

  • 通过Maxscript加载,并且构建一个引用,直接使用Maxscript来创建C#写的类

-- 示例类struct MaxKit
(
    -- 声明一个成员,做构造函数的引用
    File    ,
    on Create do(    ))
    
    -- 加载DotnetDll库
    dotnet.loadAssembly  @"c:\MyKit\GenericLibrary.dll"
    
    -- 将此成员声明成一个函数,其中返回DotNet的类,这里即指定了函数又声明了函数
    MaxKit.File = fn AssetFile file =
    (
        return dotnetObject "GenericLibrary.AssetManagement.AssetFile"  file
    )
  • 使用Maxscript来构造一个DotNet的类

myFile = MaxKit.File @"c:\aaa\asasas"showmethods myFile

使用Event的例子

  • DotNet的Event事件与 Maxscript配合是个特别麻烦的事情,这里给出一个例子

  • 主要是Maxscript没有自身的类定义,使用Struct来模拟类的写法,难以获得自身的实例引用

struct formHolder
(
    form,
    size = [200,270],
    pos = [900,150],
    title = "The Form",
    fn open = (if iskindof form dotnetobject do form.Showmodeless()),
    fn close = (if iskindof form dotnetobject do form.Close()),
    
    -- dotnet的事件
    fn onShown sender arg =
    (
        format "%\n" (sender.WindowState.toString())
    ),
    
    -- dotnet的事件
    fn onMove sender arg =
    (
        
        -- 这里访问了存储在tag中的引用
        format "default:% %\n" sender.tag.value.pos (sender.Location.toString())
    ),


    on create do
    (
        form = dotNetObject "MaxCustomControls.MaxForm"
        
        -- 将当前类的实例引用存储 在Dotnet-Form中的Tag 上
        form.tag = dotnetmxsvalue this
        form.size = dotNetObject "System.Drawing.Size" size.x size.y
        form.Location = dotNetObject "System.Drawing.Point" pos.x pos.y
        form.StartPosition = form.StartPosition.Manual
        form.text = title
        dotnet.addEventHandler form "Shown" onShown
        dotnet.addEventHandler form "Move" onMove
    )
)

-- 创建实例 
w = formHolder()
w.open()


作者:TAZORN

著作权归作者所有




【相关阅读】:


【上传发布插件】: