Спрятать закрепляемую панель при закрытии Revit'a

Автор Тема: Спрятать закрепляемую панель при закрытии Revit'a  (Прочитано 9503 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

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

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Доброго дня!

Собственно сабж.
Создается закрепляемая панель и с помощью команды Show() вызывается, но после закрытия Revit закрепляемая панель запоминает позицию и появляется в том же месте (если ее перед закрытием Revit не отключить).
Как её спрятать или отключить при закрытии Revit?

Спасибо.

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Добрый день, Сергей.

В обработке события OnStartup вы регистрируете панель. Событие это вызывается при старте Revit. Событие OnShutdown в этом же интерфейсе IExternalDBApplication вызывается при закрытии Revit. Соответственно можете спрятать вашу панель в обработке этого события.

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

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Виктор, да собственно так и пытаюсь сделать:
Регистрация панели
Код - C# [Выбрать]
  1. public Result OnStartup(UIControlledApplication application) {
  2. ...
  3. if (!DockablePane.PaneIsRegistered(ModelCheckingWindow.PaneId)) {
  4.                 application.RegisterDockablePane(ModelCheckingWindow.PaneId,
  5.                     ModelCheckingWindow.PaneName,
  6.                     MyDockablePaneControl);
  7.             }
  8. ...
  9. }
  10.  

Пытаюсь скрыть при закрытии Revit
Код - C# [Выбрать]
  1. public Result OnShutdown(UIControlledApplication application) {
  2.  if (DockablePane.PaneIsRegistered(ModelCheckingWindow.PaneId)) {
  3.                 DockablePane dp = application.GetDockablePane(ModelCheckingWindow.PaneId);
  4.                 dp.Hide();
  5.             }
  6.             return Result.Succeeded;
  7.         }
  8.  
Но, возникает ошибка
Цитировать
The requested dockable pane has not been created yet.
Хотя по идее она создана, ведь
Код - C# [Выбрать]
  1. DockablePane.PaneIsRegistered(ModelCheckingWindow.PaneId)
возвращает True.
« Последнее редактирование: 20-08-2014, 10:49:33 от Виктор Чекалин »

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Хм. Действительно. Проверил у себя. То же самое.
Решения пока не нашел, но обнаружил интересный момент.

Закрепляемая панель доступна только тогда, когда открыт проект Revit. Для тестирования я взял проект из своей статьи. Если выполнить команду Command DockablePaneSample на стартовой странице, когда еще ни один проект не открыт, то при вызове метода GetDockablePane получаем ту же самую ошибку
Цитировать
The requested dockable pane has not been created yet.
. То есть панель зарегистрирована, но не создана. Создается она лишь при открытии или создании проекта.

Проверить, создана ли панель или нет, можно с помощью метода DockablePane.PaneExists

Событие OnShutdown вызывается, когда уже все документы закрыты, соответственно поэтому и возникает ошибка.



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

Отмечено как Решение shss 08-10-2014, 06:52:42

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
А вот и решение :)
Если все же хочется прятать панель при закрытии Revit, то можно пойти другим путем.
Подписываемся на событие DocumentClosing. Событие возникает перед закрытием документа, поэтому панель еще доступна.
Код - C# [Выбрать]
  1. a.ControlledApplication.DocumentClosing += ControlledApplication_DocumentClosing;

В обработке события проверяем, если закрываем последний документ, то прячем панель.
Код - C# [Выбрать]
  1.         void ControlledApplication_DocumentClosing(object sender, Autodesk.Revit.DB.Events.DocumentClosingEventArgs e)
  2.         {
  3.             var app = (Application) sender;
  4.          
  5.             UIApplication uiApp = new UIApplication(app);
  6.  
  7.             // Если общее количество документов = 1, т.е. мы закрываем последний документ
  8.             if (app.Documents.Size == 1)
  9.             {
  10.                 // Проверяем что панель зарегистрирована и доступна
  11.                 if (DockablePane.PaneIsRegistered(MyControl.PaneId) &&
  12.                     DockablePane.PaneExists(MyControl.PaneId))
  13.                 {                    
  14.                     DockablePane dp = uiApp.GetDockablePane(MyControl.PaneId);
  15.                     // Прячем панель
  16.                     dp.Hide();
  17.                 }
  18.             }
  19.         }

При закрытии Revit также идет последовательное закрытие всех открытых документов, поэтому это событие также будет выполняться.

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

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Виктор, Вы меня опередили!
Но я замешкался с количеством документов :)
Выставлял 0, так как думал, что сперва Revit закрывает все документы.

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Есть два события, связанные с закрытием документов: DocumentClosing и DocumentClosed. Первое вызывается, перед закрытием. Соответсвенно документ щее не закрыт. Второе же вызовется после того как документа закрыт. Вот там то количество и будет 0. Но панель там уже будет недоступна.
Решение как я понимаю вам подходит?

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

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Да, спасибо за подсказку.