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

EaBIM

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
查看: 803|回复: 0
打印 上一主题 下一主题

[实体对象] 驱动动态块

[复制链接]

1514

主题

7465

帖子

1万

积分

admin

Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10

积分
12406

社区QQ达人

跳转到指定楼层
楼主
发表于 2014-1-8 14:04:32 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
AutoCAD2006开始引入了动态块这个概念,动态块的使用使得我们的图形更加灵活,可以通过自定义夹点或自定义特性来操作几何图形。
这使得我们可以根据需要在位调整块参照,而不用搜索另一个块以插入或重定义现有的块。也就是可以通过一个块定义衍生出多个特性类似的块参照。
目前用.NET环境开发还不能自定义约束、关联以及动态块,但是我们可以用.NET程序访问或者控制动态块的参数,看下面的例子修改动态块的参数,使得动态块的图形变化。

  1. using System;
  2. using Autodesk.AutoCAD.Runtime;
  3. using Autodesk.AutoCAD.Geometry;
  4. using Autodesk.AutoCAD.DatabaseServices;
  5. using Autodesk.AutoCAD.ApplicationServices;
  6. using Autodesk.AutoCAD.EditorInput;
  7. [assembly: CommandClass(typeof(Sample.SetDynamicBlockValue))]
  8. namespace Sample
  9. {
  10.     class SetDynamicBlockValue
  11.     {
  12.         [CommandMethod("SetDynamicBlockValue")]
  13.         public void SetValue()
  14.         {
  15.             Database db = HostApplicationServices.WorkingDatabase;
  16.             using (Transaction tr = db.TransactionManager.StartTransaction())
  17.             {
  18.                 BlockReference br = (BlockReference)SelectEntity("\n选择动态块");
  19.                 Property[] Properties = new Property[] { new Property("Width", 100), new Property("Height", 100) };
  20.                 SetDynamicValue(br, Properties);
  21.                 tr.Commit();
  22.             }
  23.         }
  24.         /// <summary>
  25.         /// 提示用户选择单个实体
  26.         /// </summary>
  27.         /// <param name="word">选择提示</param>
  28.         /// <returns>实体对象</returns>
  29.         public static Entity SelectEntity(string word)
  30.         {
  31.             Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  32.             Database db = doc.Database;
  33.             Editor ed = doc.Editor;
  34.             Entity entity = null;
  35.             PromptEntityResult ent = ed.GetEntity(word);
  36.             if (ent.Status == PromptStatus.OK)
  37.             {
  38.                 using (Transaction transaction = db.TransactionManager.StartTransaction())
  39.                 {
  40.                     entity = (Entity)transaction.GetObject(ent.ObjectId, OpenMode.ForWrite, true);
  41.                     transaction.Commit();
  42.                 }
  43.             }
  44.             return entity;
  45.         }
  46.         /// <summary>
  47.         /// 设置动态块属性
  48.         /// </summary>
  49.         /// <param name="br">要设置属性的动态块</param>
  50.         /// <param name="PropertyNames"></param>
  51.         /// <param name="Values"></param>
  52.         public static void SetDynamicValue(BlockReference br, Property[] Properties)
  53.         {
  54.             try
  55.             {
  56.                 if (br.IsDynamicBlock)
  57.                 {
  58.                     foreach (DynamicBlockReferenceProperty dbrp in br.DynamicBlockReferencePropertyCollection)
  59.                     {
  60.                         for (int i = 0; i < Properties.Length; i++)
  61.                         {
  62.                             if (dbrp.PropertyName == Properties.PropertyName)
  63.                             {
  64.                                 dbrp.Value = Properties.Value;
  65.                             }
  66.                         }
  67.                     }
  68.                 }
  69.             }
  70.             catch
  71.             {
  72.             }
  73.         }
  74.     }
  75.     /// <summary>
  76.     /// 动态块属性
  77.     /// </summary>
  78.     public class Property
  79.     {
  80.         private string propertyname;
  81.         private double value;
  82.         public string PropertyName
  83.         {
  84.             get { return propertyname; }
  85.         }
  86.         public double Value
  87.         {
  88.             get { return value; }
  89.         }
  90.         public Property(string PropertyName, double Value)
  91.         {
  92.             propertyname = PropertyName;
  93.             value = Value;
  94.         }
  95.     }
  96. }

复制代码
  1. <div align="left"><font color="#696969"><font face="Calibri"><font style="font-size: 10pt"></font></font></font></div><font face="Calibri"><font color="#696969"><font style="font-size: 10pt"><i><i><font face="Calibri"><font style="font-size: 10pt">加载程序运行命令后选择一个动态块:</font></font></i></i></font></font></font><i><i>
  2. <div align="left"><font color="#696969"><font face="Calibri"><font style="font-size: 13px"><font face="Calibri"><font style="font-size: 10pt">程序自动修改其属性参数,驱动动态块的形状改变:</font></font></font></font></font></div>
  3. <div align="center"><font color="#696969"></font></div><font color="#696969">
  4. <div align="left"><font color="#696969"><font face="Calibri"><font style="font-size: 13px"><font face="Calibri"><font style="font-size: 10pt"><font face="" "=""><font style="font-size: 10pt">*</font></font><font face="宋体"><font style="font-size: 10pt">在修改参数的时候需要注意的一点是所定义的约束参数必须是“增量”形式其值才能被任意修改,如果为“列表”形式则其值只能设定为列表中的值。</font></font></font></font></font></font></font></div></font></i></i>
复制代码

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 转播转播 分享分享 分享淘帖 支持支持 反对反对
工作时间:工作日的9:00-12:00/13:30-18:00,节假日不在线,请勿留言
*滑块验证:
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|EaBIM网 ( 苏ICP备2020058923号-1  苏公网安备32011502011255号

GMT+8, 2024-11-27 12:29

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表