Форум НПФ  

Вернуться   Форум НПФ "ТОПОМАТИК" > Программные продукты "Топоматик Robur" на платформе "Robur AP3" > Средства разработки Топоматик Robur > Вопросы и ответы
Ник
Пароль
Регистрация FAQ Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #101  
Старый 02-20-2021, 11:49
Василий Гончаров Василий Гончаров вне форума
Разработчик Robur
 
Регистрация: Oct 2016
Сообщения: 154
По умолчанию

Добрый день!

К сожалению предыдущий способ сильно зависит от самого файла семантики, фактически Вы опираетесь на его внутренние данные.
Посмотреть какие именно handle соответствуют какому узлу, можно просто открыв в текстовом редакторе файл семантики, например,
оперируя данными из файла Semantic.xml

<Item Caption="Канализация" Handle="1017">
<Propertys aType="0">
<Property ClassName="0" Caption="Вид" Handle="1">
<Items aType="0">
<Item Caption="Наземная" Handle="2">
<Propertys aType="0">
<Property ClassName="0" Caption="Тип" Handle="4">
<Items aType="0">
<Item Caption="Без подразделений" Handle="5">
<Propertys aType="0">
<Property ClassName="0" Caption="Подписывать буквенный индекс" Handle="22">
<Items aType="0">
<Item Caption="Да" Handle="39">

Таким образом код, в приведённом примере делает следующее:
Поскольку в SemanticDataSet структурной линии уже содержит корневой узел с handle 1017
То вызвав запрос элемента с handle = 1 мы получим значение свойства "Вид"
Поскольку это SemanticJumper, то его значением является handle выбранного подэлемента.
selected_handle = semantic[semantic[1]]
Метод semantic.Root.TryGetNode позволяет получить семантический узел по его коду
if (semantic.Root.TryGetNode(selected_handle, ref)):
ConsoleListner.Current.WriteLine(ref.Value.Caption )
Здесь мы проверяем, что работаем непосредственно с узлом handle = 2 - то есть с Наземной канализацией
if (selected_handle == 2):
Теперь нам необходимо определить Тип, для этого у Наземной линии мы запрашиваем узел с handle = 4
selected_handle = semantic[semantic[4]]
Снова получаем семантический узел по его коду и выводим его наименование
if (semantic.Root.TryGetNode(selected_handle, ref)):
ConsoleListner.Current.WriteLine(ref.Value.Caption )
Для того чтобы получить Подписывать буквенный индекс значение свойства мы проверяем hanlde типа
sign_index = False
Если это тип Без подразделений, то Подписывать буквенный индекс стоит в значении Да, если значение handle равно 39
if (selected_handle == 5):
sign_index = semantic[semantic[22]] == 39


Этот метод работы достаточно трудоёмок и имеет ряд существенных недостатков - первое, он чуствителен к содержимому файла
семантики, что было нами успешно продемонстрированно в предыдущем примере. Поскольку там использовался нестандартный файл семантики
и handle внутри файла отличались, от системных для версии 8.x
К достоинствам метода можно отнести тот факт, что Вы имеете возможность опредлять значения всех свойств, включая скрытые.

В принципе для решения Вашего вопроса, действительно можно вызвать функцию GetVisibleProperties() у LinearSemantic и определять
Ваши значения по визуальному представлению свойств.
Если Вы создаёте свой собственный объект, и Вам нужно опираться на какие-либо определённые свойства, то рекомендую прописывать для них
свойство Tag, и обращатся к значению свойства по этому тэгу.
Ответить с цитированием
  #102  
Старый 04-19-2021, 12:11
eugene eugene вне форума
Новичок
 
Регистрация: Apr 2021
Сообщения: 5
По умолчанию

Добрый день. Подскажите, пожалуйста:

1. Как попросить пользователя выбрать полигоны SurfacePolygonWrapper любым удобным для него образом, по одному, рамкой и т.д. Видел в этой теме как это сделать для Turnouts, но не могу сделать по аналогии для полигонов. Как получить слой, на котором они лежат?

