| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Изменить цвет курсора

Изменить цвет курсора

Ответ
Поиск в этой теме
Непрочитано 14.07.2005, 12:12
Изменить цвет курсора
nikolaev
 
конструктор
 
Мос. область
Регистрация: 28.08.2003
Сообщений: 119

Возможно ли курсору присвоить цвет текущего слоя? Это было бы удобно! Не нужно лишний раз переводить глаза на окошко слоев.
В опциях цвет курсора менять можно, но переменной такой, к сожалению, нет.
Просмотров: 30200
 
Непрочитано 18.05.2010, 00:13
#61
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Вроде нашел решение для обоих случаев.
Завтра все будет.

Тестируем:
команд включения выключения тут нет.
очень часто будет в констроке два слова: start end
Код:
[Выделить все]
;SamoCAD
;Цвет курсора равен цвету слоя
(vl-load-com)
;;;(vla-get-ModelCrosshairColor(vla-get-Display(vla-get-Preferences (vlax-get-acad-object))))
;;;(vla-put-ModelCrosshairColor(vla-get-Display(vla-get-Preferences (vlax-get-acad-object)))3408653) 
;Получим цветовые характеристики слоя

(defun clayer_color=cursor_color-samocad ( /
					  BLUELAYER
					  GREENLAYER
					  LAYOUT_COLOR
					  LAYOUT_CUR_COLOR
					  MODEL_COLOR
					  MODEL_CUR_COLOR
					  REDLAYER
					  )

  

(setq Redlayer (vla-get-Red (vla-get-TrueColor (vla-get-ActiveLayer (acad-objects-samocad 2)))))
(setq Greenlayer (vla-get-Green (vla-get-TrueColor (vla-get-ActiveLayer (acad-objects-samocad 2)))))
(setq Bluelayer (vla-get-Blue (vla-get-TrueColor (vla-get-ActiveLayer (acad-objects-samocad 2)))))

(setq model_color (vlax-variant-value
		   (vlax-variant-change-type
		   (vla-get-GraphicsWinModelBackgrndColor
		    (vla-get-Display
                      (vla-get-Preferences
                         (vlax-get-acad-object))))3)))

(setq layout_color (vlax-variant-value
		   (vlax-variant-change-type
		   (vla-get-GraphicsWinLayoutBackgrndColor
		    (vla-get-Display
                      (vla-get-Preferences
                         (vlax-get-acad-object))))3)))
  
(vla-put-ModelCrosshairColor
  (vla-get-Display
    (vla-get-Preferences
      (vlax-get-acad-object)))
  (rgb->ole-samocad Redlayer Greenlayer Bluelayer)
    )
(vla-put-LayoutCrosshairColor
  (vla-get-Display
    (vla-get-Preferences
      (vlax-get-acad-object)))
  (rgb->ole-samocad Redlayer Greenlayer Bluelayer)
    )

(setq model_cur_color (vlax-variant-value
		        (vlax-variant-change-type
			  (vla-get-ModelCrosshairColor
                             (vla-get-Display
                               (vla-get-Preferences
                                   (vlax-get-acad-object)))) 3)))

(setq Layout_cur_color (vlax-variant-value
		        (vlax-variant-change-type
			  (vla-get-LayoutCrosshairColor
                             (vla-get-Display
                               (vla-get-Preferences
                                   (vlax-get-acad-object)))) 3)))

(if (= model_color model_cur_color 0)

 (vla-put-ModelCrosshairColor
   (vla-get-Display
    (vla-get-Preferences
      (vlax-get-acad-object)))
  16777215
    )(princ))

(if (= model_color model_cur_color 16777215)

 (vla-put-ModelCrosshairColor
   (vla-get-Display
    (vla-get-Preferences
      (vlax-get-acad-object)))
  0
    )(princ))

(if (= layout_color Layout_cur_color 16777215)
 (vla-put-LayoutCrosshairColor
   (vla-get-Display
    (vla-get-Preferences
      (vlax-get-acad-object)))
  0
    )(princ))
(if (= layout_color Layout_cur_color 0)
 (vla-put-LayoutCrosshairColor
   (vla-get-Display
    (vla-get-Preferences
      (vlax-get-acad-object)))
  16777215
    )(princ))

  (princ)
					      
  );(clayer_color=cursor_color-samocad)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;SamoCAD


;Бибилиотечные функции

(vl-load-com)
;Чтение раздела и параметра реестра
;если чтото отсутствует то данный раздел и параметр добавляются
;если все наместе возвращает значение ничего неменяя
;Возвращаемое значение - значение параметра
;;;;;Аргументы
;;;;;razdel-Имя раздела
;;;;;parametr-Имя параметра
;;;;;value-значение параметра(строковое)


(defun reg-riad-or-write-samocad (razdel parametr value / osiv_ss *error*)

  (defun *error* (msg)
   (princ "\nОшибка : нет доступа к реестру ")
    (princ msg)
   (princ)
   )

  (setq osiv_ss (vl-registry-read
                   razdel
                   parametr)
      );setq


(if (null osiv_ss)
  (setq osiv_ss 
  (vl-registry-write
  razdel parametr
  value)
  );setq
  (princ )
  )

osiv_ss
    )


(defun rgb->ole-samocad (R G B)
  (+ (* B (expt 16 4)) (* G (expt 16 2)) R)
  )

(defun all-layers-obj-samocad (ename=nil-vla=t / objlist)

(setq objlist
(mapcar
  (function
    (lambda (a)
      (vla-item
	(vla-get-layers
	  (vla-get-activedocument
	    (vlax-get-acad-object))
	  ) a)))
  ( layers-name-list-samocad)))

(if ename=nil-vla=t
  (princ)
  (setq objlist
	 (mapcar (function (lambda (b)
			     (vlax-vla-object->ename b)))
		 objlist)))
  objlist
  );(all-layers-obj-samocad t) (all-layers-obj-samocad nil)

;Возвращает список всех слоев
(defun layers-name-list-samocad (/ samo_layers_lst_s) 
  (vlax-for i 
         (vla-get-layers 
      (vla-get-ActiveDocument (vlax-get-acad-object)) 
         ) 
    (setq samo_layers_lst_s (cons (vla-get-name i) samo_layers_lst_s)) 
  ) 
  (reverse samo_layers_lst_s)
  )

(defun acad-objects-samocad (obj / ob)

  (if (= obj 1)
  (setq ob (vlax-get-acad-object))
        )
  
  (if (= obj 2)
  (setq ob (vla-get-activedocument (vlax-get-acad-object)))
        )
  
  (if (= obj 3)
  (setq ob (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object))))
        )
  
  (if (= obj 4)
  (setq ob (vla-get-paperspace (vla-get-activedocument (vlax-get-acad-object))))
        )

  (if (= obj 5)
  (setq ob (vla-get-utility (vla-get-activedocument (vlax-get-acad-object))))
        )

  (if (= obj 6)
  (setq ob (vla-get-Layers (vla-get-activedocument (vlax-get-acad-object))))
        )
  ob
    );(acad-objects-samocad 2) 

(defun clayercoloroff (a b)
  
   (princ "Start")
(princ)
  )



(defun clayercoloron (a b)
  (clayer_color=cursor_color-samocad)
     (princ"end")
(princ)
  )

