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

ADN Club => Revit API => Тема начата: Vladislav от 13-02-2020, 16:42:54

Название: Ошибка при получении геометрии арматуры
Отправлено: Vladislav от 13-02-2020, 16:42:54
Добрый день.
При попытке получить геометрию арматурных элементов возникает такая ошибка
(скрин прилагаю). Не могу понять, в чем дело...
Это возникает не со всеми файлами, где есть армирование.
Спасибо за ответы.
Название: Re: Ошибка при получении геометрии арматуры
Отправлено: Александр Игнатович от 13-02-2020, 16:46:27
Такое в твоем приложении только? В Revit lookup пробовал посмотреть, то же самое выдаст?
Название: Re: Ошибка при получении геометрии арматуры
Отправлено: Vladislav от 13-02-2020, 16:52:59
Нет, а где взять Lookup?
Название: Re: Ошибка при получении геометрии арматуры
Отправлено: Александр Игнатович от 13-02-2020, 16:54:13
https://lookupbuilds.com/index.html?prefix=releases/
Название: Re: Ошибка при получении геометрии арматуры
Отправлено: Vladislav от 13-02-2020, 18:00:13
А что нужно смотреть в Lookup?
По Snoop DB никаких ошибок нет...
Название: Re: Ошибка при получении геометрии арматуры
Отправлено: Agens от 14-02-2020, 12:51:19
очень похоже, что не находит какую-то сборку
Название: Re: Ошибка при получении геометрии арматуры
Отправлено: Vladislav от 14-02-2020, 14:27:42
Если перед получением геометрии я добавляю проверку Rebar.IsValidObject, то для части арматуры все хорошо.
Но это только половина всей арматуры. Получается, что вторая половина - это невалидные объекты...
Почему, не ясно...
Название: Re: Ошибка при получении геометрии арматуры
Отправлено: Александр Игнатович от 14-02-2020, 14:30:17
что не находит какую-то сборку
Кто не находит?

Геометрию случаем не в рамках активной транзакции получаешь? Если да, то стОит попробовать регенерировать документ сначала
Название: Re: Ошибка при получении геометрии арматуры
Отправлено: Vladislav от 14-02-2020, 14:54:09
Перед получением геометрии я делаю отображение всей арматуры на виде в форме сплошного тела.
Это в рамках транзакции. Потом она закрывается. И уже после этого происходит получение геометрии.
А как регенерировать документ средствами API? Может, это в любом случае стоит сделать?
Название: Re: Ошибка при получении геометрии арматуры
Отправлено: Александр Игнатович от 14-02-2020, 15:04:02
Правильно ли я понял, что ты
1) получаешь какие-то элементы
2) вносишь изменения в модель
3) работаешь со списком элементов из п.1
?

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

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

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

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

Если мои предположения в начале ответа верны, то дело, по-видимому, в том, что арматура объект непростой, возможно, внутри это композит и при изменении отображения внутри что-то создается или удаляется.
Название: Re: Ошибка при получении геометрии арматуры
Отправлено: Vladislav от 14-02-2020, 15:19:40
Примерно так.
Но все изменения, которые я делаю - это превращение армирования по площади в одиночные стержни
и отображение всей арматуры в виде тела.
Название: Re: Ошибка при получении геометрии арматуры
Отправлено: Александр Игнатович от 14-02-2020, 15:27:02
Но все изменения, которые я делаю - это превращение армирования по площади в одиночные стержни
и отображение всей арматуры в виде тела.

Тогда, скорее удивительно, что в каких-то случаях вообще работает  ;D
Название: Re: Ошибка при получении геометрии арматуры
Отправлено: Vladislav от 14-02-2020, 15:30:12
А как тогда нужно поступить правильно?
Я разрабатываю и дорабатываю конвертер Revit-моделей.
И мне необходима геометрия арматуры.
Название: Re: Ошибка при получении геометрии арматуры
Отправлено: Александр Игнатович от 14-02-2020, 15:31:27
Как в ответе выше. После коммита транзакции заново получить из документа элементы
Название: Re: Ошибка при получении геометрии арматуры
Отправлено: Vladislav от 14-02-2020, 15:41:18
Это только арматуры касается?
То есть я заново должен получить объекты класса Rebar
после "удаления" армирования по площади?
Название: Re: Ошибка при получении геометрии арматуры
Отправлено: Александр Игнатович от 14-02-2020, 15:42:36
Наверное, не только, по крайней мере, сценарий возникновения проблемы вполне ясный.
Название: Re: Ошибка при получении геометрии арматуры
Отправлено: Vladislav от 14-02-2020, 16:13:21
То есть, если я правильно понял:
1) Я получаю объекты
2) Произвожу изменения в транзакции
3) Заново получаю объекты и беру их геометрию
Так?
Название: Re: Ошибка при получении геометрии арматуры
Отправлено: Александр Игнатович от 14-02-2020, 16:16:33
Да. должно решить проблему
Название: Re: Ошибка при получении геометрии арматуры
Отправлено: Vladislav от 14-02-2020, 16:42:26
Некоторые арматурные элементы представляют собой RebarInSystem.
Можно ли получать его геометрию или нужно как-то преобразовать в обычный Rebar предварительно?
По аналогии с RemoveAreaReinforcementSystem.
Название: Re: Ошибка при получении геометрии арматуры
Отправлено: Александр Игнатович от 14-02-2020, 16:44:00
Посмотри RevitLookup-ом
Название: Re: Ошибка при получении геометрии арматуры
Отправлено: Vladislav от 14-02-2020, 18:13:34
Еще один момент.
При попытке сделать арматуру видимой или разбить AreaReinforcement
появляется сообщение с предупреждением(скрин прикладываю).
Я так понял это связано с тем, что файл отсоединен от еще каких-то(файлов) и я работаю с локальной копией?
То есть по сути я не могу его редактировать в транзакции?
Название: Re: Ошибка при получении геометрии арматуры
Отправлено: Александр Игнатович от 14-02-2020, 18:17:32
Эм, ну это как бы базовые вещи, чисто пользовательские. Работаешь с локальной копией, а центральный файл не доступен. Можешь открыть файл с опцией "отсоединить" например
Название: Re: Ошибка при получении геометрии арматуры
Отправлено: Vladislav от 15-02-2020, 15:26:35
  Если открыть данную Revit-модель с отсоединением от хранилища и при получении геометрии
арматуры указывать вид, где вся арматура вручную сделана видимой и отображенной как тело, то
всё хорошо. Но возникает другая проблема. Я не могу сделать её видимой как тело в рамках транзакции
на произвольном 3D-виде, хотя никаких исключений в коде, делающем это, нет...просто вид никак не меняется.
И соответственно, получить геометрию арматуры с этого вида я не могу...
Название: Re: Ошибка при получении геометрии арматуры
Отправлено: Александр Игнатович от 17-02-2020, 11:21:09
Создай свой собственный вид.
Название: Re: Ошибка при получении геометрии арматуры
Отправлено: Vladislav от 17-02-2020, 17:23:35
А можно пример его создания на c#?
Нужен обычный перспективный 3D вид, на котором
можно сделать видимой арматуру.
Заранее спасибо.

И еще вопрос сюда же.
Если в 3D виде нельзя управлять видимостью элементов,
можно ли это как-то отключить через API, чтобы было можно?
View3D.Unlock() не помогает...
Благодарю.
Название: Re: Ошибка при получении геометрии арматуры
Отправлено: Александр Игнатович от 17-02-2020, 18:06:17
Статические методы 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, по сигнатуре должна быть понятна его цель.