На главную... Продукты | Технологии | Классификаторы | Проекты | Скачать | Цены| Форум | Статьи | Обучение | Контакты

Lazarus ?

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: Пред. 1 2 3 4 След.
RSS
Lazarus ?, Lazarus и компоненты GIS Toolkit Free
 
Похоже тема бьет все рекорды по просмотрам.
 

Здравствуйте!

Решил поделиться наработками в области адаптации GIS ToolKit под Lazarus. В процессе работы использовал опыт адаптации GIS ToolKit под Kylix. Ниже предлагаю описание последовательности своих действий.

1.В качестве ОС используется 64-разрядную Astra Linux SE версии 1.5.

2.Установите все инсталляционные пакеты библиотеки визуальных компонент gtk версии 2.0, включая пакеты для разработчиков. Для разработки Lazarus использовался указанный инструментарий.

3.Версию Lazarus 1.6.2 в формате DEB можно скачать с официального сайта http://www.lazarus-ide.org в разделе DownLoad (на данный момент актуальна версия 1.6.4). Необходимо скачать и установить пакеты среды разработки Lazarus и инсталляцию Free Pascal.

3.Скачать с сайта КБ Панорама инсталляцию ГИС Конструктор для Astra Linux SE по ссылке http://gisinfo.ru/download_linux?id=56

4. Скачать с сайта КБ Панорама исходные тексты GIS ToolKit 11 по ссылке http://gisinfo.ru/download?id=74

5.Установите пакеты Free Pascal и Lazarus. Я применял команды:

$sudo dpkg –i fpc_3.0.0-151205_amd64.deb

$sudo dpkg –i fpc-src_3.0.0-151205_amd64.deb

$sudo dpkg –i lazarus-project_1.6.2-0_amd64.deb

6.Запустите Lazarus командой:

$sudo lazarus-ide

7.Вызовите диалог “Параметры сборки Lazarus” и в поле “Очистка” установите галочку “Очищать все”, нажмите кнопку “Собрать” (рисунок 1). Lazarus полностью пересоберет свой проект и “переоткроется”.

7.Установите инсталляционный пакет ГИС Конструктор согласно readme-файлу.

8.Скопируйте в выбранный каталог исходные тексты GIS ToolKit 11. Файлы формата DFM советую перевести в текстовый вид. Тексты необходимо преобразовать в кодировку KOI8-R, так как ее используют библиотеки ГИС Конструктор.

В файле mapvers.inc “открыть” строку {$DEFINE LINUXAPI} и ниже добавить строки:

{$DEFINE LAZARUS} – далее будем отделять ключевым словом LAZARUS текст GTK, предназначенный исключительно для Lazarus

{$DEFINE CPUX64} – укажем платформу (x64)

9.Далее вызовите задачу “Преобразование пакета Delphi” активировав пункт меню “Сервис-Преобразование кода на Delphi-Преобразовать пакет Delphi в пакет Lazarus” для пакета mappack.dpk (рисунок 2). В результате mappack.dpk будет преобразован в файл mapack.lpk и далее Lazarus автоматически внесет  в исходный текст необходимые преобразования. Далее предстоит вручную корректировать исходный текст.

10.Откройте проект mappack.lpk и далее начинается этап компиляции. Применение ключевого слова LAZARUS покажу на примере:

Код
{$IFDEF LINUXAPI} 
SysUtils, Types, Classes,
{$IFNDEF LAZARUS}  QGraphics, QControls, QForms,  QDialogs, Qt,
{$ELSE}  
Graphics, Controls, Forms,  Dialogs, Messages,
{$ENDIF}
Xlib,
{$ENDIF}

Модули, названия которых начинаются с Q (пример QGraphics), относятся к среде разработки Kylix. Поэтому добавляем отдельную ветку объявления unit для Lazarus.

Далее делаем правки в соответствии с логикой адаптации: в местах, указанных компилятором, меняем существующий функционал на аналогичный для Lazarus.

11.Следующий вопрос: отображение карты на компоненте TMapView (mapcmp.cpp). В функции я поменял вызов функции mapPaint95 на mapPaintToXImage. Изменения представлены ниже:

Код
{$IFDEF LAZARUS }
   imagedesc:TXIMAGEDESC;
   MapBitmap: TBitmap;
   ScanLineImage: TLazIntfImage;
   ImgFormatDescription: TRawImageDescription;
{$ENDIF}
begin
  …
{$IFNDEF LAZARUS}
               mapPaint95(FMap, FMapDC, 0, FMapRec);
{$ELSE}
              mapPaintToXImage(FMap, @imagedesc, 0, 0, FMapRec);
              MapBitmap.Width  := ScanLineImage.Width;
              MapBitmap.Height := ScanLineImage.Height;
              MapBitmap.LoadFromIntfImage(ScanLineImage);
              FCanvas.Draw(iLeftPosition, iTopPosition, MapBitmap);
              ScanLineImage.Free;
              MapBitmap.Free;
{$ENDIF}
  …

