Skip to content

颜色系统 ​

cad-viewer 的颜色系统遵循 AutoCAD ObjectARX 的行为,同时确保在浏览器环境中具有可预测的渲染效果。

它同时支持 AutoCAD 颜色索引(ACI) 和 真彩色(True Color),并通过 AcCmColor 抽象进行统一。

概览 ​

在 AutoCAD 兼容系统中,颜色主要有两种表示方式:

ACI(AutoCAD Color Index) ​

  • 基于整数的颜色系统(0–256)
  • 使用预定义调色板
  • 包含逻辑颜色,这些颜色取决于上下文,而不是固定的 RGB 值

真彩色(True Color) ​

  • 24 位 RGB 颜色(R, G, B)
  • 每个通道的范围为 0–255
  • 独立于 ACI 提供完整的颜色灵活性

AcCmColor ​

cad-viewer 中的所有颜色都使用 AcCmColor 类表示。

它支持:

  • ACI 索引
  • 真彩色(RGB)
  • 逻辑颜色模式(ByLayer / ByBlock)

参考实现:
https://github.com/mlightcad/realdwg-web/blob/main/packages/common/src/AcCmColor.ts

该抽象与 ObjectARX 一致,在 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 颜色。解析遵循基于优先级的流程:

  • 真彩色(最高优先级):如果实体显式定义了真彩色,则直接使用
  • ByLayer 解析:如果颜色为 ByLayer(ACI = 256),则委托给图层解析后的颜色
  • ByBlock 解析:如果颜色为 ByBlock(ACI = 0),则取决于块的插入上下文,如果没有上下文则回退到默认颜色
  • ACI 颜色解析:对于标准 ACI 值(1–255),使用预定义的查找表

cad-viewer 中对 ACI 7 的处理 ​

cad-viewer 将 ACI 7 视为语义颜色,而不是固定的 RGB 值。当背景变化时,它会自动翻转以保持对比度。其工作原理大致如下:

  • 背景变化触发前景更新:当视图的背景颜色变化时,渲染器会被明确指示更新 "foreground" 渲染颜色。规则很简单:

    • 如果背景为黑色,则 ACI 7 使用白色。
    • 如果背景为白色,则 ACI 7 使用黑色。
  • 材质会记住自己是否为 "foreground":创建材质时,会为其打上元数据标记,指示它是否表示前景(ACI 7)实体。这使得系统能够找到所有缓存材质,在前景变化时进行翻转。

  • 集中式前景更新:渲染器的样式管理器会将单个 "change foreground" 请求路由到所有材质管理器(线、点、填充)。每个管理器遍历其缓存材质,仅更新标记为前景的材质。

汇总 ​

类型表示解析策略
真彩色RGB直接使用
ACI(1–255)索引调色板查找
ByLayer256委托给图层
ByBlock0依赖上下文
ACI 77自适应对比度

设计目标 ​

cad-viewer 颜色系统的设计目标是:

  • 与 ObjectARX 语义保持一致
  • 保留逻辑颜色行为(ByLayer / ByBlock)
  • 确保在浏览器中的渲染一致性
  • 正确处理自适应前景色(ACI 7)