На главную

Исходники

Программы

Сстатьи

Ссылки




VBA от простого к сложному или начинаем крутиться

              Используя пример поворота объектов в чертеже, мы познакомимся с некоторыми методами работы в VBA AutoCAD. Сразу хочу отметить, что изложенная далее информация не догма, а лишь один из множества способов. Все замечания и пожелания вы можете присылать мне на vbamaker@yandex.ru

Шаг первый

            Добавим в чертеж с помощью VBA линию (отрезок) и повернем ее на определенный угол, например
45 градусов. Как это сделать? Очень просто:

Option Explicit
Sub LineRotate()
    Dim lineObj As AcadLine
    Dim Pt1(0 To 2) As Double
    Dim Pt2(0 To 2) As Double
    Dim BasePt(0 To 2) As Double
    Dim RotAngle As Double
'Указываем начальную и конечную точку
Pt1(0) = 1: Pt1(1) = 1: Pt1(2) = 0
Pt2(0) = 5: Pt2(1) = 1: Pt2(2) = 0
   'Добавляем линию в пространство модели
   Set lineObj = ThisDrawing.ModelSpace.AddLine(Pt1, Pt2)
       'Указываем базовую точку
       BasePt(0) = 1: BasePt(1) = 1: BasePt(2) = 0
           'Указываем угол поворота
            RotAngle = 0.7853981
           'Здесь угол задан в радианах, что бы перевести в градусы
           'Нужно воспользоваться формулой: Градусы = радианы/180*Pi
'Поворачиваем линию

lineObj.Rotate BasePt, RotAngle
   'Обновляем объект
   lineObj.Update
End Sub

           Как видно не чего сложного. Единственное, немного поясню, для тех, кто не знает или забыл:
Option Explicit-оператор, который требует, чтобы все переменные в данном модуле должны быть предварительно объявлены.
Double –число с плавающей точкой двойной точности (от 4,940 656 458 412 47е-324 до 1,797 693 134 862 32е308)

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

Шаг второй

            Для, того чтобы выбирать объекты в чертеже, мы будем использовать наборы выбора(AcadSelectionSet) методом указания на экране объекта(SelectOnScreen).
            Указывать базовую точку – методом GetPoint (возвращает значение типа Variant, содержащее трехмерный массив). Пользователь может указать точку или задать ее координаты.
            Для ввода угла поворота применим метод GetInteger (Integer – целые числа в диапазоне от -32768 до +32767).Пользователю выдается приглашение ввести число. Смотрим код:

Option Explicit
Sub ObjRotate()
    Dim Obj As AcadEntity
    Dim BasePt As Variant
    Dim SelSet As AcadSelectionSet
    Dim GradAngle As Integer
    Dim RotAngle As Integer
On Error GoTo Control
    'Создаем новый набор выбора, например с именем "Set"
    Set SelSet = ThisDrawing.SelectionSets.Add("Set")
        'Запрос на выбор примитивов
        SelSet.SelectOnScreen
'Если не чего не выбрано, переходим к "Control"
If SelSet.Count = 0 Then GoTo Control
    'Указываем базовую точку
    BasePt = ThisDrawing.Utility.GetPoint(, "Укажите базовую точку: ")
        'Вводим угол поворота(в градусах)
        GradAngle = ThisDrawing.Utility.GetInteger("Введите угол поворота:")
            'Переводим градусы в радианы
            RotAngle = GradAngle / 180 * 3.141592653
For Each Obj In SelSet
    'Выполняем поворот объекта
    Obj.Rotate BasePt, RotAngle
        'Обновляем объект
        Obj.Update
Next Obj
    Control:
    SelSet.Delete 'Удаляем набор выбора
End Sub

            Некоторые пояснения:
AcadEntity-объект AutoCAD
Variant - Переменная, которая может содержать данные любого типа. Если, есть возможность, рекомендуется воздерживаться от применения этого типа и объявлять тип явно(например:Integer, Double и т.д.), так как программе требуется больше времени на считывание данных.
On Error GoTo Control- один из операторов, с помощью которого можно контролировать работу программы при возникновении ошибок. Если обнаружена ошибка, то происходит переход к метке“Control:” В нашем случае это удаление набора выбора и выход.
If SelSet.Count = 0 Then GoTo Control- условный оператор. Если выражение истинно, то Оператор выполнится, если ложно, то нет. Здесь SelSet.Count - количество объектов в наборе.
For Each Obj In SelSet - форма цикла предназначенная для выполнения какой-либо операции с каждым объектом, входящим в состав некоторой коллекции объектов:
            For Each ИмяОбъекта In ИмяКоллекции
            Операции над объектами
            Next ИмяОбъекта

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

Шаг третий

              Допустим, нам нужно, чтобы на экране появлялось диалоговое окно, в котором можно было бы ввести угол поворота.
            Для начала вставим форму. В окне свойств(Properties Window) формы, значение в поле Name изменим на “Form1”. Значение в поле Caption изменим, например, на “Поворот объекта“
            Добавим на форму несколько элементов:

Label(Надпись), который используется для отображения текста. В свойствах изменим значение Caption на “Угол:” Кстати, так же в свойствах можно изменить цвет и размеры элемента, выравнивание, шрифт и т.д.

TextBox(Текстовое поле)- служит для ввода или вывода информации, которая используется в программе. Изменим свойство Name на “Text1”.
(Если нужно запретить изменение содержимого текстового поля, когда форма появляется на экране в свойствах значение Locked надо поставить на True.Если нужно, чтобы в текстовом поле при появлении формы постоянно находилось какое-либо значение, в свойствах в поле Value надо указать это значение. Если нужно ограничить количество введенных символов, то его можно указать в свойстве MaxLength.)

SpinButton(Счетчик)-дает возможность пользователю указывать числовое значение. Он используется вместе с элементом TextBox. В его свойствах задаются:
Max - определяет максимальное значение элемента SpinButton
Min - минимальное значение
Value - текущее значение
Пусть у нас будет задано:Max=360,Min= -360,Value=0

CommandButton(командная кнопка) - используется для выполнения какого-либо действия, например, запуск какой-то опперации. В нашем примере мы будем использовать два этих элемента:
    Первый для запуска. В свойствах, в поле Name зададим ему имя cmdApply,в поле Caption – “OK”.
    Второй для выхода. Name-“cmdCancel”, Caption – “Cancel”.
Короче, говоря, должно получиться что-то похожее как на рисунке.

Form VBA

            Идем дальше. Дважды щелкнем(кликнем) на кнопке”OK”(элемент cmdApply) и добавим в процедуру “Private Sub cmdApply_Click()”знакомый нам, но немного измененный код:

Option Explicit
    Private Sub cmdApply_Click()
    Dim GradAngle As Integer
    Dim RotAngle As Integer
    Dim Obj As AcadEntity
    Dim BasePt As Variant
    Dim SelSet As AcadSelectionSet
'Присваиваем переменной "GradAngle" значение
'текстового поля "Text1"

GradAngle = Val(Text1.Text)
    'Если введен "0" (или пустая строка) будет выводиться сообщение
    If GradAngle = 0 Then
        MsgBox "Введите угол поворота!"
    Exit Sub
End If
Unload Me 'Закрываем окно
On Error GoTo Control
    'Создаем новый набор выбора, например с именем "Set"
    Set SelSet = ThisDrawing.SelectionSets.Add("Set")
            'Запрос на выбор примитивов
            SelSet.SelectOnScreen
'Если не чего не выбрано, переходим к "Control"
If SelSet.Count = 0 Then GoTo Control
    'Указываем базовую точку
    BasePt = ThisDrawing.Utility.GetPoint(, "Укажите базовую точку: ")
        RotAngle = GradAngle / 180 * 3.141592653
For Each Obj In SelSet
    'Выполняем поворот объекта
    Obj.Rotate BasePt, RotAngle
    'Обновляем объект
        Obj.Update
Next Obj
    Control:
    SelSet.Delete 'Удаляем набор выбора
End Sub

            Рассмотрим код:
GradAngle = Val(Text1.Text)-Присваиваем переменной "GradAngle" значение текстового поля "Text1".
По идее можно было бы написать проще GradAngle = Text1.Text, но если при такой записи ввести в текстовое поле буквы или вообще ничего не вводить появиться сообщение об ошибке в типах. Дело в том, что переменная GradAngle у нас объявлена как Integer(число), а мы пытаемся ей присвоить текстовое значение String(строка). Функция Val решает эту проблему – преобразует строку в число. Теперь, если ввести буквы или нечего не вводить, функция Val превратит строку в число - в ноль.
                Все это, конечно, интересно скажите Вы, но зачем нам поворачивать объект на “0” градусов. Поэтому, если переменная “GradAngle”=0, пусть выводится предупреждение. Сделаем это с помощью функции MsgBox,осуществляющей вывод информации на экран, и еще одной разновидностью условного оператора:
        If Логическое_выражение Then
            Здесь оператор или Группа_операторов
                Exit Sub
        End If
Unload Me –оператор, выгружающий форму из памяти и удаления ее с экрана.

            С элементом TextBox думаю все понятно, теперь заставим работать элемент SpinButton. Дважды щелкнем(кликнем) на нем и добавим в процедуру “Private Sub SpinButton1_Change()” следующее:

Private Sub SpinButton1_Change()
    Text1.Text = SpinButton1.Value
    'Значение TextBox = Значению SpinButton
End Sub

            Рассмотрим кнопку Cancel. Снова дважды щелкнем(кликнем), на кнопке“Cancel”(элемент cmdCancel),чтобы добавим в процедуру”Private Sub cmdCancel_Click()” следующий код:

Private Sub cmdCancel_Click()
  Unload Me 'Закрываем окно(см.выше)
End Sub

            Теперь осталось добавить в проект модуль, для вызова формы. И вставить в него такой код:

Sub Rotate()
    Form1.Show
End Sub

Здесь “Form1”-имя нашей формы.
Show-метод, загружающий и показывающий форму на экране.

        На этом пока все. Надеюсь, что данный материал будет Вам полезен.
                Успехов Вам.
                        С уважением VBAmaker!




На Главную


Hosted by uCoz