Ошибка при получении геометрии арматуры

Автор Тема: Ошибка при получении геометрии арматуры  (Прочитано 5380 раз)

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

Оффлайн VladislavАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 210
  • Карма: 0
Добрый день.
При попытке получить геометрию арматурных элементов возникает такая ошибка
(скрин прилагаю). Не могу понять, в чем дело...
Это возникает не со всеми файлами, где есть армирование.
Спасибо за ответы.

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Такое в твоем приложении только? В Revit lookup пробовал посмотреть, то же самое выдаст?

Оффлайн VladislavАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 210
  • Карма: 0
Нет, а где взять Lookup?

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc

Оффлайн VladislavАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 210
  • Карма: 0
А что нужно смотреть в Lookup?
По Snoop DB никаких ошибок нет...
« Последнее редактирование: 14-02-2020, 12:34:22 от Vladislav »

Оффлайн Agens

  • ADN OPEN
  • ***
  • Сообщений: 223
  • Карма: 0
очень похоже, что не находит какую-то сборку
VS2019, VBA 7.1, VB.NET, C#, ACAD2019, Revit 2020

Оффлайн VladislavАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 210
  • Карма: 0
Если перед получением геометрии я добавляю проверку Rebar.IsValidObject, то для части арматуры все хорошо.
Но это только половина всей арматуры. Получается, что вторая половина - это невалидные объекты...
Почему, не ясно...

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
что не находит какую-то сборку
Кто не находит?

Геометрию случаем не в рамках активной транзакции получаешь? Если да, то стОит попробовать регенерировать документ сначала

Оффлайн VladislavАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 210
  • Карма: 0
Перед получением геометрии я делаю отображение всей арматуры на виде в форме сплошного тела.
Это в рамках транзакции. Потом она закрывается. И уже после этого происходит получение геометрии.
А как регенерировать документ средствами API? Может, это в любом случае стоит сделать?

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Правильно ли я понял, что ты
1) получаешь какие-то элементы
2) вносишь изменения в модель
3) работаешь со списком элементов из п.1
?

Тогда невалидность элементов, в общем-то, может и не ожидаемое (т.к., в большинстве случаев Revit обрабатывает весьма корректно), но не удивительное явление, попробуй после внесения изменений получить элементы, геометрия которых тебя интересует заново.

А как регенерировать документ средствами API?
Код - C# [Выбрать]
  1. document.Regenerate();

Может, это в любом случае стоит сделать?
Нет, если ты не обманываешь и закоммитил транзакцию перед получением геометрии.

Регенерация нужна для того, чтобы после изменения документа в рамках запущенной транзакции привести модель к валидному состоянию. При коммите транзакции Revit это делает сам, автоматически.

Если мои предположения в начале ответа верны, то дело, по-видимому, в том, что арматура объект непростой, возможно, внутри это композит и при изменении отображения внутри что-то создается или удаляется.

Оффлайн VladislavАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 210
  • Карма: 0
Примерно так.
Но все изменения, которые я делаю - это превращение армирования по площади в одиночные стержни
и отображение всей арматуры в виде тела.

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Но все изменения, которые я делаю - это превращение армирования по площади в одиночные стержни
и отображение всей арматуры в виде тела.

Тогда, скорее удивительно, что в каких-то случаях вообще работает  ;D

Оффлайн VladislavАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 210
  • Карма: 0
А как тогда нужно поступить правильно?
Я разрабатываю и дорабатываю конвертер Revit-моделей.
И мне необходима геометрия арматуры.

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Как в ответе выше. После коммита транзакции заново получить из документа элементы

Оффлайн VladislavАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 210
  • Карма: 0
Это только арматуры касается?
То есть я заново должен получить объекты класса Rebar
после "удаления" армирования по площади?

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Наверное, не только, по крайней мере, сценарий возникновения проблемы вполне ясный.

Оффлайн VladislavАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 210
  • Карма: 0
