Задайте вопрос
450135575 • Техподдержка
337652493 • Консультации
digitals sales • Заказ и доставка
digitals.help • Техподдержка
Aнонсы
01.12.2016
Работа с открытыми реестрами и поиск земельных участков по кадастровому номеру
12.03.2016
Шаблон для містобудування (ДСТУ Б Б.1.1-17:2013)
30.07.2015
Учебник по Digitals
09.07.2014
Модуль проверки кадастровых обменных XML файлов
24.01.2013
Просмотр публичной кадастровой карты Украины
Полный список изменений...
Мнения пользователей
Digitals очень сильная программа для оцифровки растров, распаевки, триангуляции, создания ортофотопланов, обработки снимков под стерео. Программа отлично поддерживается разработчиками, обновления выходят регулярно. Digital используют на Украине крупнейшие картографические и геодезические предприятия.
Laci, разработчик эмулятора для взлома Digitals
Работа со скриптами в Digitals
Стас Полищук, stas_polishuk@mail.ru 
Статья рассказывает о применении скриптов в Digitals на примере практической задачи. Также описаны некоторые приемы работы с программой. Будет полезна начинающим пользователям и пользователям, начинающим программировать в Digitals.
Дело было так…

Возникла как-то необходимость упорядочения топосъемки которая лежала на разных компьютерах и накапливалась в течение нескольких лет. Основное неудобство заключалось в том, что для того чтобы найти необходимый фрагмент, нужно было провести целое дознание с пристрастием, найти всех участников процесса, сделать им очную ставку, выяснить, кто рисовал, и только так отыскивались нужные фрагменты. Надоело.

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

После долгих размышлений (не буду перечислять все за и против) я пришел к выводу, что лучше всего это сделать, разбив всю съемку на файлы, ограниченные рамкой планшетов масштаба 1:500. Но вот беда - мой город покрывает 7808 планшетов. Создавать их всех вручную? Нет уж, извольте.

Решил, что лучшим выходом из ситуации будет создание скрипта в Digitals. Скрипт поможет автоматизировать процесс. Определенной ручной работы конечно не избежать. Для того чтобы скрипт начал работать, нужно было создать карту, в которой находятся полигоны рамок планшетов. Каждый планшет должен иметь номенклатуру, записанную в соответствующий параметр. Номенклатура позволит идентифицировать планшеты.

Разбивка карты на планшеты была выполнена за полдня. Номенклатура листа масштаба 1:500 для моего города выглядит следующим образом 80^59^14, где 80 - координата Х левого нижнего угла рамки масштаба 1:2000 в километрах, 59 – координата У этого же угла. Делим планшет масштаба 1:2000 на 16 планшетов масштаба 1:500. Нумеруем, полученные планшеты, слева направо, сверху вниз. В указанной выше номенклатуре 14 - это номер планшета масштаба 1:500.

Итак, что нам нужно.

1. Контур границы города (имеется в наличии).

2. Контуры планшетов масштаба 1:2000 (получаем, выделив границу города и выполнив команду Вставка > Разбивка на листы).

Дальше надо было заполнить значение номенклатуры для каждого планшета. Для этого я создал 3 дополнительных параметра:

Параметр #1 =P[-4]/1000-0.5 Левый нижний угол Х
Параметр #2 =P[-3]/1000-0.5 Левый нижний угол Y
Параметр #3 Номера планшетов

Теперь в свойствах карты меняем масштаб с 2000 на 500 и разбиваем любой планшет 2000-го масштаба на планшеты 500-ки и перекидываем их в слой, припасенный для 500-х планшетов. Заполняем Параметр #3 Номера планшетов для каждого из них. Для заполнения удобно использовать кнопку Калькулятор > Автонумерация(вправо-вниз) на закладке Инфо.

Теперь нам нужно размножить 500-е планшеты внутри каждого 2000-го. Как я это сделал? Можно было написать скрипт, но я поступил проще. Пометил первые 16 планшетов масштаба 1:500, скопировал их в буфер. Затем переключился на закладку Сбор, включил Режим конструирования > Перемещение. В этом режиме можно перемещать помеченные объекты, задавая начальные и конечные точки. Что я и сделал. Собрал линию от левого верхнего угла левого верхнего 500-го планшета до левого верхнего угла соседнего 2000-го планшета. По завершению объекта 16 помеченных 500-х планшетов переместились в соседний 2000-й планшет. Затем вставил из буфера сохраненные планшеты и повторил операцию уже с 32 500-ми планшетами, затем с 64 и так далее, пока не заполнил все 2000-е планшеты 500-ками.

Затем добавил следующий параметр:

Параметр #3 =P[1]^P[2]^P[3] Номенклатура

И получил готовую номенклатуру для планшетов 500-го масштаба. Вот видео моих действий.

CreatingContours1.zip
CreatingContours2.zip

Теперь осталось удалить лишние объекты. Это планшеты 2000-го масштаба и граница города. Чтобы избавится от вычисляемого параметра, я создал временный строковый параметр, пометил все 500-е планшеты и на закладке Инфо перетащил мышкой значения из параметра Параметр #3 Номенклатура во временный параметр. В открывшемся меню выбрал Скопировать значения параметра. Хватать мышкой надо именно за название параметра, не за его значение. После этого все параметры с формулами можно удалить, они нам больше не нужны. Временный параметр переименовываем в Номенклатура. Карта с планшетами масштаба 1:500, с заполненным параметром Номенклатура готова.

