4.3.3. Работа при отсутствии открытых документов

Источник здесь.[перевод не проверен];[перевёл Андрей Бушман]

    AutoCAD всегда запускается с новым документом или открывает уже существующий. Однако, во время текущего сеанса работы AutoCAD, можно закрыть все документы чертежей.

    Если вы закроете в AutoCAD все чертежи, то в интерфейсе приложения, посредством основного окна приложения вы будете извещены о малейших изменениях. Панель быстрого доступа (Quick Access) и меню приложения предоставляют набор ограниченных опций. Эти опции связаны с созданием и открытием чертежей, отображением диспетчера подшивок (Sheet Set Manager) и восстановлением чертежей. Если панель меню явно отображена, то меню Файл (File), Вид (View), Окно (Window) - так же отображаются. Вы так же заметите, что там нет командной строки1.
    Когда работа с документом находится на нулевой стадии2, вы можете сделать следующее:
  • Создать новый или открыть существующий документ
  • Настроить меню приложения и меню быстрого доступа
  • Закрыть AutoCAD
    Для получения уведомления о том, что AutoCAD входит в нулевую стадию (т.е. закрыты все документы), вам следует использовать событие DocumentDestroyed (Документ уничтожен [имхо не самое удачное название события]*). Данное событие происходит при закрытии открытого документа. Количество документов, после закрытия последнего документа будет равным 1 [а почему не ноль?]*. Используйте свойство Count (Количество) объекта DocumentManager для определения количества открытых документов в то время, когда происходит событие DocumentDestroyed. 

Для получения большей информации по использованию событий в AutoCAD, читайте Использование событий.

Изменение меню приложения

    В примере этого кода используется событие DocumentDestroyed для мониторинга того, когда будет закрыт последний чертёж и наступит нулевая стадия документов. Как только эта стадия наступит, событие Opening (открытие) будет зарегистрировано для меню приложения. При клике мышью по меню приложения произойдет событие Opening. Во время этого события новый элемент меню будет добавлен в меню приложения. Новый элемент меню отображается в окне с сообщением.

Внимание:
    Для того, чтобы вы смогли использовать приведённый далее код, вам нужно добавить в свой проект ссылку на библиотеку AdWindows.dll. Эта библиотека содержит пространства имён, используемые для адаптации меню и могут быть найдены в каталоге установки (install folder) AutoCAD или как часть ObjectARX SDK. Вам так же потребуется ссылка на библиотеку WindowsBase, которая может быть найдена на вкладке .Net диалогового окна Add Reference3.

Код VB.NET

   1:  Imports System.Windows.Input
   2:  Imports Autodesk.Windows
   3:  Imports Autodesk.AutoCAD.Runtime
   4:  Imports Autodesk.AutoCAD.ApplicationServices 
   5:   
   6:  '' Создание обработчика команды для пользовательского элемента меню
   7:  Public Class MyCommandHandler
   8:    Implements ICommand 
   9:   
  10:    Event CanExecuteChanged(ByVal sender As Object, ByVal e As EventArgs) _
  11:                                         Implements ICommand.CanExecuteChanged 
  12:   
  13:    Function CanExecute(ByVal parameter As Object) As Boolean _
  14:                                        Implements ICommand.CanExecute
  15:        Return True
  16:    End Function 
  17:   
  18:    Sub Execute(ByVal parameter As Object) Implements ICommand.Execute
  19:        Application.ShowAlertDialog("MyMenuItem has been clicked")
  20:    End Sub
  21:  End Class 
  22:   
  23:  Public Class Chapter4
  24:   
  25:    ''Глобальная переменная для ZeroDocState
  26:    Dim acApMenuItem As ApplicationMenuItem = Nothing 
  27:   
  28:    <CommandMethod("AddZeroDocEvent")> _
  29:    Public Sub AddZeroDocEvent()
  30:   
  31:        '' Получение DocumentCollection и регистрация события DocumentDestroyed
  32:        Dim acDocMgr As DocumentCollection = Application.DocumentManager
  33:        AddHandler acDocMgr.DocumentDestroyed, AddressOf docDestroyed
  34:    End Sub 
  35:   
  36:    Public Sub docDestroyed(ByVal obj As Object, _
  37:                            ByVal acDocDesEvtArgs As DocumentDestroyedEventArgs)
  38:        '' Определяем, существует ли уже пункт меню и каково количество открытых документов
  39:        If Application.DocumentManager.Count = 1 And IsNothing(acApMenuItem) Then
  40:   
  41:            '' Добавление обработчика события для отслеживания факта открытия меню приложения
  42:            '' В проект необходимо добавить ссылку на библиотеку AdWindows.dll
  43:            AddHandler ComponentManager.ApplicationMenu.Opening, _
  44:                       AddressOf ApplicationMenu_Opening
  45:        End If
  46:    End Sub 
  47:   
  48:    Public Sub ApplicationMenu_Opening(ByVal sender As Object, _
  49:                                       ByVal e As EventArgs)
  50:   
  51:        '' Проверяем, был ли добавлен пользовательский элемент меню ранее
  52:        If IsNothing(acApMenuItem) Then
  53:   
  54:            '' Получение компонента меню приложения
  55:            Dim acApMenu As ApplicationMenu = ComponentManager.ApplicationMenu 
  56:   
  57:            '' Создание нового пункта пользовательского меню приложения
  58:            acApMenuItem = New ApplicationMenuItem()
  59:            acApMenuItem.Text = "MyMenuItem"
  60:            acApMenuItem.CommandHandler = New MyCommandHandler() 
  61:   
  62:            '' Добавление нового пункта меню
  63:            acApMenu.MenuContent.Items.Add(acApMenuItem) 
  64:   
  65:            '' Удаление меню приложения при срабатывании события Opening
  66:            RemoveHandler ComponentManager.ApplicationMenu.Opening, _
  67:                          AddressOf ApplicationMenu_Opening
  68:        End If
  69:    End Sub
  70:  End Class

