Тема: Как получить доступ к изменяемому обьекту?

Private Sub AcadDocument_ObjectModified(ByVal Object As Object)
End Sub
Из этого кода ясно, что обьект можно только прочитать, при попытке изменить какое либо свойство возникает ошибка, как получить полный доступ по этому событию?

Re: Как получить доступ к изменяемому обьекту?

Private Sub AcadDocument_ObjectModified(ByVal Object As Object)
     MsgBox Object.ObjectName
     MsgBox Object.Handle
End Sub

Данная процедура запускается после модификации объекта. О какой ошибке речь? У меня все это прекрасно работает, или может я не понял проблему?...

Re: Как получить доступ к изменяемому обьекту?

> Leonid
Работает

Private Sub AcadDocument_ObjectModified(ByVal Object As Object)
     MsgBox Object.Color
End Sub

Но не работает например

Private Sub AcadDocument_ObjectModified(ByVal Object As Object)
     Object.Color = 5
End Sub

В этот момент свойства объекта очевидно Read Only. А в принципе, логично. Не зациклится.
Можно конечно сохранить указатель на объект в переменной и уже после окончания процедуры поменять его свойство. А как это сделать? Может какой нибудь таймер возможно привинтить? Но в АКАДе его не накопал....

Re: Как получить доступ к изменяемому обьекту?

Да, все правильно, получить какое либо свойство можно, а вот присвоить никак. Что делать???

Re: Как получить доступ к изменяемому обьекту?

VK пишет:

Можно конечно сохранить указатель на объект в переменной и уже после окончания процедуры поменять его свойство. А как это сделать?

Private Sub AcadDocument_ObjectModified(ByVal Object As Object)
    Dim objHandle As String
    objHandle = Object.Handle
    call GetObj (objHandle)
'отмена несанкционированной модификации
     SendCommand "_u"
 End Sub
Sub GetObj(objHandle As String)
    Dim AcadObj As AcadObject
    Set AcadObj = ThisDrawing.HandleToObject(objHandle)
    AcadObj.Color=5
End Sub

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

Re: Как получить доступ к изменяемому обьекту?

Каюсь, был неправ в последнем листинге.Эта конструкция, действительно, не работаетю.Но, что интересно, команда "undo" проходит.
Значит объект не так уж и недоступен внутри процедуры ObjectModified.  В конце концов, все это лишний раз подтверждает, что обсуждаемая процедура не предназначена для модификации объектов.

Re: Как получить доступ к изменяемому обьекту?

Вполне возможно, что нельзя ничего сделать "в лоб". Но должны же быть обходные пути.
А для чего это может пригодиться... Например пометить цветом примитивы, которые были изменены начиная с какого то момента. Если б заработало - то процедура могла бы это делать на полном автомате.

Re: Как получить доступ к изменяемому обьекту?

Можно конечно сохранить указатель на объект в переменной и уже после окончания процедуры поменять его свойство. А как это сделать?

А не пробовали запустить обработку свойств объекта из события "EndCommand"? Поставив, естественно, фильтр на имена команд...

Re: Как получить доступ к изменяемому обьекту?

1. "EndCommand" не покажет, какой именно примитив был изменен.
2. "EndCommand" вылавливает дааааалеко не все... Незарегистрированные в системе Лисп-команды (они же могут менять свойства примитивов) ему побоку. Перемещение примитива на другой слой при помощи комбо-бокса в тулбаре (очевидно, это не команда) - тоже. Вместе с тем, "ObjectModified"  ловит непосредственно изменение базы данных чертежа и тем самым фиксирует изменения независимо от их природы.

Re: Как получить доступ к изменяемому обьекту?

"EndCommand" не покажет, какой именно примитив был изменен.

Но ведь у нас есть Handle полученный из процедуры ObjectModified. Насчет остального надо подумать.Я тоже вожусь с этой темой, и мне интересно...

Re: Как получить доступ к изменяемому обьекту?

О!!! Кажется, понял схему. В процедуре обработки ObjectModified ведется список объектов (массив, связанный с глобальной переменной), которые были изменены. А процедура обработки изменений этих примитивов вызывается не обязательно только из EndCommand, а скорее, из нескольких разных процедур обработки событий. Естественно, после обработки объекта, он должен быть удален из списка.
Мдя... Наворочено получается...

Re: Как получить доступ к изменяемому обьекту?

А что, если накапливать эти модифицированные объекты куда-нибудь (хотя бы в пользовательский словарь), и потом обрабатывать отдельной процедурой ? ИМХО, это будет "рулезное" решение.

Re: Как получить доступ к изменяемому обьекту?

Фокус заключается в том, как автоматически запускать процедуру обработки объекта после его произвольной модификации, а не в том какая это будет процедура...

