Mstn中的Group功能


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