Как загрузить vba в автокад

Обновлено: 05.07.2024

Цель лекции: изучить принципы и конкретные технологии программирования на VBA .

Введение. Обзор команд. Объектная модель

Введение

Интерфейс AutoCAD ActiveX/VBA дает некотoрые преимущества по сравнению с другими методами создания приложений AutoCAD :

  1. Высокая скорость выполнения процесса, так как в отличие от AutoLISP -приложений выполнение команд происходит внутри процесса;
  2. Простота использования, обусловленная простотой языка программирования;
  3. Большие возможности межпрограмного обмена, так как VBA и ActiveX разрабатывались для взаимодействия с другими Windows -приложениями.

Понятие внедренных и глобальных проектов VBA

Приложение Autocad VBA представляет собой набор программных модулей, модулей классов и форм. Пороект может быть сохранен как в рисунке (внедренный), так и во внешнем файле. Внедренный проект автоматически загружается при открытии рисунка. Ограничение внедренных проектов в том, например, что они не могут закрыть рисунок, внутри которого находятся. Глобальные проекты в этом плане более гибки, при этом однако пользователь должен знать где расположен файл в котором хранятся макросы. Глобальный проект проще передавать другим пользователям и в нем удобно хранить общие макросы. В любой момент могут быть использованы оба типа проектов. На уровне двоичного кода проект Autocad VBA не совместим с проектом Visual Basic , однако обмен формами, модулями и классами можно производить через экспорт- импорт. (Команды IMPORT и EXPORT VBA ).

Загрузка существующего проекта

При загрузке проекта все глобальные процедуры, называемые так же макросами, становятся доступными для использования. Загрузить проект можно через VBA -менеджер или с командной строки VBALOAD . Кроме того автокад грузит автоматически проект с именем acad. dvb , который может найти в путях файлов поддержки. При загрузке проекта может появиться предупреждение, что он содержит макросы, а значит может содержать и вирусы. Выгрузка проекта командной VBAUNLOAD приводит к высвобождению памяти ранее занятой проектом. Внедрить проект в рисунок можно с помощью VBA -менеджера, он же позволяет извлечь проект из рисунка, при этом предлагая сохранить его в отдельном файле. Чтобы среда разработки VBA автоматически загрузилась при загрузке AutoCAD , в файл acad.arx нужно внести строку acadvba.arx .

Определение компонентов проекта

Проект может состоять из различных компонентов:

  • объекты;
  • формы;
  • стандартные модули;
  • модули класса;
  • ссылки.

Добавить компонент можно через меню Insert , компоненты так же можно импортировать из файлов ( .frm, . bas , .cls ).

Обзор команд VBA AutoCAD

  • VBAIDE - открывает окно VBA IDE , позволяющее редактировать, запускать и отлаживать программы.
  • VBALOAD - загружает проект.
  • VBARUN - запускает макрос на выполнение.
  • VBAUNLOAD - выгружает проект, освобождая память.
  • VBAMAN - показывает окно менеджера VBA .
  • VBASTMT - позволяет выполнить команду VBA в командной строке AutoCAD .

Основные понятия объектной модели AutoCAD

Все объекты AutoCAD организованы в виде иерархической структуры. Корнем дерева является объект Application .

Через объект Application можно получить доступ к следующим объектам:

  • Preferences;
  • Documents;
  • MenuBar;
  • MenuGroups;

Через объект Preferences можно получить доступ к следующим объектам

  • PreferencesDisplay;
  • PreferencesDrafting;
  • PreferencesFiles;
  • PreferencesOpenSave;
  • PreferencesOutput;
  • PreferencesProfiles;
  • PreferencesSelection;
  • PreferencesSystem;
  • PreferencesUser.

Через объект Documents можно получить доступ к объекту Document а через него к большинству других объектов и коллекций:

В двух последних расположены объекты AutoCAD , видимые на рисунке:

Доступ к иерархии объектов. Коллекции, свойства и методы

Связь VBA с активным чертежом обеспечивается посредством объекта ThisDrawing . С его помощью можно получить немедленный доступ ко всем свойствам и методам объекта Document а также ко всем другим объектам в иерархии.

Когда используются глобальные проекты, ThisDrawing всегда ссылается на активный документ. При использовании внедренных проектов ThisDrawing всегда ссылается на документ, содержащий проект. Например, следующая строка кода в глобальном проекте сохраняет любой чертеж, который в данный момент активен:

Ссылка на объекты в иерархии объектов

Доступ к объекту можно получить непосредственно или через объектную переменную. Для непосредственной сслыки на объект достаточно указать полный путь к нему в иерархии. Например, следующий фрагмент кода добавляет линию в пространство модели:

Для доступа к объекту через объектную переменную поступаем следующим образом. Определяем переменную желаемого типа, после чего устанавливаем переменную так, чтобы она ссылалась на нужный объект. К примеру следующий код определит объектную переменную moSpace типа AcadModelSpace так, чтобы она ссылалась на текущее пространство модели :

В примере добавляем линию в пространство модели , используя эту переменную:

Корневой объект Application расположен в иерархии выше объекта Document . Выше показано, что объект ThisDrawing обеспечивает доступ к объекту Document . А у объекта Document есть свойство Application , которое и является ссылкой на объект Application . Пример обращения:

Коллекции объектов

Объект Collection - является предопределенным объектом содержащим все вхождения подобных объектов. Существуют следующие объекты коллекции:

Доступ к коллекции

Большинство коллекций доступны через объект Document , т.к. он содержит свойства для каждой из коллекций. Следующий код устанавливает ссылку объектной переменной на коллекцию Layers :

Коллекции Documents, MenuBar и MenuGroups доступны через объект Application . Он содержит свойства для каждой из этих коллекций. Следующий пример определяет объектную переменную и создает ссылку через нее на коллекцию:

Добавление нового элемента коллекции

Следующий пример создает слой и добавляет его в коллекцию:

Перебор членов коллекции

Для выбора нужного члена коллекции используется метод Item . В качестве параметра ему передается номер ( Index ) объекта в коллекции либо его символьный идентификатор. Пример демонстрирует перебор всех слоев с отображением их имен

Пример поиска слоя с именем ABC :

Не следует использовать методы редактирования примитивов ( Copy, Array, Mirror и др.) на любом объекте который одновременно перебирается с помощью механизма For Each . В случае необходимости нужно закончить перебор, создать временный массив эквивалентный коллекции и в этом массиве выполнить редактирование.

Удаление члена коллекции

Пример удаления слоя:

Удаленный объект восстановлению не подлежит.

Понятие свойств и методов

Каждый объект обладает связанными с ним свойствами и методами. Свойства описывают некоторые характеристики присущие объекту, а методы позволяют выполнять действия над объектами, в частности, менять и читать свойства. Например, объект окружность имеет свойство Центр, которое представляет трехмерную координату центра окружности. Чтобы сменить свойство достаточно задать ему другое значение. Окружность как целое имеет метод Offset , который создает новый объект на указанном смещении от существующего. Полный перечень свойств и методов есть в ActiveX and VBA Reference .

Понятие родительского объекта

Каждый объект имеет своего родителя с которым он постоянно связан. Доступ к каждому объекту можно осуществить следуя от родительского объекта к дочернему. Кроме того все объекты имеют свойство Application , как непосредственную ссылку на корневой объект.

Библиотеки типов

Описание объектов, свойств и методов хранятся в библиотеке типов, с помощью которой браузеры и приложения могут определить характеристики объектов. Прежде чем использовать объекты автоматизации, следует создать ссылку на библиотеку типов. Это нужно для того, чтобы глобальные функции были доступны непосредственно без подготовки. Вызовы функций при этом могут контролироваться компилятором на корректность. Увеличивается надежность и читабельность программы.

Получение первого примитива из базы данных рисунка

Применение variant в методах и свойствах

Для передачи массива данных AutoCAD использует тип Variant который может принимать данные любого типа за исключением строк фиксированной длины и типов данных, определяемых пользователем. Может также принимать значения Empty, Error, Nothing, NULL . Чтобы узнать какой именно тип данных хранятся в переменной типа Variant , нужно обратиться к функции VarType или TypeName .

Тип данных Variant используется для передачи массива данных из/в AutoCAD ActiveX Automation . В AutoCAD VBA -входные массивы автоматически преобразуются в тип Variant . Однако c выходными массивами все не так просто. Метод CreateTypedArray преобразует массив в Variant , содержащий "смесь" из Integer, Double и т.д. Эту "смесь" можно передать в любой метод или любое свойство AutoCAD , которые принимают массив чисел как Variant .

В примере преобразуются три массива координат сплайна с передачей их методу AddSpline .

Интерпретация variant-массивов

Передаваемая AutoCAD ActiveX Automation информация массива возвращается как тип Variant , если типы данных элементов массива известны. Иначе применяем функции VarType Typename . Для перебора элементов массива удобен метод For Each . Пример вычисления расстояния между двумя точками введенными пользователем:

Использование других языков программирования

Чтобы использовать приведенные примеры не в VBA а в VB следует, во-первых, сослаться на библиотеку типов, во-вторых заменить все ссылки ThisDrawing Для этого определить переменную для приложения AutoCAD (myApp) и для активного документа ( myDoc ). Если AutoCAD запущен, метод GetObject возвращает объект AutoCAD Application . Если AutoCAD не запущен, то вызывается обработчик ошибок. Затем метод CreateObject пытается создать объект AutoCAD Application , как в следующем примере:

