MAX之不关闭MAX脚本开发

今天教大家如何将max插件开发与C#结合起来,以弹出框为例。

这种开发方式的三大优点

1.开发过程中不需要关闭MAX
2.可以引用三方组件
3.开发过程可以调试

1.新建类库,命名:TestPlugin
这里写图片描述
2.右键属性,修改项目输出路径

我的路径为:E:\Program Files\Autodesk\3ds Max Design 2015\plugins\TestPlugin

3.新建MAX脚本
这里写图片描述
4.编写一些基础代码

global m_hand = undefined

rollout form "演示插件"
(

    button btnTest "测试按钮" pos:[60,60] width:180 height:25

    /*窗体打开事件*/
    on form open  do
    (
        local assembly = dotNetClass "System.Reflection.Assembly"
        local rootpath = getdir #maxroot
        local maxcorepath =  rootpath + "\\plugins\\TestPlugin\\TestPlugin.dll"
        local ass = assembly.Load ((dotnetClass "System.IO.File").ReadAllBytes maxcorepath)
        local types = ass.ExportedTypes
        for type in types do
        (
            if type.name == "Hand" do
            (
                m_hand = (dotNetClass "System.Activator").CreateInstance type
                break
            )
        )
        if m_hand == undefined do messagebox "核心组件初始化失败!  "
    )

    on btnTest pressed do
    (
        m_hand.ShowMSG 0
    )
)

createdialog form 300 300

5.运行(Ctrl+E),点击测试按钮
这里写图片描述这里写图片描述
6.添加Hand类,代码实现如下

    public class Hand
    {
        public static string Startup { get; private set; }

        #region 加载依赖
        static Hand()
        {
            AppDomain domain = AppDomain.CurrentDomain;
            Hand.Startup = Path.Combine(domain.BaseDirectory, "plugins", "TestPlugin");
            domain.AssemblyResolve += CurrentDomain_AssemblyResolve;
        }

        static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
        {
            string strName = args.Name.Substring(0, args.Name.IndexOf(",")) + ".dll";
            if (!File.Exists(Path.Combine(Hand.Startup, strName))) return null;
            return Assembly.LoadFrom(Path.Combine(Hand.Startup, strName));
        }
        #endregion

        public void ShowMSG(int val)
        {
            MessageBox.Show("C# ShowMSG");
        }
    }

7.运行(Ctrl+E),点击测试按钮
这里写图片描述
8.可以在类库设计UI,添加Form
这里写图片描述
修改ShowMSG的实现

        public void ShowMSG(int val)
        {
            TestForm tf = new TestForm();
            tf.ShowDialog();
        }

8.运行(Ctrl+E),点击测试按钮
这里写图片描述

引用其他三方类库,当然也是没有问题的,这里就不做演示了,有兴趣的可以自己引用,然后在ShowMSG中调用试试。

10.调试
在vs的调试菜单下,找到“附加到进程”,搜索MAX引用程序,点击附加即可。
这里写图片描述
11.附加完毕之后,在需要调试的地方加断点,然后在MAX中运行插件,点击相应功能,vs就会进入调试,停在断点处。
12.至于如何直接使用MAXScript开发脚本,不做详细解释(因为我也是野路子)。

不知到以上方法是否对大家有所帮助,这是我之前研究的时候走的另外一条路,虽然遇到了诸多坎坷,最终还是搞定了。早期发过另外一篇文章,当时写的也比较加单,但也是MAX二开的另外一条路径。
https://blog.csdn.net/yang_sen_/article/details/56279936
这篇文章的思路源于欧特克的所有产品的框架,做过Revit二次开发的同仁或许理解的更深一点,这里就不做详细说明了。

喜欢我博客的朋友可以关注一下,有问题需要帮忙解决的也可以整理好发我邮箱,有时间就会去解答(前提是会的情况下^.^)。
邮箱:[email protected]

猜你喜欢

转载自blog.csdn.net/yangsen600/article/details/81871224
max