热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

CAD二次开发--属性块

1、属性块的定义属性块是有构成的实体和附加信息(属性)组成的,属性块中块的定义与简单块中块的定义一样,而属性的定义主要是通过属性的AttributeDefinition类的有

1、属性块的定义

           属性块是有构成的实体和附加信息(属性)组成的,属性块中块的定义与简单块中块的定义一样,而属性的定义主要是通过属性的AttributeDefinition类的有关属性和函数来实现的。具体实现有:

      a 、AttributeDefinition类的实例并设置对象的属性值;

      b、由于块的属性定义也可以看做是块中的实体,可以通过块表记录类的成员函数AppendEntity将属性定义附加到块中。

其中,属性定义的属性值主要有:

       文字的插入点、高度、旋转角度、对齐方式和宽度;

       属性的默认值;

       属性的模式,如不可见方式Invisible、常量方式Constant、验证方式Verify、预置方式Preset;

       属性标签名。

    

 1 /// 
 2         /// 块添加属性
 3         /// 
 4         /// 
 5         /// 
 6         public static void AddAttsToBlocks(this ObjectId blockId, List atts)
 7         {
 8             Database db = blockId.Database;//获取数据库对象
 9 
10             BlockTableRecord btr = blockId.GetObject(OpenMode.ForWrite) as BlockTableRecord;
11 
12             foreach (AttributeDefinition att in atts)
13             {
14                 btr.AppendEntity(att);
15 
16                 db.TransactionManager.AddNewlyCreatedDBObject(att, true);
17             }
18 
19             btr.DowngradeOpen();
20         }
21 
22 
23         public static void AddAttsToBlocks(this ObjectId blockId, params AttributeDefinition[] atts)
24         {
25             blockId.AddAttsToBlocks(atts.ToList());
26         }
属性块的定义

 

2、插入属性块

 块参照中的属性实体由DatabaseServices命名空间中的AttibuteReference类表示,它其实是一个单行文本对象,由DBText类派生。为块参照添加书体的步骤如下:

    1)打开块参照所属的块表记录对象;

    2)对块表记录中的实体进行循环遍历,如果实体是属性定义的对象,则根据它的标识为块参照属性对象设置属性值;

    3)获取块参照对象的属性集合对象来为块参照添加新创建的属性参照对象。属性集合对象由BlockReference的AttributeCollection 属性标识,调用它的AppendAttribute函数就可以完成块参照的属性添加。

 

 1 /// 
 2         /// 插入带属性的参照快
 3         /// 
 4         /// 空间的ID
 5         /// 块要加入的图层名
 6         /// 快参照所属的快名
 7         /// 插入点
 8         /// 缩放比例
 9         /// 旋转角度
10         /// 属性名称与取值
11         /// 
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                             attribute.TextString = attNameValues[attDef.Tag.ToUpper()].ToString();
63 
64                         }
65                         // 向块参照添加属性对象
66                         br.AttributeCollection.AppendAttribute(attribute);
67                         db.TransactionManager.AddNewlyCreatedDBObject(attribute, true);
68 
69                     }
70                 }
71             }
72             db.TransactionManager.AddNewlyCreatedDBObject(br, true);
73             return br.ObjectId;//返回添加的快参照的ID
74         }
插入带属性的块参照

 

 1  /// 
 2         /// 更新属性名称与取值
 3         /// 
 4         /// 
 5         /// 
 6         public static void UpdateAttributesInBlock(this ObjectId blockRefId, Dictionary<string, string> attNameValues)
 7         {
 8             BlockReference blockRef = blockRefId.GetObject(OpenMode.ForRead) as BlockReference;
 9             if (blockRef != null)
10             {
11                 foreach (ObjectId id in blockRef.AttributeCollection)
12                 {
13                     AttributeReference attref = id.GetObject(OpenMode.ForRead) as AttributeReference;
14                     if (attNameValues.ContainsKey(attref.Tag.ToUpper()))
15                     {
16                         attref.UpgradeOpen();
17                         //设置属性值
18                         attref.TextString = attNameValues[attref.Tag.ToUpper()].ToString();
19 
20                         attref.DowngradeOpen();
21                     }
22                 }
23 
24             }
25 
26         }
更新块参照

 

 

 

 

 

 

 

 

      

 