12.В результате последовательного выполнения пунктов 10 и11, я получил готовый к использованию пакет mappack.lpk. Тестирование проводил на примере MapMtr. Файл формата DFM перевел в текстовый вид. Затем адаптировал проект MapMtr для Lazarus, выполнив пункты 9 и 10. На рисунке 3 представлен результат работы примера.

В следующий раз расскажу о возможности использования библиотек ГИС Конструктора, содержащих диалоги на Qt, в среде Lazarus.

L2.png (21.07 КБ)
L1.png (18.18 КБ)
L3.png (263 КБ)
Изменено: Сергей Геннадьевич - 01.04.2017 09:36:50
 

Здравствуйте!

В дополнение к предыдущему сообщению:

1. Важно помнить при переносе структур ГИС Конструктор: на платформе x64 longint в Lazarus равен 4 байтам, int64 – 8 байтам. В С++ - размер long int равен 8 байтам.

Поэтому все поля структур ГИС Конструктор, имеющие тип long int, должны быть перенесены в Lazarus с типом int64.

2. Чтобы в полной мере использовать возможности ГИС Конструктор для своих программ на Lazarus, необходимо знать внутреннюю кухню ГИС Конструктор.

Коротко: Экранный вид карты реализуется внутренними функциями ГИС Конструктор, которые в свою очередь используют функционал библиотеки XWindow.

Принтерно-растровый вид реализован на классах Qt4. Диалоговый интерфейс ГИС Конструктор также использует Qt4.

Изменено: Сергей Геннадьевич - 07.04.2017 21:57:52
 

Предлагаю описание своих действий по адаптации GIS ToolKit под Lazarus в связке с Qt.

Будем считать, что первая часть действий, которая описана в предыдущем сообщении, выполнена.

1.Работе Lazarus под профилем Qt посвящена страница проекта FreePascal http://wiki.freepascal.org/Qt_Interface. Из описания следует, что для полноценной работы необходима библиотека libQt4Pas, которую можно скачать по ссылке http://users.telenet.be/Jan.Van.hijfte/qtforfpc/V2.5/bin64-qt4pas-V2.5_Qt4.5.3.tar.gz

Скопируйте библиотеки libQt4Pas… в каталог /usr/lib. Файл qt4.pas не нужен, он входит в состав Lazarus.

2.6.Запустите Lazarus командой:

$sudo lazarus-ide

Соберите его под профилем qt. Вызовите диалог “Параметры сборки Lazarus”, в поле “Очистка” установите галочку “Очищать все”, в поле “Библиотека виджетов LCL” установите “qt”, в поле “Профиль сборки” установите “Очистить и сборать все”, нажмите кнопку “Собрать” (рисунок 1). Lazarus полностью пересоберет свой проект и “переоткроется”.

3.Далее необходимо полностью пересобрать проект MapMtr. Запустим программу, активируем режим выбора контекста отображения (компонент TMapSelectDialog). Откроется диалог “Состав объектов карты” (рисунок 2). Данный диалог основан на Qt4 и вызывается из библиотеки ГИС Конструктор libqdmapselec.so

В следующий раз подготовлю информацию по настройке принтерно-растрового режима отображения карты. Данный режим реализован в ГИС Конструктор на классах Qt4 с использованием callback-функций (функций обратного вызова).

2.2.png (155.76 КБ)
2.1.png (23.38 КБ)
Изменено: Сергей Геннадьевич - 09.04.2017 21:17:18
 

Здравствуйте!

Подготовил небольшой материал по настройке принтерно-растрового вида карты в Lazarus.

Как писал ранее, данный режим реализован в ГИС Конструктор на классах Qt4 с использованием callback-функций (функций обратного вызова), реализация которых находится в файле qdmwina.cpp исходных текстов ГИС Конструктор. Тексты лежат в каталоге /usr/share/qt4/examples/gisdesigner11/Sources инсталляции. Так как callback-функции подключаются в конструкторе компонента QDMapView, мы должны написать код библиотеки (назовем ее libmapqtinit.so), в которой создается экземпляр данного класса. Вот исходный код:

Код
#include
<Qt/qapplication.h>

#include "qdmcmp.h"

extern "C"
{
int QtInitDraw()
{
    QDMapView* w = new QDMapView;

    if (w != 0)
    {
      delete w;
      return 1;
    }

    return 0;
}
}

Далее копируем библиотеку в каталог /usr/lib и загрузим ее в наш проект. Установим принтерно-растровый вид отображения карты в проекте на Lazarus и запустим программу. Результат на рисунке.

