色システム
cad-viewer の色システムは、AutoCAD ObjectARX の動作に従いつつ、ブラウザ環境で予測可能なレンダリングを確保します。
AutoCAD Color Index(ACI)とTrue Colorの両方をサポートし、AcCmColor 抽象化を通じて統合されています。
概要
AutoCAD 互換システムでは、色は主に 2 つの方法で表現されます:
ACI(AutoCAD Color Index)
- 整数ベースの色システム(
0–256) - 定義済みパレットを使用します
- 固定の RGB 値ではなくコンテキストに依存する論理色を含みます
True Color
- 24 ビット RGB 色(
R, G, B) - 各チャンネルは
0–255の範囲です - ACI に依存しない完全な色の柔軟性を提供します
AcCmColor
cad-viewer のすべての色は AcCmColor クラスを使用して表現されます。
サポート対象:
- ACI インデックス
- True Color(RGB)
- 論理色モード(ByLayer / ByBlock)
参照実装:
https://github.com/mlightcad/realdwg-web/blob/main/packages/common/src/AcCmColor.ts
この抽象化は ObjectARX を反映しており、色オブジェクトがインデックス色または明示的な RGB 値のいずれかを表すことができます。
特殊な ACI 値
標準の ACI 値(1–255)とは異なり、次の値は論理色を表します:
ACI = 0 → ByBlock
- 色はブロック参照によって決定されます
- 動作:
- 挿入前:デフォルトの前景色を使用します
- 挿入後:ブロックのコンテキストから継承します
これは固定色ではなく、動的な参照です。
ACI = 256 → ByLayer
- 色はエンティティのレイヤから継承されます
- CAD ワークフローで最も一般的に使用されるモードです
動作:
- レイヤの色を変更すると、ByLayer を使用するすべてのエンティティが更新されます
- 色の一元管理が可能になります
ACI = 7 → 適応型前景色
- デフォルトの前景色を表します
- 次のように表示されます:
- 暗い背景では白
- 明るい背景では黒
これにより、固定の RGB 値ではなくコンテキスト依存の色になります。
AutoCAD ワークフローでは:
- 新しいレイヤを作成すると、通常、デフォルトの色は ACI 7 です
- これにより、新しく作成されたジオメトリが背景テーマに関係なく常に表示されます
AcDbEntity での色の解決
各エンティティは、resolvedColor プロパティを通じて最終的な表示色を解決します。
参照実装:
https://github.com/mlightcad/realdwg-web/blob/main/packages/data-model/src/entity/AcDbEntity.ts
resolvedColor プロパティは、レンダリングに使用される最終的な RGB 色を決定します。解決は優先度ベースのプロセスに従います:
- True Color(最優先):エンティティが明示的に True Color を定義している場合、それを直接使用します
- ByLayer の解決:色が ByLayer(ACI = 256)の場合、レイヤの解決済み色に委譲します
- ByBlock の解決:色が ByBlock(ACI = 0)の場合、ブロック挿入コンテキストに依存し、コンテキストがない場合はデフォルト色にフォールバックします
- ACI 色の解決:標準の ACI 値(
1–255)には、定義済みのルックアップテーブルを使用します
cad-viewer での ACI 7 の扱い
cad-viewer は、ACI 7 を固定の RGB 値ではなく意味的な色として扱います。背景が変わると、コントラストを維持するために自動的に反転します。どのように動作するのでしょうか。原則として、
背景の変更が前景の更新をトリガーします:ビューの背景色が変わると、レンダラーは「前景」のレンダリング色を更新するように明示的に指示されます。ルールは単純です:
- 背景が黒の場合、ACI 7 には白を使用します。
- 背景が白の場合、ACI 7 には黒を使用します。
マテリアルは自身が「前景」かどうかを記憶します:マテリアルが作成されると、前景(ACI 7)エンティティを表すかどうかを示すメタデータがタグ付けされます。これにより、システムは前景の変更時に反転すべきすべてのキャッシュ済みマテリアルを見つけることができます。
集中型の前景更新:レンダラーのスタイルマネージャーは、単一の「前景の変更」リクエストをすべてのマテリアルマネージャー(線、点、塗りつぶし)にルーティングします。各マネージャーはキャッシュ済みのマテリアルを走査し、前景としてタグ付けされたものだけを更新します。
まとめ
| 種類 | 表現 | 解決戦略 |
|---|---|---|
| True Color | RGB | 直接 |
| ACI(1–255) | インデックス | パレット参照 |
| ByLayer | 256 | レイヤへの委譲 |
| ByBlock | 0 | コンテキスト依存 |
| ACI 7 | 7 | 適応型コントラスト |
設計目標
cad-viewer の色システムは、次のことを目的として設計されています:
- ObjectARX のセマンティクスに合わせる
- 論理色の動作(ByLayer / ByBlock)を保持する
- ブラウザで一貫したレンダリングを確保する
- 適応型前景色(ACI 7)を正しく処理する