Библиотека полезных скриптов

змініть бітність растру з 8 на 24

@Map.CreateLayout $X $Y 605 605 0 300 24 $FN

:slight_smile: Дякую!

А як зробити щоб по кожному окремому обмеженню забивати інформацію. Бо коли вибираєш ЛЕП то присвоює ЛЕП всім існуючим обмеженням на ділянці.

Так не повино бути, десь помилка. Скиньте скрін з менеджеру шарів вашого XML.

добавив розшифрування обмеження 01.05 Охоронна зона … Все одно

Всеж таки краще привязуватись до ID параметру:

%LEP
@Map.Selected.SetParameter ID7000801 Охоронна зона навколо (вздовж) об’єкта енергетичної системи
@Map.Selected.SetParameter ID7000803 01Закон України “Про землі енергетики та правовий режим спеціальних зон енергетичних об’єктів”2010-07-09
@Map.Selected.SetParameter ID7000808
@Map.Selected.SetParameter ID7000812
@Dialog.Message Для виділеного об’єкта вибрано тип обмеження:“$Tip”
@goto %konecobmez

Просто супер з прив’язкою до ID

[quote=“fendak”]
Написав сприпт, який автоматично визначає в якій стороні світу знаходиться межовий знак

Подскажите пожалуйста, что сделать что б прописывало стороні света в параметр ну например “Опис місцезнаходження МежЗнака” (Спасибо)

замість
@if $ParentObj=$P1 then @Dialog.Message Точка $NomerT знаходиться на північному заході ділянки

напишіть
@if $ParentObj=$P1 then $S=північному заході
…(аналогічно для усіх інших сторін світу)
@Text.Add $S

і в кінці скрипта добавте
$S=@Text.Text
;створюємо параметр ID7000581
$S=@Map.Parameters.Get ID7000581
@if $S= then @Map.Parameters.Add 7000580 5 Список сторін світу
;добавляєм параметр ID7000581 в список доступних шару XML : Земельна ділянка
$S=@Map.Layers.GetValidParameters ID70005
@Map.Layers.SetValidParameters ID70005 $S ID7000581
@Map.SelectLayer ID70005
$obj=@Map.SelectedObject
@Map.Object[$obj].Parameter[ID7000580] $Res

В результаті в шарі ХМЛ Земельна ділянка добавиться новий параметр (ID7000581), куди буде записано список сторін світу для усіх точок ділянки. Номер строки в списку відповідатиме номеру точки.

Параметр создает но список пуст пишет $Res

Подскажите гда ошибка

$ParentObj=@Map.ParentObject $N
@if $ParentObj=$P1 then $S знаходиться на північному заході ділянки
@if $ParentObj=$P1 then $S знаходиться на півночі ділянки
@if $ParentObj=$P1 then $S знаходиться на північному сході ділянки
@if $ParentObj=$P1 then $S знаходиться на сході ділянки
@if $ParentObj=$P1 then $S знаходиться на південному сході ділянки
@if $ParentObj=$P1 then $S знаходиться на півдні ділянки
@if $ParentObj=$P1 then $S знаходиться на південному заході ділянки
@if $ParentObj=$P1 then $S знаходиться на заході ділянки
@Map.DeselectAll
%Next
@if $N<$MC then @Goto %Pochatok
$S=@Text.Text
@Text.Add $S
;створюємо параметр ID2000081
$S=@Map.Parameters.Get ID2000081
@if $S= then @Map.Parameters.Add 2000080 5 Список сторін світу
;добавляєм параметр ID2000081 в список доступних шару IN4 : Земельна ділянка
$S=@Map.Layers.GetValidParameters ID20000
@Map.Layers.SetValidParameters ID20000 $S ID2000081
@Map.SelectLayer ID20000
$obj=@Map.SelectedObject
@Map.Object[$obj].Parameter[ID2000080] $Res

Этот код
@if $ParentObj=$P1 then $S знаходиться на північному заході ділянки
@if $ParentObj=$P1 then $S знаходиться на півночі ділянки
@if $ParentObj=$P1 then $S знаходиться на північному сході ділянки
@if $ParentObj=$P1 then $S знаходиться на сході ділянки
@if $ParentObj=$P1 then $S знаходиться на південному сході ділянки
@if $ParentObj=$P1 then $S знаходиться на півдні ділянки
@if $ParentObj=$P1 then $S знаходиться на південному заході ділянки
@if $ParentObj=$P1 then $S знаходиться на заході ділянки

равносилен последней строке
@if $ParentObj=$P1 then $S знаходиться на заході ділянки

Если в $Res ничего не вносилось, то и параметр будет пустой
@Map.Object[$obj].Parameter[ID2000080] $Res

А как внести в $Res.
помогите пожалуйста разобраться. Очень много кроков на участке. (Спасибо)

$ParentObj=@Map.ParentObject $N
@if $ParentObj=$P1 then $S=межовий знак $NomerT знаходиться на північному заході ділянки
@if $ParentObj=$P2 then $S=межовий знак $NomerT знаходиться на північному заході ділянки
@if $ParentObj=$P3 then $S=межовий знак $NomerT знаходиться на північному заході ділянки
@if $ParentObj=$P4 then $S=межовий знак $NomerT знаходиться на північному заході ділянки
@if $ParentObj=$P5 then $S=межовий знак $NomerT знаходиться на північному заході ділянки
@if $ParentObj=$P6 then $S=межовий знак $NomerT знаходиться на північному заході ділянки
@if $ParentObj=$P7 then $S=межовий знак $NomerT знаходиться на північному заході ділянки
@if $ParentObj=$P8 then $S=межовий знак $NomerT знаходиться на північному заході ділянки
@Map.DeselectAll
@Text.Add $S
%Next
@if $N<$MC then @Goto %Pochatok
@Text.Delete 1
$Res=@Text.Text
;створюємо параметр ID2000081
$P=@Map.Parameters.Get ID2000081
@if $P= then @Map.Parameters.Add 2000081 5 Список сторін світу
;добавляєм параметр ID2000081 в список доступних шару IN4 Ділянка
$P=@Map.Layers.GetValidParameters ID20000
@Map.Layers.SetValidParameters ID20000 $P ID2000081
@Map.SelectLayer ID20000
$obj=@Map.SelectedObject
@Map.Object[$obj].Parameter[ID2000081] $Res

Створив скрипт який виносить підписи обєктів, що лежать на ламаній і ровертає їх по ходу ламаної.
Можливо хтось підправить алгоритм.

====================================================
;порядковий номер параметру, підпис з якого буде винесено
$parampidpys=1
;
;---------------------точкові обєкти у список 1
$S=@Map.SelCount
@If $S<=0 @Break виділійть пікети що лежать на лінії
$list=@Map.Selected.List
@Text[1].Text $list
$n=@Text[1].Count
@Text[1].Save d:\object.txt
@Map.DeselectAll
@Dialog.WaitBox Выделите полилинию
;
;-----------------------вибір полілінії
$line=@Map.SelectedObject
;@if $line<>1 then @Break почніть спочатку
$m=@Map.Object[$line].Count
@if $m<2 then @Break почніть спочатку і виділіть лінію $line $m
;-----------------------точки лінії у список 2
$j=1
%line
$XL=@Map.Object[$line].Point[$j].X
$XL=%Library.ReplaceComma $XL
$XL=@RoundTo $XL 3
$YL=@Map.Object[$line].Point[$j].Y
$YL=%Library.ReplaceComma $YL
$YL=@RoundTo $YL 3
$ZL=@Map.Object[$line].Point[$j].Z
$ZL=%Library.ReplaceComma $ZL
$ZL=@RoundTo $ZL 3
@Text[2].Add $XL $YL $ZL
$j=$j+1
@if $j>$m then @Goto %dali else @Goto %line
%dali
@Progress.Start $N ОБРОБЛЕНО
;@Text[2].Save d:\text2.line.txt
;-----------------------перебір пікетів
$i=1
%Start
@map.DeselectAll
$O=@Text[1].Line[$i]
;@Map.Object[$O].Select
$XO=@Map.Object[$O].Point[1].X
$XO=%Library.ReplaceComma $XO
$XO=@RoundTo $XO 3
$YO=@Map.Object[$O].Point[1].Y
$YO=%Library.ReplaceComma $YO
$YO=@RoundTo $YO 3
$ZO=@Map.Object[$O].Point[1].Z
$ZO=%Library.ReplaceComma $ZO
$ZO=@RoundTo $ZO 3
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
$j1=1
%poshuk
$j2=$j1+1
@if $j2>$m then $j2=$j2-2
$p1=@Text[2].Line[$j1]
$p2=@Text[2].Line[$j2]
$x1=@StringPart 1 $p1
$y1=@StringPart 2 $p1
$x2=@StringPart 1 $p2
$y2=@StringPart 2 $p2
;@Dialog.Message $xo $yo||$x1 $y1
@if ($x1=$xo) and ($y1=$yo) then @goto %est else @goto %nextp
%est
$dx=$x2-$x1
$dy=$y2-$y1
$kut=$dy/$dx
$kut=@Calc ArcTg($kut)
$kut=abs($kut180/3.1415)
@if ($dx>0) and ($dy>0) then $kut=$kut
@if ($dx>0) and ($dy<0) then $kut=360-$kut
@if ($dx<0) and ($dy>0) then $kut=180-$kut
@if ($dx<0) and ($dy<0) then $kut=180+$kut
$kut=3600+900-$kut
10
$kut2=$kut+1800
;@Dialog.Message i=$i j1=$j1 j2=$j2 m=$m kut=$kut z=$zo
@if $kut>=2700 then @goto %priamo else @goto %plus180
%priamo
@Map.Object[$I].Caption[$parampidpys] 0 0 0 $kut 0
;@Dialog.Message priamo
@goto %nextp
%plus180
;----беремо попередній відрізок а не наступний
@if $j1<>1 then $j1=$j1-1
$j2=$j1+1
$p1=@Text[2].Line[$j1]
$p2=@Text[2].Line[$j2]
$x1=@StringPart 1 $p1
$y1=@StringPart 2 $p1
$x2=@StringPart 1 $p2
$y2=@StringPart 2 $p2
$dx=$x2-$x1
$dy=$y2-$y1
$kut=$dy/$dx
$kut=@Calc ArcTg($kut)
$kut=abs($kut180/3.1415)
@if ($dx>0) and ($dy>0) then $kut=$kut
@if ($dx>0) and ($dy<0) then $kut=360-$kut
@if ($dx<0) and ($dy>0) then $kut=180-$kut
@if ($dx<0) and ($dy<0) then $kut=180+$kut
$kut=3600+900-$kut
10
$kut2=$kut+1800
@Map.Object[$I].Caption[$parampidpys] 0 0 0 $kut2 512
$j1=$j1+1
;--------------------------------------------------
%nextp
$j1=$j1+1
@if $j1>$m then @Goto %nextobj else @Goto %poshuk
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
%nextobj
@Progress.StepBy
$i=$i+1
@if $i>$n then @Goto %end else @Goto %Start
%end
;--------------закінчено перебір пікетів
@Progress.Stop
@Window.Refresh
@Text[1].Clear
@Text[2].Clear
;
@Break DONE

===============================

В процесі помітив наступну помилку:
Якщо у прикріпленому файлі сворити підписи по існуючим точковим обєктам - то все ок.
Коли дозібрати пікети вручну на вузли лінії - то по них не виносяться підписи.

вирішення проблеми: всі пікети у чистий файл і перенумерація ID потім вставляємо лінію з наступним ID.

Можливо це тільки у мене така проблема з програмою.
test-pidpys.dmf (21.1 KB)

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

Скрипт складається із трьох кнопок. Перша перевіряє всі обмінники в папці з базою і складає їх список, записуючи в текствовий файл D:\Baza.txt

$WorkPapka=@Dialog.SelectFolder Виберіть папку з файлами для опрацювання
@if $WorkPapka= then @break
@Text[1].FolderListTree *.in4 $WorkPapka
$FC=@Text[1].Count
@Text[1].Save D:\Baza.txt
@Break Оброблено $FC обмінників

Друга переводить базу в скорочений варіант, залишаючи тільки назву файлу без його шляху.

@Text[1].Load D:\Baza.txt
$FC=@Text[1].Count
$I=0
%Loop
$I=$I+1
$FN=@Text[1].Line[$I]
$FNShort=@ExtractFileName $FN
@Text[2].Add $FNShort
@if $I<$FC then @Goto %Loop
@Text[2].Save D:\BazaShort.txt
@Dialog.Message Виконано!

Ну і третя кнопка є, власне, для швидкого пошуку обмінників в базі і їх відкриття. При цьому шукаються як IN4 так і XML

@Text[1].Load D:\BazaShort.txt
@Text[2].Load D:\Baza.txt
$KN=@Dialog.Ask Кадастровый номер для пошуку в базі Default=4621283300020010000
$SeartIndex=@Text[1].IndexOf $KN.in4
@if $SeartIndex=0 @Dialog.Message Такого файла in4 в базі нема
@if $SeartIndex=0 then @Goto %Next
$Seart=@Text[2].Line[$SeartIndex]
@FileOpen $Seart
%Next
$SeartIndex2=@Text[1].IndexOf $KN.xml
@if $SeartIndex2=0 @break Такого файла xml в базі нема
$Seart2=@Text[2].Line[$SeartIndex2]
@FileOpen $Seart2

Тобто, першими двома кнопками ми індексуємо базу. Це робиться один раз, якщо база стабільна, без додавання нових обмінників чи час від часу, якщо нові обмінники додаються в базу. І в процесі роботи користуємося тільки третьою кнопкою.

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

Пане fendak, це стосується обмінників в папці (ін4, хмл), чи обмінників в карті (дмф)…
Так може хто знає як мені зробити так щоб карта з обмінниками ін4 швидше відкривалась і не вибивало вікна аналіз карти???

це стосується обмінників IN4 та XML у папці.
Аналіз карти відбувається на закладці Інфо та Сбір. На закладці Правка - ні.
Тому можна використати такий скрипт:

%Events.OnFileOpen
@SelectTab 2
%Events.OnAdd
Вигляд | Показати позначені

Добавити його треба в Карта - Скрипт обработки собитий
В результаті після кожного відкриття карти автоматично активуватиметься закладка Правка. Плюс, при вставці об’єктів на карту вони відразу будуть показані на екрані.

Аналіз карти відбувається довго коли в параметрах є функція PARENT. В стандартному Normal.dmf, який використовується для відкриття in4 є така функція в параметрі ID106

Діма, може якщо ділянок не дуже багато…
Але коли на карті 225000 об’єктів, то це нічого не дало. Все одно аналіз карти відбувається безкінечно. Хоч я видалив функцію PARENT в параметрі ID106 на dmf-карті з обмінниками.