Александр Пекшев aka Modis пишет:В цикле пройти по всем вершинам -1 (если мне память не изменяет, то вроде по сегментам нельзя итерацию делать - но могу и ошибаться), при этом находя центр сегмента
В этом и основная проблема.
Пыталась найти литературу либо еще что-то по тему, в каких свойствах можно найти точки полилинии, пока успехом не завершилось.
(command "_pline" '(150 200) '(30 250) '(40 400) '(120 500) '(180 500)"")
(setq po (entlast))
<Entity name: 7ef4fe88>
(setq pr (entget po))
((-1 . <Entity name: 7ef4fe88>) (0 . "LWPOLYLINE") (330 . <Entity name:
7ef4fcf8>) (5 . "81") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0")
(100 . "AcDbPolyline") (90 . 5) (70 . 0) (43 . 0.0) (38 . 0.0) (39 . 0.0) (10
150.0 200.0) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10 30.0 250.0) (40 . 0.0) (41 .
0.0) (42 . 0.0) (10 40.0 400.0) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10 120.0
500.0) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10 180.0 500.0) (40 . 0.0) (41 . 0.0)
(42 . 0.0) (210 0.0 0.0 1.0))
Предположила как можно написать, но видимо где-то косяк.
Пока окружности задавала в программе, чтоб проще отловить ошибку.
;Первый кривой вариант с не совсем правильным порядком комменд в ифах и вне их
(defun s1()
(command "_circle" '(300 500) 70)
(command "_circle" '(500 500) 100)
(command "_circle" '(100 200) 50)
(command "_circle" '(300 450) 75)
(command "_circle" '(500 1000) 60)
(command "_circle" '(500 50) 100)
(setq beg (entnext)); первая окружность
(setq end (entlast)); последняя окружность
(command "_pline" '(150 200) '(30 250) '(40 400) '(120 500) '(180 500)"")
(setq po (entlast)) ; полилиния
(setq pr (entget po)) ; свойства полилинии
(setq priz (car pr)) ; первый признак функции
(setq pr (cdr pr)) ; остальные признаки
(setq priz1 (car priz)) ; номер принака
(if (eq priz1 10) ; если это точка
(setq dot1 (cdr priz))) ; список из хвоста (координаты точки)
(while pr ; цикл
(setq priz (car pr)) ; первый признак из списка
(setq pr (cdr pr)) ; убираем его из списка признаков
(setq priz1 (car priz)) ; выделяем номер признака
(if (eq priz1 10) ; если точка
(setq dot2 (cdr priz))) ; выбираем точку 2
(setq a (list (/ (+(car dot1) (car dot2)) 2) (/ (+ (cadr dot1) (cadr dot2)) 2))) ;середина отрезка
(setq prop (entget beg)) ; список свойств окружности
(while prop ;аналогичный цикл по свойствам окружности
(setq prop1 (car prop))
(setq prop (cdr prop))
(setq propn (car prop1))
(if (eq propn 10)
(subst (prop1) (list propn a)); Тут уже сомнения, но предполагалась замена центра
;на точку середины сегмента полилинии
)
)
(setq beg (entnext beg)); переход к следующей окружности
(setq dot1 dot2) ; сдвиг начальной точки отрезка для работы с новым сегментом
)
)
;Вариант номер четыре,второй исправила, ошибки с nil нет bad fuction
(defun s1()
(command "_circle" '(300 500) 70)
(command "_circle" '(500 500) 100)
(command "_circle" '(100 200) 50)
(command "_circle" '(300 450) 75)
(command "_circle" '(500 1000) 60)
(command "_circle" '(500 50) 100)
(setq beg (entnext))
(setq end (entlast))
(command "_pline" '(150 200) '(30 250) '(40 400) '(120 500) '(180 500)"")
(setq po (entlast))
(setq pr (entget po))
( while (eq dot1 nil)
(setq priz (car pr))
(setq pr (cdr pr))
(setq priz1 (car priz))
(if (eq priz1 10)
(setq dot1 (cdr priz)))
)
(while pr
(setq priz (car pr))
(setq pr (cdr pr))
(setq priz1 (car priz))
(if (eq priz1 10)
( progn
(setq dot2 (cdr priz))
(setq a (list (/ (+(car dot1) (car dot2)) 2) (/ (+ (cadr dot1) (cadr dot2)) 2)))
(setq prop (entget beg))
(while prop
(setq prop1 (car prop))
(setq prop (cdr prop))
(setq propn (car prop1))
(if (eq propn 10)
(progn
(setq sent (cdr prop1))
(subst (prop1) (list propn a))
(setq beg (entnext beg))
(setq dot1 dot2)
)
)
)
)
)
)
)
[S]Command: ; error: bad argument type: numberp: nil[/S]
[S]Последнее фигурирующее в выполненном автокадом - полилиния, результатов присвоения переменным первого и посленего начерченных элементов нет.[/S]
Command: ; error: bad function: (10 300.0 500.0 0.0)
Похоже, криво идет работа с найденным центром первой окружности. Пока думаю.
Причину найти пока не получается, увы