EaBIM一直以来积极响应国家“十二五”推进建筑业信息化的号召,对建筑领域的信息技术开展深入技术交流和探讨!致力于打造“BIM-建筑师-生态技术”三位一体综合资源交流共享平台,希望为BIM与可持续设计理念及技术的普及做出微小的贡献!!!

萧闫子 发表于 2014-1-8 16:48:12

[实体对象] 添加带属性的块参照

图块中可以添加一些属性以记录或者表现图块的参数属性(例如图框里面的标题等信息)这样既方便检索也方便显示,下面介绍图块中是如何加入属性的。
[*]using System;
[*]
[*]using Autodesk.AutoCAD.DatabaseServices;
[*]using Autodesk.AutoCAD.Geometry;
[*]using Autodesk.AutoCAD.Runtime;
[*]
[*]
[*]namespace Sample
[*]{
[*]    class AddAttributeBlock
[*]    {
[*]      
[*]      public void AddBlock()
[*]      {
[*]            Database db = HostApplicationServices.WorkingDatabase;
[*]            ObjectId id;
[*]            BlockTableRecord btr = new BlockTableRecord();
[*]            Line line = new Line(new Point3d(), new Point3d(30, 30, 0));
[*]            AttributeDefinition ad = AttributeDefinition("Length", "L", line.Length.ToString(), new Point3d(30, 30, 0));
[*]            btr.Name = "LineBlock";
[*]            btr.AppendEntity(line);
[*]            btr.AppendEntity(ad);
[*]            id = AddToBlockTable(btr);
[*]            ToModelSpace(id, Point3d.Origin,db);
[*]      }
[*]
[*]      /// <summary>
[*]      /// 创建属性
[*]      /// </summary>
[*]      /// <param name="Label">标记名</param>
[*]      /// <param name="Prompt">提示</param>
[*]      /// <param name="Value">属性值</param>
[*]      /// <param name="pt">属性插入点位置</param>
[*]      /// <returns></returns>
[*]      public static AttributeDefinition AttributeDefinition(string Label, string Prompt, string Value, Point3d pt)
[*]      {
[*]            AttributeDefinition ad = new AttributeDefinition();
[*]            ad.Constant = false;
[*]            ad.Tag = Label;
[*]            ad.Prompt = Prompt;
[*]            ad.TextString = Value;
[*]            ad.Position = pt;
[*]            return ad;
[*]      }
[*]
[*]      /// <summary>
[*]      /// 将指定的块定义变成块参照添加到指定模型空间
[*]      /// </summary>
[*]      /// <param name="blkid">块定义Id</param>
[*]      /// <param name="pt">插入点</param>
[*]      /// <param name="db">数据库</param>
[*]      /// <returns></returns>
[*]      public static ObjectId ToModelSpace(ObjectId blkid, Point3d pt, Database db)
[*]      {
[*]            ObjectId blkrfid = new ObjectId();
[*]            using (Transaction trans = db.TransactionManager.StartTransaction())
[*]            {
[*]                BlockTable bt = trans.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
[*]                BlockTableRecord modelspace = trans.GetObject(bt, OpenMode.ForWrite) as BlockTableRecord;
[*]                BlockTableRecord block = trans.GetObject(blkid, OpenMode.ForRead) as BlockTableRecord;
[*]                BlockReference br = new BlockReference(pt, blkid); // 通过块定义添加块参照
[*]                blkrfid = modelspace.AppendEntity(br); //把块参照添加到块表记录
[*]                trans.AddNewlyCreatedDBObject(br, true); // 通过事务添加块参照到数据库
[*]                foreach (ObjectId id in block)
[*]                {
[*]                  if (id.ObjectClass.Equals(RXClass.GetClass(typeof(AttributeDefinition))))
[*]                  {
[*]                        AttributeDefinition ad = trans.GetObject(id, OpenMode.ForRead) as AttributeDefinition;
[*]                        AttributeReference ar = new AttributeReference(ad.Position, ad.TextString, ad.Tag, new ObjectId());
[*]                        br.AttributeCollection.AppendAttribute(ar);
[*]                  }
[*]                }
[*]                trans.Commit();
[*]            }
[*]            return blkrfid;
[*]      }
[*]
[*]      /// <summary>
[*]      /// 将块表记录加入到块表中
[*]      /// </summary>
[*]      /// <returns></returns>
[*]      public static ObjectId AddToBlockTable(BlockTableRecord Record)
[*]      {
[*]            Database db = HostApplicationServices.WorkingDatabase;
[*]            ObjectId id = new ObjectId();
[*]            using (Transaction transaction = db.TransactionManager.StartTransaction())
[*]            {
[*]                BlockTable table = transaction.GetObject(db.BlockTableId, OpenMode.ForWrite) as BlockTable;
[*]                id = table.Add(Record);
[*]                transaction.AddNewlyCreatedDBObject(Record, true);
[*]                transaction.Commit();
[*]            }
[*]            return id;
[*]      }
[*]    }
[*]}

复制代码

在AutoCAD中加载运行” AddAttributeBlock”命令后得到如下结果:

老鼠仔CH 发表于 2014-6-11 18:13:56

(*^__^*) 嘻嘻……

大洪p1938 发表于 2014-6-11 18:11:44

(*^__^*) 嘻嘻……

goodjob_1979 发表于 2015-11-10 09:45:40

什么东东呀。。。。

AK47 发表于 2014-2-13 09:59:28

学习了

鹦鹉仔 发表于 2014-2-18 12:08:56

路过!!!
帮顶……

OK佬 发表于 2014-3-11 11:07:48

非常感谢!!

大头佬 发表于 2014-3-11 11:13:08

顶起来…………

一梦千寻 发表于 2014-3-11 11:14:13

顶!!!!!!!!!!!!

波罗友 发表于 2014-3-14 11:20:30

顶!!!!!!!!!!

严英华 发表于 2014-3-14 11:25:54

顶!!!!!!!!!!

大头佬 发表于 2014-3-14 11:26:42

路过!!!
帮顶……

大洪p1938 发表于 2014-3-14 11:36:34

(*^__^*) 嘻嘻……

拉登 发表于 2014-4-28 14:40:25

顶起来…………

大奔KY 发表于 2014-5-22 15:41:36

顶......
楼下跟上.....

嫣雨遥 发表于 2014-6-9 15:51:06

顶起来…………

zj1345 发表于 2014-6-9 15:56:27

顶......
楼下跟上.....
页: [1] 2 3 4
查看完整版本: [实体对象] 添加带属性的块参照