Функциональность ГИС-АБП может быть расширена за счёт встраиваемых команд. Для создания встраиваемой команды вам потребуется среда разработки Microsoft Visual Studio и язык программирования C#.
Создание встраиваемой команды
• Запустите Microsoft Visual Studio;
• Создайте библиотеку классов .Net Framework;
• Добавьте в библиотеку static-класс;
• Добавьте ссылки на библиотеки DeltaLogic.dll и ObjectLibrary.dll (библиотеки находятся в каталоге приложения, например, C:\Program Files (x86)\ABP\GIS-ABP или C:\inetpub\wwwroot\GISABPServer);
• Добавьте свойство static-класса:
public static DeltaLogic.UIProcessor oUIProcessor { get; set; }
• Создайте расширение для одного из классов библиотек DeltaLogic или ObjectLibrary;
• Скомпилируйте и скопируйте DLL в папку, которая указана в параметре LibFolder (если библиотека создается для клиентского приложения, то параметр находится в его настройках, если для сервера, параметр находится в конфигурационном файле Веб-службы).
Пример встраиваемой команды, включающей несколько слоев карты:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ObjectLibrary;
using DeltaLogic;
using System.ComponentModel;
namespace GISCommands
{
public static class GISCommands
{
public static DeltaLogic.UIProcessor oUIProcessor { get; set; }
[Description("RUSSIAN:Слои;ENGLISH:Layers[@Mode:Developer]")]
public static void Layers(this Machine currentMachine)
{
oUIProcessor.SwitchAllLayersOff();
oUIProcessor.FullScreenMode();
oUIProcessor.SwitchLayerOn("Реки");
oUIProcessor.SwitchLayerOn("Дороги");
oUIProcessor.SwitchLayerOn("Города");
}
}
}
Объект oUIProcessor типа DeltaLogic.UIProcessor необходим для взаимодействия с интерфейсом. Он позволяет отображать сообщения, включать-выключать слои, работать с пользовательским вводом (геометрия и атрибуты). Функциональность DeltaLogic.UIProcessor постоянно дорабатывается, и если вам не хватает какой-либо команды, свяжитесь с нами по адресу info@abpsoft.spb.ru , и мы постараемся добавить недостающую функциональность.
Каждый static-класс может содержать несколько процедур (расширений), каждая из которых становится доступной в контекстном меню приложения ГИС-АБП при нажатии правой кнопки мыши над выделенным объектом карты или дерева. Если расширение создано для класса Machine, расширение сработает при выделении корневого объекта дерева (Машина), если расширение создано для класса DataObject, расширение сработает для выделенного объекта карты или дерева.
Атрибут [Description("RUSSIAN:Слои;ENGLISH:Layers[@Mode:Developer]")] означает следующее:
В зависимости значения параметра Language, в контекстном меню появится название команды Слои или Layers. Команда сработает только для режимов приложения Developer и Administrator. В режиме работы приложения Operator данная команда будет недоступна.
При создании дополнительной функциональности используются объекты классов библиотек DeltaLogic и ObjecLibrary, сгруппированные в виде иерархического дерева. Структуру этого иерархического дерева воспроизводит дерево объектов приложения ГИС-АБП.
Каждый из классов иерархического дерева объектов ГИС-АБП реализует интерфейс IObject, основными методами которого являются Update() и Delete(). При вызове методов Update() и Delete() автоматически происходит обновление файлов данных.
В случае, если происходит загрузка большого количества объектов DataObject, можно использовать класс ObjectLibrary.TransactionManager, который позволяет работать с транзакциями – это значительно увеличивает производительность при загрузке больших объемов данных.
Пример встраиваемой команды, который позволяет изучить механизм работы с файлами данных, а также может быть использован при выполнении загрузки данных из других форматов.
[Description("RUSSIAN:Копировать объекты в другой слой;ENGLISH:Copy objects to another layer[@Mode:Developer]")]
public static void CopyObjectsToAnotherLayer(this DataFile currentDataFile)
{
TransactionManager oTransactionManager = new TransactionManager();
oTransactionManager.OpenTransaction();
Machine currentMachine = new Machine();
string currentTargetLayerName = oUIProcessor.SelectValueString(currentMachine.DataFiles.Select(A => A.ID.ToString()).ToList(), "Выберите целовой слой для копирования");
DataFile currentTargetDataFile = currentMachine.DataFiles.FirstOrDefault(A => A.ID.ToString() == currentTargetLayerName);
List<int> IDList = new List<int>();
DeltaList<DeltaLogic.Point> points = oUIProcessor.InputArea((Utils.GetSettingValue("Language").ToString().ToUpper() == "RUSSIAN")
? "Выделите область."
: "Please select area.");
CS gCS = oUIProcessor.GetWiorkspaceCoordinateSystem();
DeltaList<DeltaLogic.PointXYZ> progectionPoints = new DeltaList<PointXYZ>(points.Select(A => gCS.CSToProjection(A)));
DeltaLogic.Geometry boundingBox = (new DeltaLogic.Geometry(gCS, GeometryType.AREA, new DeltaLogic.DeltaList<Point>(points))).BoundingBox;
foreach (DataObject currentDataObject in currentDataFile
.Shapes
.Where(A => A.Boundary.RectanglesIntersect(boundingBox))
.SelectMany(A => A.DataObjects))
{
if (currentDataObject.Properties.Any(A => A.ObjectGeometry != null))
{
if (currentDataObject.Properties.FirstOrDefault(A => A.ObjectGeometry != null).ObjectGeometry.Points.Any(Q => ((PointXYZ)Q).IsInsidePolygon(progectionPoints)))
{
if (!IDList.Contains((int)currentDataObject.ID))
{
IDList.Add((int)currentDataObject.ID);
DataObject newDataObject = new DataObject(currentDataObject.Properties);
newDataObject.Parent = currentTargetDataFile;
newDataObject.Update();
}
}
}
}
oTransactionManager.CommitTransaction();
}