Запрос на функцию

Допоможіть будь-ласка організувати скрипт який працює з великою кількістю відкритих карт, тобто попорядку виконує певні операції від першої до останньої карти, а потім закриває всі карти і зберігає.

В скриптах не дуже розбираюсь, але дещо написав. Підкажіть що неправильно
$N=@MapCount
@If $N=0 @Break нет открытых карт
;вибираємо карту з номeром 1
$I=1
%Start

САМ СКРИПТ

@Map.DeselectAll
@Map.SaveToFile
@CloseMap[$I]
%Skip
$I=$I+1
;переход к следующей карте
@if $I<=$N @Goto %Start

[code]$N=@MapCount
@If $N=0 @Break нет открытых карт
;вибираємо карту з номeром 1
$I=$N
%Start

; обработка здесь, пока просто показываем значение счетчика
@Dialog.Message $I

@Map.DeselectAll
@Map.SaveToFile
@CloseMap $I
%Skip
$I=$I-1
;переход к следующей карте
@if $I>0 @Goto %Start[/code]

Вы закрываете карты по одной, поэтому @MapCount с каждым закрытием уменьшается на 1. В итоге, если было открыто больше одной карты, на $N/2 + 1 итерации возникнет ошибка. В случаях когда число обрабатываемых элементов изменяется используйте цикл с уменьшением счетчика от $N до 1.

@CloseMap [$I] - не используйте квадратные скобки, они лишь указывают, что параметр функции является необязательным, то есть можно его не указывать. Правильными будут варианты:

@CloseMap $I
@CloseMap 4
@CloseMap

Дякую все працює!!!
Ще одне питання

Функція @Map.Selected.LoadParameters Реквізити. Чи можна із діалогового вікна вибрати зі списку назву Csv-шаблона призначити її якійсь перемінній наприклад $A, і тоді
написати @Map.Selected.LoadParameters $A?
Наперед дякую!

Если вам нужно выбирать из списка .csv шаблонов, тогда не нужен скрипт. Просто выбирайте нужный шаблон из выпадающего меню на закладке Инфо, кнопка […]. Если надо заполнять параметры объектов из нескольких шаблонов, для ускорения вы можете создать столько кнопок, сколько имеется шаблонов и в каждой использовать команду

@Map.Selected.LoadParameters Шаблон_Заполнения.csv

Потому какая тишина в эфире, я понял, что добавить на кнопку выбор нужного блока невозможно!

КОГДА ЖЕ появится возможность ,скриптом, включать и отключать пользовательские панели инструментов или создавать выпадающие кнопки. Не ужели ни у кого нет в этом необходимости?

+1

поддерживаю +1

и когда появится извлечь в XML?

Добавлена функция @LoadCollectionBlock FileName, где FileName - имя DMF файла, содержащего блок. Использовать в режиме сбора.

Огромное Вам человеческое СПАСИБО! От скольких лишних телодвижений теперь избавился!

Запитаня про функцію @Map.Layers.SetState Number State(0/1/2/3). Не можу зрозуміти як написати так, щоб змінити статус шару ID0 з видимий на правка.

@Map.Layers.SetState ID0 2

Є полігон - квартал, що містить внутрішні полігони та “купу” лінійних і точкових об’єктів.
Задача - при позначеному полігоні квартала вибрати тільки полігони усередині позначеного.
Вирішення:
$NumObg=@Map.SelectedObject
Вибрати | Усередині позначеного
@Map.DeselectObject $NumObg

На місці … має бути функція @Map.SelectByLayersStyleSelected List, яка серед позначеного вибрала б об’єкти в шарі стилю тільки полігони.
Взагалі, в групі функцій Map.Select, хотілося б бачити @Map.SelectByLayersStyle List.
Меню Правка>Вибрати містить достатню кількість пунктів вибірки, але опції “серед позначених” немає. Порадьте, будь-ласка, як вирішити таку задачу :question:

Підкажіть, будь-ласка, як можна змінити статус службового шару :question: Адже команда @Map.Layers.SetState -3 0 не працює.
В скрипті треба дати можливість користувачу вибрати фрагмент карти для збереження/друку. Позначивши рамку карти, скрипт очікував би, поки користувач розмістить рамку карти, схопивши за центр рамки.@Map.Layers.SetState -3 0 @Map.SelectLayer -3 @Dialog.WaitBox Виберіть фрагмент обмежений рамкою карти

В оновленій версії ged.exe команди @Map.Layers.SetState та @Map.SelectLayer працюють і для рамки карти.

$NumObg=@Map.SelectedObject Вибрати | Усередині позначеного @Map.DeselectObject $NumObg $SO=0 %Loop $SO=@Map.NextSelected $SO @if $SO=0 then @Goto %Continue $Closed=@Map.Object[$SO].Closed @if $Closed=0 then @Map.DeselectObject $SO @Goto %Loop %Continue

Чемно дякую. А можна ще питання:
@IterateObjects Scriptname - Повторяет скрипт для каждого обьекта карты, передавая его номер как параметр.
Будучи викликаною зі скрипта Scriptname_1, функція виконує Scriptname_2 від початку до кінця рівно стільки раз, скільки об’єктів в карті, причому з кожним новим проходженням скрипта Scriptname_2 його параметр $Parameters матиме значення номера об’єкта карти. Після того, як скрипт Scriptname_2 пропрацює для усіх об’єктів карти, управління передається скрипту Scriptname_1 для виконання команд, що йдуть в порядку після @IterateObjects Scriptname. Скрипт Scriptname_2 може знаходитись як в теці Library, так і в панелі інструментів.
Багато “нарозмишляв”, але чи все правда :question: Поправте, будь-ласка, якщо не так.

  1. Чи зобов’язаний працювати скрипт-3 (який по суті є функцією) зі своїми вхідними параметрами, викликаний командою зі скрипта-2, що в свою чергу був викликаний зі скрипта-1 командою @IterateObjects Scriptname :question: Чи не буде конфліктів між $Parameters.

  2. Якщо треба визначити у скрипті, чи доступний параметр 21 шару 21, використовуємо @Map.Layers.GetValidParameters
    Тут невеличкі фрагменти логу в різних варіантах:
    $LayValParam=MAP.LAYERS.GETVALIDPARAMETERS 99
    99 2 4 5 6 7 8
    $InLayValParam21=CALC pos(“21”,“99 2 4 5 6 7 8”)
    0
    Де гарантія що скрипт, перебираючи шари, не наткнеться на шар, з порядковим номером 21 :question: Тоді:
    $InLayValParam21=CALC pos(“21”,“21 2 4 5 6 7 8”) - неправильний результат, оскільки насправді параметр 21 шару 21 недоступний;
    якщо скрипту трапиться CALC pos(" 21 ",“34 2 4 5 6 7 8 21”) - неправильний результат, оскільки насправді параметр 21 шару 34 доступний.
    Голову ламаю, і думаю: шкода, що немає функції перевірки, чи доступний параметр для шару,чи ні

Скрипт є функцією яка повертає 1, якщо заданий параметр доступний шару, інакше повертає 0. Аргументами функціє є номер(або ID) шару та номер(не ID) параметра.
Приклад:

$S=%Library.CheckParamValidity 1 25 @if $S=1 then @Dialog.Message Параметр 25 доступен слою 1 @if $S=0 then @Dialog.Message Параметр 25 не доступен слою 1