您的位置:首页 > 其它

3ds Max插件开发(八)编写.Net Plug-ins

2017-07-17 11:47 756 查看
3ds Max 使用自己集成的.NET assembly 加载器在运行期间加载在3ds Max的安装目录\bin\assemblies 里全部有效并且实现了3ds Max plug-in的.Net assembly,3ds Max SDK有很多不同的DLL库,提供必要的API给 .NET plug-ins来使用。

Autodesk.max.dll 提供了一个混合库包装起来了几乎所有的3ds Max C++ SDK特性。

UiViewModel.dll 包含所有需要创建用户行为给CUI的类,介绍下CUI,源自百度百科:CUI:指冯诺依曼体系机构。在电子技术领域表示为Command User Interface,命令行用户交互。是和GUI(图形界面(Graphical
User Interface,简称 GUI,又称图形用户接口))相对应的一种说法。这里是指应用命令行和电脑交互,从而达到控制和利用电脑的目的。现在一般说UI其实,这是不科学的,大多数人喜欢拿UI和GUI比较,认为UI就是命令交互,其实UI是包含了CUI和GUI的。这种现象在dos时代很盛行,就算到了现在这种交互的方式并不是被GUI打败了,现在依然有一些爱好者更喜欢用命令和电脑交互,因为这样的系统一般比较小运行起来方便。比如dos和linux内核。
要写.Net plug-ins,需要创建新的C#类库,创建好后根据功能需要从3ds Max安装目录导入引用UiViewModel.dll和Autodesk.Max.dll。
.Net Action plug-ins 用 UiViewModel.dll
创建 .NET Action plug-in 要用到UiViewModel.dll ,plug-in类必须实现CuiActionCommandAdapter接口。你可以在VS里用C#自动的实现一个抽象类,只要右键点击类名选择Implement Abstract Class即可,这样CuiActionCommandAdapter接口会自动创建需要的4个属性变量和1个函数。属性变量提供关于你的CUI Action
plug-in的基础信息,名为Execute()函数需要在你的plug-in里实现。在3ds Max任何extend CuiActionCommandAdapter接口的类都是独立编译加载的。
 .Net plug-ins 用 Autodesk.max.dll
类似于C++ plug-in插件  extend  3ds Max base class,开发者可以使用定义在Autodesk.max.dll的接口去实现自己想要的任何插件类型。在3ds Max C++ SDK 类和 Autodesk.Max.dll接口变量之间一 一对应。创建好utility plug-in会有2个函数供你自定义实现:BeginEditParams() and EndEditParams()
.Net plug-in也需要类的描述符 class descriptors,这点类似于C++ plug-ins的非托管代码。 class descriptors作用是启动写的plug-ins,你可以自定义class descriptor extend Autodesk.Max.Plugins.ClassDesc2。class descriptor返回一个Create()函数创建的object给你的plug-ins。同上你可以右键选择描述符 Implement
Abstract Class 创建并完成你想实现的函数。你不需要给插件明确地定义构造函数,因为你可以调用Descriptor::Create()这个不带任何参数的函数。整个插件工程会在调用该函数时被编译,但是3ds Max此时仍然没有意识到该插件,需要在3ds max installation folder]\bin\assemblies替换.dll文件,重启3ds Max,3ds Max才会识别到。要被.NET
Assembly Loader解释,需要注册你的3ds Max插件,暴露出并实现一个public static 的函数名称AssemblyMain()。可以在插件的命名空间内实现该函数,其中包括 main plug-in class 和 class descriptor。清晰起见,我们创建一个新的public class 去实现这个函数和其他assembly function函数。和AssemblyMain()函数相似的是,public static AssemblyShutdown() 函数可以在任何需要的时刻终结你的插件。
public static class AssemblyFunctions
{
public static void AssemblyMain()
{
var g = Autodesk.Max.GlobalInterface.Instance;
var i = g.COREInterface13;
i.AddClass(new Descriptor(g));
}

public static void AssemblyShutdown()
{
}
}


Interfaces instead of Classes, Properties instead of Functions

3ds Max包括一个句柄指向它的统一查询接口BeginEditParams()。我们可以通过调用PushPrompt()函数得到这个句柄。同时我们也可以声明接口global来得到BeginEditParams()。
IGlobal global = Autodesk.Max.GlobalInterface.Instance;
Interface13 Interface = global.COREInterface13;
global.PushPrompt("...");
等价的C++代码是:
Interface* ip =GetCOREInterface();ip->PushPrompt("...")
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  3dMax .net