Тема: MNU, LISP. Предлагается панель с опциями и новыми командами для полилинии
Предлагается дополнительная панель с кнопками для опций и новых
команд при работе с полилинией. При использовании AutoCAD 2004, 2005
строки меню можно скопировать в файлы acad.mns или (и) acad.mnu.
При использовании AutoCAD 2006 придется вручную создать панель и
кнопки в acad.cui.
Фрагмент меню.
**TB_PL_OPTION [_Toolbar("Опции полилинии", _Floating, _Show, 497, 92, 1)] [_Button("Полилиния", RCDATA_16_PLINE, RCDATA_16_PLINE)]^C^C_pline [_Button("Ширина", "width.bmp", "width.bmp")]_W [_Button("Дуговой сегмент", "arc.bmp", "arc.bmp")]_Arc [_Button("2-я точка дуги", "second.bmp", "second.bmp")]_S [_Button("Линейный сегмент", "line.bmp", "line.bmp")]_L [_Button("Замкнуть", "close.bmp", "close.bmp")]_CL [_Button("Отменить последний сегмент", "undo.bmp", "undo.bmp")]_U [--] [_Button("Редактировать полилинию", RCDATA_16_PEDIT, RCDATA_16_PEDIT)]^C^C_pedit [--] [_Button("Полилиния из независимых сегментов", "lw_one.bmp", "lw_one.bmp")]^C^C^P(if (not C:PL_ONE) (load "pl_one")) PL_ONE [_Button("Добавить вершину в полилинию", "lw_vert.bmp", "lw_vert.bmp")]^C^C^P(if (not C:PLINE_STR) (load "pline_str")) PLINE_STR [_Button("Заменить линейный сегмент дуговым", "lw_arc.bmp", "lw_arc.bmp")]^C^C^P(if (not C:LW_ARC) (load "lw_arc")) LW_ARC [_Button("Заменить дуговой сегмент линейным", "lwarc_line.bmp", "lwarc_line.bmp")]^C^C^P(if (not C:LWARC_LINE) (load "lwarc_LINE")) LWARC_LINE
Коды программ.
Полилиния из независимых сегментов. Сохранить в файле pl_one.lsp
;************ pl_one.lsp ************************************************************* ; Отрисовка непрерывной полилинии с независимыми сегментами. ; Автор Владимир Громов. ; (defun C:PL_ONE ( / wdt1 wdt tn flag tk) (setvar "cmdecho" 0) (setq wdt1 (getvar "PLINEWID")) (princ "\n Ширина сегментов полилинии <") (princ wdt1) (princ ">: ") (setq wdt (getreal)) (if (= wdt nil) (setq wdt wdt1)) (setvar "PLINEWID" wdt) (setq tn (getpoint "\n Укажите начальную точку сегмента полилинии (ENTER-отказ): ")) (if tn (progn (setq flag T) (while flag (if flag (progn (setq tk (getpoint tn "\n Укажите следующую точку (ENTER-Конец): ")) (if tk (progn (command "_PLINE" tn tk "") (setq tn tk) ); progn (setq flag nil) ); progn ); if ); if );while ) ;progn (princ "\n Отказ.") ); if (princ) )
Добавить вершину в полилинию. Сохранить в файле pline_str.lsp
;********************* pline_str.lsp *************************************************** ; Автор участник конференции под ником kpblc ; (defun kpblc-stretch-pline (/ break_point _osmode_ selset_oper break_ent break_ent_type) ;; Определения локальных функций ;; Собственно разрыв и дополнительный одновременный _.stretch. ;; Параметры: ;; ent_pline - ссылка на разрываемый объект, аналог (entsel) ;; ent_type - тип объекта: nil -> lwpolyline; t -> line ;; объект обратно в LINE не разбивается (defun _kpblc-break-pline (ent-pline ent-type break-point) (command "_.break" ent-pline break-point break-point) (command "_.pedit" "_M" "_C" break-point break-point "") ;; Здесь определяем по ent_type - чего делать дальше (if ent-type (command "_yes") ) ;_ end of if (command "_join" 0 "") (command "_.stretch" "_C" break-point break-point "" break-point (getpoint break_point "Укажите новую точку : ")) ) ;_ end of defun ;; Конец определения локальных функций (vl-load-com) (if (not *kpblc-activedoc*) (setq *kpblc-activedoc* (vla-get-activedocument (vlax-get-acad-object))) ) ;_ end of if (vla-endundomark *kpblc-activedoc*) (vla-startundomark *kpblc-activedoc*) (setq _osmode_ (getvar "osmode") ) ;_ end of setq (setvar "osmode" 512) ;; Обработка пустого выбора (while (not (setq break_point (getpoint "\nУкажите точку разрыва : ") selset_oper (ssget break_point) ) ;_ end of setq ) ;_ end of not ) ;_ end of while ;; Теперь проверка на вшивость - в смысле, на правильность выбора ;; Вынесено специально в отдельный setq, а также введена дополнительная ;; локальная переменная определения типа разрываемого объекта (setq break_ent (ssname selset_oper 0) break_ent_type (cdr (assoc 0 (entget break_ent))) ) ;_ end of setq (cond ((or (= break_ent_type "LWPOLYLINE") (= break_ent_type "POLYLINE")) (progn (_kpblc-break-pline break_ent nil break_point) ) ;_ end of progn ) ((= break_ent_type "LINE") (_kpblc-break-pline break_ent t break_point) ) (t (alert "Добавить вершину к выбранному примитиву невозможно!")) ) ;_ end of cond (setvar "osmode" _osmode_) (vla-endundomark *kpblc-activedoc*) (princ) ) ;_ end of defun (defun c:pline_str () (kpblc-stretch-pline) ) ;_ end of defun
Этот вариант программы программы я использую в своей работе. Обсуждение и другие варианты
можно посмотреть здесь:
https://www.caduser.ru/forum/topic20243.html
Заменить линейный сегмент дуговым. Сохранить в файле lw_arc.lsp
;**************** lW_arc.lsp ************************************* ; Замена линейного сегмента в полилинии ; дуговым сегментом. ; Автор Евгений Елпанов. (defun C:LW_ARC(/ A1 ENT GR I LST LW PAR PT) (vl-load-com) (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) )
Заменить дуговой сегмент линейным. Сохранить в файле lwarc_line.lsp
;**************** lwarc_line.lsp ************************************* ; Замена дугового сегмента в полилинии ; линейным сегментом. ; Автор Евгений Елпанов. (defun C:LWARC_LINE (/ lw) (setq lw(entsel"\n Выберите нужный дуговой сегмент в полилинии:")) (if(and lw(=(cdr(assoc 0(entget(car lw))))"LWPOLYLINE")) (progn(vla-StartUndoMark(vla-get-activedocument(vlax-get-acad-object))) (vl-load-com)(vla-SetBulge(vlax-ename->vla-object(car lw)) (fix(vlax-curve-getParamAtPoint(car lw) (vlax-curve-getClosestPointTo(car lw)(cadr lw))))0.) (vla-EndUndoMark(vla-get-activedocument(vlax-get-acad-object)))) (princ"\n Ничего не выбрано или объект не полилиния.")) (princ) )
Пиктограммы
RCDATA_16_PLINE и RCDATA_16_PEDIT
являются стандартными.
Пиктограммы
width.bmp arc.bmp second.bmp line.bmp close.bmp undo.bmp lw_one.bmp lw_vert.bmp lw_arc.bmp lwarc_line.bmp
необходимо сделать самостоятельно. У меня есть свои простенькие
пиктограммы. При желании я могу их выложить на webfile.ru.