Добавить атрибут в блок

Автор Тема: Добавить атрибут в блок  (Прочитано 3450 раз)

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

Оффлайн Захаров МаксимАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 139
  • Карма: 3
Добавить атрибут в блок
« : 13-01-2022, 09:30:59 »
Добрый день.
Подскажите пожалуйста. У меня есть блок в чертеже с 4 атрибутами, записанными в столбик. Все атрибуты перемещаются с помощью параметра перемещения (параметр перемещения - один).
Я програмно добавляю 5 атрибут, он добавляется, но видимо "криво", потому что оператор перемещения "слетает" со всех атрибутов, и редактор блоков больше не работает корректно. А хотелось бы чтобы и к этому (пятому) атрибуту этот параметр применить.
Код - vb.net [Выбрать]
  1. Using tr
  2.             Dim resBlk As PromptEntityResult = Nothing
  3.             Dim opt As PromptEntityOptions = New PromptEntityOptions(vbLf & "Выберите объект: ")
  4.             resBlk = m_Editor.GetEntity(opt)
  5.             Dim pvId As ObjectId = resBlk.ObjectId
  6.             Dim blk As Autodesk.AutoCAD.DatabaseServices.BlockReference = tr.GetObject(pvId, OpenMode.ForWrite)
  7.             Dim bt As BlockTable = tr.GetObject(acCurDb.BlockTableId, OpenMode.ForRead)
  8.             Dim btr As BlockTableRecord = CType(tr.GetObject(bt(blk.Name), OpenMode.ForWrite), BlockTableRecord)
  9.             Dim attCol As AttributeCollection = blk.AttributeCollection
  10.             Dim minPosAttr1 As Double = 9000000
  11.             Dim posattr As Point3d = Nothing
  12.             For Each attId As ObjectId In attCol
  13.                 Dim attRef As AttributeReference = tr.GetObject(attId, OpenMode.ForRead)
  14.                 Dim pos As Point3d = attRef.Position
  15.                 Dim h As Double = attRef.Height
  16.                 If pos.Y < minPosAttr1 Then
  17.                     minPosAttr1 = pos.Y
  18.                     posattr = pos
  19.                 End If
  20.             Next
  21.             '\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
  22.             'добавляем атрибут
  23.             'номер точки
  24.             Dim ad As AttributeDefinition = New AttributeDefinition
  25.             ad.SetDatabaseDefaults()
  26.             Dim ar As AttributeReference = New AttributeReference()
  27.             ar.SetAttributeFromBlock(ad, blk.BlockTransform)
  28.             blk.AttributeCollection.AppendAttribute(ar)
  29.             btr.AppendEntity(ad)
  30.             tr.AddNewlyCreatedDBObject(ar, True)
  31.             ar.Tag = "New"
  32.             ar.TextString = "1"
  33.             ar.Position = New Point3d(posattr.X, minPosAttr1 - 1.7, 0)
  34.             Dim obj1 As Autodesk.AutoCAD.DatabaseServices.Entity = tr.GetObject(ad.ObjectId, OpenMode.ForRead)
  35.             If TypeOf obj1 Is AttributeDefinition Then
  36.                 Dim AttDef1 As AttributeDefinition = obj1
  37.                 AttDef1.Prompt = "Новый атрибут"
  38.             End If
  39.             tr.Commit()
  40.         End Using

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Добавить атрибут в блок
« Ответ #1 : 13-01-2022, 10:06:10 »
Захаров Максим,
Мне придется тебя огорчить, но в публичных API нет средств, позволяющих таким образом модифицировать динамические блоки. Ну и кроме того нужно сначала добавить определение атрибута к определению блока, а уже затем добавлять вставку атрибута к вставке блока.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Добавить атрибут в блок
« Ответ #2 : 13-01-2022, 10:19:32 »
Кроме того я не увидел строчки:
Код - vb.net [Выбрать]
  1. tr.AddNewlyCreatedDBObject(ad, True)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Захаров МаксимАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 139
  • Карма: 3
Re: Добавить атрибут в блок
« Ответ #3 : 13-01-2022, 11:00:10 »
О, как интересно. Я добавил такую строчку, все стало гораздо лучше, редактор блоков открывается, Параметр перемещения работает, естественно только для первых 4 атрибутов, но и 5 атрибут тоже можно перемещать только отдельно от остальных атрибутов. Если переити в редактор блоков, то там нет моего 5 атрибута. Скажите так можно оставить? Или могут быть какие то проблемы с таким блоком потом? Еще вопрос, почему  AttDef1.Prompt = "Новый атрибут" не сработала?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Добавить атрибут в блок
« Ответ #4 : 13-01-2022, 11:13:21 »
Еще вопрос, почему  AttDef1.Prompt = "Новый атрибут" не сработала?
Ну как минимум потому, что ты его открываешь ForRead. Странно, что вообще исключение не выскочило. И непонятно почему ты не задал Prompt сразу после ad.SetDatabaseDefaults()
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Добавить атрибут в блок
« Ответ #5 : 13-01-2022, 11:15:10 »
Если переити в редактор блоков, то там нет моего 5 атрибута.
Это тоже очевидно, так как ты работаешь с BlockTableRecord не основного блока, а анонимного блока, соответствующего текущему состоянию динамического блока. Посмотри свойства этого блока при помощи MGDDBG.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение