用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) == 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

  
///   <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

你可能感兴趣的:(.net)