实现根据字符串获取CAD工作空间和图层
private static CadDataSource _instance = null;
// 获取实例互斥锁
private static readonly object _getInstanceMutexLocker = new object();
private CadDataSource() { }
public static CadDataSource CreateSingleton() {
if (_instance != null) return _instance;
lock (_getInstanceMutexLocker) {
if (_instance == null) _instance = new CadDataSource();
}
return _instance;
}
/// <summary>
/// 打开CAD工作空间
/// </summary>
/// <param name="workspaceDataSourceString">CAD文件全路径</param>
/// <returns>工作空间</returns>
public IWorkspace OpenWorkspace(string workspaceDataSourceString) {
IWorkspace pWorkspace = null;
IWorkspaceFactory workspaceFactory = WorkspaceFactoryWrapper.GetWorkspaceFactory(
"esriDataSourcesFile.CadWorkspaceFactory");
try {
pWorkspace = workspaceFactory.OpenFromFile(workspaceDataSourceString, 0);
}
catch {
}
return pWorkspace;
}
/// <summary>
/// 打开CAD图层
/// </summary>
/// <param name="layerDataSourceString">CAD文件全路径</param>
/// <returns>打开的CAD图层</returns>
public ILayer OpenLayer(string layerDataSourceString) {
ICadDrawingDataset cadDrawingDataset = GetCadDrawingDataset(layerDataSourceString);
if (cadDrawingDataset == null) return null;
int pos = layerDataSourceString.LastIndexOf('\\') + 1;
string cadFileName = layerDataSourceString.Substring(pos);
ICadLayer cadLayer = new CadLayerClass();
cadLayer.CadDrawingDataset = cadDrawingDataset;
cadLayer.Name = cadFileName;
return cadLayer;
}
/// <summary>
/// 获取CAD数据范围
/// </summary>
/// <param name="layerDataSourceString">CAD文件全路径</param>
/// <returns>CAD数据范围</returns>
public IEnvelope GetExtent(string layerDataSourceString) {
ICadDrawingDataset cadDrawingDataset = GetCadDrawingDataset(layerDataSourceString);
if (cadDrawingDataset == null) return null;
IGeoDataset geoDataset = cadDrawingDataset as IGeoDataset;
if (geoDataset == null) return null;
return geoDataset.Extent;
}
#region 私有方法
private ICadDrawingDataset GetCadDrawingDataset(string layerDataSourceString) {
if (string.IsNullOrEmpty(layerDataSourceString)) return null;
int pos = layerDataSourceString.LastIndexOf('\\') + 1;
string cadPathName = layerDataSourceString.Substring(0, pos);
string cadFileName = layerDataSourceString.Substring(pos);
try {
IFeatureWorkspace featureWorkspace = OpenWorkspace(cadPathName) as IFeatureWorkspace;
if (featureWorkspace == null) return null;
ICadDrawingWorkspace cadDrawingWorkspace = featureWorkspace as ICadDrawingWorkspace;
ICadDrawingDataset cadDrawingDataset = cadDrawingWorkspace.OpenCadDrawingDataset(cadFileName);
return cadDrawingDataset;
}
catch {
return null;
}
}
#endregion