Создание скриптов для обработки событий

Добавлена возможность создания скриптов для обработки событий:

Замечания и предложения приветствуются…

Очень полезная штука - уже опробовала - и просто умиляюсь - ещё Шубин в своё время просил об этом и наконец-то - свершилось!!! Умнички!!!

Просьба добавить ещё одно событие (на данный момент :wink: ) - OnLevelChange.

Сразу же хочется спросить - работают ли эти обработчики - если дейсвтяи с нимим произошли через скрипт - удаление точки, добавление точки, изменение её, создание нового объекта и т.д.?

Обнаружены также следующие недочёты в работе:

  • при создании объекта и присвоении этому объекту значения какого-либо параметра через обработчик - невозможно потом его удалить. Программа всё равно его добавляет.

  • если панель была закрыта при включённой кнопке - скрипт всё равно продолжает выполняться.

  • как отключать один из обработчиков событий в 1-ой кнопке - через коментарий самого OnChange - не работает.

  • не совсем корректно работает обработчик OnCollect.
    OnChangeEvent.exe (188 KB)

Спасибо.

Level или Layer?
Когда должно вызываться это событие?

Пока OnChange работает только при перемещении точки мышью или при изменении параметров на закладке Инфо. Все варианты изменения объекта отследить довольно трудно, но если что-то нужно то будем добавлять.

В смысле изменении слоя.

После изменения слоя для выбранного объекта (через Вкладку Правка или через функцию - @Map.Selected.ChangeLayer LayerIndex

Добавлены еще два события:

%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

Оба выдают - 31.

Что делать? :cry:

У меня все работает:
Events.exe (252 KB)
У вас последняя версия Ged?

Да, последняя. Билд - 19.02.2010.
Пробовала на разных файлах - и на разных шаблонах. Не работает. :frowning:

Это же старье четырехдневной давности :smiley:

5 балов!!! :laughing:

Но - нет. То же самое - выдаёт - для обоих событий - одинаковый параметр подсавляет. Даже подстановка чистого Ged.ini - не помогла. :cry:

Я разобралась в чём дело :laughing: - какая-то проблема существует вне обработчиков событий - если стоит галочка - Сбор :arrow_right: автоподписи и Сбор :arrow_right: Автопараметры. Если они отключены - тогда работает правильно, если хоть одна из них включена - то даже закрытие панели с кнопочкой со скриптом не решает проблему (хоть и было сказано - что исправлено :frowning: )

Так будет решена эта проблема или мне не ждать? :cry:

И ещё:

при изменении объекта и обработчика событий OnChange , а потом применении функции правка :arrow_right: отменить изменение - исходный параметр возвращается назад, но при изменении слоя с помощью функции OnLayerChange, а потом применении функции правка :arrow_right: отменить изменение - параметр не возвращается. :cry:

Какая именно проблема? Если та, что при включенных автопараметрах или автоподписях вызывается OnChange, то так и должно быть. Это событие всегда вызывается при изменении объекта или его параметров.

Как то очень сумбурно и непонятно. Что значит изменение слоя с помощью функции OnLayerChange? OnLayerChange это не функция меняющая слой, а событие которое вызывается когда оператор изменяет слой вручную. И какой параметр куда должен возвращаться после отмены изменения слоя?

Смысл в том, что внутри скрипта OnLayerChange есть функция - меняющая один из параметров объекта - так вот - если сделать Правка - Отменить - то не отменяется это изменёный параметр.

Можно ли разделить в функции OnChange - изменение геометрии и изменение параметров - иногда необходимо отслеживать каждое из событий отдельно. :unamused:

И ещё - замечены следующие результаты тестирования:

  1. Событие OnChange не реагирует на изменение объекта путём параллельного переноса - т.е. маркируя сторону с помощью Alt и двигая её целиком.

  2. Событие OnChange не реагирует на изменение высоты как целиком объекта (при нажатии кнопки H), так и изменении высоты любой из точек объекта.

  3. Событие OnChange не реагирует на изменение объекта при использовании инструментов на панели Правка - объединить, соединить и т.д.

Спасибо.

Дело в том, что те изменения, которые происходят в скриптах, автоматически в лог Undo не заносятся. Это касается не только обработки событий, но и всех скриптов вообще.
Создатель скрипта должен, при необходимости, сам заносить операции в лог, перед модификацией объекта или его параметров.
Для этого имеются соответствующие функции:
@Map.Undo.SaveObject Number
@Map.Undo.SaveObjectParameters Number
@Map.Undo.StartOperationGroup

Изначально мы так и собирались. Но проблема в том, что изменение геометрии влечет за собой измененние некоторых параметров, например площади и периметра. Также изменение некоторых параметров может изменить геометрию. Например параметр Z.

попробовала прописать добавление объекта на событии OnSelect

%Events.OnSelect
$S=@EventObject
@If $S=0 then @Break
$x=@Map.Object[$S].Parameter[-4]
$y=@Map.Object[$S].Parameter[-3]
@Map.AddObject 0|1|3|1|0 $x $y 0.00|1|3|0

программа зацикливается и вешается, а мне остается нервно курить в сторонке… :frowning:

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

А можно еще добавить событие OnClick с возвращением координат курсора?

В пределах одной пользовательской панели активизируется только одна кнопка с обработчиком событий, если панелей несколько - на каждой по одной. Можно сделать так, чтобы в пределах одной панели можно было бы активизировать несколько кнопок с событиями?

Наскільки “реально” забезпечити тепер такий досконалий підхід до обробки подій Digitals?

Та ще хочеться просити, щоб функції 2-ї групи вставлялись в карту призначення при застосуванні команди @Map.ReplaceTemplate Filename.