附图是一个智能实体,由不连接的4个lump组成。请教老师:
(1)如何用 mdlSolid_bodyData 和 mdlSolid_lumpData函数分离body中的lump?
(2)分离出的lump是否可以直接用 mdlSolid_bodyToElement 转换成元素描述符?还是需要lump先转换成body后再转换?
我用下面代码测试了一下没有成功,后来只好用 mdlSolid_booleanDisjoint 布尔运算函数来得到多个分开的body,非常感谢。
bool getSheetOrSolidBody(BODY_TAG* pBody, Transform& bodyTransform, EditElementHandleCR elemHandle) { if (nullptr == pBody || !elemHandle.IsValid()) return false; MSElementDescrCP edP = elemHandle.GetElementDescrCP(); if (SUCCESS != mdlSolid_elementToBody(pBody, &bodyTransform, const_cast<MSElementDescrP>(edP), ACTIVEMODEL, 1L)) { return false; } if (NULL == pBody) return false; if (!mdlSolid_isSolidBody(*pBody) && !mdlSolid_isSheetBody(*pBody)) { mdlSolid_deleteEntity(*pBody); return false; } return true; } bool doubleClickCallbackFunc(DisplayPathCP path) { BODY_TAG pBody; Transform bodyTransform; EditElementHandle eeh(path->GetHeadElem(), path->GetRoot()); if (!getSheetOrSolidBody(&pBody, bodyTransform, eeh)) return false; int lumpCount = 0; LUMP_TAG lump; mdlSolid_bodyData(nullptr, &lump, nullptr, pBody); while(lump) { LUMP_TAG next; lumpCount++; mdlSolid_lumpData(nullptr, &next, lump); lump = next; } mdlDialog_dmsgsPrint(WPrintfString(L"lump Count: %d", lumpCount)); return false; } extern "C" DLLEXPORT void MdlMain (int argc, WCharCP argv[]) { LocateCallback::SetElementDoubleClickFunction(doubleClickCallbackFunc); }
可否提供一下您测试用的DGN文件?
附件里面生成了一个带lump的智能实体。
4530.lump.dgn
我搜索了一下论坛,在英文论坛以前的一个老帖子中,Brien Bastings 对mdlKISolid_lumpData 的回复有这么一句话:
You must be the first person to try to use mdlKISolid_lumpData and mdlKISolid_shellData to get this information. mdlKISolid_lumpData never returns the next lump and mdlKISolid_shellData never returns the next shell, they both just initializes it to NULL.
贴子地址是:
communities.bentley.com/.../273046
似乎是说mdlKISolid_lumpData这个函数取得的next lump永远是0? 换句话说这个mdlKISolid_lumpData函数不起作用吗?
我昨晚给老大Brien写邮件问了这个问题,他也说不要管Lump这个概念了。直接用SolidUtil::DisjoinBody就能将这种情况分成单独的三个Solid。MS的SDK有时候公开了太多底层的我们不常用的东西,反而会导致混乱。
我用ParaSolid Workshop.NET工具分析这个模型,得到如下图所示的分析结果:
Answer Verified By: 管华明
好的。您给的这个SolidUtil::DisjoinBody更简单好用,谢谢。