⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 calculatedlg.cpp

📁 基于小波的SAR斑点处理
💻 CPP
字号:
// CalculateDlg.cpp : implementation file
//

#include "stdafx.h"
#include "RSIP.h"
#include "ImgFunction.h"
#include "CalculateDlg.h"
#include "RSImage.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CCalculateDlg dialog


CCalculateDlg::CCalculateDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CCalculateDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CCalculateDlg)
	m_nImgWidth = 0;
	m_nImgHeight = 0;
	//}}AFX_DATA_INIT
	m_nImageType = 0;
	m_szExpression.Empty();
}


void CCalculateDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CCalculateDlg)
	DDX_Control(pDX, IDC_FUNC_COMBO, m_Function);
	DDX_Control(pDX, 1101, m_Expression);
	DDX_Text(pDX, 1102, m_nImgWidth);
	DDX_Text(pDX, 1103, m_nImgHeight);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CCalculateDlg, CDialog)
	//{{AFX_MSG_MAP(CCalculateDlg)
	ON_BN_CLICKED(IDC_SUBSTRACT, OnSubstract)
	ON_BN_CLICKED(IDC_RIGHT, OnRight)
	ON_BN_CLICKED(IDC_MULTIPLE, OnMultiple)
	ON_BN_CLICKED(IDC_LEFT, OnLeft)
	ON_BN_CLICKED(IDC_DEVIDE, OnDevide)
	ON_BN_CLICKED(IDC_BROWSEFILE, OnBrowsefile)
	ON_BN_CLICKED(IDC_ADD, OnAdd)
	ON_CBN_SELCHANGE(IDC_FUNC_COMBO, OnSelchangeFuncCombo)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CCalculateDlg message handlers

void CCalculateDlg::OnOK() 
{
	m_Expression.GetWindowText(m_szExpression);
	if(m_szExpression.IsEmpty())
	{
		MessageBox("影象计算表达式为空!","错误",MB_OK|MB_ICONINFORMATION);
		return;
	}

	char Express[2048];
	m_nTokenCount = 0;
	int i,j;
	int CurPosition = 0;
	int LineLen;
	int LeftDil,RightDil;
	m_nOptrCount=0;
	m_nOpndCount=0;
	
	LineLen = m_szExpression.GetLength();

	//将"(-"转化为"(0-"
	j=0;
	for(i=0; i<LineLen; i++)
	{
		if(m_szExpression[i]=='(' && m_szExpression[i+1]=='-')
		{
			Express[j++]='(';
			Express[j++]='0';
		}
		else
			Express[j++] = m_szExpression[i];
	}
	Express[j]='\0';
	m_szExpression.Empty();
	m_szExpression = 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(isalpha(Express[i]))
		{
			CurPosition=i;
			j = 0;
			//Valid File Name
			while(isalpha(Express[j+CurPosition]) || Express[j+CurPosition]=='.' || 
				Express[j+CurPosition]=='\\' ||
				Express[j+CurPosition]==':' ||
				Express[j+CurPosition]=='_' ||
				Express[j+CurPosition]=='~' ||
				isdigit(Express[j+CurPosition]))
				j++;
			m_TheToken[m_nTokenCount].Type = ISFILENAME;
			strncpy(m_TheToken[m_nTokenCount].Cont,Express+CurPosition,j);
			m_TheToken[m_nTokenCount].Cont[j]='\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;
	}
	
	/*
	//Check File Exist
	CFile File;
	for(i=0;i<m_nTokenCount;i++)
	{
		if(m_TheToken[i].Type==ISFILENAME)
		{
			if(0==File.Open(m_TheToken[i].Cont,CFile::modeRead))
			{
				char Info[128];
				sprintf(Info,"文件 %s 不存在!",m_TheToken[i].Cont);
				MessageBox(Info,"错误",MB_OK|MB_ICONQUESTION);
				return;
			}
			File.Close();
		}
	}
	*/
	
	CDialog::OnOK();
}

void CCalculateDlg::OnSubstract() 
{
	m_Expression.ReplaceSel( _T("-") );	
}

void CCalculateDlg::OnRight() 
{
	m_Expression.ReplaceSel( _T(")") );	
}

void CCalculateDlg::OnMultiple() 
{
	m_Expression.ReplaceSel( _T("*") );	
}

void CCalculateDlg::OnLeft() 
{
	m_Expression.ReplaceSel( _T("(") );	
}

void CCalculateDlg::OnDevide() 
{
	m_Expression.ReplaceSel( _T("/") );
}

void CCalculateDlg::OnBrowsefile() 
{
	CFileDialog fileDlg(TRUE,"dat",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, 
		"Image Files(*.dat)|*.dat||",this);
	if(fileDlg.DoModal() == IDOK)
	{
		CString fileName = fileDlg.GetPathName();
		CFile File;
		if(0 == File.Open(fileName,CFile::modeRead))
		{
			MessageBox("不能打开该图象文件!\n\n或许图象文件不存在!");
			return;
		}

		fileName.TrimLeft();
		fileName.TrimRight();
		int length = fileName.GetLength();
		CString infFileName = fileName.Left(length-4) + ".inf";

		CFile infFile;
		if(0 != infFile.Open(infFileName,CFile::modeRead))
		{
			CRSImage RSImage;
			RSImage.LoadRsInfo(&infFile);
			infFile.Close();

			if(RSImage.m_nImgType == IMAGE_COMBINE)
			{
				MessageBox("用彩色合成影象进行计算无实际意义!");
				return;
			}
			if(m_nImageType == 0)
			{
				m_nImageType = RSImage.m_nImgType;
			}
			else
			{
				if(m_nImageType-RSImage.m_nImgType != 0)
				{
					MessageBox("图象类型不匹配!");
					return;
				}
			}
			

			if(m_nImgHeight==0 && m_nImgWidth==0)
			{
				m_nImgHeight = RSImage.m_nImgHeight;
				m_nImgWidth = RSImage.m_nImgWidth;
			}
			else
			{
				if(m_nImgHeight-RSImage.m_nImgHeight!=0 ||
					m_nImgWidth-RSImage.m_nImgWidth!=0)
				{
					MessageBox("图象大小不匹配!");
					return;
				}
			}
		}
		else
		{
			MessageBox("找不到该图象的信息文件(*.inf)!");
			return;
		}

		m_Expression.ReplaceSel(fileName);
		
		UpdateData(FALSE);
	}
}

void CCalculateDlg::OnAdd() 
{
	m_Expression.ReplaceSel( _T("+") );
}

void CCalculateDlg::OnSelchangeFuncCombo() 
{
	CString text;
	m_Function.GetLBText(m_Function.GetCurSel(),text);
	m_Expression.ReplaceSel(text);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -