符老师,你好!
我参照C:\Program Files\Bentley\MicroStationCONNECTSDK\examples\Elements\DependencyDemo用C++ Clr写了一段类似的代码。程序返回结果Linkage表明Linkage追加成功,但是检查Linkage是否存在时无法找到对应数据,请问一下这个是什么原因?
ElementId mId(mainId); ElementId sId(subId); DgnModelRefP subDgnModelRef = (DgnModelRef*)(subDgnModelRefP.ToPointer()); EditElementHandleR subEditElementHandle= EditElementHandle(sId, subDgnModelRef); DependencyLinkage depLinkage; StatusInt exsit = DependencyManagerLinkage::GetLinkage(nullptr, subEditElementHandle, appID, appValue); if (exsit != SUCCESS) { DependencyLinkage depLinkage; if (SUCCESS == DependencyManagerLinkage::InitLinkage(depLinkage, appID, appValue, DEPENDENCY_ON_COPY_DropDependency)) { depLinkage.nRoots = 1; depLinkage.appValue = appValue; // Add the first element as root depLinkage.root.elemid[0] = mId; } ElementRefP oldFirstRef = subEditElementHandle.GetElementRef(); StatusInt append = DependencyManagerLinkage::AppendLinkage(subEditElementHandle, depLinkage, 0); //append结果为SUCCESS if (SUCCESS == subEditElementHandle.ReplaceInModel(oldFirstRef)) return true; } return false;
我再次调用这段代码时,发现DependencyManagerLinkage::GetLinkage始终没有。
1. 您这段代码在nativeCode C++下能执行成功吗?
2. subEditElementHandle.ReplaceInModel这一行返回的是SUCCESS吗?
3. 将EditElementHandleR subEditElementHandle= EditElementHandle(sId, subDgnModelRef);换成如下一行试一下:
EditElementHandle subEditElementHandle(sId, subDgnModelRef);
符老师,你好!我在Native下也测试,效果和Clr一样。
unsigned int appID = 1111; unsigned int appValue = 2222; ElementId mId(1403); ElementId sId(1404); EditElementHandle subElementHandle(sId, ACTIVEMODEL); EditElementHandleR subEditElementHandle = subElementHandle; DependencyLinkage depLinkage; StatusInt exsit = DependencyManagerLinkage::GetLinkage(nullptr, subEditElementHandle, appID, appValue); if (exsit != SUCCESS) { if (SUCCESS == DependencyManagerLinkage::InitLinkage(depLinkage, appID, appValue, DEPENDENCY_ON_COPY_DropDependency)) { depLinkage.nRoots = 1; depLinkage.appValue = appValue; // Add the first element as root depLinkage.root.elemid[0] = mId; } ElementRefP oldFirstRef = subEditElementHandle.GetElementRef(); StatusInt append = DependencyManagerLinkage::AppendLinkage(subEditElementHandle, depLinkage, 0); if (append != SUCCESS) { return; } if (SUCCESS == subEditElementHandle.ReplaceInModel(oldFirstRef)) { wprintf(L"AppendLinkage success"); } } wprintf(L"AppendLinkage false"); return;
我仔细看了一下帮助文档,你对InitLinkage函数的第三个参数的传递似乎是有问题的。它需要是DEPENDENCY_DATA_TYPE_ELEM_ID
你现在给出了2222这个值,系统中是没有定义的。
另外,你对appId的类型声明也是错误的,应该是UShort(unsigned short)而不是unsigned int。
SDK中带的例子对第三个参数给了DEPENDENCYAPPID_SDKSamples,而DEPENDENCYAPPID_SDKSamples被定义为1,恰好对应上了DEPENDENCY_DATA_TYPE_ELEM_ID_V,也是可以的。但这确实误导了读者,估计写实例代码的是一个小白,对该函数的理解也不到位。
Answer Verified By: 刘 呈斌
好的,谢谢。符老师,我再试试
您好 刘工
请问您 这个最后是怎么解决的? 我也遇见这样的问题了... AppendLinkage写不进去 报错