Документация-вспомогательные

Работа с интерфейсами

Работа с интерфейсами

Функции получения метаданных

Все метаданные хранятся в переменной app типа IMainApp.

Функции получения таблиц

Название Описание
tablesInfo getTableInfo(int idTable); Получает таблицу по ее id
tablesInfo getTableInfoOfNameMap(string nameMap); Получает таблицу по пользовательскому названию
tablesInfo getTableInfoOfNameDB(string nameDB); Получение таблицы по имени в базе
tablesInfo getTableInfoOfNameDB(string nameDb, string schema); Получение таблицы по имени в базе и имени схемы
List<tablesInfo> getTableOfType(int idType); Получение спика таблиц определенного типа
List<tablesInfo> tables_info { get; } Содержит полный список таблиц

Функции получения полей таблицы

Название Описание
List<fieldInfo> field_info { get; } Полный список колонок во всех таблицах
fieldInfo getFieldInfo(int idField); Получить колонку по id
List<fieldInfo> getFieldInfoTable(int idTable); Получить список колонок в таблице

Функции работы с файлами

Название Описание
List<photoInfo> photo_info { get; } Список таблиц с файлами
photoInfo getPhotoInfo(int idTable); Получить информацию о связанной таблицы с файлами

Функции управления правами пользователей

Название Описание
userInfo user_info { get; } Информация о текущем пользователе
user_right getTableRight(int idTable); Получение прав на таблицу
List<user_right> tables_right { get; } Список прав на таблицы
bool getReadTable(int idTable); Проверка прав на чтение таблицы
bool getWriteTable(int idTable); Проверка прав на запись в таблицу

Параметры с типами

Название Описание
List<tipTable> tip_table { get; } Список типов таблиц
List<tipGeom> tip_geom { get; } Список типов геометрии
List<tipData> tip_data { get; } Список типов колонок
tipTable getTipTable(int idTip); Получить тип таблицы
tipGeom getTipGeom(int idTip); Получить тип геометрии
tipData getTipField(int idTip); Получить тип колонок

Переменные для работы с БД и картой

Название Описание
string ipString { get; } Ip адрес сервера
string portString { get; } Порт сервера
string dbString { get; } База данных
string scheme { get; } Схема хранения метаданных
List<string> schems { get; } Список схем используемых в БД
ISQLCommand SqlWork(); Функция возвращающий коннект к базе
string srid { get; } Идентификатор проекции карты
string path_string { get; } Путь до каталога с конфигурацией
string setting_file { get; } Название файла конфигурации

Функции работы с картой

Название Описание
IRelation relation { get; } Интерфейс, хранящий список соответствия наименование слоя в системе и наименование на карте
void SetVisableLayer(int idTable, bool visble); Устанавливание свойства видимости для объекта
AxMapLIb mapLib { get; } Объект карты

 Интерфейс IWorkClass

Переменная work в основном интерфейсе содержит функции работы с визуальным интерфейсом программы с помощью нее можно добавлять, удалять, а также заменять элементы в программе.

Интерфейс IWorkClass состоит из функций:

public interface IWorkClass
    {
        IOpenForms OpenForm { get; }
        Forms.ImainFrm MainForm { get; }
        Guid AddSpoofingTableOfObjects(tablesInfo table,
              Func func);
        void RemoveSpoofingTableOfObjects(Guid guid);
        Guid AddSpoofingAttributesOfObject(tablesInfo table,
              Func func);
        void RemoveSpoofingAttributesOfObject(Guid guid);
        void AddMenuInTable(int idTable, Func menuItem);
        void RemoveMenuInTable(Func menuItem);
        void AddMenuForObject(
              int idTable, Func menuItem, bool inTable = true,
              inAttribute = true);
        void RemoveMenuForObject(Func menuItem);
        void ExportToExcel(List data, List Types);
    }

OpenForm используется для открытия форм, таких как список объектов, атрибутика объекта, история.

Подмена окна списка объектов

Для подмены формы списка объектов используются функции AddSpoofingTableOfObjects и RemoveSpoofingTableOfObjects.

AddSpoofingTableOfObjects принимает атрибуты таблицы (table) и функцию, возвращающую интерфейс (func), и возвращает Guid,  по которому можно убрать эту подмену с помощью функции RemoveSpoofingTableOfObjects.

Пример создания:

tablesInfo table = Program.App.getTableInfoOfNameDB(«table», «data»);
            Program.Work. AddSpoofingTableOfObjects(table, 
                () => new UcTableObjects(table.nameSheme, table.nameDB));

UcTableObjects содержит реализацию интерфейса UserControls.IUserControlMain

Подмена формы атрибутики объекта

Для подмены формы атрибутики объекта используются функции AddAttributeObject и RemoveAttributeObject. Подмена атрибутики объекта идентична подмене списка объекта.

Добавить меню в список объектов и атрибутику объектов

Меню добавляется командами AddMenuInTable и AddMenuForObject, а удаляется командой RemoveMenuForObject.

Пример добавления меню в таблицу с id равным 17:

 work.AddMenuInTable(17,
                () =>
                {
                    var Menu = new ToolStripMenuItem(«Меню»);
                    Menu.Tag = 17;
                    var submenu = new ToolStripMenuItem(«Подменю»);
                    submenu.Tag = Menu;
                    submenu.Click += new EventHandler(submenu_Click);
                    Menu.DropDownItems.Add(submenu);
                    return Menu;
                });

Чтобы получить текущий объект при событии клика, нужно обратится к основной форме окна.

Пример:

 void submenu_Click(object sender, EventArgs e)
        {
            var temp = ((ToolStripMenuItem)sender).Tag as ToolStripMenuItem;
            int idObj;
            if ((idObj = Convert.ToInt32(temp.Owner.Parent.Tag)) < 0)
                return;

            // Мы получили idObj в котором содержится id текущего объекта
        }

Функция ExportToExcel позволяет быстро экспортировать любые данные в окно Excel. Функция принимает тело данных (data) в которой должен находиться первой строкой заголовок, а затем все остальные строки.

Интерфейс IOpenForms

public interface IOpenForms
    {
        void OpenTableObject(Interfaces.tablesInfo table, Form owner);
        int? OpenTableObject(Interfaces.tablesInfo Table, int selected);

        void ShowAttributeObject(
              Interfaces.tablesInfo table, int idObject, bool isNew, Form owner,
              Action ActionDResult = null);

        DialogResult ShowDialogAttributeObject(
              Interfaces.tablesInfo table, int idObject, bool isNew, Form owner);

        void HistoryFrm(int idTable, int idObj, Form owner);
        void HistoryFrm(int idTable, Form owner);
        void HistoryFrm(string userName, Form owner);

        void SetFormOwner(Form frm);

        string ProcOpen(string prefix = ««);
        void ProcClose(string key);
    }

Открытия формы списка объектов

Для открытия формы нужно использовать функции OpenTableObject. Функция реализована в двух вариантах:

  1. Открывает окно списка объектов для просмотра
  2. Открывает окно списка объектов для выбора объекта

Открытия формы атрибутов объекта

Для открытия формы списка атрибутов объекта используйте функции ShowAttributeObject и ShowDialogAttributeObject в которых содержится сама таблица(table), ID объекта(idObject), признак нового объекта (isNew), функция, выполняемая при закрытии окна (ActionDResult).

Открытия формы истории

Для открытия формы истории используется функции HistoryFrm. Она может показать историю пользователя, таблицы или конкретного объекта.

Установить главное окно как родителя для формы

Для этого используйте функцию SetFormOwner.

Отобразить окно «Загрузка»

Используйте функции ProcOpen и ProcClose для отображения и скрытия окна «Загрузки». Функция ProcOpen отображает окно и при этом возвращает уникальный ключ для скрытия формы, который надо передать в функции ProcClose.

Plug_1

Рисунок 1

Описание интерфейса

Настройки файла AssemblyInfo.cs
Назначение наименования плагина:

[assembly: AssemblyTitle(«Наш новый плагин»)]

Определение плагина при загрузке:

[assembly: Guid(«2247ac22-69f8-46f4-99af-650eea2187b3»)]

Определение версии плагина:

[assembly: AssemblyVersion(«1.0.0.0»)]

Определение версии файла:

[assembly: AssemblyFileVersion(«1.0.0.0»)]

Описание методов интерфейса IMainPlugin

Интерфейс служит для начальной загрузки плагина MapEditor GS, в котором осуществляется определение имени Плагина(Name), его идентификационного ключа (GUID), запуск функции инициализации (StartPlugin) и возможной реализации интерфейса для настройки плагина (SettingsForm).

Описание интерфейса public interface IMainPlugin

    public interface IMainPlugin
    {
        /// <summary> Название плагина
        /// </summary>
        string Name { get; }
        /// <summary> Guid плагина
        /// </summary>
        string GUID { get; }
        /// <summary> Основная функция инициализации плагина
        /// </summary>
        /// Параметры в settings файле
        /// Интерфейс работы с базой
        /// Интерфейс работы с окнами
        void StartPlugin(XElement XSettings, IMainApp app, IWorkClass work);
        /// <summary> Получения окна настройки плагина
        /// </summary>
        Forms.IControlSettings SettingsForm { get; }
    }

Свойства Name и GUID

Свойства Name и GUID используются для идентификации плагина и должны всегда иметь реализацию:

string Interfaces.IMainPlugin.Name
        {
            get { return AssemblyClass.GetName(Assembly.GetExecutingAssembly()); }
        }
        string Interfaces.IMainPlugin.GUID
        {
            get { return AssemblyClass.GetGuid(Assembly.GetExecutingAssembly()); }
        }

Функция «AssemblyClass.GetName» считывает с манифеста сборки свойство «AssemblyTitle», функция «AssemblyClass.GetGuid» 
считывает с манифеста сборки свойство «Guid».

Функция «StartPlugin»
void StartPlugin(XElement XSettings, IMainApp app, IWorkClass work);

Функция выполняется сразу после подключения ее к MapEditor GS, и должна содержать функции подключения к интерфейсу.
Также этой функции передаются переменные XSettings, app и work.
Переменные в «StartPlugin»
XSettings
Пример:

<guid-B2AB5A1F-6404-4528-B32B-5E3A002B9C0C isEnable=«true»>
<Port>100/<Port>
<Speed>9600/<Speed>
<guid-B2AB5A1F-6404-4528-B32B-5E3A002B9C0C>
или 
<guid-2247ac22-69f8-46f4-99af-650eea2187b3 isEnable=«true»/>

app
Используется для работы с метаданными, содержит функции получения списка таблиц, ее полей, а также переменная.
app.mapLib
Содержит функции для редактирования визуального интерфейса программы (добавление меню, подмена формы атрибутики).
Свойство «SettingsForm» задает интерфейс окна «Настройки»:

Forms.IControlSettings SettingsForm { get; }

Создание плагинов

Создание плагинов

