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 | 11x 11x 11x 11x 28x 28x 28x 28x 26x 26x 26x 26x 26x 26x 26x 26x 26x 26x 26x 26x 26x 26x 26x 21x 5x 5x 26x | import { BufferGeometry, ExtrudeGeometry } from "three" import { SVGLoader } from "three/examples/jsm/loaders/SVGLoader" import { CreateGeometryStrategy, CreateGeometryStrategyOptions } from "./createGeometryStrategy" import { GeometryOptions } from "../preview3DPrintMesh" import * as BufferGeometryUtils from "three/examples/jsm/utils/BufferGeometryUtils.js" export interface CreateSvgGeometryStrategyOptions extends CreateGeometryStrategyOptions { filePath: string size: number side: "front" | "back" } export class CreateSvgGeometryStrategy implements CreateGeometryStrategy { async create( geometryOptions: GeometryOptions, createSvgGeometryStrategyOptions: CreateSvgGeometryStrategyOptions ): Promise<BufferGeometry> { const filePath = createSvgGeometryStrategyOptions.filePath const loader = new SVGLoader() return new Promise((resolve, reject) => { loader.load( filePath, function (data) { const paths = data.paths const geometries: BufferGeometry[] = [] for (const path of paths) { const shapes = path.toShapes(true) for (const shape of shapes) { const geometry = new ExtrudeGeometry(shape, { depth: geometryOptions.printHeight, bevelEnabled: false }) geometries.push(geometry) } } const mergedGeometry = BufferGeometryUtils.mergeGeometries(geometries) mergedGeometry.computeBoundingBox() const width = mergedGeometry.boundingBox.max.x - mergedGeometry.boundingBox.min.x const depth = mergedGeometry.boundingBox.max.y - mergedGeometry.boundingBox.min.y const scale = createSvgGeometryStrategyOptions.size / Math.max(width, depth) mergedGeometry.scale(scale, scale, 1) mergedGeometry.center() if (createSvgGeometryStrategyOptions.side === "back") { mergedGeometry.rotateZ(Math.PI) } else { mergedGeometry.rotateZ(Math.PI) mergedGeometry.rotateY(Math.PI) } resolve(mergedGeometry) }, undefined, function (error) { console.error(`Error loading ${filePath}`) reject(error) } ) }) } } |