染色插件

染色是指对模型进行颜色填充或调整,以增强模型的视觉效果或表达特定的信息。

染色插件

染色是指对模型进行颜色填充或调整,以增强模型的视觉效果或表达特定的信息。

我们在SDK中提供的染色插件 ColorizerPlugin,是为了方便对BIM模型即BuildingLayer这个图层进行染色修改。

1. 功能说明

在场景中给BIM模型按需添加需要染色的构件部位。

2. 构造

在SDK中实例化染色插件,代码示例如下:

const colorizerPlugin = new ubm.ColorizerPlugin()

3. 属性

属性类型可选说明
fieldstring---着色属性
layersILayer[]---着色图层
effectsEffectItem[]---着色合集
defaultEffectEffect---默认着色效果

3.1 着色属性

根据field属性来判断如何进行染色,默认值为空,即间接染色;当不为空时,为直接染色。

如设置直接染色的字段为guid,代码示例如下:

colorizerPlugin.field = 'guid'

3.2 着色图层

设置对那些图层进行染色操作,这是一个图层集合。代码示例如下:

colorizerPlugin.layers = [layer, layer2]

3.3 着色合集

设置图层的着色效果,这是一个效果集合。

效果集合EffectItem的数据结构如下:

  • 着色
interface EffectItem {
  // 染色图层,此处单独设置的图层优先级最高
  layers:ILayer[]
  // 染色条件
  condition: string|string[]|number[]
  // 染色效果
  effect: Effect
}
  • 染色效果
interface Effect {
  // 类型: `mesh-3d`
  type: string
  // 阴影,只有在给场景设置阴影才有效果
  shadow: boolean
  // 填充颜色
  fill: Fill
  // 填充轮廓
  border?: Border
}
  • 填充颜色
interface Fill {
  // 填充颜色
  color: string | number[]
  // 填充颜色与原始材质的处理方式
  colorMixMode?: ColorMixMode
}
  • 填充轮廓
interface Border {
  // 边的类型
  type: Edges3DType
  // 边的大小
  size: number
  // 颜色
  color: string | number[]
  // 边的扩展长度
  extensionLength?: number
}
  • 边的类型
// 素描风格'sketch' , 实线风格'solid'
type Edges3DType = 'sketch' | 'solid'
  • 填充颜色与原始材质的处理方式
// 用颜色替换材质'replace' , 材质灰度'tint' , 颜色材质混合'multiply'
type ColorMixMode = 'replace' | 'tint' | 'multiply'

4. 方法

方法说明
addEffect()添加染色
render()染色执行
clear()清空染色

4.1 添加染色

addEffect(effectItem: EffectItem): void

参数effectItem的数据结构参考属性参数effects,注意此处为单个条件着色。

在模型加载后添加染色效果,代码示例如下:

colorizerPlugin.addEffect({
  layers: [layer2],
  condition: ["a6aa132d-ccd7-408f-b2f9-ed67350f3a70"],
  effect: {
    type: 'mesh-3d',
    fill: { color: 'rgba(23, 153, 23,0.8)', colorMixMode: 'replace' },
    border: {
      type: 'solid',
      color: 'rgba(23, 153, 223, 0.01)',
      size: 1,
    },
  }
})

4.2 染色执行

render(): void

调用插件的 render() 方法,对设置的图层和着色条件效果进行着色处理,代码示例如下:

// 对上述条件进行着色处理
colorizerPlugin.render()

注:这一步很重要,进行了染色操作必须执行,否则染色效果不会生效。

4.3 清空染色

clear(): void

清空条件着色,回到原始效果。使用方法如下:

colorizerPlugin.clear()

5. 使用

染色的使用分为以下三步:

5.1 设置着色图层

区别于一般插件,染色插件在注册完后需要先设置插件的着色图层,再去调用方法。

我们使用插件的 layers 属性,来指定需要染色的图层,代码示例如下:

// 使用BIM模型
const layer = new ubm.BuildingLayer({...})
// 场景中添加图层
scene.layer.add(layer)
// 设置插件着色图层
colorizerPlugin.layers = [layer]

也可以对场景中的多个图层同时进行着色,代码示例如下:

// 初始化多个BIM模型图层
const layer = new ubm.BuildingLayer({...})
const layer2 = new ubm.BuildingLayer({...})
// 场景中添加多个图层
scene.layer.add([layer, layer2])
// 设置插件着色图层
colorizerPlugin.layers = [layer, layer2]

5.2 设置染色

图层的染色有两种使用形式:直接染色和间接染色。说明如下:

注:直接染色和间接染色不可同时使用。

  • 直接染色

通过指定field过滤的属性名,然后在condition数组中添加对应属性值,可直接对具体的构件进行染色,此方式执行效率较高。

// 设置field
colorizerPlugin.field = 'guid'
// 设置着色条件及效果
colorizerPlugin.effects = [{
  // 过滤出需要染色的构件
  condition: ["442049d1-20b8-4e26-b2e0-c9938030630f", "f13ff8b1-ef43-4441-a84e-ee16a9ad555f"],
  // 着色效果
  effect: {
    type: 'mesh-3d',
    fill: { color: 'rgba(123, 53, 223,0.5)', colorMixMode: 'replace' },
    border: {
      type: 'solid',
      color: 'rgba(229, 229, 229, 0.3)',
      size: 1,
    },
  }
},...]
  • 间接染色

插件默认就是间接染色,因为是对整个模型进行着色,所以不需要指定field,即field为空。但可以通过条件表达式来控制着色效果。

  // 设置field
  colorizerPlugin.field = ''
  // 设置着色条件及效果
  colorizerPlugin.effects = [{
    // 对模型id为1的构件进行着色
    condition:`$feature.id == 1`,
    effect:{
      type: 'mesh-3d',
      fill: { color: 'green', colorMixMode:'replace' },
      border: {
        type: 'solid',
        color: [10, 10, 10, 1],
        size: 1,
      },
    }
  },{
    // 对构件分类为Planting的构件进行着色
    condition:`$feature.of_category == "Planting"`,
    effect:{
      type: 'mesh-3d',
      fill: { color: 'red', colorMixMode:'replace' }
    }
  }]

上述condition的条件语句也叫条件表达式,用于控制染色效果的显示。

表达式中构件变量需要使用 $feature. 作为前缀,后缀为模型上的构件属性。

注:模型构件信息可通过图层的点击事件返回值中得到,具体做法请参看图层简介的图层事件。

运算符前后需要有空格,如果运算对象是字符串,需要加上单引号,一些条件运算符如下所示:

类型运算符示例
大于>$feature.id > 1
小于<$feature.id < 1
等于==$feature.id == 1
不等于!=$feature.id != 1
&&$feature.id > 1 && $feature.of_category == "Planting"
||$feature.id > 1 || $feature.id == 0

5.3 执行染色

即调用方法render()来让设置的染色效果在图层上生效。这一步很重要,未执行的话,则场景中不会显示染色效果。

BIMFlux AI