Message 1 of 7
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report
// 将3D实体转换为多边形网格
static void Rivilis3DSolidToPolyMesh() {
ads_name en; ads_point pt;
// 选择实体
if (acedEntSel(_T("\n选择3DSolid:"), en, pt) != RTNORM) return;
AcDbObjectId eid;
if (acdbGetObjectId(eid, en) != Acad::eOk) return;
// 打开3D实体
AcDbObjectPointer<AcDb3dSolid> p3DSolid(eid, AcDb::kForRead);
if (p3DSolid.openStatus() != Acad::eOk) {
acutPrintf(_T("\n打开实体失败!"));
return;
}
// 获取实体范围
AcDbExtents ext;
if (p3DSolid->getGeomExtents(ext) != Acad::eOk) return;
double dLength = ext.minPoint().distanceTo(ext.maxPoint());
// 创建Brep对象
AcBrBrep brp;
if (brp.set(*p3DSolid) != AcBr::eOk) {
acutPrintf(_T("\n创建Brep失败"));
return;
}
// 设置网格参数
AcBrMesh2dControl mc;
mc.setDistTol(dLength / 100.0);
mc.setElementShape(AcBr::kAllTriangles);
// 创建网格过滤器
AcBrMesh2dFilter mf;
const AcBrEntity* pMeshEnt = (AcBrEntity*)&brp;
//mf.insert(std::make_pair(pMeshEnt, mc)); // 显式使用 std::
// 生成网格
AcBrMesh2d brepMesh;
if (brepMesh.generate(mf) != AcBr::eOk) {
acutPrintf(_T("\n生成网格失败"));
return;
}
// 创建多边形网格对象
AcDbPolyFaceMesh* pMesh = new AcDbPolyFaceMesh();
pMesh->setDatabaseDefaults();
pMesh->setColorIndex(2);
// 添加到当前空间
AcDbBlockTableRecordPointer pBtr(acdbCurDwg()->currentSpaceId(), AcDb::kForWrite);
if (pBtr.openStatus() != Acad::eOk) {
delete pMesh;
return;
}
if (pBtr->appendAcDbEntity(pMesh) != Acad::eOk) {
delete pMesh;
return;
}
// 准备顶点查找表
AcGePoint3dArray arrVertexLookup;
arrVertexLookup.setPhysicalLength(10000);
arrVertexLookup.append(AcGePoint3d::kOrigin); // 占位
// 遍历网格元素
AcBrMesh2dElement2dTraverser meshElemTrav;
for (AcBr::ErrorStatus ebr = meshElemTrav.setMesh(brepMesh);
!meshElemTrav.done();
ebr = meshElemTrav.next()) {
if (ebr != AcBr::eOk) {
pMesh->erase();
return;
}
// 获取元素
AcBrElement2d elem;
if (meshElemTrav.getElement(elem) != AcBr::eOk) {
pMesh->erase();
return;
}
// 遍历节点
AcBrElement2dNodeTraverser elemNodeTrav;
for (ebr = elemNodeTrav.setElement(elem);
!elemNodeTrav.done();
ebr = elemNodeTrav.next()) {
if (ebr != AcBr::eOk) {
pMesh->erase();
return;
}
// 获取节点坐标
AcBrNode node;
if (elemNodeTrav.getNode(node) != AcBr::eOk) {
pMesh->erase();
return;
}
AcGePoint3d ptNode;
if (node.getPoint(ptNode) != AcBr::eOk) {
pMesh->erase();
return;
}
// 添加顶点
if (!arrVertexLookup.contains(ptNode)) {
AcDbPolyFaceMeshVertex* pVert = new AcDbPolyFaceMeshVertex();
pVert->setPosition(ptNode);
pMesh->appendVertex(pVert);
pVert->close();
arrVertexLookup.append(ptNode);
}
}
}
// 创建面记录
for (AcBr::ErrorStatus ebr = meshElemTrav.setMesh(brepMesh);
!meshElemTrav.done();
ebr = meshElemTrav.next()) {
if (ebr != AcBr::eOk) {
pMesh->erase();
return;
}
// 获取元素
AcBrElement2d elem;
if (meshElemTrav.getElement(elem) != AcBr::eOk) {
pMesh->erase();
return;
}
// 收集顶点
AcGePoint3dArray arrPts;
AcBrElement2dNodeTraverser elemNodeTrav;
for (ebr = elemNodeTrav.setElement(elem);
!elemNodeTrav.done();
ebr = elemNodeTrav.next()) {
if (ebr != AcBr::eOk) {
pMesh->erase();
return;
}
AcBrNode node;
if (elemNodeTrav.getNode(node) != AcBr::eOk) {
pMesh->erase();
return;
}
AcGePoint3d ptNode;
if (node.getPoint(ptNode) != AcBr::eOk) {
pMesh->erase();
return;
}
arrPts.append(ptNode);
}
// 查找顶点索引
int nV0 = 0, nV1 = 0, nV2 = 0, nV3 = 0;
arrVertexLookup.find(arrPts[0], nV0);
arrVertexLookup.find(arrPts[1], nV1);
arrVertexLookup.find(arrPts[2], nV2);
if (arrPts.length() == 4) {
arrVertexLookup.find(arrPts[3], nV3);
}
// 创建面记录
AcDbFaceRecord* pFace = new AcDbFaceRecord(nV0, nV1, nV2, nV3);
if (pMesh->appendFaceRecord(pFace) != Acad::eOk) {
delete pFace;
pMesh->erase();
return;
}
pFace->close();
}
pMesh->close();
}
Solved! Go to Solution.