RUS  ENG 

Программное перемещение объектов

Страницы: 1
RSS
Программное перемещение объектов, Работа с данным Zulu из отдельной программы на C#
 
Я столкнулся с Zulu впервые, пытаюсь решить следующую задачу:
Необходимо выполнить перемещение объектов на слое в новые координаты (по сути, изменяется система координат, но встроенная функция трансформации не подошла, там есть определенная путаница в исходных данных, которая мешает ее применить).
На данный момент я пробую создать просто отдельную программу на C# (знаю его лучше всего), не plugin, а stand-alone, которая открывала бы слой, проходила по всем объектам, пересчитывала координаты и записывала измененные данные.
Пытаюсь выполнить следующую последовательность действий:
- получаю элемент по id (ну или просто перебором, пока с отдельными элементами пробую)
- получаю контур элемента, прохожу по нему, читаю координаты вершин, пересчитываю и формирую массивы
- создаю новый контур из новых координат
- вызываю метод SetContour у элемента. И вот тут проблема - контур не меняется, если смотреть координаты контура у элемента, они остаются старыми.

Дальше не очень понятно, как эти изменения сохранить, это метод WriteElement у слоя? Или сохранение происходит сразу? Или другой метод?

Пожалуйста, подскажите, возможно ли вообще использовать такой подход, или надо делать макрос или плагин, выполняющийся в среде Zulu?
Если подход рабочий - в чем моя проблема, почему не работает?
Изменено: Михаил Кузьминых - 17.05.2018 16:35:45
 
Дело в том, что если писать в тот же слой пересчитанные как-то координаты, то слой свою систему координат не менял, и пересчитанные числа могут к его системе координат не подойти.
Что возвращает метод SetContour?
Попробуйте создать новый слой, назначить ему новую систему координат, соответствующую пересчитанным числам и писать преобразованные объекты в него.
 
Систему координат я не трогаю, по сути дела, просто хочу переместить объект из одного места в другое.
Скорее всего, проблема была в ограничении демо-версии (прошу прощения, что не указал это сразу), на слоях с небольшим количеством объектов вроде бы сдвиг получается.
Возник ещё один вопрос. Я запускаю свою отдельную программу, она перемещает точку (пробую сейчас с точечными объектами, eGraphTypePrimSymbol), и при этом, если сама программа Zulu закрыта, то после того, как я открываю ее для просмотра результата, выясняется, что на старом месте точка тоже есть, но с ID на единицу больше прежнего. Исходная точка переместилась. Если Zulu в это время открыта и обрабатываемый слой виден в окне карты, то точка перемещается, и на старом месте ничего не остается.
Чем это объясняется?
 
Каким методом перемещаете?
 
Дело оказалось не в методе, а в том, что на одном месте находилось несколько объектов :)
Вроде бы пока все вопросы снялись.
 
Одни вопросы снялись, а другие - появились.
Дошло дело до работы с инженерными сетями, объекты в которых связаны между собой.
Сколько не изучал объектную модель, так и не смог найти какие-то способы обнаружения этих связей и работы с ними.

А связи эти очевидно требуются для корректного переноса сетей на новое место.
Так, попробовал работать с небольшим тестовым набором данных, но результат вышел неудовлетворительный - очевидно, линии были привязаны к какой-то точке, и связь эта не поменялась, в итоге на выходе вместо исходной сети вижу точки, соединенные с какой-то точкой привязки на старом месте.
Как быть, каким методом можно "передвинуть" такую сеть?
Изменено: Михаил Кузьминых - 15.06.2018 16:29:46
 
1. Информация о топологии сети: https://politerm.com/zuludoc/index.html#zuluax/NetworkObjects_cls.html
2. Перемещение группы объектов: https://politerm.com/zuludoc/index.html#zuluax/Layer_MoveSelection.html
Параметр KeepLink - признак сохранения связности (если такая была) перемещаемых объектов с объектами, оставшимися на месте;
 
Цитата
Алексей Аширов написал:
2. Перемещение группы объектов: https://politerm.com/zuludoc/index.html#zuluax/Layer_MoveSelection.html
Параметр KeepLink - признак сохранения связности (если такая была) перемещаемых объектов с объектами, оставшимися на месте;
Спасибо за ответ, но вопрос всё же остается. Переместить группу объектов сразу с сохранением связей не получится, так как надо не просто сдвинуть, но и повернуть вокруг начальной точки, соответственно, каждый объект надо сдвинуть немного по-разному. Даже полилинию или контур просто сдвинуть не получится.
Предположил, что можно выбрать связанные элементы, передвинуть их, а затем связать заново, но не нашел подходящий метод для соединения объектов. Вся информация в объекте NetworkObjects только для чтения.
Пожалуйста, подскажите, есть ли возможность программного формирования сетей и какой объект за это отвечает?
 
Программно сеть формируется так же как и интерактивно. Простым рисованием. Участок - узел - участок - узел. Сеть собирается на лету. Если координаты конца и начала участка совпадают с узловыми элементами, то образуется линейно-узловая связность, если совпадения координат нет, то и топологической связи нет.
Короче, для слоя связать - это просто приравнять координаты.
 
Спасибо за информацию о сетях, вроде бы добился, чего хотел.
Теперь возник следующий вопрос - в связи с имеющимся набором лицензий, пытаюсь перевести модуль в плагин к Zulu.
Сам плагин создал по примеру для Delphi, переложил на C#, методы вызываются, в целом плагин живой.
Но, мне хочется открыть форму и работать с ней, форма создается, открывается и сразу же закрывается (по видимому, сразу как заканчивается выполнение метода команды.
Почему так, как добиться, чтобы форма открылась и осталась открытой, чтобы можно было с ней работать?
 
Подниму старую тему, так как возник новый вопрос.

В прошлый раз задача успешно решилась, по прошествии времени понадобилось вернуться к старому модулю.
И возникла проблема - не удается установить новый контур для объекта с пересчитанными координатами. Методы SetContour и SetPolyContour возвращают false, объекты никуда не перемещаются.
При этом если скопировать несколько объектов на новый слой, их обработка проходит успешно. Я предполагал, что дело в ограничениях демо-версии, но на рабочей машине ситуация та же.
Есть ли возможность узнать, почему методы не отрабатывают, получить какую-то расширенную диагностику? Может быть ведется журнал или есть какие-то объекты для этих целей?

В работе я использовал последнюю версию, скачанную с сайты, версию на рабочей машине могу, при необходимости, уточнить.
 
Цитата
Есть ли возможность узнать, почему методы не отрабатывают, получить какую-то расширенную диагностику? Может быть ведется журнал или есть какие-то объекты для этих целей?

В работе я использовал последнюю версию, скачанную с сайты, версию на рабочей машине могу, при необходимости, уточнить.
Добрый день. Вызовите у слоя GetLastErrorCode после неудачного метода, и сообщите, что он вернул. Далеко не все диагностируется, но заготовка есть. Может будет информация.
 
Попробовал получить GetLastErrorCode, на моей машине возвращает -11, но у меня, я так понимаю, демо-версия, я скачал дистрибутив с сайта, лицензии у меня нет.

На рабочей машине пока попробовать не удалось.

При работе возник ещё один вопрос - для перемещения я определяю тип объекта, использую для этого свойство GraphType. И на слое, с которым работаю, некоторые объекты имеют тип -1, eGraphTypeUnknown. При этом если открыть информацию о слое, там у всех объектов есть тип, линии или полигоны. Чем объясняется такое расхождение, и как тут лучше поступать - есть другой способ узнать тип, либо надо пробовать получать контуры и линии и обрабатывать ошибки?
 
Цитата
Михаил Кузьминых написал:
Попробовал получить GetLastErrorCode, на моей машине возвращает -11, но у меня, я так понимаю, демо-версия, я скачал дистрибутив с сайта, лицензии у меня нет.

На рабочей машине пока попробовать не удалось.

При работе возник ещё один вопрос - для перемещения я определяю тип объекта, использую для этого свойство GraphType. И на слое, с которым работаю, некоторые объекты имеют тип -1, eGraphTypeUnknown. При этом если открыть информацию о слое, там у всех объектов есть тип, линии или полигоны. Чем объясняется такое расхождение, и как тут лучше поступать - есть другой способ узнать тип, либо надо пробовать получать контуры и линии и обрабатывать ошибки?
Можете прислать слой с такими объектами и пример кода на [email protected]?
 
Цитата
Олег Пахнющий написал:
Можете прислать слой с такими объектами и пример кода на [email protected] ?
Я прогнал на этом слое сжатие и оптимизацию, после чего такие объекты исчезли, так что наверное, ничего особо интересного там не было.
 
И все же, а что означает возвращаемое значение "-11" из метода GetLastErrorCode?
 
Цитата
Михаил Кузьминых написал:
И все же, а что означает возвращаемое значение "-11" из метода GetLastErrorCode?

Она означает, что нет лицензии для выполняемой операции.
 
А есть ли возможность где-то скачать предыдущие версии ZuluGIS? В частности, интересует версия 8.0.0.7200u
 
Цитата
Михаил Кузьминых написал:
А есть ли возможность где-то скачать предыдущие версии ZuluGIS? В частности, интересует версия 8.0.0.7200u
Нет. На сайте доступна только актуальная версия.
 
Цитата
Дмитрий Озеров написал:
Цитата
Михаил Кузьминых написал:
И все же, а что означает возвращаемое значение "-11" из метода GetLastErrorCode?

Она означает, что нет лицензии для выполняемой операции.
А есть ли способ выяснить из внешней программы на C#, в каком режиме работает программа, доступна ли вообще лицензия?
 
Цитата
Михаил Кузьминых написал:
Цитата
Дмитрий Озеров написал:
Цитата
Михаил Кузьминых написал:
И все же, а что означает возвращаемое значение "-11" из метода GetLastErrorCode?

Она означает, что нет лицензии для выполняемой операции.
А есть ли способ выяснить из внешней программы на C#, в каком режиме работает программа, доступна ли вообще лицензия?
Сейчас нет. Только попробовать сделать действие и получить реакцию. Ключ воткнут может быть в другом городе. Лицензии могут суммироваться на разных ключах. В данный момент лицензия может быть, а в другой занята. Можно что-то на эту тему написать, но это не планировалось.
 
Обновил версию Zulu у клиента, использую GetLastErrorCode, получается в ответ -11.
Я предполагал, что проблема в лицензии и теперь это видно.
У клиента серверный ключ, а мое приложение - отдельное, написано на C# и использует библиотеки. Нет ли тут проблемы? Два года назад все было нормально, но что там было с ключами, я не в курсе.
Может быть, нужны какие-то дополнительные действия для задействования лицензии в коде?
 
Цитата
Михаил Кузьминых написал:
Обновил версию Zulu у клиента, использую GetLastErrorCode, получается в ответ -11.
Я предполагал, что проблема в лицензии и теперь это видно.
У клиента серверный ключ, а мое приложение - отдельное, написано на C# и использует библиотеки. Нет ли тут проблемы? Два года назад все было нормально, но что там было с ключами, я не в курсе.
Может быть, нужны какие-то дополнительные действия для задействования лицензии в коде?
Если Ваше приложение работает с данными ZuluServer, на который есть лицензия, то проблем быть не должно. Если работаете с локальными данными, нужна локальная лицензия
 
Установил сервер, опубликовал там карту, пробую её открыть. Использую следующий код на C#
Код
MapDoc map = new MapDoc();             
try             
{                 
    map.Open(txtMapPath.Text);
    lstLayers.Items.Clear();
    for(short i = 0; i < map.Layers.Count; i++)
    {
        var layer = map.Layers[i];
        lstLayers.Items.Add(layer.Name);
    }
}
catch(Exception ex)
{
    MessageBox.Show("Не удалось открыть карту на сервере: " + ex.Message);
}
map.Open отрабатывает, map.Layers.Count содержит правильное количество слоев, но когда доходит до

var layer = map.Layers[i];
вылетает исключение: ZuluLib Exception: "Недостаточно памяти"
из полезного, может быть: ErrorCode = -2147220988
 
Михаил, добрый день! Так исторически сложилось, что индекс в коллекции Layers должен начинаться от 1, а не от 0.
Этой части объектной модели уже 20 лет и из-за поддержки бинарной совместимости мы уже ничего не меняем, но стараемся отражать в описании методов. Обращайте внимание, на старых методах индекс может подразумеваться с 1-цы.
Страницы: 1