现在的位置: 首页 > 综合 > 正文

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

2012年10月17日 ⁄ 综合 ⁄ 共 4087字 ⁄ 字号 评论关闭
 ____这是我以前写过的一篇文章,也是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

抱歉!评论已关闭.