📄 graphseiadddlg.cpp
字号:
// GraphSeiAddDlg.cpp : implementation file
//
#include "stdafx.h"
#include "mapper.h"
#include "GraphSeiAddDlg.h"
#include "math.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CGraphSeiAddDlg dialog
CGraphSeiAddDlg::CGraphSeiAddDlg(CWnd* pParent /*=NULL*/)
: CDialog(CGraphSeiAddDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CGraphSeiAddDlg)
m_fLat = 0.0f;
m_fLon = 0.0f;
m_fMag = 0.0f;
m_fDepth = 0.0f;
m_Date = COleDateTime::GetCurrentTime();
m_Time = COleDateTime::GetCurrentTime();
m_nSymbol = 0;
m_fCircleR = 0.0f;
m_fCircleX = 0.0f;
m_fCircleY = 0.0f;
m_nSelectType = 0;
m_bMagMaxUse = FALSE;
m_fMagMax = 0.0f;
m_fMagMin = 0.0f;
m_bMagMinUse = FALSE;
m_sPlace = _T("");
m_nParaType = 0;
m_bOutline = TRUE;
//}}AFX_DATA_INIT
}
void CGraphSeiAddDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CGraphSeiAddDlg)
DDX_Control(pDX, IDC_COLOR_OUTLINE, m_oColorOutline);
DDX_Control(pDX, IDC_COLOR_FILL, m_oColorFill);
DDX_Control(pDX, IDC_SEISM_LIST, m_ctrlSeismList);
DDX_Text(pDX, IDC_SINGLE_LAT, m_fLat);
DDX_Text(pDX, IDC_SINGLE_LON, m_fLon);
DDX_Text(pDX, IDC_SINGLE_MAG, m_fMag);
DDX_Text(pDX, IDC_SINGLE_DEPTH, m_fDepth);
DDX_DateTimeCtrl(pDX, IDC_DATE, m_Date);
DDX_DateTimeCtrl(pDX, IDC_TIME, m_Time);
DDX_CBIndex(pDX, IDC_SEI_SYMBOL, m_nSymbol);
DDX_Text(pDX, IDC_CIRCLE_R, m_fCircleR);
DDX_Text(pDX, IDC_CIRCLE_X, m_fCircleX);
DDX_Text(pDX, IDC_CIRCLE_Y, m_fCircleY);
DDX_CBIndex(pDX, IDC_SELECT_TYPE, m_nSelectType);
DDX_Check(pDX, IDC_MAG_MAX_USE, m_bMagMaxUse);
DDX_Text(pDX, IDC_MAG_MAX, m_fMagMax);
DDX_Text(pDX, IDC_MAG_MIN, m_fMagMin);
DDX_Check(pDX, IDC_MAG_MIN_USE, m_bMagMinUse);
DDX_Text(pDX, IDC_SINGLE_PLACE, m_sPlace);
DDX_CBIndex(pDX, IDC_PARA_TYPE, m_nParaType);
DDX_Check(pDX, IDC_OUTLINE, m_bOutline);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CGraphSeiAddDlg, CDialog)
//{{AFX_MSG_MAP(CGraphSeiAddDlg)
ON_BN_CLICKED(IDC_CLEAR, OnClear)
ON_BN_CLICKED(IDC_CONFIRM, OnConfirm)
ON_NOTIFY(NM_CLICK, IDC_SEISM_LIST, OnClickSeismList)
ON_BN_CLICKED(IDC_CAT_SELECT, OnCatSelect)
ON_BN_CLICKED(IDC_FILE_SAVE, OnFileSave)
ON_BN_CLICKED(IDC_FILE_LOAD, OnFileLoad)
ON_BN_CLICKED(IDC_ADD, OnAdd)
ON_BN_CLICKED(IDC_DELETE, OnDelete)
ON_BN_CLICKED(IDC_SEL_ALL, OnSelAll)
ON_BN_CLICKED(IDC_SEL_NONE, OnSelNone)
ON_BN_CLICKED(IDC_SEL_INVERT, OnSelInvert)
ON_BN_CLICKED(IDC_UPDATE_SEI, OnUpdateSei)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CGraphSeiAddDlg message handlers
BOOL CGraphSeiAddDlg::OnInitDialog()
{
CDialog::OnInitDialog();
m_ctrlSeismList.SetExtendedStyle(LVS_EX_CHECKBOXES|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
COleDateTime dt;
CString str;
m_ctrlSeismList.InsertColumn(0,"时间");
m_ctrlSeismList.InsertColumn(1,"经度");
m_ctrlSeismList.InsertColumn(2,"纬度");
m_ctrlSeismList.InsertColumn(3,"震级");
m_ctrlSeismList.InsertColumn(4,"深度");
m_ctrlSeismList.InsertColumn(5,"地名");
m_ctrlSeismList.SetColumnWidth(0,150);
m_ctrlSeismList.SetColumnWidth(1,60);
m_ctrlSeismList.SetColumnWidth(2,50);
m_ctrlSeismList.SetColumnWidth(3,40);
m_ctrlSeismList.SetColumnWidth(4,50);
m_ctrlSeismList.SetColumnWidth(5,150);
if(m_lSum>0)
{
//添加到列表中
for(int index=0;index<m_lSum;index++)
{
dt=m_Sei[index].dt;
str=dt.Format("%Y.%m.%d %H-%M-%S");
m_ctrlSeismList.InsertItem(index,str);
str.Format("%6.2f",m_Sei[index].lon);
m_ctrlSeismList.SetItemText(index,1,str);
str.Format("%5.2f",m_Sei[index].lat);
m_ctrlSeismList.SetItemText(index,2,str);
str.Format("%3.1f",m_Sei[index].mag);
m_ctrlSeismList.SetItemText(index,3,str);
str.Format("%5.1f",m_Sei[index].depth);
if(m_Sei[index].depth>=0)
m_ctrlSeismList.SetItemText(index,4,str);
m_ctrlSeismList.SetItemText(index,5,m_Sei[index].szPlace);
m_ctrlSeismList.SetCheck(index,m_Sei[index].bView);
}
}
m_oColorFill.SetColor(RGB(255,0,0));
m_oColorOutline.SetColor(RGB(0,0,255));
UpdateData(FALSE);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CGraphSeiAddDlg::OnClear()
{
UpdateData(TRUE);
m_ctrlSeismList.DeleteAllItems();
m_Sei.RemoveAll();
}
void CGraphSeiAddDlg::OnConfirm()
{
UpdateData(TRUE);
m_lSum=m_ctrlSeismList.GetItemCount();
int i;
//根据check设置
for(i=0;i<m_lSum;i++)
{
m_Sei[i].bView=m_ctrlSeismList.GetCheck(i);
}
//挑选地震,只能设置不能显示的条件,否则会破坏前面的条件选择
switch(m_nSelectType)
{
case 0: //不限定
break;
case 1: //圆形
if(fabs(m_fCircleR)<0.0005f)
{
AfxMessageBox("界定半径不能为0!");
return;
}
for(i=0;i<m_lSum;i++)
{
//单位:度
// if(jwdist(m_fCircleY,m_fCircleX,m_Sei[i].lat,m_Sei[i].lon)>(m_fCircleR*111.11))
//单位:公里
if(jwdist(m_fCircleY,m_fCircleX,m_Sei[i].lat,m_Sei[i].lon)>m_fCircleR)
{
m_Sei[i].bView=FALSE;
continue;
}
}
break;
case 2: //矩形
if(fabs(m_fCircleR)<0.0005f)
{
AfxMessageBox("界定半径不能为0!");
return;
}
for(i=0;i<m_lSum;i++)
{
//单位:公里
double x1=m_fCircleX-m_fCircleR/111.11;
double x2=m_fCircleX+m_fCircleR/111.11;
double y1=m_fCircleY-m_fCircleR/111.11;
double y2=m_fCircleY+m_fCircleR/111.11;
if((m_Sei[i].lat<y1)&&(m_Sei[i].lat>y2)&&(m_Sei[i].lon<x1)&&(m_Sei[i].lon>x2))
{
m_Sei[i].bView=FALSE;
continue;
}
}
break;
}
for(i=0;i<m_lSum;i++)
{
if((m_bMagMinUse==TRUE)&&(m_fMagMin>m_Sei[i].mag))
{
m_Sei[i].bView=FALSE;
continue;
}
if((m_bMagMaxUse==TRUE)&&(m_fMagMax<m_Sei[i].mag))
{
m_Sei[i].bView=FALSE;
continue;
}
}
CDialog::OnOK();
}
void CGraphSeiAddDlg::OnClickSeismList(NMHDR* pNMHDR, LRESULT* pResult)
{
UpdateData(TRUE);
CString str;
int index=m_ctrlSeismList.GetNextItem(-1,LVNI_SELECTED);
if(index<0)
return;
COleDateTime dt=m_Sei[index].dt;
m_Date=dt;
m_Time=dt;
m_fLon=m_Sei[index].lon;
m_fLat=m_Sei[index].lat;
m_fMag=m_Sei[index].mag;
m_fDepth=m_Sei[index].depth;
m_sPlace=m_Sei[index].szPlace;
UpdateData(FALSE);
*pResult = 0;
}
void CGraphSeiAddDlg::OnCatSelect()
{
}
void CGraphSeiAddDlg::OnFileSave()
{
UpdateData(TRUE);
//将列表中的地震保存到文件
int nYear,nMonth,nDay,nHour,nMin,nSec;
float fLat,fLon,fMag,fDepth;
COleDateTime dt;
CString str;
CFileDialog fd(FALSE,"*.sst",NULL,OFN_EXPLORER|OFN_HIDEREADONLY,
"地震目录文本文件(*.sst)|*.sst||",this);
if(fd.DoModal()!=IDOK)
return;
CString sFilePath=fd.GetPathName();
CStdioFile fsst;
if(!fsst.Open(sFilePath,CStdioFile::modeCreate|CStdioFile::modeWrite))
{
AfxMessageBox("不能建立文件!",MB_OK|MB_ICONSTOP);
return;
}
for(int i=0;i<m_ctrlSeismList.GetItemCount();i++)
{
dt=m_Sei[i].dt;
nYear=dt.GetYear();
nMonth=dt.GetMonth();
nDay=dt.GetDay();
nHour=dt.GetHour();
nMin=dt.GetMinute();
nSec=dt.GetSecond();
fLat=m_Sei[i].lat;
fLon=m_Sei[i].lon;
fMag=m_Sei[i].mag;
fDepth=m_Sei[i].depth;
str.Format("%4d %02d %02d %02d %02d %02d %7.4f %8.4f %3.1f %6.2f %s\n",
nYear,nMonth,nDay,nHour,nMin,nSec,fLat,fLon,fMag,fDepth,m_Sei[i].szPlace);
fsst.WriteString(str);
}
fsst.Close();
}
void CGraphSeiAddDlg::OnFileLoad()
{
UpdateData(TRUE);
//从文件中读地震参数添加到列表中
//将列表中的地震保存到文件
int nYear,nMonth,nDay,nHour,nMin,nSec,nSum;
float fLat,fLon,fMag,fDepth;
COleDateTime dt;
CString str,sLine,sPlace;
char temp[255];
CFileDialog fd(TRUE,"*.sst",NULL,OFN_EXPLORER|OFN_HIDEREADONLY,
"地震目录文本文件(*.sst)|*.sst||",this);
if(fd.DoModal()!=IDOK)
return;
CString sFilePath=fd.GetPathName();
CStdioFile fsst;
if(!fsst.Open(sFilePath,CStdioFile::modeRead))
{
AfxMessageBox("不能打开文件!",MB_OK|MB_ICONSTOP);
return;
}
while(1)
{
sLine="";
if(!fsst.ReadString(sLine)) break;
strcpy(temp,sLine);
sPlace="";
sscanf(temp,"%d %d %d %d %d %d %f %f %f %f %s",
&nYear,&nMonth,&nDay,&nHour,&nMin,&nSec,&fLat,&fLon,&fMag,&fDepth,sPlace);
SMapperSeisInfo si;
dt.SetDateTime(nYear,nMonth,nDay,nHour,nMin,nSec);
si.dt=dt;
si.lat=fLat;
si.lon=fLon;
si.mag=fMag;
si.depth=fDepth;
strcpy(si.szPlace,sPlace);
//保存
nSum=m_ctrlSeismList.GetItemCount();
m_Sei.SetAtGrow(nSum,si);
//显示
str=dt.Format("%Y.%m.%d %H-%M-%S");
m_ctrlSeismList.InsertItem(nSum,str);
str.Format("%6.2f",fLon);
m_ctrlSeismList.SetItemText(nSum,1,str);
str.Format("%5.2f",fLat);
m_ctrlSeismList.SetItemText(nSum,2,str);
str.Format("%3.1f",fMag);
m_ctrlSeismList.SetItemText(nSum,3,str);
str.Format("%5.1f",fDepth);
if(fDepth>=0)
m_ctrlSeismList.SetItemText(nSum,4,str);
m_ctrlSeismList.SetItemText(nSum,5,sPlace);
}
fsst.Close();
}
double CGraphSeiAddDlg::jwdist(double lat0, double lon0, double lat1, double lon1)
{
double pai=3.1425926, r0=6370., xl, dh, d0, d1, dd, dl;
xl = r0*sin(fabs(lat1-lat0)/360.*pai)*2.;
dh = fabs(lon1-lon0);
if(dh > 180.) dh = 360.-dh;
d0 = r0*cos(lat0/180.*pai)*sin(dh/360.*pai)*2.;
d1 = r0*cos(lat1/180.*pai)*sin(dh/360.*pai)*2.;
dd = sqrt(xl*xl+d0*d1);
if(dd/2. >= r0)
dl = pai*r0;
else
dl = asin(dd/2./r0)*r0*2.;
return dl;
}
void CGraphSeiAddDlg::OnAdd()
{
UpdateData();
SMapperSeisInfo si;
COleDateTime dt=COleDateTime(m_Date.GetYear(),m_Date.GetMonth(),m_Date.GetDay(),
m_Time.GetHour(),0,0);
si.dt=dt;
si.lat=m_fLat;
si.lon=m_fLon;
si.depth=m_fDepth;
si.mag=m_fMag;
strcpy(si.szPlace,m_sPlace);
//保存
int nSum=m_ctrlSeismList.GetItemCount();
m_Sei.SetAtGrow(nSum,si);
//显示
CString str=dt.Format("%Y.%m.%d %H-%M-%S");
m_ctrlSeismList.InsertItem(nSum,str);
str.Format("%6.2f",m_fLon);
m_ctrlSeismList.SetItemText(nSum,1,str);
str.Format("%5.2f",m_fLat);
m_ctrlSeismList.SetItemText(nSum,2,str);
str.Format("%3.1f",m_fMag);
m_ctrlSeismList.SetItemText(nSum,3,str);
str.Format("%5.1f",m_fDepth);
if(m_fDepth>=0)
m_ctrlSeismList.SetItemText(nSum,4,str);
m_ctrlSeismList.SetItemText(nSum,5,m_sPlace);
}
void CGraphSeiAddDlg::OnDelete()
{
UpdateData(TRUE);
int index=m_ctrlSeismList.GetNextItem(-1,LVNI_SELECTED);
if(index<0)
{
AfxMessageBox("必须从列表中选择一个地震!");
return;
}
if(AfxMessageBox("真的要删除此地震?",MB_YESNO)!=IDYES)
return;
//从列表中删除
m_ctrlSeismList.DeleteItem(index);
//从数据中删除
m_Sei.RemoveAt(index);
}
void CGraphSeiAddDlg::OnSelAll()
{
m_lSum=m_ctrlSeismList.GetItemCount();
for(int i=0;i<m_lSum;i++)
{
m_ctrlSeismList.SetCheck(i,TRUE);
}
}
void CGraphSeiAddDlg::OnSelNone()
{
m_lSum=m_ctrlSeismList.GetItemCount();
for(int i=0;i<m_lSum;i++)
{
m_ctrlSeismList.SetCheck(i,FALSE);
}
}
void CGraphSeiAddDlg::OnSelInvert()
{
m_lSum=m_ctrlSeismList.GetItemCount();
for(int i=0;i<m_lSum;i++)
{
m_ctrlSeismList.SetCheck(i,!m_ctrlSeismList.GetCheck(i));
}
}
void CGraphSeiAddDlg::OnUpdateSei()
{
int index=m_ctrlSeismList.GetNextItem(-1,LVNI_SELECTED);
if(index<0)
{
AfxMessageBox("必须从列表中选择一个地震!");
return;
}
UpdateData();
COleDateTime dt(m_Date.GetYear(),m_Date.GetMonth(),m_Date.GetDay(),
m_Time.GetHour(),m_Time.GetMinute(),m_Time.GetSecond());
SMapperSeisInfo si;
si.dt=dt;
si.lat=m_fLat;
si.lon=m_fLon;
si.depth=m_fDepth;
si.mag=m_fMag;
strcpy(si.szPlace,m_sPlace);
//保存
m_Sei.SetAtGrow(index,si);
//显示
CString str=dt.Format("%Y.%m.%d %H-%M-%S");
m_ctrlSeismList.SetItemText(index,0,str);
str.Format("%6.2f",m_fLon);
m_ctrlSeismList.SetItemText(index,1,str);
str.Format("%5.2f",m_fLat);
m_ctrlSeismList.SetItemText(index,2,str);
str.Format("%3.1f",m_fMag);
m_ctrlSeismList.SetItemText(index,3,str);
str.Format("%5.1f",m_fDepth);
if(m_fDepth>=0)
m_ctrlSeismList.SetItemText(index,4,str);
m_ctrlSeismList.SetItemText(index,5,m_sPlace);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -