老师:我获取当前文件中显示元素这是我的测试例子
void allel(WCharCP name){ int i = 0; DgnModelRefP pActiveModel = ISessionMgr::GetManager().GetActiveDgnModelRefP(); ReachableElementOptionsPtr option = ReachableElementOptions::CreateOptions(); ReachableElementCollection elemsColOfModel = pActiveModel->GetReachableElements(option.get()); for each(ElementHandle eh in elemsColOfModel) { //是否为可视 if (eh.GetElementType() == CELL_HEADER_ELM && eh.IsValid()) { Transform tf = getElementAttachmentTransform(eh); MSElementDescr* pEd = (MSElementDescr*)eh.GetElementDescrCP(); ElementRefP eleref = pEd->h.elementRef; //将elementref 加入element ref if (eleref->GetElementType() != 106) { i++; printf("%d\n", eleref->GetElementId()); } } } printf("%d\n", i); DgnModelPtr dgnModelPtr = ISessionMgr::GetActiveDgnModelP(); dgnModelPtr->GetDgnAttachmentsP(); if (NULL != dgnModelPtr->GetDgnAttachmentsP()) { for each (DgnAttachmentP attachment in *dgnModelPtr->GetDgnAttachmentsP()) { if ((attachment->IsDisplayed())) { attachment->SetIsDisplayed(false); } attachment->Rewrite(false, false); } }}
第一次运行是能获取到显示的参考模型中的元素,当我按ctrl+Z 撤回时,在运行会获取所有参考文件中元素(包含未显示的参考模型中的元素)
直接用ACTIVEMODEL->GetReachableElements就可以,包括参考文件中的。
是的 ,但是 ,我执行之后按ctrl+z 撤回之后再次执行还是一样的结果,会获取到所有参考元素(不管是在活动模型中显示的还是未显示的都会获取到),第一次没有问题.按ctrl_+ Z 之后存在问题
void allel(WCharCP name){ bvector<ElementRefP> vec_ref; vec_ref.clear(); ReachableElementCollection elemsColOfModel = ACTIVEMODEL->GetReachableElements(); for each(ElementHandle eh in elemsColOfModel) { if (eh.GetElementType() == CELL_HEADER_ELM && eh.IsValid()) { if (mdlElement_isVisible(eh.GetElementCP())) { Transform tf = getElementAttachmentTransform(eh); MSElementDescr* pEd = (MSElementDescr*)eh.GetElementDescrCP();
ElementRefP eleref = pEd->h.elementRef; //将elementref 加入element ref if (eleref->GetElementType() != 106) { printf("%d\n", eleref->GetElementId()); vec_ref.push_back(eleref); } }
} } printf("%d\n", vec_ref.size());}
老师:我经过测试发现只有第一次是正确的,当你撤回再次执行,或者你在文件中修改参考文件的显示与隐藏之后再次执行就会有问题,就会获取到所有参考元素.请问老师这个应该怎么解决.
测试了一下确实会出现如您所说的情况,所以在获取元素时可能得加一个判断了,如果是参考中的元素要判断一下参考是否显示。另外GetReachableElements函数的参数ReachableElementOptionsP可以控制获取元素时排除掉一些非图形元素。
我在这里作了显示判断为什什么没有起作用?我在遍历的时候还可以通过元素判断是否在参考文件中这个有接口老师可以知道一下吗?
还有就是为什么第一次就是正确的了?后面是因为改变了什么内部东西吗?
eh.GetDgnModelP()->IsDgnAttachment()可以判断当前元素是否在参考中。MicroStation相对来说是个很庞大的软件,后台设计是很复杂的
Answer Verified By: chen chen