Создание AttributeDefinition

Автор Тема: Создание AttributeDefinition  (Прочитано 9053 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн LemieuxАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 389
  • Карма: 21
Создание AttributeDefinition
« : 23-08-2023, 15:24:42 »
Всех приветствую.
Имеется код, который загружает чертёж и добавляет атрибут. Но поведение созданного атрибута очень странное - я указываю AlignmentPoint, но атрибут так и остаётся в координатах 0,0,0, хотя грип от AlignmentPoint показывается в нужной точке. Если изменить выравнивание, то атрибут встаёт на место, куда надо.

Код - C# [Выбрать]
  1.         private void BatchFiles(string pathDirectory)
  2.         {
  3.             DirectoryInfo dir = new DirectoryInfo(pathDirectory);
  4.             FileInfo[] dwgFiles = dir.GetFiles("*.dwg");
  5.             foreach (FileInfo dwgFile in dwgFiles)
  6.             {
  7.                 using (Database database = new Database(false, true))
  8.                 {
  9.                     using (Transaction transaction = database.TransactionManager.StartTransaction())
  10.                     {
  11.                         database.ReadDwgFile(dwgFile.FullName, FileShare.Read, true, null);
  12.                         BlockTableRecord modelSpace = transaction.GetObject(database.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
  13.                         ObjectId attributeDefinitionId = modelSpace
  14.                             .OfType<ObjectId>()
  15.                             .Where(id => id.ObjectClass.DxfName.Equals("ATTDEF") &&
  16.                                 (transaction.GetObject(id, OpenMode.ForRead) as AttributeDefinition).Tag.Equals("UC-EMLP"))
  17.                             .FirstOrDefault();
  18.                         if (attributeDefinitionId != ObjectId.Null)
  19.                         {
  20.                             AttributeDefinition attributeDefinition = transaction.GetObject(attributeDefinitionId, OpenMode.ForRead) as AttributeDefinition;
  21.                             Point3d alignmentPoint = attributeDefinition.AlignmentPoint;
  22.  
  23.                             using (AttributeDefinition newAttributeDefinition = new AttributeDefinition())
  24.                             {
  25.                                 newAttributeDefinition.Justify = AttachmentPoint.TopCenter;
  26.                                 newAttributeDefinition.AlignmentPoint = new Point3d(0, alignmentPoint.Y - 4.5, 0);
  27.                                 newAttributeDefinition.Tag = "TERM_PWR";
  28.                                 newAttributeDefinition.Height = 3.5;
  29.                                 newAttributeDefinition.TextString = " ";
  30.                                 newAttributeDefinition.LockPositionInBlock = true;
  31.                                 newAttributeDefinition.Verifiable = true;
  32.                                 modelSpace.AppendEntity(newAttributeDefinition);
  33.                                 transaction.AddNewlyCreatedDBObject(newAttributeDefinition, true);
  34.                             }
  35.                         }
  36.                         transaction.Commit();
  37.                     }
  38.                     database.SaveAs(dwgFile.FullName, true, DwgVersion.Current, null);
  39.                 }
  40.             }
  41.             DirectoryInfo[] directories = dir.GetDirectories();
  42.             foreach (DirectoryInfo directory in directories)
  43.             {
  44.                 BatchFiles(directory.FullName);
  45.             }
  46.         }

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Создание AttributeDefinition
« Ответ #1 : 23-08-2023, 17:52:11 »
Задай кроме newAttributeDefinition.AlignmentPoint еще и newAttributeDefinition.Position.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн LemieuxАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 389
  • Карма: 21
Re: Создание AttributeDefinition
« Ответ #2 : 23-08-2023, 21:15:54 »
Задай кроме newAttributeDefinition.AlignmentPoint еще и newAttributeDefinition.Position.
Это я пробовал. Просто такой код отлично работает в открытом документе, а вот если грузить базу, то не работает.

Отмечено как Решение Lemieux 24-08-2023, 08:34:27

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Создание AttributeDefinition
« Ответ #3 : 23-08-2023, 22:23:05 »
Это я пробовал. Просто такой код отлично работает в открытом документе, а вот если грузить базу, то не работает.
Для сторонней базы необходимо:
1. Временно переключать HostApplicationServices.WorkingDatabase на стороннюю базу (database в твоём коде)
2. Использовать метод newAttributeDefinition.AdjustAlignment(database)
3. Попробуй сначала делать modelSpace.AppendEntity(newAttributeDefinition);, а затем уже менять свойства newAttributeDefinition
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн LemieuxАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 389
  • Карма: 21
Re: Создание AttributeDefinition
« Ответ #4 : 24-08-2023, 08:35:14 »
Это я пробовал. Просто такой код отлично работает в открытом документе, а вот если грузить базу, то не работает.
Для сторонней базы необходимо:
1. Временно переключать HostApplicationServices.WorkingDatabase на стороннюю базу (database в твоём коде)
2. Использовать метод newAttributeDefinition.AdjustAlignment(database)
3. Попробуй сначала делать modelSpace.AppendEntity(newAttributeDefinition);, а затем уже менять свойства newAttributeDefinition
Всё получилось, спасибо.
Использовал newAttributeDefinition.AdjustAlignment(database) после modelSpace.AppendEntity(newAttributeDefinition)