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 | 6x 6x 6x 6x 6x 6x 9x 5x 5x 5x 5x 5x 5x 5x 14x 4x 1x 3x 3x 3x 3x 3x 3x 3x 114x 8550x 8550x 3x 3x 4x 4x | import { CustomVisibilityMesh } from "../customVisibilityMesh" import { GeometryOptions } from "../../preview3DPrintMesh" import { BackPrintColorChangeStrategy } from "../../ColorChangeStrategies/backPrintColorChangeStrategy" import { BoxGeometry, BufferGeometry } from "three" import * as QRCode from "qrcode" import * as BufferGeometryUtils from "three/examples/jsm/utils/BufferGeometryUtils.js" export class QrCodeMesh extends CustomVisibilityMesh { constructor(name: string) { super(name, new BackPrintColorChangeStrategy(), 0, false) } async init(geometryOptions: GeometryOptions): Promise<QrCodeMesh> { this.geometry = await this.create(geometryOptions) const xPosition = 0.45 const yPosition = 0.45 const zPosition = -geometryOptions.baseplateHeight + geometryOptions.printHeight / 2 this.position.set(xPosition, yPosition, zPosition) this.updateColor(geometryOptions.numberOfColors) return this } async changeText(geometryOptions: GeometryOptions): Promise<void> { this.geometry = await this.create(geometryOptions) } async create(geometryOptions: GeometryOptions): Promise<BufferGeometry> { if (!geometryOptions.qrCodeText || geometryOptions.qrCodeText.length === 0) { return new BufferGeometry() } const canvas = document.createElement("canvas") await QRCode.toCanvas(canvas, geometryOptions.qrCodeText, { errorCorrectionLevel: "H" }) //high error correction works (counter intuitively) way better than low error correction const context = canvas.getContext("2d") const imageData = context.getImageData(0, 0, canvas.width, canvas.height) const qrCodeGeometries: BufferGeometry[] = [] const pixelSize = 0.6 / imageData.width // Loop over each pixel in the image for (let y = 0; y < imageData.height; y += 4) { for (let x = 0; x < imageData.width; x += 4) { const index = (y * imageData.width + x) * 4 Iif (imageData.data[index] !== 0) { const geometry = new BoxGeometry(pixelSize, pixelSize, geometryOptions.printHeight) geometry.translate((-x / 4) * pixelSize, (-y / 4) * pixelSize, 0) qrCodeGeometries.push(geometry) } } } this.updateMinWidth(pixelSize) return BufferGeometryUtils.mergeGeometries(qrCodeGeometries) } private updateMinWidth(pixelSize: number) { const minWidthOfOneQRCodePixel = 0.6 //mm I tested this value on the prusaXL with 0.4mm nozzle this.minWidth = minWidthOfOneQRCodePixel / pixelSize } } |