Пара слов об EnterpriseMenu и работе с ним
Что такое корпоративное меню, наверное, и так все знают. Каковы удобства его использования, каковы минусы - вот об этом я и хотел бы сказать.
Корпоративное меню располагается где-то на сервере и подгружается пользователями. Несомненными плюсами можно назвать комбинирование следующих вещей: и принципиальные изменения в меню вносятся в одном месте, и подхватываются они автоматом, и при этом пользователь может самостоятельно перемещать панели инструментов и вообще всячески налаживать вид меню. Да, и вот еще - для редактирования такого меню оно должно быть подгружено как основное, иначе файл cui / cuix открывается в режиме ReadOnly. Удобно, ничего не скажешь
Минусы... Минусов немного. Если меню содержит собственные рисунки кнопок (а частенько так оно и есть), путь к меню крайне желательно прописывать в путях доступа. У меня, по крайней мере, это было обязательное действие. А вот если рисунки объединены в dll, то становится совсем весело: dll блокируется, пока файл cui / cuix загружен хотя бы у одного пользователя! Так что внести изменения быстро и просто не получится, если не извращаться, конечно.
Поэтому пока что я использую такую технологию:
1. Корпоративный файл меню, а также dll и mnl (ну, если понадобится, то и bmp тоже) копируются на локальную машину в каталог, например, %AppData%\kpblc\menu
2. Путь к каталогу добавляется в пути поддержки
3. через vla-put-enterprisemenu устанавливаю корпоративное меню
Все вроде бы здорово, если бы не несколько "но".
1. Вопрос "как обновлять" решается вроде бы просто: в качестве enterprisemenu устанавливается пустая строка, но по ходу дела крайне желательно проконтролировать - не остались ли следы от корпоративного меню (контекстные меню, разделы Popup-меню или Ribbon). Я такое словил всего раз, но этого оказалось достаточно.
2. Заменить файлы cui / cuix, dll и mnl недостаточно - их крайне желательно предварительно удалять. Про удаление файлов mnr я даже не напоминаю.
3. Простая установка enterprisemenu иногда тоже оказывается недостаточной: "слетает" текущее рабочее пространство, и новое корпоративное меню просто не показывается, пока не будет активировано любое рабочее пространство.
4. Если в корпоративном меню есть выпадающее, то оно иногда помещается перед стандартными выпадающими. Так что придется перемещать на нужное место.
Коды не показываю, поскольку просто некогда. Может быть, потом...
Хотелось бы теперь добавить еще немного дегтя.
Программно установить корпоративное меню можно только через ActiveX, без вариантов. Системная переменная enterprisemenu имеет статус ReadOnly.
Казалось бы, ничего особо сложного:
(vla-put-enterprisemenu (vla-get-files (vla-get-preferences (vlax-get-acad-object))) (vlax-make-variant "c:\\bla-bla-bla\\CoprMenu.cui"))
Но на самом деле не все так радужно.
Во-первых, подгружать можно корпоративное меню только "нативного" формата. То есть для 2009 - cui, для 2012 - cuix
Во-вторых, в некоторых случаях (например, я в полной мере поймал это на AutoCAD 2009 - и на 32, и на 64) попытка подгрузки меню может выдать ошибку ядра (Access Violation 0x00005c). Не лечится.
Если вдруг нарисовалась вторая проблема, выход только один - впрямую подгружать стороннее меню. Либо через команды, либо через vla-load. По крайней мере я другого выхода не нашел
[quote]А вот если рисунки объединены в dll, то становится совсем весело: dll блокируется, пока файл cui / cuix загружен хотя бы у одного пользователя! Так что внести изменения быстро и просто не получится, если не извращаться, конечно.[/quote]
В Windows версий NT и выше ты можешь переименовать/переместить файл, занятый другим процессом. Т.е. даже если файлы захвачены юзером, ты можешь эти файлы переместить в некий каталог "Мусор" (при необходимости ещё и переименовав их, например дописав к имени дату и время их удаления), а на их место закинуть обновлённые версии. Спустя некоторое время (например на след. день) ты спокойно очищаешь содержимое своего каталога "Мусор".
Best Regards