Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лаба 1 / Лабораторная работа №1 разблок

.pdf
Скачиваний:
1
Добавлен:
27.11.2023
Размер:
263.52 Кб
Скачать

|

(while (<= pdist (- plength trad))

|

(drow pdist off)

|

(setq pdist (+ pdist (* (+ tspac trad trad) (sin (dtr

60)))))

|

(if (= off 0.0)

|

(setq off (* (+ tspac trad trad) (cos (dtr 60))))

|

(setq off 0.0)

|

)

|

)

|

)

Функция DROW рисует ряд плиток на расстоянии друг от друга вдоль дорожки, задаваемым первым аргументом функции, и сдвигает этот ряд перпендикулярно дорожке на расстояние, задаваемое вторым аргументом функции. Мы будем сдвигать плитки, чередуя их ряды, для более плотного заполнения дорожки плитками.

Функция DROW определяет место расположения в ряду первой плитки,

используя функцию POLAR для отступа от края дорожки на расстояние,

которое задается первым аргументом; затем функция POLAR используется снова, находя расстояние, перпендикулярное дорожке, для последующей сдвижки рядов. С помощью функции WHILE продолжается отрисовка окружностей, пока не будет достигнута граница дорожки. Функция SETQ,

которой завершается WHILE-цикл, вычисляет место расположения следующей плитки, сдвигая ее на расстояние, равное двум радиусам плитки плюс пространство между плитками.

После этого, с помощью второго WHILE-цикла, рисуется ряд плиток в другом направлении, пока не будет достигнута следующая граница дорожки.

Функция DRAWTILES многократно вызывает функцию DROW, для отрисовки всех рядов плиток. Здесь WHILE-цикл "шагает" по дорожке,

обращаясь к функции DROW для отрисовки каждого ряда. Смежные плитки расположены в виде правильного треугольника, как показано на рисунке.

Сторона треугольника равна двум радиусам плитки плюс расстояние между ними. Таким образом, как следует из тригонометрии, расстояние вдоль дорожки между рядами равно синусу 60 градусов, умноженному на эту

величину, а смещение нечетных рядов - косинусу 60 градусов, умноженному на нее.

Обратите внимание на то, как используется функция IF в функции

DRAWTILES для смещения каждого следующего ряда. Функция IF тестирует свой первый аргумент и, если значением его является "истина" - выполняет второй аргумент, иначе - выполняет третий аргумент. Таким образом, если значение переменной OFF равно нулю, мы присваиваем ей значение, равное произведению расстояния между центрами плиток на косинус 60 градусов.

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

Для проверки работы функции, запишите обновленный файл GP.LSP на диск, войдите в AutoCAD, начните новый рисунок и загрузите LISP-файл так же, как Вы делали это раньше. Введите:

Command: (gpuser)

и сообщите информацию о дорожке, как прежде. Введите:

Command: (drawout)

и появится контур дорожки. Hаконец, введите:

Command: (drawtiles)

и контур заполниться плитками.

5. Добавление новой команды в AutoCAD

Теперь из созданных пользовательских функций можно собрать команду AutoCADа. Если мы определим функцию в AutoLISPе под именем

C:XXXX, то набрав XXXX, мы вызываем эту функцию. Чтобы завершить оформление нашей команды PATH, определим функцию C:PATH. Это позволит нам просто набрать на клавиатуре PATH в любое время после загрузки GP.LSP, чтобы выполнить команду, рисующую парковую дорожку.

Вызовите Ваш текстовый редактор и добавьте строки в программу:

; Convert angle in degrees to radians

(defun dtr (a)

(* pi (/ a 180.0))

)

; Acquire information for garden path

(defun gpuser ()

(setq sp (getpoint "\nStart point of path: ")) (setq ep (getpoint "\nEnd point of path: "))

(setq hwidth (getdist "\nHalf width of path: " sp)) (setq trad (getdist "\nRadius of tiles: " sp))

(setq tspac (getdist "\nSpacing between tiles: " sp))

(setq pangle (angle sp ep))

 

(setq plength (distance sp ep))

 

(setq width (* 2 hwidth))

 

(setq angp90 (+ pangle (dtr 90)))

;Path angle + 90 deg

(setq angm90 (- pangle (dtr 90)))

;Path angle - 90 deg

)

; Draw outline of path

(defun drawout () (command "pline"

(setq p (polar sp angm90 hwidth)) (setq p (polar p pangle plength)) (setq p (polar p angp90 width)) (polar p (+ pangle (dtr 180)) plength) "close"

)

)

;Place one row of tiles given distance along path

;and possibly offset it

(defun drow (pd offset)

(setq pfirst (polar sp pangle pd))

(setq pctile (polar pfirst angp90 offset)) (setq p1tile pctile)

(while (< (distance pfirst p1tile) (- hwidth trad)) (command "circle" p1tile trad)

(setq p1tile (polar p1tile angp90 (+ tspac trad trad)))

)

(setq p1tile (polar pctile angm90 (+ tspac trad trad))) (while (< (distance pfirst p1tile) (- hwidth trad))

(command "circle" p1tile trad)

(setq p1tile (polar p1tile angm90 (+ tspac trad trad)))

)

)

; Draw the rows of tiles (defun drawtiles ()

(setq pdist (+ trad tspac)) (setq off 0.0)

(while (<= pdist (- plength trad)) (drow pdist off)

 

(setq pdist (+ pdist (* (+ tspac trad trad) (sin (dtr60)))))

 

(if (= off 0.0)

 

(setq off (* (+ tspac trad trad) (cos (dtr 60))))

 

(setq off 0.0)

 

)

 

)

 

)

|

; Execute command, calling constituent functions

|

 

|

(defun C:PATH ()

|

(gpuser)

|

(drawout)

|

(drawtiles)

|

)

Добавив функцию с именем C:PATH, мы тем самым добавили команду PATH в AutoCAD. Можете попробовать команду, введя:

Command: PATH Start point of path: 2,2 End point of path: 9,8 Half width of path: 2 Radius of tiles: .2

Spacing between tiles: .1

/Kоманда: PATH

Hачальная точка дорожки: 2,2

Kонечная точка дорожки: 9,8 Полуширина дорожки: 2 Радиус плитки: .2 Расстояние между плитками: .1/

В результате будет нарисована парковая дорожка.

Задание: нарисовать дорожку с плитками, используя приведенный выше

листинг.

Содержание отчета

1.Постановка задачи.

2.Описание функций, используемых в программе.

3.Описание хода решения (с пояснениями и примерами).

4.Листинг программы.

5.Выводы и результаты (привести пример построенной дорожки).

Контрольные вопросы

1.Для чего необходимо использовать пользовательские функции?

2.В чем заключается отличие функций polar и angle?

3.Как создать команду AutoCADа?

4.Какая функция позволяет ввести координаты точки?

5.Какой примитив используется для построения дорожки?

6.Какие данные вводятся с помощью функции getdist?

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

8.Для чего используется функция command?

9.В чем заключается особенность работы с арифметическими

функциями на языке AutoLisp?

10.Какая функция языка AutoLisp используется для присваивания

данных?

Соседние файлы в папке Лаба 1