#pragma once #include "KTModelLayoutXData.h" #include "entityfilter.h" #include "AcGiViewDraw.h" #ifdef EARTHWORM_EXPORT #define DLLIMPEXP __declspec(dllexport) #else #define DLLIMPEXP __declspec(dllimport) #endif #define DEF_VALUE_FUNC(func, name, type)\ static BOOL getHlr##func##_##name(type &dW);\ static void setHlr##func##_##name(const type &dW);\ static void removeHlr##func##_##name() #define DEF_CHECK_FUNC(func, name)\ static BOOL getHlr##func##_##name();\ static void setHlr##func##_##name(const BOOL &b);\ class DLLIMPEXP HlrCutOption { public: template static const AcDbVoidPtrArray* get3dBuffer(const AcDbEntity *pEnt) { T *pT = CEntityProperty::getThisClass(pEnt); if (pT) { if (!pT->Has3DBuffer()) { AcGiViewDraw dc; pT->Draw3d(dc); } return &pT->Get3DBuffer(); } return NULL; } public: static int init(); DEF_VALUE_FUNC(LW, Wall, double); DEF_VALUE_FUNC(LW, Slab, double); DEF_VALUE_FUNC(LW, Beam, double); DEF_VALUE_FUNC(LW, Column, double); DEF_VALUE_FUNC(LW, EnvCut, double); // 2025.10.29 管道+配件+阀门 变为统一线宽 DEF_VALUE_FUNC(LW, PipeSys, double); DEF_VALUE_FUNC(LW, HvacSys, double); DEF_VALUE_FUNC(LW, ElecSys, double); DEF_CHECK_FUNC(BLK, OPEN); DEF_CHECK_FUNC(BLK, FITTING); DEF_CHECK_FUNC(BLK, EQU); DEF_CHECK_FUNC(BLK, PARAEQU); DEF_CHECK_FUNC(BLK, YGDT); DEF_CHECK_FUNC(BLK, STAIR); DEF_CHECK_FUNC(STYLE2D, VALVE); DEF_CHECK_FUNC(STYLE2D, OPEN); DEF_CHECK_FUNC(STYLE2D, HOLE); DEF_CHECK_FUNC(MERGE, Wall); DEF_CHECK_FUNC(MERGE, Beam); DEF_CHECK_FUNC(MERGE, Slab); DEF_CHECK_FUNC(MERGE, Column); DEF_CHECK_FUNC(ZX, SameDir); DEF_CHECK_FUNC(ZX, Parallel); DEF_VALUE_FUNC(LW, Envelope, double); DEF_VALUE_FUNC(LY, Envelope, AcDbObjectId); DEF_VALUE_FUNC(LT, Envelope, AcDbObjectId); DEF_VALUE_FUNC(CL, Envelope, int); static bool getHlrMERGE_Envelope(); static bool isEnvelopeEntity(LPCTSTR dxf); static resbuf* getEnvelopeFilter(); static void ProcessHlrResult(const AcDbEntity *pEnt , const BOOL &bBlod , const double &dW , const BOOL &bBlock , const AcArray &ar , const std::map> &preAr , AcArray &output , const AecDbObjXDataMap *pXData = NULL); static AcDbEntity* makeBlock(const AcDbEntity *pEnt , const AcArray &output , const AecDbObjXDataMap *pXData = NULL ); // 当时水平剖切时,剖切范围除了有水平的范围之外,还有垂直范围 // 水平范围可以通过选择集自动处理,但是垂直范围,需要单独的判读 // 下面两个函数可以判断 static bool isWithinHorizSection(const AcDbEntity *pEnt ,const AcGePoint3d &ptPlnO , const AcGeVector3d &vtPlnN); static bool isWithinHorizSection(const double &dMax , const double &dMin , const AcGePoint3d &ptPlnO , const AcGeVector3d &vtPlnN); static BOOL isHlrCalc(const AcDbEntity *pEnt); static void setHlrCalc(const AcDbEntity *pEnt, const BOOL &bValue); static bool isIntersectWithSection(const AcDbEntity *pEnt); static void setIntersectWithSection(const AcDbEntity *pEnt, const AcGePlane &plnSection); static BOOL getEnvCutLW(const AcDbEntity *pEnt, double &dW); };