Може хтось знає, підкажіть, будь-ласка. Хочу припинити аналіз карти після селектування об’єкта. Використовую функції API. Вікно “Анализ карты” має дочірнє вікно “Скасувати”, і по суті код має працювати:
HDig& = FindWindow(vbNullString, "Анализ карты")
If HDig& <> 0 Then
rc& = ProgChildWindow(HDig&, "Скасувати")
If rc& <> 0 Then
Call SendMessage(rc&, BM_CLICK, 0, 0)
End If
End If
Ідентифікатори вікон HDig& та rc& визначаються, а от посилка повідомлення Call SendMessage(rc&, BM_CLICK, 0, 0) не дає результату. Мабуть, вікно “Скасувати” має якусь системну назву, і тоді саме її вказувати треба
Але ж, працює код:
HDig& = FindWindow(vbNullString, "Розворот")
If HDig& <> 0 Then
rc& = ProgChildWindow(HDig&, "Cancel")
If rc& <> 0 Then
Call SendMessage(rc&, BM_CLICK, 0, 0)
End If
End If
Об’єкт селектується в скрипті. Після селектування, наступає аналіз карти а виконання скрипта - полетіло собі далі аж до кінця. Поки проходить аналіз карти і наступає виконання приведеного коду.
Ця думка виявилась хибною Аналіз карти наступає зразу після селектування, а скрипт очікує до завершення аналізу. Було б добре мати функцію, для посилки команди припинення аналізу карти зі скрипта .
В данном случае модуль отчетов после завершения проверки не запускается. Список ошибок (в виде Номер строки: Текст ошибки) сохраняется в текстовый файл, который затем открывается в блокноте. XMLChecker.exe (479 KB)
Спасибо, все работает !!
Но теперь возникает другая проблема - начинают плодится по каталогам никому ненужные логи проверки, приходится подчищать Почему нельзя использовать тот же xmlchecker.log ? + теперь если установлена галочка проверки при сохранении запускается генератор отчетов (чего и следовало ожидать), мне не критично (все равно отключаю), но все-таки как-то оно нехорошо…
Що-до обробки події %Events.OnChange - “который вызывается при изменении объекта”.
Не нагально, але чи можна буде включити в поняття зміни об’єкта ще й вставку точки, видалення точки об’єкта.
Адже зміна значення параметра об’єкта викликає подію, а зміна геометрії об’єкта (вставка точки, видалення точки) - ні. Це, як на мене, суперечить логіці.
Здравствуйте! Скажите можно ли в слое XMLОренда, в строке “Площа ділянки або її частини, наданої в оренду” сделать чтобы площадь вбивалась автоматически?
Когда будет функция “извлечь в XML”?
Доброго дня.
Виникає необхідність автоматизувати рутинну операцію створення полігонів. Гаряча клавіша “N” створює полігон в режимі збору, якщо курсор миші знаходиться всередині зони, обмеженої іншими полігонами чи лінійними об’єктами. Так от, є карта в лініях і є точкові об’єкти (центроїди). Уявіть собі що, треба створити полігони обмежені цими лініями, і таких полігонів (відповідно кількості центроїдів) - тисячі . Необхідна функція @Map.CreatePoligon X Y [Layer], де X Y - координати точки що знаходиться всередині створюваного полігону; [Layer] - ID шару, в якому буде створено полігон, якщо не вказано - ID шару збору. Функція має повертати номер об’єкта якщо полігон створений, або 0 - якщо полігон створити не вдалося із-за незамкнутості ліній (наявності висячих ліній).
Якби таку функцію “забумбурити” в цикл перебору всіх центроїдів, було-б Ого-го
Ще одне . Чи можливо доробити обробку події %Events.OnChange . Варто щоб подія виникала при видаленні/вставці точки з/в об’єкта/об’єкт, а обробку зміни значення параметрів об’єкта винести окремо, наприклад %Events.OnParameterChange
Как насчет кнопки Создать полигоны на панели Правка в разделе Сервис?
Вторым этапом - проверить вложенность на закладке Список.
Третьим - унаследовать параметры от вашиъ точечных объектов.
Все це добре, дякую за підказку, але лінії в багатьох випадках недотягнуті - висячі, тоді (якби була відповідна функція), в циклі скрипта, відбувався б перебір всіх точкових об’єктів (центроїдів) і: якщо полігон не створений, користувач дотягує лінію, далі продовжує виконання скрипта який ще раз спробує створити полігон відповідно для того-ж точкового об’єкта. Таким чином, в діалоговому режимі й робити.
Відпаде необхідність аналізу вкладеності об’єктів, якщо створення полігонів відбуватиметься лише там де є точковий об’єкт.
А як бути, коли параметр 13 полігона має бути успадкований від параметра 33 точкового об’єкта А так, у скрипті використовуватиметься таблиця відповідності параметрів. Справа в тому, що таких карт багато, а операція створення полігонів - разова по кожній карті. Після створення полігонів всі лінії та точкові об’єкти видалятимуться. Міняти ж перелік параметрів, доступних полігонам - не бажано.
“Дико вибачаюсь”. У версії 23.04. побачив функцію @Map.AssemblePolygon X Y Z [LayerIndex1 LayerIndex2 …] - Создает полигон по его внутренней точке и возвращает его номер:shock: . А в попередніх версіях її не було. Чемно дякую.
Пробачте, виникають питання @Map.AssemblePolygon X Y Z [LayerIndex1 LayerIndex2 …] працює, якщо не вказувати LayerIndex1 LayerIndex2 …, створюючи полігон в шарі збору. Але якщо LayerIndex1 LayerIndex2 … - список шарів в яких створюватиметься полігон, то:
коли може статись ситуація для переважного вибору шару LayerIndex1 чи LayerIndex2, в якому створюватиметься полігон;
LayerIndex1 мається на увазі ID шару чи порядковий номер (пробував і перше й друге - функція повертає 0).
Будь-ласка, дайте повний опис функції. Воно то не проблема встановити активний шар збору, але ж хочеться розібратись.
Эти функции пока в стадии отладки и доработки. Готовим основу для вашей полевой ГИС
LayerIndex1, LayerIndex2 и т.д. это не слои, в которые помещается созданный полигон, а те слои, которые участвуют в его построении. Это необходимо чтобы при создании полигона квартала игнорировались границы выделов, а также чтобы отсечь разные линейные объекты типа лесных дорог и т.д.
В первом варианте функции AssemblePolygon (который есть у вас), предполагалось, что слой, в который нужно поместить полигон, будет присвоен уже после построения (через @Map.Object[N].Layer или @Map.Object[N].LayerID).
Но затем мы пришли к мнению, что слой таки нужно указывать явно, чтобы при построении проверять нет ли в этом слое такого-же полигона.
Также добавлена функция @Map.ClipOverlappedPolygons, которая подрезает смежные объекты того-же слоя для устранения накладок. Это необходимо если вместо одного выдела появляется два. Достаточно провести между ними границу, добавить новый выдел и он обрежет собой существующий.
А еще функция Map.Object[$I].Autonumber, которая автоматически выбирает следующий свободный номер среди объектов того же слоя (выделы), в пределах их родительского полигона (квартала). Если родительский слой не указан, то берется следующий свободный номер по всей карте.
Основная идея в том, чтобы собирать только линейные объекты, границы и т.д. А полигоны будут создаваться автоматически в процессе расстановки меток. Все реализовано в скриптах обработки событий для слоев Квартал и Выдел. Предполагается, что вся информация будет присваиваться объектам меткам из этих слоев, а полигоны можно будет в любой момент удалить/изменить/пересоздать без потери атрибутивной информации.
Доброго дня Сергій Васильович.
Дуже корисні, просто необхідні функції. Видно технологічний відділ “обскакав” мене із запитом функцій на 2-3 дні - нічого, ми ще попишем скрипти . Пробую конверт бази АІКС-лісгосп (в лініях) - в полігони, розроблені функції неодмінно стануть в пригоді.
Як на мене, створення карт полігонами викликає нарікання лише тому, що відсутні окремі засоби контролю якості заведення карт.
Чи можна буде посприяти, для полегшення роботи операторів на сьогодні, дописуванню функцій контроля якості карт для сценаріїв контроля . По аналогії з функцією @Map.ClipOverlappedPolygons, - “Обрезает полигоны того же слоя для устранения накладок”, лише не підрізати, а давати помилку накладки сусідніх полігонів. Наразі такі помилки поширені, та вишукуються через різницю площі квртала і суми площ полігональних виділів. Такий пошук - марудна справа, що є причиною нарікання тих, хто заводить карти. Сценарії контроля якості карти.
Вибачте, це мабуть вже не треба (ймовірно, необхідність такого контролю відпаде при заведенні лініями).
Тоді, мабуть, краще %Events.OnChange. Це при накладанні інструментальної зйомки.
Дякую, буду “йти в ногу” з польовою ГІС