ADN Club > AutoCAD .NET API
Добавить атрибут в блок
Захаров Максим:
Добрый день.
Подскажите пожалуйста. У меня есть блок в чертеже с 4 атрибутами, записанными в столбик. Все атрибуты перемещаются с помощью параметра перемещения (параметр перемещения - один).
Я програмно добавляю 5 атрибут, он добавляется, но видимо "криво", потому что оператор перемещения "слетает" со всех атрибутов, и редактор блоков больше не работает корректно. А хотелось бы чтобы и к этому (пятому) атрибуту этот параметр применить.
--- Код - vb.net [Выбрать] ---Using tr Dim resBlk As PromptEntityResult = Nothing Dim opt As PromptEntityOptions = New PromptEntityOptions(vbLf & "Выберите объект: ") resBlk = m_Editor.GetEntity(opt) Dim pvId As ObjectId = resBlk.ObjectId Dim blk As Autodesk.AutoCAD.DatabaseServices.BlockReference = tr.GetObject(pvId, OpenMode.ForWrite) Dim bt As BlockTable = tr.GetObject(acCurDb.BlockTableId, OpenMode.ForRead) Dim btr As BlockTableRecord = CType(tr.GetObject(bt(blk.Name), OpenMode.ForWrite), BlockTableRecord) Dim attCol As AttributeCollection = blk.AttributeCollection Dim minPosAttr1 As Double = 9000000 Dim posattr As Point3d = Nothing For Each attId As ObjectId In attCol Dim attRef As AttributeReference = tr.GetObject(attId, OpenMode.ForRead) Dim pos As Point3d = attRef.Position Dim h As Double = attRef.Height If pos.Y < minPosAttr1 Then minPosAttr1 = pos.Y posattr = pos End If Next '\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ 'добавляем атрибут 'номер точки Dim ad As AttributeDefinition = New AttributeDefinition ad.SetDatabaseDefaults() Dim ar As AttributeReference = New AttributeReference() ar.SetAttributeFromBlock(ad, blk.BlockTransform) blk.AttributeCollection.AppendAttribute(ar) btr.AppendEntity(ad) tr.AddNewlyCreatedDBObject(ar, True) ar.Tag = "New" ar.TextString = "1" ar.Position = New Point3d(posattr.X, minPosAttr1 - 1.7, 0) Dim obj1 As Autodesk.AutoCAD.DatabaseServices.Entity = tr.GetObject(ad.ObjectId, OpenMode.ForRead) If TypeOf obj1 Is AttributeDefinition Then Dim AttDef1 As AttributeDefinition = obj1 AttDef1.Prompt = "Новый атрибут" End If tr.Commit() End Using
Александр Ривилис:
Захаров Максим,
Мне придется тебя огорчить, но в публичных API нет средств, позволяющих таким образом модифицировать динамические блоки. Ну и кроме того нужно сначала добавить определение атрибута к определению блока, а уже затем добавлять вставку атрибута к вставке блока.
Александр Ривилис:
Кроме того я не увидел строчки:
--- Код - vb.net [Выбрать] ---tr.AddNewlyCreatedDBObject(ad, True)
Захаров Максим:
О, как интересно. Я добавил такую строчку, все стало гораздо лучше, редактор блоков открывается, Параметр перемещения работает, естественно только для первых 4 атрибутов, но и 5 атрибут тоже можно перемещать только отдельно от остальных атрибутов. Если переити в редактор блоков, то там нет моего 5 атрибута. Скажите так можно оставить? Или могут быть какие то проблемы с таким блоком потом? Еще вопрос, почему AttDef1.Prompt = "Новый атрибут" не сработала?
Александр Ривилис:
--- Цитата: Захаров Максим от 13-01-2022, 11:00:10 --- Еще вопрос, почему AttDef1.Prompt = "Новый атрибут" не сработала?
--- Конец цитаты ---
Ну как минимум потому, что ты его открываешь ForRead. Странно, что вообще исключение не выскочило. И непонятно почему ты не задал Prompt сразу после ad.SetDatabaseDefaults()
Навигация
Перейти к полной версии