typereformdlg.cpp

来自「用VC+SuperMap开发的校园GIS系统」· C++ 代码 · 共 327 行

CPP
327
字号
// TypeReformDlg.cpp : implementation file
//

#include "stdafx.h"
#include "CampusGis.h"
#include "TypeReformDlg.h"
#include "MainFrm.h"
#include "sodatasource.h"
#include "sodataset.h"
#include "sodatasetvector.h"
#include "soselection.h"
#include "sogeoline.h"
#include "sogeoregion.h"
#include "sogeometry.h"
#include "sorecordset.h"

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

/////////////////////////////////////////////////////////////////////////////
// CTypeReformDlg dialog


CTypeReformDlg::CTypeReformDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CTypeReformDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CTypeReformDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
}


void CTypeReformDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CTypeReformDlg)
	DDX_Control(pDX, IDC_TXTNEWDTNAME, m_txtNewDtName);
	DDX_Control(pDX, IDC_CHKDELSOURCEOBJECT, m_chkDelSourceObject);
	DDX_Control(pDX, IDC_CHKNEWDTNAME, m_chkNewDtName);
	DDX_Control(pDX, IDC_CMBDTNAME, m_cmbDtName);
	DDX_Control(pDX, IDC_CMBDSNAME, m_cmbDsName);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CTypeReformDlg, CDialog)
	//{{AFX_MSG_MAP(CTypeReformDlg)
	ON_CBN_SELCHANGE(IDC_CMBDSNAME, OnSelchangeCmbDsName)
	ON_BN_CLICKED(IDC_CHKNEWDTNAME, OnChkNewDtName)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTypeReformDlg message handlers

BOOL CTypeReformDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	//初始化
	long j;
	CMainFrame *pFrame=(CMainFrame *)::AfxGetMainWnd();
	m_pSuperWorkspace=&pFrame->m_SuperWorkspace;
	CsoDataSource objDs;
	CsoDatasetVector objDt;

	objDt=m_pSupermap->GetSelection().GetDataset();
	for(long i=1;i<=m_pSuperWorkspace->GetDatasources().GetCount();i++)
	{
		objDs=m_pSuperWorkspace->GetDatasources().GetItem(COleVariant(i));
		if(!objDs)
		{
			AfxMessageBox("打开数据源错误!");
			return FALSE;
		}
		m_cmbDsName.AddString(objDs.GetAlias());
		if(objDt.GetDataSourceAlias()==objDs.GetAlias())
			j=i-1;
	}
	m_cmbDsName.SetCurSel(j);
	if(m_bFlag)
		SetWindowText(_T("类型转换:线 -> 面"));
	else
		SetWindowText(_T("类型转换:面 -> 线"));

	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CTypeReformDlg::OnSelchangeCmbDsName() 
{
	//当选择的数据源发生改变时
	CsoDataSource objDs;
	CsoDataset objDt;

	objDs=GetDataSource();
	if(!objDs)
	{
		AfxMessageBox("打开数据源错误!");
		return;
	}
	m_cmbDtName.ResetContent();
	for(long i=1;i<=objDs.GetDatasets().GetCount();i++)
	{
		objDt=objDs.GetDatasets().GetItem(COleVariant(i));
		if(objDt)
		{
			switch(m_bFlag)
			{
				case TRUE://类型转换:线 -> 面
					if(objDt.GetType()==5/*scdRegion*/)
						m_cmbDtName.AddString(objDt.GetName());break;	
				case FALSE://类型转换:面 -> 线
					if(objDt.GetType()==3/*scdLine*/)
						m_cmbDtName.AddString(objDt.GetName());break;
			}
		}
	}
	if(m_cmbDtName.GetCount() > 0)
		m_cmbDtName.SetCurSel(0);
	objDt.ReleaseDispatch();
	objDs.ReleaseDispatch();
}

CsoDataSource CTypeReformDlg::GetDataSource()
{
	int index;
	CsoDataSource objDs;

	index=m_cmbDsName.GetCurSel();
	if(index < 0)
	{
		AfxMessageBox("请选择数据源!");
		return 0;
	}
	CString strDatasourceName;
	m_cmbDsName.GetLBText(index,strDatasourceName);
	objDs=m_pSuperWorkspace->GetDatasources().GetItem(COleVariant(strDatasourceName));
	return objDs;
}

void CTypeReformDlg::OnChkNewDtName() 
{
	//选择新数据集名称时
	if(m_chkNewDtName.GetCheck()==1)
	{
		m_txtNewDtName.EnableWindow();
		m_cmbDtName.EnableWindow(FALSE);
		m_txtNewDtName.SetFocus();
	}
	else
	{
		m_txtNewDtName.EnableWindow(FALSE);
		m_cmbDtName.EnableWindow();
	}
}

