Блокируются вкладки на ленте при вставке семейства

Автор Тема: Блокируются вкладки на ленте при вставке семейства  (Прочитано 5335 раз)

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

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

  • ADN OPEN
  • Сообщений: 42
  • Карма: 0
 Добрый вечер. Подскажите плиз, может кто-нибудь сталкивался с такой проблемой:
  При вставке или загрузки семейства (методы LoadFamilySymbol(), PromptForFamilyInstancePlacement()), которое было создано в более ранней версии Revit, после отображения диалогового окна с информацией об обновлении модели и отработки методов - блокируются вкладки на ленте, т.е. никак не реагируют на щелчки мыши. При этом спокойно можно работать с диспетчером проекта и областью рисования. Если вставляется семейство, созданное для текущей версии Revit, блокировки вкладок не происходит.

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

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

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

  • ADN OPEN
  • Сообщений: 42
  • Карма: 0
Обращение к методам PromptForFamilyInstancePlacement() и LoadFamilySymbol() идет в методе Execute() при генерации внешнего события с помощью Raise(). Вызов Raise() происходит из обработчика события окна wpf. Как можно побороть данную проблему. Интересно, что при щелчке по окну свойств экземпляра семейства, вкладки на ленте разблокируются

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Обращение к методам PromptForFamilyInstancePlacement() и LoadFamilySymbol() идет в методе Execute()

Если действительно всё так, тогда проблем быть не должно. Попробуй на чистом Revit запустить, без надстроек, в т.ч. сторонних. Собери "minimal reproducible case", посмотрим

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

  • ADN OPEN
  • Сообщений: 42
  • Карма: 0
Блокировка возникает только в случае необходимости обновления (и появления окна с уведомлением об обновлении) семейства до текущей версии при загрузки и вставки в Revit. Если вставляется и загружается семейство, которое соответствует текущей версии Revit (2019), то все работает отлично.

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

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

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

  • ADN OPEN
  • Сообщений: 42
  • Карма: 0
На чистом Revit тоже самое :(. Попробую собрать minimal reproducible example. 

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

  • ADN OPEN
  • Сообщений: 42
  • Карма: 0
Я написал "minimal reproducible case", но результат такой-же.

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

  • ADN OPEN
  • Сообщений: 42
  • Карма: 0
Во вложении minimal reproducible case для анализа  :). Чтобы не усложнять - в тесте предусмотрена возможность загрузки типоразмеров версии 2016 и 2019 в Revit 2019. После обновления типоразмера версии 2016 до 2019 и его загрузки, вкладки блокируются

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Посмотрю, наверное, уже завтра утром, если что, отправлю в Autodesk

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

  • ADN OPEN
  • Сообщений: 42
  • Карма: 0
Понял. Спасибо.

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Так, ну в 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-ы не нужны


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

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

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

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

в каком месте осуществлять вызов этих методов и что подразумевается под anyValidId?
после загрузки семейства. anyValidId - любой элемент / типоразмер в модели, хотя бы id загруженного FamilySymbol

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

  • ADN OPEN
  • Сообщений: 42
  • Карма: 0
 Я имел ввиду отдельную команду, в которой сразу загружается семейство, без открытия окна и внешнего события.
А по факту у меня окно привязано к команде, которая вызывается при щелчке на кнопку на панели. Получается, что в случае  внешнего события и вызова метода загрузки семейства более ранней версии методом LoadFamilySymbol() из метода Execute(), вкладки перестают реагировать на щелчки мыши.
 При этом, повторюсь, семейство текущей версии загружается без проблем.