То есть, если я правильно понял:
1) Я получаю объекты
2) Произвожу изменения в транзакции
3) Заново получаю объекты и беру их геометрию
Так?

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Да. должно решить проблему

Оффлайн VladislavАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 210
  • Карма: 0
Некоторые арматурные элементы представляют собой RebarInSystem.
Можно ли получать его геометрию или нужно как-то преобразовать в обычный Rebar предварительно?
По аналогии с RemoveAreaReinforcementSystem.

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Посмотри RevitLookup-ом

Оффлайн VladislavАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 210
  • Карма: 0
Еще один момент.
При попытке сделать арматуру видимой или разбить AreaReinforcement
появляется сообщение с предупреждением(скрин прикладываю).
Я так понял это связано с тем, что файл отсоединен от еще каких-то(файлов) и я работаю с локальной копией?
То есть по сути я не могу его редактировать в транзакции?

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Эм, ну это как бы базовые вещи, чисто пользовательские. Работаешь с локальной копией, а центральный файл не доступен. Можешь открыть файл с опцией "отсоединить" например

Оффлайн VladislavАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 210
  • Карма: 0
  Если открыть данную Revit-модель с отсоединением от хранилища и при получении геометрии
арматуры указывать вид, где вся арматура вручную сделана видимой и отображенной как тело, то
всё хорошо. Но возникает другая проблема. Я не могу сделать её видимой как тело в рамках транзакции
на произвольном 3D-виде, хотя никаких исключений в коде, делающем это, нет...просто вид никак не меняется.
И соответственно, получить геометрию арматуры с этого вида я не могу...

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Создай свой собственный вид.

Оффлайн VladislavАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 210
  • Карма: 0
А можно пример его создания на c#?
Нужен обычный перспективный 3D вид, на котором
можно сделать видимой арматуру.
Заранее спасибо.

И еще вопрос сюда же.
Если в 3D виде нельзя управлять видимостью элементов,
можно ли это как-то отключить через API, чтобы было можно?
View3D.Unlock() не помогает...
Благодарю.

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Статические методы View3D.CreateIsometric / CreatePerspective, после создания поставить ViewTemplateId в ElementId.InvalidElementId, дальше настроить DisplayStyle, скрыть ненужные категории (хотя бы для того, чтобы просто быстрее отрабатывало). Если вдруг остались фильтры - удалить. Может ещё видимость рабочих наборов повлиять.

На C# под рукой нет сейчас, вот для Iron Python Shell-а, там по аналогии сообразишь что тебе нужно/не нужно из этого:
Код - Python [Выбрать]
  1. tx = Transaction(doc, "create 3d")
  2. tx.Start()
  3.  
  4. view = View3D.CreateIsometric(doc, doc.GetDefaultElementTypeId(ElementTypeGroup.ViewType3D))
  5.  
  6. view.AreImportCategoriesHidden = True
  7. view.ViewTemplateId = ElementId.InvalidElementId
  8. view.DisplayStyle = DisplayStyle.Wireframe
  9. view.AreAnalyticalModelCategoriesHidden = True
  10. view.AreAnnotationCategoriesHidden = False
  11. view.AreModelCategoriesHidden = False
  12. view.IsSectionBoxActive = False
  13.  
  14. filters = view.GetFilters()
  15.  
  16. for filter in filters:
  17.         view.RemoveFilter(filter)
  18.  
  19. collector = FilteredWorksetCollector(doc)
  20.  
  21. worksets = collector.OfKind(WorksetKind.UserWorkset)
  22.  
  23. for workset in worksets:
  24.         view.SetWorksetVisibility(workset.Id, WorksetVisibility.Visible)
  25.        
  26. view.SetCategoryHidden(ElementId(BuiltInCategory.OST_RvtLinks), True)
  27.  
  28. tx.Commit()


View3D.Unlock - для разблокировки вида, обратный метод SaveOrientationAndLock, по сигнатуре должна быть понятна его цель.