Delphi + Digitals

Однажды возникла проблема связи своего приложения, написанного на Delphi 7, с Digitals. Решил её с использованием TCP/IP сервера. После проблема возникла снова и снова… Решил облегчить себе жизнь и немного упростить взаимодействие с сервером команд. Для этого создал набор классов, в члены которого поместил задачи связанные с формированием команд и анализом ответов… Подробнее читайте во вложении.

дорабатывайте и исправляйте…
Novator.zip (126 KB)

Отличная задумка! В каких реальных приложениях этот модуль использовался? Какие задачи с его помощью решались?

С его помощью осуществляется поиск ошибок в индексных кадастровых картах. Но идей много…

Проверила на поиске ошибок в ИКК. Очень даже удобно :slight_smile:

Уважаемые любители всякого рода автоматизации, оставляйте свои предложения и вопросы по поводу разработанного модуля здесь. Кто скачал и опробовал, пишите что доработать, исправить а лучше сделайте это сами и выложите с исправлениями.

К слову добавлена функция ObjectsNumber() классу TNLayer возвращающая уникальные идентификаторы (Number) объектов расположенных на слое.
Novator.zip (7.67 KB)

Добавлена функция Abutment() в класс TNObject, которая возвращает номера примыкающих объектов

Добавлена функция Neighbor () в класс TNObject, которая возвращает номера смежных объектов
Novator.zip (7.86 KB)

Добавлен конструктор TNObject.Create(PCon:ParamConnect; Layer:ShortString) создающий новый объект на слое Layer(намер слоя)
Novator.zip (8.9 KB)

Вот пример использования разработанных классов.

Задача:есть данные измерений тахеометром, необходимо построить продольный профиль с поперечниками.
Программа далает следующее:

  1. Выпрямляем полилинию по которой будет строится профиль;
  2. Координаты Y заменяет приращениями высоты относительно первой точки;
  3. Со всеми поперечниками делает действия аналогичные в пунктах 1 и 2

Исходные данные представлены в виде полилиний (см. пример). Правда оформление приходится делать в ручную, зато есть возможность изменять вертикальные масштабы :slight_smile:.
profil.zip (253 KB)

Супер! Автору респект и уважуха :slight_smile: Всем, кто долгое время просил реализацию продольных профилей в Digitals, срочно скачивать и разбираться.

Не мешало бы еще подробнее описать порядок действий. У меня, к примеру, profile.exe завис ничего не выполнив и не выдав сообщений об ошибке (поключение к 1024 порту). Исходники не смотрел.

Восторгаться рановато. Похоже, программа только в начале своего пути. :wink:
Но идея развития библиотеки для упрощения работы с TCP, полагаю, верная.
Работает на порту 1067.

Добавлена функция AddPoint(X,Y,Z:Double):Integer в класс TNCoords. Функция позволяет добавлять точки к созданным или сушествующим объектам.

Пример:
var Map:TNMap;
i,j:integer;
Obj:TNObject;
begin
Obj := TNObject.Create(Par,‘1’); //Создали объект
Obj.Apply;
for i := 1 to 4 do //Нарисовали змейку
for j := 1 to 4 do
Obj.Coords.AddPoint(i,j,0);
Obj.Apply;
end;
Novator.zip (9.14 KB)

При загрузке растра через Вставка → Растровое изображение возникают проблемы при считывании линейных объектов с других слоев, как можно решить эту проблему

Пример в студию!

Добавлены новые функции (ВНИМАНИЕ ТЕСТИРОВАНИЕ ФУНКЦИЙ НЕ ЗАВЕРШИНО, О НАЙДЕНЫХ ОШИБКАХ СООБЩАЙТЕ)

//Возвращает расстояние между двумя точками
//FL3D=False - расстояние на плоскости
//FL3D=True - расстояние в пространстве
function Distance(P1,P2:TNCoord; FL3D:Boolean):Double;

//Возвращает диреционный угол направления от Р1 к Р2
function Direction(P1,P2:TNCoord):double;

//Возвращает угол с вершиной в точке Р2 между направлениями Р2-Р1 и Р2-Р3
//OnLeft = TRUE - c вершины Р1 до Р2 угол с левой стороны
//OnLeft = FALSE - c вершины Р1 до Р2 угол с правой стороны
function Angle(P1,P2,P3:TNCoord; OnLeft:Boolean):double;

//Возвращает градусы из угла прерставленного в десятичном формате
function DMSD(Angle:Double):Integer;

//Возвращает минуты из угла представленного в десятичном формате
function DMSM(Angle:Double):Integer;

//Возвращает секунды из угла представленного в десятичном формате
function DMSS(Angle:Double): Integer;
Novator.zip (10.1 KB)

Добавлены два класса, позволяющие работать с подписями:
TNCaption
TNCaptions
описание классов смотрите в исходниках. Вот что то на подобии примера использования:

var TL:TNLayer;
TP:TNGParameter;
Map:TNMap;
i:integer;
Obj:TNObject;
TempParObj:TNParameter;
BEGIN
TL := TNLayer.Create(Par,1000,4,‘Точки границы’); //Создаём новый слой

Map := TNMap.Create(Par);
Map.AssignLayers;

TP := TNGParameter.Create(Par,1000,5,‘Подпись имени точки’); //Добавляем параметр
Map.Layers.Layer(1000).AddParameter(TP); //Добавляем параметр слою

for i := 0 to Meja.Coords.Count - 2 do // Meja – объект TNObject
begin
Obj := TNObject.Create(Par,‘2’);
Obj.Coords.Clear;
Obj.Coords.Add(Meja.Coords.Coord(i));
Obj.Apply;

Obj.Parameters.Parameter(1).ParamValue := IntToStr(i+1);
TempParObj := Obj.Parameters.Parameter(1);
Obj.Captions.Add(TNCaption.Create(TempParObj,0,0,0,0,CCentre));	//Добавляем подпись
Obj.Apply;
end;

END;

!!!
ВАЖНО. Созданные подписи не появляются - все вопросы к разработчикам. Нужно переоткрыть карту.
!!!

Также добавлены функции:

//Возвращает строку в формате Г М С
DMSString(Angle:double):ShortString;

//Сортируем массив точек в зависимости от расстояния их к точке EndCoord
//FlUp=True - По возрастанию
//FlUp=False - По убыванию
function ArrayCoordSort(CoordArray:TList; EndCoord:TNCoord; FlUp:Boolean):TList;

//Сортируем массив данных
//FlUp=True - По возрастанию
//FlUp=False - По убыванию
function ArraySort(DataArray: DoubleArray;FlUp:Boolean):DoubleArray;

//Проверяет пересекается ли объект с линией P1-P2
function ChInterObjectAndLine(ChObject:TNObject;P1,P2:TNCoord):boolean;
Novator.zip (13.3 KB)