📄 adddata.cpp
字号:
// AddData.cpp : Implementation of CAddData
#include "stdafx.h"
#include "AddData.h"
#include "Geobase.h"
#include <vector>
// CAddData
/*
RasterDataset have a bug in 8.3(build 800) version ArcGis:
Cann't return a valid type when use get_Type() in the IDataset.
This problem is fixed in the 9.0 (build 560)
Add a defination:_ARCGIS_VERSION_83800 to solve this situation.
*/
STDMETHODIMP CAddData::OnClick()
{
HRESULT hr;
try
{
//////////////////////////////////////////////////////////////////////////
//Show a Gx Dialog, need OleInitialize() instead of CoInitialize()
IGxDialogPtr cpDlg;
hr=CoCreateInstance(CLSID_GxDialog,NULL,CLSCTX_INPROC,IID_IGxDialog,(void**)&cpDlg);
if (FAILED(hr))
{
_com_issue_error(hr);
}
//Get Parent Windows's HWND
IActiveViewPtr cpActiveView;
hr=m_hookHelper.get_ActiveView(&cpActiveView);
if (FAILED(hr)) _com_issue_error(hr);
IScreenDisplayPtr cpScreen;
hr=cpActiveView->get_ScreenDisplay(&cpScreen);
if (FAILED(hr))
{
_com_issue_error(hr);
}
OLE_HANDLE hWnd;
hr=cpScreen->get_hWnd(&hWnd);
assert(SUCCEEDED(hr));
//set up filters on the files that will be browsed (here only allow shapefile)
IGxObjectFilterPtr cpShpFilter;
IGxObjectFilterPtr cpRasterFilter;
hr=CoCreateInstance(CLSID_GxFilterShapefiles,
NULL,CLSCTX_INPROC,IID_IGxObjectFilter,(void**)&cpShpFilter);
if (FAILED(hr))
{
_com_issue_error(hr);
}
hr=CoCreateInstance(CLSID_GxFilterRasterDatasets,NULL,CLSCTX_INPROC,
IID_IGxObjectFilter,(void**)&cpRasterFilter);
if (FAILED(hr))
{
_com_issue_error(hr);
}
IGxObjectFilterCollectionPtr cpFilters;
cpFilters=cpDlg;
hr=cpFilters->RemoveAllFilters();
hr=cpFilters->AddFilter(cpShpFilter,VARIANT_FALSE);
hr=cpFilters->AddFilter(cpRasterFilter,VARIANT_FALSE);
//Set Dialog
hr=cpDlg->put_AllowMultiSelect(VARIANT_TRUE);
assert(SUCCEEDED(hr));
hr=cpDlg->put_Title(CComBSTR(_T("请选择要打开的文件...")));
assert(SUCCEEDED(hr));
hr=cpDlg->put_ButtonCaption(CComBSTR(_T("打开")));
//Open Modal Dialog wait User select
VARIANT_BOOL boolValue;
IEnumGxObjectPtr cpEnumSelect;
hr=cpDlg->DoModalOpen(hWnd,&cpEnumSelect,&boolValue);
if (FAILED(hr))
{
_com_issue_error(hr);
}
//User Cancel the Dialog
if (VARIANT_FALSE==boolValue)
{
return S_FALSE;
}
//////////////////////////////////////////////////////////////////////////
//got a valid selection from the GX Dialog, now extract the feature classes datasets etc.
//loop through the selection enumeration
std::vector<ILayerPtr> vecLayers;
cpEnumSelect->Reset();
IGxObjectPtr cpGxObject;
hr=cpEnumSelect->Next(&cpGxObject);
assert(SUCCEEDED(hr));
while (cpGxObject)
{
// We could be handed objects of various types, work out what types we have been handed and then open
//them up and add a feature layer to handle them
IGxDatasetPtr cpGxDataset;
cpGxDataset=cpGxObject;
esriDatasetType enumDTType;
hr=cpGxDataset->get_Type(&enumDTType);
if (esriDTFeatureClass==enumDTType) //here means Shaplefile
{
IFeatureClassPtr cpFeatureClass;
IDatasetPtr cpDataset;
hr=cpGxDataset->get_Dataset(&cpDataset);
cpFeatureClass=cpDataset;
IFeatureLayerPtr cpFeatureLayer; //FeatureLayer
hr=CoCreateInstance(CLSID_FeatureLayer,NULL,CLSCTX_INPROC,
IID_IFeatureLayer,(void**)&cpFeatureLayer);
if (FAILED(hr))
{
_com_issue_error(hr);
}
hr=cpFeatureLayer->putref_FeatureClass(cpFeatureClass);
CComBSTR cbName;
hr=cpFeatureClass->get_AliasName(&cbName);
assert(SUCCEEDED(hr));
hr=cpFeatureLayer->put_Name(cbName);
ILayerPtr cpLayer=cpFeatureLayer;
vecLayers.push_back(cpLayer);
}
else if (esriDTRasterDataset==enumDTType) //Raseter file
{
IRasterDatasetPtr cpRasterDS;
IDatasetPtr cpDataset; //RasterDataset
hr=cpGxDataset->get_Dataset(&cpDataset);
cpRasterDS=cpDataset;
IRasterLayerPtr cpRasterLayer; //RasterLayer
hr=CoCreateInstance(CLSID_RasterLayer,NULL,CLSCTX_INPROC,
IID_IRasterLayer,(void**)&cpRasterLayer);
if (FAILED(hr))
{
_com_issue_error(hr);
}
hr=cpRasterLayer->CreateFromDataset(cpRasterDS);
assert(SUCCEEDED(hr));
ILayerPtr cpLayer=cpRasterLayer;
vecLayers.push_back(cpLayer);
}
else
{
CString strMessage;
strMessage.LoadString(ID_APP_ERROR_NO_SUPPORT_DATA_TYPE);
::MessageBox(NULL,strMessage,_T(""),MB_OK);
}
cpGxObject=NULL;
hr=cpEnumSelect->Next(&cpGxObject);
assert(SUCCEEDED(hr));
}
//Add to MapControl,show it
for (unsigned int i=0;i<vecLayers.size();i++)
{
AddLayerToMap(vecLayers[i]);
}
hr=cpActiveView->Refresh();
}
catch (_com_error& e)
{
return e.Error();
}
return S_OK;
}
void CAddData::AddLayerToMap(ILayerPtr& cpLayer)
{
IMapPtr cpMap;
HRESULT hr;
hr=m_hookHelper.get_FocusMap(&cpMap);
_hr_handle(hr);
if (IsExits(cpLayer,cpMap)) //Layer has exists in the map
return;
hr=cpMap->AddLayer(cpLayer);
//long layerCount;
//hr=cpMap->get_LayerCount(&layerCount);
//hr=cpMap->MoveLayer(cpLayer,layerCount-1); //add layer to the bottom
assert(SUCCEEDED(hr));
}
BOOL CAddData::IsExits(ILayerPtr& cpLayer,IMapPtr& cpMap)
{
CString strOriginPath,strOriginName;
esriDatasetType enumOriginType;
IDatasetPtr cpOriginDataset;
HRESULT hr;
#ifdef _ARCGIS_VERSION_83800
enumOriginType=esriDTAny;
#endif
GetLayerSource(cpLayer,strOriginPath,strOriginName);
cpOriginDataset=cpLayer;
hr=cpOriginDataset->get_Type(&enumOriginType);
long layerCount;
hr=cpMap->get_LayerCount(&layerCount);
for (long i=0;i<layerCount;i++)
{
CString strExistPath,strExistName;
esriDatasetType enumExistType;
ILayerPtr cpExistLayer;
IDatasetPtr cpExistDataset;
#ifdef _ARCGIS_VERSION_83800
enumExistType=esriDTAny;
#endif
hr=cpMap->get_Layer(i,&cpExistLayer);
cpExistDataset=cpExistLayer;
hr=cpExistDataset->get_Type(&enumExistType);
GetLayerSource(cpExistLayer,strExistPath,strExistName);
if (strOriginPath==strExistPath&&
strOriginName==strExistName&&
enumOriginType==enumExistType) //ensure two layer is equal through layer's source(path+name) and type
return TRUE;
}
return FALSE;
}
void CAddData::GetLayerSource(const ILayerPtr& cpLayer,CString& strPath,CString& strName)
{
if (NULL==cpLayer)
return;
//////////////////////////////////////////////////////////////////////////
//GET Layer's source(include path and name)
IDataLayerPtr cpDataLayer;
cpDataLayer=cpLayer;
INamePtr cpName;
IDatasetNamePtr cpDatasetName;
HRESULT hr;
hr=cpDataLayer->get_DataSourceName(&cpName);
if (FAILED(hr))
{
_com_issue_error(hr);
}
cpDatasetName=cpName;
CComBSTR cbName,cbPath;
hr=cpDatasetName->get_Name(&cbName);
assert(SUCCEEDED(hr));
IWorkspaceNamePtr cpWorkName;
hr=cpDatasetName->get_WorkspaceName(&cpWorkName);
if (FAILED(hr))
{
_com_issue_error(hr);
}
hr=cpWorkName->get_PathName(&cbPath);
assert(SUCCEEDED(hr));
strName=(CString)cbName;
strPath=(CString)cbPath;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -