Files

343 lines
9.1 KiB
C++
Raw Permalink Normal View History

2026-10-04 00:04:20 +08:00
#include "stdafx.h"
2026-09-28 15:28:50 +08:00
#include "gecsint.h"
#include "brbrep.h"
#include "brbftrav.h"
#include "brfltrav.h"
#include "brloop.h"
#include "brface.h"
#include "bredge.h"
#include "brletrav.h"
#include "brmesh.h"
#include "brm2dctl.h"
#include "brmesh2d.h"
#include "brmetrav.h"
#include "brentrav.h"
#include "brnode.h"
#include "breptools.h"
#include "brhit.h"
const double kPi = 3.14159265358979323846;
const double kTwoPi = 6.28318530717958647692;
const double kHalfPi = 1.57079632679489661923;
const double kRad2Deg = 57.295779513082323;
const double kDeg2Rad = 0.0174563292519943295;
#define __TRANS_ENTIEY_ID_(id) case id: return #id
namespace
{
CString transEntityId(AcGe::EntityId &type)
{
switch (type)
{
__TRANS_ENTIEY_ID_(kEntity2d);
__TRANS_ENTIEY_ID_(kEntity3d);
__TRANS_ENTIEY_ID_(kPointEnt2d);
__TRANS_ENTIEY_ID_(kPointEnt3d);
__TRANS_ENTIEY_ID_(kPosition2d);
__TRANS_ENTIEY_ID_(kPosition3d);
__TRANS_ENTIEY_ID_(kPointOnCurve2d);
__TRANS_ENTIEY_ID_(kPointOnCurve3d);
__TRANS_ENTIEY_ID_(kPointOnSurface);
__TRANS_ENTIEY_ID_(kBoundedPlane);
__TRANS_ENTIEY_ID_(kCircArc2d);
__TRANS_ENTIEY_ID_(kCircArc3d);
__TRANS_ENTIEY_ID_(kConic2d);
__TRANS_ENTIEY_ID_(kConic3d);
__TRANS_ENTIEY_ID_(kCurve2d);
__TRANS_ENTIEY_ID_(kCurve3d);
__TRANS_ENTIEY_ID_(kEllipArc2d);
__TRANS_ENTIEY_ID_(kEllipArc3d);
__TRANS_ENTIEY_ID_(kLine2d);
__TRANS_ENTIEY_ID_(kLine3d);
__TRANS_ENTIEY_ID_(kLinearEnt2d);
__TRANS_ENTIEY_ID_(kLinearEnt3d);
__TRANS_ENTIEY_ID_(kLineSeg2d);
__TRANS_ENTIEY_ID_(kLineSeg3d);
__TRANS_ENTIEY_ID_(kPlanarEnt);
__TRANS_ENTIEY_ID_(kPlane);
__TRANS_ENTIEY_ID_(kRay2d);
__TRANS_ENTIEY_ID_(kRay3d);
__TRANS_ENTIEY_ID_(kSurface);
__TRANS_ENTIEY_ID_(kSphere);
__TRANS_ENTIEY_ID_(kCylinder);
__TRANS_ENTIEY_ID_(kTorus);
__TRANS_ENTIEY_ID_(kCone);
__TRANS_ENTIEY_ID_(kSplineEnt2d);
__TRANS_ENTIEY_ID_(kPolyline2d);
__TRANS_ENTIEY_ID_(kAugPolyline2d);
__TRANS_ENTIEY_ID_(kNurbCurve2d);
__TRANS_ENTIEY_ID_(kDSpline2d);
__TRANS_ENTIEY_ID_(kCubicSplineCurve2d);
__TRANS_ENTIEY_ID_(kSplineEnt3d);
__TRANS_ENTIEY_ID_(kPolyline3d);
__TRANS_ENTIEY_ID_(kAugPolyline3d);
__TRANS_ENTIEY_ID_(kNurbCurve3d);
__TRANS_ENTIEY_ID_(kDSpline3d);
__TRANS_ENTIEY_ID_(kCubicSplineCurve3d);
__TRANS_ENTIEY_ID_(kTrimmedCrv2d);
__TRANS_ENTIEY_ID_(kCompositeCrv2d);
__TRANS_ENTIEY_ID_(kCompositeCrv3d);
__TRANS_ENTIEY_ID_(kExternalSurface);
__TRANS_ENTIEY_ID_(kNurbSurface);
__TRANS_ENTIEY_ID_(kTrimmedSurface);
__TRANS_ENTIEY_ID_(kOffsetSurface);
__TRANS_ENTIEY_ID_(kEnvelope2d);
__TRANS_ENTIEY_ID_(kCurveBoundedSurface);
__TRANS_ENTIEY_ID_(kExternalCurve3d);
__TRANS_ENTIEY_ID_(kExternalCurve2d);
__TRANS_ENTIEY_ID_(kSurfaceCurve2dTo3d);
__TRANS_ENTIEY_ID_(kSurfaceCurve3dTo2d);
__TRANS_ENTIEY_ID_(kExternalBoundedSurface);
__TRANS_ENTIEY_ID_(kCurveCurveInt2d);
__TRANS_ENTIEY_ID_(kCurveCurveInt3d);
__TRANS_ENTIEY_ID_(kBoundBlock2d);
__TRANS_ENTIEY_ID_(kBoundBlock3d);
__TRANS_ENTIEY_ID_(kOffsetCurve2d);
__TRANS_ENTIEY_ID_(kOffsetCurve3d);
__TRANS_ENTIEY_ID_(kPolynomCurve3d);
__TRANS_ENTIEY_ID_(kBezierCurve3d);
__TRANS_ENTIEY_ID_(kObject);
__TRANS_ENTIEY_ID_(kFitData3d);
__TRANS_ENTIEY_ID_(kHatch);
__TRANS_ENTIEY_ID_(kTrimmedCurve2d);
__TRANS_ENTIEY_ID_(kTrimmedCurve3d);
__TRANS_ENTIEY_ID_(kCurveSampleData);
__TRANS_ENTIEY_ID_(kEllipCone);
__TRANS_ENTIEY_ID_(kEllipCylinder);
__TRANS_ENTIEY_ID_(kIntervalBoundBlock);
__TRANS_ENTIEY_ID_(kClipBoundary2d);
__TRANS_ENTIEY_ID_(kExternalObject);
__TRANS_ENTIEY_ID_(kCurveSurfaceInt);
__TRANS_ENTIEY_ID_(kSurfaceSurfaceInt);
__TRANS_ENTIEY_ID_(kHelix);
default:
break;
}
return _T("");
}
CString transLoopType(AcBr::LoopType &type)
{
switch (type)
{
__TRANS_ENTIEY_ID_(AcBr::kLoopUnclassified);
__TRANS_ENTIEY_ID_(AcBr::kLoopExterior);
__TRANS_ENTIEY_ID_(AcBr::kLoopInterior);
__TRANS_ENTIEY_ID_(AcBr::kLoopWinding);
default:
break;
}
return _T("");
}
CString transAcBrError(AcBr::ErrorStatus er)
{
switch (er)
{
__TRANS_ENTIEY_ID_(AcBr::eOk);
__TRANS_ENTIEY_ID_(AcBr::eNotImplementedYet);
__TRANS_ENTIEY_ID_(AcBr::eNotApplicable);
__TRANS_ENTIEY_ID_(AcBr::eInvalidInput);
__TRANS_ENTIEY_ID_(AcBr::eOutOfMemory);
__TRANS_ENTIEY_ID_(Acad::eUnrecoverableErrors);
__TRANS_ENTIEY_ID_(AcBr::eWrongObjectType);
__TRANS_ENTIEY_ID_(AcBr::eWrongSubentityType);
__TRANS_ENTIEY_ID_(AcBr::eNullObjectId);
__TRANS_ENTIEY_ID_(AcBr::eNullSubentityId);
__TRANS_ENTIEY_ID_(Acad::eWrongDatabase);
__TRANS_ENTIEY_ID_(AcBr::eMissingGeometry);
__TRANS_ENTIEY_ID_(AcBr::eMissingSubentity);
__TRANS_ENTIEY_ID_(Acad::eAmbiguousOutput);
__TRANS_ENTIEY_ID_(AcBr::eBrepChanged);
__TRANS_ENTIEY_ID_(AcBr::eUnsuitableTopology);
__TRANS_ENTIEY_ID_(AcBr::eDegenerateTopology);
__TRANS_ENTIEY_ID_(AcBr::eUninitialisedObject);
default:
break;
}
return _T("");
}
bool intersectWidth(AcBrEntity &brepEnt
, const AcGeLinearEnt3d &line
, AcGePoint3dArray &ar)
{
Adesk::UInt32 numHitsFound = 0;
AcBrHit *hits = NULL;
AcGePoint3d pt;
if (brepEnt.getLineContainment(line, 0, numHitsFound, hits) == AcBr::eOk)
{
for (int i(0); i < numHitsFound; ++i)
{
AcBrEntity *entityAssociated = NULL;
if (hits[i].getEntityAssociated(entityAssociated) == AcBr::eOk)
{
if (brepEnt.isEqualTo(entityAssociated))
{
if (hits[i].getPoint(pt) == AcBr::eOk)
ar.append(pt);
}
}
}
}
delete[] hits;
return numHitsFound != 0;
}
}
bool BrepTools::intersectWith_by_whole(AcDb3dSolid *pSolid
, const AcGeLinearEnt3d &line
, AcGePoint3dArray &ar)
{
AcBrBrep brepEntity;
if (brepEntity.set((const AcDbEntity &)*pSolid) != AcBr::eOk) return false;
return ::intersectWidth(brepEntity, line, ar);
}
bool BrepTools::intersectWith_by_loop_face(AcDb3dSolid *pSolid
, const AcGeLinearEnt3d &line
, AcGePoint3dArray &ar)
{
AcBrBrep brepEntity;
if (brepEntity.set((const AcDbEntity &)*pSolid) != AcBr::eOk) return false;
AcBr::ErrorStatus returnValue = AcBr::eOk;
AcBrBrepFaceTraverser brepFaceTrav;
AcBrFace brepFace;
while (!brepFaceTrav.done() && (returnValue == AcBr::eOk))
{
returnValue = brepFaceTrav.getFace(brepFace);
if (returnValue != AcBr::eOk) return false;
intersectWidth(brepFace, line, ar);
returnValue = brepFaceTrav.next();
if (returnValue != AcBr::eOk) return false;
}
return !ar.isEmpty();
}
bool BrepTools::relationWith(const AcDbRegion *pReg
, const AcGePoint3d &pt
, AcGe::PointContainment &iResult)
{
AcBrBrep brepEntity;
AcBrEntity *pBrepResult(NULL);
if (brepEntity.set((const AcDbEntity &)*pReg) != AcBr::eOk) return false;
if (!brepEntity.getPointContainment(pt, iResult, pBrepResult) == Acad::eOk) return false;
if (pBrepResult != NULL)
{
delete pBrepResult;
pBrepResult = NULL;
}
return true;
}
void BrepTools::init()
{
int a = 0;
return;
}
void BrepTools::listInfo3dSolid(const AcDb3dSolid *pSolid)
{
AcBrBrep brep;
if (brep.set((const AcDbEntity &)*pSolid) != AcBr::eOk) return;
AcBrBrepFaceTraverser bft;
AcBrFaceLoopTraverser bflt;
AcBrLoopEdgeTraverser bet;
AcBr::ErrorStatus bs = bft.setBrep(brep);
if (bs != AcBr::eOk) return;
AcGe::EntityId type;
AcBrFace bf;
AcBr::ErrorStatus es;
for (int f(0); !bft.done(); bft.next(), ++f)
{
if ((es = bft.getFace(bf)) != Acad::eOk)
{
acutPrintf(_T("\n face%d FaceTraverser getFace error: %s"), f, transAcBrError(es));
continue;
}
if ((es = bf.getSurfaceType(type)) == AcBr::eOk)
{
acutPrintf(_T("\n face%d type: %s"), f, transEntityId(type));
}
else
{
acutPrintf(_T("\n face%d getSurfaceType error: %s"), f, transAcBrError(es));
continue;
}
if ((es = bflt.setFace(bf)) != AcBr::eOk)
{
acutPrintf(_T("\n face%d FaceLoopTraverser setFace error: %s"), f, transAcBrError(es));
continue;
}
if ((es = bet.setLoop(bflt)) != Acad::eOk)
{
acutPrintf(_T("\n face%d LoopEdgeTraverser setLoop error: %s"), f, transAcBrError(es));
continue;
}
for (int e(0); !bet.done(); bet.next(), ++e)
{
AcBrEdge edge;
if ((es = bet.getEdge(edge)) != AcBr::eOk)
{
acutPrintf(_T("\n\t edge%d getEdge error:%s"), transAcBrError(es));
continue;
}
AcBrLoop brLoop;
if ((es = bet.getLoop(brLoop)) != AcBr::eOk)
{
acutPrintf(_T("\n\t loop%d getLoop error:%s"), transAcBrError(es));
continue;
}
AcBr::LoopType ltype = AcBr::kUnclassified;
if ((es = brLoop.getType(ltype)) == AcBr::eOk)
{
acutPrintf(_T("\n\t loop%d type: %s"), e, transLoopType(ltype));
}
else
{
acutPrintf(_T("\n\t loop%d get loop type: %s"), e, transAcBrError(es));
continue;
}
if ((es = edge.getCurveType(type)) == AcBr::eOk)
{
acutPrintf(_T("\n\t edge%d curve type: %s"), e, transEntityId(type));
}
else
{
acutPrintf(_T("\n\t edge%d get edge curve type: %s"), e, transAcBrError(es));
continue;
}
}
}
}
void BrepTools::intersectSolid(const AcDb3dSolid *pSolid
, const AcGeLinearEnt3d &line
, AcGePoint3dArray &ar)
{
AcBrBrep brep;
AcBr::ErrorStatus es;
if ((es = brep.set(*pSolid)) != AcBr::eOk)
{
acutPrintf(_T("\n brep set error:%s"), transAcBrError(es));
return;
}
intersectWidth(brep, line, ar);
}