double arrow

Отладка программы. Наиболее частые ошибки и их исправление

Математические функции AutoLISP. Работа со строками; функции преобразования; проверка типов данных. Логические функции AutoLISPa. Использование функций GET для ввода данных. Ввод данных в командную строку.

Математические функции AutoLisp. Аргументами математических функций являются числа, которые могут быть как целыми, так и вещественными. Если все аргументы - целые числа, то результат операции также будет целым числом, а любая дробная часть будет опущена. Если хотя бы один аргумент – вещественное число, то результат операции будет вещественным числом. При записи в программе математических формул удобно разбить большую формулу на несколько маленьких. Например, при записи уравнения для нахождения X можно выделить некоторый параметр Z = L2 + R12, а затем Z1 = Z – R2 и т.д. Это позволит записывать в программе функции с меньшим количеством вложенных функций, что сократит количество открытых и закрытых скобок в одной строке. К математическим функциям относятся:

(+ число1 число2...)

Возвращает сумму всех аргументов.

(- число1 число2...)

Вычитает число 2 из числа 1 и возвращает разность. Если задано более двух аргументов, то из первого аргумента вычитается сумма всех остальных. Если задан один аргумент, то он вычитается из нуля (меняет знак).

(* число1 число2...)

Возвращается произведение всех чисел.

(/ число1 число2...)

Делит число1 на число2 и возвращает частное. Если задано более двух аргументов, то первое число делится на произведение всех остальных.

(1+ число)

Увеличение целого или действительного числа на единицу.

(1- число)

Уменьшение целого или действительного числа на единицу.

(atan число1 [число2])

Если не задано число 2, то возвращает арктангенс переменной число1 в радианах, область допустимых значений – [pi, -pi] радиан. Если заданы оба числа, то возвращается арктангенс переменной число1/число2 в радианах.

(abs число)

Вычисление абсолютного значения действительного или целого числа.

(cos число)

Возвращает значение косинуса угла, заданного аргументом в радианах.

(exp степень)

Вычисляет значение экспоненциальной функции с основанием е и степенью, равной аргументу.

(expt основание степень)

Вычисляет значение экспоненциальной функции с указанным основанием и степенью.

(log число)

Возвращает натуральный логарифм аргумента.

(gcd число1 число2...)

Возвращает наибольший общий делитель указанных аргументов.

(min число1 число2...)

Возвращает наименьший аргумент. Не изменяет типов чисел.

(max число1 число2...)

Возвращает наибольший аргумент. Не изменяет типов чисел.

(sin число)

Возвращает значение синуса угла, заданного аргументом в радианах.

(sqrt число)

Извлекает квадратный корень из аргумента. Возвращаемый результат всегда вещественный.

Для ввода данных всех основных типов используется семейство сходных между собой функций GET…. Все аргументы функций этого семейства необязательны. В качестве первого аргумента иногда выступает необязательная двумерная точка в текущей пользовательской системе координат (ПСК). Все функции GET могут иметь в качестве аргумента произвольную строковую константу, в которой может содержаться текст запроса или какая-то подсказка, выводимая при запросе пользователю ввести какие-то данные. Все функции GET ожидают ответа пользователя, т.е. приостанавливают выполнение программы до тех пор, пока не будет осуществлен ввод (нажата клавиша ENTER). Ввод может быть осуществлен как с клавиатуры, так и при помощи устройства указания «мышь». При написании секции ввода данных необходимо представлять имеющиеся возможности и выбирать максимально понятный и схожий с интерфейсом AutoCAD способ указания. Желательно везде, где это допустимо, предоставлять возможность пользователю выбрать способ указания. Кроме того, следует стремиться к тому, чтобы подсказки были понятны человеку, который не знаком с программой. Для того чтобы каждая подсказка программы выводилась в командной строке AutoCAD на отдельной строке, необходимо перед текстом подсказки написать следующее сочетание символов - \n. Чтобы программа оставляла у пользователя приятное впечатление, хорошо так же начинать запрос с заглавной буквы и заканчивать его двоеточием и пробелом.