推荐阅读
  • 深入解析Android 4.4中的Fence机制及其应用
    在Android 4.4中,Fence机制是处理缓冲区交换和同步问题的关键技术。该机制广泛应用于生产者-消费者模式中,确保了不同组件之间高效、安全的数据传输。通过深入解析Fence机制的工作原理和应用场景,本文探讨了其在系统性能优化和资源管理中的重要作用。 ... [详细]
  • 利用PHP循环高效处理多条帖子表单数据 ... [详细]
  • C++ 异步编程中获取线程执行结果的方法与技巧及其在前端开发中的应用探讨
    本文探讨了C++异步编程中获取线程执行结果的方法与技巧,并深入分析了这些技术在前端开发中的应用。通过对比不同的异步编程模型,本文详细介绍了如何高效地处理多线程任务,确保程序的稳定性和性能。同时,文章还结合实际案例,展示了这些方法在前端异步编程中的具体实现和优化策略。 ... [详细]
  • 本文详细介绍了在 Oracle 数据库中使用 MyBatis 实现增删改查操作的方法。针对查询操作,文章解释了如何通过创建字段映射来处理数据库字段风格与 Java 对象之间的差异,确保查询结果能够正确映射到持久层对象。此外,还探讨了插入、更新和删除操作的具体实现及其最佳实践,帮助开发者高效地管理和操作 Oracle 数据库中的数据。 ... [详细]
  • 如何有效防御网站中的SQL注入攻击
    本期文章将深入探讨网站如何有效防御SQL注入攻击。我们将从技术层面详细解析防范措施,并结合实际案例进行阐述,旨在帮助读者全面了解并掌握有效的防护策略。希望本文能为您的网络安全提供有益参考。 ... [详细]
  • 在将Excel数据导入MySQL数据库的过程中,如何确保不会生成重复记录?本文介绍了一种方法,通过PHP脚本检查数据库中是否存在相同的“Code”字段值,从而避免重复记录的产生。该方法不仅提高了数据导入的准确性,还增强了系统的健壮性。 ... [详细]
  • MyISAM和InnoDB是MySQL中最为广泛使用的两种存储引擎,每种引擎都有其独特的优势和适用场景。MyISAM引擎以其简单的结构和高效的读取速度著称,适用于以读操作为主、对事务支持要求不高的应用。而InnoDB引擎则以其强大的事务处理能力和行级锁定机制,在需要高并发写操作和数据完整性的场景下表现出色。选择合适的存储引擎应综合考虑业务需求、性能要求和数据一致性等因素。 ... [详细]
  • 本指南从零开始介绍Scala编程语言的基础知识,重点讲解了Scala解释器REPL(读取-求值-打印-循环)的使用方法。REPL是Scala开发中的重要工具,能够帮助初学者快速理解和实践Scala的基本语法和特性。通过详细的示例和练习,读者将能够熟练掌握Scala的基础概念和编程技巧。 ... [详细]
  • 提升Android开发效率:Clean Code的最佳实践与应用
    在Android开发中,提高代码质量和开发效率是至关重要的。本文介绍了如何通过Clean Code的最佳实践来优化Android应用的开发流程。以SQLite数据库操作为例,详细探讨了如何编写高效、可维护的SQL查询语句,并将其结果封装为Java对象。通过遵循这些最佳实践,开发者可以显著提升代码的可读性和可维护性,从而加快开发速度并减少错误。 ... [详细]
  • 单链表的高效遍历及性能优化策略
    本文探讨了单链表的高效遍历方法及其性能优化策略。在单链表的数据结构中,插入操作的时间复杂度为O(n),而遍历操作的时间复杂度为O(n^2)。通过在 `LinkList.h` 和 `main.cpp` 文件中对单链表进行封装,我们实现了创建和销毁功能的优化,提高了单链表的使用效率。此外,文章还介绍了几种常见的优化技术,如缓存节点指针和批量处理,以进一步提升遍历性能。 ... [详细]
  • 作为软件工程专业的学生,我深知课堂上教师讲解速度之快,很多时候需要课后自行消化和巩固。因此,撰写这篇Java Web开发入门教程,旨在帮助初学者更好地理解和掌握基础知识。通过详细记录学习过程,希望能为更多像我一样在基础方面还有待提升的学员提供有益的参考。 ... [详细]
  • 本文探讨了如何利用 jQuery 的 JSONP 技术实现跨域调用外部 Web 服务。通过详细解析 JSONP 的工作原理及其在 jQuery 中的应用,本文提供了实用的代码示例和最佳实践,帮助开发者解决跨域请求中的常见问题。 ... [详细]
  • 本文总结了JavaScript的核心知识点和实用技巧,涵盖了变量声明、DOM操作、事件处理等重要方面。例如,通过`event.srcElement`获取触发事件的元素,并使用`alert`显示其HTML结构;利用`innerText`和`innerHTML`属性分别设置和获取文本内容及HTML内容。此外,还介绍了如何在表单中动态生成和操作``元素,以便更好地处理用户输入。这些技巧对于提升前端开发效率和代码质量具有重要意义。 ... [详细]
  • 本文详细探讨了MySQL数据库实例化参数的优化方法及其在实例查询中的应用。通过具体的源代码示例,介绍了如何高效地配置和查询MySQL实例,为开发者提供了有价值的参考和实践指导。 ... [详细]
  • DRF框架中Serializer反序列化验证机制详解:深入探讨Validators的应用与优化
    在DRF框架的反序列化验证机制中,除了基本的字段类型和长度校验外,还常常需要进行更为复杂的条件限制校验。通过引入`validators`模块,可以实现自定义校验逻辑,如唯一字段校验等。本文将详细探讨`validators`的使用方法及其优化策略,帮助开发者更好地理解和应用这一重要功能。 ... [详细]
author-avatar
假猫t_950
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有