All files / app/codeCharta/services/3DExports/3DPreview/MeshModels/BackMeshModels metricDescriptionBlockMesh.ts

100% Statements 23/23
100% Branches 0/0
100% Functions 5/5
100% Lines 23/23

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 837x 7x       7x 7x   7x                   7x         17x 17x 17x   17x 17x 17x       16x   14x   14x   14x   14x   14x               10x                           16x         14x 14x       12x              
import { CustomVisibilityMesh } from "../customVisibilityMesh"
import { CreateSvgGeometryStrategy } from "../../CreateGeometryStrategies/createSvgGeometryStrategy"
import { GeometryOptions } from "../../preview3DPrintMesh"
import { BufferGeometry } from "three"
import { Font } from "three/examples/jsm/loaders/FontLoader"
import { BackPrintColorChangeStrategy } from "../../ColorChangeStrategies/backPrintColorChangeStrategy"
import { CreateTextGeometryStrategy } from "../../CreateGeometryStrategies/createTextGeometryStrategy"
import { NodeMetricData } from "../../../../../codeCharta.model"
import * as BufferGeometryUtils from "three/examples/jsm/utils/BufferGeometryUtils.js"
 
export interface MetricDescriptionBlockOptions {
    name: string
    title: string
    iconFilename: string
    iconScale: number
    nodeMetricData: NodeMetricData
}
 
export class MetricDescriptionBlockMesh extends CustomVisibilityMesh {
    private readonly createSvgGeometryStrategy: CreateSvgGeometryStrategy
    private readonly createTextGeometryStrategy: CreateTextGeometryStrategy
 
    constructor(
        public metricDescriptionBlockOptions: MetricDescriptionBlockOptions,
        public font: Font,
        private yOffset: number
    ) {
        super(metricDescriptionBlockOptions.name, new BackPrintColorChangeStrategy(), 200, true)
        this.createSvgGeometryStrategy = new CreateSvgGeometryStrategy()
        this.createTextGeometryStrategy = new CreateTextGeometryStrategy()
    }
 
    async init(geometryOptions: GeometryOptions): Promise<MetricDescriptionBlockMesh> {
        const iconGeometry = await this.createIconGeometry(this.createSvgGeometryStrategy, geometryOptions)
 
        const textGeometry = await this.createTextGeometry(this.createTextGeometryStrategy, this.getText(), geometryOptions)
 
        this.geometry = BufferGeometryUtils.mergeGeometries([iconGeometry, textGeometry])
 
        this.position.y = -0.15 + this.yOffset
 
        this.updateColor(geometryOptions.numberOfColors)
 
        return this
    }
 
    async createTextGeometry(
        createTextGeometryStrategy: CreateTextGeometryStrategy,
        text: string,
        geometryOptions: GeometryOptions
    ): Promise<BufferGeometry> {
        return createTextGeometryStrategy.create(geometryOptions, {
            font: this.font,
            text,
            side: "back",
            xPosition: 0.05,
            yPosition: 0,
            align: "left"
        })
    }
 
    private async createIconGeometry(
        createSvgGeometryStrategy: CreateSvgGeometryStrategy,
        geometryOptions: GeometryOptions
    ): Promise<BufferGeometry> {
        const iconGeometry = await createSvgGeometryStrategy.create(geometryOptions, {
            filePath: `codeCharta/assets/${this.metricDescriptionBlockOptions.iconFilename}`,
            size: this.metricDescriptionBlockOptions.iconScale,
            side: "back"
        })
        iconGeometry.translate(0, 0, -geometryOptions.baseplateHeight + geometryOptions.printHeight / 2)
        return iconGeometry
    }
 
    getText(): string {
        return (
            `${this.metricDescriptionBlockOptions.nodeMetricData.name}\n` +
            `${this.metricDescriptionBlockOptions.title}\n` +
            `Value range: ${this.metricDescriptionBlockOptions.nodeMetricData.minValue} - ${this.metricDescriptionBlockOptions.nodeMetricData.maxValue}`
        )
    }
}