НАСТРОЙКА МЕНЮ И ПАНЕЛЕЙ ИНСТРУМЕНТОВ
Две наиболее важных коллекции, касающиеся менюMenuBar, MenuGroups
. Первая содержит все отображаемые меню, вторая группы меню, часть из которых может не отражаться на экране. Группы меню могут содержать панели инструментов.ИССЛЕДОВАНИЕ КОЛЛЕКЦИИ
Каждая группа меню содержит коллекцииMENUGROUPS
PopupMenus и 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
Читать дальше - В начало - На главную