Add an overlap flag which will add or remove extra flaps of material to attach to an adjacent side.

This commit is contained in:
mmcw-dev 2017-12-27 20:05:51 -05:00
parent ff89a60e0c
commit 091b2222bc
4 changed files with 357 additions and 23 deletions

View File

@ -27,7 +27,9 @@ const bellows = require('bellows')
| [options.backOH] | <code>Integer</code> | Back outer height of bellows in pixels |
| [options.maxLength] | <code>Integer</code> | Maximum length of bellows in pixels |
| [options.align] | <code>Integer</code> | Vertical alignment adjustment in pixels |
| [options.parts] | <code>Integer</code> | Number of parts to split pattern into: 1, 2, or 4 returns {String} Base64 encoded png data |
| [options.parts] | <code>Integer</code> | Number of parts to split pattern into: 1, 2, or 4 |
| [options.key] | <code>Boolean</code> | Print key on page |
| [options.overlap] | <code>Boolean</code> | Add overlapping flap between parts returns {String} Base64 encoded png data |
**Example**
```js

View File

@ -105,6 +105,10 @@ input{
<label for="key">Show Key</label>
<input name="key" type="checkbox" checked />
</div>
<div>
<label for="overlap">Add Overlapping Tab</label>
<input name="overlap" type="checkbox" checked />
</div>
</div>
</form>
<div>
@ -112,8 +116,8 @@ input{
<button id="download" onclick="download();">Download</button>
</div>
<img id="img" />
<!--<script src="../src/bellows.js"> </script>-->
<script src="https://rawgit.com/sixteenmillimeter/bellows/master/src/bellows.js">
<script src="../src/bellows.js"> </script>
<!--<script src="https://rawgit.com/sixteenmillimeter/bellows/master/src/bellows.js">-->
</script>
<script>
'use script'
@ -144,7 +148,8 @@ input{
const maxLength = Math.round($('maxLength').value * MM);
const key = $('key').checked
const key = $('key').checked;
const overlap = $('overlap').checked;
const align = Math.round($('align').value);
let parts = Math.round($('parts').value);
@ -171,7 +176,8 @@ input{
maxLength : maxLength,
parts : parts,
align : align,
key : key
key : key,
overlap : overlap
}
);
document.getElementById('img').setAttribute('src', B);

181
example/index.html Normal file
View File

@ -0,0 +1,181 @@
<!doctype html>
<html>
<head>
<title>Bellows Browser Example</title>
<style>
form{
clear: both;
}
form:after{
display: block;
content: " ";
}
label{
width: 150px;
display: inline-block;
}
form > div {
width: 400px;
float: left;
margin: 20px 0;
}
img{
width: 100%;
height: auto;
border: 1px solid #000;
}
button{
margin: 10px 20px;
}
input{
margin-top: 10px;
}
</style>
</head>
<body>
<h1>
Bellows Pattern Generator
</h1>
<div>
<a href="https://github.com/sixteenmillimeter/bellows">View Source</a>
</div>
<form onsubmit="return false;">
<div>
<div>
<label for="backOW">Back Outer Width</label>
<input name="backOW" type="number" value="50" /> mm
</div>
<div>
<label for="backIW">Back Inner Width</label>
<input name="backIW" type="number" value="40" /> mm
</div>
<div>
<label for="backOH">Back Outer Height</label>
<input name="backOH" type="number" value="50" /> mm
</div>
<div>
<label for="backIH">Back Inner Height</label>
<input name="backIH" type="number" value="40" /> mm
</div>
</div>
<div>
<div>
<label for="frontOW">Front Outer Width</label>
<input name="frontOW" type="number" value="50" /> mm
</div>
<div>
<label for="frontIW">Front Inner Width</label>
<input name="frontIW" type="number" value="40" /> mm
</div>
<div>
<label for="frontOH">Front Outer Height</label>
<input name="frontOH" type="number" value="50" /> mm
</div>
<div>
<label for="frontIH">Front Inner Height</label>
<input name="frontIH" type="number" value="40" /> mm
</div>
</div>
<div>
<div>
<label for="pageW">Sheet Width</label>
<input name="pageW" type="number" value="8.5" /> in
</div>
<div>
<label for="pageH">Sheet Height</label>
<input name="pageH" type="number" value="11" /> in
</div>
<div>
<label for="dpi">DPI</label>
<input name="dpi" type="number" value="300" />
</div>
<div>
<label for="maxLength">Maximum Length</label>
<input name="maxLength" type="number" value="200" /> mm
</div>
<div>
<label for="parts">Seperate Parts</label>
<input name="parts" type="number" value="1" min="1" max="4" /> 1, 2, or 4
</div>
<div>
<label for="align">Adjust Alignment</label>
<input name="align" type="number" value="0" min="0" />
</div>
</div>
</form>
<div>
<button id="refresh" onclick="refresh();">Refresh</button>
<button id="download" onclick="download();">Download</button>
</div>
<img id="img" />
<script src="../src/bellows.js"> </script>
<script>
'use script'
const $ = function (select) {
return document.querySelector(`[name="${select}"]`)
}
let B
function refresh () {
const IN = 25.4
const DPI = $('dpi').value
const MM = DPI / IN
const pageW = Math.round($('pageW').value * DPI);
const pageH = Math.round($('pageH').value * DPI);
const backOW = Math.round($('backOW').value * MM);
const backIW = Math.round($('backIW').value * MM);
const backOH = Math.round($('backOH').value * MM);
const backIH = Math.round($('backIH').value * MM);
const frontOW = Math.round($('frontOW').value * MM);
const frontIW = Math.round($('frontIW').value * MM);
const frontOH = Math.round($('frontOH').value * MM);
const frontIH = Math.round($('frontIH').value * MM);
const maxLength = Math.round($('maxLength').value * MM);
const align = Math.round($('align').value);
let parts = Math.round($('parts').value);
if (parts === 3 || parts > 4) {
parts = 1
}
B = bellows(
{
dpi : DPI,
pageW : pageW,
pageH : pageH,
backOW : backOW,
backIW : backIW,
backOH : backOH,
backIH : backIH,
frontOW : frontOW,
frontIW : frontIW,
frontOH : frontOH,
frontIH : frontIH,
maxLength : maxLength,
parts : parts,
align : align
}
);
document.getElementById('img').setAttribute('src', B);
}
function download () {
const a = document.createElement('a');
a.href = B;
a.download = 'bellows.png';
a.click();
}
refresh()
</script>
</body>
</html

View File

@ -76,6 +76,8 @@ function taper (back, front, length, pos) {
* @param {Integer} [options.maxLength] Maximum length of bellows in pixels
* @param {Integer} [options.align] Vertical alignment adjustment in pixels
* @param {Integer} [options.parts] Number of parts to split pattern into: 1, 2, or 4
* @param {Boolean} [options.key] Print key on page
* @param {Boolean} [options.overlap] Add overlapping flap between parts
*
* returns {String} Base64 encoded png data
*
@ -113,6 +115,7 @@ function bellows (options = {}) {
let centerY = Math.round(pageH / 2)
let key = (typeof options.key !== 'undefined' && options.key === false) ? false : true
let over = (typeof options.overlap !== 'undefined' && options.overlap === false) ? false : true
let fold = (frontOW - frontIW) / 2
let folds = Math.floor(maxLength / fold)
@ -156,8 +159,18 @@ function bellows (options = {}) {
if (side === 1 || parts === 4 || (parts === 2 && side === 3)) {
line(ctx, BLACK, [X, Y], [X + frontOffset, Y + length])
}
if (parts === 4) {
if (parts === 4 && !over) {
line(ctx, BLACK, [X + backOW, Y], [X + backOW - frontOffset, Y + length])
for (let i = 1; i < folds; i++) {
if (i % 2 === 0) {
if (backIW !== frontIW) {
t = taper(backIW, frontIW, length, i * fold)
} else {
t = 0
}
line(ctx, BLACK, [foldIN + backIW - t, Y + (i * fold)], [foldIN + backIW - t + ((backOW - backIW) / 2), Y + (i * fold)])
}
}
}
//inner
//line(ctx, BLACK, [X + ((backOW - backIW) / 2), Y], [X + ((backOW - backIW) / 2) + frontOffset, Y + length])
@ -198,7 +211,11 @@ function bellows (options = {}) {
t = 0
t2 = 0
}
dash(ctx, BLUE, dpi, [foldIN + t, Y + i * fold ], [foldIN - ((backOW - backIW) / 2) + t2, (Y + (i + 1) * fold) ])
if (side === 1 || parts > 1) {
line(ctx, BLACK, [foldIN + t, Y + i * fold ], [foldIN - ((backOW - backIW) / 2) + t2, (Y + (i + 1) * fold) ])
} else {
dash(ctx, BLUE, dpi, [foldIN + t, Y + i * fold ], [foldIN - ((backOW - backIW) / 2) + t2, (Y + (i + 1) * fold) ])
}
} else {
if (backIW !== frontIW) {
t = taper(backIW, frontIW, length, i * fold)
@ -207,7 +224,11 @@ function bellows (options = {}) {
t = 0
t2 = 0
}
dash(ctx, BLUE, dpi, [foldOUT + t, Y + i * fold ], [foldIN + t2, (Y + (i + 1) * fold) ])
if (side === 1 || parts > 1) {
line(ctx, BLACK, [foldOUT + t, Y + i * fold ], [foldIN + t2, (Y + (i + 1) * fold) ])
} else {
dash(ctx, BLUE, dpi, [foldOUT + t, Y + i * fold ], [foldIN + t2, (Y + (i + 1) * fold) ])
}
}
//
}
@ -250,8 +271,20 @@ function bellows (options = {}) {
if (parts === 4) {
line(ctx, BLACK, [X, Y], [X + frontOffset, Y + length])
}
if (parts !== 1 || side === 4) {
if ((parts !== 1 || side === 4) && !over) {
line(ctx, BLACK, [X + backOH, Y], [X + backOH - frontOffset, Y + length])
//cut marks
for (let i = 1; i < folds; i++) {
if (i % 2 !== 0) {
if (backIH !== frontIH) {
t = taper(backIH, frontIH, length, i * fold)
} else {
t = 0
}
line(ctx, BLACK, [foldIN + backIH - t, Y + (i * fold)], [foldIN + backIH - t + ((backOH - backIH) / 2), Y + (i * fold)])
}
}
}
//inner
//line(ctx, BLACK, [X + ((backOH - backIH) / 2), Y], [X + ((backOH - backIH) / 2) + frontOffset, Y + length])
@ -278,7 +311,7 @@ function bellows (options = {}) {
} else {
t = 0
}
//fold in
//fold i
dash(ctx, RED, dpi, [foldOUT + t, Y + (i * fold)], [foldOUT + backOH - t, Y + (i * fold)])
}
}
@ -293,7 +326,12 @@ function bellows (options = {}) {
t = 0
t2 = 0
}
dash(ctx, BLUE, dpi, [foldIN + t, Y + i * fold ], [foldIN - ((backOH - backIH) / 2) + t2, (Y + (i + 1) * fold) ])
if (parts === 4){
line(ctx, BLACK, [foldIN + t, Y + i * fold ], [foldIN - ((backOH - backIH) / 2) + t2, (Y + (i + 1) * fold) ])
} else {
dash(ctx, BLUE, dpi, [foldIN + t, Y + i * fold ], [foldIN - ((backOH - backIH) / 2) + t2, (Y + (i + 1) * fold) ])
}
} else {
if (backIH !== frontIH) {
t = taper(backIH, frontIH, length, i * fold)
@ -302,7 +340,11 @@ function bellows (options = {}) {
t = 0
t2 = 0
}
dash(ctx, BLUE, dpi, [foldOUT + t, Y + i * fold ], [foldIN + t2, (Y + (i + 1) * fold) ])
if (parts === 4) {
line(ctx, BLACK, [foldOUT + t, Y + i * fold ], [foldIN + t2, (Y + (i + 1) * fold) ])
} else {
dash(ctx, BLUE, dpi, [foldOUT + t, Y + i * fold ], [foldIN + t2, (Y + (i + 1) * fold) ])
}
}
//
}
@ -331,15 +373,90 @@ function bellows (options = {}) {
}
function overlap (side) {
const frontOffset = Math.round((backOW - frontOW) / 2)
const X = -backOW / 2
const Y = -length / 2
let foldIN = X + ((backOW - backIW) / 2) //inside
let foldOUT = X //outside
const Y = -length / 2
let X
let frontOffset
let foldIN
let foldOUT
let t
let t2
let backO
let backI
let frontO
let frontI
if (side % 2 === 0) {
X = -backOH / 2
foldIN = X + ((backOH - backIH) / 2)
frontOffset = Math.round((backOH - frontOH) / 2)
backI = backIH
backO = backOH
frontI = frontIH
frontO = frontOH
} else {
X = -backOW / 2
foldIN = X + ((backOW - backIW) / 2)
frontOffset = Math.round((backOW - frontOW) / 2)
backI = backIW
backO = backOW
frontI = frontIW
frontO = frontOW
}
foldOUT = X
//sides
if (side === 1 || parts === 4 || (parts === 2 && side === 3)) {
//line(ctx, BLACK, [X, Y], [X + frontOffset, Y + length])
}
line(ctx, BLACK, [X + (backO * 0.3) + ((backO - backI) / 2), Y], [foldOUT + (backO * 0.3) + ((backO - backI) / 2), Y + length])
//top
line(ctx, BLACK, [X, Y], [X + (backO * 0.3) + ((backO - backI) / 2), Y])
//bottom
line(ctx, BLACK, [X + frontOffset, Y + length], [foldOUT + (backO * 0.3) + ((backO - backI) / 2), Y + length])
//fold lines
for (let i = 1; i < folds; i++) {
if (side % 2 === 0) {
if (i % 2 === 0) {
if (backI !== frontI) {
t = taper(backI, frontI, length, i * fold)
} else {
t = 0
}
//fold out
dash(ctx, BLUE, dpi, [foldIN + t, Y + (i * fold)], [foldIN + (backO * 0.3), Y + (i * fold)])
} else {
if (backO !== frontO) {
t = taper(backO, frontO, length, i * fold)
} else {
t = 0
}
//fold in
dash(ctx, RED, dpi, [foldOUT + t, Y + (i * fold)], [foldOUT + (backO * 0.3) + ((backO - backI) / 2), Y + (i * fold)])
}
} else {
if (i % 2 !== 0) {
if (backI !== frontI) {
t = taper(backI, frontI, length, i * fold)
} else {
t = 0
}
//fold out
dash(ctx, BLUE, dpi, [foldIN + t, Y + (i * fold)], [foldIN + (backO * 0.3), Y + (i * fold)])
} else {
if (backO !== frontO) {
t = taper(backO, frontO, length, i * fold)
} else {
t = 0
}
//fold in
dash(ctx, RED, dpi, [foldOUT + t, Y + (i * fold)], [foldOUT + (backO * 0.3) + ((backO - backI) / 2), Y + (i * fold)])
}
}
}
}
if (key) {
@ -365,7 +482,14 @@ function bellows (options = {}) {
sideW(1)
if (parts === 4) {
ctx.translate(backOH - backIH + (0.2 * backOW), 0)
if (over) {
ctx.translate((backOW / 2) + (backOH / 2) - ( ((backOW - frontIW) + (backOH - frontIH)) / 4 ), align)
ctx.rotate((angleW + angleH) / 2)
overlap(1)
ctx.rotate(-(angleW + angleH) / 2)
ctx.translate(-(backOW / 2) - (backOH / 2) + ( ((backOW - frontIW) + (backOH - frontIH)) / 4), -align)
}
ctx.translate(backOW - backIW + (0.3 * backOW), 0)
}
ctx.translate((backOW / 2) + (backOH / 2) - (((backOW - frontIW) + (backOH - frontIH)) / 4), align)
@ -373,21 +497,42 @@ function bellows (options = {}) {
sideH(2)
if (parts === 4 || parts === 2) {
ctx.translate(backOW - backIW, 0)
if (over) {
ctx.translate((backOW / 2) + (backOH / 2) - ( ((backOW - frontIW) + (backOH - frontIH)) / 4 ), align)
ctx.rotate((angleW + angleH) / 2)
overlap(2)
ctx.rotate(-(angleW + angleH) / 2)
ctx.translate(-(backOW / 2) - (backOH / 2) + ( ((backOW - frontIW) + (backOH - frontIH)) / 4), -align)
}
ctx.translate(backOH - backIH + (0.3 * backOH), 0)
}
ctx.translate((backOW / 2) + (backOH / 2) - (((backOW - frontIW) + (backOH - frontIH)) / 4), align)
ctx.rotate((angleW + angleH) / 2)
sideW(3)
if (parts === 4) {
ctx.translate(backOH - backIH, 0)
if (parts === 4) {
if (over) {
ctx.translate((backOW / 2) + (backOH / 2) - ( ((backOW - frontIW) + (backOH - frontIH)) / 4 ), align)
ctx.rotate((angleW + angleH) / 2)
overlap(3)
ctx.rotate(-(angleW + angleH) / 2)
ctx.translate(-(backOW / 2) - (backOH / 2) + ( ((backOW - frontIW) + (backOH - frontIH)) / 4), -align)
}
ctx.translate(backOW - backIW + (0.3 * backOW), 0)
}
ctx.translate((backOW / 2) + (backOH / 2) - (((backOW - frontIW) + (backOH - frontIH)) / 4), align)
ctx.rotate((angleW + angleH) / 2)
sideH(4)
if (over) {
ctx.translate((backOW / 2) + (backOH / 2) - (((backOW - frontIW) + (backOH - frontIH)) / 4), align)
ctx.rotate((angleW + angleH) / 2)
overlap(4)
}
return canvas.toDataURL()
}