zoukankan      html  css  js  c++  java
  • ARC GIS 打开cad文件的几种方法

    收集资料如下:

      打开cad文件的几种方法

      方法一、

      IWorkspaceFactory pWorkspaceFactory;

      IFeatureWorkspace pFeatureWorkspace;

      IFeatureLayer pFeatureLayer;

      IFeatureDataset pFeatureDataset;

      //打开CAD数据集

      pWorkspaceFactory = new CadWorkspaceFactoryClass();

      pFeatureWorkspace = (IFeatureWorkspace)pWorkspaceFactory.OpenFromFile(directoryPath, 0);

      //打开一个要素集

      pFeatureDataset = pFeatureWorkspace.OpenFeatureDataset(fileName);

      //IFeaturClassContainer可以管理IFeatureDataset中的每个要素类

      IFeatureClassContainer pFeatureClassContainer = (IFeatureClassContainer)pFeatureDataset;

      //对CAD文件中的要素进行遍历处理

      for (int i = 0; i < pFeatureClassContainer.ClassCount - 1; i++)

      {

      IFeatureClass pFeatureClass = pFeatureClassContainer.get_Class(i);

      if (pFeatureClass.FeatureType == esriFeatureType.esriFTAnnotation)

      {

      //如果是注记,则添加注记层

      pFeatureLayer = new CadAnnotationLayerClass();

      }

      else//如果是点、线、面,则添加要素层

      {

      pFeatureLayer = new FeatureLayerClass();

      pFeatureLayer.Name = pFeatureClass.AliasName;

      pFeatureLayer.FeatureClass = pFeatureClass;

      this.axmc_Main.Map.AddLayer(pFeatureLayer);

      this.axmc_Main.ActiveView.**();

      }

      }

      方法二、

      //--定义工作空间,并用CadWorkspaceFactoryClass()实例化它

      IWorkspaceFactory pWorkspaceFactory = new CadWorkspaceFactoryClass();

      //--打开相应的工作空间,并赋值给要素空间,OpenFromFile()

      //--中的参数为CAD文件夹的路径

      IFeatureWorkspace pFeatureWorkspace = pWorkspaceFactory.OpenFromFile(directoryPath, 0) as IFeatureWorkspace;

      /*--打开线要素类,如果要打开点类型的要素,需要把下边的代码该成:

      *-- IFeatureClass pFeatureClass = pFeatureWorkspace.OpenFeatureClass (fileName + ":point");

      *-- 由此可见fileName为CAD图的名字,后边加上要打开的要素类的类型,中间用冒号  

      *-- 隔开,大家可以想想多边形和标注是怎么打开的。 */

      //point polyline

      IFeatureClass pFeatureClass = pFeatureWorkspace.OpenFeatureClass(fileName + ":point");

      IFeatureLayer pFeatureLayer = new FeatureLayerClass();

      pFeatureLayer.FeatureClass = pFeatureClass;

      this.axmc_Main.Map.AddLayer(pFeatureLayer);

      this.axmc_Main.ActiveView.**();

      方法三、

      /*--下边的两行代码是定义一个CAD工作空间,然后打开它,但这次不是赋值给

      --IFeatureWorkspace对象,而是赋值给IWorkspace定义的对象*/

      IWorkspaceFactory pWorkspaceFactory = new CadWorkspaceFactoryClass();

      IWorkspace pWorkspace = pWorkspaceFactory.OpenFromFile(directoryPath, 0);

      //--定义一个CAD画图空间,并把上边打开的工作空间赋给它

      ICadDrawingWorkspace pCadDrawingWorkspace = pWorkspace as ICadDrawingWorkspace;

      //--定义一个CAD的画图数据集,并且打开上边指定的工作空间中一幅CAD图

      //--然后赋值给CAD数据集

      ICadDrawingDataset pCadDrawingDataset = pCadDrawingWorkspace.OpenCadDrawingDataset(fileName);

      //--通过ICadLayer类,把上边得到的CAD数据局赋值给ICadLayer类对象的

      //--CadDrawingDataset属性

      ICadLayer pCadLayer = new CadLayerClass();

      pCadLayer.CadDrawingDataset = pCadDrawingDataset;

      //--利用MapControl加载CAD层

      this.axmc_Main.Map.AddLayer(pCadLayer);

      this.axmc_Main.ActiveView.**();

      方法四、

      IWorkspaceFactory pWorkspaceFactory = new CadWorkspaceFactoryClass();

      IFeatureWorkspace pFeatureWorkspace = pWorkspaceFactory.OpenFromFile(directoryPath, 0) as IFeatureWorkspace;

      IFeatureDataset pFeatureDataset = pFeatureWorkspace.OpenFeatureDataset(fileName);

      IFeatureClassContainer pFeatureClassContainer = (IFeatureClassContainer)pFeatureDataset;

      for (int i = 0; i < pFeatureClassContainer.ClassCount - 1; i++)

      {

      IFeatureClass pFeatureClass = pFeatureClassContainer.get_Class(i);

      IFeatureLayer pFeatureLayer = new FeatureLayerClass();

      pFeatureLayer.FeatureClass = pFeatureClass;

      //ICadLayer pCadLayer = new CadLayerClass();

      //pCadLayer = pFeatureLayer as ICadLayer;

      this.axmc_Main.Map.AddLayer(pFeatureLayer);

      this.axmc_Main.ActiveView.**();

      }

      方法五、

      //Add passed file to MapControl

      ICadDrawingDataset pCadDrawingDataset = GetCadDrawingDataset(directoryPath, fileName);

      if (pCadDrawingDataset == null) return;

      ICadLayer pCadLayer = new CadLayerClass();

      pCadLayer.CadDrawingDataset = pCadDrawingDataset;

      pCadLayer.Name = fileName;

      this.axmc_Main.AddLayer(pCadLayer, 0);

      /// <summary>

      /// 获取记录集

      /// </summary>

      /// <param name="directoryPath"></param>

      /// <param name="fileName"></param>

      /// <returns></returns>

      private ICadDrawingDataset GetCadDrawingDataset(string directoryPath, string fileName)

      {

      //Create a WorkspaceName object

      IWorkspaceName pWorkspaceName = new WorkspaceNameClass();

      pWorkspaceName.WorkspaceFactoryProgID = "esriDataSourcesFile.CadWorkspaceFactory";

      pWorkspaceName.PathName = directoryPath;

      //Create a CadDrawingName object

      IDatasetName pDatasetName = new CadDrawingNameClass();

      pDatasetName.Name = fileName;

      pDatasetName.WorkspaceName = pWorkspaceName;

      //Open the CAD drawing

      IName pName = (IName)pDatasetName;

      return (ICadDrawingDataset)pName.Open();

      }

      需要注意

      如果你的ArcGIS版本是V9.2的话,可能是因为你的文件名中含有中文字符的原因.据我所知,在ArcGIS9.2中无法显示文件名含有中文字符的CAD文件.你可以在ArcMap中直接打开试试,如果也无法显示的话,可能是文件名的问题(注:路径中也不能含有中文字符).

      GIS for Web应用开发之道

      插件式GIS应用框架的设计与实现

      public void esriDataSourcesFile_ICadDrawingDataset_Example(string nameOfFile, string nameOfCadDrawing)

      {

      //Set the Workspace Factory

      IWorkspaceFactory workspaceFactory = new ESRI.ArcGIS.DataSourcesFile.CadWorkspaceFactoryClass();

      //Open the Workspace

      IWorkspace workspace = workspaceFactory.OpenFromFile(nameOfFile, 0);

      //set the CadDrawingWorkspace

      ESRI.ArcGIS.DataSourcesFile.ICadDrawingWorkspace cadDrawingWorkspace = (ESRI.ArcGIS.DataSourcesFile.ICadDrawingWorkspace)workspace;

      //open the CadDrawingDataset

      ESRI.ArcGIS.DataSourcesFile.ICadDrawingDataset cadDrawingDataset = cadDrawingWorkspace.OpenCadDrawngDataset(nameOfCadDrawing);

      //create the CadLayer

      ESRI.ArcGIS.Carto.ICadLayer cadLayer = new ESRI.ArcGIS.Carto.CadLayerClass();

      //set the CadLayer to the CadDrawingDataset

      cadLayer.CadDrawingDataset = cadDrawingDataset;

      //list if the CadDrawingDataset exists

      Console.WriteLine("Does drawing exist: {0}" , cadLayer.CadDrawingDataset.Exists );

      //list the CadDrawingDataset FilePath

      Console.WriteLine("CAD Drawing Path: {0}" , cadLayer.CadDrawingDataset.FilePath );

      //list if the CadDrawingDataset is 2d

      Console.WriteLine("Is Drawing 2d?: {0}" , cadLayer.CadDrawingDataset.Is2d);

      //list if the CadDrawingDataset is 3d

      Console.WriteLine("Is Drawing 3d?: {0}" , cadLayer.CadDrawingDataset.Is3d );

      //list if the CadDrawingDataset is an AutoCAD drawing file

      Console.WriteLine("Is Drawing from AutoCAD?: {0}" , cadLayer.CadDrawingDataset.IsAutoCad );

      //list if the CadDrawingDataset is an MicroSation drawing file

      Console.WriteLine("Is Drawing from MicroStation?: {0}" , cadLayer.CadDrawingDataset.IsDgn); }

      中间过程实验代码:

      实验1

      public static string AddCADLayer(Map map1, Toc toc)

      {

      // 得到服务器上下文对象

      MapFunctionality agsMapFunctionlity = map1.GetFunctionality(1) as MapFunctionality;

      MapResourceLocal localMapResource = (MapResourceLocal)agsMapFunctionlity.Resource;

      ESRI.ArcGIS.Server.IServerContext mapContext = localMapResource.ServerContextInfo.ServerContext;

      //// 增加图层

      //ESRI.ArcGIS.Carto.FeatureLayer pFeatureLayer = null;

      //IFeatureLayer pFeatureLayer;

      //打开CAD数据集

      IWorkspaceFactory factory = (IWorkspaceFactory)mapContext.CreateObject("esriDataSourcesFile.CADWorkspaceFactory");

      //pWorkspaceFactory = new CadWorkspaceFactoryClass();

      //pWorkspaceFactory = new pWorkspaceFactory();

      ESRI.ArcGIS.DataSourcesFile.ICadDrawingWorkspace pFeatureWorkspace = (ESRI.ArcGIS.DataSourcesFile.ICadDrawingWorkspace)factory.OpenFromFile(@"C:\Inetpub\wwwroot\NorthAmerica", 0);

      //IFeatureWorkspace pFeatureWorkspace = (IFeatureWorkspace)factory.OpenFromFile(@"C:\Inetpub\wwwroot\NorthAmerica", 0);

      //打开一个要素集

      ESRI.ArcGIS.DataSourcesFile.ICadDrawingDataset pFeatureDataset = (ESRI.ArcGIS.DataSourcesFile.ICadDrawingDataset)pFeatureWorkspace.OpenCadDrawingDataset("New_Shapefile_ExportCAD.DWG");

      //IFeaturClassContainer可以管理IFeatureDataset中的每个要素类

      ESRI.ArcGIS.Carto.ICadLayer pFeatureClassContainer = new ESRI.ArcGIS.Carto.CadLayerClass();

      pFeatureClassContainer.CadDrawingDataset = pFeatureDataset;

      //IFeatureClassContainer pFeatureClassContainer = (IFeatureClassContainer)pFeatureDataset;

      //对CAD文件中的要素进行遍历处理

      //for (int i = 0; i < pFeatureClassContainer.ClassCount - 1; i++)

      //{

      // IFeatureClass pFeatureClass = pFeatureClassContainer.get_Class(i);

      // if (pFeatureClass.FeatureType == esriFeatureType.esriFTAnnotation)

      // {

      // //如果是注记,则添加注记层

      // pFeatureLayer = (ESRI.ArcGIS.Carto.FeatureLayer)mapContext.CreateObject("esriCarto.CadAnnotationLayerClass");

      // }

      // else//如果是点、线、面,则添加要素层

      // {

      // pFeatureLayer = (ESRI.ArcGIS.Carto.FeatureLayer)mapContext.CreateObject("esriCarto.CadFeatureLayer");

      // pFeatureLayer.Name = pFeatureClass.AliasName;

      // }

      //}

      ESRI.ArcGIS.Carto.IMapServerObjects mapServerObjects = localMapResource.MapServer as ESRI.ArcGIS.Carto.IMapServerObjects;

      ESRI.ArcGIS.Carto.IMap map = mapServerObjects.get_Map(localMapResource.DataFrame) as ESRI.ArcGIS.Carto.IMap;

      //if (pFeatureLayer != null)

      //{

      map.AddLayer(pFeatureClassContainer);

      // //map.MoveLayer(pFeatureLayer, map.LayerCount - 1);

      //}

      //刷新服务器对象,响应添加图层

      localMapResource.RefreshServerObjects();

      //Toc控件刷新

      toc.Refresh();

      map1.CallbackResults.CopyFrom(toc.CallbackResults);

      map1.Refresh();

      return map1.CallbackResults.ToString();

      }

      实验2

      public static string AddCADLayer2(Map map1, Toc toc)

      {

      // 得到服务器上下文对象

      MapFunctionality agsMapFunctionlity = map1.GetFunctionality(1) as MapFunctionality;

      MapResourceLocal localMapResource = (MapResourceLocal)agsMapFunctionlity.Resource;

      ESRI.ArcGIS.Server.IServerContext mapContext = localMapResource.ServerContextInfo.ServerContext;

      // 增加图层

      ESRI.ArcGIS.Carto.IFeatureLayer pFeatureLayer = null;

      //IFeatureLayer pFeatureLayer;

      //打开CAD数据集

      IWorkspaceFactory factory = (IWorkspaceFactory)mapContext.CreateObject("esriDataSourcesFile.CADWorkspaceFactory");

      //pWorkspaceFactory = new CadWorkspaceFactoryClass();

      //pWorkspaceFactory = new pWorkspaceFactory();

      IFeatureWorkspace pFeatureWorkspace = (IFeatureWorkspace)factory.OpenFromFile(@"C:\Inetpub\wwwroot\NorthAmerica", 0);

      //打开一个要素集

      IFeatureDataset pFeatureDataset = (IFeatureDataset)pFeatureWorkspace.OpenFeatureDataset("New_Shapefile_ExportCAD.DWG");

      //IFeaturClassContainer可以管理IFeatureDataset中的每个要素类

      IFeatureClassContainer pFeatureClassContainer = (IFeatureClassContainer)pFeatureDataset;

      //对CAD文件中的要素进行遍历处理

      for (int i = 0; i < pFeatureClassContainer.ClassCount - 3; i++)

      {

      IFeatureClass pFeatureClass = pFeatureClassContainer.get_Class(i);

      if (pFeatureClass.FeatureType == esriFeatureType.esriFTAnnotation)

      {

      //如果是注记,则添加注记层

      pFeatureLayer = (ESRI.ArcGIS.Carto.IFeatureLayer)mapContext.CreateObject("esriCarto.CadAnnotationLayerClass");

      //pFeatureLayer = new CadAnnotationLayerClass();

      }

      else//如果是点、线、面,则添加要素层

      {

      pFeatureLayer = (ESRI.ArcGIS.Carto.IFeatureLayer)mapContext.CreateObject("esriCarto.CadFeatureLayer");

      pFeatureLayer.Name = pFeatureClass.AliasName;

      pFeatureLayer.FeatureClass = pFeatureClass;

      ESRI.ArcGIS.Carto.IGeoFeatureLayer iglayer = (ESRI.ArcGIS.Carto.IGeoFeatureLayer)pFeatureLayer;

      ESRI.ArcGIS.Carto.ISimpleRenderer isr = (ESRI.ArcGIS.Carto.ISimpleRenderer)mapContext.CreateObject("esriCarto.SimpleRenderer");

      ESRI.ArcGIS.Display.IRgbColor irgbc = (ESRI.ArcGIS.Display.IRgbColor)mapContext.CreateObject("esriDisplay.RgbColor");

      irgbc.Red = 255;

      irgbc.Green = 0;

      irgbc.Blue = 0;

      ESRI.ArcGIS.Geometry.esriGeometryType featype = pFeatureLayer.FeatureClass.ShapeType;

      if (featype == ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPoint)

      {

      ESRI.ArcGIS.Display.ISimpleMarkerSymbol ifs = (ESRI.ArcGIS.Display.ISimpleMarkerSymbol)mapContext.CreateObject("esriDisplay.SimpleMarkerSymbol");

      ifs.Color = (ESRI.ArcGIS.Display.IColor)irgbc;

      isr.Symbol = (ESRI.ArcGIS.Display.ISymbol)ifs;

      }

      else if (featype == ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolyline)

      {

      ESRI.ArcGIS.Display.ISimpleLineSymbol ifs = (ESRI.ArcGIS.Display.ISimpleLineSymbol)mapContext.CreateObject("esriDisplay.SimpleLineSymbol");

      ifs.Color = (ESRI.ArcGIS.Display.IColor)irgbc;

      isr.Symbol = (ESRI.ArcGIS.Display.ISymbol)ifs;

      }

      else if (featype == ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolygon)

      {

      ESRI.ArcGIS.Display.ISimpleFillSymbol ifs = (ESRI.ArcGIS.Display.ISimpleFillSymbol)mapContext.CreateObject("esriDisplay.SimpleFillSymbol");

      ifs.Color = (ESRI.ArcGIS.Display.IColor)irgbc;

      isr.Symbol = (ESRI.ArcGIS.Display.ISymbol)ifs;

      }

      else

      {

      ESRI.ArcGIS.Display.ISimpleLineSymbol ifs = (ESRI.ArcGIS.Display.ISimpleLineSymbol)mapContext.CreateObject("esriDisplay.SimpleLineSymbol");

      ifs.Color = (ESRI.ArcGIS.Display.IColor)irgbc;

      isr.Symbol = (ESRI.ArcGIS.Display.ISymbol)ifs;

      //throw new Exception("图层类型不确定!");

      }

      iglayer.Renderer = (ESRI.ArcGIS.Carto.IFeatureRenderer)isr;

      //IMapServer ms = (IMapServer)in_mapcontext.ServerObject;

      //IMapServerObjects2 mso = (IMapServerObjects2)ms;

      //string mapname = ms.DefaultMapName;

      //IMap map = mso.get_Map(mapname);

      //map.AddLayer(pFeatureLayer);

      //mso.RefreshServerObjects();

      }

      }

      //// 从上下文对象中得到服务器对象

      //IMapServer ms = (IMapServer)mapContext.ServerObject;

      //IMapServerInfo mapInfo = ms.GetServerInfo(ms.DefaultMapName);

      //IMapDescription NEWmapDesc = mapInfo.DefaultMapDescription;

      //// 释放服务器上下文对象

      //mapContext.ReleaseContext();

      ESRI.ArcGIS.Carto.IMapServerObjects mapServerObjects = localMapResource.MapServer as ESRI.ArcGIS.Carto.IMapServerObjects;

      ESRI.ArcGIS.Carto.IMap map = mapServerObjects.get_Map(localMapResource.DataFrame) as ESRI.ArcGIS.Carto.IMap;

      if (pFeatureLayer != null)

      {

      map.AddLayer(pFeatureLayer);

      //移动层到底层

      //map.MoveLayer(pFeatureLayer, map.LayerCount - 1);

      }

      //刷新服务器对象,响应添加图层

      localMapResource.RefreshServerObjects();

      //Toc控件刷新

      toc.Refresh();

      map1.CallbackResults.CopyFrom(toc.CallbackResults);

      map1.Refresh();

      return map1.CallbackResults.ToString();

      }

      最终调试正确代码:

      public static string AddCADLayer(Map map1, Toc toc)

      {

      // 得到服务器上下文对象

      MapFunctionality agsMapFunctionlity = map1.GetFunctionality(1) as MapFunctionality;

      MapResourceLocal localMapResource = (MapResourceLocal)agsMapFunctionlity.Resource;

      ESRI.ArcGIS.Server.IServerContext mapContext = localMapResource.ServerContextInfo.ServerContext;

      // 增加图层

      ESRI.ArcGIS.Carto.IFeatureLayer pFeatureLayer = null;

      //打开CAD数据集

      IWorkspaceFactory factory = (IWorkspaceFactory)mapContext.CreateObject("esriDataSourcesFile.CADWorkspaceFactory");

      IFeatureWorkspace pFeatureWorkspace = (IFeatureWorkspace)factory.OpenFromFile(@"C:\Inetpub\wwwroot\NorthAmerica", 0);

      //打开一个要素集

      IFeatureDataset pFeatureDataset = (IFeatureDataset)pFeatureWorkspace.OpenFeatureDataset("New_Shapefile_ExportCAD.DWG");

      //IFeaturClassContainer可以管理IFeatureDataset中的每个要素类

      IFeatureClassContainer pFeatureClassContainer = (IFeatureClassContainer)pFeatureDataset;

      //对CAD文件中的要素进行遍历处理

      for (int i = 0; i < pFeatureClassContainer.ClassCount - 1; i++)

      {

      IFeatureClass pFeatureClass = pFeatureClassContainer.get_Class(i);

      if (pFeatureClass.FeatureType == esriFeatureType.esriFTAnnotation)

      {

      //如果是注记,则添加注记层

      pFeatureLayer = (ESRI.ArcGIS.Carto.IFeatureLayer)mapContext.CreateObject("esriCarto.CadAnnotationLayerClass");

      }

      else//如果是点、线、面,则添加要素层

      {

      pFeatureLayer = (ESRI.ArcGIS.Carto.IFeatureLayer)mapContext.CreateObject("esriCarto.CadFeatureLayer");

      pFeatureLayer.Name = pFeatureClass.AliasName;

      pFeatureLayer.FeatureClass = pFeatureClass;

      ESRI.ArcGIS.Carto.IMapServerObjects mapServerObjects = localMapResource.MapServer as ESRI.ArcGIS.Carto.IMapServerObjects;

      ESRI.ArcGIS.Carto.IMap map = mapServerObjects.get_Map(localMapResource.DataFrame) as ESRI.ArcGIS.Carto.IMap;

      map.AddLayer(pFeatureLayer);

      //刷新服务器对象,响应添加图层

      localMapResource.RefreshServerObjects();

      }

      }

      //Toc控件刷新

      toc.Refresh();

      map1.CallbackResults.CopyFrom(toc.CallbackResults);

      map1.Refresh();

      return map1.CallbackResults.ToString();

      }

  • 相关阅读:
    接口测试基础operation
    关于Fiddler常见问题之一
    接口测试用例编写规则
    Codeforces 959E. Mahmoud and Ehab and the xor-MST 思路:找规律题,时间复杂度O(log(n))
    Codeforces 930A. Peculiar apple-tree (dfs)
    51nod 2020 排序相减(暴力解法)
    《汇编语言(第三版)》pushf 和 popf 指令,以及标志寄存器在 Debug 中的表示
    DF标志和串传送指令
    《汇编语言(第三版)》cmp指令
    《汇编语言(第三版)》标志寄存器
  • 原文地址:https://www.cnblogs.com/13590/p/1776311.html
Copyright © 2011-2022 走看看