www.pudn.com > easygis.rar > EasyGisDoc.cpp


// EasyGisDoc.cpp : implementation of the CEasyGisDoc class 
// 
 
#include "stdafx.h" 
#include "EasyGis.h" 
 
#include "EasyGisDoc.h" 
#include "EG_DataStruct.h" 
#include "EasyGisView.h" 
 
#include 
#include 
#include 
#include  
 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CEasyGisDoc 
 
IMPLEMENT_DYNCREATE(CEasyGisDoc, CDocument) 
 
BEGIN_MESSAGE_MAP(CEasyGisDoc, CDocument) 
	//{{AFX_MSG_MAP(CEasyGisDoc) 
	ON_COMMAND(ID_FILE_OPEN, OnFileOpen) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CEasyGisDoc construction/destruction 
 
CEasyGisDoc::CEasyGisDoc() 
{ 
	// TODO: add one-time construction code here 
	MaxX=0;MaxY=0;MinX=0;MinY=0; 
 
	 
 
} 
 
CEasyGisDoc::~CEasyGisDoc() 
{ 
} 
 
BOOL CEasyGisDoc::OnNewDocument() 
{ 
	if (!CDocument::OnNewDocument()) 
		return FALSE; 
 
	// TODO: add reinitialization code here 
	// (SDI documents will reuse this document) 
 
	return TRUE; 
} 
 
 
 
// CEasyGisDoc serialization 
 
