Все про скрипти

Ще раз Дякую Микола!) З Вашою допомогою взагалі скоро забуду як скрипти складати))

Шановні! Підкажіть, будь ласка. Як можна досягнути оновлення інформації у списку шарів :question:[attachment=0]Qestion.JPG[/attachment]Наприклад: коли скриптом створюється шар в карті, не хочеться визначати перший доступний його ID, тому створюється шар з ID=0 а Digitals сам присвоює ID доданому шару. От тільки значення присвоєного ID шару стає відомим тільки після запуску менеджера шарів.

Як би так обійтися без @ExecuteMenu MapLayers з функцією оновлення списку шарів :question:

Визначити новий доступний ID

$Lay=@Map.Layers.List @Text.Text=$Lay $Count=@Text.Count $Max=@Text.Line[1] $Max=@StringPart 1 $Max %Cycle $Val=@Text.Line[$Count] $Val=@StringPart 1 $Val @If "$Val">"$Max" Then $Max=$Val $Count=$Count-1 @If $Count>0 Then @Goto %Cycle @Dialog.Message Max=$Max

Дякую за код.
Воно то так можна, однак далі з доданим шаром працювати у скрипті - ще цікавіше :open_mouth: :

  • позначені об’єкти карти переводяться у доданий шар функцією @Map.Selected.ChangeLayer
  • функція @Map.Layers.ObjectCount, застосована до вказаного шару повертає 0 :exclamation:

Блін! Після @Map.Layers.ObjectCount запускаю вікно статус шарів - у шарі є об’єкти, а @Map.Layers.ObjectCount повертає НУЛЬ.
Тільки після вікна “статус шарів” @Map.Layers.ObjectCount поверне вам кількість об’єктів у шарі, а без нього - НУЛЬ.

Знаєте що мусив додати в скрипт, щоб був порядок?

;Вікно | Статус шарів @ExecuteMenu WindowLayerStatus ;Вікно | Статус шарів @ExecuteMenu WindowLayerStatusІ сміх, і гріх. Порядком надоїло “надягати майку через ноги”.
Я не бачу інших варіантів, як тільки аби розробники таки додали функцію оновлення списку шарів.

Коротенький скрипт, який демонструє проблему;Створити нову карту на Normal @FileNew Нова карта /Template=Normal.dmf ;Визначити новий доступний ID $Lay=@Map.Layers.List @Text.Text=$Lay $Count=@Text.Count $Max=@Text.Line[1] $Max=@StringPart 1 $Max %Cycle $Val=@Text.Line[$Count] $Val=@StringPart 1 $Val @If "$Val">"$Max" Then $Max=$Val $Count=$Count-1 @If $Count>0 Then @Goto %Cycle $Max=$Max+1 ;Додати новий шар стилю Полігон/Полілінія $NumLay=@Map.Layers.Add $Max 1 Доданий шар ;Зібрати кілька лінійних об'єктів у шарі на замовчування @Map.SetCollectionLayer ID0 @CollectionTemplate 5 @SelectTab 1 @Dialog.WaitBox Зберіть об'єкти в шарі "DefaultLayer" і тисніть "Прордовжити" @Map.SelectAll ;Змінити шар зібраних об'єктів на "Доданий шар" @Map.Selected.ChangeLayer ID$Max ;УСІ МОЖЛИВІ ОНОВЛЕННЯ ЕКРАНУ ТА ПЕРЕРАХУНОК РОЗМАХУ КАРТИ @Window.Refresh @Map.CalculateRange ;Визначення кількості об'єктів у доданому шарі $CountObj=@Map.Layers.ObjectCount $NumLay @Dialog.Message Кількість об'єктів, повернута функцією Map.Layers.ObjectCount, якогось дідька рівна $CountObj ;ВИКЛИК ВІКНА "СТАТУС ШАРІВ" @ExecuteMenu WindowLayerStatus ;ВИЗНАЧЕННЯ КІЛЬКОСТІ ОБ'ЄКТІВ У ДОДАНОМУ ШАРІ $CountObj=@Map.Layers.ObjectCount $NumLay @Dialog.Message Кількість об'єктів, повернута функцією Map.Layers.ObjectCount після відображення вікна "Статус шарів" - "$CountObj" ;ЗАКРИВАННЯ ВІКНА "СТАТУС ШАРІВ" @ExecuteMenu WindowLayerStatusзапустіть, будь-ласка, за виключеного вікна “статус шарів”.

… а так вродi все ок (з командою @Map.RedefineLayers -7). Щось розробники не доробили, може з часом… :wink:

$Lay=@Map.Layers.List @Text.Text=$Lay $Count=@Text.Count $Max=@Text.Line[1] $Max=@StringPart 1 $Max %Cycle $Val=@Text.Line[$Count] $Val=@StringPart 1 $Val @If "$Val">"$Max" Then $Max=$Val $Count=$Count-1 @If $Count>0 Then @Goto %Cycle $Max=$Max+1 @Dialog.Message $Max ; $NewLayer=@Map.Layers.Add $Max 1 TestLayer $Cnt=@Map.Layers.ObjectCount $NewLayer @Dialog.WaitBox Виберiть елементи|К-сть на шарi [$NewLayer]: $Cnt @Map.Selected.ChangeLayer $Max ; @Map.RedefineLayers -7 ; $Cnt=@Map.Layers.ObjectCount $NewLayer @Dialog.Message Нова к-сть на шарi [$NewLayer]: $Cnt
А для пошуку максимального i мiнiмального значення мали б вiдповiдати ф-цiї @Map.MaxParameterValue -7 та @Map.MinParameterValue -7, якi чомусь працюють некоректно.

Щодо Вашого коду, то в мене все працює без WindowLayerStatus, правда, коли забрати @Map.CalculateRange, повертається нульове значення параметра.

На диво, коли я в приведений мною код вставив @Map.RedefineLayers -7, і в мене @Map.Layers.ObjectCount стала повертати кількість об’єктів.
Навіть якщо знову видалити @Map.RedefineLayers -7 з наведеного коду і перезапустити Digitals - працює все ОК.

Не годиться лише @Map.RedefineLayers -7 в “справжньому” скрипті на “справжній” карті, оскільки После переопределения слоев по значению какого-либо параметра, те объекты, значения данного параметра у которых одинаковы, будут сгруппированы в один слой. Имя слоя берется из значения параметра. Як далі давати раду з усіма об’єктами у перепризначених, створених командою @Map.RedefineLayers і доданих в шаблон карти, шарах?

Не знаю як у стандартному Normal-і, але в лісових картах службовий параметр -7 має тип “текстовий рядок”. Ймовірно через це min/max не можна застосовувати до P[-7].

P.S. Ну все! Вилікував скрипт. Принаймні у себе на компі:

  • додав @Map.RedefineLayers -7;
  • прогнав скрипт один раз;
  • закоментував @Map.RedefineLayers -7.
    Чемно дякую Руслану Пархуцю!

Добрый день. Как можно реализовать возможность добавления в шаблон кадастровый план каталога координат с двумя системами одновременно (СК63 и УСК2000).

Спробуйте в оновленій версії.

Доброго дня! Підкажіть будь-ласка, як зі скрипту запустити Reports.exe певний шаблон. В мене чомусь так не працює, пише що буде завантажений тестовий режим.

@Run $PrPath\Reports.exe -t$PrPath\Templates\TehDoc_Khodienkov.fr3
P.S. Само собою змінна $PrPath в коді визначена як системна папка

Можливо буфер обміну пустий? Попередньо потрібно в буфер копіювати дані.
Додайте в початок скрипту строку
@OpenLog
в кінець скрипту строки
@CloseLog x:\log.txt
@Run x:\log.txt

можливо лог виконання скрипту надасть відповідь

Дякую, дійсно буфер пустий.
А можливо ще хтось підкаже, як через скрипт завантажити карти з інтернету (Кадастрова карта, Снимки и карты, В рамку карты, увеличение 17, ск63(3))

Доброго вечора. Скажіть будь-ласка чи існує скрипт, який помічає всі об’єкти шару за його порядковим номером?

Використовуйте функцію @Map.SelectLayer Numbers, де Numbers-відповідно номер шару, але я Вам раджу замість порядкового номеру забивати ID шару, так надійніше.

Дякую. Все працює добре. Ще раз дякую:)

Можливо хтось підкаже, як через скрипт завантажити карти з інтернету (Кадастрова карта, Снимки и карты, В рамку карты, увеличение 17, ск63(3))

Додайте у скрипт перед завантаженням дiалог WaitBox
; @ExecuteMenu LoadFromInet //це за бажанням, я не ставлю в кодi
@Dialog.WaitBox Завантажте необхiдний растр i натиснiть “Продовжити”

Доброго вечора. Є потреба після умовного оператора If виконати послідовність дій. Як правильно зробити - писати все в одному рядку після умови, чи можна якось виділити then/else. Debaginng-у немає, не можу зрозуміти як правильно.

@if обернена_умова then @Goto %Continue

послідовність дій

%Continue

Дякую. Ідею зрозумів, але зробив трохи інакше поставив дві мітки на then i else.