Код C#

   1:  using Autodesk.Windows;
   2:  using Autodesk.AutoCAD.Runtime;
   3:  using Autodesk.AutoCAD.ApplicationServices; 
   4:   
   5:  // Создание обработчика команды для пользовательского элемента меню
   6:  public class MyCommandHandler : System.Windows.Input.ICommand
   7:  {
   8:    public bool CanExecute(object parameter)
   9:    {
  10:        return true;
  11:    } 
  12:   
  13:    public event EventHandler CanExecuteChanged; 
  14:   
  15:    public void Execute(object parameter)
  16:    {
  17:        Application.ShowAlertDialog("MyMenuItem has been clicked");
  18:    }
  19:  }
  20:   
  21:  class Chapter4
  22:  {
  23:    //Глобальная переменная для ZeroDocState
  24:    ApplicationMenuItem acApMenuItem = null; 
  25:   
  26:    [CommandMethod("AddZeroDocEvent")]
  27:    public void AddZeroDocEvent()
  28:    {
  29:        // Получение DocumentCollection и регистрация события DocumentDestroyed
  30:        DocumentCollection acDocMgr = Application.DocumentManager;
  31:        acDocMgr.DocumentDestroyed += 
  32:            new DocumentDestroyedEventHandler(docDestroyed);
  33:    } 
  34:   
  35:    public void docDestroyed(object obj, 
  36:                             DocumentDestroyedEventArgs acDocDesEvtArgs)
  37:    {
  38:        // Определяем, существует ли уже пункт меню и каково количество открытых документов
  39:        if (Application.DocumentManager.Count == 1 && acApMenuItem == null)
  40:        {
  41:            // Добавление обработчика события для отслеживания факта открытия меню приложения
  42:            // В проект необходимо добавить ссылку на библиотеку AdWindows.dll
  43:            ComponentManager.ApplicationMenu.Opening += 
  44:                new EventHandler<EventArgs>(ApplicationMenu_Opening);
  45:        }
  46:    } 
  47:   
  48:    void ApplicationMenu_Opening(object sender, EventArgs e)
  49:    {
  50:        // Проверяем, был ли добавлен пользовательский элемент меню ранее
  51:        if (acApMenuItem == null)
  52:        {
  53:            // Получение компонента меню приложения
  54:            ApplicationMenu acApMenu = ComponentManager.ApplicationMenu; 
  55:   
  56:            // Создание нового пункта пользовательского меню приложения
  57:            acApMenuItem = new ApplicationMenuItem();
  58:            acApMenuItem.Text = "MyMenuItem";
  59:            acApMenuItem.CommandHandler = new MyCommandHandler(); 
  60:   
  61:            // Добавление нового пункта меню
  62:            acApMenu.MenuContent.Items.Add(acApMenuItem); 
  63:   
  64:            // Удаление меню приложения при срабатывании события Opening
  65:            ComponentManager.ApplicationMenu.Opening -= 
  66:                new EventHandler<EventArgs>(ApplicationMenu_Opening);
  67:        }
  68:    }
  69:  }

Примечания переводчика:
1 - сомневаюсь в правильности перевода
2 - открыт AutoCAD, но при этом в нём не открыт ни один документ
3в MS Visual Studio

Comments