Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Захаров Максим от 13-01-2022, 09:30:59

Название: Добавить атрибут в блок
Отправлено: Захаров Максим от 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
Название: Re: Добавить атрибут в блок
Отправлено: Александр Ривилис от 13-01-2022, 10:06:10
Захаров Максим,
Мне придется тебя огорчить, но в публичных API нет средств, позволяющих таким образом модифицировать динамические блоки. Ну и кроме того нужно сначала добавить определение атрибута к определению блока, а уже затем добавлять вставку атрибута к вставке блока.
Название: Re: Добавить атрибут в блок
Отправлено: Александр Ривилис от 13-01-2022, 10:19:32
Кроме того я не увидел строчки:
Код - vb.net [Выбрать]
  1. tr.AddNewlyCreatedDBObject(ad, True)
Название: Re: Добавить атрибут в блок
Отправлено: Захаров Максим от 13-01-2022, 11:00:10
О, как интересно. Я добавил такую строчку, все стало гораздо лучше, редактор блоков открывается, Параметр перемещения работает, естественно только для первых 4 атрибутов, но и 5 атрибут тоже можно перемещать только отдельно от остальных атрибутов. Если переити в редактор блоков, то там нет моего 5 атрибута. Скажите так можно оставить? Или могут быть какие то проблемы с таким блоком потом? Еще вопрос, почему  AttDef1.Prompt = "Новый атрибут" не сработала?
Название: Re: Добавить атрибут в блок
Отправлено: Александр Ривилис от 13-01-2022, 11:13:21
Еще вопрос, почему  AttDef1.Prompt = "Новый атрибут" не сработала?
Ну как минимум потому, что ты его открываешь ForRead. Странно, что вообще исключение не выскочило. И непонятно почему ты не задал Prompt сразу после ad.SetDatabaseDefaults()
Название: Re: Добавить атрибут в блок
Отправлено: Александр Ривилис от 13-01-2022, 11:15:10
Если переити в редактор блоков, то там нет моего 5 атрибута.
Это тоже очевидно, так как ты работаешь с BlockTableRecord не основного блока, а анонимного блока, соответствующего текущему состоянию динамического блока. Посмотри свойства этого блока при помощи MGDDBG.