Допоможіть будь-ласка організувати скрипт який працює з великою кількістю відкритих карт, тобто попорядку виконує певні операції від першої до останньої карти, а потім закриває всі карти і зберігає.
В скриптах не дуже розбираюсь, але дещо написав. Підкажіть що неправильно
$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] - не используйте квадратные скобки, они лишь указывают, что параметр функции является необязательным, то есть можно его не указывать. Правильными будут варианты:
Функція @Map.Selected.LoadParameters Реквізити. Чи можна із діалогового вікна вибрати зі списку назву Csv-шаблона призначити її якійсь перемінній наприклад $A, і тоді
написати @Map.Selected.LoadParameters $A?
Наперед дякую!
Если вам нужно выбирать из списка .csv шаблонов, тогда не нужен скрипт. Просто выбирайте нужный шаблон из выпадающего меню на закладке Инфо, кнопка […]. Если надо заполнять параметры объектов из нескольких шаблонов, для ускорения вы можете создать столько кнопок, сколько имеется шаблонов и в каждой использовать команду
КОГДА ЖЕ появится возможность ,скриптом, включать и отключать пользовательские панели инструментов или создавать выпадающие кнопки. Не ужели ни у кого нет в этом необходимости?
Є полігон - квартал, що містить внутрішні полігони та “купу” лінійних і точкових об’єктів.
Задача - при позначеному полігоні квартала вибрати тільки полігони усередині позначеного.
Вирішення:
$NumObg=@Map.SelectedObject
Вибрати | Усередині позначеного @Map.DeselectObject $NumObg
…
На місці … має бути функція @Map.SelectByLayersStyleSelected List, яка серед позначеного вибрала б об’єкти в шарі стилю тільки полігони.
Взагалі, в групі функцій Map.Select, хотілося б бачити @Map.SelectByLayersStyle List.
Меню Правка>Вибрати містить достатню кількість пунктів вибірки, але опції “серед позначених” немає. Порадьте, будь-ласка, як вирішити таку задачу
Підкажіть, будь-ласка, як можна змінити статус службового шару Адже команда @Map.Layers.SetState -3 0 не працює.
В скрипті треба дати можливість користувачу вибрати фрагмент карти для збереження/друку. Позначивши рамку карти, скрипт очікував би, поки користувач розмістить рамку карти, схопивши за центр рамки.@Map.Layers.SetState -3 0
@Map.SelectLayer -3
@Dialog.WaitBox Виберіть фрагмент обмежений рамкою карти
Чемно дякую. А можна ще питання: @IterateObjects Scriptname - Повторяет скрипт для каждого обьекта карты, передавая его номер как параметр.
Будучи викликаною зі скрипта Scriptname_1, функція виконує Scriptname_2 від початку до кінця рівно стільки раз, скільки об’єктів в карті, причому з кожним новим проходженням скрипта Scriptname_2 його параметр $Parameters матиме значення номера об’єкта карти. Після того, як скрипт Scriptname_2 пропрацює для усіх об’єктів карти, управління передається скрипту Scriptname_1 для виконання команд, що йдуть в порядку після @IterateObjects Scriptname. Скрипт Scriptname_2 може знаходитись як в теці Library, так і в панелі інструментів.
Багато “нарозмишляв”, але чи все правда Поправте, будь-ласка, якщо не так.
Чи зобов’язаний працювати скрипт-3 (який по суті є функцією) зі своїми вхідними параметрами, викликаний командою зі скрипта-2, що в свою чергу був викликаний зі скрипта-1 командою @IterateObjects Scriptname Чи не буде конфліктів між $Parameters.
Якщо треба визначити у скрипті, чи доступний параметр 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 Тоді:
$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