⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 drawshapedoc.cpp

📁 用于地理信息系统(GIS)行业程序。 完整的鼠标交互式地图点、线、面的绘制
💻 CPP
字号:
// DrawShapeDoc.cpp : implementation of the CDrawShapeDoc class
//

#include "stdafx.h"
#include "DrawShape.h"

#include "ReadShapefile.h"

#include "Draw.h"
#include "Line.h"
#include "Pline.h"
#include "PointShape.h"

#include "MainFrm.h"
#include "DrawShapeView.h"
#include "DrawShapeDoc.h"
#include "ChildFrm.h"

//CGraphPara* gpCGraphPara=NULL;


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

extern	CPline* gpPline;
extern CDrawShapeView* gpCDrawShapeView;

//定义全局指针,在文档初始化函数中赋值
//CGraphPara* gpCGraphPara;

//定义全局函数,方便进行坐标转换
void APtoLP(float x,float y,int *X,int *Y);
void LPtoAP(int x,int y,float *X,float *Y);


void APtoLP(float x,float y,int *X,int *Y)
{
	gpCDrawShapeView->APtoLP(x,y,X,Y);
}

void LPtoAP(int x,int y,float *X,float *Y)
{
	gpCDrawShapeView->LPtoAP(x,y,X,Y);
}

//逻辑数值到实际数值

float LVtoAV(int iInputval)
{
	return  gpCDrawShapeView->LVtoAV(iInputval);
}

//实际数值到逻辑数值
int AVtoLV(float fInputval)
{
	return gpCDrawShapeView->AVtoLV(fInputval);
}

/////////////////////////////////////////////////////////////////////////////
// CDrawShapeDoc

IMPLEMENT_DYNCREATE(CDrawShapeDoc, CDocument)

BEGIN_MESSAGE_MAP(CDrawShapeDoc, CDocument)
	//{{AFX_MSG_MAP(CDrawShapeDoc)
		// NOTE - the ClassWizard will add and remove mapping macros here.
		//    DO NOT EDIT what you see in these blocks of generated code!
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDrawShapeDoc construction/destruction

CDrawShapeDoc::CDrawShapeDoc()
//新建一个文档时会调用该构造函数
{
	// TODO: add one-time construction code here
//	if(gpCGraphPara == NULL) //使得全局指针只赋值一次
//	{
//		gpCGraphPara=&objGraphPara;  
// 	}
//	else 
//		AfxMessageBox("hi");
}


CDrawShapeDoc::~CDrawShapeDoc()
{
	
//	if(gpCGraphPara != NULL){
//		gpCGraphPara = NULL;
//    }

	//文档退出时获得所有图形元素指针并delete

//MDI里面先得到主框架
CMainFrame *pFrame = (CMainFrame*)AfxGetMainWnd();

//得到活动框架
CMDIChildWnd *pChild = (CMDIChildWnd*)pFrame->GetActiveFrame(); 

//得到活动视图用:
CDrawShapeView *pView = (CDrawShapeView *) pChild->GetActiveView();


//得到活动文档用:

CDrawShapeDoc *pDoc = (CDrawShapeDoc *) pChild->GetActiveDocument();

//if(pDoc == this)
// {

	for(int i=1; i<3; i++)
	{
		for(int j=0; j <= GetGraphUpperBound(i); j++)
		delete GetGraph(i,j);
	}
//}

}

BOOL CDrawShapeDoc::OnNewDocument()
{
	if (!CDocument::OnNewDocument())
		return FALSE;

	// TODO: add reinitialization code here
	// (SDI documents will reuse this document)


	return TRUE;
}



/////////////////////////////////////////////////////////////////////////////
// CDrawShapeDoc serialization

void CDrawShapeDoc::Serialize(CArchive& ar)
{
	if (ar.IsStoring())	//存储
	{
		// TODO: add storing code here

/*
		
		for(int i=1; i<3; i++)
		{
			//当某种类别的图形元素没有画时,则其GetGraphUpperBound(i)==0
			//因此pDraw!=NULL,可以通过该指针调用其它函数

			for(int j=0; j <= GetGraphUpperBound(i); j++)
			{
				//依据类别和该类图形的索引获得图形指针
				//如果该图形已做了删除标志,则不串行化
				CDraw* pDraw=GetGraph(i,j);
				if(!(pDraw->IsDelete()))	//如果没有做删除标志
				{
					pDraw->Serialize(ar);
				}
			}
		}
	*/			
	}

	else	//读取
	{
		// TODO: add loading code here
//		for(int i=1; i<3; i++)
//		{
//			//当某种类别的图形元素没有画时,则其GetGraphUpperBound(i)==0
//			//因此pDraw!=NULL,可以通过该指针调用其它函数
//
//			for(int j=0; j <= GetGraphUpperBound(i); j++)
//			{
//				//依据类别和该类图形的索引获得图形指针
//				//如果该图形已做了删除标志,则不串行化
//				CDraw* pDraw=GetGraph(i,j);
//				if(!(pDraw->IsDelete()))	//如果没有做删除标志
//				{
//					pDraw->Serialize(ar);
//				}
//			}
//		}
	}


	m_LineList.Serialize(ar);
	m_PlineList.Serialize(ar);
	m_PointList.Serialize(ar);



}

/////////////////////////////////////////////////////////////////////////////
// CDrawShapeDoc diagnostics

#ifdef _DEBUG
void CDrawShapeDoc::AssertValid() const
{
	CDocument::AssertValid();
}

