• 用C#.Net实现AutoCAD块属性提取


     ____这是我以前写过的一篇文章,也是SmartSoft中用到的,作为SmartSoft专题的一部分转贴到这里,与大家共享。此类实现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
    {
     
    /// <summary>
     
    /// 读取AutoCAD属性信息
     
    /// </summary>
     public class AutoCADConnector:IDisposable
     {
       
    private AutoCAD.AcadApplication _Application;
       
    private bool _Initialized;
       
    private bool _Disposed;
    #region 类初始化及析构操作
      
    /// <summary>
      
    /// 类初始化,试图获取一个正在运行的AutoCAD实例,
      
    /// 如果没有则新起动一个实例。
      
    /// </summary>
      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 公共用户接口属性
      
    /// <summary>
      
    /// 取得当前类所获得的AUTOCAD实例
      
    /// </summary>
            public AutoCAD.AcadApplication Application
      {
       
    get
       {
        
    return _Application;
       }
      }
    //end of Application
    #endregion
      
    #region 公共用户接口方法
      
    /// <summary>
      
    /// 根据给定的文件名以AxDbDocument类型返回该文档
      
    /// </summary>
      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)==falsethrow 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

      
    /// <summary>
      
    /// 根据当前文档和块名取得当前块的引用
      
    /// </summary>
      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
      /// <summary>
      
    /// 根据给定的块引用(dbx.AcadBlockReference)和属性名返回属性值
      
    /// </summary>
      public object GetValueByAttributeName(dbx.AcadBlockReference  blkRef,string AttributeName)
      {
       
    object[] Atts=(object[])blkRef.GetAttributes();
       
    object attValue=null;
       
    for (int i=0;i<Atts.Length;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
    来自:http://www.cnblogs.com/SmartSoft/archive/2007/12/09/935184.html
  • 相关阅读:
    ORACLE PL/SQL使用经验总结 [转]
    网页表单项Input的高级限制级用法 [转]
    Zend_Search_Lucene索引更新
    Zend Framework 1.10.1 开始使用 Zend_Search_Lucene
    使用zend Framework的lucene进行全文检索——中文分词
    SQL to Select a random row from a database table
    php源代码之函数集介绍
    Zend Framework之Search_Lucene实例
    array_multisort根据字段给数组排序
    php soap实例讲解
  • 原文地址:https://www.cnblogs.com/gisoracle/p/2362488.html
Copyright © 2020-2023  润新知