Програмирование в AutoCAD с помощью VBA.

Источник: masters
masters

Что такое ActiveX?

ActiveX Automation это стандартный метод Microsoft для представления частей приложения и обеспечения доступа для использования другими приложениями. VBA - это скриптовый язык, базирующийся на стандартном Visual BASIC, который Microsoft внедряет в свои приложения. Используя VBA Вы можете настраивать приложение, создавая программы, которые управляют теми частями приложения, которые предоставлены через ActiveX Automation. AutoCAD поддерживает подобный вид настройки с помощью AutoLISP, но программирование на AutoLISP не всегда просто. Команды загадочные, встроенная отладка ограничена, и всюду круглые скобки. ActiveX Automation позволяет вам создавать приложения на любом языке который поддерживает интерфейс ActiveX Automation: C++ и Delphi, к примеру, и конечно Visual BASIC. Все это отдельные среды, кторые не интегрированы в AutoCAD. VBA, с другой стороны, встроен в среду AutoCAD, и нет необходимости приобретать дополнителные программные средства.

     Другое преимущество для ActiveX Automation и среды VBA - уровень доступной поддержки. Не много программистов знакомы с AutoLISP, а с помощью ActiveX Automation, программирование в AutoCAD доступно для специалистов в Visual BASIC и VBA. Даже лучше, VBA позволяет вам программировать самим и для себя. BASIC был разработан как язык для начинающих, и Visual BASIC продолжает эту традицию. continues that tradition. Если вы изучите несколько простых программных концепций, вы сами сможете настраивать AutoCAD! VBA также использует любый средства управления ActiveX, которые доступны сегодня. Вы хотели бы добавить датчик продвижения процесса чтобы показать, как быстро выполняется задача? Или возможно вставить мультипликацию чтобы развлечь ваших пользователей, пока они ожидают? С помощью VBA, достаточно расположить упрпавление в вашу программу и установить несколько параметров. А затем вам нужно только сесть, и наблюдать как ваши коллеги восхищаются вашей работой. Программируете вы в VBA, самом Visual BASIC, или другом языке, ActiveX Automation очень упрощает интегрирование информации в AutoCAD с другими приложениями Прошло время склеивания AutoLISP-подпрограмм, скриптов AutoCAD, и других специфические подпрограммы, чтобы создать настроенную программу которая охватывает сложные приложения. Теперь одна подпрограмма, использующая ActiveX Automation может управлять множеством приложений и проходом данных среди них. VBA сильно интегрирован с Windows. VBA имеет полный доступ к фаловой системе Windows, так что Вы можете создавать и удалять файлы и просматривать каталоги. Так же доступен полный интерфейс Windows-программирования, так что ваша программа может быть настолько сложна, на сколько вы хотите. ActiveX Automation имеет свои пределы - не может вообще взаимодействовать с AutoLISP. Подпрограммы ActiveX Automation не могут вызывать подпрограммы на AutoLISP, так же они не могут устанавливать значения переменных AutoLISP. Так же, среда VBA AutoCAD еще не до конца отлажена. Объекты, методы и свойства

     Одна из первых вещей, на которую Вы обращаете внимание когда углубляетесь в ActiveX Automation - это изобилие ссылок на объекты, методы и свойства. Это только краткое введение в эту концепцию, но как только Вы поймете это, Вы будете готовы начинать программировать. ActiveX Automati использует объектно-ориентированную модель, которая очень сильно отличается от программирования в AutoLISP. ActiveX Automation фокусируется на объектах. Объект в AutoCAD напоминает объект в реальной жизни, к примеру человек или дом. Это имеет различные характеристики которые его определяют, эти определения называются свойствами. Свойство может быть отдельной особенностью (как рост или цвет волос), другим объектом ( его дом ), или коллекцией объектов (вашей коллекцией марок). Для манипулирования объектами вы используете методы. Методы определяют действия которое необходимо выполнить над объектом (машиной можно управлять) или с объектом (человек может идти или прыгать).

     Модель ActiveX Automation в AutoCAD может быть найдена в руководсве по автоматизации AutoCAD (acadauto.hlp). Эта модель перечисляет объекты AutoCAD, которые доступны через ActiveX Automation. Самый верхний объект - это Application, который включает сам AutoCAD. Этот объект содержит объекты Preferences и Document, который в свою очередь предстваляет текущий чертеж. Объект Document в свою очередь содержит объекты Plot и Utility а также как несколько объектов-коллекции, каждый из которых управляет группой индивидуальных объектов. К примеру, коллекция Views содержит каждый вид в чертеже, а коллекции Model Space и Paper Space содержат каждый примитив в пространстве модели и пространстве листа соответсвенно. Теперь, когда Вы поняли в общем объектную модель, давайте исследуем более детально объект Block. Во первых, важено различать между собой определение блока и ссылки на этот блок. Коллекция блоков в объекте Document содержит только определения блоков - коллекции Model Space и Paper Space содержат объекты BlockRef которые фактически представляют блоки. Для доступа к специфическим определениям блоков используется метод Item в коллекции блоков. Вы можете запросить блок по его расположению в коллекции (удобно для перемещения через всю коллекцию) или по его имени. В любом случае вы получите, объект Block. Это объект может содержать любые объекты примитивы - окружности, штриховки, даже ссылки на другие блоки. Вы добавляете большинство примитивов с помощью метода AddXXX (AddCircle добавляет окуржность , AddRaster добавляет растровый файл), но вы используете InsertBlock что бы добавить ссылку на блок. Также, как коллекция Блоков обеспечивает метод Item для доступа к специфическим определениям блоков, объект Block обеспечивает метод Item для доступа к доступным индивидуальным примитивам в блоке. Вы можете просмотреть координаты блока и его имя через свойства Origin и Name.

     Свойство Application позволяет Вам приниматься за остальную часть объектной модели. Наконец, вы можете избавляетесь от определения блока, вызвав метод Delete. Это может казаться cтранным - иметь объект который удаляет себя, но почти каждая коллекция позволяет ее непосредственно составляющему объекту делают его грязную работу (только коллекция Viewports слишком объемная, что бы выполнить эту задачу самостоятельно). Конечно, каждый объект в пределах определения блока имеет его собственный набор методов и свойства. Все объекты-примитивы поддерживают основной набор их, включая методы Copy, Move и Rotate и свойства Color, Layer, и Linetype. В дополнение, объект BlockRef позволяет вам разбивать их, проверять их атрибуты, и получить их если они есть, а так же получить точку вставки и масшатбный фактор. Аналогично, Вы можете управлять центром и радиусом окружности, проверить его площадь и смещение новой окружности.

Следующие шаги

     Это был быстрый тур по ActiveX Automation, но вы могли оценить свои возможности. ActiveX Automation является простым способом настроить AutoCAD, и VBA позволяет это делать самостоятельно каждому, от новичка до эксперта. Много приложений, включая Microsoft Word и Excel, поддерживают программирование с помощью ActiveX Automation, так же как большинство проффесиональных средсв разработки типа Borland Delphi.

Изучение интерфейса VBA

     Прграммирование на VBA очень отличается от программировнаия на AutoLISP, и одним из самых больших отличий является среда программирования. AutoLISP не имеет встроенной среды программирования - вы должны использовать текстовый редактор, что бы создавать и редактировать код. Когда приходит время отладки, вы ограничены установкой команды печати в вашем коде для отображения текущего состояния программы и переменных. Существуют программы, которые позволяют сделать этот процесс более легким, но их нужно приобретать отдельно. VBA, с другой стороны, идет с всеми этими функциями, которые являются встроенные. VBA IDE включает редактор кода, конструктор форм, и отладчик в одном пакете. Из меню AutoCAD Tools, выберите Macros/Visual Basic Editor. Когда отобразиться VBA IDE, Вы увидите массив меню, кнопок и окон. Сначала найдите окно с названием. Это Обозреватель проектов Project Explorer (справа). Подобно как Windows Explorer отображает все файлы и каталоги на вашем жестком диске и помогает вам находить и работать со специфическими файлами, Project Explorer отображает все формы и модули с кодом в вашем проекте и помогает вам находить и работать со специфическими формами или модулями. Вы увидете три папки: AutoCAD Objects, Forms, и Modules. Когда вы добавляете форму или модуль к вашему проекту, VBA добавляет их к соответствующей папке. В AutoCAD 2000, папка AutoCAD objects содержит объект ThisDrawing, который автоматически присоединяется к AutoCAD. Все перечисленные окна помогают вам работать с формами. Формы - ваш основной интерфейс с пользователем. Там, где вы использовали диалоговые окна в программе на AutoLISP, вы используете формы в VBA. В дополнении, в любое время вы можете спросить у пользователя более чем две или три части информации, поскольку формы воспринимаются быстрее чем сообщения в командной строке. Мы используем формы, что бы позволить пользователю решить, какую информацию отображать.

Оформление внешнего вида программы на VBA

     Откройте меню Insert menu и выберите UserForm. Появяться два новых окна. Первое, называемое Project-UserForm1 (UserForm), это конструктор форм. Вы должны использовать его для графического конструирования форм. Второе окно, называемое Toolbox, содержит различные объекты, которые вы можете добавить к форме.

     Прежде всего, посмотрите на новое имя формы: UserForm1. Каждый VBA-проект, каждая форма и модуль внутри проекта, и каждый объект и каждый объект в каждой форме имеет свое имя. Когда вы начинаете проект, добавляете новую форму к проекту, или добавляете новый объект к форме, VBA создает имя по умолчанию. Я думаю, что вы будите изменять эти имена на другие, что нибудь значащие для вас. Нажмите правой кнопкой мыши на Project в Project Explorer и выберите Project Properties из всплывающего меню. Измените имя проекта на VbaDemo и нажмите на OK.

Рисунок 1. Меню Properties

     Прежде всего, найдите окно с названием Properties (справа). Я хочу Вам напомнить, большинство объектов имеют свойства, которые определяют внешний вид объекта. Окно window позволяет вам легко устанавливать эти свойства. Прямо сейчас, падающее меню вверху окна должно отображать UserForm1 UserForm. Падающее меню содержит каждый объект, который вы расположили на форме. Ниже падающего меню находится длинный список свойств формы: заголовок, высота, вершина и много других. Левая сторона перечисляет каждое свойство, а правая показывает значение каждого свойства. Найдите свойство Name и измините его на MainWin. Заметьте, что Project Explorer обновляет имя формы. Теперь, найдите свойство Caption и установите его в VBA Demo. Посмотрите заголовок формы в конструкторе форм после того как вы изменили его - оно измениться автоматически. Если вы когда-либо разрабатывали диалоговые окна используя AutoCAD DCL, вы должны оценить, насколько просто создавать формы в VBA.

Рисунок 2. Меню Toolbox

     Теперь вы готовы углубиться в Toolbox (ниже слева) и спроектировать свою собственную форму. Чтобы добавить управление к вашей форме, кликните на иконке в панели инструментов Control, а затем кликните на форме. Если Вы не уверены, какой вид управления представляет определенная кнопка в пaнели инструментов Control, подведите курсор мыши на несколько секунд к иконке, и тогда отобразиться описание того, что собой представляет данная иконка. Верхняя левая точка иконки расположиться в той точке, на которую вы укажете в форме. Вы можете изменить размер иконки управления перемещая любой из его углов или граней, точно так же как Вы мог бы изменять размеры Проводника Windows.

Рисунок 3. Общий вид формы

     Вы можете также установить его свойста Top, Left, Height, и Width в окне свойств (Properties). Дале добавте две командные кнопки к форме. Измените имя первой кнопки на SayHello и ее заголовок на Say Hello, а затем измените имя второй кнопки на AskQuestion и ее заголовок на Ask a Question. Ваша первая форма должна быть похожа на ту, которая показана на рисунке 2.

Работа с пользователем.

     Теперь, когда интерфейс с пользователем завершен, вам нужно добавить немного кода за сценой. VBA в AutoCAD R14.01 и R2000 имеет встроенную связь с AutoCAD, в отличие от R14, где нужно вручную подключать VBA к AutoCAD.

     Я знаю, это не имеет смысла В конце концов, вы всегда запускаете внутри AutoCAD и вы никогда не должны были это делать с AutoLISP! Но VBA не специфическая для AutoCAD среда. Одно VBA-приложение может управлять любым количеством поддерживающих VBA приложений. К примеру, вы можете использовать VBA для того, что бы сформировать перечень материалов, извлекая атрибуты из вашего чертежа, и соформировать затем таблицу в Excel. Вы так же можете использовать AutoCAD VBA среду что бы создавать приложения, которые не связаны с AutoCAD. Как всегда, добавление гибкости означает добавление работы, к счастью, эта работа не слишком напряжена. Прежде всего, кликните правой кнопкой на форме и выберите View Code из всплывающего меню. Это откроет редактор кода. Хотя на первый взгляд редактор кода похож на обыкновенный текстовый редактор, на самом деле он - намного большее.

     Посмотрите на два падающих меню в верхней части редактора. Падающее меню Objects слева - это перечень всех объектов, которые вы расположили в форме. Падающее меню Events справа - это перечень каждого события для вашего текущего объекта. Когда вы выбираете объект, редактор кода автоматически добавлет подпрограмму обработки событие по умолчанию для этого объекта. Когда вы выбираете событие, редактор автоматически добавляет подпрограммку поддержки этого события вместе с любыми требуемые аргументами. По мере того как Вы набираете код, редактор делает много работы для Вас. Если Вы ссылаетесь на стандартную для VBA процедуру, редактор отображает подсказку которая перечисляет стандартный для данной процедуры синтаксис. По мере того как вы перемещаетесь со строки на строку, редактор подсвечивет определенным цветом ключевые слова, коментарии, и так же проверяет каждую строку на синтаксические ошибки. В дополнении, вы можете перемещаться к странице со справкой, просто переместив курсор к месту вызова метода и затем нажав F1 Хотя эта деятельность может казаться навязчивой сначала, вскоре Вы найдете это чрезвычайно полезным. Я настолько привык к этому, что, когда я изменяю старый AutoLISP-код, мне необходимо некоторое время, что бы привыкнуть что код не окрашивается и не проверяется тут же.

     Я уверен что Вы стремитесь видеть все это в действии. Выберите General из падающего меню Objects и Declarations из падающего меню Events, и затем добавьте следующие переменные для образования связи:

Private
ThisApplication
As Object

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

On Error Resume
Next
Set
ThisApplication =
GetObject(,"AutoCAD.Application")
If (Err.Number <> 0)
Then MsgBox "Unable to connect to AutoCAD!"
Unload Me
End If 'On Error Resume Next' говорит VBA переместиться на следующую инструкцию всякий раз, когда произойдет ошибка. без этой строки приложение будет остановлено и отобразиться диалоговое окно с сообщением об ошибке. Вызов GetObject осуществляет попытку соединиться с выполняемы сеансом AutoCAD. Если это невозможно , происходит ошибка. Таким образом, немедленно после попытки, ваше приложение должно проверить, было ли это успешно. Если нет, необходимо дать знать об этом пользователю, а затем выгрузить форму. Процесс выгрузки формы автоматически завершает приложение. Также, как ваше приложение нуждается в помощи при соединении с AutoCAD, оно должно сообщить о том, когда оно разорвет связь с AutoCAD. Выберите событие Terminate в объекте UserForm и наберите:
Set mappAcad = Nothing Это освободит соединение.

     Если вы используете AutoCAD 14.01 или 2000, вы можете удалять весь код что вы набрали. Как я упомянул, Вы имеете встроенный объект ThisDrawing который представляет текущий чертеж. Он имеет свойство Application которое вы можете использовать для вызова любых методов объекта Application.

Получение ответа

     После того как вы подключились к AutoCAD, вам необходимо добавить немного кода к вашему приложению что бы оно занало, что делать, когда пользователь что-то делает. Сделайте двойной щелчек мыши на кнопке SayHello в вашей форме. Обратите внимание что ваш редактор кода перемещается к событию Click кнопки. Это событие по умолчанию для управления кнопкой. Если вы желаете немного другое событие, Вы можете просто выбрать его из правого падающего списка.

     Когда пользователь нажимает на кнопку SayHello, VBA0-программа должна отобразить окном сообщений, с надписью "Hello!". VBA имеет метод, который достаточно соответствует этому - MsgBox, который только это и делает. Добавьте следующий код к событию по нажатию (Click) для SayHello:

MsgBox "Hello!"

     Как минимум, вы дадите для MsgBox сообщение для отображения, но этот метод может больше, если ему дать больше информации. К примеру, он может задать вопрос пользователю и сообщить его вам. Выберите AskQuestion из меню Object в редакторе кода; редактор снова предположит что вам нужно событие Click. Добавьте следующий код:

If (MsgBox("Is it raining out?",
vbYesNo, "Hey, Weatherman!") = vbYes) _
Then MsgBox "Better close the window!"
Else MsgBox "Enjoy the nice day!"
End If

     Как и в предыдущем случае, первый аргумент для MsgBox - сообщение для отображенияy. The Второй аргумент сообщает MsgBox что бы оно отобразило кнопки Yes и No прежде чем кнопку OK. Третий аргумент сообщает MsgBox как озаглавить диалог.

     Когда вы укажите MsgBox отобразить кнопки Yes и No, вы можете проверить код возврата что бы определить, какую кнопку нажал пользователь. Если возвращаемое значение эквивалентно встроенной константе vbYes, пользователь нажал кнопку Yes. И как вы можете догадаться, нажатие кнопки No будет возвращать значение vbNo.

     Готовы видеть результаты ваших усилий? Запустите программу на выполнение выбрав Run из меню Run. Ваша форма отобразиться в окне AutoCAD, и выступающие кнопки будут настаивать на ответе. Немного поотвечайте на вопросы, а затем возвращайтесь, когда вы утомитесь отвечать на вопросы. Ваше приложение прочти закончено, но оно не содержит одной важной детали. Приложение запускается из среды разработки VBA, но как оно будет загружаться внутри AutoCAD? Никакие силы не заставят без этой детали запуститься приложению из командной строки AutoCAD. Что бы это сделать, вам необходим метод-помощник. Откройте в VBA меню Insert и выберите Module. Измените имя модуля на AppStuff, и введите следующий код в редакторе:

Public Sub
VbaDemo()
MainWin.Show
End Sub Сохраните ваш VBA-проект, затем переключитесь в командную строку AutoCAD и наберите vbarun AppStuff.VbaDemo. Ваша форма отобразилась на экране!

     В данном уроке мы охватим понятия настройки AutoCAD с помощью VBA. Мы создадим FancyText, Простое VBA-приложение, которое будет создавать привязанный текст под любым уголом на текущем уровне. Если Вы сталкиваетесь с проблемами (или только слишком ленивы чтобы набрать код), FancyText доступен на Web-сайте CADALYST.

     Откроем VBA IDE (интегрированная среда разработки). Программирование в VBA очень отличается от программирования AutoLISP, и одно из этих отличий - среда разработки. AutoLISP не имеет встроенной среды разработки - вы используете свой текстовый редактор для создания и редактирования кода. Когда подходит время отлаживать программу вы ограничены использованием команд печати в вашем коде, что бы отобразить сообщения о состоянии программы, переменных, или чего-нибудь еще, что будет вам говорить что в вашей программе неправильно. VBA, наоборот, имеет все это встроенным. VBA IDE содержит редактор кода, конструктор форм и отладчик. В VBA IDE найдите окно, называемое Project. Это обозреватель проектов (Project Explorer), как вы могли понять из предыдущего урока. Как обозреватель Windows отображает все файлы и каталоги на вашем жестком диске и помогает вам находить и работать со специфическими файлами, Project Explorer отображает все формы и модули с кодом в вашем проекте и помогает вамнаходить и работать со специфическими формами или модулями. Обратите внимание, что здесь находятся три папки: AutoCAD Objects, Forms, и Modules. Когда вы добавляете форму или код к вашему проекту, VBA добавляет это к соответствующей папке. Я буду объяснять назначение папки AutoCAD Objects в следующем разделе.

     Оставшиеся окна помогают вам работать с формами. Формы - это ваш основной интерфейс с пользователем. Когда вы используете диалоговое окно на AutoLisp в подпрограмме на AutoLISP, в VBA вы используете форму. В дополнение, в любое время вы можете запросить у пользователя два или три куска информации, так как он воспринимает информацию лучьше из формы лучьше чем из командной строки.

Создание формы

     Откройте меню Insert и выберите UserForm. Когда вы сделаете это, появяться два новых окна. Первое, под названием Project-UserForm1 (UserForm) - является конструктором форм. Вы должны использовать его для графического конструирования форм.

     Второе окно, под названием Toolbox, содержит различные объекты которые вы можете добавлять к форме. Я скоро опишу процесс создания форм, но прежде всего посмотрите на на новое имя формы: UserForm1. Каждый VBA-проект, каждая форма и модуль в проекте, и каждый объект в каждой форме имеет свое имя. Когда вы начинаете проект, добавляете новую форму к проеку, или добавляете новый объект к форме, VBA создает имя по умолчанию. Я всегда изменяю эти имена по умолчанию на что-нибудь более значимое. Кликните правой кнопкой мыши на Project в Project Explorer и затем выберите Project Properties из всплывающего меню. Измените имя проекта на FancyText и кликните на OK. Далее найдите окно под названием Properties. Вы наверно помните, что большинство объектов имеют различные свойства, которые определяют внешний вид этих объектов. Окно Properties позволяет вам легко устанавливать эти свойства. Прямо сейчас, в падающем меню в верху окна должно находиться UserForm1 UserForm. Это падающее меню содержит каждый объект, который вы расположили на форме. Ниже в этом падающем меню находится длинный список свойств формы: Caption, Height, Top, и множество других.

     С левой стороны перечисляются все свойства, а с правой - их значения. Найдите свойство (Name), затем измените его на frmFancyText. Обратите внимание, что Project Explorer немедленно обновил имя формы. Теперь найдите свойство Caption и установите его в Fancy Text. Заметьте, что заголовок формы в конструторе форм автоматически изменился после этого. Если вы имеете опыт создания диалоговых окон используя AutoCAD DCL, вы оцените как просто это делается в форме VBA.

Создание интерфейса пользователя

     Теперь вы готовы начать создание интерфейса пользователя для FancyText. Кликните на конструкторе форм, что бы активировать панель инструментов (Toolbox). Что бы расположить объект на форме, кликните на соответсвующей иконке в панели инструментов, а затем переместите его в конструктор форм. Когда вы перемещаете объекты по форме, вы можете видеть что перемещаемый объект выделен с внешней стороны.

     После того, как вы расположили объект, вы можете изменить его размеры, или с помощью мыши, или устанавливая его свойства top, left, height, и width в окне Properties. Пользователи нашей программы будут нуждаться в изменении высоты текста, поэтому разместите метку (label) и блок текста (textbox) из панели инструментов на форму. Кликните на метке, переместите ее в окно Properties, и измените ее имя на lblHeight и ее заголовок на Height. Кликните на блок текста и измените его имя txtHeight.

     Что-бы позволить пользователям вращать текст добавьте еще одну метку и блок текста вместе со слайдером (SpinButton). Пользователи теперь смогут вводить угол поворота непосредственно в блок текста, или использовать слайдер для изменения угла вращения при одном нажатии на один градус.

     Измените имя новой метки на lblRotation и ее заголовок на Rotation. Измените имя нового текстового окна на txtRotation, и затем измените имя слайдера на spnRotation. Что бы пользователи могли вводить текст, добавьте еще одну метку и еще один блок текста.

     Измените имя метки на lblText и ее заголовок на Text:, после этого измените имя блока текста на txtText.Finally, и добавьте кнопку управления (CommandButton) к форме. Измените ее имя на cmdGo и ее заголовок на Go! Нажатие на уту кнопку будет вызывать создание текста. Ваша форма должна выглядеть как показано на рисунке 4.

Рисунок 4. Окно ввода данных для Fancy Text.

Создание кода программы

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

     Одно VBA-приложение может управлять любым количеством поддерживающих VBA приложений. К примеру, вы можете использовать VBA что-бы создать список материалов извлекя инормацию из атрибутов в вашем черетеже и перенести его в таблицу в Excel. Вы можете даже использовать среду AutoCAD VBA что бы создавать приложения, не связанные с AutoCAD. Как всегда, добавление гибкости означает добавление лишней работы, но к счастью, эта работа не слишком напряженная.

     Прежде всего, кликните правой кнопкой мыши на форме и выберите View Code из всплывающего меню. Это откроет редактор кода. Хотя на первый взгляд он выглядит как обычный текстовый редактор, он может гораздо больше. Посмотрите на два выпадающих окон списков в верхней части редактора. Выпадающее меню слева это перечень объектов, которые вы расположили в форме. Выпадающее меню справа - это список событий, он перечисляет каждое доступное событие для текущего объекта. Когда вы выбираете объект, редактор кода автоматически выбирает событие по умолчанию для этого объекта. Когда вы выбираете объект, редактор автоматически добавляет подпрограмму поддержки этого события, сразу со всеми требуемыми аргументами. По мере того, как вы набираете код, редактор выполняет много работы за вас. Если вы ссылаетесь на стандартную VBA-процедуру, редактор отображает подсказку, в которой перечисляется синтаксис процедуры. По мере того как вы перемещаетесь по коду, редактор подсвечивает цветом ключевые слова, комментарии а так же проеряет синтаксис каждой строки. В дополнение, вы можете перемещаться на страницу помощи просто переместив курсор на вызов метода и нажав F1. Хотя эта деятельность может казаться навязчивой сначала, вскоре вы поймете, что это чрезвычайно полезно. Я уверен, что Вам нетерпиться, чтобы видеть все это в действии, выберите General из падающего меню Objects Declarations из падающего меню Events, и затем добавьте следующую переменную для обеспечения связи:

Private mappAcad As Object

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

