#include "stdafx.h" #include "GrPolyhedronGeometry.h" #pragma region brep-include #include "acutads.h" #include "acedads.h" #include "string.h" #include "adscodes.h" #include "brent.h" #include "brbrep.h" #include "dbmain.h" #include "geextc3d.h" #include "brface.h" #include "brvtx.h" #include "dbents.h" #include "geassign.h" #include "geextc2d.h" #include "gexbndsf.h" #include "aced.h" #include "acestext.h" #include "actrans.h" #include "adeskabb.h" #include "brbctrav.h" #include "brbvtrav.h" #include "bredge.h" #include "brfltrav.h" #include "brgbl.h" #include "brletrav.h" #include "brlvtrav.h" #include "dbsol3d.h" #include "dbsymtb.h" #include "gelnsg3d.h" #include "gemat3d.h" #include "genurb3d.h" #include "genurbsf.h" #include "geray3d.h" #include "ol_errno.h" #include "adesk.h" #include "adslib.h" #include "brbetrav.h" #include "brbftrav.h" #include "brbstrav.h" #include "brcstrav.h" #include "brelem2d.h" #include "breltrav.h" #include "brentrav.h" #include "brhit.h" #include "brloop.h" #include "brmetrav.h" #include "brprops.h" #include "brm2dctl.h" #include "brmesh2d.h" #include "brnode.h" #pragma endregion AECDLLIMPEXP bool GrPolyhedronGeometry::PolyhedronGeometry(AcDb3dSolid *p3DSolid, CString &sVertices, CString &sIndices) { CString sPt, sInd; AcDbExtents ext; p3DSolid->getGeomExtents(ext); double length = ext.minPoint().distanceTo(ext.maxPoint()); AcBrBrep brp; AcBr::ErrorStatus ebr; ebr = brp.set(*p3DSolid); if (ebr != AcBr::eOk) { acutPrintf(_T("\nerror br.set(*p3DSolid) = %d"), ebr); return false; } AcBrMesh2dControl mc; // mc.setMaxNodeSpacing( length / 100.0); // mc.setMaxSubdivisions(100000); mc.setDistTol(length / 100.0); mc.setElementShape(AcBr::kAllTriangles); AcBrMesh2dFilter mf; const AcBrEntity *meshEnt = (AcBrEntity *)&brp; mf.insert(make_pair(meshEnt, mc)); AcBrMesh2d brepMesh; if ((ebr = brepMesh.generate(mf)) != AcBr::eOk) { acutPrintf(_T("\nerror AcBrMesh2d::generate %d"), ebr); return false; } int v0 = 0, v1 = 0, v2 = 0, v3 = 0; int iter = 0; AcGePoint3dArray vertexLookup; vertexLookup.setPhysicalLength(10000); vertexLookup.append(AcGePoint3d::kOrigin); AcBrMesh2dElement2dTraverser meshElemTrav; for (ebr = meshElemTrav.setMesh(brepMesh); !meshElemTrav.done(); ebr = meshElemTrav.next()) { if (ebr != AcBr::eOk) return false; AcBrElement2d e; ebr = meshElemTrav.getElement(e); AcBrElement2dNodeTraverser elemNodeTrav; for (ebr = elemNodeTrav.setElement(e); !elemNodeTrav.done(); elemNodeTrav.next()) { AcBrNode brn; ebr = elemNodeTrav.getNode(brn); AcGePoint3d p; brn.getPoint(p); if (!vertexLookup.contains(p)) { AcDbObjectPointer pMeshVert; pMeshVert.create(); pMeshVert->setPosition(p); sPt.Format(_T("%.3f,%.3f,%.3f,"), p.x, p.y, p.z); sVertices += sPt; vertexLookup.append(p); } } } sVertices.TrimRight(_T(',')); for (ebr = meshElemTrav.setMesh(brepMesh); !meshElemTrav.done(); ebr = meshElemTrav.next()) { if (ebr != AcBr::eOk) return false; AcBrElement2d e; ebr = meshElemTrav.getElement(e); AcBrElement2dNodeTraverser elemNodeTrav; AcGePoint3dArray pts; for (ebr = elemNodeTrav.setElement(e); !elemNodeTrav.done(); ebr = elemNodeTrav.next()) { if (ebr != AcBr::eOk) return false; AcBrNode brn; ebr = elemNodeTrav.getNode(brn); AcGePoint3d p; brn.getPoint(p); pts.append(p); } v0 = v1 = v2 = v3 = 0; vertexLookup.find(pts[0], v0); vertexLookup.find(pts[1], v1); vertexLookup.find(pts[2], v2); if (pts.length() == 4) { vertexLookup.find(pts[3], v3); sInd.Format(_T("%d,%d,%d,"), v0, v1, v2); sIndices += sInd; sInd.Format(_T("%d,%d,%d,"), v0, v2, v3); sIndices += sInd; } else { sInd.Format(_T("%d,%d,%d,"), v0, v1, v2); sIndices += sInd; } } sIndices.TrimRight(_T(',')); return true; } AECDLLIMPEXP bool GrPolyhedronGeometry::PolyhedronGeometry(AcDbSubDMesh *pSubMesh, CString &sVertices, CString &sIndices) { AcGePoint3dArray vertexArray; AcArray faceArray; vertexArray.removeAll(); faceArray.removeAll(); pSubMesh->getVertices(vertexArray); pSubMesh->getFaceArray(faceArray); CString sPt, sInd; sVertices = _T(""); sIndices = _T(""); for (int ii = 0; ii < vertexArray.length(); ii++) { sPt.Format(_T("%.3f,%.3f,%.3f,"), vertexArray.at(ii).x, vertexArray.at(ii).y, vertexArray.at(ii).z); sVertices += sPt; } sVertices.TrimRight(_T(',')); for (int jj = 0; jj < faceArray.length(); jj++) { sInd.Format(_T("%d,"), faceArray.at(jj)); sIndices += sInd; } sIndices.TrimRight(_T(',')); return true; }