我有 .Net DLL for Max 和 ui,我想对视口中某些节点的参数更改做出反应。我想到的最简单的解决方案是创建 ReferenceMaker 插件并为我想要观看的节点设置参考。根据文档应该是
public class ReferenceListener : Autodesk.Max.Plugins.ReferenceMaker{ ... }
但是,当我创建此类的新实例并尝试设置引用时,它会因“对象引用未设置为对象的实例”而崩溃。
当我尝试调试它时,我发现所有基类属性均为 null,因此它表明 ReferenceMaker 插件实例未在 Max 中创建。
终于找到MaxSharp源码了here https://area.autodesk.com/blogs/chris/3ds-max-2013-net-sdk-and-the-maxsharp-source-code但使用生成的 dll 让我得到相同的结果,坦率地说,实现与我之前的一样安静。由于基类中存在空值,尝试将 ReferenceListener 附加到 ReferenceTarget 总是会崩溃。
所以我真的不知道如何解决这个问题,但也许有人尝试创建这样的东西并成功了?现在我正在考虑将这些参数更改回调写入 maxscript,并以它的形式调用 .net,但这感觉很hacky..
我使用的是 Max 2014(MaxSharp 是 2013 年),但我没有发现文档中提到的任何差异,如果有任何帮助,我们将不胜感激。
谢谢
UPDATE
因此,我将其范围缩小到非常奇怪的问题。我创建了 C++/CLI 插件,在 C++ SDK 中创建了 ReferenceMaker 类,并使用 .net 包装器来调用 C# 形式的插件,但它仍然无法解决相同的症状。
似乎错误的指针地址存储在 Autodesk.Max 包装对象内,因此这就是它失败的原因。我对.Net DLL和C++ SDK返回的指针进行了比较,它们总是相差64。而且总是这样。
C++/CLI 代码
IINode^ al = Autodesk::Max::GlobalInterface::Instance->COREInterface->GetSelNode(0);
IReferenceTarget^ ak = (IReferenceTarget^)al;
ReferenceTarget* nativeTarget = (ReferenceTarget*)ak->Handle.ToPointer();
m_notifyListener->Test(nativeTarget);
C++ Max SDK 代码
void NotifyListener::Test(RefTargetHandle managedPointer)
{
Interface* ip = GetCOREInterface();
RefTargetHandle nativePointer = ip->GetSelNode(0);
intptr_t P1 = (intptr_t)managedPointer;
intptr_t P2 = (intptr_t)nativePointer ;
}
结果变量是例如。
P1 = 1490452112
P2 = 1490452048
P2 始终比 P1 小 64。
如果这些指针完全不同,我会理解,但这种轻微的转变对我来说真的很奇怪。
有谁知道那里发生了什么吗?这是我实在想不明白的事情。
我需要测试 Max 2013 或 2015 中是否有与我使用 2014 年相同的行为。我在其他一些论坛上看到其他人抱怨示例 .net 插件在 2014 年不起作用,所以也许这就是原因?
感谢您的任何建议。