C#实现AutoCAD块属性提取功能

using System;
using AutoCAD=Autodesk.AutoCAD.Interop;
using System.Runtime.InteropServices ;
using dbx = Autodesk.AutoCAD.Interop.Common;
namespace SmartSoft.ACAD
{
 ///下面类实现AutoCAD块属性提取功能,在VS.Net2003(2005)+AutoCAD2004(2007)
 ///下调试通过,不明白请到群(cnednproxy@hotmail.com)讨论。

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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
AutoCAD 中,属性是指在定义中定义的属性属性可以用于描述的特定信息,例如名称、编号、制造商、日期等。 下面是 C#属性的增加、删除、修改和查询方法的示例代码。 1. 增加属性 ``` // 获取定义 BlockTableRecord btr = (BlockTableRecord)trans.GetObject(blockDefId, OpenMode.ForRead); // 创建新的属性定义 AttributeDefinition attDef = new AttributeDefinition(); attDef.Position = new Point3d(0, 0, 0); attDef.Prompt = "Enter attribute value: "; attDef.Tag = "ATTRIBUTE_TAG"; attDef.TextString = "Default attribute value"; // 将新的属性定义添加到定义中 btr.AppendEntity(attDef); trans.AddNewlyCreatedDBObject(attDef, true); ``` 2. 删除属性 ``` // 获取定义 BlockTableRecord btr = (BlockTableRecord)trans.GetObject(blockDefId, OpenMode.ForRead); // 获取要删除的属性 ObjectId attId = btr.GetAttributeDefinition("ATTRIBUTE_TAG"); // 删除属性 if (attId != null) { DBObject attObj = trans.GetObject(attId, OpenMode.ForWrite); attObj.Erase(); } ``` 3. 修改属性 ``` // 获取定义 BlockTableRecord btr = (BlockTableRecord)trans.GetObject(blockDefId, OpenMode.ForRead); // 获取要修改属性 ObjectId attId = btr.GetAttributeDefinition("ATTRIBUTE_TAG"); // 修改属性 if (attId != null) { AttributeDefinition attDef = (AttributeDefinition)trans.GetObject(attId, OpenMode.ForWrite); attDef.TextString = "New attribute value"; } ``` 4. 查询属性 ``` // 获取定义 BlockTableRecord btr = (BlockTableRecord)trans.GetObject(blockDefId, OpenMode.ForRead); // 获取所有的属性 foreach (ObjectId attId in btr) { DBObject attObj = trans.GetObject(attId, OpenMode.ForRead); if (attObj is AttributeReference) { AttributeReference attRef = (AttributeReference)attObj; string tag = attRef.Tag; string value = attRef.TextString; // 处理属性 // ... } } ``` 请注意,这些示例代码假定您已经获取了定义的 ObjectId。如果您需要更多的帮助,请提供更具体的上下文或问题描述。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yueliang2100

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值