;реакторы команд
(setq layer_color=cursor_color_commandreactor-startcommand-samocad
       (vlr-command-reactor nil (list '(:vlr-commandwillstart . clayercoloroff))))

(setq layer_color=cursor_color_commandreactor-endcommand-samocad
       (vlr-command-reactor nil (list '(:vlr-commandended . clayercoloron))))
mmax вне форума  
 
Непрочитано 18.05.2010, 01:00
#62
grachev.p

конструктор мебели
 
Регистрация: 28.02.2010
г. Гатчина
Сообщений: 27


Спасибо!

Бегло потестировал.
С размерами все путем. Курсор цвет не меняет на них, но это и не нужно.

И еще одна особенность странная. При редактировании мультивыносок по двойному щелчку текст подсвечивается цветом текущего слоя. И это только на мультивыноске почему-то. С MTEXT, DTEXT, редактировании размеров подобного не проявляется.

Но и это на работу не влияет.

PS. В первой версии почему-то реакторы не удалялись из рисунка. Я в автозагрузку лисп не добавлял, но сегодня при открытии шаблона все равно происходила смена цвета курсора. Или это так и задумано?

Последний раз редактировалось grachev.p, 18.05.2010 в 10:29.
grachev.p вне форума  
 
Непрочитано 18.05.2010, 16:23
#63
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Релизкандидат-версия.
Все предыдущее удаляем, этот код либо в автозагрузку либо в (s::startup)
Работают команды clcoloron clcoloroff
Смена цвета курсора происходит только при переключении слоев и изменении цвета текущего слоя при работе с панелями инструментов "Слои" и работе Диспетчера свойств слоев, а так же с командами _-layer _layer '_layer
При работе LISP-приложений или команд, изменяющих слои, смены цвета курсора не происходит.
Так же автоматическая смена цвета не будет выполняться если цвет активного слоя меняется LISP-приложениями.
Код:
[Выделить все]
(vl-load-com)

;******************************************************************************************************
;Бибилиотечные функции

;Чтение раздела и параметра реестра
;если что-то отсутствует, то данный раздел и параметр будут созданы
;если все наместе возвращает значение ничего неменяя
;Возвращаемое значение - значение параметра
;;;;;Аргументы
;;;;;razdel-Имя раздела
;;;;;parametr-Имя параметра
;;;;;value-значение параметра(строковое)

(defun reg-riad-or-write-samocad (razdel parametr value / osiv_ss *error*)

  (defun *error* (msg)
   (princ "\nОшибка : нет доступа к реестру ")
    (princ msg)
   (princ)
   )

  (setq osiv_ss (vl-registry-read
                   razdel
                   parametr)
      );setq

(if (null osiv_ss)
  (setq osiv_ss 
  (vl-registry-write
  razdel parametr
  value)
  );setq
  (princ )
  )

osiv_ss
    )

;;;перевод цветов из RGB в OLE
(defun rgb->ole-samocad (R G B)
  (+ (* B (expt 16 4)) (* G (expt 16 2)) R)
  )
;Бибилиотечные функции
;******************************************************************************************************

;;;Функция устанавливающая цвет курсора равным цвету текущего слоя
(defun clayer_color=cursor_color-samocad ( /
					  BLUELAYER
					  GREENLAYER
					  LAYOUT_COLOR
					  LAYOUT_CUR_COLOR
					  MODEL_COLOR
					  MODEL_CUR_COLOR
					  REDLAYER
					  )

  

(setq Redlayer (vla-get-Red (vla-get-TrueColor (vla-get-ActiveLayer (vla-get-activedocument (vlax-get-acad-object))))))
(setq Greenlayer (vla-get-Green (vla-get-TrueColor (vla-get-ActiveLayer (vla-get-activedocument (vlax-get-acad-object))))))
(setq Bluelayer (vla-get-Blue (vla-get-TrueColor (vla-get-ActiveLayer (vla-get-activedocument (vlax-get-acad-object))))))

(setq model_color (vlax-variant-value
		   (vlax-variant-change-type
		   (vla-get-GraphicsWinModelBackgrndColor
		    (vla-get-Display
                      (vla-get-Preferences
                         (vlax-get-acad-object))))3)))

(setq layout_color (vlax-variant-value
		   (vlax-variant-change-type
		   (vla-get-GraphicsWinLayoutBackgrndColor
		    (vla-get-Display
                      (vla-get-Preferences
                         (vlax-get-acad-object))))3)))
  
(vla-put-ModelCrosshairColor
  (vla-get-Display
    (vla-get-Preferences
      (vlax-get-acad-object)))
  (rgb->ole-samocad Redlayer Greenlayer Bluelayer)
    )
(vla-put-LayoutCrosshairColor
  (vla-get-Display
    (vla-get-Preferences
      (vlax-get-acad-object)))
  (rgb->ole-samocad Redlayer Greenlayer Bluelayer)
    )

(setq model_cur_color (vlax-variant-value
		        (vlax-variant-change-type
			  (vla-get-ModelCrosshairColor
                             (vla-get-Display
                               (vla-get-Preferences
                                   (vlax-get-acad-object)))) 3)))

(setq Layout_cur_color (vlax-variant-value
		        (vlax-variant-change-type
			  (vla-get-LayoutCrosshairColor
                             (vla-get-Display
                               (vla-get-Preferences
                                   (vlax-get-acad-object)))) 3)))

(if (= model_color model_cur_color 0)

 (vla-put-ModelCrosshairColor
   (vla-get-Display
    (vla-get-Preferences
      (vlax-get-acad-object)))
  16777215
    )(princ))

(if (= model_color model_cur_color 16777215)

 (vla-put-ModelCrosshairColor
   (vla-get-Display
    (vla-get-Preferences
      (vlax-get-acad-object)))
  0
    )(princ))

(if (= layout_color Layout_cur_color 16777215)
 (vla-put-LayoutCrosshairColor
   (vla-get-Display
    (vla-get-Preferences
      (vlax-get-acad-object)))
  0
    )(princ))
(if (= layout_color Layout_cur_color 0)
 (vla-put-LayoutCrosshairColor
   (vla-get-Display
    (vla-get-Preferences
      (vlax-get-acad-object)))
  16777215
    )(princ))

  (princ)
					      
  );(clayer_color=cursor_color-samocad)

;;;Пустая временная функция для реактора
;;;на случай если смена цвета отключена - цвет не будет меняться при создании реактора
(defun clayercoloron (a b)
;;;  (clayer_color=cursor_color-samocad)
     (princ)
  )

;;;Реактор
(setq layer_color=cursor_color_commandreactor-endcommand-samocad
       (vlr-command-reactor nil (list '(:vlr-commandended . clayercoloron) )))

;;;отключение реактора на случай если смена цвета отключена
(vlr-remove layer_color=cursor_color_commandreactor-endcommand-samocad)

;;;Команда включения
(defun c:clcoloron ()
  (if 	(null (vlr-added-p layer_color=cursor_color_commandreactor-endcommand-samocad))
    (progn
    (vlr-add layer_color=cursor_color_commandreactor-endcommand-samocad)
    (vl-registry-write
      "HKEY_CURRENT_USER\\Software\\MaksCAD Soft\\SamoCAD\\AutoCAD\\Interfase"
	"layercolor=cursorcolor" "1")
    (clayer_color=cursor_color-samocad)
    )
    (princ)
    );if
  (princ)
  )

;;;команда выключения
(defun c:clcoloroff ()
  (if (null (vlr-added-p layer_color=cursor_color_commandreactor-endcommand-samocad))
    (princ)
    (progn
    (vlr-remove layer_color=cursor_color_commandreactor-endcommand-samocad)
    (vl-registry-write
  "HKEY_CURRENT_USER\\Software\\MaksCAD Soft\\SamoCAD\\AutoCAD\\Interfase"
	"layercolor=cursorcolor" "0")    
    )
    );if
  (princ)
  )


;;;Включение реактора в зависимости от конфигурации
(if (eq
      (reg-riad-or-write-samocad
	"HKEY_CURRENT_USER\\Software\\MaksCAD Soft\\SamoCAD\\AutoCAD\\Interfase"
	"layercolor=cursorcolor"
	"1") "1")
  (progn
    (vlr-add layer_color=cursor_color_commandreactor-endcommand-samocad)
    (clayer_color=cursor_color-samocad)
    )
  (princ)
  )

;;;Постоянная функция для реактора
(defun clayercoloron (a b)
  (setq layer_color=cursor_color-command-samocad b) ;в этой глобальной переменной сохранена команда в том виде в котором она должна быть в списке ниже. Чтобы прочитать имя команды сначала выполните эту команду и введите в командной строке (!layer_color=cursor_color-command-samocad) (без скобок и с восклицательным знаком)
  (if (null (vl-position (car layer_color=cursor_color-command-samocad) (list "LAYER" "_LAYER" "-LAYER" "_-LAYER" "SETVAR" "_SETVAR" "_LAYERP" "LAYERP" "LAYMCUR"))); при необходимости вы можете добавить другие имена команд в этот список при выполнении которых будет меняться цвет курсора. Как получить имя команды смотрите выше

    (princ)
  (clayer_color=cursor_color-samocad)
    )

(princ)
  )
Особенности:
замечено, что реактор команд реагирует на клики по панели и на операции в диспетчере свойств слоев, поэтому убраны все реакторы системных переменных а так же реакторы объектов контролирующие состояние активного слоя. Оставлен только один реактор команд который реагирует на событие :vlr-commandended, все другие события этого реактора вызывают конфликты с командами и LISP-приложениями от сторонних разработчиков.

При щелканьи по панели слоев и окну диспетчера слоев выполняются команды _LAYER - при редактировании свойств слоя, _SETVAR - при смене слоя. Данное приложение реагирует только на эти команды. Вы можете добавить другие команды, на которые будет реагировать это приложение, в список команд (смотрите комментарии в коде).

Ну и в заключение:
Как выяснилось золотой середины тут нет. Даже этот код будет вызывать конфликты:
1. при выполнении некоторых LISP-приложений, которые выполняются во время работы команд автокада, в которых используются функции:
(command "_LAYER" .....
(vl-cmdf "_LAYER" .....
Редко кто использует такой способ работы со слоями

2. цвет курсора не будет меняться если LISP-приложения меняют цвет слоя без использования command и vl-cmdf.
В данной ситуации правильное LISP-приложение должно возвращать текущий слой на место после окончания своей работы. поэтому если вы пользуетесь правильными приложениями то сбой вам не грозит.

Последний раз редактировалось mmax, 19.05.2010 в 12:27. Причина: Обновился код
mmax вне форума  
 
Непрочитано 30.03.2013, 03:25
#64
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,653


В продолжение темы, для полной красоты картины, к смене цвета курсора по цвету слоя хотелось бы добавить смену цвета динамической размерной линии (dynamic dimension line), которую называют также "резиновой нитью" (rubber band). Тогда эта самая нить была бы тем же цветом, что и отрисовываемая, к примеру, полилиния.
Но кто подскажет, куда копать? В ActiveX такого свойства я найти так и не смог. Из похожего - только DimensionLineColor, но это о цвете размерных линий примитива "размер". В системных переменных - тоже тишина. Нашел ветку в реестре HKEY_CURRENT_USER\Software\Autodesk\AutoCAD\R18.1\ACAD-9001:419\Profiles\<<Unnamed Profile>>\Dynamic Dimension, но что с ней делать - не понимаю.
mmax что-то давненько не появлялся...
skkkk вне форума  
 
Непрочитано 01.04.2013, 22:26
#65
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Цитата:
Сообщение от skkkk Посмотреть сообщение
mmax что-то давненько не появлялся.
Отошел я от дел. В данный момент наверное уже не смогу сделать и десятой части того, что умел раньше. Можно считать,что меня и нет уже вовсе.
mmax вне форума  
 
Непрочитано 08.01.2014, 09:33
#66
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,653


Цитата:
Сообщение от skkkk Посмотреть сообщение
Нашел ветку в реестре HKEY_CURRENT_USER\Software\Autodesk\AutoCAD\R18.1\ACAD-9001:419\Profiles\<<Unnamed Profile>>\Dynamic Dimension, но что с ней делать - не понимаю.
На досуге (спустя почти год) вдруг разобрался, что с ней делать, с этой веткой:
Код:
[Выделить все]
 (vl-registry-write  (strcat 
						"HKEY_CURRENT_USER\\Software\\Autodesk\\AutoCAD\\R18.1\\ACAD-9001:419\\Profiles\\" 
						(vla-get-ActiveProfile (vla-get-Profiles (vla-get-Preferences (vlax-get-acad-object)))) 
						"\\Dynamic Dimension"
					) 
					"Model Dynamic Dimension Line Color" 
					(vlax-variant-value 
								(vlax-variant-change-type 
									(vla-get-ModelCrosshairColor 
										(vla-get-Display (vla-get-Preferences 
															(vlax-get-acad-object)))) 3))
)
НО результатов это не принесло: значение параметра "Model Dynamic Dimension Line Color" в реестре при нажатии ""Обновить" меняется, но в автокаде цвет "резиновой нити" - нет. После перезагрузки AutoCAD не считывает значение из реестра, а записывает в реестр свое значение - тот цвет, что был у "резиновой нити" до перезагрузки. Значит, он берет значение НЕ из реестра? А откуда же тогда?
skkkk вне форума  
 
Непрочитано 08.01.2014, 11:13
#67
357

бывший...
 
Регистрация: 13.08.2009
Краснодар
Сообщений: 1,171
<phrase 1=


Как много неизведанного в анналах dwg.ru!!!
Спасибо!
С Новым годом и Рождеством!
===================================
В автокад_2012_рус работает нормально

Последний раз редактировалось 357, 16.01.2014 в 10:21.
357 вне форума  
 
Непрочитано 16.01.2014, 08:19
#68
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,653


Цитата:
Сообщение от 357 Посмотреть сообщение
В авитокад_2012_рус работает нормально
В 2011-м тоже работает, но почему-то всегда хочется большего
Как же заставить AutoCAD прочитать значение из реестра? Всю голову сломал себе...
skkkk вне форума  
 
Непрочитано 16.01.2014, 08:57
#69
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,787


Цитата:
Сообщение от skkkk Посмотреть сообщение
Как же заставить AutoCAD прочитать значение из реестра?
По идее - только программно. Если лиспом, то vl-registry-read. Если через .NET, то опять же - Registry.ReadValue (точнее не скажу, пишу с планшета).
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 16.01.2014, 09:08
#70
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,653


Не совсем правильно выразился. Не прочитать, а обновить значение надо. Читать пробовал и через vl-registry-read и через getenv. Читать-то оно читает, возвращает мне значение цвета в комстроку или в переменную записывает, а толку? Нить как была белой, так и остается. При перезагрузке ACAD значение в реестре меняется опять на "бело"
skkkk вне форума  
 
Непрочитано 17.01.2014, 00:19
#71
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


skkkk, очень редкая программа реагирует на изменения реестра, если вообще такие существуют. Не думаю, что автокад входит в их число.
К реестру вообще можно не цепляться. Забудь про него.

Если мне не изменяет память, то цвет резиновой нити не меняется никогда и нигде. Нет в автокаде никаких опций менюшек настроек для смены цвета резиновой нити. Или я ошибаюсь?
Это говорит о том, что разработчики забыли включить это свойство в объектную модель. Может им письмо написать?

А пока мне кажется тут без дизассемблеров не обойтись
mmax вне форума  
 
Непрочитано 17.01.2014, 04:17
#72
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,653


Цитата:
Сообщение от mmax Посмотреть сообщение
Нет в автокаде никаких опций менюшек настроек для смены цвета резиновой нити. Или я ошибаюсь?
mmax, вручную поменять-то можно. В Настройках, во вкладке Экран кнопка Цвета элемент Динамические размерные линии. Но хочется-то - программно. Блажь, конечно, но и еще живой, здоровый интерес. Твоей прогой пользуюсь уже, наверное, около четырех лет и до сих пор не нарадуюсь, когда до начала отрисовки примитивов я уже сразу знаю, какой слой активен без отрыва от курсора или командной строки, динамически менять цвет которой проблем не составило, времени разобраться ушло не более 15-ти минут в свое время. Спасибо за такой кайф тебе. Работает, кстати, чётенько, даже в багах не замечена последняя версия (только не переключает цвет при переключении слоя через панель свойств, но там и неудобно слои менять). До этого были конфликты с моими кодами, почему-то при наличии в чертеже блокированных слоев. Все хотел разобраться помню, но ты мне не дал, выпустив новую версию.
Цитата:
Сообщение от mmax Посмотреть сообщение
очень редкая программа реагирует на изменения реестра, если вообще такие существуют
Это я уже понял. Но еще я накопал вот что. В Автокаде есть профили. Те, что на последней вкладке окна Настройки. Если профиль экспортировать, то мы получаем файл с расширением *.arg. Этот файл мы переносим на другой компьютер, там делаем импорт, - и настройки (в т.ч. цвет резиновой нити) уже на новом компе. Если открыть файл .arg блокнотом, то увидим, что первая строка в нем такова:
Код:
Погуглив, я выяснил, что это признак файла, меняющего реестр. Там есть такие строки:
Код:
[Выделить все]
[HKEY_CURRENT_USER\Software\Autodesk\AutoCAD\R18.1\ACAD-9001:419\Profiles\MyProfile\Dynamic Dimension]
"Model Dynamic Dimension Line Color"=dword:0000FF00
Оставляю в файле только эту строку (ну и первую еще, конечно), сохраняю его с расширением .reg, запускаю файл - он меняет значение в реестре. То есть, можно предположить, что если мы экспортируем файл профиля на другой комп, то он прописывает в реестре того другого компа все настройки из компа-источника (ну на самом деле не все, а многие, в том числе - цвет резиновой нити). Почему-то у меня стойкое предчувствие, что надо каким-то образом заставить КАД прочитать и применить нужное значение реестра.
Если я создаю профиль "MyProfile2" с другим цветом нити и добавляю в твой код строки
Код:
[Выделить все]
 	(vla-put-ActiveProfile 
		(vla-get-Profiles 
			(vla-get-Preferences
				(vlax-get-acad-object))) "MyProfile2")
то цвет меняется. Но это не комильфо вариант, поскольку АКАД при этом подвисает на секунду-полторы, да и для каждого переключения слоя создавать новый профиль..... Костыль в общем. В комстроке он при этом пишет:
Цитата:
Файл адаптации загружен успешно. Группа адаптации: ACAD
Файл адаптации загружен успешно. Группа адаптации: CUSTOM
Файл адаптации загружен успешно. Группа адаптации: EXPRESS
Что ли грузит он это из файла CUI?
В общем, я пока в тупике...

Последний раз редактировалось skkkk, 17.01.2014 в 06:08.
skkkk вне форума  
 
Непрочитано 17.01.2014, 16:11
#73
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


skkkk, ну вот смотри.
В автокаде есть так называемая объектная модель. Разработчики автокада разрешили нам простым смертным просматривать и изменять свойства объектов объектной модели. При этом они к одним разрешили, к каким-то запретили, а к каким-то забыли открыть доступ.

Так вот.

Есть значит у некоего объекта объектной модели свойство ModelCrosshairColor с которым мы можем делать всё что нам вздумается.
А вот свойства ModelDynamicDimensionLineColor почему-то нету. Почему? Преднамеренно запретили? Случайно забыли?

Лично я, да и не только я, могу сказать одно. Если нету значит нету и нет смысла искать пути решения которых не существует.

Есть несколько выходов из данной ситуации:
1. Смириться
2. Завалить разработчиков автокада просьбами, а желательно требованиями, включения этих возможностей. При этом просьб и требований должно быть очень много потому, что ни одна коммерческая организация никогда не будет стараться угодить маленькой аудитории
3. Обратиться к программистам хакерам-ассемблерщикам. Они создадут приложение которое будет искать значение цвета резиновой нити в памяти приложения, в общем я даже сам не знаю чего они там смогут наворотить. Знаю одно - смогут, если захотят.
mmax вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Изменить цвет курсора

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск