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

Міцного здоров’я всім!

Можливо,поважні колеги, дехто із вас вже мав справу із таким завданням. Прошу, підкажіть вирішення.
Є параметр, для прикладу нехай AD, що має певні теги. Маю бажання реалізувати наступний процес:
зміна маски вводу параметра із значення “=-,=-,=-,=-@Назва поля1:Текст1.txt|Назва поля2|Назва поля3|Назва поля4”
на значення “=-,=-,=-,=-@Назва поля1:Текст2.txt|Назва поля2|Назва поля3|Назва поля4”
При використанні @Map.Parameters.Mask виникає проблема із символом “|”, котрий не розпізнається програмою при передаванні із скрипта. Експериментував й з @DequoteText - не допомагає.

Наперед вдячний за допомогу.

П.С. Можливо, знаєте яким чином опрацьовувати значення тегів параметру, наприклад ввівши Значення1 в тег №1 передати Значення2 (залежне від Значення1, скажімо якщо Значення1=“*ський район” то Значення2 =“*ська сільська рада”) в тег №2 того ж параметру.

Зіткнувся з проблемою при перехресній роботі скриптів.
Запускаю один скрипт, де частиною коду є:

$IN4Map=@ActivateMap

В процесі роботи цього скрипту (завдяки функції @Dialog.WaitBox) запускаю інший скрипт, який відкриває растрові зображення.
Дальше все працює нормально, але майже в кінці, коли скрипт має активувати карту $IN4Map в мене вискакує помилка, як на скриншоті
І, що цікаво, при записі в лог-файл першого скрипту, записується процедура і другого.
Перевірив співпадіння у назвах перемінних, - нічого.
От чому збиває змінну $IN4Map? Карти відкриті ті ж самі, що були, номери карт не мінялися (перевіряв). Яким чином відбувається ось така перехресна взаємодія скриптів? І як вони впливають один на одного?

Якщо ж в процесі роботи першого скрипту, замість запускати другий, просто вставляю растри через “Вставка-Растрове зображення”, то все працює нормально. І якщо вставляю код другого сприпту в перший - також. Але справа в тому, що мені не завжди треба відриття растру.
Код другого сприпту (що відкриває растри) досить простий:

$rastr=@Dialog.Select Виберіть населений пункт для відкриття растру|Биків|Бистрий| ... @if "$rastr"="Биків" then @Map.InsertRasters F:\Ортофото\05.tif @if "$rastr"="Биків" then @Map.InsertRasters F:\Ортофото\13.tif ... Правка | На задній план Зняти позначку | Усі $N=@Map.Count @if $N>100 then @Goto %Next @Map.SelectLayer ID10000 @Map.SelectLayer ID20000 $N2=@Map.SelCount @if $N2>0 then @Goto %End %Next @Map.SelectLayer ID1000001 %End Вигляд | Показати позначені ;

Скажу Вам пораду. Незапускайте інший скрипт, поки попередній скрипт чекає (@Dialog.Wait). Іншийскрипт в будь-якому випадку завершиться помилкою. Краще користуйтесь викликом скрипта зі скрипта.

зрозуміло, дякую

виникла нова проблема зі сприптами. Повністю перестали працювати скрипти, які виконують автоматичні функції, а ще пару хвилин назад працювали. Від чого це може бути?
Ось запускаю, наприклад, цей сприпт:

;дістаємо центр об'єкта $SelObj=@Map.NextSelected 0 $Range=@Map.Object[$SelObj].GetMinMax $MinX=@StringPart 1 $Range $MaxX=@StringPart 4 $Range $CntrX=($MinX+$MaxX)/2 $MinY=@StringPart 2 $Range $MaxY=@StringPart 5 $Range $CntrY=($MinY+$MaxY)/2 @Dialog.Message Цетр помеченного объекта X=$CntrX Y=$CntrY ;

І в мене в результаті пише просто матиматичну функцію: (координата1-координата2)/2. Але не рахує.

Зауважу, що координати центра об’єкта є в службових параметрах, рахувати їх непотрфбно. Арифметичні операції виконуються над числами з розділювачем - крапка. Невикористовуйте дужки, розбийте на окремі операції.

а як поміняти кому на крапку для усіх обмінних файлів, які будуть оброблятися скриптом?

Вже знаю, треба просто поміняти це у віндовс

В Digitals\Library є скрипт заміни коми на крапку ReplaceComma.dsf

замість

$CntrX=($MinX+$MaxX)/2

напишіть


$MinX=%Library.ReplaceComma $MinX
$MaxX=%Library.ReplaceComma $MaxX
$CntrX=($MinX+$MaxX)/2

аналогічно з Y

зрозуміло, дякую

В процесі роботи скрипту роблю багато змін і додаю нові параметри в об’єкт.
Перед змінами використовую:

@Map.SelectLayer ID70005 $ThisObj=@Map.SelectedObject @Map.Undo.SaveObject $ThisObj
після:

@Map.Undo.Undo

значення параметрів повертаються ті, що були до початку, а от нові парамерти, які були добавлені залишаються.
Чому?

Нові параметри - маєте на увазі параметри катри, які не були доступні для шару, в якому є об’єкт? Я це до того, що параметри Ви додаєте до списку доступних для шару об’єкта, а не в об’єкт.

Наскільки я розумію, команда @Map.Undo.SaveObjectParameters Number - “Запоминает значения всех параметров объекта в буфер Undo (вызов @Map.Undo.Undo вернет исходное состояние после изменений)”, а команда @Map.Undo.SaveObject Number - “Запоминает текущую конфигурацию объекта в буфер Undo (вызов @Map.Undo.Undo вернет исходное состояние после изменений)”.

Тобто, якщо Ви хочете відновити список доступних параметрів для шару, то тут ніяка @Map.Undo.Undo не допоможе. Лише нове призначення доступними певних параметрів.

Підкажіть будь ласка: при використанні функції ( @Map.SaveToFile $Name.in4 ) карта просто пересохраняється в цей файл ($Name.in4) замінивши те що в ньому було. Чи є така функція щоб відкрита в Діджиталі карта просто додавалася до вже існуючої у файлі карти (наприклад це потрібно для створення бази даних).?

Знаю що це можливо зробити використовуючи багато функцій, але можливо це вже реалізовано в одній ?

Дякую за роз’яснення. Дійсно список доступних слою параметрів можна повернути тільки через @Map.Layers.GetValidParameters і Undo тут не допоможе.

Але проблема зникла, оскільки, як я помітив пізніше, при збереженні у файл XML усі нові параметри шару XML_Земельна ділянка просто самі зникають. Зникає і їх вміст.

По-перше, базу даних обмінників все ж таки краще зберігати в *dmf, а не в *in4. Бо in4 має чітко встановлену структуру файлу і, наприклад, при накладках буде автоматично міняти шари у відповідності до цієї структури. Тобто, вийде каламбур.

Очевидно, вам потрібно просто скриптом кожного разу відкривати файл з базою і вставляти туди нову ділянку. Потім зберігати і закривати. Без відкриття карти в неї ділянки не добавиш. Інша справа, що за допомогою скрипту це буде робитися автоматично, так, що ви і не помітите її відкриття):
;шлях до бази
$SourceMap=d:\база.dmf
;Перевірка наявності відкритого обмінника
$CountMap=@MapCount
@If $CountMap=0 then @Break Вікдрийте обмінний файл для внесення в базу
;виділяємо все
@Map.SelectAll
;копіюємо вміст нашого файлу в буфер
@Map.Copy
;відкриваємо базу
@FileOpen $SourceMap
;вставляємо наш об’єкт
@Map.Paste
@Map.SaveToFile $SourceMap
@CloseMap

fendak

Спасибо за помощь!!

Подскажите, можно ли заскриптовать следующий порядок действий:

Карта–Слои–Фильтр–Видимые–Пометить все–Статус слоя(Правка)–Ок

Можна по-іншому, але резултат той самий - всі шари переведені у статус “Правка”

$MC=@Map.Layers.Count
$N=0
%Pochatok
$N=$N+1
@Map.Layers.SetState $N 0
@if $N<$MC then @Goto %Pochatok
@Dialog.Message Всі шари карти переведені у статус “Правка”

Тобто:
-визначаємо скільки в карті всього шарів;
-починаємо цикл по усіх наявних шарах карти;
-міняємо статус кожного шару на “Правка” (крім службових, які йдуть від нуля до мінус);
-завершуємо цикл, якщо шарів більше нема;
-виводимо результат про успішність переведення статусу.

Разумеется, можно иначе - просто выполнить двойной щелчок в Менеджере слоев и установить Правка для всех.
Уважаемый sergykydr просил несколько иное: установить в Правку только те слои, что были до этого в видимом статусе. К сожалению, функции типа @Map.Layers.GetState я не нашел, так что решаема ли задача, не уверен.

ну тоді можна ось так:

$MC=@Map.Layers.Count
$N=0
$N2=0
%Pochatok
$N=$N+1
$Status=@Map.Layers.GetAttributes $N
$Status=@StringPart 7 $Status
@if $Status<>2 @Goto %Dali
@Map.Layers.SetState $N 0
$N2=$N2+1
%Dali
@if $N<$MC then @Goto %Pochatok
@if $N2=0 then @Dialog.Message На карті не виявлено жодного шару в статусі “Видимий”
@if $N2=1 then @Dialog.Message 1 шар переведений у статус “Правка”
@if (“$N2”>“1”) and (“$N2”<“5”) then @Dialog.Message $N2 шари переведені у статус “Правка”
@if $N2>=5 then @Dialog.Message $N2 шарів переведені у статус “Правка”

Dmitriy Fedorov правильно заметил. Но по большому счету в моем случае хорошо подходит и все слои перевести в правку. fendak Ваш 1 скрипт то что мне и было нужно. Большое спасибо! Думаю что и 2 Ваш скрипт в скором времени очень понадобится)