UNPKG

@jscad/modeling

Version:

Constructive Solid Geometry (CSG) Library for JSCAD

56 lines (49 loc) 1.8 kB
const geom3 = require('../geometries/geom3') const poly3 = require('../geometries/poly3') const { isNumberArray } = require('./commonChecks') /** * Construct an axis-aligned solid cuboid in three dimensional space. * @param {Object} [options] - options for construction * @param {Array} [options.center=[0,0,0]] - center of cuboid * @param {Array} [options.size=[2,2,2]] - dimensions of cuboid; width, depth, height * @returns {geom3} new 3D geometry * @alias module:modeling/primitives.cuboid * * @example * let myshape = cuboid({size: [5, 10, 5]}) */ const cuboid = (options) => { const defaults = { center: [0, 0, 0], size: [2, 2, 2] } const { center, size } = Object.assign({}, defaults, options) if (!isNumberArray(center, 3)) throw new Error('center must be an array of X, Y and Z values') if (!isNumberArray(size, 3)) throw new Error('size must be an array of width, depth and height values') if (!size.every((n) => n >= 0)) throw new Error('size values must be positive') // if any size is zero return empty geometry if (size[0] === 0 || size[1] === 0 || size[2] === 0) return geom3.create() const result = geom3.create( // adjust a basic shape to size [ [[0, 4, 6, 2], [-1, 0, 0]], [[1, 3, 7, 5], [+1, 0, 0]], [[0, 1, 5, 4], [0, -1, 0]], [[2, 6, 7, 3], [0, +1, 0]], [[0, 2, 3, 1], [0, 0, -1]], [[4, 5, 7, 6], [0, 0, +1]] ].map((info) => { const points = info[0].map((i) => { const pos = [ center[0] + (size[0] / 2) * (2 * !!(i & 1) - 1), center[1] + (size[1] / 2) * (2 * !!(i & 2) - 1), center[2] + (size[2] / 2) * (2 * !!(i & 4) - 1) ] return pos }) return poly3.create(points) }) ) return result } module.exports = cuboid