2015-08-28 11:34:49 +02:00
<!DOCTYPE html>
< html >
< head >
< meta http-equiv = "Content-Type" content = "text/html; charset=UTF-8" / >
< title > open source hardware logo customisation< / title >
< script type = "text/javascript" src = "cvlp_lib.js" > < / script >
< script type = "text/javascript" src = "lib/FileSaver.min.js" > < / script >
< script type = "text/javascript" src = "lib/jszip.min.js" > < / script >
< / head >
< body onload = "draw()" >
< script type = "text/javascript" >
// the OSHW logo
var logo = {
"name": "open source hardware logo",
2015-09-05 09:25:11 +02:00
"author": "King Kévin",
2015-08-28 11:34:49 +02:00
"version": 0,
"date": "2015-04-11 13:58:46+02:00",
"unit": "mm",
"elements": []
}
// draw logo
function draw() {
// get values
2015-08-28 11:58:30 +02:00
var pad_size = parseFloat(pad_size_input.value)
var pad_thickness = parseFloat(pad_thickness_input.value)
var pad_spacing = parseFloat(pad_spacing_input.value)
var pad_chip_spacing = parseFloat(pad_chip_spacing_input.value)
var chip_thickness = parseFloat(chip_thickness_input.value)
var text_thickness = parseFloat(text_thickness_input.value)
2015-08-28 11:34:49 +02:00
// set values in logo
2015-09-05 09:25:11 +02:00
var size = pad_size+pad_chip_spacing*2+pad_spacing*5+pad_chip_spacing*2+pad_size
2015-08-28 11:34:49 +02:00
logo.width = size
logo.height = size
2015-08-30 10:31:37 +02:00
var select = document.getElementById("unit")
var unit = select.options[select.selectedIndex].value
logo.unit = unit
2015-08-28 11:34:49 +02:00
// clear elements
logo.elements = []
// draw pads
for (var i=0; i< 6 ; i + + ) {
if (document.getElementById("pad_layer_copper").checked) {
2015-09-05 18:11:55 +02:00
var west = cvlp_pad(i+1, 0+pad_size/2, (pad_size+pad_chip_spacing*2)+pad_spacing*i, pad_size, pad_thickness)
2015-08-28 11:34:49 +02:00
logo.elements = logo.elements.concat(west)
2015-09-05 18:11:55 +02:00
var south = cvlp_pad(i+7, (pad_size+pad_chip_spacing*2)+pad_spacing*i, (pad_size+pad_chip_spacing*2+pad_spacing*5+pad_chip_spacing*2)+pad_size/2, pad_thickness, pad_size)
2015-08-28 11:34:49 +02:00
logo.elements = logo.elements.concat(south)
2015-09-05 18:11:55 +02:00
var east = cvlp_pad(18-i, (pad_size+pad_chip_spacing*2+pad_spacing*5+pad_chip_spacing*2)+pad_size/2, (pad_size+pad_chip_spacing*2)+pad_spacing*i, pad_size, pad_thickness)
2015-09-02 22:06:57 +02:00
logo.elements = logo.elements.concat(east)
2015-09-05 18:11:55 +02:00
var north = cvlp_pad(24-i, pad_size+pad_chip_spacing*2+pad_spacing*i, pad_size/2, pad_thickness, pad_size)
2015-09-02 22:06:57 +02:00
logo.elements = logo.elements.concat(north)
2015-08-28 11:34:49 +02:00
} else {
2015-09-02 22:38:34 +02:00
var west = cvlp_line(0+pad_thickness/2, (pad_size+pad_chip_spacing*2)+pad_spacing*i, pad_size-pad_thickness/2, (pad_size+pad_chip_spacing*2)+pad_spacing*i, pad_thickness)
2015-08-28 11:34:49 +02:00
logo.elements = logo.elements.concat(west)
2015-09-02 22:38:34 +02:00
var south = cvlp_line((pad_size+pad_chip_spacing*2)+pad_spacing*i, (pad_size+pad_chip_spacing*2+pad_spacing*5+pad_chip_spacing*2)+pad_thickness/2, (pad_size+pad_chip_spacing*2)+pad_spacing*i, (pad_size+pad_chip_spacing*2+pad_spacing*5+pad_chip_spacing*2)+pad_size-pad_thickness/2, pad_thickness)
2015-08-28 11:34:49 +02:00
logo.elements = logo.elements.concat(south)
2015-09-02 22:38:34 +02:00
var east = cvlp_line((pad_size+pad_chip_spacing*2+pad_spacing*5+pad_chip_spacing*2)+pad_thickness/2, (pad_size+pad_chip_spacing*2)+pad_spacing*i, (pad_size+pad_chip_spacing*2+pad_spacing*5+pad_chip_spacing*2)+pad_size-pad_thickness/2, (pad_size+pad_chip_spacing*2)+pad_spacing*i, pad_thickness)
2015-09-02 22:22:11 +02:00
logo.elements = logo.elements.concat(east)
2015-09-02 22:38:34 +02:00
var north = cvlp_line((pad_size+pad_chip_spacing*2)+pad_spacing*i, pad_thickness/2, (pad_size+pad_chip_spacing*2)+pad_spacing*i, pad_size-pad_thickness/2, pad_thickness)
2015-09-02 22:22:11 +02:00
logo.elements = logo.elements.concat(north)
2015-08-28 11:34:49 +02:00
}
}
// draw chip outline
2015-09-02 22:06:57 +02:00
var chip = cvlp_rectangle(pad_size+pad_chip_spacing, pad_size+pad_chip_spacing, pad_chip_spacing*2+pad_spacing*5, pad_chip_spacing*2+pad_spacing*5, chip_thickness, pad_chip_spacing)
2015-08-28 11:34:49 +02:00
logo.elements = logo.elements.concat(chip)
// draw O letter
2015-09-02 22:06:57 +02:00
var x = pad_size+pad_chip_spacing*2
var y = pad_size+pad_chip_spacing*2
2015-08-28 11:34:49 +02:00
var text = cvlp_polyline([[x,y],
[x+=pad_spacing*2,y],
[x,y+=pad_spacing*2],
[x+=pad_spacing*-2,y],
[x,y+=pad_spacing*-2]],text_thickness)
logo.elements = logo.elements.concat(text)
// draw S letter
2015-09-02 22:06:57 +02:00
var x = pad_size+pad_chip_spacing*2+pad_spacing*5
var y = pad_size+pad_chip_spacing*2
2015-08-28 11:34:49 +02:00
var text = cvlp_polyline([[x,y],
[x+=pad_spacing*-2,y],
[x,y+=pad_spacing],
[x+=pad_spacing*2,y],
[x,y+=pad_spacing],
[x+=pad_spacing*-2,y]],text_thickness)
logo.elements = logo.elements.concat(text)
// draw H letter
2015-09-02 22:06:57 +02:00
var x = pad_size+pad_chip_spacing*2
var y = pad_size+pad_chip_spacing*2+pad_spacing*3
2015-08-28 11:34:49 +02:00
var text = cvlp_line(x, y, x, y+pad_spacing*2, text_thickness)
logo.elements = logo.elements.concat(text)
var text = cvlp_line(x, y+pad_spacing, x+pad_spacing*2, y+pad_spacing, text_thickness)
logo.elements = logo.elements.concat(text)
var text = cvlp_line(x+pad_spacing*2, y, x+pad_spacing*2, y+pad_spacing*2, text_thickness)
logo.elements = logo.elements.concat(text)
// draw W letter
2015-09-02 22:06:57 +02:00
var x = pad_size+pad_chip_spacing*2+pad_spacing*3
var y = pad_size+pad_chip_spacing*2+pad_spacing*3
2015-08-28 11:34:49 +02:00
var text = cvlp_polyline([[x,y],
[x,y+=pad_spacing*2],
[x+=pad_spacing,y+=pad_spacing*-1],
[x+=pad_spacing,y+=pad_spacing],
[x,y+=pad_spacing*-2]],text_thickness)
logo.elements = logo.elements.concat(text)
var svg = json2svg(logo)
var div = document.getElementById('svg')
div.textContent = ""
div.appendChild(svg)
}
function download() {
var select = document.getElementById("filetype")
var filetype = select.options[select.selectedIndex].value
switch (filetype) {
case 'json':
var blob = new Blob([JSON.stringify(logo, null, '\t')], {type: "application/json"})
saveAs(blob, "oshw_logo.json")
break
case 'svg':
var blob = new Blob([new XMLSerializer().serializeToString(json2svg(logo))], {type: "image/svg+xml"})
saveAs(blob, "oshw_logo.svg")
break
case 'pcb':
var blob = new Blob([json2pcb(logo)], {type: "application/x-pcb-footprint"})
saveAs(blob, "oshw_logo.fp")
break
case 'kicad':
var blob = new Blob([json2kicad(logo)], {type: "application/x-kicad-pcb"})
saveAs(blob, "oshw_logo.kicad_mod")
break
2015-08-30 19:36:46 +02:00
case 'eagle':
2015-09-05 17:00:37 +02:00
var xml = new XMLSerializer().serializeToString(json2eagle(logo))
xml = '<?xml version="1.0" encoding="utf-8"?> '+xml
xml = xml.replace(/(>)(< \/*)/g, '$1\n$2') // eagle does not like one liners
var blob = new Blob([xml], {type: "application/vnd.cadsoft.eagle.board"})
2015-08-30 19:36:46 +02:00
saveAs(blob, "oshw_logo.lbr")
break
2015-08-28 11:34:49 +02:00
case 'zip':
var zip = new JSZip()
zip.file("oshw_logo.json", JSON.stringify(logo, null, '\t'))
zip.file("oshw_logo.svg", new XMLSerializer().serializeToString(json2svg(logo)))
zip.file("oshw_logo.fp", json2pcb(logo))
2015-08-30 19:36:46 +02:00
zip.file("oshw_logo.kicad_mod", json2kicad(logo))
2015-09-05 17:00:37 +02:00
var xml = new XMLSerializer().serializeToString(json2eagle(logo))
xml = '<?xml version="1.0" encoding="utf-8"?> '+xml
xml = xml.replace(/(>)(< \/*)/g, '$1\n$2') // eagle does not like one liners
zip.file("oshw_logo.lbr", xml)
2015-08-28 11:34:49 +02:00
var file = zip.generate({type:"blob"})
saveAs(file, "oshw_logo.zip")
break
default:
console.log("unknown file type: "+filetype)
}
}
function change_unit() {
var select = document.getElementById("unit")
var unit = select.options[select.selectedIndex].value
if (logo.unit==unit) {
return
}
2015-08-28 11:58:30 +02:00
// get values
var pad_size = parseFloat(pad_size_input.value)
var pad_thickness = parseFloat(pad_thickness_input.value)
var pad_spacing = parseFloat(pad_spacing_input.value)
var pad_chip_spacing = parseFloat(pad_chip_spacing_input.value)
var chip_thickness = parseFloat(chip_thickness_input.value)
var text_thickness = parseFloat(text_thickness_input.value)
// set converted values
pad_size_input.value = convert_unit(pad_size, logo.unit, unit)
pad_thickness_input.value = convert_unit(pad_thickness, logo.unit, unit)
pad_spacing_input.value = convert_unit(pad_spacing, logo.unit, unit)
pad_chip_spacing_input.value = convert_unit(pad_chip_spacing, logo.unit, unit)
chip_thickness_input.value = convert_unit(chip_thickness, logo.unit, unit)
text_thickness_input.value = convert_unit(text_thickness, logo.unit, unit)
// save unit and redraw
logo.unit = unit
draw()
}
2015-08-28 11:34:49 +02:00
< / script >
< div id = "svg" > < / div >
< p id = "control" >
< form onchange = "draw()" >
pads on:
< input type = "radio" name = "pad_layer" id = "pad_layer_copper" value = "copper" checked = "true" > copper
< input type = "radio" name = "pad_layer" id = "pad_layer_silkscreen" value = "silkscreen" > silkscreen
< / form >
unit: < select id = "unit" onchange = "change_unit()" >
< option value = "mm" > millimeter (mm)< / option >
< option value = "in" > inch (in)< / option >
< option value = "mil" > mil/thou (mil)< / option >
< / select > < br / >
2015-09-04 09:07:22 +02:00
pad size: < input id = "pad_size_input" type = "number" step = "any" value = 4.0 min = 0 onchange = "draw()" / > < br / >
pad thickness: < input id = "pad_thickness_input" type = "number" step = "any" value = 1.0 min = 0 onchange = "draw()" / > < br / >
2015-08-30 10:11:18 +02:00
pad spacing: < input id = "pad_spacing_input" type = "number" step = "any" value = 2.0 min = 0 onchange = "draw()" / > < br / >
pad-chip spacing: < input id = "pad_chip_spacing_input" type = "number" step = "any" value = 1.5 min = 0 onchange = "draw()" / > < br / >
chip thickness: < input id = "chip_thickness_input" type = "number" step = "any" value = 1.0 min = 0 onchange = "draw()" / > < br / >
text thickness: < input id = "text_thickness_input" type = "number" step = "any" value = 1.0 min = 0 onchange = "draw()" / > < br / >
2015-08-28 11:34:49 +02:00
< button type = "button" onclick = "download()" > save< / button > : < select id = "filetype" >
< option value = "json" > CuVoodoo Land Pattern (.json)< / option >
< option value = "svg" > Scalable Vector Graphics (.svg)< / option >
< option value = "pcb" > gEDA pcb footprint (.fp)< / option >
< option value = "kicad" > KiCad s-expr. footprint (.kicad_mod)< / option >
2015-08-30 19:36:46 +02:00
< option value = "eagle" > Eagle XML component library (.lbr)< / option >
2015-08-28 11:34:49 +02:00
< option value = "zip" > all (zip)< / option >
< / select > < br / >
< / p >
< / body >
< / html >