Тонкости использования цветов в AutoCAD .NET API

Печать
Звезда не активнаЗвезда не активнаЗвезда не активнаЗвезда не активнаЗвезда не активна
 

Эта статья написана, чтобы собрать воедино разрозненную информацию про цвета в AutoCAD .NET API. А также немного рассказать о практическом применении, помимо изменения цвета.

В AutoCAD существует несколько типов цветов:

В .NET API цвета представлены двумя похожими классами:

Оба объекта могут определить, является ли цвет индексным, RGB, или печатным. Но определить, взят ли цвет из альбома цветов возможно только через класс Color. Разным типам соответствуют следующие свойства:

Так же тип объекта можно определить по перечисления ColorMethod, которое доступно что в Color, что в EntityColor.

Следует разъяснить некоторые детали о индексных цветах. Сам индекс представлен типом short, однако всего индексных цветов 255. Значения 0 и 256 отвечают за «IsByBlock» и «IsByLayer» соответственно. Иные значения приводят к ошибкам.

Следует отметить, что у индексных цветов свойства Red, Green и Blue равны нулю, и для получения RGB-значения этих цветов придется провести несколько дополнительных действий.

Получение RGB-значения из индексного цвета

Для того чтобы понять, как получить RGB-значение из индексного цвета, сначала нужно понять, что такое TrueColor.

TrueColor – закодированное в 32-битное число 24-битное представление RGB, в котором каждому цвету отводится по 8 бит. В .NET API TrueColor можно получить из EntityColor двумя способами:

autocad net colors ru

Про второй способ следует отметить, что он принимает индекс цвета, но из-за того, что индекс задается типом short, приходится вручную производить типизацию до byte.

Однако, таким образом мы получаем три закодированных цвета. Чтобы их раскодировать легче всего использовать битовые маски. Далее приведен пример реализации такого декодирования.

byte colorByte = (byte)color.ColorIndex;
int rgb = EntityColor.LookUpRgb(colorByte);

byte blue = (byte)(rgb & 0xffL);
byte green = (byte)((rgb & 0xff00L) >> 8);
byte red = (byte)(rgb >> 16);

Фильтры по цветам

Цвета можно использовать для фильтрации объектов с помощью DXF-кодов через SelectionFilter. Но есть несколько нюансов:

Всего есть 3 стандартных DXF-кода, относящихся к цветам:

Можно осуществлять фильтрацию только по 62 коду, однако при этом легко может возникнуть ситуация, когда у RGB-цвета совпал индекс и была произведена неверная фильтрация. Чтобы это учесть можно использовать логические операторы «<OR OR>» для фильтрации по нескольким условиям.

Код 430 может использоваться для отделения альбомных цветов, даже если они полностью совпадают с одним из RGB-цветов, используемых в документе.

Так же стоит отметить, что TrueColor, получаемый из EntityColor.LookUpRGB или напрямую из EntityColor.TrueColor, может возвращать неверное значение для некоторых цветов, в связи с чем может быть необходимо самостоятельно закодировать RGB в TrueColor. Для этого можно использовать битовый сдвиг, собрать шестнадцатеричную строку, или любой другой удобный метод. Далее приведен пример реализации такого кодирования.

long redL = 15;
long greenL = 100;
long blueL = 26;

long trueColor = (redL << 16) | (greenL << 8) | blueL;
Tags: ,