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

Вам потрібен цикл по власниках. Хтось тут на форумі вже викладав раніше цей код (може, навіть, і Діма Золотар). Він створює новий параметр ID7000580, в який записуються усі співвласники. З нього потім можна підтягувати інформацію у ваші шаблони.

П.С. Цей параметр при збереженні ХМЛ просто зникає

$MON=0
$MC=@Map.Count
@if $MC<1 then @Goto %Exit
;создаем параметр ID7000580 при отсутствии
$S=@Map.Parameters.Get ID7000580
@if $S= then @Map.Parameters.Add 7000580 5 Список власників
;добавляем параметр ID7000580 в список доступных слою XML : Земельна ділянка
$S=@Map.Layers.GetValidParameters ID70005
@Map.Layers.SetValidParameters ID70005 $S ID7000580
;цикл для всех объектов в карте
%NextObject
$MON=$MON+1
;проверка слоя объекта
$LID=@Map.Object[$MON].LayerID
@if $LID<>70005 then @Goto %IgnoreObject
;получаем значение параметра, содержащего информацию о собственниках
$PP=@Map.Object[$MON].Parameter[ID7000520]
;определяем кол-во собственников
$PC=@XML.NodeCount /Proprietors ProprietorInfo $PP
;пропускаем незаполненные
@if $PC<1 then @Goto %IgnoreObject
;для каждого собственника
$I=0
$Res=
%Loop
$I=$I+1
;определяем тип (юр. или физ. лицо)
$IsLE=@XML.NodeCount ProprietorInfo[$I]/Authentication LegalEntity $PP
@if $IsLE=1 then @Goto %LegalEntity
;для физлиц получаем
;фамилию
$LN=@XML.XPath ProprietorInfo[$I]/Authentication/NaturalPerson/FullName/LastName $PP
;имя
$FN=@XML.XPath ProprietorInfo[$I]/Authentication/NaturalPerson/FullName/FirstName $PP
;отчество
$MN=@XML.XPath ProprietorInfo[$I]/Authentication/NaturalPerson/FullName/MiddleName $PP
;игнорируем физлиц без фамилии
@if $LN= then @Goto %Continue
;добавляем разделитель списка для не первых по порядку собственников
@if $Res<> then $Res=$Res,
;добавляем ФИО в Список
$Res=$Res$LN $FN $MN
@Goto %Continue
;для юрлиц
%LegalEntity
;получаем название
$N=@XML.XPath ProprietorInfo[$I]/Authentication/LegalEntity/Name $PP
;игнорируем незаполненные
@if $N= then @Goto %Continue
;добавляем разделитель списка для не первых по порядку собственников
@if $Res<> then $Res=$Res,
;добавляем название в Список
$Res=$Res$N
%Continue
@if $I<$PC then @Goto %Loop
@if $Res= then @Goto %IgnoreObject
;вносим список в параметр ID7000580
@Map.Object[$MON].Parameter[ID7000580] $Res
%IgnoreObject
@if $MON<$MC then @Goto %NextObject
%Exit

дякую! але в мене інша мета

Розібрався з кольором RGB в скриптовій команді @Map.Layers.SetAttributes Number Symbol PenStyle PenColor PenWidth BrushStyle BrushColor State Font_Name FontSize FontStyle FontColor
Наприклад задача:
значення параметра BrushColor, якщо необхідно встановити колір заливки RGB 178 0 153, розраховується представленням RGB у вигляді десяткового числа через шістнадцяткове від старшого байта.
Вирішення:
відповідно один під другим
178 0 153 - десяткові значення байтів;
B2 00 99 - шістнадцяткові значення байтів.
Шістнадцяткове від старшого байта 9900B2 - у десятковому численні 10027186.
Відповідь:
Щоб отримати колір заливки RGB 178 0 153, значення параметра BrushColor має бути рівним 10027186.

Доброго здоров’я. Треба приклад скрипта для імпорту данних з ексель таблиці.
Маємо:

  1. таблиця з ПІБ, кад №, датою початку договору оренди, датою закінчення договору оренди, № паю…
  2. Карту XMLNormal.dmf з вставленими в неї XML.(з усіма шарами), є параметр який прописує ПІБ:
    7001009=XPT(P[ID7000520],“/Proprietors/ProprietorInfo/Authentication/NaturalPerson/FullName/LastName”) Прізвище власника
    7001010=XPT(P[ID7000520],“/Proprietors/ProprietorInfo/Authentication/NaturalPerson/FullName/FirstName”) Ім’я власника
    7001011=XPT(P[ID7000520],“/Proprietors/ProprietorInfo/Authentication/NaturalPerson/FullName/MiddleName”) По батькові власника
    7001012=P[id7001009]_P[id7001010]_P[id7001011] ПІБ Власника
    і кад.номер
    Треба щоб скрипт шукав у файлі ПІБ, в цьому рядку, але в іншій колонці брав дати - номери реєстрації, № паїв і прописував в потрібні параметри в карті.
    може в когось щось є подібне, поділіться будьте ласкаві. :smiley:

А можно сделать такой скрипт, который будет копировать власника земельної ділянки и вставлять эти значения в отримувача державного акта?

Може це підійде - Библиотека полезных скриптов - #73 від user228

Всем привет. В ходе работ по проверке подрядчиков, появилась необходимость в проставлении им ошибок в слое Errors с ID9. Одна из ошибок должна ставиться в виде крестика, что означает, что перечеркнутый этим крестиком объект нужно удалить. Можно ли написать такой скрипт, чтобы при нажатии кнопки этот крестик ставился в заданном слое над помеченным объектом?
.JPG

Если слой ID9 точечный с условным знаком “крестиком”, то скрипт такой:
@Map.AddNodes ID9 4

Доброго дня всім.
Тема на обговорення: чи можна на скриптовому рівні підписати карту разовим скриптовим підписом?

Карта збирається виконавцями підрозділу-1 і для подальшої роботи передається одному працівнику-прийомщику. Прийомщик виконує перевірку якості отриманої карти скриптом, і якщо помилок немає - віддає карту для подальшої роботи виконавцям підрозділу-2.
Яким чином заставити виконавців підрозділу-1, перед здачею карти прийомщику, виконати скрипт перевірки? Щоб карта на прийомку приходила з такою собі ознакою: “скрипт перевірки на цій карті було пройдено, і помилок в карті гарантовано немає, і карта після перевірки жодного разу не відкривалась”?

  1. Коли карта готова до здачі прийомщику, виконавець підрозділу-1 запускає скрипт перевірки карти, який:
  • за умови виправлення виконавцем відловлених скриптом помилок, додає до карти об’єкт “P” у певному шарі;
  • дописує до карти скрипт обробки події %Events.OnFileOpen, зберігає зміни в карті та закриває карту.
    Результатом є карта, підписана разовим скриптовим підписом, принцип роботи якого нижче описаний.
    Якщо карта відкривається після підписання - запускається скрипт %Events.OnFileOpen, який:
  • за наявності в карті об’єкта “P” видає на екран повідомлення “Карта належної якості, оскільки перевірена скриптом”, видаляє з карти об’єкт “P” і зберігає зміни в карті;
  • за відсутності в карті об’єкта “P” видає на екран повідомлення “Карта сумнівної якості, оскільки відкривалась після перевірки скриптом”
  1. Прийомщик, коли приймає карту, відкриває карту і … Момент істини:
  • приймає карту, якщо підпис діючий;
  • не приймає карту, якщо підпис злетів.

З усього цього, питання до розробників: чи можна скриптовою функцією додати до карти скрипт обробки події рівня карти? А рівня шару?

Вибачте за складність викладу інформації :blush:

Я правильно зрозумів? Вам потрібний контроль, чи оброблялася карта певним скриптом?

Якщо так, то, можливо, підійде наступний варіант. В скрипт за допомогою функцій @Text добавляється код, який записує в певний текстовий файл на комп’ютері певне контрольне значення (для прикладу, цифра 1) і навпроти - шлях чи назва карти.

Потім ви собі відкрили цей файл і побачили, які карти оброблялися, а які ні. Чи, якщо таких багато, можна написати ще додатковий скрипт, який шукає по створеному списку, чи дана карта оброблялася.

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

Є тільки можливість добавляти скриптом скрипт рівня кнопки, редагуючи, чи створюючи файл .tlb

Такого контролю - реєстрації в текстовому файлі факту виконання скрипта контролю для карти мало. Треба забезпечити реєстрацію вдалого виконання скрипта контролю в самій карті.
Ви спитаєте: для чого в карті? Я відповім: щоб наступне, після разового скриптового підписання карти, її відкриття, скидало цей підпис у скрипті обробки події %Events.OnFileOpen з виведенням повідомлення “Карта не відкривалась з тих пір, як в ній виправлено всі помилки скриптом контролю”.

В запропонованому Вами варіанті є такий нюанс:

  • виконавець перевірив карту скриптом перевірки, таки добравшись до завершення скрипта (ліквідував усі помилки, виловлені скриптом), і скрипт контролю добавив запис у текстовий файл про те, що карта перевіркою пройдена;
  • виконавець після перевірки вніс зміни в карту, при цьому допустив помилки, а скрипт контролю йому “по-боку”, або просто забув за нього.
    Колізія получається: і запис про контроль в текстовому файлі є, і помилки в карті є.

А так, в кінцевому результаті, матимем контроль прийомщика над виконавцем, щодо якості зданої виконавцем карти.

Можливість скриптом-1 додати скрипт-2 обробки події карти. От що треба мати. Наявність першої такої (з блоку скриптових функцій роботи зі скриптами) функції, дасть можливість реалізувати підписання карти разовим скриптовим підписом.

Ну тоді можна при перевірці вашим скриптом, при збереженні файлу, в певний параметр карти добавляти дату перевірки (чи замість карти в той же список).

Якщо дата внесення змін у файл не співпадатиме із датою, внесеною в контрольний параметр - значить файл редагувався після перевірки скриптом.

Але це буде працювати тільки при умові, що зміни не вносилися в той же день, що і перевірка скриптом, бо не вистачає ще, окрім @Date, функції @Hour

Дякую за сумісний пошук вирішення. Варіант можливий. Але Ви правду кажете: шкода, що немає функції, яка повертала б поточний час. Навіть якби функція часу була - треба записувати час збереження змін, а це - скрипт обробки події рівня карти %Events.OnFileSave.

В тому то й справа, що треба мінімізувати наявність людського фактора. Прийомщик не має пам’ятати, що йому треба не забути подивитись відповідність часу останнього збереження і часу закінчення скрипта перевірки. На тепер, діюча наша інструкція рясніє словами “обов’язково не забути”, або “уважно слідкувати щоб…”. Нехай скрипт обробки події відкриття карти слідкує. Та як там, в карті, є помилки, то нехай скрипт обробки події відкриття карти, після виведення повідомлення, взагалі закриває карту і забезпечує таким чином відсутність можливості прийняти карту зі “злетівшим” підписом.

Щодо часу завершення скрипта, є вихід. Скрипт контролю:

  • починає писати лог-файл @OpenLog;
  • після збереженням карти @Map.SaveToFile завершує лог-файл @CloseLog [Filename];
  • вичитує з лог-файла час завершення команди збереження карти з точністю до тисячної долі секунди в змінну $Time;
  • створює об’єкт “Р”, значення параметра якого встановлює $Time;
  • додає до карти скрипт обробки події %Events.OnFileOpen з первіркою при наступному відкритті карти значення параметра об’єкта “P”, чи рівне $Time;
  • повторно зберігає карту.

Як не крути, а все повертаюсь до необхідності скриптом з кнопки додати в карту скрипт обробки події рівня карти. Хто мене переконає в іншому? Буду дуже вдячний, бо вже можна заплутатись. Рішення десь близько :confused:

Роблю скрипт на основі цього [url]Библиотека полезных скриптов - #96 від fendak]
який повинен добавляти на карту ділянки з бази.

$ActivateMap=@ActivateMap
@Text[1].Load D:\BazaWork.txt
$FC=@Text[1].Count
$I=0
@Map.BeginUpdate
@Progress.Start $FC Процес створення бази
%Loop
$I=$I+1
@Progress.StepBy
$rogress=@Progress.Canceled
@if $rogress=1 then @break Зупинено на файлі $I-1 $FN
@if $I<$FC then
$FN=@Text[1].Line[$I]
@FileOpen $FN
@Map.SelectAll
@Map.Copy
$CopyMap=@ActivateMap
@CloseMap $CopyMap
@ActivateMap $ActivateMap
@Map.Paste
@if $I<$FC then @Goto %Loop
@Progress.Stop
@Map.EndUpdate

Але зіткнувся з двома проблемами:
1.Довго формується, потрібно дуже багато часу.
2.Зайнятий буфер обміну на компютері. Не можна більше нічого копіювати і вставляти.

Чи є способи пришвидшити це якось?

Якщо просто взяти перетягнути папку з ділянками на Digitals, то це також займає дуже багато часу, не вистачає дня. А потім, відмінивши, не знаю, на чому стало, щоб продовжити.

$FC=@Text[1].Load D:\BazaWork.txt @If $FC=0 then @Break Відсутні дані у файлі D:\BazaWork.txt $I=1 @Map.BeginUpdate @Progress.Start $FC Процес створення бази %Loop @Progress.StepBy $rogress=@Progress.Canceled @if $rogress=1 then @Map.EndUpdate RefreshAlways @if $rogress=1 then @break Зупинено на файлі $I-1 $FN $FN=@Text[1].Line[$I] $FileExist=@FileExists $FN @If $FileExist=0 then @Goto %LoopNext @Map.InsertFromFile $FN %LoopNext $I=$I+1 @if $I<=$FC then @Goto %Loop @Progress.Stop @Map.EndUpdate @Dialog.Message Виконано

дякую :slight_smile:
По часу не скоріше, але хоч буфер вільний завдяки @Map.InsertFromFile

К сожалению нет. Это полигон/полилиния и менять шаблон нельзя. В этом и вся проблема.

Визначайтесь. Або скрипт додасть шар (щоб в карті, тим самим натисканням кнопкою на об’єкті створювався точковий об’єкт), або скрипт додасть параметр, значення якого заповнить прикметою помилковості та відобразить карту в тематичному вигляді.
В будь-якому випадку, це означає змінити шаблон. “Поставити помилку в шарі Errors з ID9 кнопкою” - означає “перевести об’єкт в шар Errors с ID9”? Як на мене, задача може вирішитись лише зі змінами в шаблоні карти.

Як змінити “;” на “пробіл” за допомогою скрипта ???

ReplaceCrapkaComma.dsf

$S=@Calc replace(“$PARAMETERS”,“;”," ")
$Result=@DequoteText $S

у даному випадку просто видаляються “;”

Як варіант, пропоную: функціональний скрипт з архіва в папку Digitals\Library. Виклик функціонального скрипта зі скрипта:

$ResText=%Library.ReplaceChar1WithChar2 Text|CharWith|CharReplace

Функціональний скрипт %Library.ReplaceChar1WithChar2 Text|CharWith|CharReplace приймає один параметр Text-рядок тексту, в якому треба замінити знак CharWith на знак CharReplace. Знак CharWith і CharReplace - не літери. Якщо CharReplace пробіл - передуючі пробіли ліквідовуються, кінцеві - ні. Функціональний скрипт не можна застосовувати для заміни літеральних символів.

Якщо CharReplace - пробіл:
$Space=@Calc Char(32)
$Space=@DequoteText $Space
$ResText=%Library.ReplaceChar1WithChar2 Text|CharWith|$Space
ReplaceChar1WithChar2.rar (626 Bytes)