Для создания нового плагина первым делом необходимо создать новый проект (назовем проект«NewPlugin», тип шаблона выберем «Visual C#» -> «Библиотека классов»).

Plagin_1

Рисунок 1

Далее необходимо сделать первые настройки, чтобы при отладке запускалась программа MapEditor GS. Для этого необходимо перейти по следующим вкладкам: «Меню» -> «Проект» ->  «Свойства: NewPlugin…». Откроется окно со свойствами проекта. Переходим во вкладку «Построение», в части «Вывод»  указываем путь до папки «Plugins» в MapEditor GS для всех конфигураций.

Plugin_2

Рисунок 2

Далее переходим во вкладку «Отладка», в части «Действия при запуске»  указываем полный путь к запускаемому файлу MapEditor GS, а в части «Параметры запуска» указываем «Рабочий каталог» с MapEditor GS.

Plugin_3

Рисунок 3

После проделанных действий при выборе вкладки «Отладка» запустится программа MapEditor GS.

Краткое описание Plugins API

Плагины для СПО MapEditor GS служат для расширения функционала программы. При запуске программа ищет плагины в папке «Plugins». Рабочим каталогом будет рабочий каталог MapEditor GS (а не каталог «Plugins»).

Добавление растровых слоев

Добавление растрового слоя

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

axMapLIb1.LoadImageLayer("C:\\Rastr\\V-30-В-1.bmp"); 

Для загрузки используется метод LoadImageLayer с одним параметром, это путь к растровому изображению. Ссылку на созданный растровый слой можно получить следующим образом:

mvMapLib.mvImageLayer imLayer = axMapLIb1.getImageLayer("C:\\Image.bmp");
Добавление внешнего растрового слоя

Перед созданием внешних растровых слоев, необходимо загрузить слои подложки, находящиеся в проекции 3395:
axMapLIb1.LoadMap(Application.StartupPath + "\\map\\map_file.vmp", "id");
axMapLIb1.SRID = "3395";

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

axMapLIb1.LoadExternalImageLayer("E:\\map_wmsc_roscos.xml", true);

При этом начнется скачивание растрового изображения на локальный компьютер, и отображаться на карте. Для уменьшения трафика
эти картинки кэшируются в определенной папке, которая настраивается в подключаемом xml файле. Слой может появиться не сразу,
так как нужно время для загрузки слоя из сервера. Возможно, слой будет появляться частями, по мере того, как растровое
изображение будет загружаться.

Работа с базой данных

Для работы с базой данных необходимо обратиться к функции app.SqlWork().

Пример кода:

using (var sqlCmd = app.SqlWork())
            {
                tablesInfo tables = app.getTableOfType(1)[0];
                sqlCmd.sql = string.Format(
                    «SELECT \»{0}\» FROM {1}.{2} WHERE \»{0}\» <> :id limit 10»,
                                            tables.pkField,
                                            tables.nameSheme,
                                            tables.nameDB);
                IParams[] Params = new Params[]
                                 {
                                     new Params()
                                         {
                                             _paramName=«id», 
                                             type = DbType.Int32, 
                                             value = 1
                                         }
                                 };
                sqlCmd.Execute(false, Params);

                string result = ««;
                while (sqlCmd.CanRead())
                {
                    result += «Строка с id = « 
                        + sqlCmd.GetValue(tables.pkField)+»\n»;
                }
            }

В данном примере мы берем первую таблицу со слоем:

 tablesInfo tables = app.getTableOfType(1)[0];

Присваиваем к «sqlCmd.sql» запрос к БД:

sqlCmd.sql = string.Format(
                    «SELECT \»{0}\» FROM {1}.{2} WHERE \»{0}\» <> :id limit 10»,
                                            tables.pkField,
                                            tables.nameSheme,
                                            tables.nameDB);

Выполняем запрос в базу:

        bool Execute(bool IsNonQuery);
        bool Execute(bool IsNonQuery, IParams[] paramArrya);

Если IsNonQuery получает true, результат выполнения не выводится. Переменная paramArrya содержит массив параметров для запроса.

Выполняем проверку на получение следующей строки:

bool CanRead();

Получаем значения из ячейки:

object GetValue (int position);
object GetValue (string columnName);
T GetValue (int position);
T GetValue (string columnName);

Используя функции GetValue в параметре можно указывать простые типы, такие как int, string, Double, а также типа Nullable, а также массивы, например <int?[]>. Плагин сам их попытается преобразовать, а если произойдет ошибка преобразования, то он вернет следующее значение:

 return default(T);

mapSurfer — javascript-интерфейс — functions

Методы

Метод Описание
jsonGET(url, data, success) Функция посылает GET запрос на url, отправляя данные data. success — функция, которая будет выполнена при удачном выполнении запроса.
jsonPOST(url, data, success) Функция посылает POST запрос на url, отправляя данные data. success — функция, которая будет выполнена при удачном выполнении запроса.
jsonPUT(url, data, success) Функция посылает PUT запрос на url, отправляя данные data. success — функция, которая будет выполнена при удачном выполнении запроса.
jsonDELETE(url, data, success) Функция посылает DELETE запрос на url, отправляя данные data. success — функция, которая будет выполнена при удачном выполнении запроса.
jsonRequest(type, url, data, success) Функция посылает запрос типа «type» на url, отправляя данные data. success — функция, которая будет выполнена при удачном выполнении запроса.

Методы

Метод Описание
dustRender(template, object, callback, ctx) Функция произведет отрисовку шаблона template с параметром object. После отрисовки выполнится функция callback в контексте ctx.

Методы

Метод Описание
isInteger(val) Возвращает true, если val — целое число, иначе false
isFloat(val) Возвращает true, если val — число с плавующей точкой, иначе false

mapSurfer — javascript-интерфейс — CometSocket

Класс управления сокетом.

var socket = new GP.CometSocket(url)
//пример создания

Методы

Метод Возвращает Параметры Описание
isOpened() true или false открыт или нет
onOpen(callback, ctx) callback — функция
ctx — контекст
при открытии сокета будет выполнена функция callback в контексте ctx
send(command, data) command — string
data — object
отправить комманду по сокету
destroy() разорвать соединение

Команды для отправки по сокету

Команда Отправляемый объект Параметры Описание
GET_REPORT
sendObject = {
    reportId: ,
    fileType: ,
    params: [{
        name: 
        type: 
        value:
    }]
}

// id отчета
// тип файла отчета
// массив параметров
// название параметра
// тип параметра
// значение параметра
открыт или нет

Пример использования события

myCommet.on(
	"open",
	function(data){		
		console.log(data);
	},
	cotext
)

    // событие
    // функция, которая будет выполнена при срабатывании события
	// пример использования параметров
    // контекст выполнения фнкции

События

Событие Описание
«open» открыто соединение
название отправленной комманды При отправке команды происходит событие с этой коммандой.

Примеры использования библиотеки WfsLib

Примеры использования библиотеки WfsLib

Примером использования библиотеки WfsLib является проект WFSRESTExampleProject. Также для отображения и работы с картой используется mvActiveX. Для его работы необходимо запустить установщик MVActiveX_setup.exe.
После установки mvActiveX необходимо обратить внимание на две библиотеки, на которые ссылается сам проект, — AxmvMapLib, mvMapLib (рисунок 1).

wfs_1

Рисунок 1

Указанные библиотеки автоматически создаются при подключении ActiveX к проекту. Подключить его можно, предварительно добавив новый элемент управления (рисунки 2-3).

wfs_2

Рисунок 2

wfs_3

Рисунок 3

Проект состоит из пяти форм: FormAuth, FormLog, FormShowObject, FormShowObjects и WfsRESTExample и класса MapClass, в котором собраны методы для работы с mvActiveX).

Форма  WFSRESTExample

Эта форма является основной при работе с проектом из данного примера.

Для работы проекта примера необходима карта, статично определенная в методе MapFilePath.

/// <summary>
/// путь к файлу карты
/// </summary>
private string MapFilePath { get { return "vmp/map_file.vmp"; } }

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

wfs_4

Рисунок 4

Откроется окно FormAuth. В соответствующих полях необходимо ввести адрес сервера в виде http://some.site.net/, имя пользователя и пароль (рисунок 5).

wfs_5

Рисунок 5

После успешной авторизации на сервере адрес сервера с экземпляром класса WfsLib.Model.REST.User в TreeNode.Tag добавится в TreeView.Nodes (рисунок 6).

wfs_6

Рисунок 6

Затем при двойном клике по имени сервера (по верхнему уровню TreeView) подгрузятся доступные слои, распределенные по группам (рисунок 7).

wfs_7

Рисунок 7


        /// <summary>
        /// Двойной клик по серверу
        /// </summary>
        /// <param name="e"></param>
        private void DoubleClickToConnect(TreeNodeMouseClickEventArgs e)
        {
            //подгрузить данные, если еще не подгружены
            if (e.Node.Nodes.Count == 0)
            {
                var client = e.Node.Tag as Layers;
                if (client == null)
                    throw new Exception("Настройки сервера не определены, обратитесь к разработчику");
                //получение слоев
                var leyars = client.GetLayers();
                var groups =
                    leyars
                    //.Where(o1=> o1.Service == "WFS")
                    .Select(o1 => o1.Group_name).Distinct();
                //добавление групп, распределение слоев по группам
                foreach (var group in groups)
                {
                    var grNode = e.Node.Nodes.Add(group);
                    var ls = leyars.Where(o1 => o1.Group_name == group).ToArray();
                    foreach (var item in ls)
                    {
                        grNode.Nodes.Add(item.Name).Tag = item;
                    }
                }
            }
        }

Если выбрать в списке один из слоев, отметив его галочкой, объекты слоя будут получены с сервера и отображены на карте (Рисунок 8).

wfs_8

Рисунок 8

При двойном клике по имени слоя будет вызван метод DoubleClickToLayer, и отобразится форма со списком объектов FormShowObjects (рисунок 9).

wfs_9

Рисунок 9

private void DoubleClickToLayer(TreeNodeMouseClickEventArgs e)
        {
            //определяю выбранный слой
            var layer =
                e.Node.Tag as Layer;
     if (layer == null) throw new Exception("Тег не является слоем, обратитесь к разработчику");
            //ищу родителя, у которого есть данные о соединении
            var client = GetClient(e.Node);
            //передаю данные о соединении родителя
            try
            {
                var features = client.GetFeature(layer);
                var attributes = layer.Attributes;
                FormShowObjects objs = new FormShowObjects(features, attributes, layer);
                objs.Show();
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

Форма  FormShowObjects

Эта форма отображает список полученных объектов через WFS. При двойном клике по имени объекта откроется форма FormShowObject (рисунок 10), в которой можно будет отредактировать данные. Поле геометрии не должно быть пустым.

wfs_10

Рисунок 10

Удаление объекта из списка:


        /// <summary>
        /// Удаление выделенного в списке объекта слоя
        /// </summary>
        private void DeleteObject()
        {
            try
            {
                if (dataGridView_objects.CurrentRow == null) return;
                //получение экземпляра WfsClient через слой
                Layers client = Layer.GetRestClientLayers();
                //получение выделенного объекта слоя
                var cur = GetCurrentFeature();
                //удаление
                client.DeleteObject(cur);
                //убираю из списка отображения
                this.Features.Remove(cur);
                //отображение отредактированного списка
                dataGridView_objects.DataSource = GetTable(this.Features);

                MessageBox.Show("Объект удален "+cur.Id);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

Форма FormShowObject

Эта форма редактирует объекты, полученные через Wfs, и позволяет сохранять изменения через интерфейс геосервера.

При нажатии кнопки «Сохранить» вызывается функция button_save_Click.

 private void button_save_Click(object sender, EventArgs e)
        {
            try
            {
                this.DialogResult = System.Windows.Forms.DialogResult.OK;
                Layers client = Layer.GetRestClientLayers();

                if (this.IsNewObject)
                {
                    CreateFeature();
                    client.InsertObject(this.Feature);
                    MessageBox.Show("Объект добавлен");
                }
                else
                {
                    SaveFeature();
                    client.UpdateObject(this.Feature);
                    MessageBox.Show("Объект изменен");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            
        }
Сохранение данных с интерфейса пользователя в объекте Feature:
   private void SaveFeature()
        {
            foreach (DataRow item in this.ViewTable.Rows)
            {
                if (this.Layer.GetGeomName() == item[0].ToString()) continue;
                this.Feature.Properties[item[0].ToString()] = item[1]; 
            }
            this.Feature.Geometry.WellKnownText = textBox1.Text;
        }

Создание нового объекта Feature:

private void CreateFeature()
        {
            this.Feature = new WfsLib.Model.Feature() { Geometry = null, Layer = Layer };
            Feature.Properties = new Dictionary();
            foreach (DataRow item in ViewTable.Rows)
            {
                Feature.Properties.Add(item[0].ToString(), item[1]);
            }
            Feature.Geometry = new WfsLib.Model.Geometry(textBox1.Text,this.Layer.GetGeomName());

Фильтры

Фильтры OGC реализованы в классе Filter, участвуют в таких операциях, как Update (обновление объектов слоя).
Пример использования фильтров OGC:

 Filter f = new Filter(Logic.And);
 f.Functions.Add(new FunctionBetween("Номер",new FunctionExpression(Function.Literal,"10"),
new FunctionExpression(Function.Literal,"40"));
 f.Functions.Add(
 new FunctionLogic(
 Logic.PropertyIsLike,
 new FunctionExpression(Function.PropertyName,"Название улицы"),
 new FunctionExpression(Function.Literal,"новая")
 )
 );