On Error Resume Next
Set mappAcad =
GetObject(,"AutoCAD.Application")
If (Err.Number = 0) Then
MsgBox "Unable to connect to AutoCAD!"
Unload Me
End If On Error Resume Next указывает VBA переместиться на следующую строку кода когда имеет место ошибка. Без этой строки выполнение прогаммы будет остановлено и VBA отобразит окно с сообщением об ошибке. GetObject осуществляет попытку образовать связь с открытой сессией AutoCAD. Если это невозможно, имеет место ошибка. Таким образом, немедленно после попытки, ваше приложение должно проверить, было ли это успешно. Если нет, необходимо дать знать об этом пользователю, а затем выгрузить форму. Выгрузка формы автоматически завершает приложение. Точно также, как ваше приложение нуждается в помощи для соединения с AutoCAD, необходимо указать ему, когда надо отсоединиться от AutoCAD. Выберите событие Terminate в объекте UserForm и наберите:
Set mappAcad = Nothing Это завершит связь. Теперь, вспомните, как Вы можете использовать слайдер, что бы изменить угол вращения. Выберите событе SpinUp для объекта spnRotation. Получите текущий угол вращения, переведите его в число, а потом увеличивайте на единицу. Вы можете вращать только до 360 градусов, а затем збрасывайте его значение опять в 0 когда оно достигнет 360. И наконец, установитье угол вращения текста в его новое значение:
Dim rot#
rot# = Val(txtRotation.Text) + 1
If (rot# > 359#) Then
rot# = 0#
ElseIf (rot# < 0#) Then
rot# = 0#
End If
txtRotation.Text = CStr(rot#) Вы можете так же осуществлять изменение значения назад, добавив к событию SpinDown следующий код:
Dim rot#
rot# = Val(txtRotation.Text) - 1
If (rot# < 0#) Then
rot# = 359#
ElseIf (rot# > 359#) Then
rot# = 359#
End If
txtRotation.Text = CStr(rot#)

     Сохраните ваш проект, а затем запустите FancyText или открыв меню Run и выбрав Run Sub/UserForm 9 или нажав F5. Введите угол вращения текста и используя слайдер измените его значение вверх до 359 градусов и вниз до 0 градусов, и каждое нажатие на слайдер должно вызывать изменение угла вращения на один градус. Как только вы будете уверены, что все работает, подготовтесь к следующему занятию - созданию текста.

Работа с вашим первым приложением

Michael Hunter

     В уроке 3 мы начали ваше первое VBA-приложение для AutoCAD, FancyText. Вы создали диалоговое окно и теперь вы готовы работать с тем, что пользователь будет в них вводить. Готовы? Переместимся в событие Click объекта CmdGo (командная кнопка). Когда что-нибудь произойдет, ваша програма должна прежде всего проверить то что введено пользователем. Она должна проверить тип текста и его наличие, и обратить внимание пользователя, если он что-то забыл ввести. Наберите:

If (Trim(txtText.Text) = "") Then
MsgBox "Please enter some text!"
txtText.SetFocus
Exit Sub
End If

     Изучение свойства Text блока текста сообщит вам, если пользователь забыл заполнить его. Используйте SetFocus tчто бы переместить курсор на поле, где отсутствует информация, что сделает Fancy Text более дружественной к пользователю. В противном случае пользователь должен будет сам перейти на незаполненное поле. Проверка высоты текста более сложна. Вы можете использовать 5 различных систем едениц что-бы вводить растояние в AutoCAD, и Fancy Text принимает ввод пользователем в текущих еденицах чертежа. Мало того, что Вы должны проверить что пользователь ввел высоту, вы так же должны конвертировать высоту в число:

If (Trim(txtHeight.Text) = "") Then
MsgBox "Please enter a text height!"
txtHeight.SetFocus
Exit Sub
End If
Dim unit%
unit% = mappAcad.ActiveDocument._
GetVariable("LUNITS")
On Error Resume Next
Dim height#
height# = mappAcad.ActiveDocument._
Utility.DistanceToReal(_
txtHeight.Text, unit%)
If (Err.Number <> 0) Then
MsgBox "Please enter a "
& "valid text height!"
txtHeight.SetFocus
End If Используйте GetVariable() что бы получить значение любой системной переменной AutoCAD или переменной окуржения, подобно тому, как вы используете функии (getvar) и (getenv) в AutoLISP.

     После того, как вы определили текущие еденицы чертежа, вы можете использовать метод DistanceToReal() объекта Utility что бы конвертировать расстояние из строковой переменной в числовую. Ошибка происходит когда конвертация не удается, поэтому при попытке конвертации вы должны осуществлять проверку на возможность ошибки, и сообить пользователю, если введенная высота не может быть сконвертирована. Теперь вы почти готовы начать создание текста, но вам еще нужна центральная точка текста. Переместимся в начало события Click и добавим несколько констант:

Const L_PT_FIRST = 0
Const L_PT_X = 0
Const L_PT_Y = 1
Const L_PT_Z = 2
Const L_PT_LAST = 2

     Точка представляется в VBA как массив из трех элементов типа doubles. Эти константы помогут вам легко объявит точечные переменные и доступ к параметрам этих точек. Теперь переместимся в конец события Click.

Когда форма должна быть скрыта

     Вы можете использовать GetPoint() метод объекта Utility что бы получить стартовую точку текста от пользователя, но здесь имеет место одна из причуд VBA. VBA формы - модальные, что означает, что вы не можете ничего делать в приложении - родителе формы пока форма отображена на экране. Другими словами, вы должны скрыть форму перед тем, как должен указать стартовую точку:

Dim ptPickd As Variant
Dim ptInsert#(L_PT_FIRST To L_PT_LAST)
Me.Hide
mappAcad.ActiveDocument.Utility._
InitializeUserInput 1 + 2
ptPickd = mappAcad.ActiveDocument._
Utility.GetPoint(, "Pick the " _
& "center point for the text: ")
ptInsert#(L_PT_X) = ptPickd(L_PT_X)
ptInsert#(L_PT_Y) = ptPickd(L_PT_Y)
ptInsert#(L_PT_Z) = ptPickd(L_PT_Z) Метод InitializeUserInput() позволяет вам указать какой метод семейства GetXxx проверяет ввод пользователя; аргумент 1 + 2 говорит GetPoint() что бы он игнорировал нулевой ввод. После того как у вас есть точка, вы должны сконвертировать ее. GetPoint() возращает точку как Variant, но большинство функций VBA, которые используют точки требует трех-элементный массив типа double. Вы должны выполнить черную работу копирования x-, y-, и z-координат точки из Variant в массив типа double.

Черчение текста

     Теперь, когда вы имеете всю информацию, создадим текст. Текст будет состоять из двух частей - сам текст и его обводка. Добавить текст просто: нужно только вызвать метод AddText() коллекции ModelSpace и сообщить ему, какой текст нужно добавить, где его добавить, и какой высоты он должен быть:

Dim objText As Object
Set objText = mappAcad.ActiveDocument._
ModelSpace.AddText(txtText.Text, _
ptInsert#, height#)

     Все функции типа Add возвращают последний созданный примитив. Вам необходимо ссылаться на них несколько раз, так что за ними необходимо следить. Создание обводки текста более сложный процесс. Что бы начать обводку нам нужно знать какую площадь занимает текст. К счастью каждый примитив имеет метод GetBoundingBox который обеспечивает вас нжней левой и верхней правой координатами:

Dim ptMinBound As Variant
Dim ptMaxBound As Variant
objText.GetBoundingBox ptMinBound, _
ptMaxBound Дальше добавим немного для памяти, что бы обводка и текст не пересекались:
Dim offDist#
offDist# = height# / 3
ptMinBound(L_PT_X) =
ptMinBound(L_PT_X) - offDist#
ptMinBound(L_PT_Y) = _
ptMinBound(L_PT_Y) - offDist#
ptMaxBound(L_PT_X) = _
ptMaxBound(L_PT_X) + offDist#
ptMaxBound(L_PT_Y) = _
ptMaxBound(L_PT_Y) + offDist# Вы так же должный вычислить центр текста что бы иметь возможность вращать текст и его обводку вокруг этой точки. Обводка для текста по кругу используют эту точку как ее центр:
Dim bndHeight#
Dim bndWidth#
bndHeight# = ptMaxBound(L_PT_Y) _
- ptMinBound(L_PT_Y)
bndWidth# = ptMaxBound(L_PT_X) _
- ptMinBound(L_PT_X)
Dim ptCenter#(L_PT_FIRST To L_PT_LAST)
ptCenter#(L_PT_X) = ptMinBound(L_PT_X) _
+ (bndWidth# / 2)
ptCenter#(L_PT_Y) = ptMinBound(L_PT_Y) _
+ (bndHeight# / 2)
ptCenter#(L_PT_Z) = ptMinBound(L_PT_Z) Вы должны быть способны установить текст горизонтально и вертикально, в этом случае точка вставки текста и его центральная точка должны быть одинаковыми.

Создание обводки

     Теперь вы готовы создавать обводку, которая будет выполнена с помощью полилинии. Здесь мы встретимся с другой причудой VBA.

     В отличии от большинства других примитивов, полилинии не имеют z-координату, что означает массив координат должен иметь только восем элементов, а не двенадцать:

Dim pts#(0 To 7)
pts#(0) = ptMinBound(L_PT_X)
pts#(1) = ptMinBound(L_PT_Y)
pts#(2) = ptMinBound(L_PT_X)
pts#(3) = ptMaxBound(L_PT_Y)
pts#(4) = ptMaxBound(L_PT_X)
pts#(5) = ptMaxBound(L_PT_Y)
pts#(6) = ptMaxBound(L_PT_X)
pts#(7) = ptMinBound(L_PT_Y)
Set objOutline = mappAcad._
ActiveDocument.ModelSpace._
AddLightWeightPolyline(pts#)
objOutline.Closed = True
' a sausage is simply a rectangle whose
' short edges are bulged.
objOutline.SetBulge 0, -1
objOutline.SetBulge 2, -1

     Теперь будем вращать текст и его обводку. Большинство людей представляет себе углы в градусах, но VBA требует их в радианах. Необходимо сконвертировать угол вращения перед тем как он будет передан в метод Rotate.

Const L_PI = 3.14159
objText.Rotate ptCenter#, _
(txtRotation.Text * L_PI / 180#)
objOutline.Rotate ptCenter#, _
(txtRotation.Text * L_PI / 180#) И наконец, переместим текст и его обводку так что бы их центры совпали с точкой, указанной пользователем.
objText.Move ptCenter#, ptStart#
ptCenter#(L_PT_Z) = 0
objOutline.Move ptCenter#, ptStart# Теперь, обновим текст и его обводку на экране, освободим наши ссылки на них и выгрузим:
objText.Update
objOutline.Update
Set objOutline = Nothing
Set objText = Nothing
Unload Me

     Наше приложение FancyText теперь завершено. Сохраните вашу работу, а затем протестируйте. Вы должны быть способны создавать текст любого размера и под любым углом. После того как вы убедитесь, что все работает правильно нам остается выполнить последний штрих, что бы завершить программу.

Последние штрихи

     FancyText отлично работает из среды VBA IDE, но я думаю вам будет приятно запустить ее из командной строки? Добавьте новый модуль к вашему проекту, установите его имя (Name) в "modApps", и затем добавьте следующие процедуры к модулю:

Sub FancyText()
frmFancyText.Show
End Sub Теперь запустите FancyText набрав
-vbarun modApps.FancyText в командной строке AutoCAD.

     Теперь вы знаете как создавать диалоговые окна для взаимодействия с пользователем, как добавлять новые примитивы к чертежу, и как манипулировать текстовыми примитивами в чертеже. Вы можете улучшить FancyText различными способами, включая установку высоты текста по умолчанию к текущей высоте текста по умолчанию в AutoCAD и добавление дополнительных типов обводки. Версия FancyText доступная на Web-сайт журнала CADALYST добавляет прямоугольные и круговые текстовые стили. Я был бы заинтересован узнать, как Вы улучшите ее.


Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=30007