#pragma once ////////////////////////////////////////////////////////////////////////////// //文件 CurveEx.h //主要功能: // //程序编写: 2005-12-07 19:50:08 ///////////////////////////////////////////////////////////////////////////// #include "DrawModel\curve.h" #include "CurveType.h" #include "rect8ex.h" #include "afxdb.h" #include "CurveMark.h" using namespace NCurveEmbellish; #define PLINE_EMBELLISH_ALL (PLINE_NODRAW|PLINE_SOLID|PLINE_CLOSE|PLINE_BEZIER|PLINE_SPLINE|PLINE_OFFSET|PLINE_TRANSPARENT|PLINE_TRANSPARENT_VALUE|PLINE_WAVE) //曲线修饰中的所有曲线类型 #define PLINE_TYPE_ALL (PLINE_W|PLINE_MIDLE|/*PLINE_VIRTUAL|*/PLINE_DESIGN|PLINE_EMBELLISH_ALL) //曲线的所有类型 struct stuCurveWave { double T; //采样周期 double A; //振幅 long dnum; //一个周期内采样点个数 }; /** * 该类仍然不能正确执行拷贝构造和拷贝赋值,因为它的基类 CCurve 没有正确实现它们 */ class AFX_EXT_CLASS CCurveEx : public CCurve { public: CCurveEx(int n); CCurveEx(void); CCurveEx(const CCurveEx& other); virtual ~CCurveEx(void); int64_t GetId() const; void SetId(int64_t id); virtual void Initial(void); virtual void Clear(void); void Serialize(CArchive& ar, const short &ver) override; virtual int Read(CFile &fr, const short& ver); virtual void Write(CFile& fw, const short& ver, double dRedundantError/*=-1.0*/); virtual void GetRange(CRect8& range,void *HowToViewCurve=NULL); virtual void GetRange(CPoint3D& minPoint, CPoint3D& maxPoint); virtual BOOL IsInRange(CRect8& range,void *HowToViewCurve=NULL); // type为校正类型,比如两点校位、四点校位等;pValue为类对象指针,如CCalibrate2、CCalibrate4等 virtual void Calibrate(int type, void* pValue); virtual void ScaleProperty(double sx, double sy); virtual void ScaleCoor(double xs, double ys, double dx, double dy); virtual void ScaleCoordinate(double sx, double sy, int mode); //mode=0:加,1:减,2:乘,3:除 virtual void WriteDML(CFile& fw, const short& ver, int nBaseTabNum); virtual int ReadDML(CFile &fr, const short &ver); virtual void WritePCG(CFile& fw, const short& ver, int nBaseTabNum); virtual int ReadPCG(CFile &fr, const short &ver); int ReadPCG2(CFile &fr, const short &ver); virtual void ExchangeXY(void); //交换XY坐标 virtual void ExchangeXY(void* pProjection); //转换到指定投影坐标,CPrljectio* pProjection virtual BOOL SetPoints(CPointList &dp, int nnPoint, BOOL IsAutoLocation=TRUE); void TransferFrom(CCurve& cv); //将曲线CCurve对象中的数据移动到当前对象中 public: BOOL bAutoLocation = FALSE; int midle = 0; double width = 0.0; double m_SmoothStep = 0.0; double m_dOffset = 0.0; CCurveType VirtualType; CCurveMark* mark = nullptr; stuCurveWave m_stuCurveWave; //为了波浪线的修饰,为了显示修饰中的波浪线 void operator=(const CCurveEx& curve); void CloneOtherParameter(const CCurveEx& curve); dfPoint MidleFilter(int i); BOOL EnableClose(BOOL bEnable); //成功修改后才返回TRUE void WriteXYZ(CFile& fw, char split=',', BOOL bWithName=TRUE); void WriteXYZ(CFile& fw, long nID, CString layer, char split=','); void WritePure(CFile& fw); // void WriteNodeToDB(CDatabase &db, CString &strTableName, CString &Maker, CString &Date, CString &projection, CString &layer); // void WriteToDB(CDatabase &db, CString &strTableName, CString &Maker, CString &Date, CString &projection, CString &layer); void WriteBezier(CFile& fw, double sd, int bIsClose); void WriteSpline(CFile& fw, double sd, int bIsClose); int GetArrow(CCurveEx& curveArrow, double dArrowHeight, int nHeadTail); //获得首箭头或尾箭头的曲线三点坐标 BOOL CreateCurve(double x1, double y1, double x2, double y2, double bulge); private: void CopyFrom(const CCurveEx& other); int64_t m_id = -1; public: virtual int ReadPCG(void *pxp, const short &ver); int ReadPCG2(void *pxp, const short &ver); };