我们在Mstn的视图中选中多个图形元素时,可以通过下图所示的工具将选中的元素合并成一个Cell。
这样创建出来的Cell中的子元素的ID仍能保持合并成Cell之前的元素的ID,我们在代码中可以通过ID获取到所有子元素,然后通过调用NormalCellHeaderHandler下的创建Cell相关的成员函数,创建出来一个Cell头元素,并将从dgn文件中读取到的图形元素添加到这个新创建出来的Cell元素中。最后将创建好的Cell元素添加到dgn文件中即可。但是这样创建出来的Cell元素中的子元素跟dgn文件中的原元素是没有任何关系的,子元素的ID都是重新分配的。并且你会发现除了新创建出来的Cell元素以外,原有的用来创建Cell元素的那些图形元素都还存在。那么如果做到跟Mstn的成组工具相同的效果呢?我们需要在用dgn文件中已经存在的元素去创建Cell之前,先将这些子元素从dgn文件中删除掉,再去创建新的Cell元素,具体用法,可参考如下示例代码:
ElementAgenda selectset;
SelectionSetManager::GetManager().BuildAgenda(selectset);
if (selectset.GetCount() < 2)
{
return;
}
EditElementHandleR eeh1 = selectset[0];
EditElementHandleR eeh2 = selectset[1];
MSElement el;
MSElementDescrP groupDP;
EditElementHandle eeh;
NormalCellHeaderHandler::CreateOrphanCellElement(eeh, NULL, ACTIVEMODEL->Is3d(), *ACTIVEMODEL);
mdlElement_memcpy(&el, eeh.GetElementCP());
mdlElmdscr_new(&groupDP, NULL, &el);
eeh1.GetElementDescrP();
eeh2.GetElementDescrP();
MSElementDescrP elmDP1 = eeh1.ExtractElementDescr();
mdlElmdscr_appendDscr(groupDP, elmDP1);
MSElementDescrP elmDP2 = eeh2.ExtractElementDescr();
mdlElmdscr_appendDscr(groupDP, elmDP2);
ITxnManager::GetManager().GetCurrentTxn().DeleteElement(elmDP1->h.elementRef);
ITxnManager::GetManager().GetCurrentTxn().DeleteElement(elmDP2->h.elementRef);
if (groupDP->h.firstElem && groupDP->h.firstElem->h.next)
{
groupDP->h.isValid = false;
mdlCell_setOriginAndRange(groupDP);
if (0L != mdlElmdscr_add(groupDP))
SelectionSetManager::GetManager().AddElement(groupDP->h.elementRef, groupDP->h.dgnModelRef);
mdlElmdscr_freeAll(&groupDP);
}