Форум НПФ  

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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #91  
Старый 06-14-2019, 14:57
VSP VSP вне форума
Новичок
 
Регистрация: Jun 2019
Сообщения: 22
По умолчанию

Спасибо. Теперь необходимо задать семантику. Например: Точка плановой геодезической сети-(1002). Надо поменять вид на Временного закрепления на местности.
И второй вопрос: задать УЗ не имеющий кода (например пункты ориентирные ).

Последний раз редактировалось VSP, 06-14-2019 в 15:04.
Ответить с цитированием
  #92  
Старый 06-17-2019, 16:07
Василий Гончаров Василий Гончаров вне форума
Разработчик Robur
 
Регистрация: Oct 2016
Сообщения: 141
По умолчанию

Добрый день!
Код:
SurfacePoint point = ... SemanticRootNode value; //получаете узел структуры по коду if (SemanticLibrarySet.Current.TryGetValue(1002, out value)) { foreach (var n in value) { //находите узел "Вид" if (n.Caption.Equals("Вид")) { //этот узел является выпадающим список, объявленным отдельно var jumper = n as SemanticJumper; if (jumper != null) { foreach (var item in jumper) { //находим нужный элемент списка if (item.Caption.Equals("Временного закрепления на местности", StringComparison.OrdinalIgnoreCase)) { //присваеваем нужный узел point.Semantic[jumper.Handle] = item.Handle; break; } } } } } //обновляем информацию по слоям SurfacePointExtensiveInformation information = ... surface.RefreshPointLayer(information); surface.RefreshPointSign(information); } Surface surface = ... surface.BeginUpdate(); try { PointSignxLibraryNode node; if (PointSignxLibrary.Current.TryGetValue("{здесьдолжен быть GUID условного знака}", out node)) { //находим нужный знак и синхронизируем его с поверхностью var id = surface.PointSigns.Syncronize(node); var layer = surface.GetLayer(node); //назначем условный знак var information = surface.Points.GetExtensiveInformation(Index); information.Sign = id; information.Layer = layer; } } finally { surface.EndUpdate(); }
Ответить с цитированием
  #93  
Старый 06-23-2019, 13:59
VSP VSP вне форума
Новичок
 
Регистрация: Jun 2019
Сообщения: 22
По умолчанию

Спасибо!
Как определить условный знак точки, если point.Code = 0 (например пункты ориентирные ). И что еще необходимо для копирования точки со всеми атрибутами в новую ЦММ?
Ответить с цитированием
  #94  
Старый 06-24-2019, 15:04
Василий Гончаров Василий Гончаров вне форума
Разработчик Robur
 
Регистрация: Oct 2016
Сообщения: 141
По умолчанию

1. Если point.Sign != 0 - значит у точки поверхности задан условный знак
2. Чтобы корректно скопировать точку в другую ЦММ, необходимо дополнительно обработать её слои и условные знаки, код должен выглядеть примерно так:
Код:
Surface source = ... Surface destination = ... //создаем временные словари для быстрого поиска уже обработанных слоев и условных знаков var used_layers = new Dictionary<uint, uint>(); used_layers.Add(0, 0); var used_signs = new Dictionary<uint, uint>(); used_signs.Add(0, 0); //начинаем изменение поверхности destination.BeginUpdate(); try { //создаем класс отвечающий за корректное изменение и добавление точек в поверхность var editor = new PointEditor(destination); for (int i = 0; i < source.Points.Count; i++) { var source_pt = source.Points[i]; //проверяем что существующая точка не удалена if (!source_pt.IsRemoved) { //клонируем существующую точку var clone = source_pt.Clone(); //проверяем есть ли у неё расширенная информация if (source_pt.HasExtensiveInformation) { //если есть, необходимо корректно переназначить слои и условные знаки uint new_layer; //проверяем, не обрабатывали ли мы уже такой слой if (!used_layers.TryGetValue(source_pt.Layer, out new_layer)) { new_layer = 0; //находим этот слой в существующей поверхности var l = source.Situation.Layers.GetObject(source_pt.Layer) as DwgLayer; if (l != null) { //находим такой слой в результирующей поверхности var existing = destination.Situation.Layers[l.Name]; if (existing == null) //если такого слоя нет, создаём его existing = destination.Situation.Layers.Add(l.Name, l); //назначаем новый слой new_layer = existing.ObjectID; } //добвляем в обработанные слои used_layers.Add(source_pt.Layer, new_layer); } uint new_sign; //проверяем, не обрабатывали ли мы уже такой условный знак if (!used_signs.TryGetValue(source_pt.Sign, out new_sign)) { new_sign = 0; //находим этот условный знак в существующей поверхности var l = source.Situation.PointSigns.GetObject(id) as DwgConventionalSign<BlockReference>; if (l != null) { //находим такой условный знак в результирующей поверхности var existing = destination.Situation.PointSigns[l.Name]; if (existing == null) //если такого знака нет, создаём его existing = destination.Situation.PointSigns.Add(l.Name, l); new_sign = existing.ObjectID; } //добвляем в обработанные знаки used_signs.Add(source_pt.Layer, new_layer); } //назначаем новый слой и знак точке clone.Layer = new_layer; clone.Sign = new_sign; } //добавляем точку в результирующую поверхность editor.Add(clone); } } } finally { destination.EndUpdate(); }
Ответить с цитированием
  #95  
Старый 07-10-2019, 12:06
bambr bambr вне форума
Пользователь
 
Регистрация: Jan 2019
Сообщения: 91
По умолчанию

уже нашел

Последний раз редактировалось bambr, 07-10-2019 в 14:38.
Ответить с цитированием
  #96  
Старый 02-12-2021, 10:58
VSP VSP вне форума
Новичок
 
Регистрация: Jun 2019
Сообщения: 22
По умолчанию

Здравствуйте!
Делаю выбор семантики на python. На примере от 06-17-2019, 16:07. Подскажите, пожалуйста, как реализовать такой момент:
var jumper = n as SemanticJumper;
Ответить с цитированием
  #97  
Старый 02-12-2021, 13:03
Василий Гончаров Василий Гончаров вне форума
Разработчик Robur
 
Регистрация: Oct 2016
Сообщения: 141
По умолчанию

Добрый день!

Вероятно Вы имеете в виду проверку типа, её можно реализовать таким образом:
Код:
if (isinstance(n, SemanticJumper)): ...
Ответить с цитированием
  #98  
Старый 02-15-2021, 14:19
VSP VSP вне форума
Новичок
 
Регистрация: Jun 2019
Сообщения: 22
По умолчанию

Спасибо! Еще вопрос: В модели есть структурная линия с кодом 1017 Канализация. Вид - подземная. Тип - ливневая. Подписывать индекс - да. Надо определить вид, тип, наличие индекса для дальнейшего использования. Насколько я понял, надо пройти по всем узлам структуры семантики, как описано в посте #92 ) для вновь создаваемого объекта. Как получить доступ к этой структуре у существующей структурной линии? Либо возможен иной способ получить сразу все данные по объекту? (через GetVisibleProperties как указано в посте #76 )

Последний раз редактировалось VSP, 02-15-2021 в 14:34.
Ответить с цитированием
  #99  
Старый 02-19-2021, 17:56
Василий Гончаров Василий Гончаров вне форума
Разработчик Robur
 
Регистрация: Oct 2016
Сообщения: 141
По умолчанию

Добрый день!

Если кратко, то примерно так:
Код:
# -*- coding: utf-8 -*- #рекомендую посмотреть модули surface_mapsigns.py и robur.py #они расположены в каталоге с программой в подкаталоге Lib #моудль surface_mapsigns.py реализует работу с условными знаками и может быть полезен как справочный #импортируем необходимые библиотеки #все библиотеки вида System.* и Topomatic.* - это библиотеки на языке C# import System import Topomatic import Topomatic.Sfc import Topomatic.Dwg #выполняем импорт основных сервисных функций из модуля robur.py, таких как getstring и getreal from robur import * #выполням импорт класса SurfacePoint - это точка поверхности from Topomatic.Sfc import SurfacePoint #выполням импорт класса SurfaceLayer - для использования SurfaceExtentions.TranslateExplorationCode, подробнее описано ниже from Topomatic.Sfc.Layer import SurfaceExtentions #выполняем импорт 2D и 3D точек from Topomatic.Cad.Foundation import Vector3D from Topomatic.Cad.Foundation import Vector2D #выполняем импорт примитива выноски from Topomatic.Dwg.Entities import DwgLeader #подключаем сборку для ModelWatcher clr.AddReferenceByPartialName("Topomatic.Alg.Runtime") from Topomatic.Alg.Runtime.ServiceClasses import ModelWatcher #это имя нашего модуля, оно должно быть уникальным среди подключаемых модулей class SampleLineModule(PyModule): #атрибут action позволяет нам добавить команду которую можно поместить в меню #вы указываете название команды, и дополнительным параметром alias - связанную с ней команду вызова из командной строки @action('Написать значение семантического свойства вид, тип, подписывать индекс для структурной линии с кодом 1017', alias='structure_line') def act_draw_line_props(self, sender, e): #получаем слой поверхности с которой можно получить линию surface_layer = self.ActiveSurfaceLayer if (surface_layer == None): print 'Активная поверхность не найдена' return #получаем модель поверхности surface = surface_layer.Surface #выбираем линию с нужным кодом line = surface_layer.PeakOneStructureLine(lambda index: surface.StructureLines[index].LinearCode == 1017, "Укажите линию канализации") if (line == None): return #вся семантика для длинейного условного знака находится в свойстве LinearSemantic semantic = line.LinearSemantic #к сожалению, сематника не очень удобна для работы вручную #значение можно получить либо по строковому тэгу #либо по цифровому значению handle #все эти данные можно посмотреть в файлах семантике #к сожалению, мы не предполагали использование некоторых свойств для пользовательского редактирования #поэтому отвечая на Ваш вопрос, для того чтобы определить Вид, Тип и наличие индекса #необходимо ориентироваться на значения из файла семантики ref = clr.Reference[SemanticNode]() selected_handle = semantic[semantic[1]] if (semantic.Root.TryGetNode(selected_handle, ref)): #ref.Value.Caption - строка с наименованием вида #для простоты все данные выводятся в консоль робур ConsoleListner.Current.WriteLine(ref.Value.Caption ) if (selected_handle == 2): selected_handle = semantic[semantic[12]] if (semantic.Root.TryGetNode(selected_handle, ref)): #ref.Value.Caption - строка с наименованием типа #для простоты все данные выводятся в консоль робур ConsoleListner.Current.WriteLine(ref.Value.Caption ) #определяем значение флага подписывать или нет sign_index = False #Без подразделений if (selected_handle == 13): sign_index = semantic[semantic[29]] == 59 #Бытовая if (selected_handle == 14): sign_index = semantic[semantic[30]] == 61 #Дренажная if (selected_handle == 15): sign_index = semantic[semantic[31]] == 63 #Ливневая if (selected_handle == 16): sign_index = semantic[semantic[32]] == 65 #Напорная if (selected_handle == 17): sign_index = semantic[semantic[33]] == 67 #Производственная if (selected_handle == 18): sign_index = semantic[semantic[34]] == 69 #Производственно-ливневая if (selected_handle == 19): sign_index = semantic[semantic[36]] == 71 #Условно чистых вод if (selected_handle == 20): sign_index = semantic[semantic[37]] == 73 #Химически загрязненных стоков if (selected_handle == 21): sign_index = semantic[semantic[38]] == 75 #гораздо проще работать со свойствами, у которых указан тэг #например, для того, чтобы получить значение свойства Формат подписи типа property_ref = clr.Reference[object]() if (semantic.TryGetValue("format_type", ref)): #для простоты все данные выводятся в консоль робур ConsoleListner.Current.WriteLine(str(ref))) #здесь мы выполняем регистрацию нашего модуля, регистрация модуля объязательна, #имя - это то имя, под которым он будет отображаться в меню Сервис - Адаптация #там же появиться возможность добавить объявленые через атрибут action команды в меню SampleLineModule().register('Работа с ливневой канализацией')
Ответить с цитированием
  #100  
Старый 02-20-2021, 9:55
VSP VSP вне форума
Новичок
 
Регистрация: Jun 2019
Сообщения: 22
По умолчанию

Спасибо! Кое-что прояснилось, но не до конца.
При запуске данного примера:
Выбран объект 1017 (selected_handle=3)
ref.Value.Caption = Подземная
Другой объект 1017 (selected_handle=2)
ref.Value.Caption = Наземная
Далее код
if (selected_handle == 2):
____selected_handle = semantic[12]

Приводит к KeyError: Данный ключ отсутствует в словаре.
Как определить какой handle какому узлу семантики соответствует (особенно для пользовательского объекта семантики с множеством переходов).
Мне надо получить значения всех узлов, например:
Вид
-Наземная
___Тип
_____-Без подразделений
_________Подписывать буквенный индекс
_________-Да
____________Отметка
____________-По низу
Материал
___-Сталь

Последний раз редактировалось VSP, 02-20-2021 в 11:24.
Ответить с цитированием
Ответ


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

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

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

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



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

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

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