Сообщество программистов Autodesk в СНГ
ADN Club => Revit API => Тема начата: RealDoc от 26-12-2019, 16:30:47
-
Если создать файл в ревите с нуля, то не удаляется уровень с наименованием "Уровень 1". При попытке его удаления Revit API выдаёт исключение. Причём там написано просто - невозможно удалить элемент. Без каких либо подробностей. Причём независимо от того, есть ли кроме него в файле какие то уровни или нет.
Подскажите пожалуйста - с чем это может быть связано? Это какой то служебный уровень, который нельзя удалять в принципе? Ни переименование уровня ни изменение elevation на невозможность его удаления не влияют.
Если это служебный не удаляемый элемент - по какому его свойству это можно увидеть?
-
Нельзя удалить последний уровень в проекте, так прекрасно удаляется всё. Если ты создаешь уровни программно в пустом файле, то перед удалением уровня вызови doc.Regenerate, либо удаляй его в отдельной транзакции
-
Кроме всего, я бы был очень осторожен, удаляя уровни без проверки, есть ли на них элементы. Все, что лежало на уровне, удалится вместе с ним без дополнительных вопросов.
-
так в том то и дело, что он не последний. Создаю новый проект на основание шаблона. в нём у меня создаётся несколько уровней. Любой другой уровень удаляется без проблем. А при попытке удалить "Уровень 1" выдаётся exception c текстом "ElementId cannot be deleted.\r\nParameter name: elementId". Даже если кроме него в проекте есть ещё другие уровни
Может быть дело в шаблоне? Там не может у уровней выставляться какое нибудь свойство, показывающее, что его нельзя удалить?
doc.Regenerate не помогает. Транзакцию открываю непосредственно перед попыткой удаления.
-
А из интерфейса тоже не удаляется? Я со своим шаблоном проверил, любые уровни удаляются, если они не последние. Попробуй не из шаблона создавать, а совсем пустой проект.
-
спасибо за подсказку. После попытки удалить руками Revit выдал более понятный текст. При создание из шаблона "Уровень 1" сразу становится открытым. А удалять открытые уровни нельзя. когда переключаюсь на другой уровень - "Уровень 1" отлично удаляется
-
ещё одна проблема - не получается определить открытый уровень. Я правильно понимаю, что это должно быть какое то свойство у Application.ActiveUIDocument.Document.ActiveView ?
-
ещё одна проблема - не получается определить открытый уровень. Я правильно понимаю, что это должно быть какое то свойство у Application.ActiveUIDocument.Document.ActiveView ?
Application.ActiveUIDocument.Document.ActiveView.GenLevel - это?
-
Не всегда. Если, например, перейти в окно диспетчера проект, то в этом свойстве null. Если переключиться на рабочую область, то да, в этом свойстве прописан открытый уровень
-
Лучше уж проверять:
1) UIDocument.ActiveGraphicalView
это как раз к вопросу перейти в окно диспетчера проект
В этом случае Document.ActiveView будет диспетчером проектов :-)
2) View.GenLevel может быть null в 10-ках разных случаев, например для видов разрезов, чертежных видов, 3D, спецификаций, листов и т.д., даже для планов (правда, у меня так и не получилось воспроизвести такое поведение, но в рабочих моделях видел, да)
3) Удалить вид не даст только в том случае, если он последний открытый, а не просто ActiveView. В принципе, можно либо проверять открытые виды с помощью UIDocument.GetOpenUIViews. Можно пойти другим путём - открыть или создать любой вид, GenLevel которого точно удаляться не будет. Либо вообще открывать документ без UI. Я так понимаю, ты вызываешь метод NewProjectDocument, можно положить вместе с addin-ом пустой файлик, открывать его методом Document.OpenDocumentFile, тогда активного вида не будет, останется проверить, что вид не последний в модели, что в принципе можно обеспечить подготовкой файла, который открывается плагин и где происходит что-то полезное.
-
не очень понял. В приложенном изображение - "Уровень 1" имеет ID 356. А UIDocument.GetOpenUIViews возвращает один вид с ID 355. Между этими двумя элементами есть какая то связь?
-
Эээ...
А разве должна быть?
Ну разве что, получить вид по id, взять его GenLevel.
-
так.. что то я совсем запутался. Изначально проблема была в том, что через Revit API в новом документе не удавалось удалить уровень с наименованием "Уровень 1".
Впоследствие выяснилось, что уровень не удаляется потому, что он открыт. Я правильно понимаю, что открытые уровни я могу получить сначала вызвав функцию UIDocument.GetOpenUIViews, а потом для всех видов, которые она возвращает, взять свойство GenLevel ?
-
Для нового документа да, достаточно будет проверить GenLevel активного вида.
Я описывал общие правила определения возможности удаления уровня из документа.
Просуммирую их ещё раз: после удаления уровня должны выполняться следующие условия:
1) в документе остались уровни
2) остались открытые виды
3) в принципе в документе остались виды
с 1, я думаю, всё понятно, для определния того, остались ли открытые виды можно воспользоваться методом UIDocument.GetOpenUIViews. Я бы скомбинировал с level.GetDependentElements(new ElementClassFilter(typeof(View)), если у Вас версия Revit 2018.1 +
с 3 тоже, думаю, всё понятно