读取和修改元素的属性


针对ABD中的元素,从软件界面中可以看到属性对话框,有很丰富的属性信息。

这里面的DataGroup Data, 就是我们这要介绍的。通过事先定义好的Schema,开发者和用户可以很方便的管理建筑元素的信息。那么如果读取和修改这个信息呢?下面来介绍相应的API。

DataGroup C++ API

详细的文档可以参考SDK中的AECOsimBuildingDesignerAPI.chm。 相应的头文件已经在include\tfapi目录下。需要连接的库有CatalogCollectionHelpers.lib和CatalogInstanceCollection.lib。 在示例目录下,有一个相应的例子,DGExamples, 这里的介绍就是针对这个例子的代码。

所谓的DataGroup,就是附加在建筑元素上的xml数据段,可以简单的这样理解DataGroup和建筑元素的关系。那么这个API中首先提供了一个BuildingEditElemHandle,这个代表一个建筑元素。下面的代码演示了如何在DataButton函数中构造一个BuildingEditElemHandle

bool   AddTool::_OnDataButton (DgnButtonEventCR ev)
    {
    HitPathCP           path = _DoLocate(ev, true, Bentley::DgnPlatform::ComponentMode::Innermost);
    if (NULL == path)
        return false;

    ElementRefP          elemRef  = mdlDisplayPath_getElem ((DisplayPathP) path, 0);
    DgnModelRefP        modelRef = mdlDisplayPath_getPathRoot ((DisplayPathP) path);
    if (NULL == elemRef || NULL == modelRef)
        return false;

    Bentley::Building::Elements::BuildingEditElemHandle beeh (elemRef, modelRef);
    
    }

有了这个handle之后,我们就可以获取DataGroup数据了。代码如下

    CCatalogSchemaItemT*    pSchemaItem = NULL;
    if (NULL != (pSchemaItem = beeh.GetCatalogCollection ().FindDataGroupSchemaItem (L"ArchDoor/ParaDef/@type")))
        {
        if (pSchemaItem->GetValue ().empty ())
            pSchemaItem->SetValue (L"PAZ");// to comply with ArchDoor schema: PAZ or BXF or RFA
        }

GetCatalogCollection 函数获得DataGroup数据组。

FindDataGroupSchemaItem 获得属性的值。这里需要注意这个函数的参数。属性的名字是个字符串,例如:"ArchDoor/ParaDef/@type",这个字符串代表某个事先定义好的属性的名字,这个名字和属性对话框里显示的是不一样的。具体可以看Catalog Editor 对话框。

GetValue/SetValue 函数读取或者设定值。

从文档中,可以看到还有其他的函数,可以列举所有的属性等功能。

DataGroup C和.NET API

主要是tfcdoc.chm中的“Catalog Functions” 部分介绍的API。这部分的API可以列举DataGroup属性,并且读取和改变相应的值。

MSElementDescrP  pDescr;

TFCatalogItemList* pCatalogItemList = mdlTFCatalogItemList_construct ();

if (SUCCESS != mdlTFCatalogItem_initFromElementDescr (mdlTFCatalogItemList_getCatalogItem (pCatalogItemList), pDescr))
    return;

mdlTFCatalogItem_getArchDoorParaDeftypeValueString (mdlTFCatalogItemList_getCatalogItem (pCatalogItemList), strValue)

TFCatalogItemList_free (&pCatalogItemList);

几何属性的读取

上面介绍的都是DataGroup属性,是附加在建筑元素上的数据流。而建筑元素本身的集合属性,例如体积等,还是需要从Form有关的API中读取。详细可以参考SDK中的例子

具体如何调用可以参考例子。每个函数的使用说明可以参考tfcdoc.chm。