////////////////////////////////////////////////////////////////////////////// //文件: dfPluginBase.h //主要功能: // 双狐格式读写插件标准接口文件头定义,该定义不能更改 // 由该接口文件形成的DLL库,需要复制到模块所在目录下的plugin目录下才能使用 // 使用时点击菜单“文件|从插件中打开”命令,选择需要导入的文件类型及文件 // 就可将其直接在中打开。 // //程序编写: 2009-4-16 // // ///////////////////////////////////////////////////////////////////////////// #if !defined ( __DF_PLUGIN_FORMAT_BASE_H__ ) #define __DF_PLUGIN_FORMAT_BASE_H__ namespace NPluginFormat { namespace NPluginFormatElements { ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //格式插件信息 struct dfPluginFormatInfo { //可读取格式的信息 short m_stMajor; //major version (e.g. 1.xx) short m_stMinor; //minor version (e.g. x.12) BOOL m_bCanRead; //是否可读该类文件 BOOL m_bCanWrite; //是否可写该类文件 const char* m_strName; //插件名称 const char* m_strDescription; //插件描述:制作人、日期等 const char* m_strExtension; //扩展名,格式如:*.dfd;*.dfg;*.dfb }; struct dfPluginFormat { dfPluginFormatInfo* m_pFormatInfo; int m_nFormatNum; }; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //插件中常使用的元素类型 enum enumPlineType { plineDefault = 0, //缺省 plineSolid = 1, //充填 plineClose = 2, //闭合曲线 plineBezier = 3, //B样条显示 plineSpline = 4, //三次样条显示 plineTransparent = 5, //透明显示 plineBezierSolid = 6, //B样条+充填 plineBezierClose = 7, //B样条+闭合 plineSplineSolid = 8, //三次样条+充填 plineSplineClose = 9, //三次样条+闭合 plineTransSolid = 10 //透明+充填 }; class dfPluginElement { public: dfPluginElement(void) { memset(m_strName, 0, sizeof(char)*256); m_color=0; m_version=1; //为了后期的扩展 m_dWidth=0; } char m_strName[256]; //名称 long m_color; //颜色 int m_version; //版本号 double m_dWidth; //曲线宽度,文字的宽度 }; class dfPluginPline : public dfPluginElement { public: dfPluginPline(void) { x=y=z=l=NULL; num=0; m_nColNum=2; m_nPlineType=plineDefault; m_dWidth=0; }; ~dfPluginPline(void) { if(x!=NULL) { delete[] x; x=y=z=l=NULL; num=0; } }; int Create(int nPointNum) { if(nPointNum<=0) return 0; num=nPointNum; x=new double[num*4]; y=x+nPointNum; z=y+nPointNum; l=z+nPointNum; return nPointNum; }; double *x, *y, *l, *z; //曲线坐标(X,Y,Z,桩号) int num; //坐标点数 int m_nColNum; //列包含数,最小为2,为3时包含Z值,为4时包含L值 enumPlineType m_nPlineType; //曲线类型 }; class dfPluginPoint { public: dfPluginPoint(void) { x=y=z=l=0; }; double x,y,z,l; }; class dfPluginRect { public: dfPluginRect(void) { left=right=top=bottom=0; }; double left,right,top,bottom; }; class dfPluginPlineRect : public dfPluginElement { public: dfPluginPlineRect(void) { m_nPlineType=plineDefault; m_dWidth=0; }; dfPluginRect m_rect; enumPlineType m_nPlineType; //曲线类型 }; class dfPluginText : public dfPluginElement { public: dfPluginText(void) { m_dWidth=m_dHeight=0; m_nAlignH=2; m_nAlignV=0; angle = 0; }; dfPluginPoint point; //坐标 double m_dHeight; //文字高度 int m_nAlignH; //水平对齐 (0=左对齐,1=居中对齐,2=右对齐) int m_nAlignV; //垂直对齐 (0=上对齐,1=居中对齐,2=下对齐) double angle; }; class dfPluginEllipse : public dfPluginElement { public: dfPluginEllipse(void) { }; dfPluginRect m_rect; }; class dfPluginArc : public dfPluginEllipse { public: dfPluginArc(void) { m_arcType=drawArc; m_dArc1=0; m_dArc2=2; }; enum enumArcType { drawArc = 0, //弧 drawChord = 1, //弦 drawPie = 2 //饼 }; enumArcType m_arcType; double m_dArc1; //开始角度 double m_dArc2; //结束角度 }; class dfPluginImageBuffer : public dfPluginElement { public: dfPluginImageBuffer(void) { m_nLength=0; m_pBuffer=NULL; memset(m_strImageType, 0, 4); }; char m_strImageType[4]; //图像类型可以为“BMP、JPG、GIF、TIF、WMF、EMF、PNG”等三个字节缩写的类型,文件指针中包含了文件所有的内容 dfPluginRect rect; //坐标及高宽 BYTE* m_pBuffer; //整个图像文件按照一定的格式保存的文件内容 UINT m_nLength; //文件长度,指的是m_pBuffer的长度 }; class dfPluginImage : public dfPluginElement { public: dfPluginImage(void) { m_nBPP=32; m_nWidth=0; m_nHeight=0; m_pData=NULL; }; dfPluginRect rect; //坐标及高宽 int m_nBPP; //颜色数,可以为8|16|32(1字节|2字节|4字节),一个颜色值所占用的字节数 int m_nWidth; int m_nHeight; //图像的高宽 BYTE* m_pData; //根据m_nBPP指定的一个颜色值占的字节数进行读取数据,按照一行一行的像素保存 }; //插入符号 class dfPluginMark : public dfPluginElement { public: dfPluginMark(void) { m_strMarkName[0]=0; }; dfPluginRect rect; //坐标及高宽 char m_strMarkName[256]; //符号名称 }; //外边框 class dfPluginFrame : public dfPluginElement { public: dfPluginFrame(void) { m_dThickness=0; m_bBlackFrame=TRUE; m_strMarkName[0]=0; m_color=0; }; dfPluginRect rect; //坐标及高宽 double m_dThickness; //边框厚度 BOOL m_bBlackFrame; //是否为黑线边框 char m_strMarkName[256]; //符号名称 long m_color; //边框颜色 }; //经纬网或直角网 class dfPluginGriding : public dfPluginElement { public: dfPluginGriding(void) { m_nGridingType=0; //缺省为直角网格 m_dStepX=0; m_dStepY=0; m_dTextHeight=3; m_nFlags=showLine|markAllSide|showFrame|showText|textMath; }; int m_nGridingType; //网格类型:0:直角网格,1=经纬网 dfPluginRect rect; //坐标及高宽 double m_dStepX, m_dStepY; //在经度、纬度网格的步长,以分为单位 double m_dTextHeight; //文字高度 DWORD m_nFlags; //网格风格 //网格风格 enum enumGridingStyle { markLeft = 0x00000001, //左边 markTop = 0x00000002, //上边 markRight = 0x00000004, //右边 markBottom = 0x00000008, //下边 markAllSide = (markLeft | markTop | markRight | markBottom), //所有边 markLeftTop = (markLeft | markTop), //左边+上边 markTopRight = (markTop | markRight), //上边+右边 markRightBottom = (markRight| markBottom), //右边+下边 markBottomLeft = (markLeft | markBottom), //下边+左边 showLine = 0x00000010, //显示曲线 showCrossPoint = 0x00000020, //显示交点 showNull = 0x00000040, //显示为空 textGeography = 0x00000100, //地理 textMath = 0x00000200, //数学 textGeography1 = 0x00000400, //地理1 textGeography2 = 0x00000800, //地理2(all) textMathHor = 0x00020000, //数学水平 showFrame = 0x00001000, //是否标识边框 showText = 0x00002000 //是否标识文字 }; }; class dfPluginSurface : public dfPluginElement { public: dfPluginSurface(void) { m_dx=0; m_dy=0; numx=0; numy=0; m_pData=0; zmin=0; zmax=0; }; dfPluginPoint point; //坐标 double m_dx; double m_dy; //X方向及Y方向的坐标间隔 int numx; int numy; //网格的坐标点数 double* m_pData; //网格数据,该数据按照一行接一行的格式保存,每行的个数为numx,共有numy行 double zmin; double zmax; //Z值的最大最小值,该范围之外的值都为无效值 }; typedef bool( *DF_SET_CURRENT_LAYER )( const char* strLayer ); //设置当前层 typedef bool( *DF_SET_PROJECTION )( const char* strProjection ); //设置投影,格式为双狐DFD格式 typedef bool( *DF_ELE_PLINE )( const dfPluginPline* ); //插入曲线 typedef bool( *DF_ELE_RECT )( const dfPluginPlineRect* ); //插入曲线矩形,可以使用曲线修饰 typedef bool( *DF_ELE_TEXT )( const dfPluginText* ); //插入文本 typedef bool( *DF_ELE_POINT )( dfPluginPoint dp, const char* strName, double angle ); //插入点类文字,如井位等,在双狐中可使用修饰控制 typedef bool( *DF_ELE_ELLIPSE)( const dfPluginEllipse* ); //插入圆或椭圆 typedef bool( *DF_ELE_ARC )( const dfPluginArc* ); //插入弧 typedef bool( *DF_ELE_IMAGE )( const dfPluginImage* ); //插入图像 typedef bool( *DF_ELE_IMAGE_BUFFER)(const dfPluginImageBuffer* ); //插入图像 typedef bool( *DF_ELE_IMAGE_FILE )( const char* strFileName, dfPluginRect rect); //插入图像 typedef bool( *DF_ELE_SURFACE)( const dfPluginSurface* ); //插入曲面 typedef bool( *DF_ELE_XYZ)( double x, double y, double z ); //插入散点文字 typedef bool( *DF_ELE_MERGE_DF_FILE )(const char* strFileNameOrData, BOOL bMemeryData); //合并双狐图件(如符号库等),bMemeryData为TRUE表示strFileNameOrData中直接为DFD格式的串,否则为文件名称 typedef bool( *DF_ELE_GRIDING)( const dfPluginGriding* ); //插入坐标网 typedef bool( *DF_ELE_FRAME)( const dfPluginFrame* ); //插入外边框 typedef bool( *DF_ELE_MARK)( const dfPluginMark* ); //插入符号 typedef bool( *DF_ELE_BEGIN_CREATE_MARK)( const char* strMarkName ); //开始符号生成 typedef bool( *DF_ELE_END_CREATE_MARK)( void ); //结束符号生成 typedef bool( *DF_ELE_SAVE_FILE)( const char* strFileName, int nSaveType); //将内容保存为指定扩展名的文件,nSaveType:1=dfd、2=dfb、3=dml typedef bool( *DF_ELE_CLEAR_ALL)( void ); //清除所有内容,包括层位、元素等所有信息 }; using namespace NPluginFormatElements; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //格式插件的读接口 class dfPluginFormatReader { public: dfPluginFormatReader(void) { m_nVersion=1; funSetCurrentLayer=NULL; funSetProjection=NULL; funElePline=NULL; funEleRect=NULL; funEleText=NULL; funElePoint=NULL; funEleEllipse=NULL; funEleArc=NULL; funEleImage=NULL; funEleImageFile=NULL; funEleSurface=NULL; funEleXyz=NULL; funEleMergeDFFile=NULL; funEleGriding=NULL; funEleFrame=NULL; funEleImageBuffer=NULL; funEleMark=NULL; funEleBeginCreateMark=NULL; funEleEndCreateMark=NULL; funSaveFile=NULL; funClearAll=NULL; }; int m_nVersion; //版本号,可以控制连接后使用哪些函数,为了扩展接口函数而设 //将使用dfSetReader函数设置以下接口,通过这些函数与双狐建立转换关系,实现实时读取转换功能 //版本为1时可使用的函数接口 DF_SET_CURRENT_LAYER funSetCurrentLayer; DF_SET_PROJECTION funSetProjection; DF_ELE_PLINE funElePline; DF_ELE_RECT funEleRect; DF_ELE_TEXT funEleText; DF_ELE_POINT funElePoint; DF_ELE_ELLIPSE funEleEllipse; DF_ELE_ARC funEleArc; DF_ELE_IMAGE funEleImage; DF_ELE_IMAGE_FILE funEleImageFile; DF_ELE_IMAGE_BUFFER funEleImageBuffer; DF_ELE_SURFACE funEleSurface; DF_ELE_XYZ funEleXyz; DF_ELE_MERGE_DF_FILE funEleMergeDFFile; DF_ELE_GRIDING funEleGriding; DF_ELE_FRAME funEleFrame; DF_ELE_MARK funEleMark; DF_ELE_BEGIN_CREATE_MARK funEleBeginCreateMark; DF_ELE_END_CREATE_MARK funEleEndCreateMark; DF_ELE_SAVE_FILE funSaveFile; DF_ELE_CLEAR_ALL funClearAll; }; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //格式插件的写接口 class dfPluginFormatWriter { public: dfPluginFormatWriter(void) { m_nVersion=1; }; int m_nVersion; //版本号,可以控制连接后使用哪些函数,为了扩展接口函数而设 //将使用dfGetWriter函数获得以下接口,通过这些函数将双狐元素转换转换为指定格式 //版本为1时可使用的函数接口 }; //////////////////////////////////////////////////////////////////////////////////////////////////////////// //用户需要从该类派生类重写ReadFile函数 class CPluginFormatBase { public: CPluginFormatBase(void) { memset(&m_pluginFormat, 0, sizeof(m_pluginFormat)); }; //在该插件中仅需要调用该函数就可将其转换为双狐格式 virtual int ReadFile(const char* strFilePathName, int nFormatType)=0; //在双狐中调用该函数就可将双狐格式导出为插件格式 //基本信息获得函数 virtual dfPluginFormat* GetFormatInfo(void) { return &m_pluginFormat; }; //初始化信息,如调用对话框设置读取参数及内存申请等 virtual int Initialize(const char* strFilePathName) { return 1; }; virtual void Shutdown(void) //结束转换,可以在些保存一些参数信息,释放内存等 { } virtual void SetReaderFun(dfPluginFormatReader* pReader) //在该插件中仅需要调用该函数就可将其转换为双狐格式 { m_pFormatReader=pReader; } //virtual dfPluginFormatWriter* GetWriterFun(void) //{ // return m_pFormatWrite; //} void FillFormat(int nFormatNum, dfPluginFormatInfo* pInfo) { m_pluginFormat.m_nFormatNum = nFormatNum; m_pluginFormat.m_pFormatInfo = pInfo; } protected: dfPluginFormat m_pluginFormat; dfPluginFormatReader* m_pFormatReader = nullptr; //dfPluginFormatWriter* m_pFormatWrite; //写函数接口 }; //////////////////////////////////////////////////////////////// ////在CPluginFormatBase类的派生类中的CPP文件中必须如下定义 // ////定义格式信息,可以为多条 //#define PLUGIN_FORMAT_NUM 1 //dfPluginFormatInfo pluginFI[PLUGIN_FORMAT_NUM] = { // {1, 1, TRUE, FALSE, "XYZ Files(*.csv; *.xyz)", "DoubleFox format plugin test", "*.xyz;*.csv"}, //}; // ////定义全局变量 //CPluginFormatEx m_pluginFormatEx; // //CPluginFormatEx::CPluginFormatEx(void) //{ // m_pluginFormat.m_nFormatNum=PLUGIN_FORMAT_NUM; // m_pluginFormat.m_pFormatInfo=pluginFI; // m_pPluginFormatBase=&m_pluginFormatXyz; //} // ////定义纯虚读函数 //int CPluginFormatEx::ReadFile(const char* strFilePathName, int nFormatType) //{ // CXyz xyz; // return xyz.Read(strFilePathName); //} /////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //双狐插件的接口函数名称定义,在插件中必须定义这些CODE函数 #define DF_GET_PLUGIN_FORMAT_NAME "dfGetPluginFormat" //基本信息获得函数 #define DF_GET_PLUGIN_FORMAT_CODE dfGetPluginFormat typedef CPluginFormatBase* ( *DF_GET_PLUGIN_FORMAT )( void ); //插件接口类指针 }; using namespace NPluginFormat; #endif //__DF_PLUGIN_FORMAT_BASE_H__