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

Работа с графическими объектами AutoCAD с использованием языка AutoLISP. Учебно-методическое пособие

.pdf
Скачиваний:
0
Добавлен:
12.08.2026
Размер:
879 Кб
Скачать

Вариант 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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]