Главная »Статьи »AutoCAD и Delphi »О цвете в AutoCAD
О цвете в AutoCAD

Цвет объектов в 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.


Внимание! Запрещается воспроизведение данной статьи или ее части без согласования с автором. Если вы желаете разместить эту статью на своем сайте или издать в печатном виде, свяжитесь с автором.
Автор статьи: Вершинин И.В.

 
Используются технологии uCoz