Форум НПФ  

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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #11  
Старый 02-27-2019, 11:45
bambr bambr вне форума
Пользователь
 
Регистрация: Jan 2019
Сообщения: 91
По умолчанию

Спасибо.
А есть штатная функция объединения BoundingBox2D нескольких структурных линий? Чтобы получить общую границу.
Ответить с цитированием
  #12  
Старый 02-27-2019, 12:09
Василий Гончаров Василий Гончаров вне форума
Разработчик Robur
 
Регистрация: Oct 2016
Сообщения: 154
По умолчанию

В такой функции ней нет необходимости, дело в том, что при добавлении точек BoundingBox2D расширяется. Для того чтобы объединить два BoundingBox2D нужно просто в результирующий BoundingBox2D добавить Min и Max точки исходных BoundingBox2D.
Если использовать конструктор по умолчанию, то BoundingBox2D создается с Min и Max точками, равными Vector2D.Empty, соответственно рамка будет всегда учитывать точку с координатами (0, 0). Чтобы этого избежать необходимо результирующий BoundingBox2D создать по BoundingBox2D структурной первой линии, а все последующие линии добавлять в него.
Код:
List<StructureLine> lines = ... if (lines.Count > 0) { //поскольку BoundingBox2D это структура var result = lines[0].Bounds2d; for (int i = 1; i < lines.Count; i++) { var b = lines[i].Bounds2d; result.AddPoint(b.Min); result.AddPoint(b.Max); } }
Ответить с цитированием
  #13  
Старый 02-27-2019, 15:15
bambr bambr вне форума
Пользователь
 
Регистрация: Jan 2019
Сообщения: 91
По умолчанию

Как в структурной линии достать семантическую информацию по тегу или наименованию?
И можно чуть поподробнее об
Цитата:
Для выделения одной или нескольких структурных линий вы можете воспользоваться методом SelectStructureLine у класса SurfaceLayer туда необходимо передать индекс структурной линии и флаг
индекс в чем?
SelectStructureLine есть у SurfaceSelectionSet -
Topomatic.Sfc.Layer.SurfaceLayer.SurfaceSelectionS et.SelectStructureLine(int, bool)
у SurfaceLayer - SelectOneStructureLine(Predicate<int> match, string message) или SelectStructureLines(Predicate<int> match, string message, params string[] args)

И по позапрошлому посту - как включить видимость обычного "автокадовского" слоя из структурной линии.
Ответить с цитированием
  #14  
Старый 02-27-2019, 15:45
Василий Гончаров Василий Гончаров вне форума
Разработчик Robur
 
Регистрация: Oct 2016
Сообщения: 154
По умолчанию

1. Семантическая информация у структурной линии доступна через свойства LinearSemantic и AreaSemantic, для линейного и площадного условного знака соответственно.

2. Да, Вы правы, метод есть у SurfaceSelectionSet. Индекс - это индекс линии в списке структурных линий поверхности.

3. Чтобы включить видимость "автокадовского" слоя у структурной линии, необходимо проверить свойство Layer. Если оно больше 0, то структурная линия лежит на отдельном слое, получить который можно по свойству Layer. Если равно 0 то линия лежит на слое структурные линии, получить который можно через стили поверхности.
Код:
Surface surface = ... StructureLine line = ... DwgLayer layer; if (line.Layer > 0) { layer = situation.Layers.GetObject(line.Layer) as DwgLayer; } else { layer = surface.Style.StructureLinesStyle.GetLayer(); }
Ответить с цитированием
  #15  
Старый 02-27-2019, 16:55
bambr bambr вне форума
Пользователь
 
Регистрация: Jan 2019
Сообщения: 91
По умолчанию

2. Окно "Свойство" не отображает никаких свойств выделенной структурной линии через SurfaceLayer.SurfaceSelectionSet.SelectStructureLi ne - как его заставить показать информацию? У SurfaceLayer.SelectStructureLines(Predicate<int> match, string message, params string[] args) match - тот же индекс? Что писать в message и аргументы?

1. Это я нашел - хотелось бы пример правильной работы с - Topomatic.Smt.SemanticDataSet

Как зуммируется CadView по колесу мышки? арифметическим пересчетом CurrentScale?
Ответить с цитированием
  #16  
Старый 02-27-2019, 17:12
Василий Гончаров Василий Гончаров вне форума
Разработчик Robur
 
Регистрация: Oct 2016
Сообщения: 154
По умолчанию

1. Вызовите перед выделением метод BeginSelect а после выделения EndSelect
Код:
SelectionSet set = ... set.BeginSelect(); try { ... } finally { set.EndSelect(); }


2. Да, в предикате индекс - это индекс структурной линии в списке линий, message - это сообщение которые выводится пользователю в строке состояния при выборе линии, args - это необязательные параметры, в которых можно передать дополнительные команды, вызвать которые можно через контекстное меню.

3. Опишите подробнее, что конкретно Вы хотите сделать с Topomatic.Smt.SemanticDataSet, исходя из этого мы порекомендуем Вам пример работы.

4. Вопрос немного странный, что Вы подразумеваете под "арифметическим пересчетом CurrentScale"?
Ответить с цитированием
  #17  
Старый 02-28-2019, 9:42
bambr bambr вне форума
Пользователь
 
Регистрация: Jan 2019
Сообщения: 91
По умолчанию

3. У структурной линии есть добавленное вручную свойство "Владелец" с тегом %owner%. Как мне в программе получить/изменить его значение.

4. Я выделил структурную линию с помощью CadView.ZoomBound по ее границе. Крайние узлы лежат на границе экрана - я хочу немного отдалить чертеж( на +-1 шаг колесика мышки). Я могу сделать cadView.CurrentScale += 0.1 но непонятна механика получения данного коэффициента. Я могу чуток увеличить Bounds2d структурной линии до зуммирования. Может просто есть функция ZoomIn?
Ответить с цитированием
  #18  
Старый 02-28-2019, 10:49
Василий Гончаров Василий Гончаров вне форума
Разработчик Robur
 
Регистрация: Oct 2016
Сообщения: 154
По умолчанию

Для того чтобы установить или получить значение Вашего свойства в семантике линии, используйте Ваш тэг как ключ:
Код:
StructureLine line = ... //получение var value = (MyValue)line.LinearSemantic["owner"] //установка line.LinearSemantic["owner"] = value


Обычно в таких случаях мы стараемся границы увеличивать на величину, не зависящую от масштаба видового экрана.
Но, если Вам необходимо отдалить чертеж именно на шаг приближения, то Вы можете вызвать команду приблизить или отдалить, после приближения по границам.
Код:
BoundingBox2D bounds = ... CadView cadView = ... //устанавливаем границы cadView.ZoomBound(bounds , false); //находим команду уменьшить масштаб var action = ApplicationHost.Current.AddIns["ID_ZOOM_OUT"] as CallAction; if (action != null) //вызываем её сразу, без добавления в очередь команд action.PerformExecute(new ExecuteEventArgs()); //обновляем видовой экран cadView.Unlock(); cadView.Invalidate();
Ответить с цитированием
  #19  
Старый 02-28-2019, 16:58
bambr bambr вне форума
Пользователь
 
Регистрация: Jan 2019
Сообщения: 91
По умолчанию

Почему Surface.StructureLines но Surface.SurfaceTriangleArray, Surface.SurfacePatchArray, Surface.SurfacePointArray?
Почему у StructureLine есть Bounds2d, а у SurfacePatch - нет.
Есть SurfacePatch.Surface и StructureLine.Surface, а SurfacePoint.Surface - нету?

Как смасштабировать и выделить в CadView SurfacePatch?
У SurfaceSelectionSet есть только SelectPoint, SelectStructureLine и SelectTriangle.
Как подвинуть центр CadView в точку SurfacePoint?
Ответить с цитированием
  #20  
Старый 02-28-2019, 17:48
Василий Гончаров Василий Гончаров вне форума
Разработчик Robur
 
Регистрация: Oct 2016
Сообщения: 154
По умолчанию

1. Потому что тип StructureLines содержит внтури тип StructureLine, а тип SurfacePointArray содержит внутри тип SurfacePoint.
2. SurfacePatch - это описание группы треугольников, он не содержит внутри информации о том, какие треугольники входят в эту группу, поэтому у него нет свойства Bounds2d.
3. SurfacePoint - это структура, и их количество достаточно велико, по сравнению с теми же линиями или патчами, поэтому хранить в каждой точке указатель на поверхность накладно и неудобно.
4. Чтобы масштабировать SurfacePatch нужно посчитать его границы, для этого нужно получить все треугольники, входящие в этот патч и сформировать по ним границу. Для того чтобы выделить патч, достаточно выделить любой треугольник входящий в него, через метод SurfaceSelectionSet.SelectTriangle.
Код:
SurfacePatch patch = ... Surface surface = ... CadView cadView = ... SurfaceLayer.SurfaceSelectionSet selectionSet = ... var points = surface.Points; var triangles = surface.Points; var list = new List<int>(); surface.Patchs.GetTriangles(patch.Handle, list); if (list.Count > 0) { var bounds = new BoundingBox2D(points[triangles[list[0]].A], points[triangles[list[0]].A]); for (int i = 0; i < list.Count; i++) { var t = triangles[list[i]]; bounds.AddPoint(points[t.A]); bounds.AddPoint(points[t.B]); bounds.AddPoint(points[t.C]); } cadView.ZoomBounds(bounds, false); selectionSet.SelectTriangle(list[0], true); cadView.Unlock(); cadView.Invalidate(); }

5. Чтобы передвинуть CadView в точку поверхности, нужно получить текущие границы CadView, создать новые границы с центром в точке поверхности и вызвать ZoomBounds с новыми границами. Текущие границы CadView можно получить через свойство ViewBounds у экземпляра CadView.
Ответить с цитированием
Ответ


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

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

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

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



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

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

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