📄 drawshapedoc.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 + -