Не удаётся удалить уровень

Автор Тема: Не удаётся удалить уровень  (Прочитано 6796 раз)

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

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

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Если создать файл в ревите с нуля, то не удаляется уровень с наименованием "Уровень 1". При попытке его удаления Revit API выдаёт исключение. Причём там написано просто - невозможно удалить элемент. Без каких либо подробностей. Причём независимо от того, есть ли кроме него в файле какие то уровни или нет.
Подскажите пожалуйста - с чем это может быть связано? Это какой то служебный уровень, который нельзя удалять в принципе? Ни переименование уровня ни изменение elevation на невозможность его удаления не влияют.
Если это служебный не удаляемый элемент - по какому его свойству это можно увидеть?

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Не удаётся удалить уровень
« Ответ #1 : 26-12-2019, 16:39:49 »
Нельзя удалить последний уровень в проекте, так прекрасно удаляется всё. Если ты создаешь уровни программно в пустом файле, то перед удалением уровня вызови doc.Regenerate, либо удаляй его в отдельной транзакции

Оффлайн maksl

  • ADN OPEN
  • Сообщений: 21
  • Карма: 4
Re: Не удаётся удалить уровень
« Ответ #2 : 26-12-2019, 18:17:33 »
Кроме всего, я бы был очень осторожен, удаляя уровни без проверки, есть ли на них элементы. Все, что лежало на уровне, удалится вместе с ним без дополнительных вопросов.

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

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Re: Не удаётся удалить уровень
« Ответ #3 : 28-12-2019, 18:02:07 »
так в том то и дело, что он не последний. Создаю новый проект на основание шаблона.  в нём  у меня создаётся несколько уровней. Любой другой уровень удаляется без проблем. А при попытке удалить "Уровень 1" выдаётся exception c текстом "ElementId cannot be deleted.\r\nParameter name: elementId". Даже если кроме него в проекте есть ещё другие уровни
Может быть дело в шаблоне? Там не может у уровней выставляться какое нибудь свойство, показывающее, что его нельзя удалить?

doc.Regenerate не помогает. Транзакцию открываю непосредственно перед попыткой удаления.

Оффлайн maksl

  • ADN OPEN
  • Сообщений: 21
  • Карма: 4
Re: Не удаётся удалить уровень
« Ответ #4 : 28-12-2019, 19:00:49 »
А из интерфейса тоже не удаляется? Я со своим шаблоном проверил, любые уровни удаляются, если они не последние. Попробуй не из шаблона создавать, а совсем пустой проект.

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

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Re: Не удаётся удалить уровень
« Ответ #5 : 28-12-2019, 20:05:47 »
спасибо за подсказку. После попытки удалить руками Revit выдал более понятный текст. При создание из шаблона "Уровень 1" сразу становится открытым. А удалять открытые уровни нельзя. когда переключаюсь на другой уровень - "Уровень 1" отлично удаляется

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

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Re: Не удаётся удалить уровень
« Ответ #6 : 03-01-2020, 01:02:43 »
ещё одна проблема - не получается определить открытый уровень. Я правильно понимаю, что это должно быть какое то свойство у Application.ActiveUIDocument.Document.ActiveView ?

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

  • Administrator
  • *****
  • Сообщений: 13898
  • Карма: 1790
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Не удаётся удалить уровень
« Ответ #7 : 03-01-2020, 13:41:07 »
ещё одна проблема - не получается определить открытый уровень. Я правильно понимаю, что это должно быть какое то свойство у Application.ActiveUIDocument.Document.ActiveView ?
Application.ActiveUIDocument.Document.ActiveView.GenLevel - это?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Re: Не удаётся удалить уровень
« Ответ #8 : 05-01-2020, 19:34:35 »
Не всегда. Если, например, перейти в окно диспетчера проект, то в этом свойстве null.  Если переключиться на рабочую область, то да, в этом свойстве прописан открытый уровень

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Не удаётся удалить уровень
« Ответ #9 : 05-01-2020, 20:10:47 »
Лучше уж проверять:

1) UIDocument.ActiveGraphicalView
это как раз к вопросу
перейти в окно диспетчера проект

В этом случае Document.ActiveView будет диспетчером проектов :-)

2) View.GenLevel может быть null в 10-ках разных случаев, например для видов разрезов, чертежных видов, 3D, спецификаций, листов и т.д., даже для планов (правда, у меня так и не получилось воспроизвести такое поведение, но в рабочих моделях видел, да)

3) Удалить вид не даст только в том случае, если он последний открытый, а не просто ActiveView. В принципе, можно либо проверять открытые виды с помощью UIDocument.GetOpenUIViews. Можно пойти другим путём - открыть или создать любой вид, GenLevel которого точно удаляться не будет. Либо вообще открывать документ без UI. Я так понимаю, ты вызываешь метод NewProjectDocument, можно положить вместе с addin-ом пустой файлик, открывать его методом Document.OpenDocumentFile, тогда активного вида не будет, останется проверить, что вид не последний в модели, что в принципе можно обеспечить подготовкой файла, который открывается плагин и где происходит что-то полезное.

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

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Re: Не удаётся удалить уровень
« Ответ #10 : 05-01-2020, 22:38:13 »
не очень понял. В приложенном изображение - "Уровень 1" имеет ID 356. А UIDocument.GetOpenUIViews возвращает один вид с ID 355. Между  этими двумя элементами есть какая то связь?

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Не удаётся удалить уровень
« Ответ #11 : 05-01-2020, 23:23:47 »
Эээ...

А разве должна быть?

Ну разве что, получить вид по id, взять его GenLevel.

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

  • ADN OPEN
  • Сообщений: 8
  • Карма: 0
Re: Не удаётся удалить уровень
« Ответ #12 : 06-01-2020, 00:11:17 »
так.. что то я совсем запутался. Изначально проблема была в том, что через Revit API в новом документе не удавалось удалить уровень с наименованием "Уровень 1".
Впоследствие выяснилось, что уровень не удаляется потому, что он открыт. Я правильно понимаю, что открытые уровни я могу получить сначала вызвав функцию UIDocument.GetOpenUIViews, а потом для всех видов, которые она возвращает, взять свойство GenLevel ?

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Не удаётся удалить уровень
« Ответ #13 : 09-01-2020, 13:54:43 »
Для нового документа да, достаточно будет проверить GenLevel активного вида.

Я описывал общие правила определения возможности удаления уровня из документа.

Просуммирую их ещё раз: после удаления уровня должны выполняться следующие условия:
1) в документе остались уровни
2) остались открытые виды
3) в принципе в документе остались виды

с 1, я думаю, всё понятно, для определния того, остались ли открытые виды можно воспользоваться методом UIDocument.GetOpenUIViews. Я бы скомбинировал с level.GetDependentElements(new ElementClassFilter(typeof(View)), если у Вас версия Revit 2018.1 +
с 3 тоже, думаю, всё понятно