Очень полезная штука - уже опробовала - и просто умиляюсь - ещё Шубин в своё время просил об этом и наконец-то - свершилось!!! Умнички!!!
Просьба добавить ещё одно событие (на данный момент ) - OnLevelChange.
Сразу же хочется спросить - работают ли эти обработчики - если дейсвтяи с нимим произошли через скрипт - удаление точки, добавление точки, изменение её, создание нового объекта и т.д.?
Обнаружены также следующие недочёты в работе:
при создании объекта и присвоении этому объекту значения какого-либо параметра через обработчик - невозможно потом его удалить. Программа всё равно его добавляет.
если панель была закрыта при включённой кнопке - скрипт всё равно продолжает выполняться.
как отключать один из обработчиков событий в 1-ой кнопке - через коментарий самого OnChange - не работает.
не совсем корректно работает обработчик OnCollect. OnChangeEvent.exe (188 KB)
Level или Layer?
Когда должно вызываться это событие?
Пока OnChange работает только при перемещении точки мышью или при изменении параметров на закладке Инфо. Все варианты изменения объекта отследить довольно трудно, но если что-то нужно то будем добавлять.
%Events.OnAdd - вставка объекта из буфера обмена %Events.OnLayerChange - изменение слоя объекта
Пока все события вызываются только в случае действий пользователя. Идея с вызовом обработчиков при действиях из скрипта нам не кажется хорошей. Во-первых возможно зацикливание, а во вторых идея событий в том, чтобы дать разработчику скрипта возможность реагировать на события, которые ему недоступны. А это действия пользователя. В свой же скрипт можно сразу внести все необходимую обработку не прибегая к событиям.
Сразу возник вопрос - можно ли получать информацию - с какого именно слоя был перенесён объект. Куда был перенесён - можно определить, а вот откуда? А это часто нужно знать.
И всё же неработет - у меня что OnChange что OnCollect - работают одинаково - как будто одна и та же функция вызывается.
Вот скрипты - оба выдают один и тот же результат.
%Events.OnCollect @CheckErrors 1
$S=@EventObject @If $S=0 then @Break @Map.Object[$S].Parameter[1]=30
%Events.OnChange @CheckErrors 1
$S=@EventObject @If $S=0 then @Break @Map.Object[$S].Parameter[1]=31
Я разобралась в чём дело - какая-то проблема существует вне обработчиков событий - если стоит галочка - Сбор автоподписи и Сбор Автопараметры. Если они отключены - тогда работает правильно, если хоть одна из них включена - то даже закрытие панели с кнопочкой со скриптом не решает проблему (хоть и было сказано - что исправлено )
при изменении объекта и обработчика событий OnChange , а потом применении функции правкаотменить изменение - исходный параметр возвращается назад, но при изменении слоя с помощью функции OnLayerChange, а потом применении функции правкаотменить изменение - параметр не возвращается.
Какая именно проблема? Если та, что при включенных автопараметрах или автоподписях вызывается OnChange, то так и должно быть. Это событие всегда вызывается при изменении объекта или его параметров.
Как то очень сумбурно и непонятно. Что значит изменение слоя с помощью функции OnLayerChange? OnLayerChange это не функция меняющая слой, а событие которое вызывается когда оператор изменяет слой вручную. И какой параметр куда должен возвращаться после отмены изменения слоя?
Смысл в том, что внутри скрипта OnLayerChange есть функция - меняющая один из параметров объекта - так вот - если сделать Правка - Отменить - то не отменяется это изменёный параметр.
Можно ли разделить в функции OnChange - изменение геометрии и изменение параметров - иногда необходимо отслеживать каждое из событий отдельно.
И ещё - замечены следующие результаты тестирования:
Событие OnChange не реагирует на изменение объекта путём параллельного переноса - т.е. маркируя сторону с помощью Alt и двигая её целиком.
Событие OnChange не реагирует на изменение высоты как целиком объекта (при нажатии кнопки H), так и изменении высоты любой из точек объекта.
Событие OnChange не реагирует на изменение объекта при использовании инструментов на панели Правка - объединить, соединить и т.д.
Дело в том, что те изменения, которые происходят в скриптах, автоматически в лог Undo не заносятся. Это касается не только обработки событий, но и всех скриптов вообще.
Создатель скрипта должен, при необходимости, сам заносить операции в лог, перед модификацией объекта или его параметров.
Для этого имеются соответствующие функции: @Map.Undo.SaveObject Number @Map.Undo.SaveObjectParameters Number @Map.Undo.StartOperationGroup
Изначально мы так и собирались. Но проблема в том, что изменение геометрии влечет за собой измененние некоторых параметров, например площади и периметра. Также изменение некоторых параметров может изменить геометрию. Например параметр Z.
Добавлена блокировка от зацикливания обработчиков событий.
Теперь, до завершения обработки события, все возникающие события того же типа игнорируются.
Поводов покурить становится меньше
В пределах одной пользовательской панели активизируется только одна кнопка с обработчиком событий, если панелей несколько - на каждой по одной. Можно сделать так, чтобы в пределах одной панели можно было бы активизировать несколько кнопок с событиями?