📄 playbackview.cpp
字号:
// PlaybackView.cpp : implementation of the CPlaybackView class
//
#include "stdafx.h"
#include "Playback.h"
#include "PlaybackDoc.h"
#include "PlaybackView.h"
#include "MapTypes.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CPlaybackView
int h,m,s,ms;
double longitude,latitude,speed,direct;
HANDLE hDataFileReadThread=NULL;
HWND g_hMessageWnd=NULL;
int nStop=0;
IMPLEMENT_DYNCREATE(CPlaybackView, CView)
BEGIN_MESSAGE_MAP(CPlaybackView, CView)
//{{AFX_MSG_MAP(CPlaybackView)
ON_WM_CREATE()
ON_COMMAND(ID_MAP_OPEN, OnMapOpen)
ON_WM_SIZE()
ON_COMMAND(ID_MAP_PLAYBACK, OnMapPlayback)
ON_MESSAGE(WM_VERTEX,OnVertex)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CPlaybackView construction/destruction
CPlaybackView::CPlaybackView()
{
// TODO: add construction code here
}
CPlaybackView::~CPlaybackView()
{
}
BOOL CPlaybackView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CPlaybackView drawing
void CPlaybackView::OnDraw(CDC* pDC)
{
CPlaybackDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
}
/////////////////////////////////////////////////////////////////////////////
// CPlaybackView printing
BOOL CPlaybackView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CPlaybackView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CPlaybackView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CPlaybackView diagnostics
#ifdef _DEBUG
void CPlaybackView::AssertValid() const
{
CView::AssertValid();
}
void CPlaybackView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CPlaybackDoc* CPlaybackView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CPlaybackDoc)));
return (CPlaybackDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CPlaybackView message handlers
int CPlaybackView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
RECT rc;
GetClientRect(&rc);
if(m_mapx.Create(_T(""),WS_VISIBLE,rc,this,ID_MAP))
{
}
return 0;
}
void CPlaybackView::OnMapOpen()
{
// TODO: Add your command handler code here
CFileDialog dlg(TRUE,_T(".gst"),NULL,OFN_HIDEREADONLY,_T("地图文件(*.gst)|*.gst||"));
if(dlg.DoModal() == IDOK)
{
if(IsWindow(m_mapx.m_hWnd))
{
try
{
m_mapx.SetGeoSet(dlg.GetPathName());
}
catch(COleDispatchException *e)
{
e->Delete();
}
m_mapx.SetTitleText(_T(""));
//设置地图单位为公里
m_mapx.SetMapUnit(miUnitKilometer);
m_mapx.SetPaperUnit(miPaperUnitCentimeter);
CreateWorkLayer();
}
}
}
void CPlaybackView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
if(IsWindow(m_mapx.m_hWnd))
m_mapx.MoveWindow(0,0,cx,cy);
}
BOOL CPlaybackView::CreateWorkLayer()
{
char *czLayerName=_T("Road");
char strFilename[MAX_PATH];
GetFilePath(strFilename,MAX_PATH,czLayerName);
strcat(strFilename,".tab");
try
{
Lyr = m_mapx.GetLayers().Add(strFilename);
}
catch(COleDispatchException *e)
{
Lyr = NULL;
e->Delete();
}
if(Lyr == NULL)
{
try
{
Lyr = m_mapx.GetLayers().CreateLayer(strFilename,strFilename);//COptionalVariant(),COleVariant(1L),COptionalVariant(),COptionalVariant());
}
catch(COleDispatchException *e)
{
Lyr = NULL;
e->Delete();
}
}
return TRUE;
}
BOOL CPlaybackView::GetFilePath(char *FilePath,int len,const char *FileName)
{
memset(FilePath,0,len);
GetModuleFileName(NULL,FilePath,len);
char *p=strrchr(FilePath,'\\');
if(p != NULL)
strncpy(p+1,FileName,len-(p-FilePath)-1);
else
_snprintf(FilePath,len,"\\%s",FileName);
return TRUE;
}
char *GetToken(char *buf)
{
char *p=buf;
while(*p != '\0' && *p != ' ' && *p != '\t')
p++;
*p=0;
return buf;
}
DWORD WINAPI DatafileReaderProc(LPVOID lpParam)
{
FILE *fp=(FILE *)lpParam;
char line[512];
//开始播放
while(!feof(fp) && !nStop)
{
fgets(line,512,fp);
/*hh:mm:ss:ms longitude latitude speed power XX err XX snr XX ber XX msl mdl*/
char *fld;
//时间
fld=GetToken(line);
sscanf(line,"%d:%d:%d:%d",&h,&m,&s,&ms);
//经度
fld=fld+strlen(fld)+1;
fld=GetToken(fld);
longitude=atof(fld);
//纬度
fld=fld+strlen(fld)+1;
fld=GetToken(fld);
latitude=atof(fld);
//速度
fld=fld+strlen(fld)+1;
fld=GetToken(fld);
speed=atof(fld);
//方向
fld=fld+strlen(fld)+1;
fld=GetToken(fld);
direct=atof(fld);
if(g_hMessageWnd != NULL)
::SendMessage(g_hMessageWnd,WM_VERTEX,0,1);
SleepEx(1000,TRUE);
}
//播放结束
if(g_hMessageWnd != NULL)
SendMessage(g_hMessageWnd,WM_VERTEX,0,0);
fclose(fp);
return 0;
}
void PlaybackDatafile(char *strFile)
{
FILE *fp=fopen(strFile,"r");
if(fp != NULL)
{
nStop=0;
hDataFileReadThread=CreateThread(NULL,0,DatafileReaderProc,(LPVOID)fp,0,NULL);
}
}
void StopPlayback()
{
nStop=1;
if(hDataFileReadThread != NULL)
{
WaitForSingleObject(hDataFileReadThread,100);
hDataFileReadThread=NULL;
}
}
void CPlaybackView::OnMapPlayback()
{
// TODO: Add your command handler code here
g_hMessageWnd=m_hWnd;
if(hDataFileReadThread == NULL)
{
CFileDialog dlg(TRUE,_T(".txt"),NULL,OFN_HIDEREADONLY,_T("数据文件(*.txt)|*.txt||"));
if(dlg.DoModal() == IDOK)
{
m_bIsFirstPoint=TRUE;
AddRoad((char *)(const char *)dlg.GetPathName());
// PlaybackDatafile((char *)(const char *)dlg.GetPathName());
}
}
else
{
StopPlayback();
}
}
double oldlongitude,oldlatitude;
void CPlaybackView::OnVertex(WPARAM wParam,LPARAM lParam)
{
if(lParam != 0)
{
if(m_bIsFirstPoint)
m_bIsFirstPoint=FALSE;
else
{
DrawLine(oldlongitude,oldlatitude,longitude,latitude);
}
oldlongitude=longitude;
oldlatitude=latitude;
if(!m_mapx.IsPointVisible(longitude,latitude))
{
m_mapx.SetCenterX(longitude);
m_mapx.SetCenterY(latitude);
}
}
else
{
}
}
void CPlaybackView::DrawLine(double x1, double y1, double x2, double y2)
{
CMapXPoints pts;
CMapXFeature newObj,ftrBind;
CMapXLayer myLayer;
VARIANT v1;
//{ Draw line }
pts.CreateDispatch(pts.GetClsid());
pts.AddXY(x1,y1,pts.GetCount()+1);
pts.AddXY(x2,y2,pts.GetCount()+1);
v1.vt = VT_DISPATCH ;
v1.pdispVal= pts;
newObj = m_mapx.GetFeatureFactory().CreateLine(v1, COptionalVariant());
CMapXStyle style = newObj.GetStyle();
style.SetLineColor(0xff0000);
style.SetLineStyle(54);
style.SetLineWidth(5);
ftrBind = Lyr.AddFeature(newObj);
}
void CPlaybackView::AddRoad(char *strFile)
{
CMapXPoints pts;
CMapXFeature newObj,ftrBind;
CMapXLayer myLayer;
VARIANT v1;
MapFeatureIDStr id;
MapFeatureProp prop;
char buf[128*1024];
MapFeaturePart *part=(MapFeaturePart *)buf;
memset(&id,0,sizeof(MapFeatureIDStr));
memset(&prop,0,sizeof(MapFeatureProp));
memset(part,0,sizeof(MapFeaturePart));
FILE *fp=fopen(strFile,"r");
char line[512];
pts.CreateDispatch(pts.GetClsid());
//开始播放
while(!feof(fp) && !nStop)
{
fgets(line,512,fp);
/*hh:mm:ss:ms longitude latitude speed power XX err XX snr XX ber XX msl mdl*/
char *fld;
//时间
fld=GetToken(line);
sscanf(line,"%d:%d:%d:%d",&h,&m,&s,&ms);
//经度
fld=fld+strlen(fld)+1;
fld=GetToken(fld);
longitude=atof(fld);
//纬度
fld=fld+strlen(fld)+1;
fld=GetToken(fld);
latitude=atof(fld);
//速度
fld=fld+strlen(fld)+1;
fld=GetToken(fld);
speed=atof(fld);
//方向
fld=fld+strlen(fld)+1;
fld=GetToken(fld);
direct=atof(fld);
//{ Draw line }
if(longitude > 115.0 && longitude < 120.0 &&
latitude > 35.0 && latitude < 40.0)
{
part->pts[part->npt].x=longitude;
part->pts[part->npt].y=latitude;
part->npt++;
part->bound.pt1.x=part->bound.pt1.x < longitude ? part->bound.pt1.x : longitude;
part->bound.pt1.y=part->bound.pt1.y < latitude ? part->bound.pt1.y : latitude;
part->bound.pt2.x=part->bound.pt2.x > longitude ? part->bound.pt2.x : longitude;
part->bound.pt2.y=part->bound.pt2.y > latitude ? part->bound.pt2.y : latitude;
// pts.AddXY(longitude,latitude,pts.GetCount()+1);
}
}
fclose(fp);
//
v1.vt = VT_DISPATCH ;
v1.pdispVal= pts;
/*
newObj = m_mapx.GetFeatureFactory().CreateLine(v1, COptionalVariant());
CMapXStyle style = newObj.GetStyle();
style.SetLineColor(0xff0000);
style.SetLineStyle(1);
style.SetLineWidth(5);
ftrBind = Lyr.AddFeature(newObj);
*/
FILE *fpID,*fpMap,*fpProp;
fpID=fopen("road1.id","a+b");
fpMap=fopen("road1.map","a+b");
fpProp=fopen("road1.prop","a+b");
id.id=0;
id.offmap=0;
id.offprop=0;
sprintf(id.name,"%d",id.id);
id.type=1;
id.bound=part->bound;
fwrite(&id,1,sizeof(MapFeatureIDStr),fpID);
prop.color=0xff0000;
prop.width=2;
fwrite(&prop,1,sizeof(MapFeatureProp),fpProp);
unsigned long int npt=1,gap=0;
fwrite(&npt,1,sizeof(unsigned long int),fpMap);
fwrite(&gap,1,sizeof(unsigned long int),fpMap);
fwrite(part,1,sizeof(MapFeaturePart)+(part->npt-1)*sizeof(MapPosition),fpMap);
fclose(fpID);
fclose(fpMap);
fclose(fpProp);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -