Макросы. Все для лентяя

Макросы. Все для лентяя

Привет всем, кому еще не надоел кремний во всех его проявлениях! Нам в повседневной работе с компьютером часто приходится повторять однообразные действия. Но компьютер — такая штука, что он делает то, что ему скажут, а не то, что от него хотят. При работе с крупными приложениями (не считая современных игрушек, которым уже и трех CD мало) работа над одним проектом растягивается на несколько дней, а то и недель. Иногда после приходится повторять сложные манипуляции — например, с текстом в "Ворде" — либо строить такие же примитивы в AutoCAD'е, как и в предыдущих документах, но с некоторыми небольшими изменениями.

Но эти "небольшие" изменения не позволяют воспользоваться услугами буфера обмена, т.е. просто скопировать из одного проекта в другой. Чтоб решить данную проблему и облегчить жизнь простым пользователям, была придумана технология макросов. (Слышали о макровирусах? Так вот, это тоже макросы, но только специфического назначения.) Практически в каждом крупном приложении они поддерживаются. Если макросы не поддерживаются, то, как правило, приложение "умеет" разбирать файлы со скриптами, написанными на своем языке программирования (в AutoCAD это, например, Visual LISP). Так что же такое макросы? Это, по сути дела, обыкновенная программа, которая тесно "интегрируется" с приложением. Это значит, что макрос запускается из исходного ("материнского") приложения. Но макрос — это тоже приложение. Однако его отличительной особенностью является то, что оно может при помощи специальных функций, поддерживаемых "материнским" приложением, работать прямо с документом. Т.е. редактировать его в автоматическом режиме. В качестве языка приложения в макросах обычно используется Visual Basic. Конечно, те, кто работал с "настоящими" языками программирования, будут разочарованы ограниченностью возможностей VB, но для большинства повседневных целей их вполне хватает. Начинать изучение нового языка, а значит, и новой среды разработки, лучше всего с конкретного приложения.

Итак, хочу показать вам на конкретном примере, как можно автоматизировать процесс редактирования документа. Работать будем в SolidWorks 2001 — приложении довольно "серьезном", в котором работа над одним чертежом продолжается достаточно долго, чтобы количество времени, затраченное на создание "с нуля" какого-либо профиля, превышало необходимое для написания макроса, строящего этот профиль автоматически. В основы работы с SolidWorks 2001 я вдаваться не буду, т.к. оно здесь приведено скорее для примера. Будем считать, что вы умеете с ним обращаться:-). Но все основные принципы программирования макросов справедливы и для других приложений — даже для (банальный пример) Microsoft Office. Итак, ставим задачу. У нас есть пустой документ. Необходимо построить профиль, координаты точек которого задаются следующим образом: диск заданного диаметра катится по краю другого диска, также заданного, большего диаметра. На малом диске берется точка. Профиль — это траектория движения данной точки. Проще говоря, это нечто вроде синусоиды, "согнутой в окружность".

Эта "фигура" называется циклоида. Итак, создаем новый макрос. Создать макрос можно записав производимые вами действия, а после отредактировав это в редакторе. Так вы создаете новую программу, а заодно узнаете, какие функции вам необходимы для работы с документом, не обращаясь к справке (но не обольщайтесь: справку почитать все равно придется, так что учите английский — без него никуда!:-)). Проще всего это сделать из меню: Инструменты-> макрос-> Начать запись. Строить циклоиду будем при помощи сплайна, т.к. он несколько сглаживает острые углы. Ведь мы не можем рассчитать ВСЕ точки профиля, поэтому ограничимся шагом в один градус. После чего соединим их сплайном. После того, как вы начали запись, попробуйте построить сплайн. Построили? Теперь закончите запись (Инструменты-> Макрос-> Закончить запись). Нам предложат сохранить макрос, что мы и сделаем. Теперь, выбрав Инструменты-> Макрос-> Изменить… находим вновь созданный файл, и он открывается в редакторе Visual Basic. Кто ранее работал хотя бы в Visual C++, сразу узнают знакомый интерфейс. И, что, пожалуй, самое главное, принципы работы тоже совпадают. Теперь это наш основной инструмент разработки. Среда уже создала за нас "костяк" кода. Да, следует сказать, что в данном случае нет понятия "компиляции" как такового. Компиляция производится что называется "на лету". Для начинающих кодеров это, надо сказать, очень удобно. Для нашего макроса код следует привести к следующему виду:

Dim swApp As Object
Dim Part As Object
Dim boolstatus As Boolean
Dim longstatus As Long
Dim Annotation As Object
Dim Gtol As Object
Dim DatumTag As Object
Dim FeatureData As Object
Dim Feature As Object
Dim Component As Object
Sub main()
Input_data.Show 'Заставляем нашу форму показаться. Скрыть форму можно так:
' "Input_data.Hide"
Set swApp = CreateObject ("SldWorks.Application")' Создаем объект приложения
Set Part = swApp.ActiveDoc
End Sub

Немного поясню, что это означает. После слова Dim следуют имена используемых в программе переменных. Например, "Dim boolstatus As Boolean" означает задание переменной с именем boolstatus типа Boolean. После запуска макроса управление получает "блок" программы, ограниченной словами Sub main() … End Sub. Но в программу нам необходимо, как правило, вводить различные данные. Удобней всего делать это при помощи специальных форм. Среда разработки позволяет это сделать. Для этого выбираем: Insert-> UserForm. После чего перед нами появится конструктор, в котором можно создать интерфейс формы.

Как вы, наверное, уже догадались, при двойном щелчке по элементу формы среда разработки генерирует обработчик этого элемента. Но сначала займемся свойствами элементов. Щелкнув правой кнопкой по какому-нибудь обьекту, выбираем Properties и слева в появившейся табличке производим изменения в соответствии с нижеследующим:



Теперь создадим обработчик этой формы — двойным щелчком по кнопке GO! (да, названия кнопок и статического текста — то, что Label — меняются по одиночному щелчку). Среда сгенерирует код, который после редактирования нижеследующим образом и будет производить всю работу. Чуть не забыл. Комментарии ограничиваются знаком апострофа ('). Итак, для начала зададим переменные:

Private Sub CommandButton1_Click()
Dim Rb
Dim E 'Эксцентриситет
Dim m
Dim a
Dim g
Dim temp1
Dim temp2
Dim z
Dim Pi ' Число Пи
Dim X, Y
Dim i ' Переменная для хра-нения количества точек
Dim Xa(720) As Double 'Массивы для хранения значений координат
Dim Ya(720) As Double '

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

'Ввод данных
'Проверка данных "от дурака"
If Not IsNumeric(RC_input. Text) Then MsgBox "Введенное значение радиуса цевки не число!(дробные числа вводятся с запятой!)": RC_input. Text = "": RC_input.SetFocus: Exit Sub
If Not IsNumeric(E_input. Text) Then MsgBox "Введенное значение эксцентриситета не число!(дробные числа вводятся с запятой!)": E_input. Text = "": E_input.SetFocus: Exit Sub
If Not IsNumeric(z_input. Text) Then MsgBox "Введенное значение числа зубьев не число!(дробные числа вводятся с запятой!)": z_input. Text = "": z_input.SetFocus: Exit Sub
If Not IsNumeric(Rb_input. Text) Then MsgBox "Введенное значение Rb не число!(дробные числа вводятся с запятой!)": Rb_input.Text = "": Rb_input.SetFocus: Exit Sub
'Получаем данные из форм
Rc = RC_input.Value
E = E_input.Value
z = z_input.Value
Rb = Rb_input.Value

Здесь важен один момент. После проверки введенного значения при помощи IsNume-ric ВСЕ функции необходимо писать в одну строчку, разделяя их двоеточием (:). Данным кодом мы не только проверяем на корректность введенные данные (ВСЕ данные, которые вводятся пользователем ВСЕГДА нужно проверять), но и выводим сообщение юзверю при помощи MsgBox (эта функция создает окошко с сообщением, переданным ей в качестве параметра). После чего обнуляем форму E_input. Text = "" и делаем активным окошко с ошибкой: RC_input. SetFocus. Вообще, чтобы посмотреть, какие функции можно использовать с данным объектом, достаточно после его имени поставить точку и выбрать нужное из меню. Если вы забыли, какие параметры и какого типа передаются в какую-либо функцию, поставьте после ее имени открывающую скобку и читайте:-). Но мы еще не закончили. А посему:

'Получаем данные из форм
Rc = RC_input.Value
E = E_input.Value
z = z_input.Value
Rb = Rb_input.Value
'Задаем начальные значения переменных
Pi = 3.14159265358979
a = -Pi / 360
m = E * (z + 1) / Rb
i = 0' Задаем начальное значение счетчика

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

' Цикл для расчета координат точек
Do While (a < Pi * 2 — Pi / 360)
a = a — (-Pi / 360)
temp1 = Sin(z * a)
temp2 = Cos(z * a)
g = Atn(temp1 / (temp2 — (-1 / m)))
Y = (Rb * Sin(a) — (-E * Sin((z + 1) * a)) — Rc * Sin(g + a)) / 1000
X = (Rb * Cos(a) — (-E * Cos((z + 1) * a)) — Rc * Cos(g + a)) / 1000
Xa(i) = X
Ya(i) = Y
' Увеличиваем счетчик
i = i + 1
Loop
Do While() …Loop задают цикл, в котором рассчитываем координаты точек и заносим их значения в массив. Шаг расчета точек — один градус. Теперь нам нужно сделать вот это:
'Строим сплайн — начальная подготовка
Set swApp = CreateObject ("SldWorks.Application")
Set Part = swApp.ActiveDoc
Part.SetPickMode
'"Замыкаем" координаты (для того чтобы получить замкнутую циклоиду)
Xa(i — 1) = Xa(0)
Ya(i — 1) = Ya(0)
i = i — 1
"Замыкание" необходимо потому, что точность расчетов ограничена, и начальные и конечные точки не совпадают точно. Ну вот почти и все. Остался последний штрих:
'Цикл построения сплайна
Do While (i > = 0)
'Собственно построение сплайна
Part.SketchSpline i, Xa(i), Ya(i), 0
i = i — 1'Уменьшаем счетчик
Loop
End Sub

Точки сплайна выбираются в обратной последовательности из-за особенностей функции его построения. Теперь, если вы попытаетесь запустить получившуюся программу и введете, например, такие тестовые значения: радиус цевки — 8, эксцентриситет — 3,5, число зубьев — 30, Rb — 143 (диаметр большого диска), у вас должно получиться что-то похожее на приведенную картинку. И напоследок расскажу, как из макроса можно выводить в данные файл. Это иногда очень полезно при большом количестве рассчитываемых данных. Итак, открытие файла:
Open "FileName.dat" For Append As #1
Эта конструкция открывает файл с именем FileName.dat под номером 1. Запись в файл:
Print #1, A ;"Запись в файл, открытый под номером один переменной A и этого текста"
Ну вот, пожалуй, и все. На примере данного макроса хотелось показать, как легко использовать эту очень удобную технологию, например, для автоматической генерации записки к курсовому проекту:-). Все зависит только от вашей фантазии. Но ничто так не ограничивает полет мысли программиста, как его компилятор. До встречи!

Спичеков Александр aka MentALzavR, Zavr6@mail.ru


Компьютерная газета. Статья была опубликована в номере 09 за 2004 год в рубрике программирование :: разное

©1997-2024 Компьютерная газета