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

Шановні розробники. Я ніяк не можу знайти залежності у виникненні дуже неприємної помилки. “Індекс виходить за межі допустимого”, якщо позначивши полігон в карті застосувати пункт меню Сервіс>Розрізати по полігону.

Подивіться, будь-ласка, у прикріпленій карті. Дуже дошкуляє така прикрість.
ToolsSplitByPolygon.dmf (14.5 KB)

Як обновити об’єкти карти, щоби всі видалені до того не перераховувалися в циклі?

А то видає помилку, що не знайдений параметр такий то, тому, що самого об’єкта на карті (наприклад одної з ділянок) вже нема. Але в циклі він все одно продовжує рахуватися. Якщо виділити все і скопіювати на нову карту, то там працює добре.

Не впевнений, але спробуйте Карта|Проверка|Очистить удаленные объекты.

Доброго здоров’я всім!

Зіткнувся з наступною проблемою.
В карті є об’єкти, що містять слої ХМЛ-зона, ХМЛ-квартал, ХМЛ-ділянка. Необхідно залишити ХМЛ-ділянку та при цьому передати в певний параметр цілий кад. номер.
Використовую такий скрипт:

$i=1
@Map.SelectLayer ID70005
$ParamNumb=@Map.Parameters.FindByID ID7000562
$count=@Map.SelCount
$SO=0
%start
$SO=@Map.NextSelected $SO
$CadNumber=@Map.Object[$SO].CalculateFormula ParentID7000300ParentID7000301ParentID7000401P[ID7000513]
@Map.SelectObject $SO
@Map.Selected.SetParameter $ParamNumb $CadNumber
$i=$i+1
@If $i>$count then @break Готово
@goto %start

Скрипт працює. Та при кількості обєктів більше 1000, ДУЖЕ повільно. А обєктів в мене десятки тисяч…
Чи є можливість прискорити роботу? Можливо, видаляючи опрацьоване (при копіюванні в нову карту ХМЛ-ділянки).
Заздалегідь вдячний.

дякую. саме те, що потрібно.

Не застосовуйте формулу, застосуйте функцію @Map.ParentObject Number [ParentLayer] для визначення батьківського об’єкта, вичитайте з батьківського об’єкта значення необхідного параметра і складіть їх до купи функцією @Concat Str

Міцного здоров’я Вам voha!

Величезне дякую! Суттєво скоротило час!
Таким шляхом піти теж думка була, та шукав Child-об’єкти а не Parent. Не здогадався з іншого боку зайти.
Єдині “глюки” трапляються при наявності однакових об’єктів, небхідно перевіряти, а також однакові об’єкти але з різною кількістю точок (останні вручну, не піддаються контролю на однаковість).

Ось скрипт, може кому стане в нагоді. Для обробки великих кількостей хмл, з метою “зліпити” кад. номер в хмелі та записати в один параметр одного шару (в моєму випадку в ХМЛ-ділянку в параметр “Опис земельної ділянки”).

$i=1
@Map.SelectLayer ID70003
$count=@Map.SelCount
$FirstLevel=0
%start
$FirstLevel=@Map.NextSelected $FirstLevel
$SecondaryLevel=@Map.ParentObject $FirstLevel
$ThirdLevel=@Map.ParentObject $SecondaryLevel
$Value3=@Map.Object[$SecondaryLevel].Parameter[ID7000401]
$Value1=@Map.Object[$FirstLevel].Parameter[ID7000300]
$Value2=@Map.Object[$FirstLevel].Parameter[ID7000301]
$Value4=@Map.Object[$ThirdLevel].Parameter[ID7000513]
$Value=@Concat $Value1,$Value2,$Value3,$Value4
@Map.Object[$ThirdLevel].Parameter[ID7000514] $Value
$i=$i+1
@If $i>$count then @break ГОТОВО
@goto %start

Успіхів всім!

Як за допомогою скрипта в строці “S”, видалить зліва все включно з першою крапкою.

Вибачаюсь, вечір вже туплю, сам знайшов як то зробить.

Потрібно знайти і виділити об’єкти карти за значенням їх параметра.
А саме, знайти об’єкти (в шарі 13 (id70009) XML Угіддя) із значенням параметру 96 (id7000901) Код угіддя, що дорівнює 17
Є функція @Map.SelectByParametersSelected Count|List, але я не розумію, що вписувати замість Count. Чи це можна зробити тільки за допомогою циклу, перераховуючи кожний об’єкт карти? Невже простіше ніяк?

@Map.SelectByParametersSelected 2|-7=70009|96=17
Замість Count вписувати кількість умов. Дві умови в нашому випадку, розділені знаком переносу рядка.

Розпакуйте файл-додаток в папку Digitals, там скрипт, якій помічає угіддя за заданим кодом

Приклад використання:

;Знімаємо помітку з усіх об'єктів карти
@Map.DeselectAll
;Помічаємо угіддя "Малоповерхова забудова"
%Library.SelectLandsByCode 007.01
;Помічаємо угіддя "Рілля"
%Library.SelectLandsByCode 001.01

а де файл-додаток?

Забув :slight_smile:
UnpackToDigitalsFolder.zip (437 Bytes)

Доброго здоров’я!

Виникла така проблема при використанні фунції @Map.Selected.CreateCaptions.
.JPG
В скрипті пишу @Map.Selected.CreateCaptions -9 0 2 0 0 1 1 - це ділянка ліворуч.
Та, що праворуч - отримана через значок “Создание/удаление подписей”.
Параметри, з моєї точки зору - однакові.
ParamIndex Orientation Position VAlign HAlign ShiftX ShiftY
ParamIndex: -9 (Номери точок)
Orientation: 0 (Ориентация - Горизонтальная)
Position: 2 (Позиция в углу объекта)
VAlign: 0 (Вертикальная привязка - По центру)
HAlign: 0 (Горизонтальная привязка - По центру)
ShiftX: 1 (Смещение, мм - Горизонтальное)
ShiftY: 1 (Смещение, мм - Вертикальное)
Можливо я не вірно трактую аргументи функції?
В чому помилка?

Заздалегідь вдячний за допомогу.

Насправді, з підписами не все так просто. Параметри функці @Map.Selected.CreateCaptions ShiftX і ShiftY вказують на зміщення від точки в мм карти не центра підпису, а лівого верхнього кута підпису (якщо я не помиляюсь). Мабуть варто писати скриптову функцію, яка буде вичитувати властивості підписів @Map.Object[N].Caption[N] DX DY DZ Orientation Align Size (DX DY DZ - зміщення в метрах натури від центра об’єкта). Ця-ж функція має: до вичитаних значень зміщення по X додати пару метрів, а від зміщення по Y - відняти пару метрів; після цього - встановити розраховані властивості підписів функцією @Map.Object[N].Caption[N] DX DY DZ Orientation Align Size.

Для старту - код:$ObjNum=@Map.SelectedObject @Map.Selected.CreateCaptions -9 0 2 0 0 1 1 $ParamCaptions=@Map.Object[$ObjNum].Caption[-9] @Dialog.Message $ParamCaptions

В мене працює справно:$ObjNum=@Map.SelectedObject @Map.Selected.CreateCaptions -9 0 2 0 0 1 1 $ParamCaptions=@Map.Object[$ObjNum].Caption[-9] $Char=@Calc Char(124) $Char=@DequoteText $Char $StrNowShiftX:= $StrNowShiftY:= $StrShiftX=@StringPart 1 $ParamCaptions $StrShiftY=@StringPart 2 $ParamCaptions $StrShiftZ=@StringPart 3 $ParamCaptions $Orientation=@StringPart 4 $ParamCaptions $Align=@StringPart 5 $ParamCaptions $CountPoint=@Map.Object[$ObjNum].Count $IsClose=@Map.Object[$ObjNum].Closed @If $IsClose=1 then $CountPoint=$CountPoint-1 $NumPoint=1 %Start $X=@StringPart $NumPoint|$StrShiftX $X=$X+20 $Y=@StringPart $NumPoint|$StrShiftY $Y=$Y-10 @If $NumPoint>1 then $StrNowShiftX=@Concat $StrNowShiftX,$Char,$X else $StrNowShiftX=@Concat $StrNowShiftX,$X @If $NumPoint>1 then $StrNowShiftY=@Concat $StrNowShiftY,$Char,$Y else $StrNowShiftY=@Concat $StrNowShiftY,$Y $NumPoint=$NumPoint+1 @If $NumPoint<=$CountPoint then @Goto %Start $ParamCaptionsNow=$StrNowShiftX $StrNowShiftY $StrShiftZ $Orientation $Align @Map.Object[$ObjNum].Caption[-9] $ParamCaptionsNow @Window.RefreshПравда, якби ще скрипт оцінював, на скільки метрів натури треба змістити підписи ($X=$X+20 чи $Y=$Y-10). Тут числа залежатимуть від масштабу карти і розмірів підписів.

Чому при використанні функції @Map.In4ToXML усі коди угідь, крім дробових (35.1, 35.3..) збільшуються на 3? Наприклад, було 05 Рілля, стає 08, було 14 стає 17 і т.д.

Те ж саме відбувається коли просто копіюю угіддя з IN4 і вставляю в XML

Списки можливих значень параметра мають бути ідентичними в шаблонах.

Виникають наступні питання:

  1. тоді @Map.CancelUpdate - означає вихід з блоку Map.BeginUpdate…Map.EndUpdate, що є рівнозначним @Map.EndUpdate RefreshAlways :question:
  2. якщо в блоці Map.BeginUpdate…Map.EndUpdate викликається “функціональний” скрипт, то оновлення карти заборонене й на час виконання функціонального скрипта, але тоді заборонено оновлення лише робочої зони головного вікна Digitals :question:
  3. вікна, що викликаються функціями з групи Dialog й функцією @Progress.Start Count Title, мають поводити себе як модальні (для прикладу - вікно прогреса @Progress.Start Count Title має бути активним при забороненому оновленні карти), наприклад

@Map.BeginUpdate
@Progress.Start

@Progress.StepBy

@Map.BeginUpdate
@Map.EndUpdate

@Progress.Stop
@Map.EndUpdate

Будь-ласка, підкажіть. Вирішення цих питань, як на мене, є важливим. Пропоную, для ясності, переглянути відео