Здесь уже используем acadDoc -переменную для ссылки на текущий рисунок AutoCAD . Если запущены несколько сеансов, AutoCAD -функция GetObject возвращает первое вхождение из Windows Running Object Table (ROT) .

Следующий пример демонстрирует создание линии в VB и VBA

Управление окружением AutoCAD

Открытие, сохранение и закрытие чертежа

Коллекция Documents и объект Document обеспечивают доступ к файловым функциям. Для этого следует использовать один из методов Add, Close, Save, SaveAs, Import, Export . Пример открытия рисунка:

Visual Basic for Applications (VBA) - это язык программирования, встроенный во многие приложения, включая офисные программы, САПР, графические редакторы и многие другие. VBA является упрощенной версией языка Visual Basic, имеет схожий с ним синтаксис. Среда программирования VBA обычно встроена в саму программу, поэтому пользователь может сразу начинать писать программы или загружать готовые приложения для работы.

Visual Basic

При разработке языка VBA его авторы ориентировались на обычных пользователей, а не на профессиональных программистов, поэтому создавать программы на VBA достаточно просто и быстро.

Из преимуществ языка VBA можно отметить легкость его освоения и простоту использования, универсальность (изучив VBA для AutoCAD пользователь без труда изучит, например, VBA для Microsoft Word или Excel). Главный недостаток языка VBA – проблемы с обратной совместимостью разных версий.

В AutoCAD также есть встроенная поддержка языка VBA, для этого служит отдельный модуль AutoCAD VBA Enabler. С помощью программ на VBA можно обращаться ко всем объектам AutoCAD, примитивам чертежа, общаться между AutoCAD и сторонними приложениями и многое другое. Другими словами, с помощью языка VBA можно создавать программы любой сложности, которые позволят расширить функциональность системы, автоматизировать рутинные операции и многое другое.

Важным отличием VBA для AutoCAD от VBA для других программ является то, что в нем программы хранятся не внутри файлов, а во внешних файлах с расширением DVB.

В последних версиях AutoCAD модуль VBA Enabler не входит в дистрибутив и не устанавливается вместе с самим AutoCAD. Чтобы получить возможность работать с VBA в AutoCAD, вам необходимо скачать и установить AutoCAD VBA Enabler со специальной страницы в интернете

 AutoCAD VBA

Важно то, что при выборе модуля VBA Enabler нужно обратить внимание на версию AutoCAD и его разрядность. Например, модуль VBA для AutoCAD 2018 32-x не будет работать в среде AutoCAD 2018 64-x.

После скачивания, распаковки и установки модуля AutoCAD VBA Enabler в программе AutoCAD появится возможность работать с приложениями на языке VBA.

Окно редактора VBA (VBA IDE) запускается командой VBAIDE.

Окно редактора VBA

Оно стандартное для языка VBA и ничем не отличается от VBA в других программах.

Обратите внимание, что двоичный формат файлов проектов VBA в AutoCAD не совместим с форматом проектов Visual Basic. Однако, в VBA для AutoCAD можно импортировать формы, модули и классы, хранящиеся в файлах форматов FRM, BAS и CLS соответственно.

Commands(Команды)


Перейдите на вкладку Commands(Команды), в поле Categories (Категории) выберите All Commands (Все команды) или User Defined(Определенная пользователем). В окне справа выберите понравившуюся Вам кнопку и перетащите ее (не отпуская левой кнопки мыши) на экран или на любую существующую панель инструментов.
Можно, также, перейдя в том же диалоговом окне Customize (Настройка) на вкладку Toolbars(Панель инструментов), создать Новую панель инструментов(New Toolbar) с помощью кнопки New(Новая).

Макрос, связанный с кнопкой

Не закрывая диалоговое окно Customize(Настройка) щелкните (кликните) левой кнопкой мыши на созданной Вами кнопке, после чего вы должны очутится на вкладке Button Properties(Свойства кнопки).


В поле Name(Имя) задайте имя своей кнопки. В поле Description(Описание), можно задать пояснение, которое будет отображаться в строке состояния, когда курсор подведен к кнопке). В поле Macro associated with this button (Макрос связанный с этой кнопкой) должен быть записан текст для вызова макроса. Например:

^C^C-vbarun "C:/VBA Macro/MyMacro.dvb!Module1.Example"

Этот текст, по сути, сам является макросом, поэтому необходимо придерживаться определенных правил и использовать спецсимволы, при его написании. Здесь:
^C^C - Отменяет предыдущую команду.
-vbarun - Команда AutoCAD для запуска макроса
MyMacro.dvb! - Имя файла с расширением *.dvb (восклицательный знак обязателен)
Module1 - Имя модуля проекта
Example - Имя процедуры
Обратите внимание, обратная косая черта “\” означает паузу в макросе, поэтому при указании пути к файлу нужно использовать косую черту ”/”. Кавычки необходимо ставить, если внутри имен есть пробелы.

