关于Max导出插件的七七八八
介绍几个东西,如何在Max插件里使用.net来做界面,怎么为插件增加maxScript的脚本接口以及命令行参数来直接测试导出插件。
先说第一个,首先是visualstudio的项目设置里开启clr的支持,添加需要的引用,然后需要在DllMain里增加
BOOL WINAPI DllMain(HINSTANCE hinstDLL,ULONG fdwReason,LPVOID lpvReserved) { if( fdwReason == DLL_PROCESS_ATTACH ) { hInstance = hinstDLL; DisableThreadLibraryCalls(hInstance); }
return(TRUE); }
如果用的较新的插件向导建立的工程,本来就是如此,如果用比较老的版本,比如Max9,是没有这个if里的内容的,如果启用了clr而没有这段,max可能会崩溃。
其次,需要在用.net的文件里使用 #pragma unmanaged和#pragma managed来区分托管代码和非托管代码。导出插件的相应的ClassDesc要改成单例模式。在插件的LibClassDesc函数里返回单例的ClassDesc。
然后增加脚本接口,在MaxSDK文档里,这部分内容是Function Publishing,这里介绍一下顺序
先要创建一个类继承FPStaticInterface,这个类里要有需要开放给脚本的函数,如果是一个属性的话,需要有get和set函数,如果是只读属性,有get就可以了,然后要为每个函数对应一个枚举,用BEGIN_FUNCTION_MAP和END_FUNCTION_MAP这两个宏以及相应的函数类型对应的宏写前面对应的函数以及他们暴露给脚本的函数名和属性名。
然后如果没有开启clr,直接随便找个地方创建一个该类的实例即可。如果开启了clr,则需要在DllMain里创建。
至于用脚本来测试导出,就很容易了,max可以使用参数指定启动后运行的maxScript脚本,可以在脚本中打开文件、指定参数、然后导出
3dsmax -U MAXScript test.ms
附上我写的范例工程
https://files.cnblogs.com/sitt/SimpleExportMax2014.zip
插件在maxScript中的名字为 SimpleExporter
成员有一个函数和四个属性
SimpleExporter.hello()
SimpleExporter.char
SimpleExporter.int
SimpleExporter.float
SimpleExporter.bool