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

ADN Club => Revit API => Тема начата: shss от 20-08-2014, 10:08:15

Название: Спрятать закрепляемую панель при закрытии Revit'a
Отправлено: shss от 20-08-2014, 10:08:15
Доброго дня!

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

Спасибо.
Название: Re: Спрятать закрепляемую панель при закрытии Revit'a
Отправлено: Виктор Чекалин от 20-08-2014, 10:23:47
Добрый день, Сергей.

В обработке события OnStartup вы регистрируете панель. Событие это вызывается при старте Revit. Событие OnShutdown в этом же интерфейсе IExternalDBApplication вызывается при закрытии Revit. Соответственно можете спрятать вашу панель в обработке этого события.
Название: Re: Спрятать закрепляемую панель при закрытии Revit'a
Отправлено: shss от 20-08-2014, 10:46:32
Виктор, да собственно так и пытаюсь сделать:
Регистрация панели
Код - 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.
Название: Re: Спрятать закрепляемую панель при закрытии Revit'a
Отправлено: Виктор Чекалин от 20-08-2014, 11:36:46
Хм. Действительно. Проверил у себя. То же самое.
Решения пока не нашел, но обнаружил интересный момент.

Закрепляемая панель доступна только тогда, когда открыт проект Revit. Для тестирования я взял проект из своей статьи (http://adn-cis.org/sozdanie-polzovatelskoj-zakreplyaemoj-paneli.html). Если выполнить команду Command DockablePaneSample на стартовой странице, когда еще ни один проект не открыт, то при вызове метода GetDockablePane получаем ту же самую ошибку
Цитировать
The requested dockable pane has not been created yet.
. То есть панель зарегистрирована, но не создана. Создается она лишь при открытии или создании проекта.

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

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



С другой стороны. Закрепляемая панель - это часть интерфейса Revit. Точно такая же как диспетчер проектов или окно свойств. Т.е. пока принудительно их не закроешь, при каждом старте Revit она будет появляться и будет появляться в том же самом месте. Пользовательская закрепляемая панель обладает точно таким же поведением.
Название: Re: Спрятать закрепляемую панель при закрытии Revit'a
Отправлено: Виктор Чекалин от 20-08-2014, 11:49:51
А вот и решение :)
Если все же хочется прятать панель при закрытии 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 также идет последовательное закрытие всех открытых документов, поэтому это событие также будет выполняться.
Название: Re: Спрятать закрепляемую панель при закрытии Revit'a
Отправлено: shss от 20-08-2014, 11:54:58
Виктор, Вы меня опередили!
Но я замешкался с количеством документов :)
Выставлял 0, так как думал, что сперва Revit закрывает все документы.
Название: Re: Спрятать закрепляемую панель при закрытии Revit'a
Отправлено: Виктор Чекалин от 20-08-2014, 12:01:24
Есть два события, связанные с закрытием документов: DocumentClosing и DocumentClosed. Первое вызывается, перед закрытием. Соответсвенно документ щее не закрыт. Второе же вызовется после того как документа закрыт. Вот там то количество и будет 0. Но панель там уже будет недоступна.
Решение как я понимаю вам подходит?
Название: Re: Спрятать закрепляемую панель при закрытии Revit'a
Отправлено: shss от 20-08-2014, 12:08:59
Да, спасибо за подсказку.