Приклади робочих скриптів у звітових формах

Геодезична інформаційна система 6 та Геодезична інформаційна система 6 Агро

Модератори: NickS, feNICKs

feNICKs
Повідомлень: 412
З нами з: 13 січня 2012, 16:03
Контактна інформація:

Re: Примеры рабочих скриптов в отчётных формах

Повідомлення feNICKs » 15 березня 2013, 16:14

LeViK писав:Доброго времени суток, как работает эта функция?
VisibleGisMenu('Всех участков',False);
Оно может снять галку с параметра "Отображение/Всех участков" в окне "Камеральные функции"? Если да, то каким образом заполняется текстовый указатель на соответствующее поле?

Данная процедура делает невидимым или видимым слой в окне Камеральные функции перед формированием изображения и загрузки его в отчетную форму.
Пример кода, для обработчика событий объекта Рисунок (Picture)

Код: Виділити все

procedure Picture1OnBeforePrint(Sender: TfrxComponent);
begin
   With Picture1 Do
   Begin

      VisibleGisLayer(0, True);   // участок
      VisibleGisLayer(1, True);   // план
      VisibleGisLayer(2, True);   // агрогруппы
      VisibleGisLayer(3, false);   // таблица расчётов
      VisibleGisLayer(4, true);   // обозначения
      VisibleGisLayer(5, true);   // ситуация
      VisibleGisLayer(6, true);   // чертёж
      VisibleGisLayer(7, false);   // каталог координат
      VisibleGisLayer(8, true);   // горизонтали
      VisibleGisLayer(9, true);   // оформление
      VisibleGisLayer(10, true);  // сервитуты
      VisibleGisLayer(11, true);  // ограничения
      VisibleGisLayer(12, true);  // аренда
      VisibleGisLayer(13, false);  // теодолитный ход
      VisibleGisLayer(14, False);  // карта
      VisibleGisLayer(15, false);  // проектные дороги
      VisibleGisLayer(16, false);  // сторонние земли
      VisibleGisLayer(17, false);  // секущая линия   

      SetShift(<DM1.QbObject."XCenter">, <DM1.QbObject."YCenter">);
      DrawWmf(Width * 10 / (2560/6773), Height * 10 /(2560/6773), 0);
      Loadfromfile( StartPath +'\gis.wmf');

   End;
end;

Аватар користувача
NickS
Повідомлень: 1393
З нами з: 04 квітня 2008, 12:21

Re: Примеры рабочих скриптов в отчётных формах

Повідомлення NickS » 15 березня 2013, 17:59

LeViK писав:Доброго времени суток, как работает эта функция?
VisibleGisMenu('Всех участков',False);
Оно может снять галку с параметра "Отображение/Всех участков" в окне "Камеральные функции"? Если да, то каким образом заполняется текстовый указатель на соответствующее поле?

Да. Именно для того, чтобы создать в отчётной форме разные рисунки с разным набором параметров в меню "Отображение" и нужна эта функция. Чтобы эта функция работала, её надо использовать перед функцией отрисовки рисунка DrawWmf. Вот пример процедуры для рисунка Picture1:

Код: Виділити все

procedure Picture1OnBeforePrint(Sender: TfrxComponent);
begin
   with Picture1, Engine do
   begin
      VisibleGisMenu(ShowPoint, true);
      DrawWmf(Width * 10 / (2560/6773), Height * 10 /(2560/6773), 0);
      Loadfromfile( StartPath +'\gis.wmf');
   end;
end;


Функция описывается так:
VisibleGisMenu(<название параметра>, <вкл/выкл>);
где, <вкл/выкл> - параметр включен или отключён (true - включен, false - отключён)
<название параметра> - название параметра для меню "Отображение" (это внутреннее название, его в программе посмотреть нельзя).

Вот основной перечень (который, кстати, есть в папке программы в файле "_Описание переменных.txt"):

Код: Виділити все

    ShowLines - Линий
    ShowPoint - Узловых точек
    ShowLength - Вычисленных расстояний
    ShowNumber - Номеров точек
    ShowName - Наименований точек
    ShowCutIn - Внутренних углов
    ShowDCut - Дирекционных углов
    ShowArea - Площадь земельного участка
    ShowText - Строка перед площадью

     - Смежеств
    ShowOMLine - Стрелок смежества
    ShowOMLitera - Обозначений смежества
    ShowOMColor - Смежества цветом
    ShowOMCad - Кадастровых номеров
    ShowOMMej - Описаний смежества
    ShowOMName - Наименований смежества

     - Слой план
    ShowPlanArea - площади
    ShowPlanLbl - обозначения
    ShowPlanLen - расстояний
    ShowPlanPnt - узловых точек
    ShowPlanNum - номеров точек
    ShowPlanName - наименований точек

     - Слой сервитуты
    ShowServArea - площади
    ShowServLbl - номера
    ShowServRnt - окружность
    ShowServLen - расстояний
    ShowServPnt - узловых точек
    ShowServNum - номеров точек
    ShowServName - наименований точек

     - Слой ограничения
    ShowLimArea - площади
    ShowLimLbl - номера
    ShowLimRnd - окружность
    ShowLimLen - расстояний
    ShowLimPnt - узловых точек
    ShowLimNum - номеров точек
    ShowLimName - наименований точек

     - Слой теодолитный ход
    ShowGeoColor - Теодолитного хода в цвете
    nShowGeoLine - Линий для теодолитного хода

     - Косметические слои
    ShowCosColor - Условных обозначений в цвете

     - Параметры отображения
    ShowEnergy - Объектов в виде электросетей
    ShowFill - Заливки для полигонов
    ShowNorth - Указателя на север
    ShowGrid - Координатной сетки
    ShowLineDCut - Полуокружности дирекционного угла
    ShowLineCutIn - Полуокружности внутренноего угла
    ViewAll - Всех участков
    ViewMark - Всех отмеченных участков
    ViewSelect - Всех выбранных в списке участков
    ViewShow - Всех отображённых в списке участков

     - Для прочих участков
    ShowOtherArea - площадь контура
    ShowOtherAdr - адрес участка
    ShowOtherNum - номер участка
    ShowOtherGrp - номер группы
    ShowOtherPln - номер планшета
    ShowOtherName - ФИО собственника
    ShowOtherCad - кадастровый номер
    ShowOtherPnt - узловых точек
    ShowOtherTech - исполнитель
    ShowOtherActive - активные
    ShowOtherPassive - пассивные
    ShowOtherDelete - удалённые
    ShowOtherOther - прочие
    ShowOtherArch - архивные
    ShowOtherArrest - ограниченные
    ShowOtherPlan - объекты плана
    ShowActive - Отображать текущий участок
    MarkPolygon - Выделить текущий участок
    MarkObject - Выделить маркированные объекты название параметра

LeViK
Повідомлень: 63
З нами з: 25 січня 2012, 09:52
Звідки: BeerDyansk

Re: Примеры рабочих скриптов в отчётных формах

Повідомлення LeViK » 18 березня 2013, 10:06

Спасибо за разъяснения, многим упростила жизнь эта функция. Кстати, в версии 6.1.5.2 в файле _описание переменных.txt такой инфы я в упор не видел. И название поля текстовое, в кавычки его

Код: Виділити все

VisibleGisMenu('Viewall', False);

xxbabayxx
Повідомлень: 27
З нами з: 01 березня 2013, 15:39

Re: Примеры рабочих скриптов в отчётных формах

Повідомлення xxbabayxx » 19 березня 2013, 09:07

Добрый день. Подскажите пожалуйся функцию для удаления символов из строки(как с начала так и с конца)

Аватар користувача
NickS
Повідомлень: 1393
З нами з: 04 квітня 2008, 12:21

Re: Примеры рабочих скриптов в отчётных формах

Повідомлення NickS » 19 березня 2013, 10:13

xxbabayxx писав:Добрый день. Подскажите пожалуйся функцию для удаления символов из строки(как с начала так и с конца)

Специальной функции нету, потому приходится работать комбинациями функций Copy(), Pos(), Length() и Trim().
Copy(C, x, y) - функция копирует часть строки из строки С
С - строка из которой надо скопировать
x - номер по порядку символа с которого надо начать копирование
y - количество символов, которые надо скопировать

Например, надо копировать 5 символов из строки "Строка...":

Код: Виділити все

Rezultat := Copy('Строка...', 1, 5)

Переменная Rezultat будет иметь результат - "Строк"

Pos(B, C) - ищет строку B в строке C и выдаёт номер символа в котором нашло первый раз
Например, надо найти букву "о" в строке "Строка...":
Rezultat := Copy('о', 'Строка...')

Переменная Rezultat будет иметь результат - 4 (потому что буква "о" была четвёртым символом)

Length(C) - выдаёт количество символов в строке С
Например, Length('Строка...') будет равно 9 (9 символов в этой строке)

Trim(C) - просто удаляет пробела в начале строки С и в конце.
Например, Trim(' Строка ') будет иметь результат - "Строка"

Теперь рассмотрим комбинацию этих функций:
Например, надо удалить два последние символа из строки, при этом там могут быть и пробелы "Строка... ":

Код: Виділити все

С := 'Строка...         ';
Rezultat := Copy(Trim(C), 1, Length(Trim(C))-2)

Переменная Rezultat будет иметь результат - "Строка."

feNICKs
Повідомлень: 412
З нами з: 13 січня 2012, 16:03
Контактна інформація:

Re: Примеры рабочих скриптов в отчётных формах

Повідомлення feNICKs » 19 березня 2013, 10:47

Можно также использовать процедуру удаления <b>Delete(S, from, count)</b>, где S - строка, from - номер символа в строке, с которого нужно удалять символы, count - количество символов, которые нужно удалить.

Например

Код: Виділити все

   S := '1234567890';
   Detele(S, 2, 3);

