Можливо,поважні колеги, дехто із вас вже мав справу із таким завданням. Прошу, підкажіть вирішення.
Є параметр, для прикладу нехай 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). Іншийскрипт в будь-якому випадку завершиться помилкою. Краще користуйтесь викликом скрипта зі скрипта.
виникла нова проблема зі сприптами. Повністю перестали працювати скрипти, які виконують автоматичні функції, а ще пару хвилин назад працювали. Від чого це може бути?
Ось запускаю, наприклад, цей сприпт:
Зауважу, що координати центра об’єкта є в службових параметрах, рахувати їх непотрфбно. Арифметичні операції виконуються над числами з розділювачем - крапка. Невикористовуйте дужки, розбийте на окремі операції.
Нові параметри - маєте на увазі параметри катри, які не були доступні для шару, в якому є об’єкт? Я це до того, що параметри Ви додаєте до списку доступних для шару об’єкта, а не в об’єкт.
Наскільки я розумію, команда @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
Можна по-іншому, але резултат той самий - всі шари переведені у статус “Правка”
$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 Ваш скрипт в скором времени очень понадобится)