Скрипт для преобразования системы координат
Функции для скриптов:
| Функция | Назначение |
|---|---|
procedure AddMethod(method_name:string; description:string=''; declaration:string='') |
Регистрация функции. method_name - имя функции/процедуры; description - описание, назначение; declaration - объявление функции (при вставке в отчёт) |
procedure SetMethodUse(method_name:string; use:integer; value:boolean=true) |
Установка назначения функции. method_name - имя функции/процедуры; use - тип скрипта; value - включить/выключить. |
function CallFunction(func_name:string;
params:variant='varEmpty'):variant |
Выполнить функцию. func_name - имя функции; params - список параметров. |
procedure AddLog(str:string) |
Записывает лог, сохраняет строку str в файл. Файл находится в папке со скриптами. Имя файла равно названию файла скрипта с расширением .log |
function FullMethodName(func_name:string):string |
Возвращает полное название функции, добавляет название скрипта. Чтобы названия не зависели от смены имени файла скрипта. |
Для задания предназначения функции при регистрации в AddMethod используются константы:
| Константа | Назначение |
|---|---|
script_check |
Скрипт для проверок |
script_report |
Скрипт для отчётов |
script_file |
Скрипт для работы с файлами |
script_solving |
Скрипт для решения задач |
script_transform |
Скрипт для преобразования системы координат |
Примеры:
Регистрирует процедуру для искользования в проверках. Проверка отображается с названием "Скрипт - удаление неиспользуемых точек".
AddMethod('Check_2', 'Скрипт - удаление неиспользуемых точек');
SetMethodUse('Check_2', scipt_check , true);
Регистрирует функцию для использования в отчётах.
AddMethod('Report_test', 'Тестовая функция отчета', 'function Report_test:string');
SetMethodUse('Report_test', script_report, true);
Регистрирует функцию для загрузки файла.
AddMethod('text_create', 'Скрипт - загрузка текстового файла', '');
SetMethodUse('text_create', script_file, true);
Позволяет создавать свои функции для отчётов, можно использовать в выражениях.
Пример скрипта:
function Report_test:string;
begin
result:='Тест выполнен';
end;
function Report_test_obj_name(obj:TGZM_BasEl):string;
var
point:TGZM_PointC;
begin
if (obj is TGZM_PointC) then begin
point:=TGZM_PointC(obj);
result:='Точка ' + point.name + ', X='+ FloatToStr(point.x)+', Y='+ FloatToStr(point.y);
end else result:=obj.name;
end;
begin
AddMethod('Report_test', 'Скрипт - Тестовая функция отчета', 'function Report_test:string');
SetMethodUse('Report_test', script_report, true);
AddMethod('Report_test_obj_name', 'Скрипт - Название объекта', 'function Report_test_obj_name(obj:TGZM_BasEl):string');
SetMethodUse('Report_test_obj_name', script_report, true);
end.
При регистрации функции AddMethod нужно задавать описание функции. Функция отображается в закладке "Функции" в ветке "Geozem_script":
Создаём отчёт, в текстовое поле вставляем функцию:
Формируем отчёт:
Функция работает.
Для функции с входным параметром создадим вывод точек, входной параметр - объект точки:
Результат:
Позволяет создавать свои проверки элементов, пользовательские проверки добавляются в конце списка
Пример скрипта:
function Check_2(obj:TGZM_Check_script):boolean;
// удаление неиспользуемых точек
var
met:boolean;
nt:integer;
lay:TGZM_Layer;
begin
result:=false;
lay:=obj.GetLayer;
nt:=1;
while (nt <= lay.Points.Count)and(obj.CheckStop) do begin
met:=lay.Lines.UsePoint(nt);
if (met=false) then met:=lay.Polygons.UsePoint(nt);
if not(met) then begin
lay.Points.Del(nt);
result:=true;
end else inc(nt);
if (lay.Points.Count<>0) then obj.ShowProgress(trunc(nt*100/lay.Points.Count));
end;
end;
begin
AddMethod('Check_2', 'Скрипт - удаление неиспользуемых точек');
SetMethodUse('Check_2', mt_check , true);
end.
У функции входной параметр должен быть объектом класса TGZM_Check_script, возвращает булевый результат, означающей успешность проверки.
Внутри функции нужно использовать метод входного параметра CheckStop для выхода из функции при нажатии на кнопку "Отмена" в визарде.
Использовать метод ShowProgress для отображения процента выполнения, входной параметр числовой в процентах.
При регистрации функции AddMethod передаём имя функции, и название, под которым будет отображаться проверка.
Позволяет создавать поддержку собственных форматов файлов, дополнять обработку существующих форматов.
Пример для чтения/записи текстового файла:
procedure text_create(obj:TGZM_FileFormat_script);
begin
obj.values['ext']:='.txt';
obj.values['is_read']:=true;
obj.values['is_write']:=true;
obj.values['OnBeforeLoad']:=FullMethodName('text_load');
obj.values['OnBeforeSave']:=FullMethodName('text_save');
end;
procedure text_load(obj:TGZM_FileFormat_script);
// прочитать тектовый файл
var
i,j,n,k:integer;
st,s:string;
x,y:double;
nt,np:integer;
lay:TGZM_Layer;
begin
lay:=obj.GetLayer;
np:=0;
obj.LoadFromFile;
for i:=0 to (obj.lines.count-1) do begin
st:=trim(obj.lines[i])+' ';
s:=''; n:=0;
for j:=1 to length(st) do begin
if st[j]=' ' then begin
if trim(s)<>'' then begin
inc(n);
if n=2 then x:=StrToFloat(s);
if n=3 then y:=StrToFloat(s);
end;
s:='';
end else s:=s+st[j];
end;
if n>0 then begin
nt:=obj.FindPoint(x,y);
if np=0 then np:=lay.polygons.Add;
if np>0 then k:=TGZM_PolygonC(lay.polygons[np]).InsertPoint(nt);
end;
end;
ShowMessage('Прочитан файл '+obj.FileName);
end;
procedure text_save(obj:TGZM_FileFormat_script);
// сохранить текcтовый файл
var
i:integer;
st:string;
lay:TGZM_Layer;
begin
lay:=obj.GetLayer;
obj.lines.Clear;
for i:=1 to lay.points.Count do begin
st:=FloatToStr(lay.points[i].values['x']) + ' ' + FloatToStr(lay.points[i].values['y']);
obj.lines.add(st);
end;
obj.SaveToFile;
ShowMessage('Сохранён файл '+obj.FileName);
end;
begin
AddMethod('text_create', 'Скрипт - загрузка текстового файла', '');
SetMethodUse('text_create', script_file, true);
end.
Зарегистрировалось для операции чтения:
При регистрации функции в AddMethod указываем названием функции инициализации, в которой будет происходить настройка работы и название формата, который будет отображаться в диалогах чтении/записи файлов.
У функции инициализации входной параметр должен быть объектом класса TGZM_FileFormat_script.
В ней происходит настройка параметров путём установки свойства Values, свойства доступны для чтения и для записи.
| Свойство | Описание | Пример |
|---|---|---|
ext |
Задаёт расширение файла, для файлов с этим расширением будет использоваться данный метод. | obj.values['ext']:='.txt'; |
name |
Возвращает название метода, установленное в AddMethod | |
filename |
Возвращает имя файла, с которым идёт работа | |
is_read |
Использование для чтения файлов |
obj.values['is_read']:=true; |
is_write |
Использование для записи файлов | obj.values['is_write']:=true; |
is_winopen |
Можно использовать для установки открытия файлов с этим расширением в Windows | |
is_mlayer |
Формат поддерживает многослойность | |
is_hablon |
Можно использовать в качестве шаблона | |
is_skrd |
Можно использовать для обработки изменения системы координат | |
OnCreate |
Установка процедуры, которая будет вызываться при создании метода | |
OnAfterLoad |
Установка процедуры, которая будет вызываться после загрузки | |
OnBeforeLoad |
Установка процедуры, которая будет вызываться до загрузки | obj.values['OnBeforeLoad']:=FullMethodName('text_load'); |
OnAfterSave |
Установка процедуры, которая будет вызываться после сохранения | |
OnBeforeSave |
Установка процедуры, которая будет вызываться до сохранения | obj.values['OnBeforeSave']:=FullMethodName('text_save'); |
Внутри процедур чтения вызвать спользовать метод входного параметра LoadFromFile для загрузки содержимого файла в свойство Lines.
Внутри процедур сохранения вызвать спользовать метод входного параметра SaveToFile для сохранения в файл свойства Lines.
Для дополнения собработчика существующего формата методом входного параметра ReplaceFormat указывается расширение, которое нужно дополнить.
Установить в свойстве OnAfterLoad процедуру, которая вызовится после загрузки файла для изменения данных.
procedure replace_xml(obj:TGZM_FileFormat_script);
begin
obj.values['OnAfterLoad']:='file_format.xml_load';
obj.ReplaceFormat('xml');
end;
procedure xml_load(obj:TGZM_FileFormat_script);
// выполнить после загрузки
var
lay:TGZM_Layer;
i:integer;
kn, uo:string;
t:string;
begin
lay:=obj.GetLayer;
for i:= 1 to lay.Polygons.Count do begin
kn:=lay.polygons[i].values['tab.Parcel.CadastralNumber'];
t:='Участок';
if trim(kn)='' then begin
kn:=lay.polygons[i].values['tab.Building.CadastralNumber'];
t:='Здание';
end;
if trim(kn)='' then begin
kn:=lay.polygons[i].values['tab.CadastralBlock.CadastralNumber'];
t:='Квартал';
end;
if trim(kn)='' then begin
kn:=lay.polygons[i].values['tab.Zone.AccountNumber'];
t:='Зона';
end;
lay.polygons[i].AddTabName('КН', kn );
lay.polygons[i].AddTabName('УО', uo );
lay.polygons[i].AddTabName('ТИП_ОБЪЕКТА', t );
end;
end;
begin
AddMethod('replace_xml', 'Заменить обработку XML КПТ', '');
SetMethodUse('replace_xml', script_file, true);
end.
Позволяет создавать свои методы решения геодезических задач.
Пример скрипта решающий полярную засечку:
// Полярная засечка
procedure create_1(obj:TGZM_Solving_script);
begin
obj.values['OnCreateForm']:=FullMethodName('CreateForm_1');
obj.values['OnCheckForm']:=FullMethodName('CheckForm_1');
obj.values['OnExecute']:=FullMethodName('Execute_1');
end;
procedure CreateForm_1(obj:TGZM_Solving_script);
var
gr1,gr2:TGroupBox;
begin
gr1:=obj.objects.CreateGR_EditPoint('ed_point_1', 'Первая точка', 8, 8);
gr2:=obj.objects.CreateGR_EditPoint('ed_point_2', 'Вторая точка', gr1.width+16, 8);
obj.objects.CreateTLabel('', 'Стоим на 1 точке, ориентир на 2 точку, находим 3 точку:', 8, gr1.height+16 );
obj.objects.CreateTLabel('', 'Угол:', 8, gr1.height+16+16 );
obj.objects.CreateTLabel('', 'Длина линии:', gr2.left, gr1.height+16+16 );
obj.objects.CreateTMaskEdit('ed_angle', 3, gr1.left + gr1.width-75, gr1.height+16+16, 75);
obj.objects.CreateTMaskEdit('ed_len', 2, gr2.left+gr2.width-75, gr1.height+16+16, 75);
end;
function CheckForm_1(obj:TGZM_Solving_script):boolean;
// активность кнопки "Выполнить", данные занесены, можно вычислять
begin
result:=(obj.objects['ed_point_1.Filled'])
and(obj.objects['ed_point_2.Filled'])
and(obj.objects['ed_len.number']<>0);
end;
function Execute_1(obj:TGZM_Solving_script):boolean;
// вычислить
var
X,Y:extended;
exe:boolean;
nt:Integer;
begin
// полярная засечка
exe:=PolarNotch(X, Y
,obj.objects['ed_point_1.x'], obj.objects['ed_point_1.y']
,obj.objects['ed_point_2.x'], obj.objects['ed_point_2.y']
,obj.objects['ed_angle.Angle'], obj.objects['ed_len.number']);
if (exe) then begin
nt:=obj.AddPoint(x,y);
end else ShowMessage('Не найдено');
result:=(nt>0);
end;
begin
AddMethod('create_1', 'Скрипт - Полярная засечка', '');
SetMethodUse('create_1', script_solving, true);
end.
Скрипт подключен:
При регистрации функции в AddMethod указываем названием функции инициализации, в которой будет происходить настройка работы и название задачи, которая будет отображаться в диалоге "Решить задачу".
У функции инициализации входной параметр должен быть объектом класса TGZM_Solving_script.
В ней происходит настройка параметров путём установки свойства Values, свойства доступны для чтения и для записи.
| Свойство | Описание | Пример |
|---|---|---|
name |
Задаёт название задачи | |
OnCreateForm |
Вызывается при создании формы - формирует внешний вид формы, задаёт расположение элементов ввода данных | obj.values['OnCreateForm']:=FullMethodName('CreateForm_1'); |
OnClearForm |
Вызывается при очистке формы, при нажатии на кнопку "Новый" | |
OnSelect |
Вызывается при выборе объекта | |
OnShowForm |
Вызывается при перерисовки формы, при нажатии на кнопку "Обновить" | |
OnSaveForm |
Вызывается при сохранении данных формы | |
OnCheckForm |
Вызывается для проверки введенных данных, управляет доступностью кнопки "Решить" | obj.values['OnCheckForm']:=FullMethodName('CheckForm_1'); |
OnExecute |
Вызывается для решения задачи, при нажатии на кнопку "Решить" | obj.values['OnExecute']:=FullMethodName('Execute_1'); |
Позволяет создавать свои методы преобразования системы координат.
Пример скрипта:
procedure trans_1(obj:TGZM_Transform_method_sctipt);
// вызов другого преобразования
begin
obj.ChangeCoord(FullMethodName('trans_2'));
end;
procedure trans_2(obj:TGZM_Transform_method_sctipt);
// меняет местами координаты X и Y
begin
obj.new_x:= obj.old_y;
obj.new_y:= obj.old_x;
end;
procedure trans_3(obj:TGZM_Transform_method_sctipt);
// добавляет к координатам 100
begin
if (obj.params.values['reverse'] = '1') then begin
obj.new_x:= obj.old_x - 100;
obj.new_y:= obj.old_y - 100;
end else begin
obj.new_x:= obj.old_x + 100;
obj.new_y:= obj.old_y + 100;
end;
end;
begin
AddMethod('trans_1', 'Скрипт - преобразование 1');
SetMethodUse('trans_1', script_transform , true);
AddMethod('trans_2', 'Скрипт - преобразование 2');
SetMethodUse('trans_2', script_transform , true);
AddMethod('trans_3', 'Скрипт - преобразование 3');
SetMethodUse('trans_3', script_transform , true);
end.
У процедуры входной параметр должен быть объектом класса TGZM_Transform_method_sctipt. Внутри функции из старых координат (old_x, old_y) нужно получить новые координаты (new_x, new_y).
При регистрации функции AddMethod передаём имя функции, и название, под которым будет отображаться проверка.
obj.params.values['reverse'] = '1' - для обработки обратной функции, в этот параметр записывается признак, что нужно считать наоборот.
Скрипт подключен:

Функции, можно вызвать как по имени функции [Название_функции], так и указанием названия скрипта через точке: [Название_скрипта.Название_функции]. Если не указывать название скрипта, функция будет искаться во всех скриптах и вызовет первую попавшуюся с таким именем.
var P:variant;
function no_param:string; // функция без параметров begin result:='no_param'; end;
function one_param(p1:integer):string; // функция с одним параметром begin result:=IntToStr(p1); end;
function two_param(p1,p2:integer):string; // функция с двумя параметрами begin result:=IntToStr(p1)+'_'+IntToStr(p2); end;
begin
// без параметров
ShowMessage(CallFunction('prn_execute.no_param'));
// с одним параметром
ShowMessage(CallFunction('prn_execute.one_param', 1));
// заполнение массива с параметрами P:= VarArrayCreate([0, 1], varVariant); P[0]:=1; P[1]:=2;
// с двумя параметрами
ShowMessage(CallFunction('prn_execute.two_param', P ) );
end.
Функция в скрипте, параметр - объект класса TGZM_BasEl:
function get_name_obj(obj:TGZM_BasEl):string; begin result := obj.name; end;
Вызов в выражении:
name=CallFunction('get_name_obj',[this_obj])
procedure execute(obj:TGZM_Layer);
var
i:integer;
begin
// толщина линий полигона = 3
for i:=1 to obj.polygons.Count do begin
obj.polygons[i].width:=3;
end;
// цвет шрифта подписей точек установим черным
obj.points.Design.Font.Color:=0;
// цвет шрифта подписей полигонов установим черным
obj.polygons.Design.Font.Color:=0;
end;
Вызов в выражении:
// выполнить сприпт для основного чертежа Execute = prn_execute.execute // выполнить сприпт для подложки PdlExecute = prn_execute.execute
Функция в скрипте, параметр - объект класса TGZM_BasEl:
function geolink_text(obj:TGZM_BasEl):string;
var
txt:TGZM_TextC;
url:string;
begin
if (obj is TGZM_TextC) then begin
txt:=TGZM_TextC(obj);
url:='';
if txt.lines.count>0 then url:=txt.lines[0]; // формирование ссылки if (url<>'') then ExecuteFile(url); // перейти по ссылке
end;
result:='';
end;
Вызов в выражении:
on_link=CallFunction('geolinks.geolink_text',[this_obj])
При выборе текстового объекта происходит переход по ссылке, заданной текстом.
Открытие папки: d:\
Открытие файла: d:\image.jpg
Открытие ссылки в браузере: http:\\yandex.ru