符老师 C#LevelHandle.Display可以关闭当前dgn的图层 C++mdlLevel_setDisplay也可以 但我要关闭参考文件的图层 该怎么做呢(上述都不行)?求符老师指导
需要获得参考文件的模型,然后再去关闭图层:
ModelId modelId = modelItem.GetModelId(); DgnModelPtr dgnptr = s_DgnFile->LoadModelById(modelId); if (dgnptr->FillSections(DgnModelSections::Model) != SUCCESS) { return ERROR; } if (dgnptr != nullptr) { //参考模型 if (!dgnptr->IsDgnAttachment() || (dgnptr->IsDgnAttachment() && !dgnptr->AsDgnAttachmentCP()->IsMissingFile())) { //通过参考模型,关闭图层 if (SUCCESS != mdlLevel_setDisplay (dgnptr, levelId, true)) return ERROR; } }
不行 。。。 我后面还加了mdlLevelTable_rewrite函数 结果是2 不是0 看来还得怎么设置
我开始就是这样的 不行
图层的关闭问题较为复杂,分全局显示(Global Display)和视图显示(View Display)。mdlLevel_setDisplay是控制全局显示的,当全局显示被关闭后,所有视图就都不显示该层信息了。而视图显示可以控制每个视图对每个层的单独的开和关。有函数mdlView_setLevelDisplay。
现在的问题不光是本模型的层的开关,而是涉及到了参考模型的层的开关,这就更加复杂了。当我们参考一个模型进来的时候,会在当前模型中创建一个DgnAttachment这样的元素,在该元素中有控制参考模型中每个层的开关的,不必要到原参考模型中去开关。
符老师 mdlLevel_setDisplay中参数DgnModelRefP 传的就是DgnAttachment 但不靠谱 是不是还要加其他的呢
如下例子能关闭视图1中当前模型下参考的第一级参考模型中的所有的层。
void listReference(WCharCP unparsed) { DgnModelP pActiveModel = ISessionMgr::GetActiveDgnModelP(); DgnAttachmentArrayP pAttachArray = pActiveModel->GetDgnAttachmentsP(); if (NULL == pAttachArray) { mdlDialog_dmsgsPrint(L"No Attached Reference"); return; } for (DgnAttachmentP pAttach : *pAttachArray) { mdlDialog_dmsgsPrint(pAttach->GetAttachFileName().GetWCharCP()); BitMaskCP lvlMask = mdlView_getLevelDisplayMask(pAttach, 0, ViewLevelDisplayType::Normal); BitMaskP newLvlMask = mdlBitMask_clone(lvlMask); mdlBitMask_setAll(newLvlMask, FALSE); mdlView_setLevelDisplayMask(pAttach, 0, newLvlMask, TRUE); mdlBitMask_free(&newLvlMask); pAttach->Rewrite(true, true); } }
Answer Verified By: Andy
我试试符老师