void CDrawShapeDoc::Dump(CDumpContext& dc) const
{
	CDocument::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CDrawShapeDoc commands

CLine* CDrawShapeDoc::AddLine(short colorPen,short colorBrush,short lineWide,
			 short lineType,short layer,int idOnly,BOOL bDelete,
			 float x1,float y1,float x2,float y2)
{
	CLine* obj_Line;
	obj_Line=new CLine( colorPen, colorBrush, lineWide,
			  lineType, layer, idOnly, bDelete,
			  x1, y1, x2, y2);
	m_LineList.Add(obj_Line);
	return obj_Line;
}

CPline* CDrawShapeDoc::AddPline(short colorPen,short colorBrush,short lineWide,short lineType,short layer,int idOnly,BOOL bDelete,int pointNum,PointStruct* pointArray,BOOL bFill)
{
	CPline* pPline;
	pPline=new CPline( colorPen, colorBrush, lineWide, lineType, layer,idOnly,bDelete,pointNum, pointArray,bFill);
	m_PlineList.Add(pPline);
	//TRACE0(m_PlineList.GetAt(0))
	return pPline;
}

CDraw* CDrawShapeDoc::GetGraph(short Lb, int index)
{
	switch(Lb)
	{
	case 1://直线
		if(index<0||index>m_LineList.GetUpperBound())
			return NULL;
		return m_LineList.GetAt(index);
		break;
	case 2://连续直线或多边形区域
			if(index<0||index>m_PlineList.GetUpperBound())
				return NULL;
			return m_PlineList.GetAt(index);
			break;
	case 3://点
			if(index<0||index>m_PointList.GetUpperBound())
				return NULL;
			return m_PointList.GetAt(index);
			break;
	default:
		return NULL;

	}
	return NULL;
}

int CDrawShapeDoc::GetGraphUpperBound(short Lb)
{
	switch(Lb)
	{
		//当m_ListList等列表中无数据时,GetUpperBound
		//的值为-1,在视图类OnDraw中,有调用该函数,当第一
		//次视图重画时,因为GetUpperBound返回值为-1,所以不会
		//调用GetGraph函数,导致运行错误


	case 1://直线
		return 	m_LineList.GetUpperBound();
		break;
	case 2://连续直线或多边形区域
	  return m_PlineList.GetUpperBound();
		break;
	case 3://点
	  return m_PointList.GetUpperBound();
		break;
	default:
		return -1;
	
	}
	return -1;

}

/*--< 函数头     >-----------------------------------------------------------*
 *    函数名称	      : ReadShapefile												  *
 *    功能概述	      : 读取shapefile文件,并将数据增加到模板中					 *
 *    输入参数        : const char *pFileName: dxf文件名					 *
 *			          : 		  
 *			          : 	  
 *    输出参数			无												     *
 *    返回值	      :	无													 *			
 *					                             
 *---------------------------------------------------------------------------*/


void CDrawShapeDoc::ReadShapefile(const char *pFileName)
{
	int iFileLen;	//文件长度
	int iRecordNO;	//记录号
	int iShapeType;	//记录头中的图形类型
	double Xmin ;	//地图边界矩形
	double Ymin;
	double Xmax;
	double Ymax;
	PointStruct* pstPoints =new PointStruct[3000];	//点坐标
	int* pstParts = new int[1000];	//parts
	PointStruct* pstBounds = new PointStruct[4];	//线/多边形边界矩形
	int iPointNum;	//点个数 
	float fXcoord;	//X 坐标
	float fYcoord;	//Y 坐标

	short sColorPen = 3;
	short sColorBrush = 2;
	short sLineType = 0;
	short sLineWide = 1;
	short sLayer = 1;

	int iReadedLen ;	//记录读取的长度
	int iReadedAllLen = 50;	//已读取的总长度,文件头为50个双字节

	CPline* pLine = NULL ;
	CPline*  pPloygon = NULL ;
	CPointShape* pPoint = NULL;

//	D:\\work\\arcvviewData\\polygonshp.shp
	CReadShapefile clsReadShapefile(pFileName);
	if(!clsReadShapefile.OpenShapefile()) //在CReadShapefile对象退出时关闭文件
	{
		return ;	//打开shapefile文件不成功,退出
	}
	iFileLen = clsReadShapefile.GetFileLength();
	clsReadShapefile.GetMapBound(Xmin,Ymin,Xmax,Ymax);
	iShapeType = clsReadShapefile.GetShapeType();
	//跳过文件头,100字节
	clsReadShapefile.Seek(100);

	CString str;

	do 
	{
		switch(iShapeType) 
		{
		case 1:	//点
			iReadedLen = clsReadShapefile.GetPoint(fXcoord,
				                          fYcoord,iRecordNO);

			pPoint = new CPointShape(sColorPen,sColorBrush,sLineWide,
				sLineType,sLayer,iRecordNO,0,fXcoord,fYcoord);

			m_PointList.Add(pPoint);

		//	UpdateAllViews(gpCDrawShapeView);
			
			//测试
			str.Format("%d\n",m_PointList.GetUpperBound());
			TRACE0(str);

			iReadedAllLen += iReadedLen;

			break;
		case 3: //line、polyline、polygon
			//取得数据
			iReadedLen = clsReadShapefile.GetPLine(pstPoints,
				pstBounds, pstParts,iPointNum,iRecordNO);
			
			//new出对象,bFill参数为不填充
			 pLine  = new CPline(sColorPen,sColorBrush,sLineWide,
				sLineType,sLayer,iRecordNO,0,iPointNum,pstPoints,0);
			
			 m_PlineList.Add(pLine);

			iReadedAllLen += iReadedLen;
			break;
		case 5 :  //line、polyline、polygon
			iReadedLen = clsReadShapefile.GetPLine(pstPoints,
				pstBounds, pstParts,iPointNum,iRecordNO);
			// bFill参数为填充
			 pPloygon = new CPline(sColorPen,sColorBrush,sLineWide,
				sLineType,sLayer,iRecordNO,0,iPointNum,pstPoints,1);
			 m_PlineList.Add(pPloygon);

			iReadedAllLen += iReadedLen;

			break;
		case 8 :	//MultiPoint
			break;
		default:
			AfxMessageBox("不能识别的图形类型");
			return ;
		}
		
	} while(iReadedAllLen < iFileLen);
	
	//调用视图类函数显示全屏,使导入的图形显示
	gpCDrawShapeView->ShowFullScreen();

}

BOOL CDrawShapeDoc::OnOpenDocument(LPCTSTR lpszPathName) 
{
	if (!CDocument::OnOpenDocument(lpszPathName))
		return FALSE;
	// TODO: Add your specialized creation code here
/*	
	CString clsFileName;
	CString pcFileExe;
	clsFileName = lpszPathName;
	int n = clsFileName.ReverseFind('.');
	if(n > 0)
	{
		//如果扩展名为shp,则打开并读取它
		pcFileExe = clsFileName.Right(n);
		if(pcFileExe.Compare("shp") == 0)
		{
			ReadDxf(lpszPathName);
		}
	}

*/
	return TRUE;
}

CPointShape* CDrawShapeDoc::AddPoint(short colorPen,short colorBrush,short lineWide,
		short lineType,short layer,int idOnly,BOOL bDelete,
 		float Xcoord,float Ycoord)
{
	CPointShape* pPoint= new CPointShape( colorPen, 
		colorBrush, lineWide, lineType, layer,
		 idOnly, bDelete, Xcoord, Ycoord);
	m_PointList.Add(pPoint);
	return pPoint;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -