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

Виправлено. Чемно дякую.

Час від часу переглядаю скриптові функції - розробники додали нові, за що їм велике дякую:
@Map.GPSLocation - повертає координати позиції GPS (build 44173), додана 8.12.20;
@TabletMode [1/0] - включає/виключає режим планшета - приховує/відображає панель інструментів, панель закладок, головне меню програми. Застосована без аргумента - повертає 1 або 0 (build 44169), додана 4.12.20.
Кнопка на панелі інструментів може містити скрипт для переключення режимів;%Events.OnActivateMap $TM=@TabletMode @Goto $TM %0 @TabletMode 1 @Break %1 @TabletMode 0@Text[N].Clip Char - видаляє в кожному елементі (рядку) текстового блоку Text[N] всі символи зліва (починаючи з першого) до останнього входження символу Char включно (build 44169), додана 4.12.20.
Залишає рядок без змін, якщо Char в рядку не знайдено.

Щодо функцій @Text[N].Delimiter та @Text[N].DelimitedText роз’яснення вже були, тому лишається одне питання:
@SingleClickDialogs [1/0] - включає/виключає режим відображення якого діалогового вікна? Такого, що містить атрибутику об’єкта, вибраного в режимі планшета?

Доброго дня.
Чи є можливість перевірити Буфер обміну (чи є в буфері значення) скриптовою функцією?
Суть питання наступна:
Є скрипт, в якому є функція @Run (відкрити зовнішню програму, яка в свою чергу відкриває Exsel-файл). Зовнішня програма копіює значення файлу в Буфер обміну.
Але після запуску зовнішньої програми, скрипт продовжує працювати далі, не чекаючи завершення відпрацювання зовнішньої програми.
Мені потрібно призупинити виконання скрипта, до того моменту поки зовнішня програма не скопіює дані в буфер (а це може бути від 1 рядка до 10 000 рядків в Exsel)
От як перевірити що зовнішня програма вже завершила свою роботу, і я можу продовжити виконання скрипту (тому що для подальшої роботи скрипту потрібні дані з Буфера)
Дякую!

А що, зовнішня програма лише для того, щоб відкрити файл Excel? Його ж можна відкрити функцією @Run, вказавши замість файла зовнішньої програми, файл Excel.
Інша справа - очікування скрипта, поки запуститься Excel! Можна застосувати функцію dll, яка чекає (максимум - протягом часу Param3 в мілісекундах) поки вікно з класом Param1 та/або назвою Param2 відобразиться на екрані. Повертає 1 - якщо форма відобразилася на екрані протягом Param3 мілісекунд, або 0 - якщо час закінчився а форми на екрані так і не було. Якщо Param1 або Param2 відсутній, то символ “/” повинний вказуватись, при цьому або Param1 або Param2 повинний вказуватись обов’язково.
Перед застосуванням функцій, файл Functions.dll (від 12.12.20) треба закинути в теку Digitals і перезапустити програму. @DLLExec Functions.WaitFormForClassAndCaptionActivated [Param1]/[Param2]/Param3 (клас головного вікна Excel - XLMAIN).

Далі - функція, яка під’єднується до активної відкритої книги Excel і запускає процедуру VBA, записану в книзі. Вона чекає, поки виконається процедура.

@DLLExec Functions.ExecutProcVBA NameProc/Param де NameProc - назва процедури VBA, записаної в активній відкритій книзі Excel; Param - аргумент процедури VBA. Якщо аргумента процедури немає, символ “/” однаково вказується.

Значення з нерозривного діапазону клітинок активного аркуша активної книги Excel, після виконання процедури VBA, можна в скрипті отримати як результат функції GetValueRangeExcel Row,Coll,ShiftRow,ShiftColl,StrSepar[[,LastRow][,LastCol]] в якій квадратні дужки означають необов’язковість аргументу; Row і Coll - номер рядка і номер стовпчика лівої верхньої комірки діапазону аркуша; ShiftRow і ShiftCol - зміщення рядка донизу і зміщення стовпчика вправо до правої нижньої комірки діапазону; StrSepar - один або декілька символів для розділення значень в рядку отримуваного масиву; LastRow (Const) - ознака звузити діапазон до останнього заповненого рядка в першому стовпчику діапазону; LastCol (Const) - ознака звузити діапазон до останнього заповненого стовпчика у першому рядку діапазону.
Приклад виклику зі скрипта: $Str=@DLLExec Functions.GetValueRangeExcel 12,169,19,50, ,LastRow,LastCol $CntText=@Text.Text $Str

