WPF работа с цветом слоев/объектов

Автор Тема: WPF работа с цветом слоев/объектов  (Прочитано 7715 раз)

0 Пользователей и 3 Гостей просматривают эту тему.

Оффлайн ДаниилАвтор темы

  • ADN Club
  • Сообщений: 31
  • Карма: 2
Здравствуйте. Пишу приложение-плагин на WPF для Autocad. Одна из задач - изменять цвет слоя/графического примитива. С чертежа я могу получить, к примеру, ColorIndex. Соответственно и менять цвет я могу, меняя значение данного параметра.

в WPF-диалоге использую extended toolkit colorPicker. Необходимо забиндить его SelectColor на свойства во ViewModel. Однако свойство это будет типа System.Windows.Media.Color. Необходимо конвертировать ColorIndex в System.Windows.Media.Color.

Возможно кто-то сталкивался с подобной проблемой и знает возможные пути решения. Хотелось бы узнать оптимальный способ для выполнения данной задачи. Буду благодарен за помощь.

Отмечено как Решение Даниил 17-02-2015, 10:29:32

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: WPF работа с цветом слоев/объектов
« Ответ #1 : 16-02-2015, 23:09:15 »
Код - C# [Выбрать]
  1. using System;
  2. using System.Runtime.InteropServices;
  3. using System.Reflection;
  4. using Autodesk.AutoCAD.Runtime;
  5. using Autodesk.AutoCAD.ApplicationServices;
  6. using Autodesk.AutoCAD.DatabaseServices;
  7. using Autodesk.AutoCAD.Colors;
  8. using Autodesk.AutoCAD.Geometry;
  9. using Autodesk.AutoCAD.EditorInput;
  10. using AcRx = Autodesk.AutoCAD.Runtime;
  11. using AcAp = Autodesk.AutoCAD.ApplicationServices;
  12. using AcDb = Autodesk.AutoCAD.DatabaseServices;
  13. using AcGe = Autodesk.AutoCAD.Geometry;
  14. using AcEd = Autodesk.AutoCAD.EditorInput;
  15. using AcCl = Autodesk.AutoCAD.Colors;
  16.  
  17. [assembly: CommandClass(typeof(Rivilis.ColorConv))]
  18.  
  19. namespace Rivilis
  20. {
  21.   public class ColorConv
  22.   {
  23.     public static int MediaColorToColorIndex(System.Windows.Media.Color clm)
  24.     {
  25.       return AcCl.EntityColor.LookUpAci(clm.R, clm.G, clm.B);
  26.     }
  27.     public static System.Windows.Media.Color ColorIndexToMediaColor(int cla)
  28.     {
  29.       int acirgb = AcCl.EntityColor.LookUpRgb((byte)cla);
  30.       byte b = (byte)(acirgb);
  31.       byte g = (byte)(acirgb >> 8);
  32.       byte r = (byte)(acirgb >> 16);
  33.       return System.Windows.Media.Color.FromRgb(r, g, b);
  34.     }
  35.     [CommandMethod("ClsConv")]
  36.     public void ClsConv()
  37.     {
  38.       AcEd.Editor ed =
  39.         AcAp.Application.DocumentManager.MdiActiveDocument.Editor;
  40.       System.Windows.Media.Color clm =
  41.         System.Windows.Media.Color.FromRgb(/*R*/ 0, /*G*/ 255, /*B*/ 63);
  42.       // Преобразуем System.Windows.Media.Color в Autodesk.AutoCAD.Colors.Color
  43.       AcCl.Color cla = AcCl.Color.FromColor(clm);
  44.       ed.WriteMessage("\nAutodesk.AutoCAD.Colors.Color = {0}", cla);
  45.       // Получаем индексный цвет
  46.       int iColorIndex = MediaColorToColorIndex(clm);
  47.       ed.WriteMessage("\nColorIndex = {0}", iColorIndex);
  48.       // Выполним обратное преобразование
  49.       clm = ColorIndexToMediaColor(iColorIndex);
  50.       ed.WriteMessage("\nSystem.Windows.Media.Color = {0},{1},{2}", clm.R, clm.G, clm.B);
  51.     }
  52.   }
  53. }

Результат:
Цитировать
Command: CLSCONV
Autodesk.AutoCAD.Colors.Color = 0,255,63
ColorIndex = 100
System.Windows.Media.Color = 0,255,63
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн ДаниилАвтор темы

  • ADN Club
  • Сообщений: 31
  • Карма: 2
Re: WPF работа с цветом слоев/объектов
« Ответ #2 : 17-02-2015, 10:29:47 »
Спасибо)

Оффлайн ДаниилАвтор темы

  • ADN Club
  • Сообщений: 31
  • Карма: 2
Re: WPF работа с цветом слоев/объектов
« Ответ #3 : 17-02-2015, 12:03:29 »
У меня возник еще один вопрос, почему то при конвертации int to System.Windows.Media.Color вместо белого цвета я получаю черный.
При том на чертеже цвет отображается верный, но colorPicker показывает мне, что цвет черный

при это с другими цветами проблем нет, все отображается корректно.
В дебаг режиме отследил, что причина кроется в данном конвертере:

Код - C# [Выбрать]
  1. public static System.Windows.Media.Color ColorIndexToMediaColor(int cla)
  2.         {
  3.             var acirgb = EntityColor.LookUpRgb((byte)cla);
  4.             var b = (byte)(acirgb >> 0);
  5.             var g = (byte)(acirgb >> 8);
  6.             var r = (byte)(acirgb >> 16);
  7.             return System.Windows.Media.Color.FromRgb(r, g, b);
  8.         }      

на выходе я получаю r=0, g=0, b=0
что соответствует черному цвету, #FF000000 как я понял.

не могу понять, в чем может быть проблема.
« Последнее редактирование: 17-02-2015, 12:15:53 от Даниил »

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: WPF работа с цветом слоев/объектов
« Ответ #4 : 17-02-2015, 12:27:28 »
У меня возник еще один вопрос, почему то при конвертации int to System.Windows.Media.Color вместо белого цвета я получаю черный.
А точнее. Какой int превращается в какой System.Windows.Media.Color? Если речь идёт о цвете с номером 7, то он при светлом фоне чертежа отображается черным, а при темном фоне чертежа отображается белым. Это правило AutoCAD.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн ДаниилАвтор темы

  • ADN Club
  • Сообщений: 31
  • Карма: 2
Re: WPF работа с цветом слоев/объектов
« Ответ #5 : 17-02-2015, 12:34:07 »
int с номером 7, именно он

Наверное, как раз тут это правило и сработало, проблема в том, что у меня темный фон, цвет слоя - белый, объекты на чертеже белые.
Но int 7 в colorPicker отображен черным.


Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: WPF работа с цветом слоев/объектов
« Ответ #6 : 17-02-2015, 12:41:38 »
Значит тебе в коде придётся учесть этот факт.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: WPF работа с цветом слоев/объектов
« Ответ #7 : 17-02-2015, 12:51:22 »
Кстати, возможно это будет полезно для тебя: http://adndevblog.typepad.com/autocad/2013/07/wpf-implementation-to-mimic-color-layer-controls.html
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн ДаниилАвтор темы

  • ADN Club
  • Сообщений: 31
  • Карма: 2
Re: WPF работа с цветом слоев/объектов
« Ответ #8 : 17-02-2015, 12:52:34 »
Да, уже брал кое-что полезное в этом блоге. Почитаю эту статью, спасибо большое!