Обмен технологиями

Вторичная разработка САПР (12) – Определение и использование блоков

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Блоки — очень важный элемент знаний в САПР. Сегодня я дам вам некоторую классификацию и введение в блоки, а также их определение и ссылку на них.

1. Концепция

1.1 Определение блока

Блок — это объект, определяемый несколькими логически связанными графическими объектами. Преимущество состоит в том, что он может унифицировать стандарты работы и повысить эффективность работы, поскольку объект в жизни не является простой единицей, а может состоять из нескольких блоков. Блоки вполне могут представлять эту структуру.

Сущность блока — это совокупность объектов сущностей, хранящихся в записях таблицы блоков.

1.2 Определение блока свойств

Блоки атрибутов состоят из сущностей и дополнительной информации (атрибутов). Определение блоков в блоке атрибутов такое же, как и в простом блоке, и определение атрибутов в основном достигается с помощью соответствующих атрибутов и функций класса AttributeDefinition. . Конкретные реализации включают в себя:

  1. Экземпляр класса AttributeDefinition, устанавливающий значение атрибута объекта;
  2. Поскольку определение атрибута блока также можно рассматривать как сущность в блоке, определение атрибута можно прикрепить к блоку через функцию-член AppendEntity класса записи таблицы блоков.

Среди них значения атрибутов, определяемые атрибутами, в основном включают:

  • Точка вставки, высота, угол поворота, выравнивание и ширина текста;
  • Значение атрибута по умолчанию;
  • Режим атрибута, такой как невидимый режим, невидимый режим, постоянный режим, постоянный режим, режим проверки, режим проверки и предустановленный режим, предустановка;
  • Имя тега атрибута.

1.3 Определение динамического блока

Динамические блоки позволяют нам создавать блоки с высокой степенью гибкости и настраиваемости. Потому что, как только традиционный блок вставляется в чертеж, его размер, форма и расположение обычно фиксируются. С другой стороны, динамические блоки могут корректировать свои геометрические свойства посредством взаимодействия с пользовательским интерфейсом (например, перетаскиванием маркеров действий) без необходимости переопределять весь блок или вручную редактировать его компоненты.

1.4 Классификация блоков и операции

Блоки в основном делятся на простые блоки, блоки атрибутов и динамические блоки. Для блоков существуют в основном операции определения блока, операции ссылки на блок (то есть операции вставки блока) и редактирование блока.

2. Определение блока

2.1 Определение блока

Независимо от типа блока, их определения примерно одинаковы (к блокам атрибутов необходимо добавлять объекты атрибутов. Конкретные шаги заключаются в следующем:

  1. Используйте функцию GetObject() класса Transaction, чтобы получить объект таблицы блоков;
  2. Создайте объект BlockTableRecord и задайте имя блока;
  3. Создайте объекты сущности, составляющие блок;
  4. Вызовите функцию AppendEntity класса BlockTableRecord, чтобы записать сущности, составляющие блок, в запись таблицы блоков;
  5. Вызовите функцию Add класса BlockTable, чтобы записать созданные записи таблицы блоков в таблицу блоков текущего чертежа.

Конкретный код выглядит следующим образом:

public static ObjectId AddBlockThroughDB(this Database db, string blockName, List<Entity> ents)
        {
            //声明ObjectId,用于返回
            ObjectId entId = ObjectId.Null;
            using (Transaction tr = db.TransactionManager.StartTransaction())
            {
                BlockTable bt = (BlockTable)db.BlockTableId.GetObject(OpenMode.ForWrite);
                BlockTableRecord btr = new BlockTableRecord();
                btr.Name = blockName;
                for (int ii = 0; ii < ents.Count; ii++)
                {
                    Entity ent = ents[ii];
                    btr.AppendEntity(ent);
                }                    
                entId = bt.Add(btr);
                tr.AddNewlyCreatedDBObject(btr, true);
                tr.Commit();
            }
            return entId;
        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

2.2 Определение блока свойств

Вышеупомянутое — это просто определение простого блока. Для блоков атрибутов, как следует из названия, вам необходимо определить поля атрибутов в блоке (мы можем понимать это как определение переменных атрибутов, которые необходимо преобразовать в определенные значения переменных). при ссылке).
Определение блока свойств, мы можем добавить к нему свойства, добавив свойства.

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

Добавляет атрибуты к указанному определению блока. Мы можем использовать его следующим образом:

 		//属性添加
        AttributeDefinition attr1 = new AttributeDefinition(Point3d.Origin, "箱变", "箱变编号", "请输入箱变编号", ObjectId.Null);
        AttributeDefinition attr2 = new AttributeDefinition(Point3d.Origin + new Vector3d(0, 0.25, 0),
            "变电站", "变电站编号", "请输入变电站编号", ObjectId.Null);
            
       //然后将这两个属性加入到集合,再调用上面的方法即可。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Описание параметра следующее:

  • Позиция Point3d: это свойствоопределенное местоположение , заданное в виде трехмерных координат. Даже если ваш проект работает на двухмерной плоскости, вам необходимо указать трехмерную координатную точку, а значение Z обычно устанавливается равным 0.
  • строковое значение: определяется атрибутомзначение по умолчанию . Если при вставке блока не указано конкретное значение атрибута, используется это значение по умолчанию.
  • строковый тег: определяется атрибутомЭтикетка , который является его уникальным идентификатором. Когда блок вставлен, на значение атрибута можно ссылаться и изменять его с помощью этого тега.
  • строковое приглашение: это атрибутПодсказка , когда пользователю необходимо ввести значение атрибута при вставке блока, будет отображено это сообщение с подсказкой. Это поле можно оставить пустым, если ввод данных пользователем не требуется.
  • Стиль ObjectId: этоИдентификатор объекта стиля шрифта . В AutoCAD стиль шрифта определяет внешний вид текста атрибута, включая шрифт, размер, соотношение ширины и т. д. Этот параметр должен быть идентификатором допустимого объекта стиля шрифта, в противном случае может быть выдано исключение.

2.3 Определение динамического блока

Определение динамических блоков требует использования блоков атрибутов.DynamicBlockReferencePropertyCollectionКлассы накладывают ограничения на свойства.

3. Ссылка на блок (вставка кадра)

3.1 Обычная вставка блока

public void Insert()
{
    Database db = HostApplicationServices.WorkingDatabase;
    using (Transaction trans = db.TransactionManager.StartTransaction())
    {
        BlockTable bt = (BlockTable)db.BlockTableId.GetObject(OpenMode.ForRead);
        BlockTableRecord space = db.CurrentSpaceId.GetObject(OpenMode.ForWrite) as BlockTableRecord;
        //判断名为“块1”的块是否存在
        if(! bt["块1"].IsNull)
        {
            BlockReference br = new BlockReference(Point3d.Origin, bt["块1"]);
            br.ScaleFactors = new Scale3d(2.0);//设置尺寸为原来2倍
            space.AppendEntity(br);
            trans.AddNewlyCreatedDBObject(br, true);

            trans.Commit();
        }
        else
        {
            return;
        }        
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

3.2 Вставка блока атрибутов

Сущность атрибута в ссылке на блок представлена ​​классом AttibuteReference в пространстве имен DatabaseServices, который на самом деле представляет собой однострочный текстовый объект, производный от класса DBText. Чтобы добавить атрибуты во вхождение блока, выполните следующие действия:

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

Некоторые из вышеперечисленных параметров могут не потребоваться, например, коэффициент масштабирования и коэффициент вставки.

3.3 Изменение атрибута

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