void CEasyGisDoc::Serialize(CArchive& ar) 
{ 
	if (ar.IsStoring()) 
	{ 
		// TODO: add storing code here 
	} 
	else 
	{ 
		// TODO: add loading code here 
	} 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CEasyGisDoc diagnostics 
 
#ifdef _DEBUG 
void CEasyGisDoc::AssertValid() const 
{ 
	CDocument::AssertValid(); 
} 
 
void CEasyGisDoc::Dump(CDumpContext& dc) const 
{ 
	CDocument::Dump(dc); 
} 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// CEasyGisDoc commands 
 
void CEasyGisDoc::OnFileOpen()  
{ 
	// TODO: Add your command handler code here 
    //FileDialog 
	static char BASED_CODE szFilter[] = "Chart Files (*.mif)|*.mif|Worksheet Files (*.mif)|*.xls|Data Files (*.mid;*.mif)|*.mid; *.mif|All Files (*.*)|*.*||"; 
	CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter, NULL); 
	if(dlg.DoModal() == IDCANCEL) 
		return; 
	CString strPath = dlg.GetPathName(); 
 
	///////////////////////////////////////////////////////////////////////////// 
	FILE *fpf,*fpd; 
	if((fpf = fopen(strPath, "r" )) == NULL) 
	{ 
		AfxMessageBox("数据文件没有打开"); 
		return ;                                //打开mif文件 
	} 
	int Strlength=strPath.GetLength(); 
	CString midpath=strPath.Left( Strlength-1); 
	CString strPath2=midpath+"D"; 
    	if((fpd= fopen(strPath2, "r" )) == NULL) 
	{ 
		AfxMessageBox("数据文件没有打开"); 
		return ;                                //打开mid文件 
	} 
 
//////////////////////////////////////////////////////////////////////////// 
 
	EGC_WorkSpace * WorkSpace_obj= new EGC_WorkSpace;//creat a workspace object. 
	m_WorkSpaceList.AddTail(WorkSpace_obj); 
	EGC_Map * Map_obj= new EGC_Map; 
    WorkSpace_obj->m_EGLMapList.AddTail(Map_obj); 
    Map_obj->m_sMapName="郑州局部图";         //图名 
	EGC_Layer * Layer_obj= new EGC_Layer; 
    Map_obj->m_EGLLayerList.AddTail(Layer_obj); 
 
     
    char list[100]; 
	CString str; 
	int flag; 
	EGS_DPOINT pt; 
	EGS_BasicAttri * BasicAttri_obj= new EGS_BasicAttri; 
	 
    // read file 	 
	///////////////////读前面的信息////////////////// 
	 for(  ;  ;  ) 
	{ 
		fscanf(fpf,"%s",str); 
   	    flag=str.Compare("Data"); 
	    if(!flag) 
     	break; 
	} 
	//fread(list, sizeof( char ), 258, fpf ); 
    fread(list, sizeof( char ), 2, fpf ); 
	while(!feof(fpf)==1) 
	{    
		int a; 
        fread(list, sizeof( char ),5,fpf);//read the frist 5 char 
		///////////////////////读Line信息///////////////////// 
		EGC_LineInfo * Line_obj= new EGC_LineInfo; 
		if(list[0]=='L') 
		{    
		   int i; 
		   Line_obj->m_iPosPointNumber=2; 
           for(i=0;im_iPosPointNumber;i++) 
		   {    
			    double x,y; 
			    fscanf( fpf, "%lf %lf ", &x ,&y );    
			    pt.X = x; 
			    pt.Y = y; 
                Line_obj->PtArray.Add(pt); 
				if(x>MaxX) MaxX=x; 
				if(y>MaxY) MaxY=y; 
				if(xm_Attri.m_id=m_id; 
		   Line_obj->m_Attri.m_iCode=m_icode; 
		   Line_obj->m_Attri.m_sName=name; 
		   Layer_obj->m_EGLLineInfoList.AddTail(Line_obj); 
           a=(int)m_icode/1000; 
		} 
		///////////////////读Pline信息//////////////////// 
		if(list[0]=='P') 
		{  
		   int n,i; 
           fscanf(fpf,"%d",&n); 
	       Line_obj->m_iPosPointNumber=n; 
           for(i=0;im_iPosPointNumber;i++) 
		   {    
				double x,y; 
				fscanf(fpf,"%lf %lf",&x,&y); 
				pt.X = x; 
			    pt.Y = y; 
                Line_obj->PtArray.Add(pt); 
				if(x>MaxX) MaxX=x; 
				if(y>MaxY) MaxY=y; 
				if(xm_Attri.m_id=m_id; 
		   Line_obj->m_Attri.m_iCode=m_icode; 
		   Line_obj->m_Attri.m_sName=name; 
		   a=(int)m_icode/1000; 
		   Layer_obj->m_EGLLineInfoList.AddTail(Line_obj); 
		   fread(list, sizeof( char ),18,fpf); 
		} 
		/////////////////////////读Rect信息///////////////////// 
		if(list[2]=='c') 
		{  
		   EGC_RectInfo * Rect_obj= new EGC_RectInfo; 
    	   double x1,y1,x2,y2; 
		   fscanf(fpf,"%lf %lf %lf %lf",&x1,&y1,&x2,&y2); 
		   Rect_obj->RectArray.X1 = x1; 
		   Rect_obj->RectArray.Y1 = y1; 
	       Rect_obj->RectArray.X2 = x2; 
	   	   Rect_obj->RectArray.Y2 = y2; 
		   if(x1>MaxX) MaxX=x1; 
		   if(y1>MaxY) MaxY=y1; 
	   	   if(x1MaxX) MaxX=x2; 
		   if(y2>MaxY) MaxY=y2; 
		   if(x2m_Attri.m_id=m_id; 
		   Rect_obj->m_Attri.m_iCode=m_icode; 
		   Rect_obj->m_Attri.m_sName=name; 
		   Layer_obj->m_EGLRectInfoList.AddTail(Rect_obj); 
		   a=(int)m_icode/1000; 
		} 
		/////////////////////读Region信息///////////////////// 
        if(list[2]=='g') 
		{  
           fread(list, sizeof( char ),5,fpf); 
		   EGC_RegionInfo * Region_obj= new EGC_RegionInfo; 
		   int n,i; 
           fscanf(fpf,"%d",&n); 
		   Region_obj->m_iRegPointNumber=n; 
           for(i=0;im_iRegPointNumber;i++) 
		   {    
			    double x,y; 
				fscanf(fpf,"%lf %lf",&x,&y); 
				pt.X = x; 
			    pt.Y = y; 
                Region_obj->PtArray.Add(pt); 
		   } 
			 
		    
		   for(i=0;i<7;i++) 
                fscanf(fpf,"%s",str); 
		   fread(list, sizeof( char ),1,fpf); 
		   /////////////////////////读相应的MID文件!//////////// 
		   int m_id,m_icode; 
		   char name[100]; 
           fscanf(fpd,"%d,%d,%s",&m_id,&m_icode,name); 
		   Region_obj->m_Attri.m_id=m_id; 
		   Region_obj->m_Attri.m_iCode=m_icode; 
		   Region_obj->m_Attri.m_sName=name; 
		   a=(int)m_icode/1000; 
		    
		   Layer_obj->m_EGLRegionInfoList.AddTail(Region_obj); 
		} 
		////////////////给不同的层命名////////////// 
		if(a==1)  Layer_obj->m_sLayerName="居民地层"; 
        if(a==2)  Layer_obj->m_sLayerName="道路层"; 
		if(a==3)  Layer_obj->m_sLayerName="等高线层"; 
		if(a==4)  Layer_obj->m_sLayerName="设施层"; 
		if(a==5)  Layer_obj->m_sLayerName="独立地物层"; 
		if(a==6)  Layer_obj->m_sLayerName="水系层"; 
		if(a==7)  Layer_obj->m_sLayerName="电力层"; 
		if(a==8)  Layer_obj->m_sLayerName="图廓层"; 
	} 
 
 
       
    fclose( fpf ); 
	fclose( fpd ); 
     
    ///////////////////激发显示的OnDraw()///////////////// 
	POSITION pos = GetFirstViewPosition(); 
	CEasyGisView* pView = (CEasyGisView*)GetNextView(pos); 
	pView->m_MaxX=MaxX; 
	pView->m_MaxY=MaxY; 
	pView->m_MinX=MinX; 
	pView->m_MinY=MinY; 
	pView->Invalidate(FALSE); 
}