(изменено: KyCOK, 30 августа 2009г. 04:43:48)

Тема: Новая вкладка меню с макросом

Интересует пример как можно добавить новую вкладки меню (я понимаю, что такое реализуется только на LISP) с кнопками запускающими макрос, написанный на языке VBA. Знаю, что макрос для кнопки, запускающей код на VBA имеет вид:
<code>^C^C_-vbarun "макрос.dvb!ThisDrawing.имя";</code>
Просто хочу в будущем разобраться как автоматизировать процесс создания меню с кнопками посредством того же AcadInstall.
Очень прошу показать пример кода, или дать ссылку на актуальный материал..
Плиз.. :)

Re: Новая вкладка меню с макросом

Почему только на Lisp? На VBA это тоже несложно. Пример из Help:

Sub Example_AddSubMenu()
    ' This example creates a new menu called TestMenu and ins erts a submenu item
    ' called NewFile. It then creates a menu item, called open,
    ' on the submenu.
    
    ' The menu is then displayed on the menu bar.
    ' To remove the menu after execution of this macro, use the Customize Menu
    ' option from the Tools menu.
    
    Dim currMenuGroup As acadMenuGroup
    Set currMenuGroup = ThisDrawing.Application.MenuGroups.Item(0)
    
    ' Create the new menu
    Dim newMenu As AcadPopupMenu
    Set newMenu = currMenuGroup.Menus.Add("TestMenu")
    
    ' Add the submenu
    Dim FileSubMenu As AcadPopupMenu
    Set FileSubMenu = newMenu.AddSubMenu("", "NewFile")
    
    
    ' Add a menu item to the sub menu
    Dim newMenuItem As AcadPopupMenuItem
    Dim openMacro As String
    
    ' Assign the macro string the VB equivalent of "ESC ESC _open "
    openMacro = Chr(3) & Chr(3) & Chr(95) & "open" & Chr(32)
    
    Set newMenuItem = FileSubMenu.AddMenuItem(newMenu.count + 1, "Open", openMacro)
    
    ' Display the menu on the menu bar
    newMenu.InsertInMenuBar (ThisDrawing.Application.MenuBar.count + 1)
    
End Sub

Данный код не учитывает возникновении ошибки при попытке повторного создания существующего меню.Чтобы ее избежать можно либо проверить существование меню перед его созданием, либо заключить код по созданию меню в блок On Error Resume Next ... On Error GoTo 0

Re: Новая вкладка меню с макросом

Вот еще такой вопрос. Автокад 2008. Мой макрос задает путь к корпоративному файлу настроек cui. В корпоративном файле настроек имеется одна панель и одна вкладка меню. После выполнения макроса в текущем рабочем пространстве появляется новая панель, а новая вкладка меню не появляется, и ее приходится добавлять путем добавления соответствующей "галочки" через Адаптация -> адаптация рабочего пространства
Новая вкладка меню с макросом

можно-ли это реализовать программно?

Re: Новая вкладка меню с макросом

Файл частичной адаптации может быть загружен программно.
А вот выгрузить его программно без участия пользователя(правда минимального) у меня тогда не получилось.

'ФУНКЦИЯ ПРОВЕРКИ, ЗАГРУЖЕНА ЛИ ОПРЕДЕЛЕННАЯ ГРУППА МЕНЮ
Private Function MenuGroupExist(MenuName As String) As Boolean
Dim MenuGroup As AcadMenuGroup
MenuGroupExist = False
MenuName = UCase(MenuName)
For Each MenuGroup In Application.MenuGroups
    If MenuGroup.Name = MenuName Then
        MenuGroupExist = True
        Exit Function
    End If
Next
End Function

'ФУНКЦИЯ ЗАГРУЗКИ ГРУППЫ МЕНЮ
Private Function AddMenuGroup(MenuName As String, MenuFileName As String) As Long
'MenuName - имя группы меню
'MenuFileName - полный путь файла группы меню (.cui файл)
'Результат:
'AddMenuGroup = -1 - не удалось загрузить файл частичной адаптации
'AddMenuGroup =  0 - файл частичной адаптации уже загружен
'AddMenuGroup =  1 - удачная загрузка файла частичной адаптации

Dim MenuGroupObject As AcadMenuGroup
If MenuGroupExist(MenuName) Then
    AddMenuGroup = 0
Else
    On Error Resume Next
    Set MenuGroupObject = Application.MenuGroups.Load(MenuFileName, False)
    If Err.Number = 0 Then AddMenuGroup = 1 Else AddMenuGroup = -1
    On Error GoTo 0
End If
End Function

'ФУНКЦИЯ ВЫГРУЗКИ ГРУППЫ МЕНЮ
Private Function DelMenuGroup(MenuName As String) As Long
'MenuName - имя группы меню
'Результат:
'DelMenuGroup = -1 - не удалось выгрузить файл частичной адаптации
'DelMenuGroup =  0 - файл частичной адаптации незагружен
'DelMenuGroup =  1 - удачная выгрузка файла частичной адаптации
Dim MenuGroupObject As AcadMenuGroup
If MenuGroupExist(MenuName) Then
    On Error Resume Next
    Application.MenuGroups.Item(MenuName).Unload
    If Err.Number <> 0 Then
        DelMenuGroup = -1
        Exit Function
    End If
    On Error GoTo 0
    DelMenuGroup = 1
Else
    DelMenuGroup = 0
End If
End Function

Код был написан под AutoCAD 2006.Полностью его можно посмотреть здесь Расчет длин 1.4
Другой вариант загрузки приложения и создания своего меню - Планировка 0.1

Re: Новая вкладка меню с макросом

Спасибо за подсказку!
справляемся так:
<code>
Dim currMenuGroup As AcadMenuGroup
Dim newMenu As AcadPopupMenu
Set currMenuGroup = ThisDrawing.Application.MenuGroups.Item("scbis")
Set newMenu = currMenuGroup.Menus.Item("СЦБиС")
newMenu.InsertInMenuBar (ThisDrawing.Application.MenuBar.Count + 1)
</code>
по материалам
настройка меню и панелей инструментов