1、说明
动态块具有灵活性和智能性,用户在操作时可以轻松地更改图形中的动态块参照,可以通过自定义夹点或自定义特性来操作动态块参照中的几何图形,这使得用户可以根据需要在位调整块,而不用搜索另一个块以插入或者重定义现有的块。
2、思路
在图形中,插入动态块并设置动态属性的步骤如下:
1)插入动态块;
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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)获取块的所有动态属性;
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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)遍历动态块中的属性,对符合条件的进行赋值;
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
3-思考?
只能在已有动态块的情况下才能实现,如何创建动态块,目前对.NET还不支持。