%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
замість @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), куди буде записано список сторін світу для усіх точок ділянки. Номер строки в списку відповідатиме номеру точки.
$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
$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-$kut10
$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-$kut10
$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)
Ну і третя кнопка є, власне, для швидкого пошуку обмінників в базі і їх відкриття. При цьому шукаються як 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-карті з обмінниками.