[ABD v8i c++]自己实现的一个门窗放置工具放置的门模型,无法继续使用ABD系统的功能,如改变开启扇,改变门把手,修改门窗等功能

如题,

无法使用ABD系统的工具,请问怎么解决啊?

Parents
  • 请问您的工具是如何放置的?都调用了哪些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 

Reply Children
  • 可否分享您的最终解决方案?一开始不能使用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]);
    }

    Answer Verified By: yl fan 

  • 哈哈,有点像在做一个Hacker。不过很佩服您这种探索精神!