Тема: Как ЛИСПом поменять цвет текста нажатием кнопки мышки

Здравствуйте!
Ситуация такая: Ручками перебиваю множество значений отметок в модели. Чтобы не перепутать, сразу после редактирования меняю цвет текста.
Прошу вас, Мастера, напишите макрос, который бы работал так:
При выделении текста левой кнопкой мыши один раз цвет текста становился бы зеленым:
При двойном клике на тексте цвет тоже становился бы зеленым, но и, как обычно, всплывало бы окно редактирования текста. По окончании редактирования и закрытия окна текст должен остаться зеленым.
При выделении текста правой кнопкой мыши цвет текста возвращался бы в цвет текущего слоя (это типа откат в случае выделения не того текста). Оговорюсь: у меня настройка правой кнопки мыши - при выделении примитива появляется контекстное меню, а при пустом нажатии правой кнопки, без выделения примитивов - повторяется предыдущая команда. Это я на всякий случай проинформировала, а вдруг в коде придется отключать эту настройку, а потом опять включать.
Работаю в AutoCAD 2004. Текст обычный, однострочный, не мультитекст.
Спасибо.

Re: Как ЛИСПом поменять цвет текста нажатием кнопки мышки

А можно ли сделать еще такую фишку?
Чтобы кнопка, включающая макрос (её я умею делать), работала бы как триггер и меняла свою иконку: нажала раз - иконка на кнопке стала зеленой и макрос начал работать; нажала второй раз - иконка красная, макрос отключился, и редактирование текста уже как обычно, без изменения цвета.
Иконки я сохраню в папке C:\Program files\AutoCAD 2004\Support\ под названием
"On.bmp" и "Off.bmp".
Ой, напишите мне такой макрос, а? Это будет так прикольно, это будет верх совершенства в нашей конторе!
Спасибо.

Re: Как ЛИСПом поменять цвет текста нажатием кнопки мышки

Неужели никто не поможет?
Даже по случаю победы в хоккее?

Re: Как ЛИСПом поменять цвет текста нажатием кнопки мышки

> Малявка
Ну не так быстро. Особенно, после победы по хоккею.

Re: Как ЛИСПом поменять цвет текста нажатием кнопки мышки

> Makson
ОК, подожду. Понимаю - головка с утреца - бо-бо...

Re: Как ЛИСПом поменять цвет текста нажатием кнопки мышки

> Малявка
Это у вас бо-бо.  ...иконка красная..стала зеленой

Re: Как ЛИСПом поменять цвет текста нажатием кнопки мышки

По поводу второй фишки. А если сделать панельку с выпадающими кнопками (2 штуки)? Одна зеленая, другая красная. Нажали, выбрали зеленую и она запомнилась в интерфейсе. В другой раз выбрали красную - и теперь она на виду.

Re: Как ЛИСПом поменять цвет текста нажатием кнопки мышки

По поводу тект зеленый -> по слою и обратно можешь попробывать эту команду

;;;Text Green ->Bylayer
(defun C:TGB ( / ss txt )
  (if (setq ss (ssget "_:L:S:E" '((0 . "*TEXT"))))
    (progn
      (setq txt (ssname ss 0))
      (if (= (cdr(assoc 62 (entget txt))) 3)
    (entmod
      (subst (cons 62 256)(assoc 62 (entget txt))(entget txt)))
    (entmod
      (if (assoc 62 (entget txt))
      (subst (cons 62 3)(assoc 62 (entget txt))(entget txt))
      (append (entget txt)(list(cons 62 3)))
        )
       )
    
    )
      )
    )
  (princ)
  )

По поводу двойного клика - тут наверное реакторы

Re: Как ЛИСПом поменять цвет текста нажатием кнопки мышки

> Владимир Громов
Это не фишка, Это стандартное решение, это у меня и у других сослуживцев есть на компах. Фишка в другом: ни у кого нету, а у меня появится! (Ненадолго, конечно, потом поделюсь с сослуживцами, кто попросит, но пару-тройку деньков подержу монополию на этот прикольчик)

> VVA
Ага, спасибо, щас попробую...

Re: Как ЛИСПом поменять цвет текста нажатием кнопки мышки

> VVA
Я проверила. Взяла этот лиспик на вооружение. Но это, к сожалению, не то для нашего конкретного случая. Мне хотелось бы всё же, чтобы лиспик работал как описано в первом посте.
И в Вашем коде чтобы повторить команду, надо нажать правую кнопку. А надо бы включить макрос - и жми по текстам одной кнопкой, пока мышка не сломается. А ошибся - вот тогда жми уже правой кнопкой по всем неправильно закрашенным текстам, чтобы вернуть исходный цвет.

Re: Как ЛИСПом поменять цвет текста нажатием кнопки мышки

Чтобы поломать мышку нужно просто зациклить команду

;;;Text Green ->Bylayer
(defun C:TGB ( / ss txt )
  (while t
  (if (setq ss (ssget "_:L:S:E" '((0 . "*TEXT"))))
    (progn
      (setq txt (ssname ss 0))
      (if (= (cdr(assoc 62 (entget txt))) 3)
  (entmod
    (subst (cons 62 256)(assoc 62 (entget txt))(entget txt)))
  (entmod
    (if (assoc 62 (entget txt))
    (subst (cons 62 3)(assoc 62 (entget txt))(entget txt))
    (append (entget txt)(list(cons 62 3)))
      )
     )
  )
      )
    )
    )
  (princ)
  )

Re: Как ЛИСПом поменять цвет текста нажатием кнопки мышки

> VVA
Спасибо, этим макросом уже приятнее работать.

Re: Как ЛИСПом поменять цвет текста нажатием кнопки мышки

Ну же! Мастера-программисты! Неужели никто даже не попробует сделать автоматическую замену иконки на кнопке? Покажите планете, что и вы не хуже наших футболистов и хоккеистов в своем деле!

Re: Как ЛИСПом поменять цвет текста нажатием кнопки мышки

> Малявка
Отвечу здесь
В 2004 должно работать

;;;Text Green ->Bylayer + DDEDIT
(defun C:TGBD ( / ss txt )
  (while t
  (if (setq ss (ssget "_:L:S:E" '((0 . "*TEXT"))))
    (progn
      (setq txt (ssname ss 0))
      (if (/= (cdr(assoc 62 (entget txt))) 3)
  (entmod
    (if (assoc 62 (entget txt))
    (subst (cons 62 3)(assoc 62 (entget txt))(entget txt))
    (append (entget txt)(list(cons 62 3)))
      )
     )
  )
  (command "_.DDEDIT" txt)(command)(command)
      )
    )
    )
  (princ)
  )

Предыдущая (TGB) команда работает по принипу выключателя: если текст НЕ зеленый, то он становится зеленым, если текст зеленый - меняет на "ПОСЛОЮ"

Re: Как ЛИСПом поменять цвет текста нажатием кнопки мышки

мне неудобно перед столь уважаемой публикой
выставлять свое безобразие, но может тебе малявка это и сгодится.
пропиши в acad2004.lsp (load "c:/.../mouse_reactor.lsp")
и попробуй, должно роботать без всяких кнопок
;;;;;;;;;;;;;;;;;;;;;;;;
(defun dtr (a)
   (* pi (/ a 180.0))
)
;#################################
(defun mouse_reactor (mm)
(vl-load-com)
(if (= mm nil)
(progn
;;(setq mm (vlr-mouse-reactor nil
  ;;  '((:vlr-BeginDoubleClick . green))
                                        ))
;;))
(setq mm(VLR-Mouse-Reactor
    data
    '(
      (:VLR-beginDoubleClick . green)
      (:VLR-beginRightClick . back)
      )
    )
  )
);end defun
(defun green (mm point / p1 p2 p3 pr_obj)
(setq i 0)
(setq p1 (car point))
(setq p2 (polar p1 (dtr 45) 2)) ;;;; zdes' 2-heigh of text, nado pomenat' na visotu tvoego texta
(setq p3 (polar p1 (dtr 225) 2));;;; zdes' 2-heigh of text, nado pomenat' na visotu tvoego texta
(setq pr_obj (ssget "c" p2 p3))
(if (/= pr_obj nil)
(progn
(setq ssobj (ssname pr_obj i))
(print ssobj)
(setq obj (vlax-ename->vla-object ssobj))
(vla-put-color obj "3")
);progn
);if
);defun
(defun back (mm point / p1 p2 p3 pr_obj)
(setq i 0)
(setq p1 (car point))
(setq p2 (polar p1 (dtr 45) 2)) ;;;; zdes' 2-heigh of text, nado pomenat' na visotu tvoego texta
(setq p3 (polar p1 (dtr 225) 2));;;; zdes' 2-heigh of text, nado pomenat' na visotu tvoego texta
(setq pr_obj (ssget "c" p2 p3))
(if (/= pr_obj nil)
(progn
(setq ssobj (ssname pr_obj i))
(setq obj (vlax-ename->vla-object ssobj))
(vla-put-color obj "256")
);progn
);if
);defun
(mouse_reactor mm)

Re: Как ЛИСПом поменять цвет текста нажатием кнопки мышки

> VVA
ВАУ! Спасибо! То, что доктор прописал!!! Чмок тебя в разные приятные места))
(А поиграть иконками на кнопке не сможешь? Ну позязя...)

> sergey_1
Чего-то не работает. Пишет "Мало аргументов..."

Re: Как ЛИСПом поменять цвет текста нажатием кнопки мышки

> VVA
Ну, почти то, что доктор прописал...
При одинарном клике левой кнопкой не должно выскакивать окно редактирования текста, просто должен зеленеть существующий текст. А вот при двойном клике должно появляться окно редактирования текста с последующим майским зеленением нового текста.
А откат должен происходить при одинарном правом клике. Он (правый клик) какой-то ненадежный. Когда-то срабатывает с первого раза, а когда-то приходится раз пять наступить...
Как же мне запустить Mouse_reactor  в работу?

Re: Как ЛИСПом поменять цвет текста нажатием кнопки мышки

> sergey_1
"...должно работать без всяких кнопок."
Мне именно надо, чтобы была такая фенечка прикольная у меня, чтобы кнопка сама по себе меняла цвет иконки при очередном нажатии. Ну вот, считай, что у меня, у блондинки, бзик такой заиграл в одном месте.

Re: Как ЛИСПом поменять цвет текста нажатием кнопки мышки

> Малявка
Спорт прошел...Держи ,блондинка, свою кнопку.
Создаешь кнопку в Toolbar1. Вещаешь на неё _.knopka. "R:\\off.bmp" и "R:\\on.bmp" ссылка на твои красные и зеленые картинки. appname- приложение VLX которое должна у тебя исполнятся при нажатой кнопке.
(defun C:knopka()
(vl-load-com)
   (setq cz (vla-item(vla-item (vla-get-toolbars(vla-item(vla-get-menugroups(vlax-get-acad-object)) "ACAD")) "Toolbar1") 0 ))
   (vla-getbitmaps cz 'SmallBitmapName 'BigBitmapName)
  (if (= SmallBitmapName "R:\\on.bmp") ((vla-setbitmaps cz "R:\\off.bmp" "R:\\off.bmp")(vl-unload-vlx appname)) ((vla-setbitmaps cz "R:\\on.bmp" "R:\\on.bmp")(load appname)))
  )

Re: Как ЛИСПом поменять цвет текста нажатием кнопки мышки

> Makson
Ух ты! Щас попробую... (Руки чешутся и зудёж во всем теле!)

Re: Как ЛИСПом поменять цвет текста нажатием кнопки мышки

> Makson
Подстроила лисп под себя вот так:
(defun C:knopka()
(vl-load-com)
(setq cz (vla-item(vla-item (vla-get-toolbars(vla-item(vla-get-menugroups(vlax-get-acad-object)) "ACAD")) "Toolbar2") 0 ))
(vla-getbitmaps cz 'SmallBitmapName 'BigBitmapName)
(if (= SmallBitmapName "C:\Progam files\AutoCAD 2004\Support\on.bmp") ((vla-setbitmaps cz "C:\Progam files\AutoCAD 2004\Support\off.bmp" "C:\Progam files\AutoCAD 2004\Support\off.bmp")(vl-unload-vlx TGBD)) ((vla-setbitmaps cz "C:\Progam files\AutoCAD 2004\Support\on.bmp" "C:\Progam files\AutoCAD 2004\Support\on.bmp")(load TGBD)))
)
А он ругается:
Command: _.knopka ; error: bad argument type: stringp nil

Re: Как ЛИСПом поменять цвет текста нажатием кнопки мышки

для того,чтобы запустить реактор,
сохрани mouse_reactor.lsp например в c:/temp
и в acad2004.lsp пропиши
(load "c:/temp/mouse_reactor.lsp")
слегка подправил, у меня acad2004 английская версия все работает.
если у тебя русский acad, то попробуй (ssget "_.c"
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun dtr (a)
   (* pi (/ a 180.0))
)
;#################################
(defun mouse_reactor (mm)
(vl-load-com)
(if (= mm nil)
(progn
;;(setq mm (vlr-mouse-reactor nil
  ;;  '((:vlr-BeginDoubleClick . green))
                                        ))
;;))
(setq mm(VLR-Mouse-Reactor
    data
    '(
      (:VLR-beginDoubleClick . green)
      (:VLR-beginRightClick . back)
      )
    )
  )
);end defun
(defun green (mm point / p1 p2 p3 pr_obj obj ssobj typ)
(setq i 0)
(setq p1 (car point))
(setq p2 (polar p1 (dtr 45) 2)) ;;;; zdes' 2-height of text, nado pomenat' na visotu tvoego texta
(setq p3 (polar p1 (dtr 225) 2));;;; zdes' 2-height of text, nado pomenat' na visotu tvoego texta
(setq pr_obj (ssget "c" p2 p3(list(cons 0 "TEXT"))))
(if (/= pr_obj nil)
(progn
(setq ssobj (ssname pr_obj i))
(setq obj (vlax-ename->vla-object ssobj))
(vla-put-color obj "3")
);progn
);if
);defun
(defun back (mm point / p1 p2 p3 pr_obj obj ssobj typ)
(setq i 0)
(setq p1 (car point))
(setq p2 (polar p1 (dtr 45) 2)) ;;;; zdes' 2-height of text, nado pomenat' na visotu tvoego texta
(setq p3 (polar p1 (dtr 225) 2));;;; zdes' 2-height of text, nado pomenat' na visotu tvoego texta
(setq pr_obj (ssget "c" p2 p3(list(cons 0 "TEXT"))))
(if (/= pr_obj nil)
(progn
(setq ssobj (ssname pr_obj i))
(setq obj (vlax-ename->vla-object ssobj))
(vla-put-color obj "256")
);progn
);if
);defun
(mouse_reactor mm)

Re: Как ЛИСПом поменять цвет текста нажатием кнопки мышки

> Малявка
Переделал...
tmp.lsp лисп который у тебя должен работать при нажатай кнопке. main_function его функция...Получаеться как только тебе она не нужна ты её обноляешь. А как потребуется загружаешь заново.
(defun C:knopka()
(vl-load-com)
   (setq cz (vla-item(vla-item (vla-get-toolbars(vla-item(vla-get-menugroups(vlax-get-acad-object)) "ACAD")) "Toolbar1") 0 ))
   (vla-getbitmaps cz 'SmallBitmapName 'BigBitmapName)
  (if (= SmallBitmapName "R:\\on.bmp") ((vla-setbitmaps cz "R:\\off.bmp" "R:\\off.bmp")(defun main_function() nil)) ((vla-setbitmaps cz "R:\\on.bmp" "R:\\on.bmp")(load "R:\\tmp.lsp")))
  )

Re: Как ЛИСПом поменять цвет текста нажатием кнопки мышки

вот лисп:
(defun C:knopka()
(vl-load-com)
(setq cz (vla-item(vla-item (vla-get-toolbars(vla-item(vla-get-menugroups(vlax-get-acad-object)) "ACAD")) "Toolbar1") 0 ))
(vla-getbitmaps cz 'SmallBitmapName 'BigBitmapName)
(if (= SmallBitmapName "C:\Progam files\AutoCAD 2004\Support\on.bmp") ((vla-setbitmaps cz "C:\Progam files\AutoCAD 2004\Support\off.bmp" "C:\Progam files\AutoCAD 2004\Support\off.bmp")(defun TGBD() nil)) ((vla-setbitmaps cz "C:\Progam files\AutoCAD 2004\Support\on.bmp" "C:\Progam files\AutoCAD 2004\Support\on.bmp")(load "C:\Progam files\AutoCAD 2004\Support\TGBD.lsp")))
)
Опять ругается:
Command: P(if Unknown command "P(IF".  Press F1 for help.
Command: (not C:knopka) nil
Command: (load "knopka")) ; error: extra right paren on input
Command: _.knopka ; error: LOAD failed: "C:Progam filesAutoCAD
2004SupportTGBD.lsp"

Re: Как ЛИСПом поменять цвет текста нажатием кнопки мышки

> sergey_1
все равно не работает. Может у меня руки кривые? (хорошо еще, что не ноги. Гы)