Поставити питання
digitals sales • Замовлення і доставка
digitals.help • Техпідтримка
help@vingeo.com
Aнонси
02.01.2024
Відновлено роботу команди Реєстри|Земельна ділянка
03.05.2023
Набір скриптів Easywork для формування землевпорядної документації
01.08.2020
Витяг НГО земельної ділянки в межах населеного пункту
10.10.2018
Адресний реєстр назв населених пунктів і вулиць
06.12.2017
Автоматичне завантаження SRTM
24.01.2017
Автоматичний перерахунок між СК63 та УСК2000/МСК-ХХ (Реєстри|Перерахувати...)
12.03.2016
Шаблон для містобудування (ДСТУ Б Б.1.1-17:2013)
Повний перелік змін...
Работа со скриптами в 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-2023 ТОВ «Аналітика»