слой ID70024 табличный и в нем 1 объект(таблица), в этой таблице 1 слово - )дорога( ,хочу его поменять на - b[/b] @Map.SelectLayer ID70024
$Smej=@Map.SelectedObject
$Smejtext=@Map.Object[$Smej].TableText
$Smejtext=@Calc Replace(“$Smejtext”,“)дорога(”,“(дорога)”) @Map.Object[$Smej].TableText $Smejtext
и ничего не получается.
Дозвольте обговорити скрипт з теми “Бібліотека корисних скриптів” на прохання автора і дати деякі поради, з мого бачення
код можна спростити, замінивши перші 112 рядків на наступні 20:;Відкриваємо карту з кварталами і зонами
$N=@Map.SelCount
@If $N<>1 @Break Виділіть один об'єкт
;запам'ятовуємо номер нашої карти
$MapFilename=@Map.Filename
$ThisMap=@GetMapNumber $MapFilename
$Obj=@Map.SelectedObject
@Map.Copy
;відкриваємо Чарівну карту
@FileOpen D:\Digitals\Чарівна карта.dmf
@Map.Paste
$ThisObj=@Map.SelectedObject
;полігон, в який об'єкт попав
$ParentObj=@Map.ParentObject $ThisObj
;не закриваємо карту, якщо зовнішній полігон не знайдений
@if $ParentObj=$ThisObj then @Break Ділянка залазить на інший квартал або поза межами району
;читаєм значення параметрів зовнішнього об'єкта
$P10010=@Map.Object[$ParentObj].Parameter[ID10010]
@Map[$ThisMap].Object[$ThisObj].Parameter[ID10010]=$P10010
$P10020=@Map.Object[$ParentObj].Parameter[ID10020]
@Map[$ThisMap].Object[$ThisObj].Parameter[ID10020]=$P10020
$P10030=@Map.Object[$ParentObj].Parameter[ID10030]
@Map[$ThisMap].Object[$ThisObj].Parameter[ID10030]=$P10030
$P50035=@Map.Object[$ParentObj].Parameter[ID50035]
@Map[$ThisMap].Object[$ThisObj].Parameter[ID10070]=$P50035- складаючи скрипт, не бійтесь серед всіх доступних функцій, що є у списку вікна редактора коду (серед них знайдете @OpenLog і @CloseLog [Filename]), вибрати найбільш підходящу, тоді в лог-файлі, Ви побачите результат виконання кожної скриптової функції та оціните правильність і доцільність застосування ціх функцій у скрипті).
Не ставте “крапку”. Продовжувати треба, інакше не народжуються корисні скрипти. Нахрапа нічого не дається.
Даний спрощений скрипт не працює. Видає помилку про неправильний номер об’єкта в рядку 19.
Спростити можна було б, якби адміни добавили функцію [ Параметры… ] / Створити шаблон і відповідно вставити. Але серед доступних функцій є тільки просто [ Параметры… ] і неможливо дальше проводити дії по вибору вмісту даного пункту.
В чому причина нестабільної роботи скрипту вже зрозумів. Після перейменування шару ІН4квартал на ІН4ділянка потрібно ще активувати закладку Інфо. Бо інакше (в закладці Правка) шари не обновляються. І програма просто не знаходить потрібного шару, бо в кварталі його нема.
Згідний, я жодного разу не “крутив” цей скрипт. Але, дозвольте наголосити на основних принципах і методах написання скриптів:
В ході “відлагоджування” роботи скрипта, або в ході написання скрипта - використайте команду @Dialog.Message $ThisObj, або @Break $ThisObj, вставивши її відразу після рядка $ThisObj=@Map.SelectedObject. Можливо змінна $ThisObj не містить значення, оскільки немає позначеного об’єкта в карті? Будете мати можливість подивитись, який це такий “неправильний” номер об’єкта попадається в рядку 19. Використовуйте ці функції скрізь - де натикаєтесь на помилку при виконанні.
А як же функції @Map.Parameters.SaveToFile FileName, @Map.Parameters.LoadFromFile FileName, або функції для роботи з параметрами по-окремо?
2. Переглядайте список доступних скриптових функцій, підбираючи найбільш підходящу.
Мала б допомогти одна з функцій @Map.RefreshObject Index, @Map.CalculateRange.
А ще знайшов функцію - popFillin | Сохранить как шаблон… Але не знайшов функції вставлення збереженого шаблону.
Але взагалі збереження у файл, як і збереження як шаблону мені не дуже підходить тому, що в мене не співпадають на картах номери заповнених параметрів. Наприклад, адреса ділянки (Р[35]) в мене підтягується з Р[89].
І, зверніть, будь-ласка, увагу, що у запропонованих вами формулах $P10010=@Map.Object[$ParentObj].Parameter[ID10010] не підсвічується правильно синтаксис. @Map.Object і Parameter мали б бути жирними чи кольоровими, а вони виглядають, як звичайний текст.
Вигляд | Синхронізація позицій
;Відкриваємо карту з кварталами і зонами
$SourceMap=D:\Digitals\Чарівна карта.dmf
;Параметр, з якого будемо копіювати на Чарівній карті(код нас.пункту)
$SrcParam1=ID10010
;параметр, в який будемо вставляти в нашу ділянку(код нас.пункту)
$DestParam1=ID10010
;Параметр, з якого будемо копіювати на Чарівній карті(номер зони)
$SrcParam2=ID10020
;параметр, в який будемо вставляти в нашу ділянку(номер зони)
$DestParam2=ID10020
;Параметр, з якого будемо копіювати на Чарівній карті(НОМЕР КВАРТАЛУ)
$SrcParam3=ID10030
;параметр, в який будемо вставляти в нашу ділянку(НОМЕР КВАРТАЛУ)
$DestParam3=ID10030
;Параметр, з якого будемо копіювати на Чарівній карті(ГОЛОВА С/Р)
$SrcParam4=ID50035
;параметр, в який будемо вставляти в нашу ділянку (ГОЛОВА С/Р)
$DestParam4=ID10070
;Параметр, з якого будемо копіювати на Чарівній карті(7 ЦИФР КАД.НОМЕРА)
$SrcParam5=ID50034
;параметр, в який будемо вставляти в нашу ділянку(7 ЦИФР КАД.НОМЕРА)
$DestParam5=ID20010
;Параметр, з якого будемо копіювати на Чарівній карті (АДРЕСА ДІЛЯНКИ)
$SrcParam6=ID50036
;параметр, в який будемо вставляти в нашу ділянку(АДРЕСА ДІЛЯНКИ)
$DestParam6=ID20020
$N=@Map.SelCount
@If $N<>1 @Break Виділіть один об'єкт
;запам'ятовуємо номер нашої карти
$ThisMap=@ActivateMap 1
;копіюємо позначений об'єкт в буфер
@Map.Copy
;відкриваємо Чарівну карту
@FileOpen $SourceMap
;вставляємо у відкриту карту наш об'єкт
@Map.Paste
;номер нашого об'єкта
$ThisObj=@Map.SelectedObject
;полігон, в який об'єкт попав
$ParentObj=@Map.ParentObject $ThisObj
;не закриваємо карту, якщо зовнішній полігон не знайдений
@if $ParentObj=$ThisObj then @Break Ділянка залазить на інший квартал або поза межами Дрогобицького
;копіюємо значення параметра зовнішнього об'єкта
$P1=@Map.Object[$ParentObj].Parameter[$SrcParam1]
$P2=@Map.Object[$ParentObj].Parameter[$SrcParam2]
$P3=@Map.Object[$ParentObj].Parameter[$SrcParam3]
$P4=@Map.Object[$ParentObj].Parameter[$SrcParam4]
$P5=@Map.Object[$ParentObj].Parameter[$SrcParam5]
$P6=@Map.Object[$ParentObj].Parameter[$SrcParam6]
;повертаємося до карти з нашою ділянкою
@CloseMap
@ActivateMap $ThisMap
;вставляємо зкопійований параметр
$ThisObj=@Map.SelectedObject
@Map.Object[$ThisObj].Parameter[$DestParam1]=$P1
@Map.Object[$ThisObj].Parameter[$DestParam2]=$P2
@Map.Object[$ThisObj].Parameter[$DestParam3]=$P3
@Map.Object[$ThisObj].Parameter[$DestParam4]=$P4
;обновляємо об'єкт
@Map.RefreshObject $ThisObj
;Копіюємо квартал, вставляємо і перейменовуємо на ділянку
@Map.Copy
@Map.Paste
@Map.ChangeSelectedLayer 3
$ThisObj=@Map.SelectedObject
@Map.Object[$ThisObj].Parameter[$DestParam5]=$P5
@Map.Object[$ThisObj].Parameter[$DestParam6]=$P6
;обновляємо об'єкт
@Map.RefreshObject $ThisObj
;викликаємо вікно заповнення адреси ділянки
@Dialog.EditParameter ID20020
$ThisMap=@ActivateMap
;викликаємо вікно заповнення ПІП
@Dialog.EditParameter ID20030
$ThisMap=@ActivateMap
;викликаємо вікно вибору цільового призначення
@Dialog.EditParameter ID20040
$ThisMap=@ActivateMap
Вигляд | Синхронізація позицій
Мене це в повній мірі задовільняє. Тепер буду доповнювати іншими функціями, щоби максимально автоматизувати роботу:)
Поняття циклу For…Next в скриптовій мові немає. Є лише поняття переходу на мітку з умовою, аналог If…Then…Else. От і складайте “цикли”. Рекомендую Digitals-scripts.pdf
От тільки пробував скрипт - працює справно. Дайте свій скрипт, попробую в себе.
Я би не використовував для ідентифікації шару в скрипті його порядковий номер. Тільки ID шару
З власного досвіду: порядок сортування шарів у менеджері шарів записується в карті. Отже, достатньо раз сортувати шари за алфавітом, зберігши зміни в карті - отримаєте непередбачуваний результат роботи скрипта.
І головне - яка у Вас версія Digitals?
$N=@Map.SelCount
@If $N<>1 @Break Виділіть один об'єкт
$Z1=@Map.Layers.ObjectCount 87
@if $Z1>=1 then @Map.ChangeSelectedLayer 89 else @Map.ChangeSelectedLayer 61
Вибираю шар ІN4 ділянка і запускаю скрипт.
В результаті є на карті шар 35.1 капітальна чи нема, все одно перейменовує ділянку на 05 рілля. А повинно на 35.3 прибудинкова територія.
номери шарів співпадають, перевірив. Та й ніколи шари не сортую по-іншому, ніж вони є по замовчуванню.
А взагалі не поставив замість номерів шарів ID бо в описі деяких функцій в програмі Digitals в дужках написано написано пояснення "номер шару(неID). Не розумію, в яких випадках ставиться ID, а в яких номер шару.
А от він у дії відео. Вже й не знаю що Вам казати. Користуйтесь @OpenLog, @CloseLog, аналізуйте лог-файл.
Знайшов . Перепрошую, у Вас в скрипті проблема зі змінною $Z1. Дивіться відео.
Ще раз перепрошую: справа не в змінній, справа у тому, що функція @Map.Layers.ObjectCount оцінює кількість об’єктів правильно, якщо номери цих об’єктів вже були записані в карті. Отже так:
якщо карта не містить об’єктів у шарі 87 і об’єкт-1 перевести в шар з порядковим номером 87 - функція @Map.Layers.ObjectCount 87 поверне 0;
якщо карта не містить об’єктів у шарі 87 і об’єкт-1 перевести в шар з порядковим номером 87 і застосувати @Map.CalculateRange - функція @Map.Layers.ObjectCount 87 поверне 1.
Справа в оновленні карти.
Щастить мені на різні глюки і недооновлення. Але тут вже справа не в недооновленні обєкта, оновлення і перерисовка нічого не дає.
Суть формули така:
-якщо в параметрі KZ значення “для будівництва…” і на карті є угіддя 35.1 (капітальна), то міняємо вставлений раніше шар на 35.3 (прибудинкова)
-якщо в параметрі KZ значення “для будівництва…” і на карті є угіддя 58 (незаверш.буд-во), то міняємо вставлений раніше шар на 35.3 (прибудинкова)
-якщо в параметрі KZ значення “для будівництва…” і на карті нема угіддя 58 (незаверш.буд-во) і нема угіддя 35.1, то міняємо вставлений раніше шар на шар 59 (нерозп.буд-во)
[code];викликаємо вікно вибору цільового призначення
$LayControl=@Dialog.ListSelect Виберіть цільове призначення|для будівництва і обслуговування жилого будинку, господарських будівель та споруд|для ведення особистого селянського господарства|для ведення садівництва|для гаражного будівництва @Map.Object[$ThisObj].Parameter[ID20040]=$LayControl
$Zminna1=@Map.Layers.ObjectCount 87
$Zminna2=@Map.Layers.ObjectCount 160 @If “$LayControl”=“для будівництва і обслуговування жилого будинку, господарських будівель та споруд” and $Zminna1>=1 then @Map.ChangeSelectedLayer 89 @If “$LayControl”=“для будівництва і обслуговування жилого будинку, господарських будівель та споруд” and $Zminna2>=1 then @Map.ChangeSelectedLayer 89 @If “$LayControl”=“для будівництва і обслуговування жилого будинку, господарських будівель та споруд” and $Zminna1<1 and $Zminna2<1 then @Map.ChangeSelectedLayer 161[/code]
А ось результат перевірки:
00:10:34.939 IF “для будівництва і обслуговування жилого будинку, господарських будівель та споруд”=“для будівництва і обслуговування жилого будинку, господарських будівель та споруд” and 1<1 and 0<1 then @Map.ChangeSelectedLayer 161
00:10:34.939 MAP.CHANGESELECTEDLAYER 161
00:10:34.983 1
от не розумію яким чином коли одна з умов не виконується в результаті получається 1. Чи 1<1 ?
При наявності збірних умов, попробуйте використати синтаксис з прес-релізу (круглі дужки для виразу умови): “Например: @If ($I>0) and ($I<=$Count) then @Goto %Next else @Goto %Start”, якщо не получиться - розбийте складну умову на дві прості, використавши перехід на мітки.
Потрібен скрипт, що автоматично виділяє по черзі суміжники, дивиться, чи заповнені вони і, якщо ні, то викликає форму їх заповнення. Написав ось такий, але чомусь суміжники не виділяються окремо, тільки всі разом і форма заповнення діє на всі виділені суміжники одночасно. Як зробити, щоби суміжники виділялися окремо?
@OpenLog @Map.DeselectAll @Map.SelectLayer ID50000
$N=@Map.SelCount @if $N=0 then @Break На карті нема суміжників
$N=0
%Pochatok
$N=@Map.NextSelected $N @if $N=0 then @Goto %End
$ParNM=ID20030
$P1=@Map.Object[$N].Parameter[$ParNM] @If “$P1”=“” then @Dialog.EditParameter ID20030 @Goto %Pochatok
%End: @CloseLog C:\Log.txt
Всім доброго дня.
Шановні розробники. Виникло питання, з написаними “функціональними” скриптами (тими, що зберігаються в \Digitals\Librare\ і викликаються зі скрипта на кнопці панелі інструментів):
чи можна, а головне, чи варто забезпечити повне припинення виконання скрипта не тільки функціонального, а й “вызывающего” скрипта функцією @Break? Наразі, якщо функція @Break зустрічається в функціональному скрипті, запущеному на виконання зі скрипта на кнопці панелі інструментів, управління передається скрипту на кнопці. Якщо так і має бути - будь-ласка, дайте знати.
Дякую.
замість @if then @Break
використовуйте @if then @Goto %LastLineInThisScript
та в кінець скрипта додайте мітку %LastLineInThisScript
тоді роботу скрипта буде закінчено та буде продовжено роботу скрипта, що його викликав.