Інший варіант: знаючи клас форми вікна зовнішньої програми, після її виклику в скрипті застосувати функцію @Wait 0 ClassName - очікування скрипта, поки вікно з класом форми ClassName відображається на екрані. Клас форми вікна можна подивитись цією програмою.

@Text.Paste з аналізом вмісту текстового блоку.

12.12.20 Додано функцію OpenFileWithAsocProcAsinhron FullFileName, яка дозволяє відкрити зі скрипта файл в програмі, асоційованій з розширенням файлу (FullFileName - повна назва файла, включаючи шлях та розширення). Скрипт Digitals буде очікувати, поки запущена програма виконується. Функція повертає рядок: “1” - якщо програма для розширення файлу знайдена і мала би запуститися; “0” - якщо відповідної програми, в асоціації з роширенням файлу, не знайдено. Приклад виклику зі скрипта$ProgFold=@ProgramFolder ;Повна назва файла, який необхідно відкрити $Str=$ProgFold\Favorites\Площа за координатами.xls $Rez=@DLLExec Functions.OpenFileWithAsocProcAsinhron $Str @If $Rez=0 then @Break Не вдається запустити $Str||Відсутня асоціація програми з розширенням файлу. @Dialog.Message Виконано $Str

Пробував цей варіант, не пішло.
Працюю так, запускаю код написаний на Python:

;передаю назву Excel файла в зовнішню програму @Text.Add $SR @Text.Copy $FC=@Text.Count ;запуск зовнішньої програми @Run "D:\Експорт\ExcelToClipboard.py"
Чекаю щоб відпрацював код, і скопіював дані з Excel в буфер

$FC=@Text.Count ;@While $FC<2 %stop %Loop ;чекаю 8 секунд @Wait 8000 ;----------------------------------------------------------------- @Text[1].Clear @Text[1].Paste $FC=@Text[1].Count @if FC=0 then @Goto %Loop
Працює, але завжди є ризик, що за 8 секунд зовнішня програма передасть не ввесь вміст Excel.
Або ще варіант, замість копіювання в буфер, приходиться потрібні дані з Excel зберігати в TXT-файл, а в скрипті завантажувати вже дані з TXT.

Зовнішня програма має своє вікно? Зовнішня програма відпрацьовує і закривається? Вікно Excel активне? Excel після відпрацювання скрипта Digitals можна закривати?
Скиньте в ЛС.

А що, отримати значення з нерозривного діапазону клітинок активного аркуша активної книги Excel, не підходить?

Наприклад:$Char=@Calc Char(9) $Char=@DequoteText $Char $ProgFold=@ProgramFolder @Run $ProgFold\Favorites\Functions.xls $Rez=@DLLExec Functions.WaitFormForClassAndCaptionActivated XLMAIN//10000 @If $Rez=0 then @Break Книга $ProgFold\Favorites\Functions.xls не відкрилася за 10с. $Rez=@DLLExec Functions.GetValueRangeExcel 2,1,500,2,$Char,LastRow,LastCol @DLLExec Functions.CloseWindowWithClasOrAndCaption XLMAIN/ @Dialog.Message $Rez

Підкажіть, що означає ця опція в коді панелі інструментів? Чому вона не у всіх наявна? І як її відключити?

Доброго дня.
Як відключити фоновий колір панелі інструментів? Думаю немає необхідності це робити. Просто наявність такого параметра вікна панелі інструментів - можливість його змінювати. Гадаю раніше цей колір змінювати не можна було, а тепер - можна.

Маю кілька питань до розробників:

Ще помітив деяку особливість роботи скриптової функції @Map.CalculateZ X Y [ParamIndex]: вона повертає в різних ітераціях циклу різний результат при однакових значеннях аргументів! Прямо містика якась (на відео). Сантиметри - не суттєво, однак буває й пів-метра. В принципі і це - не біда, але сама причина в чому може бути :question:

