#pragma once #include "aecdbentitybase.h" #include "AecDbObjXDataMap.h" #include "define_class_xdata_key.h" #ifdef EARTHWORM_EXPORT #define DLLIMPEXP __declspec(dllexport) #else #define DLLIMPEXP __declspec(dllimport) #endif class DLLIMPEXP AecDbDimScaleZone: public AecDbEntityBase { public: ACRX_DECLARE_MEMBERS(AecDbDimScaleZone); public: static double ConvertLengthUnits(const double &d , const AcDb::UnitsValue &from , const AcDb::UnitsValue &to); protected: static Adesk::UInt32 kCurrentVersionNumber; public: AecDbDimScaleZone(void); ~AecDbDimScaleZone(void); public: virtual Acad::ErrorStatus subErase(Adesk::Boolean erasing); virtual Acad::ErrorStatus copyFrom(const AcRxObject *pSrc); virtual void subList() const; virtual Acad::ErrorStatus subTransformBy(const AcGeMatrix3d &xform); virtual Acad::ErrorStatus subGetGripPoints(AcGePoint3dArray &gripPoints, AcDbIntArray &osnapModes, AcDbIntArray &geomIds) const; virtual Acad::ErrorStatus subGetGripPoints(AcDbGripDataPtrArray &grips, const double curViewUnitSize, const int gripSize, const AcGeVector3d &curViewDir, const int bitflags) const; virtual Acad::ErrorStatus subMoveGripPointsAt(const AcDbIntArray& indices , const AcGeVector3d& offset); virtual Acad::ErrorStatus dwgInFields(AcDbDwgFiler *pFiler); virtual Acad::ErrorStatus dwgOutFields(AcDbDwgFiler *pFiler) const; virtual Acad::ErrorStatus dxfInFields(AcDbDxfFiler *pFiler) { return Acad::eNotImplementedYet; } virtual Acad::ErrorStatus dxfOutFields(AcDbDxfFiler *pFiler) const { return Acad::eNotImplementedYet; } Acad::ErrorStatus subGetOsnapPoints(AcDb::OsnapMode osnapMode, INT_PTR gsSelectionMark, const AcGePoint3d &pickPoint, const AcGePoint3d &lastPoint, const AcGeMatrix3d &viewXform, AcGePoint3dArray &snapPoints, AcDbIntArray &geomIds) const; public: virtual Acad::ErrorStatus Draw2d(AcGiDraw &dc) const; virtual Acad::ErrorStatus Draw3d(AcGiDraw &dc) const; virtual AecDbObjXDataMap *GetSpecialtyData(AcDb::OpenMode bMode = AcDb::kForWrite); virtual const AecDbObjXDataMap *GetSpecialtyData() const; double GetScale() const; // 点是否在区域内,不包含点在边上的情况 bool PointInZone(const AcGePoint3d &pt) const; // 矩形是否在区域内,不包含重合情况 bool RectInZone(const AecDbDimScaleZone &zone) const; bool RectInZone(const AcGePoint3d &ptTL , const AcGePoint3d &ptTR , const AcGePoint3d &ptBL , const AcGePoint3d &ptBR) const; // 是否区域重合 bool SameScope(const AecDbDimScaleZone &zone) const; bool SameScope(const AcGePoint3d &ptTL , const AcGePoint3d &ptTR , const AcGePoint3d &ptBL , const AcGePoint3d &ptBR) const; // 区域面积 double GetArea() const; public: DEF_XDATA_KEY_FUN(TopLeftPoint, AcGePoint3d, _ptTL_); DEF_XDATA_KEY_FUN(TopRightPoint, AcGePoint3d, _ptTR_); DEF_XDATA_KEY_FUN(BottomLeftPoint, AcGePoint3d, _ptBL_); DEF_XDATA_KEY_FUN(BottomRightPoint, AcGePoint3d, _ptBR_); DEF_XDATA_KEY_FUN(Denominator, int, _Denominator_); DEF_XDATA_KEY_FUN(Numerator, int, _Numerator_); DEF_XDATA_KEY_FUN(DrawUnits, int, _drawunits_); DEF_XDATA_KEY_FUN(DimUnits, int, _dimunits_); private: AecDbObjXDataMap m_mapSpecXData; }; class DLLIMPEXP XDimScaleZoneJig: public AcEdJig { public: XDimScaleZoneJig(void); virtual ~XDimScaleZoneJig(void); AcEdJig::DragStatus DoIt(); public: virtual AcEdJig::DragStatus sampler(); virtual AcDbEntity *entity() const; virtual Adesk::Boolean update(); public: AcGePoint3d m_ptTL, m_ptBR, m_ptBL, m_ptTR; AcDbPolyline *m_pPolyline; };