Материал: Digitals

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Команды

Вместе с тем, каждая команда из интерфейса имеет внутреннее имя, которое можно “подсмотреть” в строке статуса окна, изображенного на Рис.D.1, выбрав соответствующую команду в списке. Если мы хотим вызвать интерфейсную команду по ее внутреннему имени, то для этого используется команда @ExecuteMenu, которая принимает внутреннее имя в качестве своего аргумента. Например, упомянутая выше команда Правка | Вставить будет выглядеть в этом случае как

@ExecuteMenu EditPaste.

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

Например, следующий код создаст группу с именем “Участок”. Здесь <CR> означает посылку нажатия клавиши Enter.

@SendChars Участок<CR>

Группа | Создать...

Отметим, что часть интерфейсных команд имеют свои неинтерактивные скриптовые аналоги. Например, команда @Map.Generalization 0.1 выполнит генерализацию с графической точностью 0.1 мм без вызова диалога. Разумеется, что помощь команды @SendChars в этом случае не понадобится.

По функционалу команды скрипта можно условно разделить на такие группы:

Команды утилит

Группа различных вспомогательных команд. Сюда входят, например, команды для извлечения пути к файлу, команды для соединения и разделения строк и множество других.

Команды действий

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

Команды получения выборки

Немалая часть инструментов работает с помеченными объектами. Поэтому, в скрипте нам необходимы команды для получения выборки. Это могут быть как команды из интерфейса Digitals,

например, Пометить | Все или Пометить | Внутри помеченного, так и команды типа

@Map.SelectByParameters.

Последняя команда, в частности, помечает объекты подобно диалогу Правка > Найти…. Обратите внимание и на другие команды группы @Map, которые начинаются со слова Select.

Команды доступа к элементам карты

Под элементами карты мы подразумеваем все ее части: саму карту, список слоев, список параметров, объекты карты и содержимое их параметров, а также подписи, вынесенные в карту. Некоторые команды доступа запрашивают значения, некоторые позволяют их изменить. Часть команд работает и на запрос и на изменение.

Элемент Map (карта) организован в виде массива (списка), содержащего все открытые карты. Каждая карта Map содержит массив Object, содержащий объекты карты. Этот массив, в свою очередь, содержит массив Parameter, в котором хранятся значения параметров, связанных с объектом.

Обращаться к элементам массива можно по номеру, указывая его в [ ] квадратных скобках. Примеры:

@Map.Count - Возвращает количество объектов в активной карте. @Map[2].Layers.Count - Возвращает количество слоев во второй карте.

@Map.Object[N].Parameter[M] - Доступ к содержимому параметра M объекта N текущей карты.

$X=@Map.Object[N].Point[M].x - Запись координаты X точки M объекта N текущей карты в переменную $X (о переменных чуть ниже).

341

Приложение D. Введение в Digitals Script

@Map[1].Object[1].Point[1].z 0 - Установка координаты Z в 0 для первой точки первого объекта первой карты.

@Map.Parameters.Get Number - Возвращает по номеру параметра его код (ID), тип и наименование.

Некоторая часть команд доступа работает с предварительно помеченными объектами. Обратите внимание на команды, имена которых начинаются с @Map.Selected.

Команды для взаимодействия с пользователем

Для взаимодействия с пользователем предусмотрены команды организации запросов (в группе команд @Dialog) и команды, ответственные за вывод окна хода выполнения скрипта (группа

@Progress).

Переменные

Промежуточные значения, получаемые из команд и выражений, можно хранить в переменных скрипта. Имена переменных обязательно начинаются в символа $ (знак доллара). Специально объявлять переменные не нужно, просто вводите их в скрипт по мере надобности. В переменной можно хранить только одно значение - как правило, это строка или число.

Например, простое выражение $Count=@Map.Count вводит переменную с именем Count и присваивает ей количество объектов текущей карты.

Массивы текстовых строк

Кроме переменных, в распоряжении разработчика скрипта имеются массивы текстовых строк. Такие массивы имеют имена вида @Text[N], где N можеть быть числом от 1 до 63. Другими словами, в коде скрипта вам доступно 63 независимых текстовых массива. Если номер в скобках не указан, то подразумевается массив @Text[1].

Массивы строк можно загружать из файла и сохранять в файл командами @Text[N].Load и @Text[N].Save. Доступ к конкретной строке массива выполняется командой вида Text[N].Line[N]. Также доступны команды для добавления строки в конец списка, удаления строк, сортировки, поиска.

Выражения

Выражение - это последовательность операндов, операций и функций, которые при вычислении возвращают результат. Результат обычно помещают в переменные, которые затем используют для передачи аргументов в различные команды.

Результатом арифметической операции над числами, заключенными в переменные, или над заданными явно будет число. Результатом операции сравнения, например, операции < (меньше), будет логическое значение 1 (правда) или 0 (ложь), которое можно использовать в условном операторе @if. Операции сравнения применимы и к строкам.

Функции, применяемые в выражениях, также делят по типу. Существуют функции работающие с числами, со строками, с датами и временем. Функции обычно вычисляются в рамках команды @Calc.

Например:

$B=$A+5 - заносит в переменную $B cумму значения переменной $A и числового значения 5.

$S=@Calc Replace("101,11 102,12 103,35",",",".") – вернет результат “101.11 102.12 103.35”, то есть заменит разделитель , (запятая) на . (точка).

Полный список функций и операций ищите в онлайн справке2.

Условный оператор @if

Условный оператор позволяет проверить некоторое условие и, в зависимости от его истинности, выполнить то или иное действие. Полный и короткий форматы оператора следующие:

2 http://www.geosystema.net/help/tag/skripty/#p2

342

Управление ходом выполнения

@if условие then действие_если_правда else действие_если_ложь @if условие действие_если_правда

условие может проверять содержимое неких переменных скрипта с помощью операций сравнения, часто в сочетании с логическими операциями and (логическое И) и or (логическое ИЛИ). Например:

@If ($I>0) and ($I<=$Count) then $I=$I+1 else @Goto %Start

Управление ходом выполнения

Скрипт можно выполнять нелинейно. Для этого в языке предусмотрены простейшие средства управления ходом выполнения команд, знакомые по школьным урокам информатики, а именно метки и оператор перехода. Метка должна располагаться в отдельной строке. Ее имя должно быть уникальным и начинаться с символа % (процент). Оператор перехода выглядит так: @Goto %имя_метки.

Операторы перехода обычно используются в комбинации с условным оператором @if. Например:

@If $I<=$Count @Goto %Start

- если содержимое переменной I меньше или равно содержимому переменной Count, то перейти к метке

%Start.

Для прерывания выполнения скрипта доступен оператор @Break. Например:

@If $C=0 @Break Список параметров пуст

- здесь после @Break присутствует сообщение, которое будет выведено пользователю при прерывании скрипта.

Подпрограммы

В языке скриптов нет понятия подпрограммы в классическом ее понимании. Тем не менее, у вас есть возможность сохранить скрипт во внешнем файле и вызывать его из другого скрипта, передавая ему параметры и получая результат.

Чтобы вызвать внешний скрипт, используется команда @ExecuteScript, о которой немного ниже в разделе «Библиотека скриптов».

События

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

Скрипт события можно разместить в кнопке пользовательской панели инструментов, в слое (пункт Скрипт обработки событий… в контекстном меню Менеджера слоев), либо в карте (Карта > Скрипт обработки событий…). Скрипт слоя будет вызваться при изменениях, связанных с данным слоем.

Кнопка, в которой присутствует обработчик события, запоминает свое состояние (нажата или отжата). Нажатие активизирует обработчик, а отжатие отключает его. Это позволяет, при необходимости, запрограммировать и использовать несколько режимов с разными обработчиками. Если необходимо выполнить какие-то действия непосредственно в момент нажатия кнопки (например, установить какиенибудь настройки), то эти команды нужно поместить в начало текста скрипта - до первой метки определяющей обработчик события.

Скрипт события должен начинаться с метки %Events, после которой через точку идет имя события. Например: %Events.OnAdd. В рамках одного скрипта можно использовать несколько меток событий, для каждой из которых прописать свой обработчик.

Также можно назначить один обработчик сразу нескольким событиям - для этого нужно перечислить события через запятую. Например: %Events.OnFileNew, OnFileOpen. Чтобы создать обработчик для всех типов событий сразу можно использовать символ звездочки: %Events.*. Чтобы получить

343

Приложение D. Введение в Digitals Script

имя события, которое обрабатывается в настоящий момент в скрипте, можно использовать функцию

@EventName.

Специальная функция @EventObject позволяет получить номер объекта, с которым произошло событие. Например, для события OnCollect это будет номер вновь собранного объекта, а для события OnSelect - номер последнего помеченного. Если помечено несколько объектов, то для их перебора можно использовать функцию @Map.NextSelected.

Для некоторых команд функция @EventObject работает иначе. События и их описания приведены в Табл.D.1.

Таблица D.1. События, применимые в скриптах

Событие

Описание и особенности применения

 

 

OnAdd

Вызывается при вставке объектов в карту, например, из буфера обмена.

OnChange

Вызывается при изменении объекта (его геометрии или параметров).

OnCollect

Вызывается при сборе нового объекта.

OnDelete

Вызывается при удалении объекта.

OnFileClose

Вызывается при каждом закрытии карты. Для этого события и других

 

OnFile-событий @EventObject будет содержать номер карты.

OnFileNew

Вызывается при каждом создании новой карты.

OnFileOpen

Вызывается при каждом открытии карты.

OnFileSave

Вызывается перед сохранением карты. Обработчик события может

 

запретить сохранение, присвоив специальной переменной $Result

 

значение 1. В этом случае в скрипте рекомендуется предусмотреть окно с

 

сообщением для пользователя, чтобы объяснить, почему именно карта не

 

сохранена.

 

 

OnJoin

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

 

Правка.

OnLayerChange

Вызывается при изменении слоя объекта.

OnMerge

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

 

Правка.

OnParametersChange

Вызывается при изменении параметров объекта (то есть при

 

редактировании их содержимого в боковой панели Инфо). Для этого

 

события функция @EventParameter возвращает номер измененного

 

параметра (или список номеров, разделенных пробелами).

OnPointCollect

Вызывается при добавлении каждой точки собираемого объекта (то есть

 

регистрации точки).

OnSelect

Вызывается при пометке объекта.

OnShutdown

Вызывается при закрытии программы.

OnStartup

Вызывается при запуске программы.

Пример обработчика событий

Чтобы почувствовать события “на вкус”, создайте кнопку и скопируйте в нее текст следующего скрипта:

@Dialog.InfoBox 3000 Активизация скрипта обработки событий

%Events.OnCollect $S=@EventObject

@If $S=0 then @Break $S=@Map.Object[$S].Parameter[-5] @Dialog.InfoBox 3000 Сбор объекта||$S

;

344

Библиотека скриптов

%Events.OnSelect $S=@EventObject

@If $S=0 then @Break $S=@Map.Object[$S].Parameter[-5] @Dialog.InfoBox 3000 Пометка объекта||$S

;

%Events.OnChange $S=@EventObject

@If $S=0 then @Break $S=@Map.Object[$S].Parameter[-5] @Dialog.InfoBox 3000 Изменение объекта||$S

;

%Events.OnPointCollect $N=@EventObject $C=@Map.Object[$N].Count $C=$C-1

@If $C=0 then $C=1 $P=@Map.Object[$N].Point[$C] @Map.AddObject 0|1|id28|1|0 $P

После нажатия кнопки активируются обработчики событий сбора объекта, его пометки, изменения, а также событие регистрации точки.

Команда @Dialog.InfoBox, используемая в данном скрипте, выводит на экран автоматически убираемое сообщение. Аргументами команды является число милисекунд, в течении которого будет демонстрироваться окно, и текст сообщения.

Создайте карту на основе шаблона по умолчанию, нажмите вновь созданную кнопку и попробуйте сначала собрать, а затем отредактировать объект. Программа будет реагировать на ваши действия соответствующими диалогами, которые будут появляться в момент “перехвата” событий.

Библиотека скриптов

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

Отправить скрипт в библиотеку можно нажатием соответствующей кнопки в окне, показанном на Рис.D.1. Внешний скрипт хранится в обычном текстовом файле с расширением DSF (Digitals Script File) в папке Library программной папки. При необходимости скрипты можно хранить и в подпапках папки Library, группируя их по функциональности.

Выполнение подпрограммы

Запустить подпрограмму на выполнение можно командой вида

@ExecuteScript Имя_скрипта [Строковый_Параметр]

Здесь квадратные скобки указывают на необязательность передачи параметров в подпрограмму. Имя_скрипта начинается с метки %Library и далее, через точку, имени файла, содержащего скрипт (возможно, с включением имени подпапки, в которой этот скрипт находится). Примеры:

%Library.ReplaceComma 101,32 %Library.MyFolder\MyScript My parameters

Существует возможность вызывать скрипты размещенные не только в библиотеке, но и на других пользовательских панелях. Делается это так:

%Script.Имя_панели.Имя_кнопки [Строковый_Параметр]

345

Источник: https://studfile.net/preview/16666704/