2. Как у SurfacePolygonWrapper вывести тип площадного объекта, соответствующий AreaObjectCode. Например не просто "(1058) Полигон", а "(1058) Сенокос"

3. Как получить Polyline3D от AlignmentWrapper. Я смог сделать только так:

Код:
alg_pline_vertices = () for vec2d in alg.Alignment.Plan: alg_pline_vertices += ( BugleVector3D( Vector3D( vec2d.Position.X, vec2d.Position.Y, 0.0 ) ), ) alg_pline = Polyline3D(alg_pline_vertices)


При этом, конечно, потерялась координата Z вершин. Она мне не нужна для текущей задачи, но всё же приятно было бы иметь, если понадобится в будущем.

И кстати, что такое Bugle в BugleVector3D?

4. Общий вопрос по развитию продукта. Планируется ли переход на более свежие версии .NET? Привык работать в VSCode и там не скомпилировать под 3.5, так как соответствующего SDK нигде нет в интернете (либо я не смог найти).
Ответить с цитированием
  #103  
Старый 04-19-2021, 13:26
eugene eugene вне форума
Новичок
 
Регистрация: Apr 2021
Сообщения: 5
По умолчанию

И ещё вопрос. Есть ли возможность в IronPython, использующийся в программе, установить доп. библиотеки? Пробовал вызвать pip из кода, он говорит что нет такого пакета. И еще нет некоторых библиотек, которые в обычной последней версии Айрона идут из коробки. Например, collections.
Ответить с цитированием
  #104  
Старый 04-21-2021, 11:02
Василий Гончаров Василий Гончаров вне форума
Разработчик Robur
 
Регистрация: Oct 2016
Сообщения: 154
По умолчанию

1. Поскольку полигон представляет собой просто замкнутую структурную линию, то Вам удобнее работать не с классом SurfacePolygonWrapper,
а непосредственно с самими структурными линиями. Для выбора структурных линий Вам придется использовать специальный метод у SurfaceLayer.
Необходимо воспользоваться либо связкой методов SelectStructureLines с предикатом фильтрующим замкнутые полигоны и методом
GetSelectedStructureLines, либо методами SelectOneStructureLine или PeakOneStructureLine для выбора одной линии. Например:
Код:
CadView cadView = ... //получили слой var layer = SurfaceLayer.GetSurfaceLayer(cadView); var surface = layer.Surface; //условие выбора Predicate<int> match = delegate(int index) { return surface.StructureLines[index].IsPolygon; } //выбор одной линии var single_line = layer.PeakOneStructureLine(match, "Укажите площадной объект"); //выбор нескольких линий if (layer.SelectStructureLines(match, "Уажите пложадные объекты") == GetPointResult.Accept) { var indexes = layer.GetSelectedStructureLines(); foreach (var index in indexes) { //выбранная линия var line = surface.StructureLines[index]; } }


2. Тип площадного объекта тоже удобнее выводить у струтурной линии. Для этого Вам необходимо получить эту информацию по коду семантики.
Например:
Код:
StructureLine line = ... var code = line.AreaCode; SemanticRootNode smt; //искомая строка string area_description; if (SemanticLibrarySet.Current.TryGetValue(code, out smt)) { area_description = string.Format("{1}-({0})", code, smt.Caption); } else { area_description = code.ToString(); }


3. Для того, чтобы получить Polyline3D из AlignmentWrapper, Вам необходимо вызвать у него метод GetPolyline(IPolyline3D polyline).
Код:
AlignmentWrapper wrapper = ... var polyline = new Polyline3D(); wrapper.GetPolyline(polyline);

К сожалению, на данный момент полилиния создаётся без Z координат, но на нашей практике пока не было случая,
когда это было бы необходимо. Обычно вертикальное положение получают при помощи профиля.
Bugle в BugleVector3D - это историческая опечатка. На самом деле это кривизна дуги bulge.
Если Вам необходимо получить параметры самой дуги, Вы можете воспользоваться статическим методом CadLibrary.PolylineSegmentToArc.

