Сообщество программистов Autodesk в СНГ

ADN Club => Revit API => Тема начата: Кирилл Захаров от 18-10-2017, 16:55:24

Название: Получить геометрию для многосегментной оси сетки
Отправлено: Кирилл Захаров от 18-10-2017, 16:55:24
Здравствуйте!

Подскажите, пожалуйста, можно ли получить какие-нибудь данные о геометрии многосегментной оси сетки (MultiSegmentGrid).
Когда я использую метод MultiSegmentGrid.get_Geometry он всегда возвращает null при любом параметре Autodesk.Revit.DB.Options.

Я использую Revit 2018.
Название: Re: Получить геометрию для многосегментной оси сетки
Отправлено: Александр Пекшев aka Modis от 18-10-2017, 16:59:58
Открываю справку, и вижу метод GetGridIds() (http://www.revitapidocs.com/2015/203790e1-56b4-52d3-83f5-14ccd3409466.htm). Соответственно, используя этот метод, я получаю айдишники всех осей в многосегментной сетке, далее через doc.GetElement(ElementId) получаю сами оси (элементы), ну а дальше get_Geometry()
Название: Re: Получить геометрию для многосегментной оси сетки
Отправлено: Кирилл Захаров от 18-10-2017, 17:04:56
Спасибо, сейчас проверю
Название: Re: Получить геометрию для многосегментной оси сетки
Отправлено: Кирилл Захаров от 18-10-2017, 17:33:26
Александр, огромное спасибо!

Все работает не совсем так, как вы сказали. Нужно уточнить:
Насколько я могу судить, get_Geometry возвращает null как для просто Grid, так и для MultiSegmentGrid, но у Grid есть свойства IsCurved и Curve, благодаря которым можно получить данные о геометрии.
Название: Re: Получить геометрию для многосегментной оси сетки
Отправлено: Александр Пекшев aka Modis от 18-10-2017, 17:36:40
Код - C# [Выбрать]
  1. Options options = new Options
  2. {
  3.     ComputeReferences = true,
  4.     View = _uiApplication.ActiveUIDocument.Document.ActiveView,
  5.     IncludeNonVisibleObjects = true
  6. };
  7. var geometry = grid.get_Geometry(options);
  8. foreach (GeometryObject geometryObject in geometry)
  9. {
  10.     if (geometryObject is Line line)
  11.     {
  12.         if (getVerticals && line.IsVertical() && line.Reference != null)
  13.             if (line.IntersectToByMovingZ(workLine))
  14.                 references.Add(line.Reference);
  15.         if (getHorizontals && line.IsHorizontal() && line.Reference != null)
  16.             if (line.IntersectToByMovingZ(workLine))
  17.                 references.Add(line.Reference);
  18.     }
  19. }
Кусок из кода - все работает и все получается (геометрия получается)
Название: Re: Получить геометрию для многосегментной оси сетки
Отправлено: Кирилл Захаров от 18-10-2017, 17:48:12
Да, действительно работает. Значит я неправильно настраивал параметры объекта Options.
Спасибо еще раз!
Название: Re: Получить геометрию для многосегментной оси сетки
Отправлено: Александр Пекшев aka Modis от 18-10-2017, 22:39:21
но у Grid есть свойства IsCurved и Curve
Если вы ищите геометрию для простановки размеров, то не стоит использовать Curve. В 2015 Ревите это работает, а вот уже в 2017 нет. Только через get_Geometry
Значит я неправильно настраивал параметры объекта Options
Для осей нужно обязательно в Options указывать View
Название: Re: Получить геометрию для многосегментной оси сетки
Отправлено: Кирилл Захаров от 18-10-2017, 23:03:08
Нет, мне не для простановки размеров.
У меня многосегментная ось это трасса автомобильной дороги. Мне нужно много раз скопировать набор элементов, который представляет собой опору эстакады, но при этом ось симметрии опоры должна быть всегда параллельна трассе.
Объект типа Curve как раз имеет методы, которые помогут мне соблюсти это условие.

Мне вообще кажется, что оба варианта: свойство Curve и метод get_Geometry должны приводить к одним и тем же объектам Line и Arc, которые унаследованы от Curve.
В любом случае я только начал изучать API Ревит, поэтому мне трудно понять эту проблему с расстановкой размеров. Но тем не менее буду иметь в виду, спасибо.