Логотип сайта поддержки пользователей САПРО сайте поддержки пользователей САПР Translate to:

Сравнение Autolisp с VBA

Используйте AutoLISP как путь к VBA.

Если Вы уже знаете AutoLISP и хотите изучит VBA, ассоциируйте VBA с выражениями AutoLISP. Это - не курс AutoLISP или VBA, а сравнение двух языков. Из-за большего количества доступного AutoLISP-кода, проще транслировать существующий блок AutoLISP в VBA , чем повторно изобретать это. Также проще сравнить два кода, если имена переменных остаются те же самые.

Отправные точки

В AutoLISP, Вы используете функцию (setq), чтобы определить точку. Следующая строка назначает переменный PT1 переменный значение расположения точки 0,0,0, что относится к x -, y -, и z-координатам расположения точки:

(setq PT1 '(0 0 0))
В VBA это действие требует еще нескольких строк кода:
Dim PT1(0 To 2) As Double
PT1(0) = 0#
PT1(1) = 0#
PT1(2) = 0#

Вы используете декларацию Dim, чтобы объявить переменные в VBA. Точки всегда сохраняются в массиве из тремя элементами типа doubles. Массив не ничто больше чем список переменных. Переменные в массиве все имеют те же самые имена. Первая переменная в массиве использует индексное значение 0, таким образом это переменная PT1(0). Вторая переменная в массиве - PT1(1), и так далее. VBA использует символ # как указатель на тип данных double. В этом массиве, PT1(0) сохраняет значение для x-координаты, PT1(1) - значение для y-координаты, и PT1(2) - значение для z-координаты.

Теперь, когда Вы знаете, как хранить точку, мы можем писать макрокоманду VBA, чтобы провести линию между двумя точками. Сначала я буду показывать Вам, на что макрокоманда походит в AutoLISP, затем в VBA. Посмотрите код в Line1 (рис. 1).

В AutoLISP, Вы используете (defun), чтобы определить функцию, названную Line1, C: перед именем функции означает что пользователи могут выполнять эту функцию из приглашения ко вводу команды AutoCAD. Далее назначим две точки, а затем используем команду AutoCAD Line, чтобы начертить линию между двумя точками.

В VBA, процедура подпрограммы создает ту же самую функцию как выше. Загрузите VBA IDE (интегрированную среду разработки) и наберите код VBA как показано в Line1 (рис. 1).

Если Вам необходима помощь, чтобы загрузить VBA IDE, обратитесь к рис. 2. Чтобы запустить ваш макрос, обратитесь к рис. 3.

Первая строка в подпрограмме объявляет переменную NewLine как объект, который является элементом приложения. Примеры объектов - линии, просмотры, и уровни.

Затем, объявим две точки с помощью точечные массивов. В заключение, AutoCAD проводит линию от (0,0,0) до (4,4,0). Чтобы добавить линию в пространство модели, мы используем коллекцию объектов ModelSpace с методом AddLine а также начальную и конечную точки линии.

Коллекция объектов - это набор средств, на которые Вы можете ссылаться как на группу. Коллекции ModelSpace и PaperSpace содержат все графические объекты, найденные в чертеже. Они также содержат все неграфические объекты, которые являются частью чертежа, такие как уровни, linetypes, dimstyles, и наборы выбора.

Указание точек

В AutoLISP, Вы должны предупреждать пользователя, чтобы он выбрал точку, как показано в следующем примере в Line2. Вы можете выполнить это в VBA, используя метод GetPoint объекта Utility, с объявлением дополнительной переменной VarRet.

Метод выполняет действие на объект. Каждый графический объект имеет методы, которые позволяют приложению выполнять большинство команд редактирования в AutoCAD.

Объект Utility обеспечивает пользовательский ввод и конверсию функций. Переключитесь в VBA IDE и добавте код VBA в Line2 (рис. 4).

В это время, метод GetPoint возвращает тип данных Variant, который сохраняет данные любого типа. Чтобы использовать начальную и конечную точки, которые Вы выбрали и сохранили в переменной VarRet, Вы должны преобразовать данные из Variant в массив doubles, назначенный PT1 и PT2. Теперь, переключитесь в AutoCAD и запустите функцию LINE2.

Больше точек

Большинство программ требует больше чем две точки, чтобы создавать объекты внутри AutoCAD. В AutoLISP используют функцию (polar) в Rect (рис. 5). Переключитесь в VBA IDE и введите код VBA.

Метод AddLightWeightPolyline требует массив x- и y-координаты для каждой точки полилинии. Используйте метод GetDistance объекта Utility, чтобы найти ширину и высоту прямоугольника. Код передает эти значения методу PolarPoint чтобы найти требуемые три точки.

Метод PolarPoint в VBA подобен функции (polar) в AutoLISP. Он запрашивает точку, угол, и расстояние. Углы - в радианах и могут быть постоянным значением или переменной.

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

Рисунок 1
AutoLISP code
(defun C:LINE1 ()
(setq PT1 '(0 0 0))
(setq PT2 '(4 4 0))
(command "._line" PT1 PT2 "")
)


VBA code
Sub Line1()

Dim NewLine As Object
Dim PT1(0 To 2) As Double
Dim PT2(0 To 2) As Double
PT1(0) = 0#
PT1(1) = 0#
PT1(2) = 0#
PT2(0) = 4#
PT2(1) = 4#
PT2(2) = 0#
Set NewLine = ModelSpace.AddLine(PT1, PT2)

End Sub

Рисунок 2


Следуйте этоим шагам, чтобы получить доступ к возможностям VBA в AutoCAD:

Рисунок 3


Чтобы запустить ваши VBA-макросы:

Рисунок 4
AutoLISP code
(defun C:LINE2 ()
(setq PT1 (getpoint "\nStart Point: "))
(setq PT2 (getpoint PT1 "\nEnd Point: "))
(command "._line" PT1 PT2 "")
)



VBA code
Sub Line2()

Dim VarRet As Variant
Dim NewLine As Object
Dim PT1(0 To 2) As Double
Dim PT2(0 To 2) As Double
VarRet = Utility.GetPoint(, "Start Point: ")
PT1(0) = VarRet(0)
PT1(1) = VarRet(1)
PT1(2) = VarRet(2)
VarRet = Utility.GetPoint(PT1, "End Point: ")
PT2(0) = VarRet(0)
PT2(1) = VarRet(1)
PT2(2) = VarRet(2)
Set NewLine = ModelSpace.AddLine(PT1, PT2)

End Sub
Рисунок 5
AutoLISP code
;Draw a rectangle using (polar) function
(defun C:RECT ()
(setq PT1 (getpoint "\nStart Point Lower Left: "))
(setq WTH (getdist "\nWidth: "))
(setq HGT (getdist "\nHeight: "))
(setq PT2 (polar PT1 0.0 WTH))
(setq PT3 (polar PT2 (* pi 0.5) HGT))
(setq PT4 (polar PT1 (* pi 0.5) HGT))
(command "._pline" PT1 PT2 PT3 PT4 "c")
)



VBA code
'Draw a rectangle using PolarPoint
Sub Rect()

Dim VarRet As Variant
Dim PTS(0 To 7) As Double
Dim WTH As Double
Dim HGT As Double
Dim PLINE As Object

VarRet = Utility.GetPoint(, "Start Point Lower Left:")
PTS(0) = VarRet(0)
PTS(1) = VarRet(1)

WTH = Utility.GetDistance(, "Width: ")
HGT = Utility.GetDistance(, "Height: ")

VarRet = Utility.PolarPoint(VarRet, 0, WTH)
PTS(2) = VarRet(0)
PTS(3) = VarRet(1)
VarRet = Utility.PolarPoint(VarRet, 1.5708, HGT)
PTS(4) = VarRet(0)
PTS(5) = VarRet(1)
VarRet = Utility.PolarPoint(VarRet, 3.14159, WTH)
PTS(6) = VarRet(0)
PTS(7) = VarRet(1)
Set pline = ModelSpace.AddLightWeightPolyline(PTS)
pline.Closed = True ' Close Polyline

End Sub

Файловый ввод-вывод.

Много программ требуют читать и записывать данные в файлы. AutoLISP и VBA обеспечивают некоторые общие функции работы с файлами и выражения, обеспечивающие ввод-вывод в дисковую систему.

Текстовые процессоры, электронные таблицы, и программы баз данных создают ряд типов файлов. Однако, AutoLISP может обрабатывать только текстовый файл ASCII, которые могут генерировать много программ. Вы можете открывать файлы большинства программ Windows с помощью VBA. С целью сравнения, этот раздел будет рассматривать только файловый Ввод - вывод для текстовых файлов ASCII.

Открытие файлов

Обработка файлов относительно проста. Прежде, чем Вы можете записывать файл на диск или читать его, Вы должны открыть файл. После открытия, Вы можете читать и записывать данные одновременно посимвольно или построчно. Это истинно и для AUTOLISP и для VBA программам.

Чтобы открыть файл в AutoLISP, используйте выражение: (setq #1 (open "c:/temp/test.txt" "w")). AutoLISP возвращает файловую метку или указатель который сохраняется в переменной #1.

Поскольку Вы можете записывать и читать файл, Вы должны точно определить, какой режим доступа вам необходим во время открытия файла. Режим - один символ нижнего регистра, как показано в таблице 1 ниже.

Чтобы открыть файл в VBA, используйте: Open "c:\temp\test.txt" For Output as #1. В VBA Вы должны указать режим открытия, как показанно в таблице 2 ниже. VBA режимы подобны режимам AutoLISP в таблице 1. Номер файла #1 есть номер от 1 до 255 и ассоциируется с открытым файлом с этим номером. Предшествующий знак (#) является произвольным. На обоих языках имя файла c:\temp\test.txt должно быть строковая величина или переменная, которая содержит имя файла. Однако, в AutoLISP Вы должны использовать косую черту (/) или две наклонных черты влево (\\), чтобы показать путь к файлу внутри строки имени файла.

Закрытие файлов

Оба языка используют оператор Close, чтобы освободить файл для других приложений и возвращать номер файла или переменную обратно вашему приложению в случае, если Вы хотите использовать их в последующем в операторе Open.

Каждая программа, которая открывает файл, должна его и закрыть. В AutoLISP Вы используете выражение: (close #1). Вы закрываете каждый файл точно определяя переменную, используемую для открытия файла в выражении (setq).

Оператор Close в VBA имеет один из двух форматов: Close #1 или Close #1, #2, #3, и Close. Первый формат закрывает один или большее файлов по их номерам открытия. Close закрывает все файлы, которые Вы открыли. Убедитесь, что закрыли все открытые файлы перед перед выходом из программы или когда вы - не нуждаетесь в доступе к этим файлам.

Запись в файл

Когда Вы записываете в файл, AutoLISP обеспечивает функцию (write-line) , чтобы записать данные в файл или на экран и добавляет в конце строки: (write-line "THIS IS THE FIRST LINE" #1).

В VBA, оператор write# допускает Вам записывать данные в любом формате в любой файл на диске, открытый в режиме Output или Append. Write# записывает строки, числа, постоянные, и переменные в любой и всех комбинациях в дисковый файл и добавляет Enter> в конце строки: Write #1, "THIS IS THE FIRST LINE".

Распечатка 1 показывает AutoLISP и VBA код для записи двух строк в файл test.txt . Создайте файл в C:\TEMP или используйте существующий подкаталог на вашем компьютере.

Первая строка - строка, записанная непосредственно в файл функцией (write-line) или оператлором Write# . Вторая строка назначена переменной LINE2, затем записана в файл, используя имя переменной внутри операторов (write-line) и Write# .

Распечатка 2 показывает код AutoLISP и VBA, добавляющий данные в конец файла данных.

Чтение файлов данных

Другие языки программирования дают Вам возможность произвольного доступа - они позволяют Вам перемещаются в определенные локализации внутри файла. Функция AutoLISP (read-line) читает файлы только последовательно cверху вниз.

В AutoLISP чтобы читать из файла, необходимо открыть файл в режиме "r" и извлечь данные функцией (read-line). AutoLISP автоматически переходит на следующую строку с каждым вызовом (read-line). Когда достигается конец файла, AutoLISP возвращает nil. Распечатка 3 показывает пример кода, который устанавливает переменную для каждой из четырех строк в файле test.txt.

Вы можете вызвать ошибку, когда попытаетесь читать большее количество данных из файла чем файл содержит. Распечатка 3 показывает что файл test.txt имеет четыре строки, и это правильно. Для других файлов данных, число строк или записей различно.

Функция (eof) на обоих языках - встроенная функция конца файла, которая определяет, когда (read-line) или Input достигают конца файла. (eof) возвращает True, когда достигнут конец файла и False, когда файл еще имеет данные для чтения. Большинство вводимых данных программирует в цикле, пока (eof) не true.

Распечатка 4 показывает пример этого цикла для каждого языка. В примере для AutoLISP, функция (while) продолжается в цикле и отображать каждую линию в окне предупреждения до конца. В VBA, цикл Do Until показывает каждую строку в окне сообщения, пока не достигает конца файла .

Таблица 1. Режимы доступа к файлам в AutoLISP
Mode Description
r Open for reading existing files only.
w Open for writing; creates a new file.
a Open for appending data to an existing file or creates a new one.
Таблица 2. Режимы VBA для Open
Mode Description
Input Open for reading only existing files.
Output Open for writing; creates a new file.
Append Open for appending data to an existing file or creates a new one.
Распечатка 1. Запись строк в файл.
AutoLISP code
(defun C:WRITETXT ()
(setq #1 (open "c:/temp/test.txt" "w"))
(write-line "THIS IS THE FIRST LINE" #1)
(setq LINE2 "THIS IS LINE 2")
(write-line LINE2 #1)
(close #1)
(alert "2 Lines Added")
)
Sub WriteTxt ()

VBA code
Sub WriteTxt ()
Dim LINE2 As String
Open "c:\temp\test.txt" For Output As #1
Write #1, "THIS IS THE FIRST LINE"
LINE2 = "THIS IS LINE 2"
Write #1, LINE2
Close #1
MsgBox "2 Lines Added"
End Sub
Распечатка 2. Добавление строк в файл.
AutoLISP code
(defun C:ADDTXT ()
(setq #1 (open "c:/temp/test.txt" "a"))
(write-line "THIS IS LINE 3" #1)
(setq LINE4 "THIS IS LINE 4")
(write-line LINE4 #1)
(close #1)
(alert "2 More Lines Added")
)


VBA code
Sub AddTxt ()
Dim LINE4 As String
Open "c:\temp\test.txt" For Append As #1
Write #1, "THIS IS LINE 3"
LINE4 = "THIS IS LINE 4"
Write #1, LINE4
Close #1
MsgBox "2 More Lines Added"
End Sub
Распечатка 3. Чтение данных из файла.
AutoLISP code
(defun C:READTXT ()
(setq #1 (open "c:/temp/test.txt" "r"))
(setq LINE1 (read-line #1)) (alert LINE1)
(setq LINE2 (read-line #1)) (alert LINE2)
(setq LINE3 (read-line #1)) (alert LINE3)
(setq LINE4 (read-line #1)) (alert LINE4)
(close #1)
)

VBA code
Sub ReadTxt ()
Dim LINE1 As String
Dim LINE2 As String
Dim LINE3 As String
Dim LINE4 As String
Open "c:\temp\test.txt" For Input As #1
Input #1, LINE1
MsgBox LINE1
Input #1, LINE2
MsgBox LINE2
Input #1, LINE3
MsgBox LINE3
Input #1, LINE4
MsgBox LINE4
Close #1
End Sub
Распечатка 4. Чтение всего файла.
AutoLISP code
(defun C:LOOPTXT ()
(setq #1 (open "c:/temp/test.txt" "r"))
(while (not EOF)
(setq LINE1 (read-line #1))
(if LINE1 (alert LINE1))
)
(close #1)
)


VBA code
Sub LoopTxt ()
Dim LINE1 As String
Open "c:\temp\test.txt" For Input As #1
Do Until (Eof(1) = True)
Input #1, LINE1
MsgBox LINE1
Loop
Close #1
End Sub



Copyright © Сайт поддержки пользователей САПР by Victor Tkachenko