Re: Как получить доступ к изменяемому обьекту?

> Leonid
ИМХО, некоторые вещи в мире специально не возможны.
Значит, надо подстраивать свои действия (тактику) под обстоятельства. Если так уж хочется "против ветра", могу предложить "прикрутить внешний таймер", как предлагал > VK (2004-07-22 00:39:58). Для этого надо "всего лишь" написать программу-сервер activeX (например, на Дельфи), которая будет содержать (container) этот самый таймер. Схема взаимодействия: ObjectModified вызывает процедуру-таймер (параметры не нужны), таймер ждёт некоторое время, взятое с потолка (допустим, полторы секунды), и вызывает вашу  процедуру-обработчик события модификации объекта.
Тут непонятно, как выбрать задержку: на медленной машине и пяти секунд будет мало, а на быстрой - юзер столько успеет за эти 5 секунд...
Выхода два. 1) Сделать маленькую для диска (но достаточно долгую для процессора) задержку, и по её истечении - проверить некую характеристику Акада. Если вызов обработчика возможен, то - вызвать, если ещё нет - снова выждать то же время. Проблема в том, что я, например, такой характеристики не знаю, это надо копаться.
2) Сделать в таймере буфер изменений, тогда таймеру придётся передавать акадовские объекты (те самые ByVal Object As Object), а это значит - нарываться на несогласование типов параметров (хотя, это я запугиваю:)...)
В общем, сделать можно. Но вот не нарушится ли "экологическое равновесие" в Акаде за счёт трудно предсказуемых побочных эффектов ? Вы представьте: в сложном чертеже юзер изменил цвет линии в пространстве модели и после этого сразу перешёл в пространство листа, а затем сохранил чертёж. Теоретически - модифицирована линия, и всё. Практически - хто ж его знает, что там творится в недрах Акада:). По варианту 1) вы 100% получите крахи системы в непредсказуемые моменты, а когда вы, после досконального изучения внутренней кухни Акада, шаманства и бессонных ночей:( , научитесь их избегать, все уже давно перейдут на более новые релизы. Вариант 2) (с буфером во внешнем таймере) лучше, но его естественным, логичным и жизнеспособным развитием будет именно то, о чём я написал тут > Maxim T (2004-07-25 18:26:08), то есть накапливать объекты, чтобы потом с ними разобраться "легально", то есть - по нажатию юзером кнопочки:).
Кстати, вариант 2) тоже реализуется через 1), только он отягощён буфером:)))

Re: Как получить доступ к изменяемому обьекту?

По поводу таймера. Все несколько проще:

Option Explicit
Public Event UpdateTime(ByVal dblJump As Double)
Public Interval As Double
Private Tiking As Boolean
Public Sub Go()
    Dim dblStart As Double
    Dim dblSecond As Double
    Dim dblSoFar As Double
    dblStart = Timer
    dblSoFar = Timer
    Tiking = True
    Do While Tiking
        If Timer - dblSoFar >= Interval Then
            dblSoFar = dblSoFar + Interval
            RaiseEvent UpdateTime(Timer)
            DoEvents
        End If
    Loop
End Sub
Public Sub StopClock()
Tiking = False
End Sub

Re: Как получить доступ к изменяемому обьекту?

VK пишет:

1. "EndCommand" не покажет, какой именно примитив был изменен.

Но ObjectModified не показывает так же какой параметр был изменен! Я это к чему: Положим мы какими-то правдами и неправдами добились, того, что смогли изменить параметр изменяемого объекта (даже положим через таймер смогли обмануть программу). Затем мы меняем какое-то другое свойство того же объекта И ВСЕ НАЧИНАЕТСЯ ЗАНОВО!!! тут дело, на мой взгляд, не в технических подробностях, а в принципиально неправильном подходе. Ограничение на изменение поставленно именно из-за того что бы не получился перпетум мобиле!
IMHO если вы хотите отслеживать какие-то изменение в объекте то эту информацию нужно хранить ну никак уж не в свойствах ТОГО же объекта! в данном случае информацию нужно хранить где-то в другом месте, но это уже другая, на мой взгляд гораздо более простая задача.

Re: Как получить доступ к изменяемому обьекту?

А нельзя ли написать .arx который возвращал модифицируемый объект не только для чтения? Проблема в том, что я не знаю C++.

Re: Как получить доступ к изменяемому обьекту?

Usul пишет:

Ограничение на изменение поставленно именно из-за того что бы не получился перпетум мобиле!

А кто ж мешает сделать свои ограничения, хотя бы при помощи флагов. То есть, разобраться, кто является источником модификации - юзер или программа. В последнем случае модификацию скорей всего надо игнорировать.
Правда, пока все удастся учесть, стока времени пройдет... :))