193 lines
4.5 KiB
C++
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;
|
|
} |