📄 calcultateimgdlg.cpp
字号:
// CalcultateImgDlg.cpp : implementation file
//
#include "stdafx.h"
#include "RSIP.h"
#include "CalcultateImgDlg.h"
#include "ImgFunction.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CCalcultateImgDlg dialog
CCalcultateImgDlg::CCalcultateImgDlg(CWnd* pParent /*=NULL*/)
: CDialog(CCalcultateImgDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CCalcultateImgDlg)
m_calculateExpression = _T("");
m_imgHeight = 0;
m_imgWidth = 0;
//}}AFX_DATA_INIT
m_nImageType = 0;
m_nImageCount = 0;
m_aFileNameArray.RemoveAll();
m_nMaxLenInPixels = 0;
}
CCalcultateImgDlg::~CCalcultateImgDlg()
{
CString * pStr = NULL;
for(int i=0; i<m_aFileNameArray.GetSize(); i++)
{
pStr = (CString *)m_aFileNameArray.GetAt(i);
ASSERT(pStr != NULL);
delete pStr;
pStr = NULL;
}
m_aFileNameArray.RemoveAll();
}
void CCalcultateImgDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CCalcultateImgDlg)
DDX_Control(pDX, IDC_IMAGE_LIST, m_imgList);
DDX_Text(pDX, IDC_EXPRESSION, m_calculateExpression);
DDX_Text(pDX, IDC_IMAGE_HEIGHT, m_imgHeight);
DDX_Text(pDX, IDC_IMAGE_WIDTH, m_imgWidth);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CCalcultateImgDlg, CDialog)
//{{AFX_MSG_MAP(CCalcultateImgDlg)
ON_BN_CLICKED(IDC_ADD_IMAGE, OnAddImage)
ON_BN_CLICKED(IDC_DELETE_IMAGE, OnDeleteImage)
ON_BN_CLICKED(IDC_HELP_BUTTON, OnHelpButton)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CCalcultateImgDlg message handlers
void CCalcultateImgDlg::OnOK()
{
UpdateData();
if(m_nImageCount == 0)
{
MessageBox("参与计算的影象数为零!","错误",MB_OK|MB_ICONINFORMATION);
return;
}
if(m_calculateExpression.IsEmpty())
{
MessageBox("影象计算表达式为空!","错误",MB_OK|MB_ICONINFORMATION);
return;
}
char Express[2048];
int i,j;
int CurPosition = 0;
int LineLen;
int LeftDil,RightDil;
m_nTokenCount = 0;
m_nOptrCount = 0;
m_nOpndCount = 0;
LineLen = m_calculateExpression.GetLength();
//将"(-"转化为"(0-"
j=0;
for(i=0; i<LineLen; i++)
{
if(m_calculateExpression[i]=='(' && m_calculateExpression[i+1]=='-')
{
Express[j++]='(';
Express[j++]='0';
}
else
Express[j++] = m_calculateExpression[i];
}
Express[j]='\0';
m_calculateExpression.Empty();
m_calculateExpression = Express;
// 表达式解析
LineLen =strlen(Express);
for(i=0; i<LineLen; )
{
if(m_nTokenCount >= 128)
{
MessageBox("表达式过长!","错误",MB_OK|MB_ICONQUESTION);
return;
}
// 找出数字
if(isdigit(Express[i]) || Express[i]=='.')
{
CurPosition=i;
j = 0;
while(isdigit(Express[j+CurPosition]) || Express[j+CurPosition]=='.')
j++;
m_TheToken[m_nTokenCount].Type = NUMBER;
strncpy(m_TheToken[m_nTokenCount].Cont,Express+CurPosition,j);
m_TheToken[m_nTokenCount].Cont[j]='\0';
m_TheToken[m_nTokenCount].Number=(float)atof(m_TheToken[m_nTokenCount].Cont);
m_nTokenCount++;
m_nOpndCount++;
i+=j;
continue;
}
// 找出函数
for(j=0; j<FUNCTIONCOUNT; j++)
if(strnicmp(Express+i,Func[j],strlen(Func[j]))==0)
break;
if(j<FUNCTIONCOUNT)
{
m_TheToken[m_nTokenCount].Type = FUNCTION;
strcpy(m_TheToken[m_nTokenCount].Cont,Func[j]);
m_TheToken[m_nTokenCount].Flag = j;
m_nTokenCount++;
m_nOptrCount++;
i+=strlen(Func[j]);
continue;
}
// 找出括号、加、减、乘、除
if(Express[i] == '+' || Express[i] == '-' ||
Express[i] == '*' || Express[i] == '/' ||
Express[i] == '(' || Express[i] == ')')
{
m_TheToken[m_nTokenCount].Type = DELIMITER;
m_TheToken[m_nTokenCount].Cont[0] = Express[i];
switch(Express[i])
{
case '(':
m_TheToken[m_nTokenCount].Flag = 0;
break;
case ')':
m_TheToken[m_nTokenCount].Flag = 1;
break;
case '+':
m_TheToken[m_nTokenCount].Flag = 2;
break;
case '-':
m_TheToken[m_nTokenCount].Flag = 3;
break;
case '*':
m_TheToken[m_nTokenCount].Flag = 4;
break;
case '/':
m_TheToken[m_nTokenCount].Flag = 5;
break;
}
m_TheToken[m_nTokenCount].Cont[1] = '\0';
m_nTokenCount++;
m_nOptrCount++;
i++;
continue;
}
// 找出文件代号
if(Express[i]=='I' && isdigit(Express[i+1]))
{
CurPosition=i;
j = 1;
while(isdigit(Express[j+CurPosition]))
j++;
char fileNo[10];
strncpy(fileNo,Express+CurPosition+1,j-1);
CString * pTemp = (CString *)m_aFileNameArray.GetAt(atoi(fileNo)-1);
m_TheToken[m_nTokenCount].Type = ISFILENAME;
for(int k=0; k<pTemp->GetLength();k++)
{
m_TheToken[m_nTokenCount].Cont[k] = pTemp->GetAt(k);
}
m_TheToken[m_nTokenCount].Cont[k]='\0';
m_nTokenCount++;
m_nOpndCount++;
i+=j;
continue;
}
// 找出空格
if(IsWhite(Express[i]))
{
i++;
continue;
}
// 报错
MessageBox("表达式错误!\n\n出现未知符号。","错误",MB_OK|MB_ICONQUESTION);
return;
}
LeftDil = 0;
RightDil = 0;
if(m_nTokenCount<2)
{
MessageBox("表达式错误!","错误",MB_OK|MB_ICONQUESTION);
return;
}
// 检查左右括号
for(i=0; i<m_nTokenCount; i++)
{
if(m_TheToken[i].Type==DELIMITER && m_TheToken[i].Flag==0)
LeftDil++; // 左括号
else if(m_TheToken[i].Type==DELIMITER && m_TheToken[i].Flag==1)
RightDil++; // 右括号
if(i==0)
{
//Begin:Can not be "+,-,*,/,)"
if(m_TheToken[i].Type==DELIMITER && m_TheToken[i].Flag!=0)
{
MessageBox("表达式错误!","错误",MB_OK|MB_ICONQUESTION);
return;
}
}
else
{
//Error when ")(","FileName(","NUMBER("
if(m_TheToken[i].Type==DELIMITER && m_TheToken[i].Flag==0 &&
((m_TheToken[i-1].Type==DELIMITER && m_TheToken[i-1].Flag==1) ||
m_TheToken[i-1].Type==NUMBER || m_TheToken[i-1].Type==ISFILENAME))
{
MessageBox("表达式错误!","错误",MB_OK|MB_ICONQUESTION);
return;
}
//Error when "()","+)","-)","*)","/)","Function)"
else if(m_TheToken[i].Type==DELIMITER && m_TheToken[i].Flag==1 &&
((m_TheToken[i-1].Type==DELIMITER && m_TheToken[i-1].Flag!=1) ||
m_TheToken[i-1].Type==FUNCTION))
{
MessageBox("表达式错误!","错误",MB_OK|MB_ICONQUESTION);
return;
}
//Error when "++","-+","*+","/+" and "Function+",But right when "(+" and ")+"
else if(m_TheToken[i].Type==DELIMITER && (m_TheToken[i].Flag==2 || m_TheToken[i].Flag==3)
&& ((m_TheToken[i-1].Type==DELIMITER && (m_TheToken[i-1].Flag>=2 || m_TheToken[i-1].Flag==0))
|| m_TheToken[i-1].Type==FUNCTION))
{
MessageBox("表达式错误!","错误",MB_OK|MB_ICONQUESTION);
return;
}
//Error when "+/","-/","**","//","(/" and "Function/",But right ")/"
else if(m_TheToken[i].Type==DELIMITER && (m_TheToken[i].Flag==4 || m_TheToken[i].Flag==5)
&& ((m_TheToken[i-1].Type==DELIMITER && (m_TheToken[i-1].Flag>=2 || m_TheToken[i-1].Flag==0))
|| m_TheToken[i-1].Type==FUNCTION))
{
MessageBox("表达式错误!","错误",MB_OK|MB_ICONQUESTION);
return;
}
//Error when "Function,FileName",")FileName","FileName,FileName"
else if(m_TheToken[i].Type==ISFILENAME &&
(m_TheToken[i-1].Type==FUNCTION
|| (m_TheToken[i-1].Type==DELIMITER && m_TheToken[i-1].Flag==1)
|| m_TheToken[i-1].Type==ISFILENAME
|| m_TheToken[i-1].Type==NUMBER))
{
MessageBox("表达式错误!","错误",MB_OK|MB_ICONQUESTION);
return;
}
//Error when "Function,Number",")Number","FileName,Number"
else if(m_TheToken[i].Type==NUMBER && (m_TheToken[i-1].Type==FUNCTION
|| (m_TheToken[i-1].Type==DELIMITER && m_TheToken[i-1].Flag==1)
|| m_TheToken[i-1].Type==ISFILENAME
|| m_TheToken[i-1].Type==NUMBER))
{
MessageBox("表达式错误!","错误",MB_OK|MB_ICONQUESTION);
return;
}
//Error when ")Function","FileName,Function","Fuction,Function",ect.
else if(m_TheToken[i].Type==FUNCTION && (m_TheToken[i-1].Type==FUNCTION
|| (m_TheToken[i-1].Type==DELIMITER && m_TheToken[i-1].Flag==1)
|| m_TheToken[i-1].Type==ISFILENAME
|| m_TheToken[i-1].Type==NUMBER))
{
MessageBox("表达式错误!","错误",MB_OK|MB_ICONQUESTION);
return;
}
if(i==m_nTokenCount-1)
{
if((m_TheToken[i].Type==DELIMITER && m_TheToken[i].Flag!=1)
|| m_TheToken[i].Type==FUNCTION)
{
MessageBox("表达式错误!","错误",MB_OK|MB_ICONQUESTION);
return;
}
}
}
}
// 检查括号是否匹配
if(LeftDil!=RightDil)
{
MessageBox("表达式错误!","错误",MB_OK|MB_ICONQUESTION);
return;
}
CDialog::OnOK();
}
void CCalcultateImgDlg::OnAddImage()
{
CFileDialog fileDlg(TRUE,"*.DAT",
NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_ALLOWMULTISELECT,
"Image Files(*.dat)|*.dat||",this);
char lpstrFile[32764];
lpstrFile[0]='\0';
fileDlg.m_ofn.lpstrFile=lpstrFile;
fileDlg.m_ofn.nMaxFile=32764;
if ( fileDlg.DoModal() == IDOK )
{
POSITION pos = fileDlg.GetStartPosition();
while ( pos != NULL )
{
CString * lpstrPathName = new CString();
*lpstrPathName = fileDlg.GetNextPathName( pos );
if(lpstrPathName->GetLength()>m_nMaxLenInPixels)
m_nMaxLenInPixels = lpstrPathName->GetLength();
CString szInfFileName;
CFile infFile;
lpstrPathName->TrimLeft();
lpstrPathName->TrimRight();
szInfFileName = lpstrPathName->Left(lpstrPathName->GetLength()-4) + ".inf";
if(0 != infFile.Open(szInfFileName,CFile::modeRead))
{
CRSImage RSImage;
RSImage.LoadRsInfo(&infFile);
infFile.Close();
if(RSImage.m_nImgType == IMAGE_COMBINE ||
RSImage.m_nImgType == IMAGE_THEMATIC)
{
MessageBox("用彩色合成影象或专题影象进行计算无实际意义!");
delete lpstrPathName;
return;
}
if(m_nImageType == 0)
m_nImageType = RSImage.m_nImgType;
else
if(m_nImageType-RSImage.m_nImgType != 0)
{
MessageBox("图象类型不匹配!");
delete lpstrPathName;
return;
}
if(m_nImageCount == 0)
{
m_imgHeight = RSImage.m_nImgHeight;
m_imgWidth = RSImage.m_nImgWidth;
}
else
{
if(m_imgHeight-RSImage.m_nImgHeight!=0 ||
m_imgWidth-RSImage.m_nImgWidth!=0)
{
MessageBox("图象大小不匹配!");
delete lpstrPathName;
return;
}
}
CFile File;
if(0 == File.Open(*lpstrPathName,CFile::modeRead))
{
MessageBox("打不开数据文件!",
"错误",
MB_OK|MB_ICONINFORMATION);
delete lpstrPathName;
return;
}
if(File.GetLength() != m_imgWidth * m_imgHeight)
{
MessageBox("文件大小不匹配!",
"错误",
MB_OK|MB_ICONINFORMATION);
File.Close();
delete lpstrPathName;
return;
}
File.Close();
}
m_nImageCount ++;
char temp[5];
_itoa(m_nImageCount,temp,10);
CString str = temp;
str = "I" + str + "=" + (*lpstrPathName);
m_imgList.AddString(str);
m_imgList.SetCurSel(m_nImageCount-1);
m_aFileNameArray.Add(lpstrPathName);
}
CDC* pDC = GetDC();
ASSERT(pDC);
TEXTMETRIC tm;
CFont* pFont = GetFont();
pDC->GetTextMetrics(&tm);
CSize fontSize = pDC->GetTextExtent("w");
int nPixelNum = (m_nMaxLenInPixels+4)*fontSize.cx;
m_imgList.SetHorizontalExtent(nPixelNum);
UpdateData(FALSE);
}
}
void CCalcultateImgDlg::OnDeleteImage()
{
int nCurSel = m_imgList.GetCurSel();
if(nCurSel < 0)
return;
// 删除表项
CString *pszTemp;
pszTemp = (CString *)(m_aFileNameArray[nCurSel]);
delete pszTemp;
m_aFileNameArray.RemoveAt(nCurSel);
for(int i=nCurSel; i<m_nImageCount; i++)
m_imgList.DeleteString(nCurSel);
m_nImageCount --;
// 修改表项
for(i = nCurSel; i<m_nImageCount; i++)
{
char temp[5];
_itoa(i+1,temp,10);
CString str = temp;
pszTemp = (CString *)(m_aFileNameArray[i]);
str = "I" + str + "=" + (*pszTemp);
m_imgList.AddString(str);
}
// 选中第一个参加计算的影象
m_imgList.SetCurSel(0);
}
void CCalcultateImgDlg::OnHelpButton()
{
CString str = "影象计算操作:\n\n";
str = str+"1、支持“+、-、×、÷”运算;\n\n";
str = str+"2、支持括号(“(”、“〕”〕改变运算顺序和结合性;\n\n";
str = str+"3、支持数字(0-9〕和小数点(.〕;\n\n";
str = str+"4、支持“SIN、COS、LN、SQRT、EXP、SIGN、FABS、INT”运算;\n\n";
str = str+"5、各个影象以“I1、I2、...”代替。\n\n";
MessageBox(str);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -