Создание скриптов

Скрипт проверки элементов

Скрипт для отчётов

Скрипт для работы с файлами

Скрипт для решения задач

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

Выполнение функций

 

Функции для скриптов:

Функция Назначение
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