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

📄 adddata.cpp

📁 在vc环境下
💻 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 + -