Цвет объектов в AutoCAD можно задавать используя различные палитры:
- AutoCAD Color Index (ACI);
- True Color;
- Color books.
Палитра AutoCAD Color Index (ACI) — стандартная палитра AutoCAD, диапазон
цветов от 1 до 255. Основные значения приведены ниже:
Номер цвета |
Константа в AutoCAD_TLB |
Описание |
0 |
acByBlock |
логический цвет по блоку (ByBlock) |
1 |
acRed |
красный |
2 |
acYellow |
желтый |
3 |
acGreen |
зеленый |
4 |
acCyan |
голубой |
5 |
acBlue |
синий |
6 |
acMagenta |
фиолетовый |
7 |
acWhite |
белый/черный |
256 |
acByLayer |
логический цвет по слою (ByLayer) |
Полную таблицу цветов можно посмотреть здесь.
Для отображения цвета можно использовать экземпляр TComboBox:
type
TForm1 = class(TForm)
. . .
cbColors: TComboBox;
chbShowColorValues: TCheckBox;
. . .
private
{ Private declarations }
// Отображать компоненты цвета
FShowColorValues: Boolean;
procedure PopulateColorsList;
public
{ Public declarations }
end;
// Заполнение списка значениями от 0 до 256
procedure TForm1.PopulateColorsList;
var
i: Integer;
begin
with cbColors do
begin
Items.BeginUpdate;
try
Clear;
for i:= 0 to 256 do
Items.Add(IntToStr(i));
ItemIndex:= 0;
finally
Items.EndUpdate;
end;
end;
end;
procedure TForm1.cbColorsDrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
var
R: TRect;
C, AColor: TColor;
P: TPoint;
S: String;
begin
AColor:= AcadColorToColor(Index); // Получание цвета в формате TColor
with cbColors.Canvas do
begin
// Залить прямоугольник фоновым цветом
C:= Brush.Color;
Brush.Color:= cbColors.Color;
FillRect(Rect);
// Залить прямоугольник цвета
R:= Rect;
R.Right:= R.Bottom - R.Top + R.Left;
InflateRect(R, -2, -2);
Brush.Color:= AColor;
FillRect(R);
// Обводка прямоугольника цвета
Brush.Color:= clBlack;
FrameRect(R);
// Залить прямоугольник фокуса
Brush.Color:= C;
R:= Rect;
R.Left:= R.Bottom - R.Top + R.Left;
FillRect(R);
// Показать текст
R:= Rect;
R.Left:= R.Bottom - R.Top + R.Left + 2;
S:= cbColors.Items[Index];
// Если требуется отображать компоненты цвета - добавить их значения к
// строке с его индексом
if FShowColorValues then S:= S + Format(' (%d, %d, %d)', [GetRValue(AColor),
GetGValue(AColor),
GetBValue(AColor)]);
with R do
P:= Point(Left, Top + (Bottom - Top - TextHeight(cbColors.Items[Index])) div 2);
// Заменить индексы логических цветов на "удобочитаемые"
case Index of
0: TextRect(R, P.X, P.Y, 'ByBlock');
256: TextRect(R, P.X, P.Y, 'ByLayer');
else
TextRect(R, P.X, P.Y, S);
end;
// Если элемент в фокусе, то...
if odFocused in State then
begin
// ...стереть старую рамку фокуса (которая на весь Rect)
DrawFocusRect(Rect);
// ...и нарисовать новую только на текст
DrawFocusRect(Classes.Rect(R.Left - 2, R.Top, R.Right, R.Bottom));
end;
end;
end;
procedure TForm1.chbShowColorValuesClick(Sender: TObject);
begin
FShowColorValues:= (Sender as TCheckBox).Checked;
cbColors.Invalidate;
end;
|
|
Если необходимо представить палитру ACI в виде сетки (как в окне Select Color)
придется писать компонент. Такой компонент (даже два) в моем варианте предлагается
посмотреть в исходных кодах в прилагаемых к статье примерах.
Там же есть и пример использования компонентов, в котором с их помощью построен
такой диалог:
Палитра True Color использует 24-битное представление цвета. Палитра Color
books является частным случаем палитры True Color и позволяет задать цвет его
именем в предопределенной цветовой книге.
В ранних версиях AutoCAD использовалась только ACI и для задания цвета объекта
необходимо обращение к его свойству Color. Не смотря на то, что в последних
версиях это свойство не документировано, оно работает:
var
Line: OleVariant;
begin
if not VarIsClear(Acad) then
begin
Line:= Acad.ActiveDocument.ModelSpace.AddLine(AcadPoint(0, 0), AcadPoint(100, 100));
Line.Color:= acRed;
Acad.Update;
end;
end;
В последних версиях AutoCAD для задания цвета предусмотрен объект AcadAcCmColor,
который имеет следующие важнейшие свойства и методы:
Имя |
Описание |
Методы |
SetRGB(Red: Integer; Green: Integer; Blue: Integer); |
Устанавливает цвет, заданный тремя компонентами |
Свойства |
ColorIndex: AcColor; |
Позволяет прочесть или установить цвет в формате ACI |
Red: Integer; |
Возвращает красную компоненту цвета |
Green: Integer; |
Возвращает зеленую компоненту цвета |
Blue: Integer; |
Возвращает синюю компоненту цвета |
Для обращения к объекту AcCmColor можно использовать метод GetInterfaceObject
объекта Application или напрямую, используя свойство TrueColor:
var
AcCmColor, Line: OleVariant;
begin
if not VarIsClear(Acad) then
begin
Line:= Acad.ActiveDocument.ModelSpace.AddLine(
AcadPoint(Random(50), Random(50)),
AcadPoint(Random(200), Random(200)));
if chbUseGetIntfObj.Checked then
AcCmColor:= Acad.GetInterfaceObject('AutoCAD.AcCmColor.16')
else
AcCmColor:= Line.TrueColor;
AcCmColor.SetRGB(trbarR.Position, trbarG.Position, trbarB.Position);
Line.TrueColor:= AcCmColor;
Acad.Update;
end;
end;
К статье прилагаются примеры на Delphi 7.
Внимание! Запрещается воспроизведение
данной статьи или ее части без согласования с автором. Если вы желаете разместить
эту статью на своем сайте или издать в печатном виде, свяжитесь с автором.
Автор статьи: Вершинин И.В. |