Скрипт для преобразования системы координат
Функции для скриптов:
Функция | Назначение |
---|---|
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