Здесь показаны различия между двумя версиями данной страницы.
описание_паскаль_скриптов [09/08/2012 05:38] 194.113.59.80 |
описание_паскаль_скриптов [08/02/2021 18:25] (текущий) radioxoma [Использование автозамены плейсхолдеров] |
||
---|---|---|---|
Строка 1: | Строка 1: | ||
+ | [[главная|Главная страница]] | ||
+ | |||
+ | [[функции_программы|Функции программы]] | ||
+ | |||
+ | ====== Описание скриптов Pascal ====== | ||
+ | |||
Файл **GetUrlScript.txt** содержит скрипт, написанный на Pascal, и предназначен для формирования параметров запроса тайла, к которым относятся: | Файл **GetUrlScript.txt** содержит скрипт, написанный на Pascal, и предназначен для формирования параметров запроса тайла, к которым относятся: | ||
* полный адрес ссылки на тайлы данной карты; | * полный адрес ссылки на тайлы данной карты; | ||
Строка 5: | Строка 11: | ||
Переменные, доступные в скриптах: | Переменные, доступные в скриптах: | ||
- | * **GetURLBase** (string) - неизменная часть адреса ссылки на тайлы карты, соответствует параметру DefURLBase в params.txt | + | * **GetURLBase** (AnsiString) — неизменная часть адреса ссылки на тайлы карты, соответствует параметру DefURLBase в params.txt |
- | * **RequestHead** (string) - заголовки, которые будут переданы серверу при запросе (проинициализирована значением RequestHead из params.txt) | + | * **RequestHead** (AnsiString) — заголовки, которые будут переданы серверу при запросе (проинициализирована значением RequestHead из params.txt) |
- | * **Version** (string) - версия тайлов, соответствует параметру Version в params.txt | + | * **Version** (AnsiString) — версия тайлов, соответствует параметру Version в params.txt |
- | * **Lang** (string) - язык, соответствует языку интерфейса программы. Принимает значения 'en', 'ru', 'uk' | + | * **Lang** (AnsiString) — язык, соответствует языку интерфейса программы. Принимает значения 'en', 'ru', 'uk' |
- | * **GetX, GetY, GetZ** (integer) - соответственно номер тайла по горизонтали (слева), по вертикали (сверху), масштаб (от 1 до 24) | + | * **GetX, GetY, GetZ** (Integer) — соответственно номер тайла по горизонтали (слева), по вертикали (сверху), масштаб (от 1 до 24) |
- | * **GetLLon, GetRLon, GetTLat, GetBLat** (double) - соответственно долгота левой границы тайла, правой границы, широта верхней границы, нижней границы | + | * **GetLLon, GetRLon, GetTLat, GetBLat** (Double) — соответственно долгота левой границы тайла, правой границы, широта верхней границы, нижней границы |
- | * **GetLMetr, GetRMetr, GetTMetr, GetBMetr** (double) - то же в метрах | + | * **GetLMetr, GetRMetr, GetTMetr, GetBMetr** (Double) — то же в метрах |
- | * **ResponseHead** (string) - заголовки ответа сервера от предыдущего запроса | + | * **ResponseHead** (AnsiString) — заголовки ответа сервера от предыдущего запроса |
- | * **ScriptBuffer** (string) - буфер, любая информация передаваемая между скриптами | + | * **ScriptBuffer** (AnsiString) — буфер, любая информация передаваемая между скриптами |
- | * **ResultURL** (string) - сюда нужно сформировать ссылку на тайл | + | * **ResultURL** (AnsiString) — сюда нужно сформировать ссылку на тайл |
- | * **PostData** (string) - Если в скрипте в строковую переменную PostData поместить какие-то данные, то будет выполнен POST запрос вместо GET запроса. | + | * **PostData** (AnsiString) — если в скрипте в строковую переменную PostData поместить какие-то данные, то будет выполнен POST запрос вместо GET запроса |
- | Функции для работы со строками, доступные в скриптах: | + | Интерфейсные переменные, доступные в скриптах*: |
- | * function **Pos**(const SubStr, Str: string): Integer; | + | * **Downloader** (ISimpleHttpDownloader) — выполнение HTTP запросов внутри скрипта. Доступно только при включённой опции **IsUseDownloaderInScript** в params.txt |
- | * function **Copy**(Str: string; StartPos, Count: Integer): string; | + | * **DefProjConverter** (IProjConverter) — конвертер координат в проекции, определённой в params.txt (параметр **Proj4Args**). Доступна только при наличии **proj.dll** |
- | * function **Length**(const Str: string): Integer; | + | * **ProjFactory** (IProjConverterFactory) — фабрика, для создания конвертеров координат различных проекций. Доступна только при наличии **proj.dll** |
- | * function **GetAfter**(SubStr, Str: string): string; | + | * **Converter** (ICoordConverter) — набор функций для работы с координатами в текущей проекции |
- | * function **GetBefore**(SubStr, Str: string): string; | + | Описание интерфейсов и примеры их использования см. ниже. |
- | * function **GetBetween**(Str, After, Before: string): string; | + | |
- | * function **SubStrPos**(const Str, SubStr: AnsiString; FromPos: Integer): Integer; | + | |
- | * function **RegExprGetMatchSubStr**(const Str, MatchExpr: string; MatchID: Integer): string; | + | |
- | * function **RegExprReplaceMatchSubStr**(const Str, MatchExpr, Replace: string): string; | + | |
- | * function **SetHeaderValue**(Headers, Name, Value: string): string; | + | |
- | * function **GetHeaderValue**(Headers, Name: string): string; | + | |
- | Другие доступные функции: | + | * - эти переменные могут быть не инициализированы (т.е. = nil). Перед использованием их необходимо проверять при помощи функции **Assigned**. |
- | * function **Random**(x:integer):integer' | + | |
- | * function **GetUnixTime**:int64' | + | |
- | * function **RoundEx**(chislo: Double; Precision: Integer): string' | + | |
- | * function **IntPower**(const Base: Extended; const Exponent: Integer): Extended register' | + | |
- | * function **IntToHex**(Value: Integer; Digits: Integer): string' | + | |
- | Работа с хитрыми системами координат | + | Функции и процедуры, доступные в скриптах: |
+ | * function **Assigned**(const I: LongInt): Boolean; | ||
+ | * function **IntToStr**(const i: Int64): String; | ||
+ | * function **StrToInt**(const s: String): LongInt; | ||
+ | * function **StrToIntDef**(const s: String; const def: LongInt): LongInt; | ||
+ | * function **Copy**(const s: AnyString; const iFrom: LongInt; const iCount: LongInt): AnyString; | ||
+ | * function **Pos**(const SubStr: AnyString; const S: AnyString): LongInt; | ||
+ | * procedure **Delete**(var s: AnyString; const ifrom: LongInt; const icount: LongInt); | ||
+ | * procedure **Insert**(const s: AnyString; var s2: AnyString; const iPos: LongInt); | ||
+ | * function **GetArrayLength**(const arr): LongInt; | ||
+ | * procedure **SetArrayLength**(var arr; const count: LongInt); | ||
+ | * function **StrGet**(var S: String; const I: LongInt): Char; | ||
+ | * function **StrGet2**(const S: String; const I: LongInt): Char; | ||
+ | * procedure **StrSet**(const c: Char; const I: LongInt; var s: String); | ||
+ | * function **WStrGet**(var S: AnyString; const I: LongInt): WideChar; | ||
+ | * procedure **WStrSet**(const c: AnyString; const I: LongInt; var s: AnyString); | ||
+ | * function **VarArrayGet**(var S: Variant; const I: LongInt): Variant; | ||
+ | * procedure **VarArraySet**(const c: Variant; const I: LongInt; var s: Variant); | ||
+ | * function **AnsiUppercase**(const s: String): String; | ||
+ | * function **AnsiLowercase**(const s: String): String; | ||
+ | * function **Uppercase**(const s: AnyString): AnyString; | ||
+ | * function **Lowercase**(const s: AnyString): AnyString; | ||
+ | * function **Trim**(const s: AnyString): AnyString; | ||
+ | * function **Length**(const s): LongInt; | ||
+ | * procedure **SetLength**(var s; const NewLength: LongInt); | ||
+ | * function **Low**(const x): Int64; | ||
+ | * function **High**(const x): Int64; | ||
+ | * procedure **Dec**(var x); | ||
+ | * procedure **Inc**(var x); | ||
+ | * procedure **Include**(var s; const m); | ||
+ | * procedure **Exclude**(var s; const m); | ||
+ | * function **Sin**(const e: Extended): Extended; | ||
+ | * function **Cos**(const e: Extended): Extended; | ||
+ | * function **Sqrt**(const e: Extended): Extended; | ||
+ | * function **Round**(const e: Extended): LongInt; | ||
+ | * function **Trunc**(const e: Extended): LongInt; | ||
+ | * function **Int**(const e: Extended): Extended; | ||
+ | * function **Pi**: Extended; | ||
+ | * function **Abs**(const e: Extended): Extended; | ||
+ | * function **StrToFloat**(const s: String): Extended; | ||
+ | * function **FloatToStr**(const e: Extended): String; | ||
+ | * function **Padl**(const s: AnyString; const I: LongInt): AnyString; | ||
+ | * function **Padr**(const s: AnyString; const I: LongInt): AnyString; | ||
+ | * function **Padz**(const s: AnyString; const I: LongInt): AnyString; | ||
+ | * function **Replicate**(const c: Char; const I: LongInt): String; | ||
+ | * function **StringOfChar**(const c: Char; const I: LongInt): String; | ||
+ | * function **Unassigned**: Variant; | ||
+ | * function **VarIsEmpty**(const V: Variant): Boolean; | ||
+ | * function **Null**: Variant; | ||
+ | * function **VarIsNull**(const V: Variant): Boolean; | ||
+ | * function **VarType**(const V: Variant): Word; | ||
+ | * procedure **RaiseLastException**; | ||
+ | * procedure **RaiseException**(const Ex: TIFException; const Param: String); | ||
+ | * function **ExceptionType**: TIFException; | ||
+ | * function **ExceptionParam**: String; | ||
+ | * function **ExceptionProc**: LongWord; | ||
+ | * function **ExceptionPos**: LongWord; | ||
+ | * function **ExceptionToString**(const er: TIFException; const Param: String): String; | ||
+ | * function **StrToInt64**(const s: String): Int64; | ||
+ | * function **Int64ToStr**(const i: Int64): String; | ||
+ | * function **StrToInt64Def**(const s: String; const def: Int64): Int64; | ||
+ | * function **SizeOf**(const Data): LongInt; | ||
+ | * function **IDispatchInvoke**(const Self: IDispatch; const PropertySet: Boolean; const Name: String; const Par: !OPENARRAYOFVARIANT): Variant; | ||
+ | * function **Random**(const X: LongInt): LongInt; | ||
+ | * function **RandomRange**(const AFrom: LongInt; const ATo: LongInt): LongInt; | ||
+ | * function **RoundEx**(const chislo: Double; const Precision: LongInt): String; | ||
+ | * function **Power**(const Base: Extended; const Exponent: Extended): Extended; | ||
+ | * function **IntPower**(const Base: Extended; const Exponent: LongInt): Extended; | ||
+ | * function **IntToHex**(const Value: LongInt; const Digits: LongInt): String; | ||
+ | * function **Ceil**(const X: Extended): LongInt; | ||
+ | * function **Floor**(const X: Extended): LongInt; | ||
+ | * function **Log2**(const X: Extended): Extended; | ||
+ | * function **Ln**(const X: Extended): Extended; | ||
+ | * function **Max**(const A: LongInt; const B: LongInt): LongInt; | ||
+ | * function **MaxExt**(const A: Extended; const B: Extended): Extended; | ||
+ | * function **Min**(const A: LongInt; const B: LongInt): LongInt; | ||
+ | * function **MinExt**(const A: Extended; const B: Extended): Extended; | ||
+ | * function **GetAfter**(const SubStr: AnsiString; const Str: AnsiString): AnsiString; | ||
+ | * function **GetBefore**(const SubStr: AnsiString; const Str: AnsiString): AnsiString; | ||
+ | * function **GetBetween**(const Str: AnsiString; const After: AnsiString; const Before: AnsiString): AnsiString; | ||
+ | * function **SubStrPos**(const Str: AnsiString; const SubStr: AnsiString; const FromPos: LongInt): LongInt; | ||
+ | * function **RegExprGetMatchSubStr**(const Str: AnsiString; const MatchExpr: AnsiString; const AMatchID: LongInt): AnsiString; | ||
+ | * function **RegExprReplaceMatchSubStr**(const Str: AnsiString; const MatchExpr: AnsiString; const Replace: AnsiString): AnsiString; | ||
+ | * function **GetNumberAfter**(const ASubStr: AnsiString; const AText: AnsiString): AnsiString; | ||
+ | * function **GetDiv3Path**(const ANumber: AnsiString): AnsiString; | ||
+ | * function **StringReplace**(const S: AnsiString; const OldPattern: AnsiString; const NewPattern: AnsiString; const ReplaceAll: Boolean; const IgnoreCase: Boolean): AnsiString; | ||
+ | * function **SetHeaderValue**(const AHeaders: AnsiString; const AName: AnsiString; const AValue: AnsiString): AnsiString; | ||
+ | * function **GetHeaderValue**(const AHeaders: AnsiString; const AName: AnsiString): AnsiString; | ||
+ | * function **GetUnixTime**: Int64; | ||
+ | * function **SaveToLocalFile**(const AFullLocalFilename: AnsiString; const AData: AnsiString): LongInt; | ||
+ | * function **FileExists**(const FileName: AnsiString): Boolean; | ||
+ | * function **Base64Encode**(const Data: AnsiString): AnsiString; | ||
+ | * function **Base64UrlEncode**(const Data: AnsiString): AnsiString; | ||
+ | * function **Base64Decode**(const Data: AnsiString): AnsiString; | ||
+ | * function **TemplateToUrl**(const ATmpl: String): String; | ||
- | Если в папке с программой присутствует proj480.dll, то в скриптах будут доступны такие переменные | + | ===== Выполнение HTTP запросов из скрипта ===== |
+ | |||
+ | В zmp должно быть включена возможность выполнять HTTP запросы **IsUseDownloaderInScript=1** | ||
+ | |||
+ | В скрипте можно пользоваться переменной **Downloader**, если она не пустая, то можно выполнять DoHttpRequest | ||
+ | |||
+ | <code delphi> | ||
+ | ISimpleHttpDownloader = interface | ||
+ | function DoHttpRequest( | ||
+ | const ARequestUrl, ARequestHeader, APostData: AnsiString; | ||
+ | out AResponseHeader, AResponseData: AnsiString | ||
+ | ): Cardinal; | ||
+ | end; | ||
+ | </code> | ||
+ | |||
+ | Пример: | ||
+ | |||
+ | <code delphi> | ||
+ | var | ||
+ | VRequestUrl, VRequestHeader, VPostData: string; | ||
+ | VResponseCode: Cardinal; | ||
+ | VResponseHeader, VResponseData: string; | ||
+ | begin | ||
+ | |||
+ | if Assigned(Downloader) then begin | ||
+ | VRequestUrl := 'http://google.com/'; | ||
+ | VRequestHeader := ''; | ||
+ | VPostData := ''; | ||
+ | VResponseHeader := ''; | ||
+ | VResponseData := ''; | ||
+ | |||
+ | VResponseCode := Downloader.DoHttpRequest(VRequestUrl, VRequestHeader, VPostData, VResponseHeader, VResponseData); | ||
+ | |||
+ | if VResponseCode = 200 then begin | ||
+ | ScriptBuffer := VResponseData; | ||
+ | end else begin | ||
+ | ScriptBuffer := VResponseHeader; | ||
+ | end; | ||
+ | end; | ||
+ | end. | ||
+ | |||
+ | </code> | ||
+ | |||
+ | ===== Работа с хитрыми системами координат ===== | ||
+ | |||
+ | Если в папке с программой присутствует proj.dll, то в скриптах будут доступны такие переменные | ||
* переменная **DefProjConverter** с объектом типа: | * переменная **DefProjConverter** с объектом типа: | ||
<code delphi> | <code delphi> | ||
Строка 55: | Строка 189: | ||
end; | end; | ||
</code> | </code> | ||
- | Позволяет создавать конвертеры по требованию, например с учетом зон и тд. | + | Позволяет создавать конвертеры по требованию, например с учетом зон и т. д. |
Например так: | Например так: | ||
Строка 66: | Строка 200: | ||
// check bounds (EPSG:28483 between 132E and 138E) and correct EPSG (inc or dec) | // check bounds (EPSG:28483 between 132E and 138E) and correct EPSG (inc or dec) | ||
VEPSG := 28483; | VEPSG := 28483; | ||
- | if (GetLLon<132) then begin | + | if (GetLLon < 132) then begin |
VEPSG := VEPSG - 1; | VEPSG := VEPSG - 1; | ||
- | end else if (GetLLon>138) then begin | + | end else if (GetLLon > 138) then begin |
VEPSG := VEPSG + 1; | VEPSG := VEPSG + 1; | ||
end; | end; | ||
| | ||
// get proj4 converter | // get proj4 converter | ||
- | Proj4Conv := ProjFactory.GetByEPSG(VEPSG-(28483-2513)); | + | Proj4Conv := ProjFactory.GetByEPSG(VEPSG - (28483 - 2513)); |
if Assigned(Proj4Conv) then begin | if Assigned(Proj4Conv) then begin | ||
// Тут генерируем Url | // Тут генерируем Url | ||
Строка 83: | Строка 217: | ||
</code> | </code> | ||
+ | ===== Работа с координатами ===== | ||
+ | <code delphi> | ||
+ | ICoordConverter = interface | ||
+ | // Преобразует позицию тайла на заданном зуме в георафически координаты его верхнего левого угла | ||
+ | function Pos2LonLat(const XY: TPoint; AZoom: byte): TDoublePoint; stdcall; | ||
+ | // Преобразует георафические координаты в позицию тайла на заданном зуме накрывающего данные координаты | ||
+ | function LonLat2Pos(const Ll: TDoublePoint; AZoom: byte): Tpoint; stdcall; | ||
+ | |||
+ | // метрические координаты | ||
+ | function LonLat2Metr(const Ll: TDoublePoint): TDoublePoint; stdcall; | ||
+ | function Metr2LonLat(const Mm: TDoublePoint): TDoublePoint; stdcall; | ||
+ | |||
+ | // Возвращает количество тайлов в заданном зуме | ||
+ | function TilesAtZoom(const AZoom: byte): Longint; stdcall; | ||
+ | // Возвращает общее количество пикселей на заданном зуме | ||
+ | function PixelsAtZoom(const AZoom: byte): Longint; stdcall; | ||
+ | |||
+ | // Преобразует позицию тайла заданного зума в координаты пиксела его левого верхнего угла | ||
+ | function TilePos2PixelPos(const XY: TPoint; const AZoom: byte): TPoint; stdcall; | ||
+ | // Преобразует позицию тайла заданного зума в номера пикселов его углов на заданном зуме | ||
+ | function TilePos2PixelRect(const XY: TPoint; const AZoom: byte): TRect; stdcall; | ||
+ | end; | ||
+ | </code> | ||
+ | |||
+ | Пример: | ||
+ | |||
+ | <code delphi> | ||
+ | var | ||
+ | VTilesCount: Integer; | ||
+ | begin | ||
+ | if Assigned(Converter) then begin | ||
+ | VTilesCount := Converter.TilesAtZoom(GetZ); | ||
+ | // производим расчёты и генерируем url | ||
+ | end else begin | ||
+ | ResultURL := ''; | ||
+ | end; | ||
+ | end. | ||
+ | </code> | ||
+ | |||
+ | |||
+ | ===== Использование автозамены плейсхолдеров ===== | ||
+ | |||
+ | Если файла **GetUrlScript.txt** нет или он пуст (в том числе не содержит ни пробелов, ни переводов строк), то будет выполнен скрипт, который автоматически заменяет плейсхолдеры найденные в **GetURLBase**. Именно в этом формате он применяется при [[простой_пример_с_плейсхолдерами |упрощенном добавлении карт]]). Однако, если вам потребуется, то вы можете использовать эту функцию в собственных скриптах. | ||
+ | |||
+ | <code delphi> | ||
+ | begin | ||
+ | ResultUrl := TemplateToUrl(GetURLBase); | ||
+ | end. | ||
+ | </code> | ||