тут я згідний на всі сто відсотків.
А ще вибачаюсь за неуважність, бо я відправив неправильний код у першому повідомленні. Мало бути так:$Line=для будівництва і обслуговування житлового будинку, господарських будівель і споруд (присадибна ділянка)
$Line=@Calc Replace("$Line","(","/")
$Line=@DequoteText $Line
@Dialog.Message 1 $Line
$Line=@Calc Replace("$Line",")","/")
$Line=@DequoteText $Line
@Dialog.Message 2 $LineСпочатку замінити ліву дужку потім праву. Але результат всерівно негативний, чому? для мене ще загадка )
Там проблема функцiї @Calc при аналiзi токенiв (частин написаного Вами коду) i коли попадається знак ( вiн повиннен закритися вiдповiдно знаком ), якщо це якась функцiя, а цей символ може попасти i в текстi, як у Вашому випадку i пiсля першої замiни немає закриваючого символу ), чи навпаки - початку (, тому помилка. Розробникам необхiдно внести поправку в дану функцiю.
були у мене здогадки, що проблема у самій функції (через це і звернувся на форум). Просто для інформації - робив експерименти з @Calc String(x) і @Calc Char(x) проміжні перетворення, але теж нічого путнього не вийшло. Тепер ясно що до чого, буду спати спокійно, бо з голови не виходить проблема поки не зрозумію її логіки. Ще раз дуже дякую!
наприклад: зворотній слеш перед символом, на який функція не повинна звертати увагу (не сприймати його командним або семантичним) $Line=для будівництва і обслуговування житлового будинку, господарських будівель і споруд (присадибна ділянка). Але це потягне за собою додаткові “витрати”, тому що потрібно спочатку прописати цей символ \ у рядку чи параметрі… (думки вголос)… Краще напевне так @Calc Replace{“s”,“t”,“v”} або @Calc Replace[“s”,“t”,“v”] - але тоді “додаткові витрати”.. - тут дехто посивіє від таких змін
Нi, це не так складно i вирiшується лише однiєю умовою: коли текст, тодi не брати до уваги дужки, в iншому випадку аналiзувати, як формулу. Розробники зрозумiють .
Доброї пори доби розробникам.
Хочу запитати, стосовно згаданого: чи можна зробити так, щоб властивість Top Most вікон класу TFormListDialog, або того ж таки TFormProcessing програми Digitals відновлювалась в True при повторному виклику вікна зі скрипта командою @Dialog.ListSelect або @Dialog.WaitBox?
Якщо не доцільно після завантаження згаданих вікон з властивістю Top Most=True та їхнього погашення очищати пам’ять, то при повторному їх виклику зі скрипта встановлюється властивість Visible в True, але вікно - на задньому плані відносно головного вікна Digitals .
Я припускаю, що Z-порядок вікон плутає код моєї зовнішньої програми, до якої Digitals не має діла. Тоді моє прохання - як “чужими руками жар загрібати” . Але ж “стійкість” програми Digitals буде тоді кращою. Чи не так?
З вікнами я зрозумів, що ніяка програма (в тому числі й Digitals) не має права сунути свої вікна у TopMost, без маршалингу і, якщо “ламеру” так сильно треба - він вже має бути трохи не ламером .
Чергове питання: на якому етапі запуску програми Digitals, можна посилати на його сервер команди по TCP/IP?
Дослідним шляхом, з необхідністю гасити вікно попередження про демо-режим Digitals зовнішньою програмою, виявив такий порядок:
реєстрація головного вікна в системі зі стартовим заголовком (можна отримати дескриптор головного вікна, однак заголовок вікна не містить фразу “(Demo)” якщо ключа захисту немає); 2) запуск сервера команд Digitals (можна отримати режим роботи Digitals, пославши на сервер команду @DemoMode);
зміна заголовку головного вікна (можна отримати режим роботи Digitals за наявністю фрази “(Demo)” у заголовку головного вікна);
реєстрація вікна повідомлення про демо-режим в системі зі стартовим заголовком головного вікна програми (можна отримати дескриптор вікна повідомлення про демо-режим);
відображення головного вікна програми на екрані;
відображення вікна повідомлення про демо-режим на екрані.
Будь-ласка, поставте пункт 2 на своє місце у черговості. Чи він на своєму місці? Гасити вікно повідомлення про демо-режим можна лише після пункту 6.
Чемно дякую розробникам за надану з 28.07.20 можливість вказати значення константи DemoWarning=0, при якому попередження про демо-режим виводитись на екран не буде.
Здравствуйте коллеги, может быть кто подскажет, буду очень признателен! Как организовать скрипт который будет брать название файла XML и вставлять его в каком-нибудь шаблоне (Обменники у нас названы все своей нумерацией(по контурам) и нужно что бы в документации с названии файла подтягивало номера контуров в шаблоны).
Можливості автоматизації операцій в Digitals постійно розширюються шляхом додавання розробниками нових скриптових функцій. Так за останній місяць з’явилися: @ScanQuarters, додана в build 44116 (12.10.20); @Map.SelectEmptyQuarters, додана в build 44123 (19.10.20);
а ще - додані в build 44137 (02.11.20) @MirrorFile Size Filename; @InsertOrthoFragments Folder; @OrthoCutIntoSheets [OutFolder] - мабуть Орто > Порізати на аркуші; @RescanQuarters.
Хотілося би мати пояснення до кожної функції у відповідному текстовому полі вікна редактора скриптів (в тому числі - яке значення вони повертають у скрипт).
Бачу, що розробникам Digitals вдалося відновити доступ до ПКК і уже знову працює функція @Map.GetPublicMapParcelInfo
А як з функцією @Map.GetPublicMapQuarterInfo? Чи можна відновити і її?
Функція @Map.GetPublicMapParcelInfo працює, але ще не в усіх кварталах. За допомогою меню Реєстри-Земельна ділянка отримайте інформацію про одну з ділянок в кварталі, тоді за декілька хвилин можна буде отримати інформацію по кожній ділянці у цьому кварталі.
Функція @CheckPublicMapParcel працює за умови працездатності ПКК/е.-кабінету, останнім часом з цим часто виникали пролеми.
Доброго дня розробникам.
Маю до Вас невеличке питання: який збіг обставин впливає на роботу скриптової функції @Map.CalculateZ X Y [ParamIndex], що повертає результат інтерполяції висоти в точці X Y рівний 0?
Трапляється таке не часто - приблизно в одному з 20-ти запусків скрипта, в якому циклічно перебираються планові координати для визначення висот вказаною функцією. Тобто: раз на 20 запусків такого циклу, @Map.CalculateZ X Y [ParamIndex] повертає 0 в усіх ітераціях
Лог-файл каже наступне23:20:00.838 $Z2=MAP.CALCULATEZ 5347241,50128287 1349438,23848208
23:20:00.838 0Не втямки мені - у чому причина? В карті всім об’єктам призначені висоти (крім растрових зображень, статус яких - лише відображення). Не хотілося би переписувати скрипт на ЦМР | Перепризначити висоти, то ж питання довіри до результатів функції або просто: я чогось не враховую
P.S. Я розумію, що питання “розмите”, але може би Ви протестували.
Дякую, але щось воно не працює так. Ввів в меню Реєстри пошук ділянки з кадастровим номером 4621288200:01:004:0328. А функція @Map.GetPublicMapParcelInfo і дальше не читає кадастровий номер даної, чи інших ділянок в цьому кварталі навіть через годину.
Але в деяких кварталах функція справді працює.
Доброї пори доби розробникам.
Воюю далі з обробкою події зміни об’єктів - власне у скрипті треба виконати перепризначення висот точок змінених об’єктів.%Events.OnChange
;Зняти маркування точок редагованого активного об'єкта
$N=@EventObject
$CountMark=@Map.Object[$N].GetMarkedPointsCount
@If $CountMark<>0 then @Map.Selected.MarkPoints CLEAR
;Позначити всі редаговані об'єкти
$ListChange=@EventObjectsList
$CntEventObj=@Text.Text $ListChange
@If $CntEventObj=1 then @Goto %EndSelect
$i=1
@While $i<=$CntEventObj %Loop
$NumObj=@Text.Line[$i]
@Map.SelectObject $NumObj
$i=$i+1
%Loop
;Перепризначити висоти позначеним об'єктам
%EndSelect
;Правка | Інвертувати
@ExecuteMenu EditInvert
;ЦМР | Перепризначити висоти
@ExecuteMenu AssignHeight1
;@Dialog.Message Виконано перепризначення висот
@ExecuteMenu EditInvertЯкщо перетягнути точку активного об’єкта, наведений скрипт обробки події відпрацьовує коректно, однак точка опиняється там, де був вказівник миші на момент завершення скрипта.
Якщо маркувати фрагмент і перетягнути одну з маркованих ліній, схопивши мишою центр лінії - треба щоб рука без тремору, інакше виникає помилка звертання програми до пам’яті як тільки вказівник змінить своє розташування до закінчення роботи скрипта. А якщо з цього ж таки скрипта запустити процедуру VBA (застосовую самописну функцію dll, яка поверне управління скрипту лише після її виконання), перетягнути маркований фрагмент без виникнення помилки звертання до пам’яті взагалі неможливо.
Переписав би замість ЦМР | Перепризначити висоти на @Map.CalculateZ X Y [ParamIndex], так у неї своя глюка. Здається - край як треба блокувати мишу на час виконання скрипта .
Порадьте, будь-ласка, який вихід? Чи варто дивитися в сторону SetWindowsHookEx?
P.S. Почекайте! А чому це подія %Events.OnChange обробляється до завершення редагування, а не після? Кнопку миші відпустили - значить закінчили редагування. Однаково ж, координати точки до редагування немає як у скрипті отримати (хіба відмінити редагування).
P.S. Знайшов тимчасове (ресурсно-залежне) рішення. Думаю що помилка звертання до пам’яті таки буде виникати на “повільних” комп’ютерах при перетягуванні точок об’єктів з великою кількістю точок:%Events.OnChange
@Map.BeginUpdate
;Зняти маркування точок редагованого активного об'єкта
$N=@EventObject
$IDEventObj=@Map.Object[$N].ID
$CountMark=@Map.Object[$N].GetMarkedPointsCount
@If $CountMark<>0 then @Map.Selected.MarkPoints CLEAR
;Позначити всі редаговані об'єкти
$ListChange=@EventObjectsList
$CntEventObj=@Text.Text $ListChange
@If $CntEventObj=1 then @Goto %EndSelect
$i=1
@While $i<=$CntEventObj %Loop
$Obj=@Text.Line[$i]
@Map.SelectObject $Obj
$i=$i+1
%Loop
;Перепризначити висоти позначеним об'єктам
%EndSelect
;;Правка | Інвертувати
;@ExecuteMenu EditInvert
;;ЦМР | Перепризначити висоти
;@ExecuteMenu AssignHeight1
;;@Dialog.Message Виконано перепризначення висот
;@ExecuteMenu EditInvert
;
;Запис позначених об'єктів (не більше 63-ох) в Get-масиви
;;для кожного редагованого об'єкта
$i=1
@While $i<=$CntEventObj %LoopObjReed
$NumObj=@Text.Line[$i]
$Obj=@Map.GetObject $NumObj
@Text[$i].Text $Obj
$i=$i+1
%LoopObjReed
;
;Видалення позначених об'єктів для визначення висоти за їхніми плановими координатами
@Map.Selected.Delete
;
;Визначення висоти і створення об'єктів
;;для кожного Get-масиву
$i=1
@While $i<=$CntEventObj %LoopObjCreate
$CntPt=@Text[$i].Line[3]
$NumLinMax=$CntPt+4
;;;для кожної точки об'єкта
$j=4
@While $j<=$NumLinMax %LoopPoint
$Str=@Text[$i].Line[$j]
;;;;пропуск розриву комплексного об'єкта
@If "$Str"="" then @Goto %NextPoint
$Mask=@StringPart 1 $Str
$X=@StringPart 2 $Str
$Y=@StringPart 3 $Str
$Z=@Map.CalculateZ $X $Y
$Str=$Mask $X $Y $Z
@Text[$i].Line[$j]=$Str
;;;;наступна точка об'єкта
%NextPoint
$j=$j+1
%LoopPoint
;;;створення об'єкта з Get-масиву
$Obj=@Text[$i].Text
@Map.AddObject 0|$Obj
;;;наступний об'єкт
$i=$i+1
%LoopObjCreate
@Map.SelectByParameters 1|-6=$IDEventObj
@Map.EndUpdate RefreshAlwaysСкрипт перепризначить висоти не більше як 63-ох об’єктів, що мають точку у перетягнутому вузлі, оскільки “В пределах одного скрипта можно, при необходимости, использовать до 63 разных списков адресуемых как Text[1], Text[2] … Text[63]”.
Таке рішення задачі - не вирішення проблеми виникнення помилки звертання до пам’яті, якщо користувач не чекаючи “везяє мишою по екрану” Шлях, як на мене, один: виправити обробку події %Events.OnChange таким чином, щоб після відпускання кнопки об’єкт не тягнувся далі за мишою. (Див. відео).
З нетерпінням чекатиму на відповідь. Наперед - велике дякую за розширення можливостей автоматизації в програмі.