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

📄 calcultateimgdlg.cpp

📁 基于小波的SAR斑点处理
💻 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 + -