Тема: Как написать макрос на кнопку для перемены Display Colors?

Мне часто приходится менять фон в пространстве модели с черного на белый. И обратно.Как написать макрос на кнопку для перемены цвета фона?
Не обязательно переключатель. Можно две кнопки. Спасибо.

Re: Как написать макрос на кнопку для перемены Display Colors?

http://dwg.ru/forum/viewtopic.php?t=4225
Там, правда, шел разговор о смене цвета курсора изначально, но методику можно применять и для цветов фона, скорее всего. Надо будет подправить код.
---
ИМХО.

Re: Как написать макрос на кнопку для перемены Display Colors?

> kpblc
Прочел...! Видать "планида" такая вредная у меня. Хотел бы я посмотреть на того, кто ставил задачу для AutoCAD.

Re: Как написать макрос на кнопку для перемены Display Colors?

> Forma
У вас задача не такая и сложная :)
У меня для OLE цветов черному соответствует номер 0 (как наверное и у всех), а белому соотв. номер 16777215.
Узнать так ли это у вас, можете запустив такую функцию:

;;;функция возврата текущего цвета экрана в модели по OLE
;;;Apelsinov
;;;19.07.05
(defun APEL-MODELBACKGRNDCOLOR_OLE ()
  (vlax-variant-value
    (vlax-variant-change-type
      (vla-get-graphicswinmodelbackgrndcolor
        (vla-get-display
          (vla-get-preferences (APEL-ACAD_APPLICATION))
        )
      )
      vlax-vblong
    )
  )
)
;;;  (apel-modelbackgrndcolor_OLE)

Затем можно загрузить такую штуку:

;;;Функция присвоения экрану в модели цвету по OLE
;;;color - номер цвета по  OLE
;;;Apelsinov
;;;19.07.05
(defun APEL-PUT-MODELBACKGRNDCOLOR_OLE (color /)
  (vla-put-graphicswinmodelbackgrndcolor
    (vla-get-display
      (vla-get-preferences (APEL-ACAD_APPLICATION))
    )
    color
  )
)
;;;(APEL-PUT-MODELBACKGRNDCOLOR_OLE 0)

После менять цвета одной кнопкой можнотакой функцией, записав ее на кнопку:

;;;Изменение цвета экрана с цвета color1 на цвет color2 и наоборот
;;;Apelsinov
;;;19.07.05
(defun APEL-PUT-MODELBACKGRNDCOLOR_REVERSE_TWO_COLOR (color1 color2 / current_color)
  (setq current_color (apel-modelbackgrndcolor_OLE))
  (cond ((eq current_color color1) (APEL-PUT-MODELBACKGRNDCOLOR_OLE color2))
        ((eq current_color color2) (APEL-PUT-MODELBACKGRNDCOLOR_OLE color1))
        ((alert "\nЦвет фона экрана не опознан!"))
  )
)
;;;(APEL-PUT-MODELBACKGRNDCOLOR_REVERSE_TWO_COLOR 0 16777215)

Да, и еще чтоб работало подгрузите

;;;Apelsinov
;;;13.05.05
(defun APEL-ACAD_APPLICATION ()
  (if (null *apel_acad_application*)
    (setq *apel_acad_application* (vlax-get-acad-object))
    *apel_acad_application*
  )
)

Значит пишем это все в автозагрузку, и пишем в кнопке

^C^C(APEL-PUT-MODELBACKGRNDCOLOR_REVERSE_TWO_COLOR 0 16777215)

Где 0 и 16777215 - соотв. Ваши черный и белый цвета
Все очень просто! :)

Re: Как написать макрос на кнопку для перемены Display Colors?

> Аpelsinov
Спасибо. Буду ставить и пробовать. Попозже сообщу о результате.

Re: Как написать макрос на кнопку для перемены Display Colors?

> Аpelsinov
Все отлично заработало. Буквально с первого раза. Большое спасибо.
Единственный момент. У меня курсор белого цвета. И не виден на белом фоне. Можно, конечно, задать ему любой цвет, отличный от белого и черного. Это не принципиально. Но, привычка... Говорят: "Вторая натура" :). Еще раз, большое спасибо Вам!

Re: Как написать макрос на кнопку для перемены Display Colors?

> Аpelsinov
Спасибо! Нашел то, что искал (жаль, что с опозданием на год). Всё работает (Autocad-2007). Правда, только в пространстве модели и только в закладке "Model". Наверно так и задумывалось?
>All
Собрал код в lsp-файл и изменил (без разрешения автора) "под себя", так, чтобы одной кнопкой переключались в цикле пять моих любимых цветов.
Если кому-нибудь надо, то опубликую.

Re: Как написать макрос на кнопку для перемены Display Colors?

> ttt
Опубликуйте, пожалуйста!

Re: Как написать макрос на кнопку для перемены Display Colors?

> Мила
Как применять, см. коментарии в начале кода.

;;;;Из www.autocad.ru/cgi-bin/f1/board.cgi?t=29350vj от 01.09.2006, автор Аpelsinov.
;;;;03.09.2006 Адаптировано под себя (ttt) для нескольких, предварительно
;;;;заданных цветов. Если код поместить в файл Rev_Color.lsp, то макрос на кнопке может быть такой:
;;;;^C^C(if (not APEL-PUT-MODELBACKGRNDCOLOR_REVERSE_COLOR)(load "Rev_Color.lsp")) (APEL-PUT-MODELBACKGRNDCOLOR_REVERSE_COLOR)
;;;;Чтобы адаптировать под себя, установите в пространстве модели любимый цвет экрана.
;;;;Код цвета определите как указано ниже. Введите полученный код взамен имеющегося, например, взамен
;;;;цифр 13755875 введите свои.
;;;Функция присвоения экрану в модели цвета по OLE
;;;color — номер цвета по  OLE
;;;Apelsinov
;;;19.07.05
(defun APEL-PUT-MODELBACKGRNDCOLOR_OLE (color /)
  (vla-put-graphicswinmodelbackgrndcolor
    (vla-get-display
      (vla-get-preferences (APEL-ACAD_APPLICATION))
    )
    color
  )
)
;После менять цвета одной кнопкой можно такой функцией, записав ее на кнопку:
;;;Изменение цвета экрана с цвета color1, на цвет color2, на цвет color3 и по кругу
(defun APEL-PUT-MODELBACKGRNDCOLOR_REVERSE_COLOR ( / current_color color1 color2 color3 color4 color5)
  (setq
   current_color (apel-modelbackgrndcolor_OLE)
   color1 0        ;черный
   color2 16777215 ;белый
   color3 15132390 ;светлосерый
   color4 10066329 ;темносерый
   color5 13755875 ;бежевый
  )
  (cond ((eq current_color color1) (APEL-PUT-MODELBACKGRNDCOLOR_OLE color2))
        ((eq current_color color2) (APEL-PUT-MODELBACKGRNDCOLOR_OLE color3))
        ((eq current_color color3) (APEL-PUT-MODELBACKGRNDCOLOR_OLE color4))
        ((eq current_color color4) (APEL-PUT-MODELBACKGRNDCOLOR_OLE color5))
        ((eq current_color color5) (APEL-PUT-MODELBACKGRNDCOLOR_OLE color1))
        ((progn
           (Princ "\nВаш цвет экрана N")(Princ current_color)
           (initget "Yes No")
           (if (/= "No" (getkword " не сохранится. Продолжить? <Y>:"))
               (APEL-PUT-MODELBACKGRNDCOLOR_OLE color1) (quit)
           )
        ))
  )
  (princ)
)
;;;Apelsinov
;;;13.05.05
(defun APEL-ACAD_APPLICATION ()
  (if (null *apel_acad_application*)
    (setq *apel_acad_application* (vlax-get-acad-object))
    *apel_acad_application*
  )
)
;;;функция возврата текущего цвета экрана в модели по OLE
;;;Apelsinov
;;;19.07.05
(defun APEL-MODELBACKGRNDCOLOR_OLE ()
  (vlax-variant-value
    (vlax-variant-change-type
      (vla-get-graphicswinmodelbackgrndcolor
        (vla-get-display
          (vla-get-preferences (APEL-ACAD_APPLICATION))
        )
      )
      vlax-vblong
    )
  )
)
;пишем в кнопке
;^C^C(APEL-PUT-MODELBACKGRNDCOLOR_REVERSE_COLOR)

Re: Как написать макрос на кнопку для перемены Display Colors?

Спасибо за програмку но у меня при белом фоне невидать перекрестия и прицел курсора потому как они остаются белым цветом (Акад2000) можно чем нибудь помоч? заранее спасибо

Re: Как написать макрос на кнопку для перемены Display Colors?

> Syrex
Сделай цвет курсора другим...Не белым.

Re: Как написать макрос на кнопку для перемены Display Colors?

Syrex пишет:

...при белом фоне невидать перекрестия...

Скажу больше: его иногда не видать и при черном фоне. Я себе сделал перекрестие цветом "251". Терпимо. Хотелось бы, конечно, программно менять цвет и у перекрестия, и у фона в видовом экране, и в режиме тонирования. Может быть кто-то знает - как?
PS: Главное, что сделала эта программа - сняла для меня вопрос "Какого цвета должен быть экран?". Цвет экрана должен быть легко изменяемым, чтобы не только цвета объектов подбирать под цвет фона, но и наоборот. Особенно это полезно при объемном моделировании, когда цвета деталей желательно иметь разными и контрастными фону. Причем фоном часто бывают соседние детали, а контрастных цветов меньше, чем хотелось бы.

Re: Как написать макрос на кнопку для перемены Display Colors?

Сборка из работ Apelsinov и ttt, чтобы курсор был виден
;;;;03.09.2006 Адаптировано под себя (ttt) для нескольких, предварительно
;;;;заданных цветов. Если код поместить в файл Rev_Color2.lsp, то макрос на кнопке может быть такой:
;;;;^C^C^P(if (not APEL-PUT-MODELBACKGRNDCOLOR_REVERSE_COLOR)(load "Rev_Color2.lsp")) (APEL-PUT-MODELBACKGRNDCOLOR_REVERSE_COLOR)
;;;;Чтобы адаптировать под себя, установите в пространстве модели любимый цвет экрана.
;;;;Код цвета определите как указано ниже. Введите полученный код взамен имеющегося, например,взамен
;;;;цифр 13755875 введите свои.
;;;Функция присвоения экрану в модели цвета по OLE
;;;color — номер цвета по OLE
;;;ACI_color - цвет из 256 по ACI
;;;Присвоение курсору цвета
;;;Apelsinov
(defun APEL-CURSOR-PUT_COLOR (OLE_color /)
(vla-put-modelcrosshaircolor
(vla-get-display
(vla-get-preferences (APEL-ACAD_APPLICATION))
)
OLE_color
)
)
(defun APEL-PUT-MODELBACKGRNDCOLOR_OLE (color /)
(vla-put-graphicswinmodelbackgrndcolor
(vla-get-display
(vla-get-preferences (APEL-ACAD_APPLICATION))
)
color
)
)
;После менять цвета одной кнопкой можно такой функцией, записав ее на кнопку:
;;;Изменение цвета экрана с цвета color1, на цвет color2, на цвет color3 и по кругу
(defun APEL-PUT-MODELBACKGRNDCOLOR_REVERSE_COLOR ( / current_color color1 color2 color3 color4
color5)
(setq
current_color (apel-modelbackgrndcolor_OLE)
color1 0 ;черный
color2 16777215 ;белый
color3 15132390 ;светлосерый
color4 10066329 ;темносерый
color5 13755875 ;бежевый
OLE_color1 0 ;черный
OLE_color2 16777215 ;белый
)
(cond ((eq current_color color1) (APEL-PUT-MODELBACKGRNDCOLOR_OLE color2) (APEL-CURSOR-PUT_COLOR OLE_color1))
((eq current_color color2) (APEL-PUT-MODELBACKGRNDCOLOR_OLE color3))
((eq current_color color3) (APEL-PUT-MODELBACKGRNDCOLOR_OLE color4))
((eq current_color color4) (APEL-PUT-MODELBACKGRNDCOLOR_OLE color5))
((eq current_color color5) (APEL-PUT-MODELBACKGRNDCOLOR_OLE color1) (APEL-CURSOR-PUT_COLOR OLE_color2))
((progn
(Princ "\nВаш цвет экрана N")(Princ current_color)
(initget "Yes No")
(if (/= "No" (getkword " не сохранится. Продолжить? <Y>:"))
(APEL-PUT-MODELBACKGRNDCOLOR_OLE color1) (quit)
)
))
)
(princ)
)
(defun APEL-ACAD_APPLICATION ()
(if (null *apel_acad_application*)
(setq *apel_acad_application* (vlax-get-acad-object))
*apel_acad_application*
)
)
;;;функция возврата текущего цвета экрана в модели по OLE
;;;Apelsinov
;;;19.07.05
(defun APEL-MODELBACKGRNDCOLOR_OLE ()
(vlax-variant-value
(vlax-variant-change-type
(vla-get-graphicswinmodelbackgrndcolor
(vla-get-display
(vla-get-preferences (APEL-ACAD_APPLICATION))
)
)
vlax-vblong
)
)
)
;пишем в кнопке
;^C^C^P(if (not APEL-PUT-MODELBACKGRNDCOLOR_REVERSE_COLOR)(load "Rev_Color2.lsp")) (APEL-PUT-MODELBACKGRNDCOLOR_REVERSE_COLOR)
;или ^C^C(APEL-PUT-MODELBACKGRNDCOLOR_REVERSE_COLOR) , если в acaddoc.lsp будет запись (load "Rev_Color2.lsp")