Созданный размер не появляется на плане

Автор Тема: Созданный размер не появляется на плане  (Прочитано 3109 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Всем привет. Столкнулся со странным поведением
Итак: Имеем - Revit 2015, План первого этажа с одной колонной на нем.
Что делаю - указываю две точки через PickPoint. По этим точкам создаю отрезок Line.CreateBound().
Дальше, через get_Geometry() из колонны собираю все отрезки:
Код - C# [Выбрать]
  1. public static void GetGeometryFromGeometryElement(
  2.     GeometryElement geometryElement,
  3.     ref List<Face> faces,
  4.     ref List<Curve> curves,
  5.     ref List<Solid> solids
  6.     )
  7. {
  8.     foreach (GeometryObject geometryObject in geometryElement)
  9.     {
  10.         Face face = geometryObject as Face;
  11.         if (face != null)
  12.         {
  13.             faces.Add(face);
  14.             continue;
  15.         }
  16.         Curve curve = geometryObject as Curve;
  17.         if (curve != null)
  18.         {
  19.             if (curve.Reference != null)
  20.                 curves.Add(curve);
  21.             continue;
  22.         }
  23.         Solid solid = geometryObject as Solid;
  24.         if (solid != null)
  25.         {
  26.             solids.Add(solid);
  27.             continue;
  28.         }
  29.         GeometryInstance geometryInstance = geometryObject as GeometryInstance;
  30.         if (geometryInstance != null)
  31.         {
  32.             GeometryElement transformedGeometryElement =
  33.                 geometryInstance.GetInstanceGeometry();
  34.             GetGeometryFromGeometryElement(transformedGeometryElement, ref faces, ref curves, ref solids);
  35.         }
  36.     }
  37. }
Из всех солидов и фейсов тоже собираю отрезки:
Код - C# [Выбрать]
  1. if (faces.Any())
  2.     foreach (Face face in faces)
  3.         GeometryHelpers.GetCurvesFromFace(face, ref curves);
  4. if (solids.Any())
  5.     foreach (Solid solid in solids)
  6.         GeometryHelpers.GetCurvesFromSolid(solid, ref curves);
  7. ...........................
  8. public static void GetCurvesFromSolid(Solid solid, ref List<Curve> curves)
  9. {
  10.     foreach (Edge edge in solid.Edges)
  11.     {
  12.         if (edge.AsCurve().Reference != null)
  13.             curves.Add(edge.AsCurve());
  14.     }
  15.     foreach (var f in solid.Faces)
  16.     {
  17.         if (f is Face face)
  18.             GetCurvesFromFace(face, ref curves);
  19.         if (f is PlanarFace planarFace)
  20.             GetCurvesFromFace(planarFace, ref curves);
  21.     }
  22. }
  23. public static void GetCurvesFromFace(Face face, ref List<Curve> curves)
  24. {
  25.     EdgeArrayArray edgeArrayArray = face.EdgeLoops;
  26.     foreach (EdgeArray edgeArray in edgeArrayArray)
  27.     {
  28.         foreach (Edge edge in edgeArray)
  29.         {
  30.             if (edge.AsCurve().Reference != null)
  31.                 curves.Add(edge.AsCurve());
  32.         }
  33.     }
  34. }
  35. public static void GetCurvesFromFace(PlanarFace face, ref List<Curve> curves)
  36. {
  37.     EdgeArrayArray edgeArrayArray = face.EdgeLoops;
  38.     foreach (EdgeArray edgeArray in edgeArrayArray)
  39.     {
  40.         foreach (Edge edge in edgeArray)
  41.         {
  42.             if (edge.AsCurve().Reference != null)
  43.                 curves.Add(edge.AsCurve());
  44.         }
  45.     }
  46. }
Для всех этих манипуляций использую опции:
Код - C# [Выбрать]
  1. Options options = new Options { ComputeReferences = true, View = doc.ActiveView, IncludeNonVisibleObjects = true };
Затем, после некоторых простых математических манипуляций у меня остается только два крайних отрезка. Я беру их референсы и по ним создаю новый размер

И вот тут происходит самое интересное - я получаю размер Шредингера! =))) Размер создается! Через отладку кода я получаю его Id. Но на плане он НЕ ПОЯВЛЯЕТСЯ! Его просто нету.
При этом, используя команду "Выбрать по коду" это размер выбирается. Через LookUp смотрю - все с ним нормально. Но его при этом нет!

Кто сталкивался с таким?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Догадываюсь, что самое интересне не в том коде, который ты показал (как обычно  ;) ), а в том которым ты создаёшь размер.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Догадываюсь, что самое интересне не в том коде, который ты показал (как обычно  ;) ), а в том которым ты создаёшь размер.
Не в данном случае ))
Создание размера делается одной строчкой:
Код - C# [Выбрать]
  1. using (Transaction transaction = new Transaction(doc, "PIK_DimensionByLine"))
  2. {
  3.     transaction.Start();
  4.     List<Dimension> createdDimensions = new List<Dimension>();
  5.     if (!referenceArray.IsEmpty)
  6.     {
  7.         var dimension = doc.Create.NewDimension(doc.ActiveView, line, referenceArray);
  8.  
  9.         createdDimensions.Add(dimension);
  10.     }
  11.     //AdvancedHelpers.DimensionDilution(createdDimensions, _uiApplication);
  12.     transaction.Commit();
  13. }
Проблема не в этом. Я так уже не раз создавал и все нормально.

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
У меня есть предположение, что проблема кроется где-то в районе причины, что колонна - это семейство. Видимо получение геометрии из семейства связанно с какими-то проблемами

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Дальше интересней. Пришел домой и решил сделать тестовый проект для изучения этой проблемы. Но в итоге даже не дошёл до создания размера.
Итак, вот код:
Извините, вам запрещён просмотр содержимого спойлеров.

Создаю новый документ без шаблона, загружаю первое попавшееся семейство колонны, вставляю два экземпляра и запускаю код.
В окне вывода имею следующее:
Цитировать
Selected column id: 2815
Selected column id: 2815
Type: Autodesk.Revit.DB.Point
Type: Autodesk.Revit.DB.Line
Type: Autodesk.Revit.DB.GeometryInstance
   Type: Autodesk.Revit.DB.Solid
   Type: Autodesk.Revit.DB.Solid
   Type: Autodesk.Revit.DB.Line
   has reference: False
   Type: Autodesk.Revit.DB.Line
   has reference: False
Type: Autodesk.Revit.DB.Point
Type: Autodesk.Revit.DB.Line
Type: Autodesk.Revit.DB.GeometryInstance
   Type: Autodesk.Revit.DB.Solid
   Type: Autodesk.Revit.DB.Solid
   Type: Autodesk.Revit.DB.Line
   has reference: False
   Type: Autodesk.Revit.DB.Line
   has reference: False
Т.е., перебирая геометрию, я получаю два отрезка. Логично предположить, что осевые линии колонны



Вот только самое интересное - Reference этих отрезков null-евые!

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Александр, первое, что я бы сделал - попробовал в более новой версии Revit. Со времен Revit 2015 уже выпущено 3 версии. Вполне вероятно, если была ошибка в API, то она уже исправлена.
Второе, при выборе по коду, размер находится. А если выбрать "Показать"? Находит объект?

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Александр, первое, что я бы сделал - попробовал в более новой версии Revit. Со времен Revit 2015 уже выпущено 3 версии. Вполне вероятно, если была ошибка в API, то она уже исправлена
Есть рабочая необходимость в версиях 2015,2017. Хотя, в 2017 тоже самое
Второе, при выборе по коду, размер находится. А если выбрать "Показать"? Находит объект?
Нет, не находит. "Невозможно подобрать вид"

В общем - столкнувшись с этой проблемой я решил пойти другим путём - для каждой конкретной категории я беру геометрию и уже обрабатываю ее для создания размера. Как я понял, попытка создать универсальный метод поиска Reference для создания размеров - неудачная попытка

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Отменяю решение)
Пойдя по другому пути пришел туда-же - размер создается но не появляется. Проверено в 2015 и 2017 Ревите
Это при создании размера по линиям, которые я получаю из GeometryInstance.
Сейчас еще попробую поэкспериментировать  с солидом (я на колонне пробую), но колонны могут быть крыгле, прокатные и т.п., что усложняет задачу

Отмечено как Решение Александр Пекшев aka Modis 14-09-2017, 16:47:16

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
В общем, после долгих ломаний головы и различных тестов, выяснил причину и нашёл решение
О, КАК Я ЛЮБЛЮ REVIAPI! ВСЕ НАОБОРОТ!   :D :D :D
Дело все в том, что при получении геометрии семейства, когда используешь geometryInstance.GetInstanceGeometry(), то ссылки будут вести не на экземпляр семейства, а на типоразмер семейства! Поэтому нужно использовать geometryInstance.GetSymbolGeometry(), что вопреки своему названию делает все наоборот - возвращает геометрию, ссылающуюся на экземпляр семейства!