В приложении: архив с исходными текстами библиотеки и примера.
L3.1.png (453.27 КБ)
Изменено: Сергей Геннадьевич - 18.04.2017 17:58:56
 
Здравствуйте!

Предлагаю краткий материал по разработке прикладной задачи для ГИС Оператор  в среде программирования Lazarus (язык программирования Free Pascal)). Что необходимо учитывать при разработке:

1. При использовании MAPAPI-интерфейса ГИС Оператор необходимо помнить, что символьная информация в библиотеках ГИС-ядра храниться в кодировке KOI8-R, Lazarus же использует кодировку UTF8. Поэтому предлагаю следующий путь преобразования символов на примере кода:

Код
LabelMapName.Caption := KOI8ToUTF8(mapGetMapName(hMap));

2.При использовании диалоговый интерфейс Lazarus необходимо учитывать последовательность объявления unit. Главное: unit Interfaces должен быть объявлен до

unit Forms.

3.Перед началом разработки сделайте “линк”-ссылку на библиотеку ГИС Оператор – libmapacces.so командой:

ln –s /usr/Operator11/libmapacces.so /usr/lib/libmapacces.so

Последовательность разработки включает следующие простые шаги:

1.Для запуска прикладной задачи необходимо описать функцию CallMapFunctionEx. Предлагаю ее код:

Код
TTASKPARMEX = packed record
    Language:int64;
    Resource : int64;
    HelpName : int64;
    IniName  : int64;
    PathShell: int64;
    ApplicationName : int64;
    Handle : int64;
    DocHandle : int64;
    StayOnTop : int64;
  end;
 function CallMapFunctionEx(hmap: int64; var parm : TTASKPARMEX): int64; cdecl;

2.Описание прототипа функции MAPAPI-интерфейса представлено ниже:

Код
  function  mapGetMapName(Map : int64) : PChar; cdecl external 'libmapacces.so';
  function  mapGetMainName(Map : int64) : PChar; cdecl external 'libmapacces.so';
  function  mapGetLayerCount(Map : int64) : integer; cdecl external 'libmapacces.so';
  function  mapGetObjectCount(Map : int64; list:integer) : integer; cdecl external 'libmapacces.so';
  function  mapGetListCount(Map : int64) : integer; cdecl external 'libmapacces.so';

3.Вызываются функции MAPAPI-интерфейса следующим образом:

Код
N := mapGetListCount(hMap);  // Запрос количества листов открытой карты

4.На рисунках представлен результат работы задачи в среде ГИС Оператор как под Astra Linux, так и Windows.

В архиве: исходные тексты прикладной задачи для ГИС Оператор, разработанной в среде Lazarus (язык программирования Free Pascal).

Linux.png (568.28 КБ)
Windows.png (758.03 КБ)
Изменено: Сергей Геннадьевич - 19.04.2017 18:25:05
 
Здравствуйте!
Решил подвести первые итоги работы с Lazarus.
Общие выводы:
1. Лазарус является бесплатным продуктом.
2. Наличие исходных текстов позволяет использовать данный продукт для разработки программ, которые в дальнейшем необходимо сертифицировать.
3. Lazarus является кроссплатформенной средой разработки. То есть разработанную программу в Windows можно перенести на Linux и наоборот.
4. Достаточная совместимость Lazarus с Delphi позволяет перенести наработки с Delphi на Lazarus.

Выводы по взаимодействию с программой ГИС Конструктор. Выделю  два:
1. Программа, написанная на Лазарус в сборке с Qt4, может использовать диалоги ГИС Конструктор, которые написаны на Qt4.
2. Программа, написанная на Лазарус в сборке с Qt4, может отображать карту в принтерно-растровом виде, который реализован в ГИС Конструктор на Qt4 на уровне MAPAPI-интерфейса.
Изменено: Сергей Геннадьевич - 26.04.2017 20:59:28
 

Здравствуйте!
   За последний год отечественные производители операционных систем (ОС) Astra Linux, AltLinux начали включать в дистрибутивы среду разработки Lazarus.  

  В продолжении знакомства с программированием прикладных задач в среде Lazarus (Операционная система Astra Linux CE) для ГИС Оператор предлагаю краткий обзор разработки с применением классов TPanTask, TPanWindow, TPanAction. Сначала напомню, что необходимо учитывать:

1.Задача разрабатывалась на базе исходных текстов из архива SDK для ГИС Оператор, который можно скачать по ссылке http://gisinfo.ru/download?id=131

2. Структуры и параметры необходимо привести к требованиям 64-битной ОС. Пример:

