UNPKG

makerjs-card

Version:
133 lines (109 loc) 4.42 kB
var makerjs = require('makerjs'); var makerjs_logo = require('makerjs-logo'); var makerjs_monotext = require('makerjs-monotext'); function card(w, h, outerRadius, rim, boltRadius, conn, logoOutline, logoScale, logoY, logoAngle, textScale, textY, tabMargin, tabHeight, tabR ) { if (arguments.length == 0) { var defaultValues = makerjs.kit.getParameterValues(card); function v() { return defaultValues.shift(); } w = v(); h = v(); outerRadius = v(); rim = v(); boltRadius = v(); conn = v(); logoOutline = v(); logoScale = v(); logoY = v(); logoAngle = v(); textScale = v(); textY = v(); tabMargin = v(); tabHeight = v(); tabR = v(); } function hCenter(model, y) { var measure = makerjs.measure.modelExtents(model); var mw = measure.high[0]; model.origin = [(w - mw) / 2, y]; return mw; } function flipArcs(roundRect) { function findAndFlip(arcId, origin) { var arc = roundRect.paths[arcId]; arc.startAngle = makerjs.angle.mirror(arc.startAngle, true, true); arc.endAngle = makerjs.angle.mirror(arc.endAngle, true, true); arc.origin = origin; } findAndFlip('BottomLeft', [0, 0]); findAndFlip('BottomRight', [innerW, 0]); findAndFlip('TopLeft', [0, innerH]); findAndFlip('TopRight', [innerW, innerH]); } var outer = new makerjs.models.RoundRectangle(w, h, outerRadius); var bolts = new makerjs.models.BoltRectangle(w - 2 * rim, h - 2 * rim, boltRadius); bolts.origin = [rim, rim]; var logo = makerjs.model.scale(new makerjs_logo(1.06, .3, .35, logoOutline, 8.3, .65, logoAngle, 1, 2.7, 1.32, 2.31), logoScale); hCenter(logo, logoY); var text = makerjs.model.scale(new makerjs_monotext('MAKERJS.ORG'), textScale); var textW = hCenter(text, textY); var tabW = textW + tabMargin; var tab = new makerjs.models.RoundRectangle(tabW, tabHeight, tabR); hCenter(tab, rim - tabR); var innerW = w - 2 * rim; var innerH = h - 2 * rim; var inner = new makerjs.models.RoundRectangle(innerW, innerH, rim); inner.origin = [rim, rim]; flipArcs(inner); this.units = makerjs.unitType.Millimeter; this.paths = {}; var plus = { origin: [w / 2, h / 2], models: { v: makerjs.model.move(new makerjs.models.Rectangle(conn, h * 2), [conn / -2, -h]), h: makerjs.model.move(new makerjs.models.Rectangle(w * 2, conn), [-w, conn / -2]) } } makerjs.model.rotate(plus, -logoAngle, plus.origin); this.models = { text: text, outer: outer, bolts: bolts, innerTab: { models: { inner: inner, tab: tab } }, logoPlus: { models: { plus: plus, logo: logo } } }; makerjs.model.originate(this); makerjs.model.combine(plus.models.h, plus.models.v, false, true, false, true); makerjs.model.combine(plus, logo.models.outline, false, true, false, true); makerjs.model.combine(tab, inner, true, false, false, true); makerjs.model.combine(this.models.logoPlus, this.models.innerTab, true, false, false, true); } card.metaParameters = [ { title: "width", type: "range", min: 30, max: 200, value: 75 }, { title: "height", type: "range", min: 30, max: 200, value: 60 }, { title: "outer radius", type: "range", min: 0, max: 10, step: .5, value: 4 }, { title: "rim", type: "range", min: 1, max: 10, step: .5, value: 4 }, { title: "bolt radius", type: "range", min: 0, max: 5, step: .1, value: 1.5 }, { title: "connector width", type: "range", min: .5, max: 5, step: .1, value: 2.75 }, { title: "logo outline", type: "range", min: .3, max: 3, step: .1, value: 1.3 }, { title: "logo scale", type: "range", min: 1, max: 6, step: .1, value: 3.33 }, { title: "logo y-offset", type: "range", min: 0, max: 30, step: 1, value: 17 }, { title: "logo angle", type: "range", min: 0, max: 45, step: 1, value: 19 }, { title: "text scale", type: "range", min: .005, max: .05, step: .001, value: .03 }, { title: "text y-offset", type: "range", min: 0, max: 10, step: .1, value: 3.5 }, { title: "text margin", type: "range", min: 1, max: 10, step: .1, value: 7 }, { title: "tab height", type: "range", min: 2, max: 15, step: .5, value: 9.5 }, { title: "tab radius", type: "range", min: 0, max: 2, step: .1, value: 1.5 }, ]; module.exports = card;