Работа с графическими объектами AutoCAD с использованием языка AutoLISP. Учебно-методическое пособие
.pdfЛабораторная работа №7 Работа со списками
Создание плоской параметрической модели конструкции
Задание: Рисование плоской ферм c использованием списков. Вариант задания берем из лабораторной работы № 5.
Функция рисования отрезка |
* |
||
(defun us_line (pt1 pt2) |
|
||
(command "_LINE" pt1 pt2 "") |
|
||
) |
|
|
|
(setq pt1 |
(getpoint "\nТочка вставки: ") |
||
x1 |
(car |
pt1) |
|
y1 |
(cadr pt1) |
|
|
l |
(getdist pt1 "\nПролёт:") |
|
|
h |
(getdist pt1 "\nВысота:") |
|
|
np |
(getint "\nЧисло паннелей: ") |
|
|
dx |
(/ l |
np) |
|
y_up |
(+ y1 h) |
|
|
x_cur |
x1 |
|
|
list_up |
nil |
|
|
list_low |
nil |
|
|
) |
|
|
|
(command "_OSNAP" "_NON") |
|
||
; пояса |
|
|
|
(REPEAT (+ np 1) |
|
||
(setq list_low |
(cons (list x_cur y1) list_low) |
||
list_up (cons (list x_cur y_up) list_up) |
|
||
x_cur |
(+ x_cur dx) |
|
|
) |
|
|
|
) |
|
|
|
(foreach list_i (list list_low list_up) |
|
||
(apply 'command (cons "_PLINE" list_i)) |
(command "") |
||
) |
|
|
|
|
|
51 |
|
; Стойки |
|
|
(mapcar 'us_line |
list_up |
list_low ) |
; Раскосы |
|
|
(mapcar 'us_line |
(cdr list_up) list_low ) |
|
(mapcar 'us_line |
list_up |
(cdr list_low) ) |
(princ) |
|
Построение |
простой фермы с использованием |
функций работы со списками Функция рисования отрезка
(defun us_line (pt1 pt2) (if (>= IND_LINE 0)
(command "_LINE" pt1 pt2 "")
)
(setq IND_LINE (* -1 IND_LINE))
) |
|
|
(setq pt1 |
(getpoint "\nТочка вставки: ") |
|
x1 |
(car |
pt1) |
y1 |
(cadr pt1) |
|
l |
(getdist pt1 "\nПролёт:") |
|
h |
(getdist pt1 "\nВысота:") |
|
np |
(getint "\nЧисло паннелей: ") |
|
np |
(+ np np) |
|
dx |
(/ l |
np) |
y_up |
(+ y1 h) |
|
x_cur |
x1 |
|
list_up |
nil |
|
list_low |
nil |
|
) |
|
|
(command "_OSNAP" "_NON") |
||
; Пояса |
|
|
(REPEAT (+ np 1) |
||
(setq list_low |
(cons (list x_cur y1) list_low) |
|
list_up (cons (list x_cur y_up) list_up)
52
x_cur |
(+ x_cur dx) |
|
) |
|
|
) |
|
|
(setq list_up |
(reverse (cdr (reverse (cdr list_up)))) |
) |
(apply 'command (cons "_LINE" list_low)) |
|
|
(command "") |
|
|
;Верхний пояс |
|
|
(apply 'command (cons "_LINE" list_up)) |
|
|
(command "") |
|
|
;Раскосы |
|
|
(setq IND_LINE 1) |
|
|
(mapcar 'us_line list_up list_low ) |
|
|
(setq IND_LINE 1) |
|
|
(mapcar 'us_line (reverse list_up) (reverse list_low ) |
) |
|
; Стойки |
|
|
(setq IND_LINE 0) |
|
|
(mapcar 'us_line list_up (cdr list_low) ) |
|
|
(princ) |
|
|
Примеры работы со списками
1. Вычисление и отрисовка центра тяжести произвольного набора точек с рисованием габаритного прямоугольника
(defun c:ct ( / list_point xct yct pt list_x list_y dx dy r x_max y_max x_min y_min
)
(command "_OSNAP" "_NON")
(while (/= nil (setq pt (getpoint "\nТочка")))
|
(command "_POINT" pt ) |
(setq list_point (cons pt list_point)) |
|
) |
|
(setq list_x |
(mapcar 'car list_point) |
list_y |
(mapcar 'cadr list_point) |
all_pt (length list_point) |
|
xct |
(/ (apply '+ list_x) all_pt) |
yct |
(/ (apply '+ list_y) all_pt) |
|
53 |
x_max |
(apply 'max list_x) |
||
y_max |
(apply 'max list_y) |
||
x_min |
|
(apply 'min list_x) |
|
y_min |
|
(apply 'min list_y) |
|
dx |
|
(- x_max x_min) |
|
dy |
|
(- y_max y_min) |
|
r |
(* (max dx dy) 0.03) |
||
)
(command "_CIRCLE" (list xct yct) r) (command "_RECTANGLE" (list x_min y_min)
(list x_max y_max)
)
(princ)
)
2. Нахождение точек пересечения ломанной линии и произвольной прямой
(defun c:cl ( / pt list_pt ptc1 ptc2 list_d r pt_cross f) (command "_OSNAP" "_NON")
(setq pt (getpoint "\nТочка=")) (while (/= nil pt)
(if (/= nil list_pt)
(command "_LINE" pt (car list_pt) "")
)
(setq list_pt (cons pt list_pt)
pt |
(getpoint pt "\nТочка:") |
) |
|
) |
|
(setq list_d (mapcar 'distance list_pt (cdr list_pt))
r |
(* (apply 'min list_d) 0.07) |
ptc1 |
(getpoint "\nFirst point:") |
ptc2 |
(getpoint ptc1 "\nLast point:") |
pt1 |
(car list_pt) |
) |
|
|
54 |
(command "_LINE" ptc1 ptc2 "") (foreach pt2 (cdr list_pt)
(setq pt_cross (inters pt1 pt2 ptc1 ptc2) pt1 pt2
)
(if (/= nil pt_cross)
(command "_CIRCLE" pt_cross r)
)
) ;end foreach (princ)
)
Задания к лабораторной работе № 7
Вариант 1
Используя цикл WHILE сформировать список точек. Используя функции работы со списками нарисовать габаритный прямоугольник множества точек( рис.).
Вариант 2
Используя цикл WHILE выполнить отрисовку и заполнение списка точек отрезков LIST_LINE ( (pt1 pt2) (pt2 pt3) (pt3 pt4) …) нарисовать ломаную линию (рис. 1.а). По LIST_LINE сформировать список центральных точек отрезков и по нему нарисовать полилинию (рис. 1а).
а) б)
55
Вариант 3
Сформировать список отрезков графика функции y=cos(x) [-π..π]. LIST_LINE ( (pt1 pt2) (pt2 pt3) (pt3 pt4) …) . И
нарисовать график функции. В интерактивном режиме нарисовать произвольную прямую, пересекающую этот график. Используя функцию inters, найти точки пересечения графика и линии. В точках пересечения нарисовать круги.
Вариант 4
Выполнить отрисовку раскосов фермы и заполнить список точек ломаной линии (рис. 1.а). По этому списку
сформировать списки |
точек верхнего и нижнего поясов |
фермы и по ним нарисовать полилинии (рис. 1а). |
|
а) |
б) |
Вариант 5
Сформировать списки точек графиков функций y=2cos(x) [-2π..2π] и y=1.5sin(2x) [-2π..2π] Используя функции работы со списками нарисовать графики функций и найти точки пересечения графиков (использовать inters). В точках пересечения нарисовать круги
Вариант 6
Сформировать список точек графика функции y=3x2 [-1..1]. И нарисовать график. Задать произвольную точку. Сформировать списки точек этого графика, находящиеся выше и ниже заданной точки. Используя эти списки перерисовать разными цветами части графика, находящиеся выше и ниже заданной точки
56
Вариант 7
Сформировать список точек графика функции y=2cos(x)+sin(x) [-2π..2π]. И нарисовать график. В
пределах графика с помощью функции getcorner задать прямоугольную область. Сформировать список отрезков этого графика, находящиеся внутри прямоугольной области. Используя этот список, перерисовать другим цветом, часть графика, находящуюся в пределах прямоугольной области
Вариант 8
Сформировать список точек графика функции y=1.5cos(x)+2sin(x) [-2π..2π]. И нарисовать график с координатными осями. В пределах графика с помощью функции getcorner задать прямоугольную область (рис.). Сформировать список точек этого графика, находящиеся внутри горизонтального интервала прямоугольной области. Используя этот список, выполнить численное интегрирование функции на заданном интервале. Результат оформить в соответствии с рис.
Вариант 9
Сформировать список точек графика функции y=5x2 + 9x[- 3..3]. И нарисовать график. Задать произвольную прямую. Используя функцию inters найти точки пересечения прямой с графиком. Сформировать списки точек этого графика, находящиеся выше и ниже заданной прямой. Используя эти списки перерисовать разными цветами части графика, находящиеся выше и ниже заданной прямой.
57
Вариант 10
Используя цикл REPEAT, cформировать список вершин многоугольника LIST_LINE ( (pt1 pt2) (pt2 pt3) (pt3 pt4) …)
с произвольным числом сторон . Сформировать список центральных точек сторон многоугольника и вписать в него еще один с таким же числом вершин.
.
Вариант 11
Сформировать список точек графика функции y=3cos(x)- 4sin(x) [-2π..2π] и нарисовать график. В пределах графика с помощью функции getcorner задать прямоугольную область (рис.). Сформировать список точек этого графика, находящиеся внутри горизонтального интервала прямоугольной области. Используя этот список вычислить длину участка графика, находящегося внутри заданной области.
Вариант 12
Используя цикл WHILE выполнить отрисовку и заполнение списка точек произвольных отрезков
LIST_LINE ( (pt1 pt2) (pt3 pt4) (pt5 pt6) …). В
интерактивном режиме нарисовать произвольную прямую. Используя функцию inters, найти точки пересечения отрезков и прямой. В точках пересечения нарисовать окружности.
58
Вариант 13
Используя цикл REPEAT и функцию POLAR выполнить заполнение списка конечных точек фигуры, показанной на рисунке LIST_LINE ( pt1 pt2 pt3 pt4 pt5 pt6 …).
Отрисовать набор прямых. Используя список конечных точек, на концах линий нарисовать окружности
Вариант 14
Используя цикл WHILE сформировать список точек. С помощью функции getcorner задать прямоугольную область. Сформировать список точек, находящихся внутри заданной области, и в них нарисовать окружности
Вариант 15
Задать исходную точку ptc. Используя цикл WHILE и функцию getdist сформировать список радиусов LIST_R (r1, r2, r3 ...), выходящих из исходной точки. Выбрать из списка наибольший и наименьший радиусы и по ним нарисовать окружности.
Вариант 16
Используя цикл WHILE выполнить отрисовку и заполнение списка точек произвольных отрезков
LIST_LINE ( (pt1 pt2) (pt3 pt4) (pt5 pt6) …). Используя функцию DISTANCE сформировать список длин полученных отрезков LIST_D. По LIST_LINE сформировать список центральных точек отрезков и отрисовать в них окружности, используя длины из LIST_D как диаметры.
59
Вариант 17
Используя цикл WHILE выполнить отрисовку и заполнение списка точек произвольных отрезков
LIST_LINE ( (pt1 pt2) (pt3 pt4) (pt5 pt6) …). Используя функцию DISTANCE сформировать список длин полученных отрезков LIST_D. Выбрать из этого списка отрезки минимальной и максимальной длины и нарисовать окружности по крайним точкам этих отрезков
Вариант 18
Используя цикл WHILE сформировать список точек LIST_PT. Из списка выбрать самую левую и самую правую точки и в них нарисовать окружности произвольных радиусов так, чтобы они пересекались. Из LIST_PT выбрать точки, находящиеся в области пересечения, сформировать из них список LIST_PT1. В точках нового списка нарисовать нарисовать окружности.
60
