Я столкнулся с Zulu впервые, пытаюсь решить следующую задачу: Необходимо выполнить перемещение объектов на слое в новые координаты (по сути, изменяется система координат, но встроенная функция трансформации не подошла, там есть определенная путаница в исходных данных, которая мешает ее применить). На данный момент я пробую создать просто отдельную программу на C# (знаю его лучше всего), не plugin, а stand-alone, которая открывала бы слой, проходила по всем объектам, пересчитывала координаты и записывала измененные данные. Пытаюсь выполнить следующую последовательность действий: - получаю элемент по id (ну или просто перебором, пока с отдельными элементами пробую) - получаю контур элемента, прохожу по нему, читаю координаты вершин, пересчитываю и формирую массивы - создаю новый контур из новых координат - вызываю метод SetContour у элемента. И вот тут проблема - контур не меняется, если смотреть координаты контура у элемента, они остаются старыми.
Дальше не очень понятно, как эти изменения сохранить, это метод WriteElement у слоя? Или сохранение происходит сразу? Или другой метод?
Пожалуйста, подскажите, возможно ли вообще использовать такой подход, или надо делать макрос или плагин, выполняющийся в среде Zulu? Если подход рабочий - в чем моя проблема, почему не работает?
Дело в том, что если писать в тот же слой пересчитанные как-то координаты, то слой свою систему координат не менял, и пересчитанные числа могут к его системе координат не подойти. Что возвращает метод SetContour? Попробуйте создать новый слой, назначить ему новую систему координат, соответствующую пересчитанным числам и писать преобразованные объекты в него.
Систему координат я не трогаю, по сути дела, просто хочу переместить объект из одного места в другое. Скорее всего, проблема была в ограничении демо-версии (прошу прощения, что не указал это сразу), на слоях с небольшим количеством объектов вроде бы сдвиг получается. Возник ещё один вопрос. Я запускаю свою отдельную программу, она перемещает точку (пробую сейчас с точечными объектами, eGraphTypePrimSymbol), и при этом, если сама программа Zulu закрыта, то после того, как я открываю ее для просмотра результата, выясняется, что на старом месте точка тоже есть, но с ID на единицу больше прежнего. Исходная точка переместилась. Если Zulu в это время открыта и обрабатываемый слой виден в окне карты, то точка перемещается, и на старом месте ничего не остается. Чем это объясняется?
Одни вопросы снялись, а другие - появились. Дошло дело до работы с инженерными сетями, объекты в которых связаны между собой. Сколько не изучал объектную модель, так и не смог найти какие-то способы обнаружения этих связей и работы с ними.
А связи эти очевидно требуются для корректного переноса сетей на новое место. Так, попробовал работать с небольшим тестовым набором данных, но результат вышел неудовлетворительный - очевидно, линии были привязаны к какой-то точке, и связь эта не поменялась, в итоге на выходе вместо исходной сети вижу точки, соединенные с какой-то точкой привязки на старом месте. Как быть, каким методом можно "передвинуть" такую сеть?
Спасибо за ответ, но вопрос всё же остается. Переместить группу объектов сразу с сохранением связей не получится, так как надо не просто сдвинуть, но и повернуть вокруг начальной точки, соответственно, каждый объект надо сдвинуть немного по-разному. Даже полилинию или контур просто сдвинуть не получится. Предположил, что можно выбрать связанные элементы, передвинуть их, а затем связать заново, но не нашел подходящий метод для соединения объектов. Вся информация в объекте NetworkObjects только для чтения. Пожалуйста, подскажите, есть ли возможность программного формирования сетей и какой объект за это отвечает?
Программно сеть формируется так же как и интерактивно. Простым рисованием. Участок - узел - участок - узел. Сеть собирается на лету. Если координаты конца и начала участка совпадают с узловыми элементами, то образуется линейно-узловая связность, если совпадения координат нет, то и топологической связи нет. Короче, для слоя связать - это просто приравнять координаты.
Спасибо за информацию о сетях, вроде бы добился, чего хотел. Теперь возник следующий вопрос - в связи с имеющимся набором лицензий, пытаюсь перевести модуль в плагин к Zulu. Сам плагин создал по примеру для Delphi, переложил на C#, методы вызываются, в целом плагин живой. Но, мне хочется открыть форму и работать с ней, форма создается, открывается и сразу же закрывается (по видимому, сразу как заканчивается выполнение метода команды. Почему так, как добиться, чтобы форма открылась и осталась открытой, чтобы можно было с ней работать?
В прошлый раз задача успешно решилась, по прошествии времени понадобилось вернуться к старому модулю. И возникла проблема - не удается установить новый контур для объекта с пересчитанными координатами. Методы SetContour и SetPolyContour возвращают false, объекты никуда не перемещаются. При этом если скопировать несколько объектов на новый слой, их обработка проходит успешно. Я предполагал, что дело в ограничениях демо-версии, но на рабочей машине ситуация та же. Есть ли возможность узнать, почему методы не отрабатывают, получить какую-то расширенную диагностику? Может быть ведется журнал или есть какие-то объекты для этих целей?
В работе я использовал последнюю версию, скачанную с сайты, версию на рабочей машине могу, при необходимости, уточнить.
Есть ли возможность узнать, почему методы не отрабатывают, получить какую-то расширенную диагностику? Может быть ведется журнал или есть какие-то объекты для этих целей?
В работе я использовал последнюю версию, скачанную с сайты, версию на рабочей машине могу, при необходимости, уточнить.
Добрый день. Вызовите у слоя GetLastErrorCode после неудачного метода, и сообщите, что он вернул. Далеко не все диагностируется, но заготовка есть. Может будет информация.
Попробовал получить GetLastErrorCode, на моей машине возвращает -11, но у меня, я так понимаю, демо-версия, я скачал дистрибутив с сайта, лицензии у меня нет.
На рабочей машине пока попробовать не удалось.
При работе возник ещё один вопрос - для перемещения я определяю тип объекта, использую для этого свойство GraphType. И на слое, с которым работаю, некоторые объекты имеют тип -1, eGraphTypeUnknown. При этом если открыть информацию о слое, там у всех объектов есть тип, линии или полигоны. Чем объясняется такое расхождение, и как тут лучше поступать - есть другой способ узнать тип, либо надо пробовать получать контуры и линии и обрабатывать ошибки?
Михаил Кузьминых написал: Попробовал получить GetLastErrorCode, на моей машине возвращает -11, но у меня, я так понимаю, демо-версия, я скачал дистрибутив с сайта, лицензии у меня нет.
На рабочей машине пока попробовать не удалось.
При работе возник ещё один вопрос - для перемещения я определяю тип объекта, использую для этого свойство GraphType. И на слое, с которым работаю, некоторые объекты имеют тип -1, eGraphTypeUnknown. При этом если открыть информацию о слое, там у всех объектов есть тип, линии или полигоны. Чем объясняется такое расхождение, и как тут лучше поступать - есть другой способ узнать тип, либо надо пробовать получать контуры и линии и обрабатывать ошибки?
Можете прислать слой с такими объектами и пример кода на [email protected]?
Михаил Кузьминых написал: И все же, а что означает возвращаемое значение "-11" из метода GetLastErrorCode?
Она означает, что нет лицензии для выполняемой операции.
А есть ли способ выяснить из внешней программы на C#, в каком режиме работает программа, доступна ли вообще лицензия?
Сейчас нет. Только попробовать сделать действие и получить реакцию. Ключ воткнут может быть в другом городе. Лицензии могут суммироваться на разных ключах. В данный момент лицензия может быть, а в другой занята. Можно что-то на эту тему написать, но это не планировалось.
Обновил версию Zulu у клиента, использую GetLastErrorCode, получается в ответ -11. Я предполагал, что проблема в лицензии и теперь это видно. У клиента серверный ключ, а мое приложение - отдельное, написано на C# и использует библиотеки. Нет ли тут проблемы? Два года назад все было нормально, но что там было с ключами, я не в курсе. Может быть, нужны какие-то дополнительные действия для задействования лицензии в коде?
Михаил Кузьминых написал: Обновил версию Zulu у клиента, использую GetLastErrorCode, получается в ответ -11. Я предполагал, что проблема в лицензии и теперь это видно. У клиента серверный ключ, а мое приложение - отдельное, написано на C# и использует библиотеки. Нет ли тут проблемы? Два года назад все было нормально, но что там было с ключами, я не в курсе. Может быть, нужны какие-то дополнительные действия для задействования лицензии в коде?
Если Ваше приложение работает с данными ZuluServer, на который есть лицензия, то проблем быть не должно. Если работаете с локальными данными, нужна локальная лицензия
Михаил, добрый день! Так исторически сложилось, что индекс в коллекции Layers должен начинаться от 1, а не от 0. Этой части объектной модели уже 20 лет и из-за поддержки бинарной совместимости мы уже ничего не меняем, но стараемся отражать в описании методов. Обращайте внимание, на старых методах индекс может подразумеваться с 1-цы.