Наиболее часто используемые функции семейства GET:

(getangle точка «текст запроса-подсказки»)

Возвращает угол в радианах между задаваемым пользователем вектором и положительным направлением оси Х в текущей плоскости построений. Функция всегда возвращает угол в радианах вне зависимости от текущей установки переменных. Начальная точка вектора может быть определена первым аргументом функции. Вторую точку вектора можно указать на экране «мышью», при этом AutoCAD нарисует «резиновую» линию от точки, указанной первым аргументом, до текущего положения курсора. Если первый аргумент опущен, AutoCAD потребует ввода двух точек.

(getdist точка «текст запроса-подсказки»)

Возвращает действительное число, которое является расстоянием между двумя указанными на экране точками или введенное с клавиатуры. При любых текущих единицах измерения эта функция всегда возвращает действительное число. Начальная точка расстояния может быть определена первым аргументом функции. Вторую точку расстояния можно указать на экране «мышью», при этом AutoCAD нарисует «резиновую» линию от точки, указанной первым аргументом, до текущего положения курсора.

(getint «текст запроса-подсказки»)

Ввод целого числа. Ввод может быть осуществлен только с клавиатуры.

(getpoint точка «текст запроса-подсказки»)

Позволяет ввести точку. Если первый аргумент присутствует, AutoCAD рисует «резиновую» линию от точки, определяемой первым аргументом.

(getreal «текст запроса-подсказки»)

Позволяет вводить действительное число. Ввод может быть осуществлен только с клавиатуры.

Для того чтобы использовать далее команды отрисовки AutoCAD необходимо определить геометрическое положение точек, по которым будет производиться построение. Точка, так же как расстояние и угол, относится к геометрическому описанию объекта. При работе с геометрическим описанием объектов все используемые углы измеряются в радианах. В AutoLisp угол равный p записывается как pi. Соответственно углы равные различным частям p, например p/2 или 3p/4, записываются при помощи математических функций AutoLisp.

Функции для работы с геометрическим описанием объектов:

(osnap точка режим)

Возвращает точку, которая является результатом применения объектной привязки, задаваемой в строке режим для указанной точки. Режим – строковая константа, состоящая из одного или более идентификаторов объектной привязки, как, например, “MIDpoint”, “CENter” и т.д., разделенных запятыми.

(polar точка угол расстояние)

Возвращает точку в пользовательской системе координат, находящуюся под заданным углом и расстоянием от заданной точки, угол измеряется в радианах в направлении против часовой стрелки от оси Х.

(angle точка1 точка2)

Возвращает угол (в радианах) вектора, определяемого точками 1 и 2. Угол измеряется против часовой стрелки.

(distance точка1 точка2)

Эта функция возвращает расстояние между двумя точками.

Последним шагом является отрисовка. Отрисовка детали будет осуществляться при помощи команд AutoCAD. Для обращения к командам используется функция AutoLisp COMMAND. Формат данной функции следующий:

(command аргумент1 аргумент2...)

Аргументы данной функции представляют собой команды AutoCAD, их опции и ответы на подсказки команды; каждый аргумент вычисляется и посылается в AutoCAD как ответ на соответствующий запрос. Имена команд и опций представляются как строковые константы, двумерные и трехмерные точки – как списки из двух или трех действительных чисел соответственно.

На использование этой функции налагаются некоторые ограничения:

- функции семейства GET… не могут быть вложены в функцию COMMAND, поэтому следует присваивать все необходимые значения переменным заранее;

- с помощью функции COMMAND нельзя работать с такими командами AutoCAD, как DTEXT (ДТЕКСТ), SKETCH (ЭСКИЗ), PLOT (ПЕЧАТАЙ);

- нельзя использовать восклицательный знак для указания команде AutoCAD значения переменной.

Если в качестве аргумента команды указывается слово pause, то функция COMMAND приостановит свое действие, чтобы пользователь непосредственно ввел значение (или произвел отслеживание). В этот момент можно выполнить прозрачную команду (например, ZOOM (ПОКАЖИ), PAN (ПАН) и др.), после чего выполнение функции возобновиться.

Если в качестве ответа на подсказку команды AutoCAD необходимо нажать клавишу ENTER, то аргумент будет записан в виде двух кавычек, не разделенных пробелом: “”.

В AutoCAD любое обращение к команде прочитывается из меню и система "проигрывает" за пользователя нажатие соответствующих клавиш. Например, при обращении к команде PLINE, система "проигрывает" нажатие клавиш P, L, I, N, E и Enter, вызывая соответствующую команду. Поэтому перед тем как начать записывать функцию COMMAND, попробуйте воспроизвести все действия, которые необходимо осуществить при обращении к команде, работая только с клавиатурой. Фиксируйте на бумаге все нажимаемые клавиши, ничего не опуская "по умолчанию". Точки, необходимые для отрисовки можно указывать при помощи "мыши" на экране, но при этом на бумаге запишите имя точки, которое ей присвоено в секции определения точек отрисовки. Затем, глядя только на свои записи, попытайтесь воспроизвести последовательность еще раз. Только в том случае, если вы записали все правильно, переходите к следующему шагу - записи функции COMMAND в AutoLisp.

В качестве примера рассмотрим команду отрисовки многоугольника POLYGON. При выполнении данной команды в AutoCAD в командной строке произойдет следующий диалог:

Command: POLYGON

Polygon Number of sides: 3

Edge/<Center of polygon>: C (точка центра - указывается на экране)

Inscribed in circle/Circumscribed about circle (I/C): I

Radius of circle: Величина радиуса (в программе D1/2)

Обращаясь к данной команде в AutoLisp необходимо все ответы записать в качестве аргументов функции COMMAND. Все ответы, которые являются комбинацией букв, набранных с клавиатуры (название команды, обращение к опции команды и т.д.) записываются в кавычках. Если буква или сочетание букв или цифр являются параметром, который был определен (присвоен) в программе, то они записываются без кавычек. В результате получим следующую строчку:

(command "POLYGON" 3 C "I" (/ D1 2))

Если команда AutoCAD требует выбрать объекты, например, для редактирования, то удобнее использовать функцию SSGET. Данная функция позволяет выбрать объекты, используя различные методы AutoCAD: '(X Y) - выбрать объект, проходящий через точку с координатами X,Y; "L" - выбрать последний отрисованный объект; "W" '(X1 Y1) '(X2 Y2) - выбрать объекты окном, которое задано двумя точками; "C" '(X1 Y1) '(X2 Y2) - выбрать объекты секущим окном, которое задано двумя точками; "P" - выбрать предыдущий набор объектов; "A" - выбрать все объекты, имеющиеся на чертеже.

5.3 Написание программы на AutoLISPе: этапы создания программы; постановка задачи; выбор средств AutoCADа. Структура программы: секция ввода данных; секция вычисления промежуточных и вспомогательных параметров; секция отрисовки детали.

Любая программа на AutoLisp имеет три самостоятельных этапа:

- ввод технологических параметров пользователем;

- числовые и геометрические расчеты, в процессе которых определяются значения вспомогательных переменных;

- работа с графической базой данных чертежа либо напрямую (редактирование объектов), либо через систему команд AutoCAD (отрисовка и редактирование объектов).

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

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

- выделить технологические параметры (то, что должен задавать конструктор при работе с командой);

- определить технологию отрисовки (редактирования, работы с изображением) объекта;

- выделить геометрические и числовые параметры, нужные для реализации отрисовки объекта выбранным способом.

Технологические параметры детали перечислены в задании. Как лучше всего отрисовать данную деталь? Ясно, что способов отрисовки такой детали может быть несколько. Сразу бросаются в глаза, по крайней мере, два варианта. Можно отрисовать внешний контур детали отрезками и дугами, а можно единой полилинией. В нашем конкретном случае ясно, что отрисовка внешнего контура детали отрезками и дугами не является оптимальной. Во-первых, для этого потребуется больше вспомогательных точек, во-вторых, при этом мы не можем назначить толщину основной линии и, в-третьих, отрисованный объект не является одним примитивом (что неудобно при использовании многих команд редактирования). Кроме того, при отрисовке внешнего контура детали полилинией мы обращаемся всего лишь к одной команде AutoCAD, в то время как при отрисовке отрезками и дугами – к шести. В более сложных случаях выбор средств отрисовки часто бывает не так очевиден, однако при их выборе следует стремиться к следующему:

- количество вспомогательных точек и параметров должно быть минимальным (это облегчит расчеты);

- количество используемых команд AutoCAD должно быть минимально (это уменьшит вероятность ошибки и увеличит быстродействие программы);

- примитивы должны быть максимально «укрупненными» (т.е. там, где можно использовать полилинию, блок или сеть, следует использовать именно их: расчленить проще, чем объединить).

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

Рисунок.

Рисунок 6.3. Диалоговое окно Load Application.

Файл, который необходимо загрузить в AutoCAD, либо выбирается из списка, либо находится через клавишу File.... После того, как нужный файл найден и выделен, он загружается в чертеж при помощи клавиши Load. После успешной загрузки файла с программой в AutoCAD в командной строке должно появиться следующее сообщение:

Loading C:имя.lsp...,

где имя - имя файла, в котором содержится программа.

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

1. Отсутствие открывающей или закрывающей скобки - Malformed list.

2. Непарность кавычек - Malformed string.

Для внесения исправлений в программу необходимо открыть файл, содержащий данную программу (использовать программу Блокнот, см. раздел 1). Читаем программу, обращая особое внимание на открытые и закрытые скобки и кавычки. Количество открытых и закрытых скобок и кавычек должно совпадать между собой. При нахождении непарных скобок или кавычек, необходимо исправить ошибку. После этого необходимо сохранить программу. Войти в AutoCAD и загрузить исправленную программу в файл (см. начало данной главы).

При успешной загрузке файла с программой в AutoCAD в командной строке появиться следующее сообщение:

Loading C:имя.lsp...

После того как данное сообщение появилось в командной строке можно обратиться к новой команде, загруженной в чертеж AutoCAD. Для этого необходимо в командной строке набрать с клавиатуры имя команды, которое было написано в первой строке программы после С: и нажать клавишу ЕNTER. При этом в командной строке должен появиться первый запрос команды (в примере – это фраза “Введите центр детали C: “). Получив ответы на все запросы, программа начнет построение детали. Если в написанной программе нет ошибок, то после ответа на все ее запросы, на рабочем поле чертежа появится изображение детали.

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

error: null function

(n/ a 180)

(setq А1 (n/ a 180))

(C:PRO)

*Cancel*

В данном примере допущена ошибка в написании функции AutoLisp в математическом выражении, присвоенном параметру А1, который используется в команде с именем PRO. Слово *Cancel* говорит о том, что выполнение программы было прервано. Ошибка заключается в том, что в AutoLisp нет функции n/, а есть функция / - деление.

Рассмотрим наиболее часто встречающиеся ошибки.

1. Отсутствует или неправильно написана функция AutoLisp – Null function.

2. Аргумент не определен – Bad argument type.

3. Аргумент не соответствует функции - Function undefined for argument.

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

Ошибки исправляются следующим образом: если найдена первая ошибка, то необходимо исправить написание функции (или написать функцию); если найдена вторая ошибка, то необходимо определить аргумент перед тем, как он используется в выражении. Третья ошибка чаще всего встречается в том случае, если в программе используется для математических вычислений квадратный корень. Если это так, то необходимо снова обратиться к программе и задать новые параметры детали (выражение под корнем не должно быть отрицательным числом). Та же самая ошибка встречается и в случае, если тип аргумента не соответствует тому, с которым работает данная функция. Например, при обращении к команде AutoCAD POLYGON (МНОГОУГОЛЬНИК) количество сторон – целое число. Поэтому, для определения числа сторон надо использовать функцию GET… для ввода целого числа.

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



Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



Сейчас читают про: