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

ADN Club => Revit API => Тема начата: AlexZhur от 21-11-2020, 21:05:47

Название: Блокируются вкладки на ленте при вставке семейства
Отправлено: AlexZhur от 21-11-2020, 21:05:47
 Добрый вечер. Подскажите плиз, может кто-нибудь сталкивался с такой проблемой:
  При вставке или загрузки семейства (методы LoadFamilySymbol(), PromptForFamilyInstancePlacement()), которое было создано в более ранней версии Revit, после отображения диалогового окна с информацией об обновлении модели и отработки методов - блокируются вкладки на ленте, т.е. никак не реагируют на щелчки мыши. При этом спокойно можно работать с диспетчером проекта и областью рисования. Если вставляется семейство, созданное для текущей версии Revit, блокировки вкладок не происходит.
Название: Re: Блокируются вкладки на ленте при вставке семейства
Отправлено: Александр Игнатович от 23-11-2020, 11:06:27
Обычно, такие "спецэффекты" - результат обращения к API там, где среда выполнения этого не ожидает, например, из другого потока.
Название: Re: Блокируются вкладки на ленте при вставке семейства
Отправлено: AlexZhur от 23-11-2020, 11:17:43
Обращение к методам PromptForFamilyInstancePlacement() и LoadFamilySymbol() идет в методе Execute() при генерации внешнего события с помощью Raise(). Вызов Raise() происходит из обработчика события окна wpf. Как можно побороть данную проблему. Интересно, что при щелчке по окну свойств экземпляра семейства, вкладки на ленте разблокируются
Название: Re: Блокируются вкладки на ленте при вставке семейства
Отправлено: Александр Игнатович от 23-11-2020, 11:37:43
Обращение к методам PromptForFamilyInstancePlacement() и LoadFamilySymbol() идет в методе Execute()

Если действительно всё так, тогда проблем быть не должно. Попробуй на чистом Revit запустить, без надстроек, в т.ч. сторонних. Собери "minimal reproducible case", посмотрим
Название: Re: Блокируются вкладки на ленте при вставке семейства
Отправлено: AlexZhur от 23-11-2020, 12:42:59
Блокировка возникает только в случае необходимости обновления (и появления окна с уведомлением об обновлении) семейства до текущей версии при загрузки и вставки в Revit. Если вставляется и загружается семейство, которое соответствует текущей версии Revit (2019), то все работает отлично.
Название: Re: Блокируются вкладки на ленте при вставке семейства
Отправлено: Александр Игнатович от 23-11-2020, 12:53:58
Ну у меня не воспроизводится)
Название: Re: Блокируются вкладки на ленте при вставке семейства
Отправлено: AlexZhur от 23-11-2020, 13:09:11
На чистом Revit тоже самое :(. Попробую собрать minimal reproducible example. 
Название: Re: Блокируются вкладки на ленте при вставке семейства
Отправлено: AlexZhur от 23-11-2020, 16:12:59
Я написал "minimal reproducible case", но результат такой-же.
Название: Re: Блокируются вкладки на ленте при вставке семейства
Отправлено: AlexZhur от 23-11-2020, 17:04:57
Во вложении minimal reproducible case для анализа  :). Чтобы не усложнять - в тесте предусмотрена возможность загрузки типоразмеров версии 2016 и 2019 в Revit 2019. После обновления типоразмера версии 2016 до 2019 и его загрузки, вкладки блокируются
Название: Re: Блокируются вкладки на ленте при вставке семейства
Отправлено: Александр Игнатович от 23-11-2020, 17:27:20
Посмотрю, наверное, уже завтра утром, если что, отправлю в Autodesk
Название: Re: Блокируются вкладки на ленте при вставке семейства
Отправлено: AlexZhur от 23-11-2020, 17:36:48
Понял. Спасибо.
Название: Re: Блокируются вкладки на ленте при вставке семейства
Отправлено: Александр Игнатович от 24-11-2020, 13:12:18
Так, ну в Autodesk писать тут смысла нет от слова "совсем".

Зачем изобретать модальность на функциях winAPI я так и не понял, когда есть метод ShowDialog.

Убираем самописную модальность через EnableWindow(hWnd, false) / EnableWindow(hWnd, true) и всё работает, есть небольшая трабла с enabled/disabled кнопок на вкладке (не блокированием!) (старая тема, никак не поправят), решается, например, так:
Код - C# [Выбрать]
  1. uiDoc.Selection.SetElementIds(new[] { anyValidId });
  2.  
  3. uiDoc.Selection.SetElementIds(new List<ElementId>(0));

Ну, если так уж хочешь оставить как есть, вот тебе хинт - если перед тем, как загружать семейство, вызвать TaskDialog, то проблем нет, т.е. можно попробовать создать своё модальное (нормально модальное) окно, которое будет сразу же само загружаться, то, возможно, заработает. Но, наверное, лучше не городить костылей, вызывать ShowDialog(), тут и лишние external event-ы не нужны

Название: Re: Блокируются вкладки на ленте при вставке семейства
Отправлено: AlexZhur от 25-11-2020, 12:05:36
Добрый день, Александр.
Заменил EnableWindow на ShowDialog(). Проблема осталась. Сразу после загрузки семейства, если щелкать по вкладкам на ленте, то они не реагируют. При вызове TaskDialog, проблема исчезает.
ПРИ ЭТОМ:
  -Если вставлять семейство отдельной командой, без внешних событий, то все отлично отрабатывает.
  - Если вставлять семейство версия которого соответствует версии Revit с внешним событием, то тоже все отлично работает. Я думаю, что  вопрос с потоками, когда грузиться семейство более ранней версии и идет процесс с обновления. И не совсем понятно про вызов uiDoc.Selection.SetElementIds(new[] { anyValidId });
 и uiDoc.Selection.SetElementIds(new List<ElementId>(0)); - в каком месте осуществлять вызов этих методов и что подразумевается под anyValidId?
Что посоветуете?
Название: Re: Блокируются вкладки на ленте при вставке семейства
Отправлено: Александр Игнатович от 25-11-2020, 12:16:39
  -Если вставлять семейство отдельной командой, без внешних событий, то все отлично отрабатывает.
Ну так и отлично же, команда запускает ShowDialog, дальше обрабатывается загрузка семейства, ну, или оставить как есть, сделав окно немодальным

в каком месте осуществлять вызов этих методов и что подразумевается под anyValidId?
после загрузки семейства. anyValidId - любой элемент / типоразмер в модели, хотя бы id загруженного FamilySymbol
Название: Re: Блокируются вкладки на ленте при вставке семейства
Отправлено: AlexZhur от 25-11-2020, 14:11:46
 Я имел ввиду отдельную команду, в которой сразу загружается семейство, без открытия окна и внешнего события.
А по факту у меня окно привязано к команде, которая вызывается при щелчке на кнопку на панели. Получается, что в случае  внешнего события и вызова метода загрузки семейства более ранней версии методом LoadFamilySymbol() из метода Execute(), вкладки перестают реагировать на щелчки мыши.
 При этом, повторюсь, семейство текущей версии загружается без проблем.
Название: Re: Блокируются вкладки на ленте при вставке семейства
Отправлено: Александр Игнатович от 25-11-2020, 14:39:31
Поехали по кругу? Убираешь из кода WinAPI EnableWindow, всё работает как надо. Если тебе нужна диалоговая форма, тогда и вызывай её ShowDialog, externalevent-ы не нужны.
Название: Re: Блокируются вкладки на ленте при вставке семейства
Отправлено: AlexZhur от 25-11-2020, 15:32:31
Все сделал, как ты написал. Убрал все лишнее (внешние event-ы тоже). Транзакцию вставки семейства запускаю по щелчке на кнопку в окне. Сразу после вызова метода LoadFamilySymbol() вызываю  _uiDoc.Selection.SetElementIds(new List<ElementId>() { familySymbol.Id }); и  _uiDoc.Selection.SetElementIds(new List<ElementId>(0));. В результате, после загрузки и обновления семейства, кнопки и  панели на вкладки находятся в состоянии disable и вкладки заблокированы  :(.