Показать сообщение отдельно
  #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, и обращатся к значению свойства по этому тэгу.
Ответить с цитированием