Далее скрипт. Тут огромное спасибо разработчикам, помогли (а вернее сказать написали за меня).

Текст скрипта надо поместить в Окно>Создать панель инструментов, правый клик по пустой панели и пункт Добавить кнопку.

Скрипт создает для каждого 500-го планшета DMF файл. Имя файла получаем из параметра Номенклатура. Перед запуском скрипта должна быть открыта одна карте, та которую мы получили после вышеописанных действий.

Скрипт 1

;нет открытых карт
$N=@MapCount
@If $N<1 @Break
;карта пустая
$N=@Map.Count
@If $N<1 @Break
$I=$N
%Start
;помечаем объект карты с номером $I
@Map.DeselectAll
@Map.SelectObject $I
$L=@Map.Object[$I].LayerID
;помечена не рамка500 - пропускаем
@if $L<>100000000 @Goto %Skip
;запоминаем имя файла из параметра
$F=@Map.Object[$I].Parameter[ID212]
;создаем чистую карту и вставляем в нее помеченные объекты
Правка | Копировать
Файл | Создать
Правка | Вставить
;сохраняем файл
@Map.SaveToFile $F.DMF
;закрываем файл
@FileClose
%Skip
$I=$I-1
;переход к следующему объекту
@if $I>1 @Goto %Start

Что тут куда - интуитивно понятно, объяснять не буду (вряд ли словами получится), единственное, на что прошу обратить внимание - в строке $F=@Map.Object[$I].Parameter[ID212] значение ID212 - это ID параметра с Номенклатурой

В строке @if $L<>100000000 @Goto %Skip значение 100000000 - это ID слоя планшетов.

Видео Script1.zip

Файлы созданы, но теперь их надо заполнять съемкой. Для облегчения этой задачи разработчиками был выпущен еще один скрипт.

Скрипт 2
Правка | Копировать
@FileOpen T:\геодезия\500_с границами планшетов.dmf
Правка | Вставить
;затем помечаем планшеты, которые границы пересекают
Пометить | Пересекающие
;если нет помеченных планшетов, значит граница съемки не пересекает планшеты
$N=@Map.SelCount
@If $N>1 @Goto %SelSuccs
;добавленный объект имеет номер последнего объекта карты
$N=@Map.Count
;ищем родительский объект для границы съемки
$I=@Map.ParentObject $N
@Map.SelectObject $I
%SelSuccs
;карта пустая
$N=@Map.Count
@If $N<1 @Break
$I=$N
%Start
;помечаем объект карты с номером $I
$L=@Map.Object[$I].LayerID
$S=@Map.Object[$I].Selected
;помечена не планшет - пропускаем
@if $L<>100000000 @Goto %Skip
;планшет должен быть помечен, остальные пропускаем
@if $S<>1 @Goto %Skip
;имя файла из параметра
$F=@Map.Object[$I].Parameter[ID212]
;открываем файл планшета
@FileOpen X:\BACKUP\архитектура\500\$F.dmf
;возвращаемся к исходной карте
@ActivateMap 2
%Skip
$I=$I-1
;переход к следующему объекту
@if $I>0 @Goto %Start
Файл | Закрыть
@ActivateMap 1

Перед запуском скрипта надо открыть(создать) карту, в которой находится съемка, обводим съемку по внешнему контуру полигоном из слоя Формуляр планшета (можете назвать, как вам больше нравится), выделяем собранный контур, и запускаем скрипт.

@FileOpen T:\геодезия\500_с границами планшетов.dmf - тут указан путь к карте с планшетами 500-ками.

@FileOpen X:\BACKUP\архитектура\500\$F.dmf - а отсюда вытягиваются на свет Божий файлы планшетов, на которые попадают границы съемки.

После выполнения скрипта остаются открытыми файлы планшетов, на которые попала наша съемка и файл со съемкой.

Вот видео, так наглядней.

Видео Script2.zip

Следующий этап - вставка объектов съемки в открытые файлы с планшетами с обрезкой по рамке планшета. Данную задачу выполняет последний скрипт.

Скрипт 3
;карта пустая
$N=@Map.Count
@If $N<1 @Break
Пометить | Все
Правка | Копировать
$I=@MapCount
%Start
;переключамеся в карту $I
@ActivateMap $I
;вставляем объекты из буфера
Правка | Вставить
;снимаем выделение
@Map.DeselectAll
;помечаем планшет
@Map.SelectLayerByName Рамка
;обрезаем объекты по полигону планшета
Сервис | Обрезать по полигону/рамке
Файл | Закрыть
$I=$I-1
;переход к следующей карте
@if $I>1 @Goto %Start

Вот так он работает

Видео Script3.zip

В общем, методика такая. Открывается старая карта, простым полигоном с минимумом точек обводится съемка, полученный контур выделяется. Далее надо нажать на кнопку, исполняющую Скрипт2 и затем сразу на кнопку Скрипт3.

Примеры DMF файлов Examples.zip

Может есть более простые способы, чем те что я вам продемонстрировал, пишите, будем обсуждать.

Обсудить статью.

© 2008-2017 OOO «Аналитика»