результат - S='1567890'
Только учтите, процедура Delete удаляет символы со строки, а использования функции Copy (см. в пред.ответе) возвращает копию строки - значение которой Вы можете присвоить другой переменной, а содержимое оригинальной не изменится.

Аватар користувача
Vaho
Повідомлень: 130
З нами з: 21 жовтня 2011, 10:01

Re: Примеры рабочих скриптов в отчётных формах

Повідомлення Vaho » 19 березня 2013, 16:09

Здравствуйте! подскажите пожалуйста.
Функция VISIBLEMAPLAYER(<Номер>,<Отображение>) - Присваивает состояние видимости слою
Как мне узнать номера моих слоев?

feNICKs
Повідомлень: 412
З нами з: 13 січня 2012, 16:03
Контактна інформація:

Re: Примеры рабочих скриптов в отчётных формах

Повідомлення feNICKs » 19 березня 2013, 17:23

Vaho писав:Здравствуйте! подскажите пожалуйста.
Функция VISIBLEMAPLAYER(<Номер>,<Отображение>) - Присваивает состояние видимости слою
Как мне узнать номера моих слоев?

Начинается нумерация с 1 до N, где N - количество слоев в окне Карта.

Аватар користувача
Vaho
Повідомлень: 130
З нами з: 21 жовтня 2011, 10:01

Re: Примеры рабочих скриптов в отчётных формах

Повідомлення Vaho » 20 березня 2013, 09:45

Код: Виділити все

procedure Picture2OnBeforePrint(Sender: TfrxComponent);
begin
      VISIBLEMAPLAYER(0, false);   // ó÷àñòîê
      VISIBLEMAPLAYER(1, false);   // ïëàí
      VISIBLEMAPLAYER(2, false);   // àãðîãðóïïû
      VISIBLEMAPLAYER(3, false);   // òàáëèöà ðàñ÷¸òîâ
      VISIBLEMAPLAYER(4, false);   // îáîçíà÷åíèÿ
      VISIBLEMAPLAYER(5, true);   // ñèòóàöèÿ
      VISIBLEMAPLAYER(6, false);   // ÷åðò¸æ
      VISIBLEMAPLAYER(7, false);   // êàòàëîã êîîðäèíàò
      VISIBLEMAPLAYER(8, false);   // ãîðèçîíòàëè
      VISIBLEMAPLAYER(9, false);   // îôîðìëåíèå
      VISIBLEMAPLAYER(10, false);  // îáùèé
      VISIBLEMAPLAYER(11, false);  // ñåðâèòóòû
      VISIBLEMAPLAYER(12, false);  // îãðàíè÷åíèÿ
      VISIBLEMAPLAYER(13, false);  // àðåíäà
      VISIBLEMAPLAYER(14, false);  // òåîäîëèòíûé õîä
      VISIBLEMAPLAYER(15, false);  // êàðòà
      VISIBLEMAPLAYER(16, false);  // ïðîåêòíûå äîðîãè
      VISIBLEMAPLAYER(17, false);  // ñòîðîííèå çåìëè
      VISIBLEMAPLAYER(25, false);  // ñåêóùàÿ ëèíèÿ
      SETSCALE(12000);     
   with Picture2, Engine do
   begin
      SetShift(<DM1.QbObject."XCenter">, <DM1.QbObject."YCenter">);
      DRAWmap(18540,25830,0);
      Loadfromfile( StartPath +'\map.wmf');
   end;
end;

Пишу вот такой фрагмент кода, а он не работает - формирует исходный рисунок с окна карта, то-есть рисунок формируется в том масштабе который я задал в окне карта (не зависимо от того какой масштаб я задаю по коду) и видимость слоев тоже исходная. По коду я задаю центр рисунка но формирует опять же исходный рисунок, а не заданный центр. Может я что-то не правильно делаю?

feNICKs
Повідомлень: 412
З нами з: 13 січня 2012, 16:03
Контактна інформація:

Re: Примеры рабочих скриптов в отчётных формах

Повідомлення feNICKs » 20 березня 2013, 10:11

Процедуры для отключения слоев нужно вставить после привязки к объекту Рисунок, а не перед ним. Нумерация первого слоя идет с 1, а не с 0.
Но суть не только в этом. Данные процедуры VisibleMapLayer и SetScale похоже что не совсем корректно работают: VisibleMapLayer просто инвертирует видимость слоя, в не зависимости от заданого параметра, SetScale задает масштаб, но не обновляет изображение после его изменения. Данные функции мы подправим в след. обновлении.

Пример кода:

Код: Виділити все

procedure Picture1OnBeforePrint(Sender: TfrxComponent);
begin
   with Picture1, Engine do
   begin
      VisibleMapLayer(1,True);
      VisibleMapLayer(2,True);
      DrawMap(Width * 10 / (2560/6773), Height * 10 /(2560/6773), 0);
      Loadfromfile( StartPath +'\map.wmf');
   end;
end;