Работа с графическими объектами AutoCAD с использованием языка AutoLISP. Учебно-методическое пособие
.pdf
Вариант 19
Используя цикл WHILE сформировать список точек LIST_PT. С помощью функции getcorner нарисовать два вложенных прямоугольника. Точки, находящиеся внутри области малого прямоугольника перерисовать красным цветом, а внутри большого зелёным
61
Лабораторная работа №8 Работа с графическими объектами Функции работы с объектами
Примеры создания наборов с помощью функции (ssget)* 1- выбрать все линии на чертеже
(setq nbl (ssget "_X" (list (cons 0 "LINE"))))
2 - выбрать все окружности на слое ARC
(setq nbc (ssget "_X" (list (cons 0 "CIRCLE") (cons 8 "ARC")
)))
- В произвольном наборе на месте линий нарисовать габаритные окружности
(defun c:lc ( / i ent_name ent_list
|
ent_type |
|
|
pt1 pt2 |
|
|
) |
|
(setq nb |
(ssget) |
|
i |
0 |
|
) |
|
|
(REPEAT (sslength nb) |
||
(setq |
ent_name (ssname nb i) |
|
ent_list |
(entget ent_name) |
|
ent_type |
(cdr (assoc 0 ent_list)) |
|
i |
(+ i 1) |
|
)
(if (= ent_type "LINE") (progn
(setq pt1 (cdr (assoc 10 ent_list)) pt2 (cdr (assoc 11 ent_list))
)
(command "_CIRCLE" "_2P" pt1 pt2)
)
) ; end if
) ; end REPEAT
62
)
- В произвольном наборе примитивов на месте окружностей нарисовать сферы
(defun c:sf ( / i ent_name ent_list ent_type
ptc r
|
) |
|
(setq nb |
(ssget) |
|
i |
0 |
|
) |
|
|
(REPEAT (sslength nb) |
||
(setq |
ent_name (ssname nb i) |
|
ent_list |
(entget ent_name) |
|
ent_type |
(cdr (assoc 0 ent_list)) |
|
i |
(+ i 1) |
|
)
(if (= ent_type "CIRCLE") (progn
(setq ptc (cdr (assoc 10 ent_list)) r (cdr (assoc 40 ent_list))
)
(command "_sphere" ptc r)
)
) ; end if
) ; end REPEAT
)
- Найти и нарисовать центр тяжести произвольного набора точек, нарисовать габаритный прямоугольник этого набора точек
(defun c:ct ( / i ent_name ent_list ent_type
ptc pt x_max x_min y_max y_min all_pt list_x list_y xc yc
)
63
(setq nb |
(ssget) |
i |
0 |
all_pt |
0 |
)
(REPEAT (sslength nb)
(setq |
ent_name (ssname nb i) |
|
ent_list |
(entget ent_name) |
|
ent_type |
(cdr (assoc 0 ent_list)) |
|
i |
(+ i 1) |
|
)
(if (= ent_type "POINT")
(setq pt (cdr (assoc 10 ent_list)) list_x (cons (car pt) list_x) list_y (cons (cadr pt) list_y) all_pt (+ all_pt 1)
)
) ; end if
) ; end REPEAT
(setq xc |
|
(/ (apply '+ list_x) all_pt) |
yc |
(/ (apply '+ list_y) all_pt) |
|
x_max |
(apply 'max list_x) |
|
x_min |
(apply 'min list_x) |
|
y_max |
(apply 'max list_y) |
|
y_min |
(apply 'min list_y) |
|
r |
(/ (min (- x_max x_min) (- y_max y_min)) 20) |
|
)
(command "_CIRCLE" (list xc yc) r) (command "_rectang" (list x_min y_min)
(list x_max y_max))
)
64
- Вычисление длины произвольного набора линий на заданном слое "RASCOS
ИНСТРУКЦИЯ : Создать слой "RASCOS", нарисовать на нём несколько линий и вызвать функцию (per)
(defun |
per ( |
/ i ent_name ent_list |
|
|
ent_type ent_layer |
|
|
L_RASCOS pt1 pt2 |
|
) |
|
(setq nb |
(ssget) |
|
i |
0 |
|
L_RASCOS 0
)
(REPEAT (sslength nb)
(setq |
ent_name (ssname nb i) |
|
ent_list |
(entget ent_name) |
|
ent_type |
(cdr (assoc 0 ent_list)) |
|
ent_layer (cdr (assoc 8 ent_list)) |
||
i |
(+ i 1) |
|
) |
|
|
(if (and (= ent_type "LINE") (= ent_layer "RASCOS"))
(setq pt1 |
(cdr (assoc 10 ent_list)) |
pt2 |
(cdr (assoc 11 ent_list)) |
L_RASCOS (+ L_RASCOS (distance pt1 pt2))
)
) ; end if
) ; end REPEAT
(princ "\nДлина раскосов=") (princ L_RASCOS) (princ)
)
65
- Удаление окружностей, не включающих в себя заданный блок ИНСТРУКЦИЯ: Нарисовать несколько произвольных
окружностей, создать произвольный блок и вставить его
во внутреннюю |
область |
любой из окружностей, далее |
|
вызвать функцию (out_circle) |
|||
(defun out_circle ( |
/ i ent_name ent_list |
||
|
|
ent_type |
r |
|
|
pt_ins ptc list_circle |
|
|
) |
|
|
(setq nb |
(ssget) |
|
|
i |
0 |
|
|
) |
|
|
|
(REPEAT (sslength nb) |
|
||
(setq |
ent_name (ssname nb i) |
||
ent_list |
(entget ent_name) |
||
ent_type |
(cdr (assoc 0 ent_list)) |
||
i |
(+ i 1) |
|
|
)
(if (= ent_type "CIRCLE")
(setq ptc (cdr (assoc 10 ent_list)) r (cdr (assoc 40 ent_list))
list_circle (cons (list ptc r ent_name) list_circle)
)
)
(if (= ent_type "INSERT")
(setq pt_ins (cdr (assoc 10 ent_list)))
)
) ;end REPEAT
; удаление ненужных окружностей
(FOREACH i list_circle (setq ptc (car i)
r (cadr i)
66
ent_name (caddr i)
)
(if (> (distance ptc pt_ins) r) (entdel ent_name)
)
) ;end FOREACH (princ)
)
- Получение информации об атрибуте, вставленном в блок ИНСТРУКЦИЯ:Нарисовать несколько произвольных примитивов и атрибут, из этих объектов создать блок. Вставить блок несколько раз, изменяя значение атрибута при вставке, далее вызвать функцию (att_info)
(defun att_info ( / i ent_name ent_list ent_type
) |
|
|
|
(setq nb |
(ssget) |
||
i |
0 |
|
|
) |
|
|
|
(REPEAT (sslength nb) |
|||
(setq |
ent_name |
(ssname nb i) |
|
ent_list |
(entget ent_name) |
||
ent_type |
(cdr (assoc 0 ent_list)) |
||
i |
(+ i 1) |
||
) |
|
|
|
(if (= ent_type "INSERT") |
|||
(progn |
|
|
|
(setq ent_name (entnext ent_name) |
|||
|
ent_list |
(entget ent_name) |
|
|
ent_type |
(cdr (assoc 0 ent_list)) |
|
)
(if (= ent_type "ATTRIB") (alert (cdr (assoc 1 ent_list)))
67
)
) ;end progn ) ; end if
) ; end REPEAT (princ)
)
- Создание простой параметрической модели в интерактивном режиме, используя ф-ции работы с объектами
; ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ
(setq LIST_PAR (list '("a" 10.0) '("b" 8.0) '("hf" 2.0) '("lf" 3.0)
)
PT_INS '(1 1) COLOR_PAR "_RED"
)
(foreach i LIST_PAR
(setq LIST_PAR (subst (list (strcase (car i)) (cadr i)) i LIST_PAR
)
)
68
)
- Функция отрисовки простой фасонки по набору параметров
(defun draw_fas ( / x_ins y_ins pt1 pt2 pt3 pt4 i) (foreach i LIST_PAR
(set (read (car i)) (cadr i))
) |
|
|
|
|
|
|
(setq x_ins |
(car |
pt_ins) |
|
|
|
|
y_ins |
(cadr pt_ins) |
|
|
|
|
|
pt1 |
(list (+ x_ins |
a) |
y_ins) |
|
|
|
pt2 |
(list (+ x_ins |
a) |
(+ y_ins (- b hf)) ) |
|||
pt3 |
(list (+ x_ins (- a lf)) (+ y_ins b) |
) |
||||
pt4 |
(list |
x_ins |
|
(+ y_ins b) |
) |
|
) |
|
|
|
|
|
|
(command "_REDRAW") |
|
|
|
|
||
(command "_PLINE" pt_ins pt1 pt2 pt3 pt4 "_C") |
||||||
; линейные размеры |
|
|
|
|
||
(command "_LAYER" "_M" "a" "") |
|
|
||||
(command "_DIMLINEAR" |
|
|
|
|
||
pt_ins |
pt1 |
(list x_ins |
(- y_ins (* b 0.3))) |
|||
) |
|
|
|
|
|
|
(command "_LAYER" "_M" "b" "") |
|
|
||||
(command "_DIMLINEAR" |
|
|
|
|
||
pt_ins |
pt4 |
(list (- x_ins (* b 0.3)) |
y_ins |
) |
||
)
; размеры фасок
(command "_LAYER" "_M" "lf" "") (command "_DIMLINEAR" pt3 pt2
(list (/ (+ (car pt3) (car pt2)) 2) (+ (cadr pt3) (* b 0.3))
)
)
(command "_LAYER" "_M" "hf" "") (command "_DIMLINEAR" pt3 pt2
69
(list (+ (car pt2) (* b 0.3))
(/ (+ (cadr pt3) (cadr pt2)) 2)
)
)
(command "_LAYER" "_SET" "0" "") (princ)
)
- Функция редактирования параметров
(defun get_par( / i ent_name ent_list ent_type ent_layer list_dim par dim rad
)
(princ "\nВыберите параметры для редактирования...")
(WHILE (/= nil (setq nb (ssget)))
; Редактирование параметров
(setq i 0)
(REPEAT (sslength nb)
(setq |
ent_name (ssname nb i) |
|
ent_list |
(entget ent_name) |
|
ent_type |
(cdr (assoc 0 ent_list)) |
|
ent_layer (cdr (assoc 8 ent_list)) |
||
list_dim |
(assoc (strcase ent_layer) LIST_PAR) |
|
i |
(+ i 1) |
|
)
(if (and (= ent_type "DIMENSION") (/= nil list_dim)) (PROGN
(setq par (car list_dim) dim (cadr list_dim) rad (* 0.3 dim)
)
(redraw ent_name 3)
(setq dim (getdist "\nВведите новое значение выделенного параметра: ")
LIST_PAR (subst (list par dim)
70
