![]() |
#101
|
|||
|
|||
![]() Добрый день!
К сожалению предыдущий способ сильно зависит от самого файла семантики, фактически Вы опираетесь на его внутренние данные. Посмотреть какие именно 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
|
|||
|
|||
![]() Добрый день. Подскажите, пожалуйста:
1. Как попросить пользователя выбрать полигоны SurfacePolygonWrapper любым удобным для него образом, по одному, рамкой и т.д. Видел в этой теме как это сделать для Turnouts, но не могу сделать по аналогии для полигонов. Как получить слой, на котором они лежат? 2. Как у SurfacePolygonWrapper вывести тип площадного объекта, соответствующий AreaObjectCode. Например не просто "(1058) Полигон", а "(1058) Сенокос" 3. Как получить Polyline3D от AlignmentWrapper. Я смог сделать только так: Код:
При этом, конечно, потерялась координата Z вершин. Она мне не нужна для текущей задачи, но всё же приятно было бы иметь, если понадобится в будущем. И кстати, что такое Bugle в BugleVector3D? 4. Общий вопрос по развитию продукта. Планируется ли переход на более свежие версии .NET? Привык работать в VSCode и там не скомпилировать под 3.5, так как соответствующего SDK нигде нет в интернете (либо я не смог найти). |
#103
|
|||
|
|||
![]() И ещё вопрос. Есть ли возможность в IronPython, использующийся в программе, установить доп. библиотеки? Пробовал вызвать pip из кода, он говорит что нет такого пакета. И еще нет некоторых библиотек, которые в обычной последней версии Айрона идут из коробки. Например, collections.
|
#104
|
|||
|
|||
![]() 1. Поскольку полигон представляет собой просто замкнутую структурную линию, то Вам удобнее работать не с классом SurfacePolygonWrapper,
а непосредственно с самими структурными линиями. Для выбора структурных линий Вам придется использовать специальный метод у SurfaceLayer. Необходимо воспользоваться либо связкой методов SelectStructureLines с предикатом фильтрующим замкнутые полигоны и методом GetSelectedStructureLines, либо методами SelectOneStructureLine или PeakOneStructureLine для выбора одной линии. Например: Код:
2. Тип площадного объекта тоже удобнее выводить у струтурной линии. Для этого Вам необходимо получить эту информацию по коду семантики. Например: Код:
3. Для того, чтобы получить Polyline3D из AlignmentWrapper, Вам необходимо вызвать у него метод GetPolyline(IPolyline3D polyline). Код:
К сожалению, на данный момент полилиния создаётся без Z координат, но на нашей практике пока не было случая, когда это было бы необходимо. Обычно вертикальное положение получают при помощи профиля. Bugle в BugleVector3D - это историческая опечатка. На самом деле это кривизна дуги bulge. Если Вам необходимо получить параметры самой дуги, Вы можете воспользоваться статическим методом CadLibrary.PolylineSegmentToArc. 4. Переход на более свежие версии Net планируется. Версия 9.0 будет работать уже с фреймворк 4.0. В дальнейшем мы планируем переход на Net Core. 5. К сожалению мы используем не самую последнюю версию IronPython и не все дополнительные библиотеки там поддерживаются. |
#105
|
|||
|
|||
![]() Спасибо. Еще пара вопросов.
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
|
|||
|
|||
![]() 1. Вам необходимо в явном виде указать кодировку в файла, и сформировать его в нужной кодировке. Для примера можете использовать файл surface_mapsigns.py из комплекта стандартной поставки.
2. Вы можете воспользоваться свойством TargetProjectFile у активного проекта, получив его например так для версии 15.0 ApplicationHost.Current.ActiveProject.TargetProjec tFile или ApplicationHost.Current.ActiveProject.TargetProjec tUri для версии 16.0. |
#107
|
|||
|
|||
![]() Цитата:
1. Пробовал. Кодировка теряется, в консоль и файл выводит: перезаписан |
#108
|
|||
|
|||
![]() Отправьте нам пример Вашего файла, мы посмотрим.
|
#109
|
|||
|
|||
![]() Цитата:
Это помогло, спасибо. Еще подскажите, как получить вид площадного объекта для полигонов. Например, Высокоствольноe для Редколесье-(1066) |
#110
|
|||
|
|||
![]() Цитата:
Добрый день! К сожалению для вида площадного объекта нет тэга в структуре семантики, поэтому получить его значение Вы можете только воспользовавшись методом приведённым ранее: Цитата:
|
Навигация по основному сайту |
Главная | Каталог продуктов и услуг | Где купить | Сопровождение |
Вакансии | О компании | Обзоры | Канал на YouTube |