4. Переход на более свежие версии Net планируется. Версия 9.0 будет работать уже с фреймворк 4.0. В дальнейшем мы планируем переход на Net Core.

5. К сожалению мы используем не самую последнюю версию IronPython и не все дополнительные библиотеки там поддерживаются.
Ответить с цитированием
  #105  
Старый 04-29-2021, 10:43
eugene eugene вне форума
Новичок
 
Регистрация: Apr 2021
Сообщения: 5
По умолчанию

Спасибо. Еще пара вопросов.

1. Проблемы с расшифровкой юникода в Робур с IronPython. При записи в файл кириллицы бросает UnicodeEncodeError. Либо приходится писать нерасшифрованные строки типа u'\u041f\u043e\u0440\u043e\u0441\u043b\u044c \u043b\u0435\u0441\u0430 \u0415\u043b\u044c. \u041b\u0438\u0441\u0442\u0432. 12/0.2 1'.

В командную строку тоже всегда по-разному выводит кириллицу, иногда расшифровывает, иногда выводит как в примере выше.

С чем это связано и как все таки вывести кириллицу в файл?

2. Подскажите, пожалуйста, как получить путь до рабочего проекта.

Последний раз редактировалось eugene, 04-29-2021 в 12:55.
Ответить с цитированием
  #106  
Старый 04-29-2021, 17:20
Василий Гончаров Василий Гончаров вне форума
Разработчик Robur
 
Регистрация: Oct 2016
Сообщения: 154
По умолчанию

1. Вам необходимо в явном виде указать кодировку в файла, и сформировать его в нужной кодировке. Для примера можете использовать файл surface_mapsigns.py из комплекта стандартной поставки.

2. Вы можете воспользоваться свойством TargetProjectFile у активного проекта, получив его например так для версии 15.0 ApplicationHost.Current.ActiveProject.TargetProjec tFile или ApplicationHost.Current.ActiveProject.TargetProjec tUri для версии 16.0.
Ответить с цитированием
  #107  
Старый 04-30-2021, 9:45
eugene eugene вне форума
Новичок
 
Регистрация: Apr 2021
Сообщения: 5
По умолчанию

Цитата:
Сообщение от Василий Гончаров
1. Вам необходимо в явном виде указать кодировку в файла, и сформировать его в нужной кодировке. Для примера можете использовать файл surface_mapsigns.py из комплекта стандартной поставки.


1. Пробовал. Кодировка теряется, в консоль и файл выводит:
перезаписан
Ответить с цитированием
  #108  
Старый 05-04-2021, 13:42
Василий Гончаров Василий Гончаров вне форума
Разработчик Robur
 
Регистрация: Oct 2016
Сообщения: 154
По умолчанию

Отправьте нам пример Вашего файла, мы посмотрим.
Ответить с цитированием
  #109  
Старый 05-07-2021, 8:37
eugene eugene вне форума
Новичок
 
Регистрация: Apr 2021
Сообщения: 5
По умолчанию

Цитата:
Сообщение от Василий Гончаров
2. Тип площадного объекта тоже удобнее выводить у струтурной линии. Для этого Вам необходимо получить эту информацию по коду семантики.
Например:
Код:
StructureLine line = ... var code = line.AreaCode; SemanticRootNode smt; //искомая строка string area_description; if (SemanticLibrarySet.Current.TryGetValue(code, out smt)) { area_description = string.Format("{1}-({0})", code, smt.Caption); } else { area_description = code.ToString(); }


Это помогло, спасибо. Еще подскажите, как получить вид площадного объекта для полигонов. Например, Высокоствольноe для Редколесье-(1066)
Изображения
 
Ответить с цитированием
  #110  
Старый 05-17-2021, 17:59
Василий Гончаров Василий Гончаров вне форума
Разработчик Robur
 
