如题,
无法使用ABD系统的工具,请问怎么解决啊?
请问您的工具是如何放置的?都调用了哪些ABD API函数?
m_cell = mdlTFAdfCellList_constructFromAdxFile3(pPazFile); TFAdfCell *pCell = mdlTFAdfCellList_getAdfCell(m_cell); mdlTFAdfCell_setModelRef(pCell, m_model); mdlTFAdfCell_initScaleAdf2UOR(pCell); mdlTFAdfCell_synchronize(pCell); mdlTFModelRef_saveAdfCell(m_model, pCell) //然后设置数据组
关键代码如上所示,放置之后无法使用ABD系统的门窗工具,之后发现用ABD的门窗工具放置的模型的Linkage属性个数比我的要多1个,不知道是不是这个不同
观察正确,就是因为直接放置这种cell,缺少DataGroup,ABD不能识别为组件。
正确流程应该是,建立DataGroup item,自定义组件,在门窗哪一类别中增加一个item,这个过程不需要写代码,参考帮助文件进行workspace的配置即可。但是用户使用你的组件,也要带这个配置。
然后通过调用一下一些函数来放置这个组件:
1 mdlTFCatalog_getCatalogItemByNames,通过名字得到catalogitem,也就是你自定义的那个组件的定义。
2 mdlTFLoadable_initFromCatalogItem,通过catalog item, 得到一个Loadable对象。
3 mdlTFLoadable_getElmDscr, 使用这个函数得到对应的element descr
4 mdlElmdscr_add, 将上一步得到的element加入到文件中。
以上是简单的流程,Loadable系列的函数封装了DataGroup的操作。
我是在添加到DGN后,再用BuildingElemHandle写入DataGroup的。更可能原因是ABD自身工具放置时添加了额外的东西,这个我就不知道了
Answer Verified By: yl fan
已能够使用ABD的门窗功能
可否分享您的最终解决方案?一开始不能使用ABD门窗功能的原因是什么?
其实也很简单,试错的结果。
经比对,发现ABD系统放置的门窗会多一个链接属性,把这个添加到我的门窗上面就可以了。
代码如下:
1.定义资源结构头文件 DoorHandleCopy.h typedef struct doorhandlecopy { char data[74]; } AbdDoorHandleCopy; #define RSCID_AbdDoorHandleCopy 2 2.发布 DoorHandleCopy.mt #include "DoorHandleCopy.h" publishStructures(doorhandlecopy); createDataDef(doorhandlecopy, RSCID_AbdDoorHandleCopy); 3.代码实现 int toBinData(char hex) { return hex >= 'A' ? hex - 'A' + 10: hex - '0'; } vector<char> FromHexData(const string &hexData) { vector<char> binData; for (size_t i = 0; i < hexData.size(); i+=4) { char low; char high; low = toBinData(hexData[i+3]); low += toBinData(hexData[i+2]) << 4; high = toBinData(hexData[i+1]); high += toBinData(hexData[i]) << 4; binData.push_back(low); binData.push_back(high); } return binData; } typedef void* LinkageData_t; bool AddLinkage(MSElementDescrH edP, UInt16 primaryID, Int32 ddbID, const LinkageData_t data) { if (!edP || !*edP) { return false; } LinkageHeader linkHdr; memset(&linkHdr, 0, sizeof(LinkageHeader)); linkHdr.primaryID = primaryID; linkHdr.user = 1; if (SUCCESS == mdlLinkage_appendUsingDescr(edP, &linkHdr, data, ddbID, NULL, FALSE)) { UInt32 filePos = elementRef_getFilePos((*edP)->h.elementRef); mdlElmdscr_rewrite(*edP, NULL, filePos); return true; } else { return false; } } void AddABDDoorHandle(MSElementDescrH edP) { // 复制自ABD的与门功能关联的链接数据 string hexData = "0001000000480000004000000001000000010000003400000001000000010000002800000001000000010000001C00000001000000140000000100000001000000080000000100000200"; vector<char> data = FromHexData(hexData); UInt16 primaryID = 0xBE6F; UInt32 ddbID = RSCID_AbdDoorHandleCopy; AddLinkage(edP, primaryID, ddbID, (void*)&data[0]); }
哈哈,有点像在做一个Hacker。不过很佩服您这种探索精神!