Отличные новости для любителей автоматизации и тулбаров!

Спасибо. Ясно.

Доброе утро.

Есть ещё один вопросик. :unamused:

Нужно определять растояние между точками - можно ли реализовать такого рода функцию?
Я написала програмулинку, которая проверяет двойные точки и вертикальные вектора - а теперь нужно отыскивать находящиеся близко точки (в т.ч. числе вертикальные вектора имеющие небольшой наклон :wink: ) - функция генерализации в данном случае не очень помогает - есть точки, которые нужны - и их генерализация удаляет, а я - маркирую точки, которые “подозреваются” в очень близком месторасположении.

И ещё…

Как можно удалять ненужные точки из объекта - можно ли реализовать функцию удаления, вставки точек / в объект.

Спасибо. :wink:

При таком сравнении выдёт следующий результат:

Что делать? :question:

Для удаления ненужных точек как нельзя лучше подходит генерализация. Насчет добавления точек, непонятно, что должна делать функция? Имеется функция для вставки точек с заданным шагом в контур объекта (Правка>Добавить точки). Есть команда вставки точек в виде отдельных объектов (закладка Правка кнопка Добавить узлы).

Сложный анализ, если требуется проверка всех объектов карты и всех точек объектов лучше не выполнять в скрипте. Во-первых, такой скрипт будет тяжело написать, во-вторых работать он будет очень медленно.

Используйте внешнее приложение, получающее данные от Digitals через набор TCP команд. И функции геометрического анализа лучше используйте свои. Подобное уже создавали наши пользователи Volod написал GedTools Delphi + Digitals - #15 від IvanShubin.

А функцию нахождения расстояния между двумя точками на Делфи я вам дам :slight_smile: Хотя идею с вертикальными векторами, честно говоря, не понял.

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

@Map.Object[$I].Point[$J].Add Point
@Map.Object[$I].Point[$J].Add Number

Есть точки - которые после работы скрипта обозначены как “лишние”. Их нужно удалить. Или наоборот - добавить - но в автоматическом режиме.

Программка уже напсиана и работает - находит двойные точки и вертикальные вектора - 2 точки, имеющие одинаковые X и Y, но имеющие разные Z идущие подряд в одном линейном / полигональном объекте.

Мне надо послать из своей програмки в Дигиталс команду нажатия/отпускания клавиши.
стандартный KEYUP/KEYDOWN не работают. Немного пошаманив получилость что в Дигиталсе какието свои обработчики клавиатурных событий.
Подскажите пожалуйста что и в каком формате послать чтоб Дигиталс отреагировал на команду из вне.

Посмотрите тут DLL / API под Диджиталс - #4 від Dmitry_Zolotar
Я думаю скоро IvanShubin выложит свой новый новатор Delphi + Digitals - который будет ловить события и мыши, и клавиатуры.

Удачи. :wink:

Похоже разобрался во всем сам :slight_smile: скоро покажу результат :wink:

Реализованы функции для добавления, вставки и удаления точек объекта:

@Map.Object[N].Delete StartPointIndex StopPointIndex
(при удалении одной точки второй индекс можно опустить)

@Map.Object[N].Add X Y Z
(если высота не указана, то она интерполируется из карты)

@Map.Object[N].Insert PointIndex X Y Z
(если высота не указана, то она интерполируется из карты)

Пример скрипта, демонстриующего манипуляции с точками:
(нужно пометить незамкнутый объект из 3-4 точек)

$S=@Map.NextSelected 0
@if $S=0 then Break Нужно пометить объект
$P1=@Map.Object[$S].Point[1]
$P2=@Map.Object[$S].Point[2]
@Map.Object[$S].Delete 1 2
@Map.Selected.Refresh
@Wait 1000
@Map.Object[$S].Insert 0 $P2
@Map.Object[$S].Insert 0 $P1
@Map.Selected.Refresh
@Wait 1000
@Map.Object[$S].Add $P1
@Map.Selected.Refresh
@Wait 1000
$C=@Map.Object[$S].Count
@Map.Object[$S].Delete $C
@Map.Selected.Refresh

Вот спасибо. :laughing: Вот порадовали. :laughing:
А как теперь вставить эту точку в новый объект, созданный командой - $O=@Map.NewObject 1

Если делать Add или Insert - делает вектор - где первая точка 0 0 0.

Или я что-то не то делаю? Может есть другая метода :question:

Дело в том, что в создаваемый функцией @Map.NewObject новый объект, автоматом добавляется одна точка с нулевыми координатами. Иначе карта не примет объект не имеющий точек.

Поэтому первую точку добавлять уже не нужно.
Просто присвойте ей новое значение вызвав @Map.Object[N].Point[1] X Y Z.
Или, как вариант, после вызова @Map.NewObject обнулите количество точек объекта вызвав @Map.Object[N].Count 0.

Спасибо. :open_mouth: Будем пробовать. :unamused:

Практически закончил. Есть какаято непонятная мне ошибка но работает как задумано.

Итак начнем :slight_smile:

  1. Запускаем Automator.exe
  2. Жмем кнопку “старт” .
    Запускается ловушка для клавиатуры.
    И программа готова к использованию.
  3. Если надо остановить то жмем “стоп” или просто закрываем программу.

Теперь что она делает. Кликая (быстро нажимая и опуская) клавишу Ctrl в дигиталсе будут автоматически менятся вкладки Сбор\Правка\Инфо. Ну или те которые отмечены галочкой в окне программы.

Теперь об ошибке: непонимаю почему - но при первом нажатии клавиши в активном Дигиталсе в программе происходит ошибка. Чтото с памятью становится. Оттрейсить в Делфе не получается - всё виснет. Но как только нажимается кнопочка ок на сообщении об ошибке всё начинает работать.
Automator.zip (314 KB)

Уважаемые разработчики и форумчане! Подскажите пожалуйста как справиться со следующей задачей:
Есть большое количество обменных файлов, в которых забито одно решение но разное (например PZ = РС,08.09.1995,30,-). Сельский совет принимает уточняющее решение и теперь во всех эти файлах нужно перебить PZ (например PZ = РС|РС,08.09.1995|17.09.2009,30|45,-|-).
Как это можно сделать средствами скрипта? Если можно написать пример.
Просто тут, как я понял, необходимо перебирать символы, находить запятую, разбивать по частям, а потом снова сшивать. А как это сделать я не представляю.
Заранее спасибо за помощь и подсказки

С данной задачей на отлично справится утилита Funduc Search’n’Replace.
Search’n’Replace находит в множестве файлов вхождение строки(допускаются выражения) и заменяет на другую строку (выражения тоже допускаются).

Dmitry_Zolotar спасибо за подсказку. Но хочется использовать для этого Digitals. А вообще есть ли в Digitals функции для работы с символами? Т.е. работа со строкой есть, а вот с символами этой строки? И еще вопрос - как можно использовать в скриптах папку по умолчанию. В эту папку я скинул текстовые файлы и хотелось бы при ссылке на них упоминать только название, а не полные пути, которые пришлось бы переделывать при перенесении папки Digitals в другое место.

Кроме скриптов было бы неплохо иметь возможность использовать alias’ы при вставке растров по ссылке.

Варианты:

  • определять папку по умолчанию по принципу переменой PATH, фактически получится несколько папок по умолчанию, “прозрачно” просматриваемых по порядку

  • определять alias’ы в константах по принципу переменных среды и использовать явно в виде %MAPS%\файл.tif

Первый путь представляется более простым.

Осмелюсь вынести на общее обсуждение вот такую кнопочку, которая закрывает все открытые окна, не закрывая Диджиталс. Возможно никому она и не нужна - но мне очень нужна была. Тут раньше просили вроде бы такую - так вот - пробуйте.

$MC=@MapCount
@if $mc=0 then @break нет открытых карт
$I=1
%Start
@ActivateMap $I
@CloseMap
$I=$I+1
@if $I<=$MC @Goto %Start

Удачи. :sunglasses:

Отличная фуцнкция :slight_smile:
Добавлю только, что в @CloseMap можно указать номер карты, так что необязательно делать ее активной:

$MC=@MapCount
@if $mc=0 then @break нет открытых карт
$I=1
%Start
@CloseMap $I
$I=$I+1
@if $I<=$MC @Goto %Start

По идее, так и работать должно быстрее, если окон много.

А еще с @CloseMap нужно быть осторожным, так как карта закрывается без запроса на сохранение даже если в ней были изменения. Если нужно закрытие с запросом, то лучше использовать @FileClose. Правда эта команда работает только с активной картой.