Получить геометрию для многосегментной оси сетки

Автор Тема: Получить геометрию для многосегментной оси сетки  (Прочитано 3315 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Кирилл ЗахаровАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 119
  • Карма: 5
Здравствуйте!

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

Я использую Revit 2018.

Отмечено как Решение Кирилл Захаров 18-10-2017, 17:33:30

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Открываю справку, и вижу метод GetGridIds(). Соответственно, используя этот метод, я получаю айдишники всех осей в многосегментной сетке, далее через doc.GetElement(ElementId) получаю сами оси (элементы), ну а дальше get_Geometry()

Оффлайн Кирилл ЗахаровАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 119
  • Карма: 5
Спасибо, сейчас проверю

Оффлайн Кирилл ЗахаровАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 119
  • Карма: 5
Александр, огромное спасибо!

Все работает не совсем так, как вы сказали. Нужно уточнить:
Насколько я могу судить, get_Geometry возвращает null как для просто Grid, так и для MultiSegmentGrid, но у Grid есть свойства IsCurved и Curve, благодаря которым можно получить данные о геометрии.

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Код - 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. }
Кусок из кода - все работает и все получается (геометрия получается)

Оффлайн Кирилл ЗахаровАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 119
  • Карма: 5
Да, действительно работает. Значит я неправильно настраивал параметры объекта Options.
Спасибо еще раз!

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
но у Grid есть свойства IsCurved и Curve
Если вы ищите геометрию для простановки размеров, то не стоит использовать Curve. В 2015 Ревите это работает, а вот уже в 2017 нет. Только через get_Geometry
Значит я неправильно настраивал параметры объекта Options
Для осей нужно обязательно в Options указывать View

Оффлайн Кирилл ЗахаровАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 119
  • Карма: 5
Нет, мне не для простановки размеров.
У меня многосегментная ось это трасса автомобильной дороги. Мне нужно много раз скопировать набор элементов, который представляет собой опору эстакады, но при этом ось симметрии опоры должна быть всегда параллельна трассе.
Объект типа Curve как раз имеет методы, которые помогут мне соблюсти это условие.

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