ADN Club > AutoCAD .NET API

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

(1/2) > >>

Захаров Максим:
Добрый день.
Подскажите пожалуйста. У меня есть блок в чертеже с 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()

Навигация

[0] Главная страница сообщений

[#] Следующая страница

Перейти к полной версии