Регистрация: Oct 2016
Сообщения: 154
По умолчанию

Цитата:
Сообщение от eugene
Это помогло, спасибо. Еще подскажите, как получить вид площадного объекта для полигонов. Например, Высокоствольноe для Редколесье-(1066)


Добрый день! К сожалению для вида площадного объекта нет тэга в структуре семантики, поэтому получить его значение Вы можете только воспользовавшись методом приведённым ранее:

Цитата:
Сообщение от Василий Гончаров
Добрый день!

К сожалению предыдущий способ сильно зависит от самого файла семантики, фактически Вы опираетесь на его внутренние данные.
Посмотреть какие именно handle соответствуют какому узлу, можно просто открыв в текстовом редакторе файл семантики, например,
оперируя данными из файла Semantic.xml

<Item Caption="Канализация" Handle="1017">
<Propertys aType="0">
<Property ClassName="0" Caption="Вид" Handle="1">
<Items aType="0">
<Item Caption="Наземная" Handle="2">
<Propertys aType="0">
<Property ClassName="0" Caption="Тип" Handle="4">
<Items aType="0">
<Item Caption="Без подразделений" Handle="5">
<Propertys aType="0">
<Property ClassName="0" Caption="Подписывать буквенный индекс" Handle="22">
<Items aType="0">
<Item Caption="Да" Handle="39">

Таким образом код, в приведённом примере делает следующее:
Поскольку в SemanticDataSet структурной линии уже содержит корневой узел с handle 1017
То вызвав запрос элемента с handle = 1 мы получим значение свойства "Вид"
Поскольку это SemanticJumper, то его значением является handle выбранного подэлемента.
selected_handle = semantic[semantic[1]]
Метод semantic.Root.TryGetNode позволяет получить семантический узел по его коду
if (semantic.Root.TryGetNode(selected_handle, ref)):
ConsoleListner.Current.WriteLine(ref.Value.Caption )
Здесь мы проверяем, что работаем непосредственно с узлом handle = 2 - то есть с Наземной канализацией
if (selected_handle == 2):
Теперь нам необходимо определить Тип, для этого у Наземной линии мы запрашиваем узел с handle = 4
selected_handle = semantic[semantic[4]]
Снова получаем семантический узел по его коду и выводим его наименование
if (semantic.Root.TryGetNode(selected_handle, ref)):
ConsoleListner.Current.WriteLine(ref.Value.Caption )
Для того чтобы получить Подписывать буквенный индекс значение свойства мы проверяем hanlde типа
sign_index = False
Если это тип Без подразделений, то Подписывать буквенный индекс стоит в значении Да, если значение handle равно 39
if (selected_handle == 5):
sign_index = semantic[semantic[22]] == 39


Этот метод работы достаточно трудоёмок и имеет ряд существенных недостатков - первое, он чуствителен к содержимому файла
семантики, что было нами успешно продемонстрированно в предыдущем примере. Поскольку там использовался нестандартный файл семантики
и handle внутри файла отличались, от системных для версии 8.x
К достоинствам метода можно отнести тот факт, что Вы имеете возможность опредлять значения всех свойств, включая скрытые.

В принципе для решения Вашего вопроса, действительно можно вызвать функцию GetVisibleProperties() у LinearSemantic и определять
Ваши значения по визуальному представлению свойств.
Если Вы создаёте свой собственный объект, и Вам нужно опираться на какие-либо определённые свойства, то рекомендую прописывать для них
свойство Tag, и обращатся к значению свойства по этому тэгу.
Ответить с цитированием
Ответ


Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 3:40.

Навигация по основному сайту
Главная Каталог продуктов и услуг Где купить Сопровождение
Вакансии О компании Обзоры Канал на YouTube

vBulletin v3.0.7 , Copyright ©2000-2022, Jelsoft Enterprises Ltd.
Copyright © 2003-2022, НПФ "ТОПОМАТИК".