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]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章