Vba дорослішає

Рис.1 MRU + - утиліта, яка дозволяє стежити за недавно використаними файлами AutoCAD

Ласкаво просимо в VBA AutoCAD

Два типи проектів в VBA

Рис.2. Діалогове вікно VBA Manager дозволяє маніпулювати впровадженими і глобальними проектами VBA

Звичайно, глобальний проект більш кращий для утиліти, розробленої, щоб фіксувати інформацію щодо безлічі креслень. У разі MRU +, глобальний проект це фалй MRUPlus.dvb. Розширення "dvb" використовується AutoCAD для глобальних проектів, збережених на диску.

Завантаження при запуску

Як варіант, Ви можете розташувати команди AutoLisp в файлі acad.lsp, який також повинен бути в каталозі AutoCAD. Будь-яка функція AutoLisp названа STARTUP в цьому файлі буде автоматично виконуватися, коли файл завантажений. Як ви будете бачити в цій статтею, Autodesk зробила добру роботу по створенню зв'язку між старшим мовою Lisp і більш новою мовою VBA, що б стало можливо для коду Lisp, викликати код VBA і навпаки.

Для додатки, слушна думка, модифікувати файл acad.lsp, щоб завантажувати додаток при запуску. Більшість користувачів AutoCAD знайомі зі зміною цього файлу з мовою Autolisp, так що додавання рядка коду, щоб завантажити ваш додаток має бути для них просто. Ви можете просто завантажувати додаток, або можете завантажувати додаток і запускати макрос з нього в той же самий час.

Щоб завантажити додаток, Ви можете використовувати код Autolisp, щоб викликати команду AutoCAD vbaload:

Або, щоб запустити процес ініціалізації в додатку, Ви можете викликати команду vbarun:

Аргумент команди vbarun може бути повністю кваліфікований в формі:

Якщо вказаний файл не завантажений він буде спочатку завантажений, і потім буде виконаний макрос. За замовчуванням, команди vbarun або vbaload завантажують файли тільки з головного каталогу AutoCAD. Якщо ваша утиліта збережена в іншому місці, ви будете повинні вказати повний шлях та ім'я файлу в аргументі. У цьому випадку, Ви потребу в "escape" з знаків похилій риси вліво, подвоюючи їх. Наприклад, це мало силу б у файлі acad.lsp:

Як частину свого завантажувального коду, MRU + додає себе до меню AutoCAD File, тільки вище вбудованого списку останніх використаних файлів. У попередніх версіях AutoCAD, ця операція була повністю неможлива для коду VBA. Тепер нова гілка об'єктної моделі AutoCAD робить такі речі тривіальними.

Рис.3 показує новий об'єкти AutoCAD, доступні для маніпулювання інструментальною панеллю і меню. Об'єкт MenuBar контролює все меню, в даний час відображені в головній рядку меню AutoCAD. Ви можете вставілять і видаляти меню, викликаючи методи InsertInMenuBar і RemoveFromMenuBar об'єкта PopupMenu.

Рис.3. Об'єкти для маніпуляції меню і панелями інструментів

Об'єкт PopupMenu представляє стандартне падаюче меню, або меню викликається по правій кнопці миші. Об'єкт PopupMenuItem представляє єдиний пункт меню.

Система Toolbars містить об'єкти Toolbar. кожен з яких представляє панель інструментів. Індивідуальні кнопки панелі представлені об'єктами ToolbarItem.

Утиліта MRU + робить найпростішу можливу операцію з цими об'єктами: Вона додає пункт меню, який відображає інтерфейс користувача до файлового меню. Це робиться одним рядком коду:

Цей код додає новий пункт до 20-ї позиції (вважаючи з нуля) системи PopupMenuItems на крайньому лівому PopupMenu в установленому за замовчуванням MenuBar (іншими словами, до меню File). Другий аргумент - текст, який буде відображатися в меню, і третій аргумент - макрос меню AutoCAD, який викликається, коли цей пункт меню обраний.

Використання макросів меню AutoCAD має майже той же самий синтаксис як команди AutoCAD, але і має деякі відмінності. Один з них - виклик команди vbarun, використовуючи синтаксис підкреслення і риси щоб придушити показ діалогового вікна, яке це зазвичай викликало б. Зауважте присутність пробілу після імені макросу VBA, для виконання. У макросах меню, кінцеві прогалини інтерпретується як кінець фрагмента входу. Без цього, назва макрокоманди VBA було б внесено в командний рядок AutoCAD, але не виконане.

Хоча можна мати кілька одночасно завантажених глобальних проектів VBA, вони все використовують єдиний об'єкт названий ThisDrawing. Цей об'єкт є активний документ в інтерфейсі користувача AutoCAD, і має клас AcadDocument. (На відміну від багатьох інших об'єктних моделей, в моделі AutoCAD імена всіх об'єктів начинаються з префікса "Acad", щоб гарантувати однозначність в операціях). Якщо кілька проектів VBA включають обробники для подій для об'єкта ThisDrawing. кожен з обробників подій викликається по черзі.

Використання подій ThisDrawing просто. Кожен глобальний проект VBA, який Ви створюєте автоматично, містить приклад об'єкта ThisDrawing який не може бути видалений. У додатку MRU + подія ThisDrawing.BeginClose використовується, щоб повідомити головній формі, коли малюнок вивантажується з призначеного для користувача інтерфейсу. Ця подія містить мінімум коду, щоб викликати метод public форми інтерфейсу користувача, щоб розташувати відповідний ListItem в ListView і не контролювати це.

Таблиця нижче містить списки подій, підтримувані ThisDrawing. Як Ви можете бачити, багато хто з цих подій - нові в AutoCAD. Зокрема події BeginShortcutMenu. BeginLisp. і Object дозволяють здійснювати нові способи взаємодії з іншими мовами програмування в AutoCAD.

Події об'єкта AcadDocument

Вікно переміщається або змінюється його розмір

Зачеплення об'єкта Application

Окрім наявності ThisDrawing. який представляє активний документ, утиліта MRU + також повинна контролювати події об'єкта AcadApplication (представляє безпосередньо AutoCAD) щоб знати, коли новий малюнок був відкритий. На відміну від об'єкта ThisDrawing. проте, глобальні VBA об'єкти не отримують автоматично зразок об'єкта AcadApplication. На щастя, Ви можете використовувати в VBA ключове слово WithEvents. щоб створити ваш власний. Послідовність подій, що використовує MRU +, щоб зачепити Подія EndOpen об'єкта AcadApplication. який іспольняется щоразу, коли відкривається новий малюнок, виділений в наступних абзацах.

Файл acad.lsp, як Ви вже бачили, містить код виклику процедури LoadMRUPlus в basMRUPlus. Поряд з іншим завантажувальним кодом, ця процедура встановлює зразок приватного класу званого CApp і встановлює одне з його властивостей:

Клас CApp існує виключно як оболонка для об'єкта AcadApplication. Вбудований об'єкт ThisDrawing містить властивість Application що вказує на єдиний зразок об'єкта AcadApplication. що дозволяє просто коду запуску знаходити це. Нижче показаний код для класу CApp. Важливим є тут - то, що приватна змінна типу AcadApplication оголошена WithEvents. Це спеціальне ключове слово робить події AcadApplication доступними для кодування в модулі класу. Роздруківка коду для утиліти MRU + в наприкінці статті.

Події об'єкта AcadApplication