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

Це не помилки логіки скриптувальників (!), а технічні помилки. І це, на мій погляд, НЕПРАВИЛЬНО З БОКУ РОЗРОБНИКІВ. Спочатку скрипти працювали за одними правилами. Тепер правила змінили і в багатьох скрипти просто перестали через це працювати. Доведеться тепер багатьом не оновлювати свої програми, а працювати на старих версіях. Бо я усім за раз не зможу оновити скрипти.

VictorR, на сайті digitals.at.ua я виклав повний опис майже усіх скриптових функцій із зручним структуруванням за їх призначенням українською мовою. Можете скопіювати їх в ексель і шукати.

Хочу вияснити що таке “технічні помилки”, але ніяк не вдається. Дядько Google каже, наприклад: Виды ошибок и основные принципы отладки, або ще Класифікація помилок і методи їхнього пошуку.

Скрипт працює за тими правилами, які ви написали: якщо те - то на мітку ТАКУ, якщо не те - то на мітку ІНШУ. А якщо у ВАШОМУ скрипті мітка ТАКА=ІНША, то це лише ВАША ПОМИЛКА, а не розробників скриптових функцій, що викликаються командами ВАШОГО скрипта.

Вибачайте, пане Миколо. Думаю скоріше доведеться вам оновлювати скрипти. Хай не за раз, і не за два. А втім - це залежить від користувачів, які ними користуються. Одне я знаю точно - свої скрипти просто необхідно відлагоджувати… і супроводжувати… щоб ними користувались. Ніхто ж не каже “давайте приберемо необхідність компілювати програмний код (в Delphi), а то при компіляції мого коду воно, гадость така, видає що в мене якась помилка в коді” :wink:.

А за додану розробниками можливість виявлення помилки логіки алгоритму - жирний +.

Під технічною розумію помилку, яка ніяк не впливає на роботоздатність скрипту (не впливала, поки не оновили Digitals)
Ось наприклад:
$MC=@Map.Layers.Count
$N=0
%PochatokSSh3
$N=$N+1
%PochatokSSh3
$Status=@Map.Layers.GetAttributes $N
$Status=@StringPart 7 $Status

Тут друга мітка %PochatokSSh3 не грала абсолютно ніякої ролі. І так би собі й було надалі, але ні, бо комусь це стало дуже заважати.

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

Я не вчився на програміста, а самоучка. Тому, роблячи скрипти, виходжу тільки з того, щоб вони працювали. Тестую їх на різноманітних випадках. І досі вони усі працювали. А те, що в коді вийшла ось така чисто технічна помилка - не побачив, бо вона не заважала. А перевіряти код на те, як він грамотно написаний з точки зору підручників з програмування - це не моє. Та й на скільки знаю, щоб писати скрипти не обов’язково бути великим програмістом. Для цього скрипти в програмі і передбачені, щоб можна спрощено зробити те, що потрібно.

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

Ладно, додали таку перевірку на дублювання міток. Не знаю хто конкретно це додав. Але хоч би по людськи це зробили якось. А то в половини користувачів видає помилку про дублювання міток, а в половини скрипт просто ніяк не реагує на запуск. І думай-гадай, що з ним не так. Можна ж було зробити, щоб хоч нормально інформувало користувачів, в чому причина того, що скрипт не запускається. Але кому це потрібно.

Правильно. Тільки не “стало заважати”, а таки конкретно дошкуляло: сам не один раз мусив аналізувати тисячі рядків лог-файла (ще не вмерла надія на режим відлагодження скриптів зі ScriptDebugger=1 в константах), щоб виловити помилку логіки алгоритму. Дублі міток спричиняли переходи не на ту гілку, на яку треба. Але в мене не було “порожніх” міток! Якщо була мітка - були й команди, що виконувались тоді, коли за логікою не повинні були виконуватись.

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

Все правильно, Миколо. І я також не вчився на програміста: складання скрипта - це ж не справа рук навіть середнього рівня програміста. І не треба бути класним програмістом, щоб зрозуміти: скрипт - це послідовність виконання команд. Послідовність ця визначається у скрипті переходами на мітки, і якщо є дві чи більше міток з однаковою назвою - то і послідовність виконання є помилковою (або одна гілка “мертва”, а значить - сміття). То байка, якщо сміття закоментоване символом “;”, але ж для помпутера символ “%” щось таки має означати? Чи у вашому випадку - нехай не означає? Так означає? Чи не означає? Для скрипта “%” - спеціальний символ переходу на таку-то послідовність дій, незалежно від того програміст перед компом, чи землевпорядник!

Так можна ж почути програмістів, а поки - що ми маємо:

  • для прикладу в ліспроекті: беремось складати цифрову карту, а не хочемо розібратись із типами об’єктів цієї карти, бо це вже бач ГІС (вища наука);
  • беремося складати послідовність - а не хочемо робити це послідовно, бо це вже бач супер високого рівня “програмування”.
    Послідовність ця називається алгоритмом, а слово “алгоритм” ще в школі вчать, і до програмування вищого рівня від алгоритму - як “до неба рачки”. Я жодним чином не беруся когось оцінювати та порівнювати. З ким мені ще про скрипти? Мабуть карантин впливає.

Те, що скрипт не запускається, лише підтверджує серйозність вашої помилки. А як цей ящик по вашому має виконати послідовність, якщо вона не визначена? Вимушений ще раз констатувати факт: інструментальний скрипт, в якому є дублі міток, не запускається. Функціональний скрипт, що містить дублі міток, будучи викликаний з інструментального скрипта, дає помилку виконання Duplicate label з посиланням на викликаючий скрипт.

Думаю нам дискусію слід припинити, поза як поняття алгоритму (послідовності виконання операцій) ні вам, ні мені, ні будь-кому іншому не змінити. Як на мене - гарна була дискусія, предметна.

@Map.FromPLG - PLG - польський текстовий формат, містить інфо по пікетам, а-ля DAT-файл.
@Map.Lock - закриває вміст скриптів карти від дебагера.
@Map.Object[N].Filter [MinDistance] - в об’єкті видаляє відрізки меньші ніж MinDistance
@Map.CreateExplication - Створює експлікацію 15-зем на основі xlt-шаблону.

Доброго дня.

Хочу поцікавитись у розробників, щодо можливості налагодження роботи скриптів у покроковому режимі. Мабуть саме вікно класу TformSD (за нього вже йшлося “Отладчик скриптов с пошаговьім вьіполнением (Сервис|Настройки|Главная|Константьі ScriptDebugger=1)”) можна називати дебагером, тому перед застосуванням скриптової функції

вирішив поекспериментувати. Виконана у скрипті обробки події OnFileOpen першою командою (при відкриванні карти), ця функція забороняє редагування й перегляд тексту скриптів обробки події рівня карти та її шарів у редакторі коду скрипта. Таким чином: за неможливості відкрити карту без авто-запуску скрипта при відкриванні карти, це ідеальний спосіб захисту скриптів обробки подій не тільки від “чужих” очей, але й від себе самого (якби не ScriptDebugger=1).

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

З дебагером не спішно: розумію, що важливішої роботи багато. Просто - нагадати.

Помилки “Duplicate labels” відслідковуватимуться в новій версії лише при ScriptDebugger=1, тобто при активному вікні дебагера.

Доброго времени суток. А есть ли обработчик события “изменение содержания таблицы”? тобишь когда меняется содержание объекта в слое с видом “table” нужно, чтоб срабатывал скрипт.

Попробуйте в новой версии событие %Events.OnChange, оно срабатывает для перемещений табличных объектов и при изменении содержимого таблицы через интерфейс.

Доброго дня.

Є у мене питання до розробників щодо зручності написання скриптів: чи можна зробити так, щоб у текстовому полі вікна редактора скриптів (на скріншоті, наведеному нижче, відміченому червоним кольором) відображалися перші, закоментовані рядки тексту скрипта, на назві якого знаходиться курсор списку команд?[attachment=0]DemoScrypt.jpg[/attachment]Функціональних скриптів у теці Library - десятки, із-за цього забуваєш: які параметри скрипт повинний приймати.
Не важко й подивитись, відкривши текст скрипта в текстовому редакторі, але ж питання в зручності.

Наперед дякую за підтримку.

Что-то эта функция у меня не работает совсем. Вроде кстати были попытки написания скрипта, который бы смещал подпись при условии если она пересекается с другими объектами.. Может кто подскажет, а то найти не могу.

А якщо так:@Map.AdjustCaptions @Window.Refreshпрацює?[attachment=0]AdjustCaptions.wmv[/attachment]

Я именно так и делал) Разобрался в чем дело.. Когда надпись сильно большая, то может возникнуть ситуация, когда ее просто невозможно сдвинуть, чтоб она не пересекала какой-либо объект… соответственно она остается на месте.

Осталось добиться чтоб надписи между собой не самопересекались… :laughing:

Доброго всього всім!
Підкажіть, будь ласка, це правильний код, щоб визначити тип шару?:

$Object=@Map.SelectedObject $ObjectProperties=@Map.Layers.Get $Object $LayerType=@StringPart 2 $ObjectProperties @Dialog.Message $LayerType

вибачуха - сам розібрався ). Заблукав між трьома, точніше двома соснами - номер об’єкту, номер шару об’єкту

$NumberObject=@Map.SelectedObject $NumberLayerObject=@Map.Object[$NumberObject].Layer $ObjectLayerProperties=@Map.Layers.Get $NumberLayerObject $LayerType=@StringPart 2 $ObjectLayerProperties @Dialog.Message $LayerType

Підкажіть, будь ласка, як замінити круглі дужки в текстовому рядку ( ) на такі слеші / /
пишу так: $Line=для будівництва і обслуговування житлового будинку, господарських будівель і споруд (присадибна ділянка) $Line=@Calc Replace("$Line","(","/") $Line=@DequoteText $Line @Dialog.Message 1 $Line $Line=@Calc Replace("$Line","(","/") $Line=@DequoteText $Line @Dialog.Message 2 $Line
другий месидж некоректно відображається

$Line=для будівництва і обслуговування житлового будинку, господарських будівель і споруд (присадибна ділянка) $Line=@Calc Replace(Replace("$Line","(","/"),")","/") $Line=@DequoteText $Line @Dialog.Message $Line

$Line=для будівництва і обслуговування житлового будинку, господарських будівель і споруд (присадибна ділянка)
$Line=@ReplaceChar (/$Line
$Line=@ReplaceChar )/$Line
@Dialog.Message $Line

не знав, що можна у такому форматі, а @ReplaceChar я пропустив (мій косяк ) ). Дуже дякую!

Там “косяк” не у форматi запису (так можна i треба поєднувати, щоб зменшити довжину коду i менше перетворювати змiннi, типу Dequote). Ви два рази одну i ту ж дужку ( мiняли на символ / :slight_smile:.