Наперед дякую за відповідь.

P.S. Ось фрагмент скрипта;;;;;;ВНРМ з карти для другої точки горизонтального прокладення, вирахуваного з верткута %GetZNovWithHor $Z2Nov= @Map.CalculateRange $Z2Nov=@Map.CalculateZ $X2Y2Nov ;$Z2Nov=@Calc Numeric("$Z2Nov") @Dialog.WaitBox Визначатиметься висота точки $X2Y2Nov ;$Z2Nov=@RoundTo $Z2Nov 2 $A=@Dialog.WaitBox Висота точки $X2Y2Nov рівна $Z2Nov|Повторити? @If $A=1 then @Goto %GetZNovWithHor

Проблема в тому, що наявність такої опції (колір фону - хоч насправді там ніякого кольору фону в панелі від цього немає) - це одиничний випадок. У всіх програмах навіть на найновіших версіях таке відсутнє. Підозрюю, що це десь в налаштуваннях програми є якась опція, яку користучач включив колись і вона постійно додає даний ряок. Але знайти таку не можу ніде. Суть проблеми в тому, що через додавання програмою цього рядка перестає працювати скрипт. Додається цей рядок тоді, коли панель інструментів перемістити в інше місце на екрані. Таким чином ця програма вносить свої зміни у файл tlb. Після цього скрипт уже не працює.
Найпростіший вихід тут, мабуть, перевстановити заново програму, адже за замовчуванням у всіх ця опція відключена.

Щодо функції @Map.CalculateZ, спробував в себе - в мене вона завжди видає одне значення. Але дана функція, якщо заповнений параметр Z у вхідних даних - тоді просто читає його значення. Можливо ви перед тим в коді змінній $X2Y2Nov присвоюєте окрім Х і У ще і Z якимось алгоритмом, який щось додає кожного разу до Z?

Насправді там кольори фону в панелі є[attachment=0]Background.png[/attachment]

В константах дивилися? Хоча в константи пишуться в Ged.ini при закриванні програми. Скажу більше: зміна фонового кольору панелі інструментів не фіксується в Ged.ini ніяк. Тому цей атрибут панелі стосується кожної такої - окремо.

Скрипт у Вас читає текст іншого скрипта з певних рядків файла TLB, і тепер номера рядків не співпадають? Чи пропонуєте прибрати фоновий колір панелі із-за того, що у Вас скрипт перестав працювати?

Дякую. Ви праві.
Якщо в точці з плановими координатами $X2Y2Nov=5347324,10 1349492,79 вже є точка іншого об’єкта, і вона має висоту Z=1235,50, то @Map.CalculateZ 5347324,10 1349492,79 поверне 1235,50 (це якщо “вхідні дані” - всі об’єкти, висоти точок яких беруть участь в інтерполяції висоти). Якщо ж Ви маєте на увазі необов’язковий аргумент [ParamIndex], то це ж - не висота. До наведеного мною скрипта, треба ще й відео дивитися: там же - повідомлення скрипта. На крайняк можу скинути повний лог-файл, який я розібрав “по-кісточкам” (там всього 1500 рядочків)…

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

Тобто, Ви колір в панелі поставили просто вручну додавши у файл tlb тег Background= ?
В константах (Сервіс-Налашутвання) я перевіряв - нема там такого (звіряв два списки: коли наявна ця опція і коли відсутня - ідентичні)
Якогось пункту в контекстному меню кнопки, який би встановлював колір також немає. Пробував ставити нестандартний фон загального вікна (меню Вигляд) - нічого не змінює.
Якщо в Ged.ini також не фіксується, то це дуже дивно.
Бо я на комп’ютер користувача скидую свій файл tlb без тегу Background. І як тільки посуваю кнопку вбік в нього - зразу цей тег появляється. Отдже, десь воно в програмі таке включено.

Спробував додати в себе вручну чей тег. Тепер він у мене також став наявний і не можливо його стерти. Додався в кожний файл tlb. Видалення Ged.ini не допомагає. І куди ж воно прописалося, зараза така?

П.С. Закрив програму, видалив усі скрипти (усі файли tlb), видалив файл Ged.ini. Запустив програму, створив новий скрипт - а програма в нього зразу додала тег Background. Як це відключити? Як воно включилося? Де воно зберігається? :question:

П.П.С. Чи цей тег після оновлення програми тепер у всіх буде?

Так. При закритій програмі Digitals в текстовому редакторі змінюєте/додаєте атрибут Background панелі інструментів у файлі TLB. Запускаєте програму - і маєте відповідний колір панелей.

Я мав на увазі, що значення якоїсь константи є ознакою “змінювати, чи не змінювати атрибути панелі інструментів у файлі TLB при зміні їх в сеансі роботи програми”, а не саме значення атрибута Background. Хто зна… . Для чого, наприклад, константа ToolbarOptions зі значенням 0 :question: Ніхто ж не питає! А розробники і не кажуть: хто замовив - той, мовляв, знає. Але ж це жлобство, знає і мовчить :wink:

Чого це зразу - “зараза”, це - корисна штука. Підозрюю, що такий атрибут пишеться у файл TLB самим модулем Ged.exe починаючи з якогось-там збирання.
А чому б Вам не переглянути скрипт, який дивним чином “перестав працювати” при наявному атрибуті Background в панелі інструментів? Хіба причина може бути в цьому?

У недавній версії ged.exe з’явилось збереження background-атрибута панелі інструментів. Старі версії його проігнорують і колір панелі лишиться таким як колір кнопки у поточній темі оформлення Windows (Background=-16777201)
Позитивні значення цього атрибуту - RGB-колір панелі.

І як користувачу змінити цей колір? Відкривати скрипт блокнотом чи що?

Кнопки мають окантовку довкола іконки, яку також було б добре змінювати, бо інакше це не гарно виглядає.

Як поставити білий колір фону кнопок?
RGB — 255,255,255 не підтримується, #ffffff також

підтримуються лише десяткові значення (R+G256+B256*256), де R,G,B - кольорова тріада 0..255
білий: Background=16777215
червоний: Background=255
чорний: Background=0
від’ємні значення - деякі константи Delphi

Колір кнопок змінити можна лише для усіх застосунків ОС, у Віндовс 7 і нижче був відповідний інструмент


У Віндовс 10 змінити окремо колір кнопки не можна, тільки разом з темою.

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

Або ще так: коди кольорів звідси в стандартному калькуляторі[attachment=0]Code.png[/attachment]

І знову я, зі своїми висотами!

Запускайте скрипт

$X1=5347300,35 $Y1=1349511,33 $X2=5347299,72 $Y2=1349510,12 $Z1=@Map.CalculateZ $X1 $Y1 @Wait 500 $Z2=@Map.CalculateZ $X2 $Y2 @Dialog.WaitBox Перша точка:|$X1 $Y1 $Z1|Друга точка:|$X2 $Y2 $Z2|Перевірте висоту другої точки!! ; $Z2=@Map.CalculateZ $X2 $Y2 @Dialog.WaitBox Перша точка:|$X1 $Y1 $Z1|Друга точка:|$X2 $Y2 $Z2|Перевірте тепер, висоту другої точки!!у карті[attachment=0]Demo.dmf[/attachment]
Шановні розробники! То ж “криша” може поїхати. Невже проблема мого комп’ютера лише в тому, що корпус в нього чорного кольору?
Подивіться, будь-ласка.

Оновіть програму, скриптова функція @Map.CalculateZ завжди буде інтерполювати висоту. Раніше використовувався попередній результат інтерполяції, якщо відстань від попередньої точки не перевищувала точності карти (залежить від масштабу карти та точності карти на папері) для прискорення інтерполяції позиції курсора.

Тепер все зрозуміло. Дуже дякую за вдосконалення :smiley:

Доброго дня розробникам.

Чи можна трішки, детальніше про @Map.ObjectLabel Formula - “Изменяет формулу метки объекта, заданную в Константах” і @Map.Object[N].GetPublicMapInfo - “Заполняет атрибуты участка с ПКК”?
Цікавить про мітку об’єкта та її формулу.

Дякую.