| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > .NET > Как установить значения атрибутов динамического блока?

Как установить значения атрибутов динамического блока?

Ответ
Поиск в этой теме
Непрочитано 13.01.2020, 16:15 #1
Как установить значения атрибутов динамического блока?
Diam Finn
 
Инженер-проектировщик
 
Подмосковье
Регистрация: 25.12.2014
Сообщений: 5

Всем добрый день! Делаю первые шаги в написании плагинов на C# для AutoCad. Мне нужно вставить блоки (уже имеющиеся в базе блоков чертежа) по имени и заполнить для них значения атрибутов по их тэгу.
Написал следующий код:

Код:
[Выделить все]
 
                   public void Build() //Построение элемента секции на чертеже
                    {
                        //получаем БД текущего чертежа
                        Database Database = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Database;
                        double[] Coordinate = { 0, 0, 0 };
                        string BlockName = "ГС_РП_АВ";

                        using (Transaction AddElement = Database.TransactionManager.StartTransaction())
                        {
                            // получаем таблицу блоков данного чертежа
                            BlockTable BlockTable = (BlockTable)AddElement.GetObject(Database.BlockTableId, OpenMode.ForRead);
                            // получаем пространство модели
                            BlockTableRecord ModelSpace = (BlockTableRecord)AddElement.GetObject(BlockTable[BlockTableRecord.ModelSpace], OpenMode.ForWrite);

                            // создаем новый экземпляр блока на основе его определения
                            BlockReference QFBlock = new BlockReference (new Point3d(Coordinate[0], Coordinate[1], Coordinate[2]), BlockTable[BlockName]);

                            // добавляем экземпляр блока в базу данных пространства модели
                            ModelSpace.AppendEntity(QFBlock);
                            AddElement.AddNewlyCreatedDBObject(QFBlock, true);

                            //Прописываем значения атрибутов блока
                            foreach (ObjectId idAtrRef in QFBlock.AttributeCollection)
                            {
                                using (var atrRef = idAtrRef.GetObject(OpenMode.ForRead) as AttributeReference)
                                {

                                    switch (atrRef.Tag)
                                    {
                                        case "QF":
                                            atrRef.TextString = "QF1";
                                            break;
                                        case "NOM":
                                            atrRef.TextString = "16A";
                                            break;
                                        default:
                                            atrRef.TextString = " ";
                                            break;
                                    }
                                    QFBlock.AttributeCollection.AppendAttribute(atrRef);
                                    AddElement.AddNewlyCreatedDBObject(atrRef, true);
                                }
                            }
                                // закрываем транзакцию
                                AddElement.Commit();
                        }
                    }
Блок вставляется, но вообще без атрибутов. Как корректно вставить динамический блок и прописать его свойства?
Просмотров: 498
 
Непрочитано 13.01.2020, 19:07
#2
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,138


если я правильно помню, то атрибуты нужно самостоятельно добавлять во вставку блока, у Вас в коде этого нет.
Вот ссылка на справку: http://help.autodesk.com/view/ACD/20...D-83D603B41568
__________________
_бложиг
Boxa вне форума  
 
Непрочитано 13.01.2020, 19:37
#3
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,304
Отправить сообщение для Александр Ривилис с помощью Skype™


Тут пример кода: https://adn-cis.org/forum/index.php?...25546#msg25546
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 14.01.2020, 18:30
#4
Diam Finn

Инженер-проектировщик
 
Регистрация: 25.12.2014
Подмосковье
Сообщений: 5


Большое вам спасибо! Все работает как нужно. Универсальный метод для вставки блоков с указанием значений атрибутов получился таким:
Код:
[Выделить все]
 
public static void BuildBlock(string BlockName, double[] Coordinate, Dictionary<string, string> Attributes, string SpaceIndex) //Построение блока на чертеже
        {
            //получаем БД текущего чертежа
            Database Database = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Database;

            using (Transaction ACTransaction = Database.TransactionManager.StartTransaction())
            {
                // получаем таблицу блоков данного чертежа
                BlockTable BlockTable = (BlockTable)ACTransaction.GetObject(Database.BlockTableId, OpenMode.ForRead);

                ObjectId BlockRecordID = BlockTable[BlockName];
                BlockTableRecord acBlkTblRec = ACTransaction.GetObject(BlockRecordID, OpenMode.ForRead) as BlockTableRecord;

                // получаем пространство модели или листа
                BlockTableRecord CurrentSpace;
                if (SpaceIndex == "PaperSpace")
                {
                    CurrentSpace = (BlockTableRecord)ACTransaction.GetObject(BlockTable[BlockTableRecord.PaperSpace], OpenMode.ForWrite);
                }
                else
                {
                    CurrentSpace = (BlockTableRecord)ACTransaction.GetObject(BlockTable[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
                }
                
                // создаем новый экземпляр блока на основе его определения
                BlockReference CurrentBlock = new BlockReference(new Point3d(Coordinate[0], Coordinate[1], Coordinate[2]), BlockTable[BlockName]);

                // добавляем экземпляр блока в базу данных пространства модели
                CurrentSpace.AppendEntity(CurrentBlock);
                ACTransaction.AddNewlyCreatedDBObject(CurrentBlock, true);

                // Проверяем, есть ли у блока существующие атрибуты
                if (acBlkTblRec.HasAttributeDefinitions)
                {
                    // Добавляем существующие атрибуты в блок
                    foreach (ObjectId objID in acBlkTblRec)
                    {
                        DBObject dbObj = ACTransaction.GetObject(objID, OpenMode.ForRead) as DBObject;
                        if (dbObj is AttributeDefinition)
                        {
                            AttributeDefinition acAtt = dbObj as AttributeDefinition;
                            if (!acAtt.Constant)
                            {
                                using (AttributeReference acAttRef = new AttributeReference())
                                {
                                    acAttRef.SetAttributeFromBlock(acAtt, CurrentBlock.BlockTransform);
                                    acAttRef.Position = acAtt.Position.TransformBy(CurrentBlock.BlockTransform);
                                    acAttRef.TextString = acAtt.TextString;
                                    CurrentBlock.AttributeCollection.AppendAttribute(acAttRef);
                                    ACTransaction.AddNewlyCreatedDBObject(acAttRef, true);
                                }
                            }
                        }
                    }
                }

                //Прописываем значения атрибутов блока
                foreach (ObjectId idAtrRef in CurrentBlock.AttributeCollection)
                {
                    using (var atrRef = idAtrRef.GetObject(OpenMode.ForWrite) as AttributeReference)
                    {
                        if (Attributes.ContainsKey(atrRef.Tag))
                        {
                            atrRef.TextString = Attributes[atrRef.Tag];
                        }
                    }
                }
                // закрываем транзакцию
                ACTransaction.Commit();
            }
        }
Diam Finn вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > .NET > Как установить значения атрибутов динамического блока?

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Мои динамические блоки [2] Кулик Алексей aka kpblc Динамические блоки 4334 22.04.2019 09:16
Нужна помощь при вставке динамического блока tonkoshkurovs@mail.ru LISP 4 17.06.2016 10:53
Как обновить значения атрибутов в блоке valrond AutoCAD 7 01.09.2014 11:25
Сбой подсказок атрибутов динамического блока gool Динамические блоки 5 26.10.2011 09:29
C# .net переопределение динамического блока из внешнего файла bargool .NET 35 18.10.2011 16:03