我们在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); }