Код
TTASKPARMEX = packed record    
Language:int64;    
Resource : int64;    
HelpName : int64;    
IniName  : int64;    
PathShell: int64;    
ApplicationName : int64;    
Handle : int64;    
DocHandle : int64;    
StayOnTop : int64;  
end;

 За образец я взял исходные тексты на C++.

3.При использовании диалогового интерфейса необходимо учитывать последовательность объявления unit. Главное: unit Interfaces должен быть объявлен до unit Forms.

4.Перед началом разработки необходимо сделать “линк”-ссылку на библиотеку ГИС Оператор – libmapacces.so командой: ln –s /usr/Operator11/libmapacces.so /usr/lib/libmapacces.so

Далее для работы необходимо адаптировать классы TPanTask, TPanWindow, TPanAction для работы в Lazarus. В качестве эталона я использовал тексты на С++: pantask.cpp, h, panwin.h, panact.h. Главное, как упоминал выше, необходимо привести структуры и параметры к требованиям 64-битной ОС. В моем случае – это ОС Astra Linux CE (релиз Орел). Опишу главные моменты:

1.В описание TPanWindow необходимо добавить ссылку на функцию-обработчик главной программы:

Код
{$IFDEF LINUXAPI}      MessageHandler: MSGHANDLER;{$ENDIF}

Описание типа функции представлено ниже:

Код
{$IFDEF LINUXAPI}  MSGHANDLER = function (hwnd : int64; code : int64; p1 : int64; p2: int64; typemsg: int64) : int64; cdecl;{$ENDIF}

2.Далее в конструкторе класса укажем реальный адрес:

Код
{$IFNDEF LINUXAPI}        
FHMainWindow := parm.Handle;      
{$ELSE}        
FHMainWindow := 0;        
MessageHandler := MSGHANDLER(aparm.Handle); 
{$ENDIF}

3.Для функций класса TPanWindow необходимо для указателей-параметров задавать  преобразование к 64-битной переменной:

Код
   procedure TPanWindow.SetWindowTitle(const amessage : PChar);   
begin  
{$IFDEF LINUXAPI}     
if GetHandle <> 0         then MessageHandler(GetHandle,int64(MT_MAPWINPORT), int64(MWP_SETWINDOWTEXT),int64(amessage),0);  
{$ENDIF}   
end;

4.В функцию добавления кнопки в панель для Lazarus необходимо внести следующие изменения:

Код
function  TPanTask.InsertButton(panelId : integer ; bmpFace : int64; bmpName : Pchar; command : integer; after : integer): integer; 
var  BitmapH : HBITMAP;  
hInst   : HMODULE; 
 buttonInfo : TBUTTONINFO ;  
res : integer; 
begin{$IFDEF LINUXAPI}   
if Assigned(MessageHandler) then   begin     
buttonInfo.Command := command;     
buttonInfo.BitmapIdent := bmpface;    
 buttonInfo.Sibling := 0;     
result := MessageHandler(0,  AW_INSERTBUTTON, WPARAM(panelID), LPARAM(@buttonInfo), 0);   
end   else result := 0;
{$ENDIF}
end;

В указанном выше описании я привел основные ньюансы по созданию прикладной задачи в среде Лазарус для Linux. Исходные тексты прилагаются к данной теме. На рисунках представлен результат работы задачи в среде ГИС Оператор под Astra Linux CE.

1_1.png (190.16 КБ)
1_2.png (556.71 КБ)
Изменено: Сергей Геннадьевич - 27.03.2018 11:47:34
 
Цитата
Сергей Геннадьевич написал:
Здравствуйте!
Внесу и я свои уточнения.
1.За основу были взяты тексты именно   GIS ToolKit (Delphi - Windows)   и затем адаптированы для Lazarus.
2.Основные базовые компоненты должны работать одинаково как для Lazarus - Windows, так и для Lazarus - Linux.
3.Могут быть разночтения при использовании компонент, которые вызывают диалоги из библиотек  gis....dll
Для Linux используется библиотеки ГИС Конструктор  libqd...so , которые включают классы Qt4.
А как можно получить эти файлы ?
мне нужно подключить Панораму к Lazarus
 
Здравствуйте!

Актуальные инсталляции продуктов для Linux доступны для скачивания на нашем сайте в разделе "Скачать": https://gisinfo.ru/download/download_linux.htm
Также на сайте доступна актуальная версия средств разработки для ГИС "Оператор" SE и ГИС "Панорама": https://gisinfo.ru/download/download_linux.htm#13

Обращаем Ваше внимание, что на текущий момент поддерживается разработка прикладных задач только на языках C++/Python.
Страницы: Пред. 1 2 3 4 След.
Читают тему (гостей: 1)



© КБ Панорама, 1991-2024

Регистрируясь или авторизуясь на форуме, Вы соглашаетесь с Политикой конфиденциальности