今天教大家如何將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]