Путь поиска файла поддержки

Если макрос поместить в папку Support(С:/Program Files/AutoCAD 200…/Support), то путь к файлу указывать не надо. Достаточно написать:

Также можно поместить макрос в любую другую папку, но при этом нужно указать путь поиска файла поддержки. Для этого необходимо:
Открыть диалоговое окно Options(Настройка): Tools(Инструменты)→ Options(Настройка), или вызвать его при помощи контекстного меню, вызываемого по щелчку правой кнопкой мыши.

Options(Настройка)


Перейти на вкладку Files(Файлы) и в поле Search paths, file names, and file locations(Пути Поиска, файловых имен, и размещения файлов) выберите Support File Search Path(Путь поиска файла поддержки). Дальше необходимо нажать кнопку Add(Добавить), затем с помощью кнопки Browse(Обзор) выбрать, интересующую Вас папку. Теперь, при написании текста макроса для кнопки, не нужно указывать путь к файлу.

Создание изображения для кнопки

Откройте диалоговое окно Customize(Настройка):View(Вид) → Toolbars(Панели инструментов) и передите на вкладку Button Properties(Свойства кнопки). С помощью щелчка мыши выберите кнопку на экране или на панели инструментов, для которой нужно изменить изображение. На той же вкладке Button Properties(Свойства кнопки), справа, в области Button Image (Пиктограмма) можно выбрать картинку, в списке с полосой прокрутки.
С помощью кнопки Edit(Редактировать) открывается окно Button Editor(Редактор кнопки).


Здесь можно изменить изображение кнопки.Так же с помощью кнопки Open(Открыть) можно найти на жестком диске и открыть существующее изображение с расширением *.bmp , для последующего редактирования и сохранения.

Автоматическая загрузка макроса

Для того чтобы макрос автоматически загружался при открытии AutoCAD необходимо выполнить следующие действия:
Открыть диалоговое окно Load/UnloadApplications(Загрузка/выгрузка приложений):Tools(Сервис) → Load Applications…(Загрузка приложений…).

Load/UnloadApplications(Загрузка/выгрузка приложений)


В правом нижнем углу окна, в поле Startup Suite(Блок Запуска) нужно нажать кнопку Contents…(Содержание…), для вызова одноименного диалогаового окна.

Startup Suite(Блок Запуска)


Дальше следует нажать кнопку Add(Добавить), и выбрать на жестком диске файл Вашего макроса с расширением *.dvb. После чего, в поле List of applications:(Список приложений:) диалогового окна Startup Suite(Блок Запуска) должна появиться запись(имя файла и путь).

Я инженер-проектировщик ОВиК, не программист. И не хочу, да и некогда, вникать в серьезное программирование. Чаще всего появляется ситуация, что нужно как-то автоматизировать рутину здесь и сейчас. На помощь приходит простой язык VBA.

Далее я покажу, как можно без особых забот сделать самому то, за что серьезные ребята берут не плохие денежки. А именно перенос данных из Excel в AutoCAD и обратно. Заинтересованных прошу под кат.

Программировать будем на стороне Excel — мне так проще. Для подключения нужно войти в режим разработчика: Alt+F8 Либо можно открыть вкладку «разработчик» из настроек ленты.

В окне разработчика VBA входим в верхнее меню: Tools/References. В этом окне нужно поставить галочку на вашей версии AutoCAD


В моем случае это AutoCAD 2014 Type Library. Далее нужно в левом окне создать в вашей книге модуль, как на скриншоте (Module)


И в модуль вставляем нижеприведенный код:


Аналогичным способом можно создавать блоки с атрибутами, в которые можно вставлять текст из ячеек.
Нужно внести в верхний код изменения вроде:


Код обновления текста по хэндлу — написан ниже: 'получаем хэндл из ячейки, в которую мы записали кодом выше.

entHandle = ActiveCell.Offset(0, 3).Value 'получили наш блок по хэндлу
Set blockObj = acadDoc.HandleToObject(entHandle)

А дальше делаем всё то же самое, что и выше.

Для того, чтобы немного разъяснить как это работает вживую — записал видео:

Как видите, кода минимум, однако на больших объектах мне экономит по несколько часов работы. И снижается риск ошибки. Т.к. обычно это выглядит следующим образом у проектировщиков — открываются два окна на разных экранах, и или вручную, или через буфер обмена начинается заполнение выносок или блоков на чертеже.

Опять же чем хорош VBA — что он всегда под рукой :) Excel-то основной инструмент у инженера.

Читайте также: