atravellers

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

打开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中直接打开试试,如果也无法显示的话,可能是文件名的问题(注:路径中也不能含有中文字符).

 

转载自:http://www.gisforum.net/bbs/dispbbs.asp?boardid=35&id=145238

posted on   zhaojp  阅读(5766)  评论(0编辑  收藏  举报

编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
点击右上角即可分享
微信分享提示