Тема: LISP. Замена линейного сегмента в полилинии дуговым сегментом
;**************** lW_arc.lsp ************************************* ; Замена линейного сегмента в полилинии ; дуговым сегментом. ; Автор Евгений Елпанов. (defun C:LW_ARC(/ A1 ENT GR I LST LW PAR PT) (vl-cmdf "_.undo" "_be") (setq lw(entsel "\n Выберите нужный сегмент в полилинии. ")) (if(and lw(=(cdr(assoc 0(entget(car lw)))) "LWPOLYLINE")) (progn(setq par (vlax-curve-getParamAtPoint(car lw) (vlax-curve-getClosestPointTo(car lw)(cadr lw))) a1(angle(vlax-curve-getPointAtParam(car lw)(fix par)) (vlax-curve-getPointAtParam(car lw)(1+(fix par))))) (princ "\n Задайте визуально кривизну сегмента. ") (while(and(setq gr(grread 5))(=(car gr) 5)) (setq i 0 lst nil ent(entget(car lw))) (while(or(/=(caar ent) 42) (if(< i(fix par))(setq i(1+ i)))) (setq lst(cons(car ent) lst)ent(cdr ent))) (redraw) (grdraw(setq pt(vlax-curve-getPointAtParam (car lw)(fix par)))(cadr gr) 6 1) (entmod(append(reverse(cons(cons 42 (/(sin(/(- a1(angle pt(cadr gr)))2.)) (cos(/(- a1(angle pt(cadr gr)))2.))))lst)) (cdr ent)))(entupd(car lw)))) (princ "\n Ничего не выбрано или объект не полилиния. ")) (vl-cmdf "_.undo" "_e") (redraw) (princ) )
Возможный макрос для кнопки или пункта меню:
^C^C^P(if (not C:LW_ARC) (load "lw_arc")) LW_ARC