Тема: положение атрибута

С помощью ниже напечатанной процедуры меняю значения атрибутов в чертеже. Но не все атрибуты встают на место в блоке правильно(посередине окошка), хотя если менять вручную, то все ОК. Может кто посоветует - чертежей много, около тысячи?

Private Sub FileProcessing(MainDoc As AxDbDocument)
    Dim MS As AcadModelSpace
    Set MS = MainDoc.ModelSpace
    Dim i As Integer
    Dim entObjectID As Long
    Dim tempObj As AcadObject
    Dim atribut, a As Variant
    Dim ent As AcadEntity
    Dim blokref As AcadBlockReference
    Dim stitek_atributu, newText, blokname As String
    Dim itemLocked As Boolean
    Dim pageObject As Page
    For Each pageObject In Me.MultiPage1.Pages
        On Error Resume Next
        For i = 0 To MS.count
            entObjectID = MS.Item(i).ObjectID
            Set tempObj = MainDoc.ObjectIdToObject(entObjectID)
            If (TypeOf tempObj Is AcadBlockReference) Then
                If (tempObj.Name = blokname) Then
                    Set ent = tempObj
                    Set blokref = ent
                    atribut = blokref.GetAttributes
                    a = -1
                    Do
                        a = a + 1
                        If (atribut(a).TagString = stitek_atributu) Then
                            atribut(a).TextString = newText
                        End If
                    Loop While atribut(a).TagString <> stitek_atributu
                End If
            End If
        Next i
    Next pageObject
    End Sub

Re: положение атрибута

А выравнивание аттрибутов какое?

Re: положение атрибута

выравнивание средний-центр, расположение меняется при разной длине величины атрибута, пробовал устанавливать в свойствах объекта место расположения насильно (InsertPoint) - никакого резулытата!

Re: положение атрибута

При выравнивании acAlignmentMiddleCenter текст распологается подле свойства TextAlignmentPoint, а он то и не меняется при замене atribut(a).TextString = newText. Допустим если меняем на более длинный текст, то точка расположения относительно рамки остается на месте, а относительно текста смещается в лево! Надо придумать какую-нибудь процедуру для расчета TextAlignmentPoint для нового текста! Может кто чо лучше подскажет?

Re: положение атрибута

> andrej2005
Бредовая конешно идея но.
А если сначало вставлять текст;определять Left точку текста через боундинг; и назначить эту точку в InsertionPoint атрибута :crazy::crazy::crazy:
Текс ессно потом удалить.
А вообще не понятная фича DBXа, в простом каде ничего подобного не происходит.

Re: положение атрибута

Ой глюканул. Чтобы у текста точка Left = InsertionPoint. Так что с боундингом я перегнул.

Re: положение атрибута

Запутался совсем.
Ща еще покумекаю.)

Re: положение атрибута

Может, способ паллиативный, но мне кажется, должен действовать. Перед изменением применить к atribut(a) метод GetBoundingBox, найти и запомнить центральную точку (p1), затем после atribut(a).TextString = newText повторить (p2), и если точки не совпадают, то

atribut(a).Move p1, p2

По идее, должно работать независимо от выравнивания атрибута, хотя не проверял.

Re: положение атрибута

А если прочитать http://www.arcada.com.ua/forum/viewtopi … b37c1b15cb ?

Re: положение атрибута

> Alex
Да он гад (DBX), при не изменяет точку TextAlignmentPoint у атрибута при изменении текста, она остается там где и была. В этом вся фишка. Причем она распространяется и на текст (успел проверить).
Имхо, первое мое предположение должно сработать. Я имею ввиду, с временным текстом, и определением его боундинга и точки Left. Блин акад сдох, все эсперименты сорвались. Может дома еще поэкпериментю.

Re: положение атрибута

> Кулик
Алексей aka kpblc
Да тут точно грю в DBXе дело, попробуй.
Меня немного шокировала такая фигня. Открыл я файл после обработки его DBxом, жму на атрибут, и вижу дребедень с centre точкой, она не в центре ))). Потом при изменении текста атрибута, она нормализуется.
Корову от дельфина я отличил )))

Re: положение атрибута

> AlexV
Нет, к сожалению баундинг остается неизменный - независит от длинны заменяемого текста. Ща еще гляну, что советует прочитать Кулик Алексей.

Re: положение атрибута

А если так?
1. Запомнить выравнивание атрибута, его InsertionPoint и TextAlignmentPoint.
2. Изменить значение атрибута
3. Установить Alignment, InsertionPoint, TextAlignmentPoint
4. Выполнить Update для вхождения блока.

Re: положение атрибута

P.S. На готовый код сейчас меня не хватит.

Re: положение атрибута

> Кулик Алексей aka kpblc
дело в том, что я хотел бы ориентироваться на библиотеку DBX, потому-что чертежей много и ктому же разбросаны в фирменной сети - хотелось бы их обрабатывать в фоновом режиме, а изменения в этих чертежах появляются в очень динамичном режиме

Re: положение атрибута

> Кулик Алексей aka kpblc
такое не проходит, просто новое значение TextAlignmentPoint для нового текста эта библиотека не расчитывает, а как выскользнуть пока не представляю. Как писал выше: при выравнивании acAlignmentMiddleCenter текст распологается подле свойства TextAlignmentPoint.

Re: положение атрибута

> Vildar
Вот с временным текстом - это идея, уже иду пробовать!

Re: положение атрибута

> andrej2005
Я имел ввиду нечто вроде:

Dim minExt As Variant
Dim maxExt As Variant
Dim ptc1(0 To 2) As Double
Dim ptc2(0 To 2) As Double
'.......
 For i = 0 To MS.Count
    entObjectID = MS.Item(i).ObjectID
    Set tempObj = MainDoc.ObjectIdToObject(entObjectID)
    If (TypeOf tempObj Is AcadBlockReference) Then
        If (tempObj.Name = blokname) Then
            Set ent = tempObj
            Set blokref = ent
            atribut = blokref.GetAttributes
            a = -1
            Do
               a = a + 1
               If (atribut(a).TagString = stitek_atributu) Then
                   atribut(a).GetBoundingBox minExt, maxExt
                   ptc1(0) = (minExt(0) + maxExt(0)) / 2
                   ptc1(1) = (minExt(1) + maxExt(1)) / 2
                   ptc1(2) = minExt(0)
                   atribut(a).TextString = newText
                   atribut(a).GetBoundingBox minExt, maxExt
                   ptc2(0) = (minExt(0) + maxExt(0)) / 2
                   ptc2(1) = (minExt(1) + maxExt(1)) / 2
                   ptc2(2) = minExt(0)
                   If ptc1(0) <> ptc2(0) Or ptc1(1) <> ptc2(1) Then
                      atribut(a).Move ptc2, ptc1
                   End If
                 End If
              Loop While atribut(a).TagString <> stitek_atributu
          End If
    End If
Next i
'.......

Неужели atribut(a).GetBoundingBox minExt, maxExt выдает одинаковые minExt, maxExt не зависимо от длины текстовой строки?

Re: положение атрибута

По крайней мере, я у себя проверил (правда, по-простому, с выбором блоков из открытого файла)- все работает, после изменения текста центр атрибута остается на месте независимо от его выравнивания. Хотя, может, я не так понял и нужна привязка к левому краю?

Re: положение атрибута

У меня вот че получилось

Private Function SetAtrTextInDBX(MS As AcadModelSpace, objAtr As AcadAttributeReference, newText As String)
   'установкв значения атрибуту с сохранением центральной точки, в режиме DBX
   Dim dPtLeft(2) As Double
   Dim dPtOrigCentre() As Double
   Dim varPtMin As Variant
   Dim varPtMax As Variant
   Dim dDeltaX As Double
   Dim dCosA As Double
   Dim dSinA As Double
   Dim dLenPol As Double
   Dim objText As AcadText
   Dim dPtText(2) As Double
   'точка центра атрибута
   dPtOrigCentre = objAtr.TextAlignmentPoint
   'задаем значение атрибуту
   objAtr.TextString = newText
   'создаем временный текст
   Set objText = MS.AddText(newText, dPtText, objAtr.Height)
   'проблема со сжатием текста атрибута, если установлено тличное от 1 то косяк!!!
   objText.StyleName = objAtr.StyleName
   'получаем границы текста
   objText.GetBoundingBox varPtMin, varPtMax
   'удаляем текст
   objText.Delete
   'далее геометрия
   dDeltaX = varPtMax(0) - varPtMin(0)
   dCosA = Cos(objAtr.Rotation)
   dSinA = Sin(objAtr.Rotation)
   dLenPol = dDeltaX / 2
   'получаем точку начала атрибута - Left
   dPtLeft(0) = dPtOrigCentre(0) - dCosA * dLenPol
   dPtLeft(1) = dPtOrigCentre(1) - dSinA * dLenPol
   'назначаем ее атрибуту
   objAtr.InsertionPoint = dPtLeft
   'все
End Function

> andrej2005
С тебя пыво!> AlexV (2008-11-28 19:05:38)
У нас есть отличие в результатах. После твоего центр у атрибута съезжает, а после моего нет!
Но я помудохался блин. Теорему пифагора вспоминал )))

Re: положение атрибута

Время убил, незаметно и насмерть )))

Re: положение атрибута

> AlexV
Я должен извинится - баудинг действительно меняется. Но на работе все выглядело достаточно реалистично, все оставалось на старых значениях. Я просто устал, отупел и глаза замылились. Иду спать.

> Vildar
Да, и я себе это так приблизительно представлял, только центр бы вычислил по т. Пифагора - не люблю тригонометрию.
Всем спасибо!

Re: положение атрибута

> AlexV
Дико извиняюсь, баудинг действительно меняется. Я просто устал, отупел и глаза замылились. Иду спать. Но на работе он как бы реально не менялся!

> Vildar
Да, и я себе все это так приблизительно представлял, только центр нашел бы по т. Пифагора.
Всем спасибо!

Re: положение атрибута

> Vildar
Ну да, угол поворота атрибута я не учел. Хотя если применить геометрию к моему способу, то резалт тоже будет.

Re: положение атрибута

> Vildar
Проверил еще раз свой код, с отличным от 0 углом поворота,- работает корректно, независимо от выравнивания и степени растяжения атрибута. Повторюсь, корректно в случае если атрибут выравнивается по центру. У тебя же, судя по всему, - по левому краю? Кстати, в процедуре не определены значения dPtText перед MS.AddText.
Правда, я с DBX дел никогда не имел, проверял просто в открытом файле. Интересно, я тут почитал кратко, что "ObjectDBX™ — это библиотека языка C++", и что - можно эту технологию использовать в VBA?