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 | 11x 11x 11x 11x 91x 91x 1x 90x 90x 44x 90x 90x 90x 45x 90x 90x 90x 90x 90x 90x 6x 6x 6x 12x 12x 12x 12x 6x | import { BufferGeometry } from "three"
import { TextGeometry } from "three/examples/jsm/geometries/TextGeometry"
import { Font } from "three/examples/jsm/loaders/FontLoader"
import { CreateGeometryStrategy, CreateGeometryStrategyOptions } from "./createGeometryStrategy"
import { GeometryOptions } from "../preview3DPrintMesh"
import * as BufferGeometryUtils from "three/examples/jsm/utils/BufferGeometryUtils.js"
export interface CreateTextGeometryStrategyOptions extends CreateGeometryStrategyOptions {
font: Font
text: string
side: "front" | "back"
xPosition: number
yPosition: number
align: "center" | "left"
textSize?: number
}
export class CreateTextGeometryStrategy implements CreateGeometryStrategy {
async create(
geometryOptions: GeometryOptions,
createTextGeometryStrategyOptions: CreateTextGeometryStrategyOptions
): Promise<BufferGeometry> {
const { font, side, text, xPosition, yPosition, align } = createTextGeometryStrategyOptions
if (!text) {
return new BufferGeometry()
}
let { textSize } = createTextGeometryStrategyOptions
if (!textSize) {
textSize = 0.025
}
const textGeometry =
align === "center" && text.includes("\n")
? this.createMultilineCenteredTextGeometry(text, font, textSize, geometryOptions.printHeight)
: new TextGeometry(text, {
font,
size: textSize,
height: geometryOptions.printHeight
})
textGeometry.center()
if (side === "back") {
textGeometry.rotateY(Math.PI)
}
textGeometry.computeBoundingBox()
const textWidth = textGeometry.boundingBox.max.x - textGeometry.boundingBox.min.x
const xPositionOffset = align === "center" ? 0 : textWidth / 2
const xPositionDirection = side === "front" ? 1 : -1
textGeometry.translate(
xPositionDirection * (xPositionOffset + xPosition),
yPosition,
side === "front" ? geometryOptions.printHeight / 2 : -geometryOptions.baseplateHeight + geometryOptions.printHeight / 2
)
return textGeometry
}
private createMultilineCenteredTextGeometry(text: string, font: Font, size: number, height: number) {
const lines = text.split("\n")
const lineGeometries: BufferGeometry[] = []
for (const [index, line] of lines.entries()) {
const lineGeometry = new TextGeometry(line, {
font,
size,
height
})
lineGeometry.center()
lineGeometry.translate(0, -index * size * 1.5, 0)
lineGeometries.push(lineGeometry)
}
return BufferGeometryUtils.mergeGeometries(lineGeometries)
}
}
|