НАСТРОЙКА МЕНЮ И ПАНЕЛЕЙ ИНСТРУМЕНТОВ
Две наиболее важных коллекции, касающиеся менюMenuBar, MenuGroups. Первая содержит все отображаемые меню, вторая группы меню, часть из которых может не отражаться на экране. Группы меню могут содержать панели инструментов.ИССЛЕДОВАНИЕ КОЛЛЕКЦИИ
Каждая группа меню содержит коллекцииMENUGROUPSPopupMenus и Toolbars. Схема такова MenuBar-PopupMenu.
MenuGroups-MenuGroup.
В составе MenuGroup - PopupMenus и Toolbars.
PopupMenus-PopupMenu-PopupMenuItem, Toolbars-Toolbar-ToolbarItem.ЗАГРУЗКА ГРУПП МЕНЮ
Выполняется методомLoad, если параметрBaseMenuустановлен=True, загружается новая группа меню, как основное меню аналогично командеMENU. Если этот параметр не указать, то загружается частичное меню, аналогично тому как это делает командаMENULOAD. Сразу после загрузки частичное меню может быть вставлено в панель меню методомInsertMenuInMenuBar или InsertInMenuBar. Так же становятся доступны все меню и панели инструментов входящие в меню. Далее можноПример загрузки группы меню:
- Добавлять меню к панели меню
- Удалять меню из панели
- Переупорядочивать
- Добавлять новый пункт в меню или панель инструментов
- удалять пункт из меню или панели инструментов
- Создавать меню и панель инструментов
- Делать меню плавающим или пристыкованным
- Делать доступным и недоступным пункт меню и панели инструментов
- Делать выбранным или неактивным
- Менять название, тэг и строку подсказки
- Переназначать связанный макрос
ThisDrawing.Application.MenuGroups.Load "acad.mnc"СОЗДАНИЕ НОВОЙ ГРУППЫ МЕНЮ
AutoCAD ActiveX не позволяет создавать пустую группу меню, однако можно загрузить существующую и сохранить с новым именем и в новом файле. После чего его можно отредактировать по своему желанию. Приимущество данного подхода в том, что оказываются уже созданными базовые меню Файл, Окно и Помощь. Пример сохранения группы меню в новом файле:
ThisDrawing.Application.MenuGroups.Item(0).SaveAs "MyMenu.mnc", acMenuFileCompiledИЗМЕНЕНИЕ ПАНЕЛИ МЕНЮ
Основное меню может быть полностью замещено загружаемым если оно загружается как основное меню. Кроме того могут быть модифицированы и отдельные меню. Оба методаInsertMenuInMenuBar и InsertInMenuBarпреследуют одну цель. Различие между ними в объекте из которого они вызываются. Первый вызывается из коллекцииPopupMenus, требует имя меню и точку вставки. Второй вызывается непосредственно из объектаPopupMenuи требует только указания точки вставки. Вам решать какой метод избрать. Пример вставки меню:Sub InsertMenu() ' Определим переменную для группы меню Dim currMenuGroup As AcadMenuGroup Set currMenuGroup = ThisDrawing.Application.MenuGroups.Item(0) ' Создадим меню Dim newMenu As AcadPopupMenu Set newMenu = currMenuGroup.Menus.Add("TestMenu") ' Определим переменную для пункта меню Dim newMenuItem As AcadPopupMenuItem Dim openMacro As String ' Назначим макрос аналог "ESC ESC _open " и создадим пункт меню openMacro = Chr(3) + Chr(3) + Chr(95) + "open" + Chr(32) Set newMenuItem = newMenu.AddMenuItem(newMenu.Count + 1, "Open", openMacro) ' Отобразим меню currMenuGroup.Menus.InsertMenuInMenuBar "TestMenu", "" End SubУДАЛЕНИЕ МЕНЮ ИЗ ПАНЕЛИ МЕНЮ
Для данной цели используйте один из следующих методовRemoveMenuFromMenuBar или RemoveFromMenuBar. Различия между ними те же что и для вышеописанных методов добавления меню. Пример удаления:currMenuGroup.Menus.RemoveMenuFromMenuBar ("TestMenu")В результате меню становятся невидимым, но физически не удаляется. Пример переупорядочивания меню (первый пункт переносится в конец):В результате меню File должно переехать в последнюю позицию.Sub MoveMenu() ' Определим переменную содержащую меню Dim moveMenu As AcadPopupMenu Dim MyMenuBar As AcadMenuBar Set MyMenuBar = ThisDrawing.Application.menuBar ' установим moveMenu равным первому Set moveMenu = MyMenuBar.Item(0) ' уберем с первой позиции MyMenuBar.Item(0).RemoveFromMenuBar ' вставим в последнюю moveMenu.InsertInMenuBar (MyMenuBar.count) End SubСОЗДАНИЕ И РЕДАКТИРОВАНИЕ ВЫПАДАЮЩИХ И ВСПЛЫВАЮЩИХ МЕНЮ
Оба типа меню отображаются как каскадные меню. Последние, например позволяют включать-включать объектную привязку. Выпадающие меню могут содержать до 999 пунктов. А всплывающие только до 499. Оба предела включют все меню в иерархии. Если меню не умещается на экране, то оно грубо обрезается. Всплывающие появляются обычно рядом с перекрестием. Если свойствоShortcutMenu=TRUE значит это оно и есть.СОЗДАНИЕ МЕНЮ
МетодомAddможно добавить объектPopupMenuв коллекциюPopupMenus. Для создания нового всплывающего старое следует сначала удалить. Может быть только одно такое меню на группу. Если таких меню нет, то можно создать его с именем "POP0". После чего по этому имени можно обращаться к меню в коллекции. Меню может включать и некторые специальные символы. Пример создания выпадающего меню:Sub CreateMenu() Dim currMenuGroup As AcadMenuGroup Set currMenuGroup = ThisDrawing.Application.MenuGroups.Item(0) Dim newMenu As AcadPopupMenu Set newMenu = currMenuGroup.Menus.Add("TestMenu") End SubДОБАВЛЕНИЕ ПУНКТА К МЕНЮ
МетодAddMenuItemдобавляет пункт в выпадающее меню, принимает четыре параметра - Index, Label, Tag, Macro. Index начинается с нуля, для добавления в конец установи индекс = значению свойства Count. Label - строка, определяющая содержание и формат пункта меню. (может содержать DEISEL выражение и специальные коды). Текст пункта меню еще называют Caption. Тэг - строка символов, включая подчеркивание идентифицирующая пункт меню. Макро - набор команд, выполняющихся при выборе пункта меню. Может быть как простым макросом вызывающим команду так и сложным набором команд. Пример добавления пункта меню:Для добавления разделителя между пунктами меню используйте методSub AddAMenuItem() Dim currMenuGroup As AcadMenuGroup Set currMenuGroup = ThisDrawing.Application.MenuGroups.Item(0) Dim newMenu As AcadPopupMenu Set newMenu = currMenuGroup.Menus.Add("TestMenu") ' добавим пункт Dim newMenuItem As AcadPopupMenuItem Dim openMacro As String ' назначим макрос эквивалентный "ESC ESC _open " openMacro = Chr(3) + Chr(3) + Chr(95) + "open" + Chr(32) Set newMenuItem = newMenu.AddMenuItem(newMenu.count + 1, "Open", openMacro) ' Отобразим newMenu.InsertInMenuBar(ThisDrawing.Application.menuBar.count + 1) End SubAddSeparator.ДОСТУП К ГОРЯЧИМ КЛАВИШАМ
Для назначения горячей клавиши используйте символ & непосредственно перед буквой, которая и будет горячей. Пример:Sub AddAMenuItem() Dim currMenuGroup As AcadMenuGroup Set currMenuGroup = ThisDrawing.Application.MenuGroups.Item(0) Dim newMenu As AcadPopupMenu Set newMenu = currMenuGroup.Menus.Add("Te" + Chr(Asc("&")) + "stMenu") Dim newMenuItem As AcadPopupMenuItem Dim openMacro As String openMacro = Chr(3) + Chr(3) + Chr(95) + "open" + Chr(32) Set newMenuItem = newMenu.AddMenuItem(newMenu.count + 1, Chr(Asc("&")) _ + "Open", openMacro) newMenu.InsertInMenuBar(ThisDrawing.Application.menuBar.count + 1) End SubСОЗДАНИЕ КАСКАДНЫХ ПОДМЕНЮ
Для этой цели используйте методAddSubmenuкоторый создает новый объектPopupMenuи добавляет его в меню. Принимает три параметра - Index, Label и Tag. Данный метод не возвращает объектPopupMenuвместо этого он возвращает новое меню на которое указывает подменю, это меню следует добавить в существующее. Пример:Sub AddASubMenu() Dim currMenuGroup As AcadMenuGroup Set currMenuGroup = ThisDrawing.Application.MenuGroups.Item(0) Dim newMenu As AcadPopupMenu Set newMenu = currMenuGroup.Menus.Add("TestMenu") ' Добавим подменю Dim FileSubMenu As AcadPopupMenu Set FileSubMenu = newMenu.AddSubMenu("", "OpenFile") ' Добавим пункт в подменю Dim newMenuItem As AcadPopupMenuItem Dim openMacro As String openMacro = Chr(3) + Chr(3) + Chr(95) + "open" + Chr(32) Set newMenuItem = FileSubMenu.AddMenuItem(newMenu.count + 1, "Open", openMacro) ' Отобразим newMenu.InsertInMenuBar(ThisDrawing.Application.menuBar.count + 1) End SubУДАЛЕНИЕ ПУНКТА ИЗ МЕНЮ
Sub DeleteMenuItem() Dim LastMenu As AcadPopupMenu Set LastMenu = ThisDrawing.Application.menuBar. _ Item(ThisDrawing.Application.menuBar.count - 1) ' Добавим пункт меню Dim newMenuItem As AcadPopupMenuItem Dim openMacro As String openMacro = Chr(3) + Chr(3) + Chr(95) + "open" + Chr(32) Set newMenuItem = LastMenu.AddMenuItem(LastMenu.count + 1, "Open", openMacro) ' Удалим пункт меню newMenuItem.Delete End SubИССЛЕДОВАНИЕ СВОЙСТВ ПУНКТА МЕНЮ
Все пункты меню разделяют следующие свойства: Tag - уникальный идентификатор, Label - строка, определяющая содержание и форматирование, Caption - тот текст пункта меню, который видит пользователь, Macro - простой макрос или набор команд, Help String - быстрая подсказка в строке состояния, Enable - доступно или нет для выбора, Check - выбрано или нет, Index - номер пункта, начиная с нуля, Type - acMenuItem или acMenuSeparator или acSubMenu, Parent - меню к которому принадлежид данное меню. Пример включени отключения доступности:Sub DisableMenuItem() Dim currMenuGroup As AcadMenuGroup Set currMenuGroup = ThisDrawing.Application.MenuGroups.Item(0) Dim newMenu As AcadPopupMenu Set newMenu = currMenuGroup.Menus.Add("TestMenu") ' Добавим два пункта и разделитель Dim MenuEnable As AcadPopupMenuItem Dim MenuDisable As AcadPopupMenuItem Dim MenuSeparator As AcadPopupMenuItem Dim openMacro As String ' Назначим макрос openMacro = Chr(3) + Chr(3) + Chr(95) + "open" + Chr(32) Set MenuEnable = newMenu.AddMenuItem(newMenu.count + 1, "OpenEnabled", openMacro) Set MenuSeparator = newMenu.AddSeparator("") Set MenuDisable = newMenu.AddMenuItem(newMenu.count + 1, "OpenDisabled", openMacro) ' Запретим второй пункт MenuDisable.Enable = False ' Отобразим newMenu.InsertInMenuBar(ThisDrawing.Application.menuBar.count + 1) End SubСОЗДАНИЕ И РЕДАКТИРОВАНИЕ ПАНЕЛЕЙ ИНСТРУМЕНТОВ
Добавить кнопку на панель можно методомAddToolbarButtonкоторый принимает 5 параметров: Index, Name, HelpString, Macro, FlyoutButton (определяет будет ли панель выпадающая). Пример:Добавление разделителя используя методSub AddButton() Dim currMenuGroup As AcadMenuGroup Set currMenuGroup = ThisDrawing.Application.MenuGroups.Item(0) ' Создаем сначала панель Dim newToolbar As AcadToolbar Set newToolbar = currMenuGroup.Toolbars.Add("TestToolbar") ' Добавляем кнопку Dim newButton As AcadToolbarItem Dim openMacro As String ' Назначим макрос openMacro = Chr(3) + Chr(3) + Chr(95) + "open" + Chr(32) Set newButton = newToolbar.AddToolbarButton("", "NewButton", "Open a file.", openMacro) End SubAddSeparator.НАЗНАЧЕНИЕ ЗНАЧКА ДЛЯ КНОПКИ
Для этого есть методыSetBitmap и GetBitmap, первый принимает два параметра SmallIconName (bmp-файл 15х16) и LargeIconName (bmp-файл 24х22). Пример опроса существующей панели на предмет наличия иконок у кнопок.Sub GetButtonImages() Dim Button As AcadToolbarItem Dim Toolbar0 As AcadToolbar Dim MenuGroup0 As AcadMenuGroup Dim SmallButtonName As String,LargeButtonName As String Dim msg As String Dim ButtonType As String ' Первая панель в первой группе меню Set MenuGroup0 = ThisDrawing.Application.MenuGroups.Item(0) Set Toolbar0 = MenuGroup0.Toolbars.Item(0) SmallButtonName = "": LargeButtonName = "" msg = "Панель: " + Toolbar0.Name + vbCrLf Toolbar0.Visible = True ' Пройдем по коллекции, отображая имена иконок кнопок For Each Button In Toolbar0 ButtonType = Choose(Button.Type + 1, "Button", "Separator", "Control", "Flyout") msg = msg & ButtonType & ": " If Button.Type = acToolbarButton Or Button.Type = acToolbarFlyout Then Button.GetBitmaps SmallButtonName, LargeButtonName msg = msg + SmallButtonName + ", " + LargeButtonName End If msg = msg + vbCrLf Next Button MsgBox msg End SubСОЗДАНИЕ ВЫПАДАЮЩЕЙ ПАНЕЛИ
Sub AddFlyoutButton() Dim currMenuGroup As AcadMenuGroup Set currMenuGroup = ThisDrawing.Application.MenuGroups.Item(0) ' Создадим панель Dim FirstToolbar As AcadToolbar Set FirstToolbar = currMenuGroup.Toolbars.Add("FirstToolbar") ' Добавим кнопку для выпадающей панели Dim FlyoutButton As AcadToolbarItem Set FlyoutButton = FirstToolbar.AddToolbarButton _ ("", "Flyout", "Пример выпадающей панели","OPEN", True) ' Создадим вторую панель и привяжем ее к кнопе первой панели Dim SecondToolbar As AcadToolbar Set SecondToolbar = currMenuGroup.Toolbars.Add("SecondToolbar") ' Добавим кнопку на вторую панель Dim newButton As AcadToolbarItem Dim openMacro As String ' Назначим макрос openMacro = Chr(3) + Chr(3) + Chr(95) + "open" + Chr(32) Set newButton = SecondToolbar.AddToolbarButton _ ("", "NewButton", "Open a file.", openMacro) ' Присоединим вторую панель к кнопке первой FlyoutButton.AttachToolbarToFlyout currMenuGroup.Name,SecondToolbar.Name ' Отобразим первую панель, скрыв вторую FirstToolbar.Visible = True SecondToolbar.Visible = False End SubПЛАВАЮЩАЯ И ПРИСТЫКОВАННАЯ ПАНЕЛИ
Чтобы сделать панель плавающей следует использовать методFloat, принимающий три параметра: top, left и NumberFloatRows. Для создания пристыкованной панели используйте методDock, принимающий три параметра: Side, Row, Column. Пример создания такой панели:Для удаления кнопки из панели используется методSub DockToolbar() Dim currMenuGroup As AcadMenuGroup Set currMenuGroup = ThisDrawing.Application.MenuGroups.Item(0) ' Создадим панель Dim newToolbar As AcadToolbar Set newToolbar = currMenuGroup.Toolbars.Add("TestToolbar") ' Добавим кнопки с одним и тем же макросом для простоты Dim newButton1 As AcadToolbarItem Dim newButton2 As AcadToolbarItem Dim newButton3 As AcadToolbarItem Dim openMacro As String ' Назначим макрос openMacro = Chr(3) + Chr(3) + Chr(95) + "open" + Chr(32) Set newButton1 = newToolbar.AddToolbarButton("", "NewButton1", "Open a file.", openMacro) Set newButton2 = newToolbar.AddToolbarButton("", "NewButton2", "Open a file.", openMacro) Set newButton3 = newToolbar.AddToolbarButton("", "NewButton3", "Open a file.", openMacro) ' Отобразим панель newToolbar.Visible = True ' Пристыкуем к левому краю экрана newToolbar.Dock acToolbarDockLeft End SubRemoveкогда панель инструментов видима.СВОЙСТВА ЭЛЕМЕНТОВ ПАНЕЛИ ИНСТРУМЕНТОВ
Tag, Name, Macro, HelpString, Index, Type (acButton, acToolButtonSeparator, acControl), Flyout, Parent, и другие - задающие пристыковку, видимость и т.д.СОЗДАНИЕ МАКРОСОВ
Макросы представляют собой серию команд, выполняющих определенные действия. Если команда вызываемая макросом принимает параметры, то нужно знать в какой последовательности. Каждый символ имеет значение и даже пробел. Последовательность параметров может меняться от верисии к версии Автокада. Когда команда вводится из пункта меню, значения системных переменныхPICKADD и PICKAUTOравны 1 и 0 соответственно для совместимости с предыдущими версиями Автокад.ТАБЛИЦА СООТВЕТСТВИЯ КОМБИНАЦИЯ КЛАВИШ ASCII-СИМВОЛАМ
Символ ASCII-эквивалент Описание ; chr(59) Enter ^M chr(97)+chr(77) Enter ^I chr(94) + chr(124) TAB пробел chr(32) пробел \ chr(92) Ожидание ввода от пользователя - chr(95) Перевод команд и ключевых слов + chr(43) Продолжение макроса на другой строке =* chr(61) + chr(42) Отображает меню *^C^C chr(42)+chr(94)+chr(67)+chr(94)+chr(67) Повторять команду $ chr(36) Загрузка секции меню или начало DIESEL-выражения ^B chr(94)+chr(66) Включить-выключить привязку ^C chr(94)+chr(67) Отмена команды ESC chr(3) Отмена команды ^D chr(94)+chr(68) Включить-выключить координаты ^E chr(94)+chr(69) Установить следующую изометрическую плоскость ^G chr(94)+chr(71) Включить-выключить сетку ^H chr(94)+chr(72) BackSpace ^O chr(94)+chr(79) Включить-выключить Орто ^P chr(94)+chr(80) Включить-выключить MENUECHO ^Q chr(94)+chr(81) Эхо на принтер ^T chr(94)+chr(84) Включить-выключить Tablet ^V chr(94)+chr(86) Сменить видовой экран ^Z chr(94)+chr(90) Подавить автоматическое добавление пробела в конце При выполнении макросов Автокад помещает пробел в конец, перед выполнением последовательности команд. Когда это не желательно (например для команд TEXT или DIM) команда может завершаться Enter, а не пробелом. Также иногда требуется более одного пробела или Enter, но некторые текстовые редакторы не позволяют создавать строки с концевыми пробелами. Для избежания этой проблемы используются два специальных соглашения: когда в макросе встречается точка с запятой Автокад заменяет ее на Enter, если строка заканчивается управляющим символом (обратный слэш, плюс или точкаСзапятой) Автокад не добавляет пробел. Обратный слэш вызывает ввод параметров команды пользователем, и обычно после ввода одного параметра продолжается выполнение макроса. Значит невозможно создать макрос принимающий переменное число параметров и продолжающего выполнение (как например при выборе объектов). Одно исключение сделано для команды
SELECT. Например следующий макрос
select \change previous ;properties color red ;
позволяет выбрать несколько объектов, затем вызывается командаChangeс опцией Previos и меняться цвет у выбранных объектов. Так как обратный слэш используется для ожидания ввода, его нельзя использовать для других действий, поэтому при указании пути к файлу в качестве разделителя используется прямой слэш. Следующие обстоятельства задерживают выполнение макроса:Перед началом выполнения макроса рекомендуется использовать последовательность ^C^C, чтобы отменить выполнение предыдущей команды. Для выполнения макроса в цикле используется *^C^C (при этом в самом макросе уже нельзя использовать ^C, т.к. это приведет к его прерыванию). Пример:
- Если ожидается ввод точки режим объектной привязки может предварять ввод актуального значения;
- Если используется фильтр XYZ макрос приостанавливается до тех пор, пока не будет накоплена точка;
- Если вызывается команда SELECT
- Если пользователь вводит прозрачную команду
- Если пользователь запускает другой макрос
*^C^CMOVE Single.ДОБАВЛЕНИЕ ПУНКТОВ ВО ВСПЛЫВАЮЩЕЕ МЕНЮ
Такие меню появляются когда пользователь нажимает правую кнопку мыши, удерживая при этом Shift. Автокад ищет высплывающее меню в группе меню по установленному значению свойстваShortcutMenu=TRUE. Добавление пункта во всплывающее менюSub AddMenuItemToshortcutMenu() Dim currMenuGroup As AcadMenuGroup Set currMenuGroup = ThisDrawing.Application.MenuGroups.Item(0) ' ищем всплывающее меню и назначаем ему переменную Dim scMenu As AcadPopupMenu Dim entry As AcadPopupMenu For Each entry In currMenuGroup.Menus If entry.shortcutMenu = True Then Set scMenu = entry End If Next entry ' добавим новый пункт меню Dim newMenuItem As AcadPopupMenuItem Dim openMacro As String openMacro = Chr(3) + Chr(3) + Chr(95) + "open" + Chr(32) Set newMenuItem = scMenu.AddMenuItem ("", Chr(Asc("&")) + "OpenDWG", openMacro) End Sub
Читать дальше - В начало - На главную