void CTypeReformDlg::OnOK() 
{
	//确定
	int i;
	BOOL bFirst;
	CsoDataSource objDestDs;//目标数据源
	CsoDataset objDestDt;	//目标数据集
	CsoDatasetVector objDestDtVector;
	CsoGeoLine objLine;
	CsoGeoRegion objRegion;
	CsoRecordset objSourceRt;//源RecordSet
	CsoRecordset objDestRt;//存放结果的RecordSet
	CString strtxtName;
	CString strcmbDtName;

	objDestDs=GetDataSource();
	if(!objDestDs)
	{
		AfxMessageBox("打开数据源错误!");
		return;
	}
	try{
	if(m_chkNewDtName.GetCheck()==1)//使用新数据集
	{
		m_txtNewDtName.GetWindowText(strtxtName);
		if(!objDestDs.IsAvailableDatasetName(strtxtName))
		{
			AfxMessageBox("数据集名称非法!");
			m_txtNewDtName.SetFocus();
			objDestDs.ReleaseDispatch();
			return;
		}
		else
		{
			long nType;
			switch(m_bFlag)
			{
				case TRUE:
					nType=5;/*scdRegion*/break;
				case FALSE:
					nType=3;/*scdLine*/  break;
			}
			objDestDt=objDestDs.CreateDataset(strtxtName,nType,NULL,NULL);
			if(!objDestDt)
			{
				AfxMessageBox("数据集创建失败!");
				objDestDs.ReleaseDispatch();
				return;
			}
			else
			{
				i=m_cmbDtName.AddString(strtxtName);
				m_cmbDtName.SetCurSel(i);
				objDestDtVector=(CsoDatasetVector)objDestDs.GetDatasets().GetItem(COleVariant(strtxtName));
				if(!objDestDtVector)
				{
					AfxMessageBox("数据集"+strtxtName+"错误!");
					return;
				}
				objDestDs.ReleaseDispatch();
				objDestDtVector.ReleaseDispatch();
			}
		}
	}
	else
	{
		i=m_cmbDtName.GetCurSel();
		if(i < 0)
		{
			AfxMessageBox("请给出数据集名称!");
			return;
		}
		m_cmbDtName.GetLBText(i,strcmbDtName);
		objDestDtVector=(CsoDatasetVector)objDestDs.GetDatasets().GetItem(COleVariant(strcmbDtName));
		if(!objDestDtVector)
		{
			AfxMessageBox("数据集"+strcmbDtName+"错误,无法继续!");
			return;
		}
	}
	//生成目标RecordSet
	objDestDtVector.Open();
	objDestRt=objDestDtVector.Query(_T(""),TRUE,NULL,_T(""));
	if(!objDestRt)
	{
		AfxMessageBox("错误!");
		return;
	}
	bFirst=TRUE;
	objSourceRt=m_pSupermap->GetSelection().ToRecordset(FALSE);
	if(!objSourceRt)
	{
		AfxMessageBox("所选对象的有关数据被损坏,无法继续!");
		objDestRt.ReleaseDispatch();
		objDestDtVector.ReleaseDispatch();
		return;
	}
	objSourceRt.MoveFirst();
	//进行相交、相并、异或、类型转换(线->面、面->线)、克隆操作
	long nCount;
	nCount=m_pSupermap->GetSelection().GetCount();
	switch(m_bFlag)
	{
		case TRUE:
			for(i=1;i<=nCount;i++)
			{
				objLine=(CsoGeoLine)objSourceRt.GetGeometry();
				if(!objLine)
				{
					AfxMessageBox("错误!");
					return;
				}
				objRegion=objLine.ConvertToRegion();
				if(!objRegion)
				{
					AfxMessageBox("错误!");
					return;
				}
				objDestRt.AddNew(objRegion);
				objDestRt.Update();
				objSourceRt.MoveNext();
			}
			break;
		case FALSE:
			for(i=1;i<=nCount;i++)
			{
				objRegion=(CsoGeoRegion)objSourceRt.GetGeometry();
				if(!objRegion)
				{
					AfxMessageBox("错误!");
					return;
				}
				objLine=objRegion.ConvertToLine();
				if(!objRegion)
				{
					AfxMessageBox("错误!");
					return;
				}
				objDestRt.AddNew(objLine);
				objDestRt.Update();
				objSourceRt.MoveNext();
			}
			break;
	}
	if(m_chkDelSourceObject.GetCheck()==1)
	{
		objSourceRt.MoveFirst();
		for(i=1;i<=objSourceRt.GetRecordCount();i++)
		{
			objSourceRt.Delete();
			objSourceRt.MoveNext();
		}
	}
	}
	catch(...)
	{}
	objLine.ReleaseDispatch();
	objRegion.ReleaseDispatch();
	objDestRt.ReleaseDispatch();
	objSourceRt.ReleaseDispatch();
	objDestDtVector.ReleaseDispatch();
	m_pSupermap->Refresh();
	CMainFrame *pFrame=(CMainFrame *)::AfxGetMainWnd();
	pFrame->GetManager()->Refresh();
	CDialog::OnOK();
}

⌨️ 快捷键说明

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