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 + -
显示快捷键?