3ds Max .NET SDK并创建参考制造商

时间:2015-01-29 19:02:31

标签: c# .net c++-cli 3dsmax

我有.u用于Max的.Net DLL,我希望对视口中某些节点的参数更改做出反应。我想到的最简单的解决方案是创建ReferenceMaker插件并为我想要观看的节点设置参考。根据文件,它应该是

 public class ReferenceListener : Autodesk.Max.Plugins.ReferenceMaker{ ... }

但是当我创建这个类的新实例并尝试设置引用时,它会在“对象引用未设置为对象的实例”时崩溃。 当我尝试调试它时,我发现所有的基类属性都是null,所以它的接缝ReferenceMaker插件实例不是在Max中创建的。

最后我找到了MaxSharp源代码here,但是使用得到的dll让我得到了相同的结果,坦率地说,实现与我以前一样安静。试图将ReferenceListener附加到ReferenceTarget始终崩溃,因为基类中的空值。 所以我真的不知道如何解决这个问题,但也许有人试图创造这样的东西并成功?现在我正在考虑将这些参数更改回调写入maxscript,并调用.net表单,但它感觉hacky .. 我正在使用Max 2014(MaxSharp是2013年),但我没有发现文档中提到的任何差异,我们将不胜感激。

谢谢

更新

所以,我把它缩小到非常奇怪的问题。我已经创建了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年无效,所以也许这就是原因是什么?

感谢您的任何建议。

0 个答案:

没有答案