zoukankan      html  css  js  c++  java
  • 二次开发-- 动态块(三)

    1、说明

           动态块具有灵活性和智能性,用户在操作时可以轻松地更改图形中的动态块参照,可以通过自定义夹点或自定义特性来操作动态块参照中的几何图形,这使得用户可以根据需要在位调整块,而不用搜索另一个块以插入或者重定义现有的块。

     2、思路

         在图形中,插入动态块并设置动态属性的步骤如下:

    1)插入动态块;

     1 /// <summary>
     2         /// 插入带属性的参照快
     3         /// </summary>
     4         /// <param name="spaceId">空间的ID</param>
     5         /// <param name="layer">块要加入的图层名</param>
     6         /// <param name="blockName">快参照所属的快名</param>
     7         /// <param name="postion">插入点</param>
     8         /// <param name="scale">缩放比例</param>
     9         /// <param name="rotateAngle">旋转角度</param>
    10         /// <param name="attNameValues">属性名称与取值</param>
    11         /// <returns></returns>
    12         public static ObjectId InsertBlockrefence(this ObjectId spaceId, string layer, string blockName, Point3d postion, Scale3d scale, double rotateAngle, Dictionary<string, string> attNameValues)
    13         {
    14             // 获取数据库对象
    15             Database db = spaceId.Database;
    16             //以读的方式打开块表
    17             BlockTable bt = db.BlockTableId.GetObject(OpenMode.ForRead) as BlockTable;
    18             //如果没有blockName d的块,则程序返回
    19             if (!bt.Has(blockName))
    20 
    21                 return ObjectId.Null;//如果没有blockName的块,程序返回
    22             //以写的模式打开空间
    23             BlockTableRecord space = (BlockTableRecord)spaceId.GetObject(OpenMode.ForWrite);
    24             //获取块表的记录ID
    25             ObjectId btrId = bt[blockName];
    26             //打开块表记录
    27             BlockTableRecord record = btrId.GetObject(OpenMode.ForRead) as BlockTableRecord;
    28             //创建一个快参照并设置插入点
    29             BlockReference br = new BlockReference(postion, bt[blockName]);
    30 
    31             br.ScaleFactors = scale;
    32 
    33             br.Layer = layer;
    34             br.Rotation = rotateAngle;
    35 
    36             space.AppendEntity(br);
    37             //判断块表记录是否包含属性定义
    38             if (record.HasAttributeDefinitions)
    39             {
    40                 //若包含,则遍历属性定义
    41                 foreach (ObjectId id in record)
    42                 {
    43                     //检查是否是属性定义
    44                     AttributeDefinition attDef = id.GetObject(OpenMode.ForRead) as AttributeDefinition;
    45 
    46                     if (attDef != null)
    47                     {
    48 
    49                         //创建一个新的属性对象
    50                         AttributeReference attribute = new AttributeReference();
    51                         //从属性定义获取属性对象的对象特性
    52                         attribute.SetAttributeFromBlock(attDef, br.BlockTransform);
    53                         attribute.Rotation = attDef.Rotation;
    54 
    55                         attribute.Position = attDef.Position.TransformBy(br.BlockTransform);
    56 
    57                         attribute.AdjustAlignment(db);
    58                         //判断是否包含指定的属性名称
    59                         if (attNameValues.ContainsKey(attDef.Tag.ToUpper()))
    60                         {
    61                             
    62                             //设置属性值
    63                             attribute.TextString = attNameValues[attDef.Tag.ToUpper()].ToString();
    64 
    65                         }
    66                         // 向块参照添加属性对象
    67                         br.AttributeCollection.AppendAttribute(attribute);
    68                         db.TransactionManager.AddNewlyCreatedDBObject(attribute, true);
    69 
    70                     }
    71                 }
    72             }
    73             db.TransactionManager.AddNewlyCreatedDBObject(br, true);
    74             return br.ObjectId;//返回添加的快参照的ID
    75         }
    插入块

    2)获取块的所有动态属性;

     1         /// <summary>
     2         /// 获取动态块的动态属性值
     3         /// </summary>
     4         /// <param name="blockId"></param>
     5         /// <param name="propName"></param>
     6         /// <returns></returns>
     7         public static string GetDynBlockValue(this ObjectId blockId, string propName)
     8         {
     9             string propValue = null;//用于返回动态属性值的变量
    10 
    11             var props = blockId.GetDynProperties();//获得动态块的所有属性
    12 
    13             //遍历动态属性
    14             foreach (DynamicBlockReferenceProperty prop in props)
    15             {
    16                 //如果动态属性的名称与输入的名称相同
    17                 if (prop.PropertyName == propName)
    18                 {
    19                     //获取动态属性值并结束遍历
    20                     propValue = prop.Value.ToString();
    21 
    22                     break;
    23                 }
    24 
    25             }
    26 
    27             return propValue;
    28         }
    29 
    30         /// <summary>
    31         /// 获得动态块的所有属性
    32         /// </summary>
    33         /// <returns></returns>
    34         public static DynamicBlockReferencePropertyCollection GetDynProperties(this ObjectId blockId)
    35         {
    36             BlockReference br = blockId.GetObject(OpenMode.ForRead) as BlockReference;
    37 
    38             if (br == null && !br.IsDynamicBlock) return null;
    39 
    40             return br.DynamicBlockReferencePropertyCollection;  //返回动态块的动态属性
    41 
    42 
    43         }
    获取属性值

    3)遍历动态块中的属性,对符合条件的进行赋值;

     1 /// <summary>
     2         /// 设置动态属性值
     3         /// </summary>
     4         /// <param name="blockId"></param>
     5         /// <param name="PropName"></param>
     6         /// <param name="value"></param>
     7         public static void SetDynBlockValue(this ObjectId blockId, string PropName, object value)
     8         {
     9             var props = blockId.GetDynProperties();//获取动态块的所有属性
    10 
    11             foreach (DynamicBlockReferenceProperty prop in props)
    12             {
    13                 //如果动态属性的名称与输入的名称相同且为可读
    14                 if (prop.ReadOnly == false && prop.PropertyName == PropName)
    15                 {
    16                     //判断动态属性的类型并通过转换类型设置正确的动态属性值
    17                     switch (prop.PropertyTypeCode)
    18                     {
    19                         case (short)DynBlockPropTypeCode.Short:
    20                             prop.Value = Convert.ToInt16(value);
    21                             break;
    22                         case (short)DynBlockPropTypeCode.Long:
    23                             prop.Value = Convert.ToInt64(value);
    24                             break;
    25                         case (short)DynBlockPropTypeCode.Real:
    26                             prop.Value = Convert.ToDouble(value);
    27                             break;
    28 
    29                         default:
    30                             prop.Value = value;
    31                             break;
    32 
    33 
    34                     }
    35                     break;
    36                 }
    37             }
    38 
    39         }
    View Code

    3-思考?

    只能在已有动态块的情况下才能实现,如何创建动态块,目前对.NET还不支持。

  • 相关阅读:
    微服务基础——厉害了!API网关
    11.11 大促背后的秘密——智能合图
    那些我们对2019技术世界趋势的预测都说准了吗?
    DevOps云翼日志服务实践
    技术沙龙|原来落地AI应用是这么回事儿!
    直击JDD | 京东开启技术服务元年:携手合作伙伴,共创产业未来
    直击JDD | 徐雷:智能化零售,以技术为驱动力的突破路径
    直击JDD | 陈生强:京东数科的底层是数字化操作系统
    干货 | Spark Streaming 和 Flink 详细对比
    持续集成与自动化部署
  • 原文地址:https://www.cnblogs.com/sly-tongtong/p/4268160.html
Copyright © 2011-2022 走看看