zoukankan      html  css  js  c++  java
  • C#.Net实现AutoCAD块属性提取

    https://blog.csdn.net/dengyiyu/article/details/2201175

    本文主要给大家介绍一下SmartSoft中用C#.Net实现AutoCAD块属性提取的方法,并给出实例代码与大家共享。此类实现AutoCAD块属性提取功能,在VS.Net2003(2005)+AutoCAD2004(2007)下调试通过。

    using System; 
      using AutoCAD=Autodesk.AutoCAD.Interop; 
      using System.Runtime.InteropServices ; 
      using dbx = Autodesk.AutoCAD.Interop.Common; 
      namespace SmartSoft.ACAD 
      { 
      ///  
      /// 读取AutoCAD属性信息 
      ///  
      public class AutoCADConnector:IDisposable 
      { 
      private AutoCAD.AcadApplication _Application; 
      private bool _Initialized; 
      private bool _Disposed; 
      #region 类初始化及析构操作 
      ///  
      /// 类初始化,试图获取一个正在运行的AutoCAD实例, 
      /// 如果没有则新起动一个实例。 
      ///  
      public AutoCADConnector() 
      { 
      try 
      { 
      //取得一个正在运行的AUTOCAD实例 
      this._Application = (AutoCAD.AcadApplication)Marshal.GetActiveObject("AutoCAD.Application.17"); 
      }//end of try 
      catch 
      { 
      try 
      { 
      //建立一个新的AUTOCAD实例,并标识已经建立成功。 
      _Application = new AutoCAD.AcadApplicationClass(); 
      _Initialized=true; 
      } 
      catch 
      { 
      throw new Exception ("无法起动AutoCAD应用程序,确认已经安装"); 
      } 
      }//end of catch 
      }//end of AutoCADConnector 
      ~AutoCADConnector() 
      { 
      Dispose(false); 
      } 
      public void Dispose() 
      { 
      Dispose(true); 
      GC.SuppressFinalize(this); 
      } 
      protected virtual void Dispose(bool disposing) 
      { 
      if (!this._Disposed && this._Initialized ) 
      { 
      //如果建立了AUTOCAD的实列,调用QUIT方法以避免内存漏洞 
      this._Application.ActiveDocument.Close (false,""); 
      this._Application.Quit(); 
      this._Disposed=true; 
      } 
      } 
      #endregion 
      #region 公共用户接口属性 
      ///  
      /// 取得当前类所获得的AUTOCAD实例 
      ///  
      public AutoCAD.AcadApplication Application 
      { 
      get 
      { 
      return _Application; 
      } 
      }//end of Application 
      #endregion 
      #region 公共用户接口方法 
      ///  
      /// 根据给定的文件名以AxDbDocument类型返回该文档 
      ///  
      public dbx.AxDbDocument GetThisDrawing(string FileName,string PassWord) 
      { 
      ACAD.AutoCADConnector Connector=new AutoCADConnector(); 
      //这是AutoCAD2004的Programe ID 
      string programeID ="ObjectDBX.AxDbDocument.17"; 
      AutoCAD.AcadApplication AcadApp = Connector.Application; 
      dbx.AxDbDocument dbxDoc; 
      dbxDoc=(dbx.AxDbDocument)AcadApp.GetInterfaceObject(programeID); 
      try 
      { 
      if (System.IO.File.Exists (FileName)==false) throw new Exception ("文件不存在。"); 
      dbxDoc.Open(FileName,PassWord); 
      }// end of try 
      catch (Exception e) 
      { 
      System.Windows.Forms.MessageBox.Show(e.Message ); 
      dbxDoc=null; 
      } 
      return dbxDoc; 
      }//end of function GetThisDrawing 
      ///  
      /// 根据当前文档和块名取得当前块的引用 
      ///  
      public dbx.AcadBlockReference GetBlockReference(dbx.AxDbDocument thisDrawing,string blkName) 
      { 
      dbx.AcadBlockReference blkRef=null; 
      bool found = false; 
      try 
      { 
      foreach (dbx.AcadEntity entity in thisDrawing.ModelSpace ) 
      { 
      if (entity.EntityName=="AcDbBlockReference") 
      { 
      blkRef=(dbx.AcadBlockReference)entity; 
      //System.Windows.Forms.MessageBox.Show(blkRef.Name); 
      if (blkRef.Name.ToLower() ==blkName.ToLower() ) 
      { 
      found = true; 
      break; 
      } 
      }//end of entity.EntityName=="AcDbBlockReference" 
      }// end of foreach thisDrawing.ModelSpace 
      }//end of try 
      catch (Exception e) 
      { 
      System.Windows.Forms.MessageBox.Show ("图形中有未知的错误,格式不正确或图形数据库需要修愎。系统错误提示:" + e.Message ,"信息",System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Warning); 
      thisDrawing=null; 
      }//end of catch 
      if (!found) blkRef = null; 
      return blkRef; 
      }//end of function GetBlockReference 
      ///  
      /// 根据给定的块引用(dbx.AcadBlockReference)和属性名返回属性值 
      ///  
      public object GetValueByAttributeName(dbx.AcadBlockReference blkRef,string AttributeName) 
      { 
      object[] Atts=(object[])blkRef.GetAttributes(); 
      object attValue=null; 
      for (int i=0;i  
      { 
      dbx.AcadAttributeReference attRef; 
      attRef=(dbx.AcadAttributeReference)Atts[i]; 
      if (attRef.TagString==AttributeName) 
      { 
      attValue= attRef.TextString ; 
      break; 
      } 
      }//end of for i 
      return attValue; 
      }// end of function 
      #endregion 
      }//end of class CAutoCADConnector 
      }//end of namespace AutoCAD
  • 相关阅读:
    Console.WriteLine输出字符格式化
    GridView动态生成列问题
    日历控件,可运行在XHTML1.0下
    GridView內容導出Excel時異常:必须置於有 runat=server 的表单标记之中
    圆弧分割
    矩阵变换
    使用group by 来统计的小作业
    group by 后使用 rollup 子句总结
    mysql字符串拼接,存储过程,(来自网上看到)
    【深入理解Linux内核】《第二章 内存寻址》笔记 (2014-06-28 12:38)
  • 原文地址:https://www.cnblogs.com/belx/p/9256285.html
Copyright © 2011-2022 走看看