You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

516 lines
13 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

//////////////////////////////////////////////////////////////////////////////
//文件: 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|321字节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__