Files
envi-code/SourceCode/Code2026/AecRxBase/GrPolyhedronGeometry.cpp
T
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

193 lines
4.5 KiB
C++

#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<AcDbPolyFaceMeshVertex> 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<Adesk::Int32> 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;
}