This commit is contained in:
Andrei 2021-02-14 18:51:14 +02:00
commit 4f49a7727f
303 changed files with 1650486 additions and 0 deletions

2
.gitattributes vendored Normal file
View File

@ -0,0 +1,2 @@
*.sh text eol=lf

13
.gitmodules vendored Normal file
View File

@ -0,0 +1,13 @@
[submodule "bin/gerbmerge"]
path = bin/gerbmerge
url = https://github.com/andreika-git/gerbmerge
[submodule "bin/python-combine-pdfs"]
path = bin/python-combine-pdfs
url = https://github.com/andreika-git/python-combine-pdfs
branch = python2-backport
[submodule "bin/InteractiveHtmlBom"]
path = bin/InteractiveHtmlBom
url = https://github.com/openscopeproject/InteractiveHtmlBom
[submodule "bin/pcb-tools"]
path = bin/pcb-tools
url = https://github.com/curtacircuitos/pcb-tools.git

@ -0,0 +1 @@
Subproject commit 3440c14443f5ca12bd7802af6446161181bfa46c

189
bin/check_all.sh Normal file
View File

@ -0,0 +1,189 @@
#!/bin/bash
echo "Checking the environment..."
unameOut="$(uname -s)"
case "${unameOut}" in
Linux*) machine=linux;;
Darwin*) machine=mac;;
CYGWIN*) machine=cygwin;;
MSYS*) machine=msys;;
MINGW32*) machine=mingw32;;
MINGW64*) machine=mingw64;;
*) machine=unknown;;
esac
if [ "${machine}" = "unknown" ] ; then
echo "* Warning! Unknown environment: ${unameOut}"
else
echo "* ${machine} environment detected!"
fi
# $1 = package_name
function install_package {
# check if the installer (package manager) exists
if [ "${machine}" = "cygwin" ] ; then
while true; do
if [ ! -x "$(command -v apt-cyg --version)" ] ; then
# we give it one more chance and try to download the installer
echo "Do you want to download the cygwin package manager (apt-cyg) and install the required utilities? (Press 1 or 2)"
select yn in "Yes" "No"; do
case $yn in
Yes )
url="rawgit.com/transcode-open/apt-cyg/master/apt-cyg"
dst="/tmp/apt-cyg"
# check if wget or curl is installed
if [ -x "$(command -v wget)" ] ; then
echo "Downloading apt-cyg using wget..."
wget $url -O $dst
elif [ -x "$(command -v curl)" ]; then
echo "Downloading apt-cyg using curl..."
curl -o $dst -sfL $url
else
echo "Could not find curl or wget! Cannot download and install a package manager!" >&2
return
fi
install $dst /bin
rm $dst
break;;
No )
echo "Please install it manually using you package manager!" >&2
exit 1;
esac
done
else
break
fi
done
elif [ "${machine}" = "msys" ] ; then
if [ ! -x "$(command -v pacman)" ] ; then
echo "Cannot detect pacman manager. Please install it manually using you package manager!" >&2
exit 1;
fi
fi
# now install
echo "Do you want to install '$1' now? (Press 1 or 2)"
select yn in "Yes" "No"; do
case $yn in
Yes )
break;;
No )
echo "Please install it manually using your package manager!" >&2
exit 1;
esac
done
if [ "${machine}" = "cygwin" ] ; then
apt-cyg install $1
elif [ "${machine}" = "msys" ] ; then
pacman -S mingw-w64-x86_64-$1
elif [ "${machine}" = "linux" ] ; then
sudo apt-get install $1
fi
}
echo "Checking the Python version..."
# check python version - should be 2.x ONLY
python_bin="python2.7"
python_ver=$($python_bin -V 2>&1 | grep -Po '(?<=Python )(.+)')
if [[ -z "$python_ver" ]] || [[ ! $python_ver =~ ^2\.7.* ]] ; then
echo "Error! Python 2.7.x is required. It should be installed and added to the PATH!"
install_package python2
fi
# $1 = name, $2 = library name, $3 = package name
function check_library {
echo "* Checking $1..."
while true; do
lib=$(pkg-config --libs $2 2>&1 | grep -Po '(\-l'$1')')
if [[ -z "$lib" ]] ; then
echo "Error! Library $1 NOT FOUND!"
else
echo "* Library $1 FOUND!"
return
fi
install_package $3
done
}
echo "* Python $python_ver detected!"
echo "Updating git submodules for scripts..."
git submodule update --init -- bin/gerbmerge bin/python-combine-pdfs bin/InteractiveHtmlBom bin/pcb-tools
echo "Checking the Python modules..."
declare -A modules
modules[simpleparse]=simpleparse
modules[contextlib2]=contextlib2
modules[PyPDF2]=PyPDF2
modules[gerber]=gerber
modules[configparser]=configparser
modules[gzip]=gzip
modules[cairocffi]=cairocffi
# check modules
for module in "${!modules[@]}"; do
pymodule=${modules[$module]}
while true; do
$python_bin -c "import sys, pkgutil; sys.path.append('./bin/pcb-tools'); sys.exit(0 if (pkgutil.find_loader('$module')) else 1)"
if [ $? -eq 0 ]; then
echo "* Checking Python module '$pymodule': OK"
break
else
echo "* Checking Python module '$pymodule': ERROR!"
echo " Python module '$pymodule' is required and NOT found!"
# some modules have dependencies
if [ "$pymodule" = "cairocffi" ]; then
check_library ffi libffi libffi-devel
check_library cairo cairo libcairo-devel
fi
if [ ]; then
echo "Please use 'pip2 install $pymodule' to install it manually!"
exit 1;
else
echo "Do you want to download and install it now? (Press 1 or 2)"
select yn in "Yes" "No"; do
case $yn in
Yes ) pip2 install $pymodule; break;;
No ) exit 1;
esac
done
fi
fi
done
done
echo "Checking if Node.js is installed..."
node_bin="node"
node_ver=$($node_bin -v 2>&1 | grep -Po '(v[0-9]+.*)')
if [[ -z "$node_ver" ]] ; then
echo "Error! This script requires Node.Js installed in PATH!"
echo "Please download and install it from here: https://nodejs.org/en/download/"
exit 1
fi
echo "* Node.js $node_ver detected!"
echo "Checking Node.js packages..."
pushd ./bin/render_vrml > /dev/null
for package in 'puppeteer' 'pngjs' 'fs' 'zlib'; do
if [ `npm list --depth=0 | grep -c "\-\- ${package}"` -eq 1 ]; then
echo "* Checking Node.js module '$package': OK"
else
echo "* Checking Node.js module '$package': ERROR!"
echo " The module '$package' is required and NOT found! Please use 'npm install $package' to install it"
echo "Do you want to download and install it now? (Press 1 or 2)"
select yn in "Yes" "No"; do
case $yn in
Yes ) npm install $package --no-shrinkwrap; break;;
No ) exit 1;
esac
done
fi
done
popd > /dev/null
echo "All checks done!"
exit 0

40
bin/copy_from_AD.sh Normal file
View File

@ -0,0 +1,40 @@
#!/bin/bash
project_base="${1}"
type="${2}"
name="${3}"
rev="${4}"
src_path="../${type}/hellen1-${name}/jlc-${rev}"
if [ $type = "frames" ]; then
dst_path="${project_base}/hellen${name}/boards/hellen${name}${rev}/frame"
else
dst_path="${type}/${name}/${rev}"
fi
echo "Copying ${type} ${name}-${rev} to the repository (${dst_path})..."
mkdir -p ${dst_path}
# copy top layer gerbers
cp ${src_path}/${name}.GT* ${dst_path}
# copy bottom layer gerbers
cp ${src_path}/${name}.GB* ${dst_path}
# copy keepout layer
cp ${src_path}/${name}.GKO ${dst_path}
# copy "mechanical 15" module outline layer
cp ${src_path}/${name}.GM15 ${dst_path}
# copy NC drill
cp ${src_path}/${name}.TXT ${dst_path}/${name}.DRL 2> /dev/null || (echo "* Skipping Drill for ${name}..." && >"${dst_path}/${name}.DRL")
# copy the schematic
cp ${src_path}/${name}-schematic.PDF ${dst_path}/${name}-schematic.pdf
# copy the PCB 3D rendered view
cp ${src_path}/${name}-pcb3d.PDF ${dst_path}/${name}-pcb3d.pdf
# copy the VRML 3D components
cp ${src_path}/${name}-vrml.wrl ${dst_path}/${name}-vrml.wrl
# copy the BOM
sed -E ":a;N;s/Comment.+\n/Comment,Designator,Footprint,LCSC Part #/g" ${src_path}/${name}-BOM.csv > ${dst_path}/${name}-BOM.csv
# process and copy CPL
python3 ./bin/jlc_kicad_tools/jlc_fix.py -o ${dst_path} ${src_path} ${name}-altium-CPL.csv ${name}-CPL.csv
# create a footprint library from PCAD ASCII file
python ./bin/create_footprints_from_pcad.py ${src_path}/${name}-pcad.PCB ibom-data

121
bin/copy_from_Kicad.py Normal file
View File

@ -0,0 +1,121 @@
#!/usr/bin/env python
############################################################################################
# Hellen-One: A script to copy exported frame files from Kicad into project.
# (c) andreika <prometheus.pcb@gmail.com>
############################################################################################
import os, sys, errno
import csv, re
import glob, shutil
if len(sys.argv) < 4:
print "Error! Please specify the project base folder, name and rev."
sys.exit(1)
project_base = sys.argv[1]
name = sys.argv[2]
rev = sys.argv[3]
base_path = project_base + "/hellen" + name + "/boards/hellen" + name + "-" + rev
src_path = base_path + "/kicad6/gerber"
dst_path = base_path + "/frame"
src_name = src_path + "/hellen" + name
dst_name = dst_path + "/" + name
fixRotationsPath = "bin/jlc_kicad_tools/cpl_rotations_db.csv"
pat_module = re.compile(r'[Mm]odule-([\w]+)-([\w\.]+)')
#################################################
print ("Copying frame " + name + "-" + rev + " to the repository (" + dst_path + ")...")
def mkdir_p(path):
try:
os.makedirs(path)
except OSError as exc:
if exc.errno == errno.EEXIST and os.path.isdir(path):
pass
else:
raise
mkdir_p(dst_path)
# copy gerbers
gerbers = [ ".GTL", ".GTO", ".GTP", ".GTS", ".GBL", ".GBO", ".GBS", ".GM1", ".DRL"]
for g in gerbers:
copied = False
for gPath in glob.glob(src_name + "*" + g):
print ("* Copying " + name + g + "...")
# keepout layer is a special case
if (g == ".GM1"):
shutil.copyfile(gPath, dst_name + ".GM15")
shutil.copyfile(gPath, dst_name + ".GKO")
else:
shutil.copyfile(gPath, dst_name + g)
copied = True
if not copied:
if (g == ".DRL"):
print ("* Skipping Drill for " + name + "...")
else:
print ("Error! Gerber " + g + " not found for " + name + "!")
sys.exit(2)
# copy the schematic
shutil.copyfile(src_name + ".pdf", dst_name + "-schematic.pdf")
# copy the VRML 3D components
shutil.copyfile(src_name + ".wrl", dst_name + "-vrml.wrl")
bom = dict()
print ("Copying BOM...")
with open(src_name + ".csv", 'rb') as src_f, open(dst_name + "-BOM.csv", 'w') as dst_f:
dst_f.write("Comment,Designator,Footprint,LCSC Part #\n")
reader = csv.reader(src_f, delimiter=';')
# skip header
next(src_f)
for row in reader:
comment = row[4]
des = row[1]
footprint = row[2]
lcsc = row[5]
bom[des] = footprint
print ("* " + des)
mod = pat_module.match(comment)
if mod:
comment = "Module:" + mod.group(1) + "/" + mod.group(2)
dst_f.write("\"" + comment + "\",\"" + des + "\",\"" + footprint + "\",\"" + lcsc + "\"\n")
print ("Reading rotations...")
rotations = {}
# read rotations csv (to undo weird JLC's angles which are not footprint-oriented)
with open(fixRotationsPath, 'rb') as f:
next(f)
reader = csv.reader(f, delimiter=',')
for row in reader:
rotations[row[0]] = float(row[1])
print ("Copying CPL...")
with open(src_name + "-all-pos.csv", 'rb') as src_f, open(dst_name + "-CPL.csv", 'w') as dst_f:
dst_f.write("Designator,Mid X,Mid Y,Layer,Rotation,Ref-X(mm),Ref-Y(mm)\n")
reader = csv.reader(src_f, delimiter=',')
# skip header
next(src_f)
for row in reader:
# Ref,Val,Package,PosX,PosY,Rot,Side
des = row[0]
posx = row[3]
posy = row[4]
rot = float(row[5])
side = row[6]
print ("* " + des)
if bom[des]:
for r in rotations:
if re.match(r, bom[des]):
rot += rotations[r]
rot = rot % 360.0
print ("* fixing rotations for " + des)
side = side.capitalize()
dst_f.write(des + "," + posx + "mm," + posy + "mm," + str(rot) + "," + side + "," + posx + "mm," + posy + "mm\n")
print ("Done!")

View File

@ -0,0 +1,68 @@
#!/usr/bin/env python
############################################################################################
# Hellen-One: A script to create a 3D components view (VRML).
# (c) andreika <prometheus.pcb@gmail.com>
############################################################################################
import os, sys, re
import configparser
import gzip
### Unfortunately PyVRML97 (vrml.vrml97) is not capable of properly processing Altium-exported VRML-files...
if len(sys.argv) < 3:
print "Error! Please specify the place+board files and vrml filename."
sys.exit(1)
mergePlaceFile = sys.argv[1]
mergeBoardFile = sys.argv[2]
fileOutName = sys.argv[3]
# read board config
config = configparser.ConfigParser()
config.read(mergeBoardFile)
# read place file
fragments = []
with open(mergePlaceFile, 'rb') as fmp:
for line in fmp:
m = line.split()
m = {"name": m[0], "x": m[1], "y": m[2], "path": config[m[0]]["Prefix"] }
fragments.append(m)
print "* Starting merge of " + str(len(fragments)) + " board fragments..."
outf = gzip.open(fileOutName, 'wb')
outf.write("#VRML V2.0 utf8\n")
pat_hdr = re.compile('^#VRML.*')
pat_idx = re.compile(r'(DEF|USE)\s+(Shape|_)(\w)')
pat_trans = re.compile(r'(translation)\s+([+\-0-9\.]+)\s+([+\-0-9\.]+)')
def trans_repl(m):
x = float(m.group(2))
y = float(m.group(3))
return m.group(1) + " " + str(x + off_x_mm) + " " + str(y + off_y_mm)
fId = 1
for frag in fragments:
# convert to mm
off_x_mm = float(frag["x"]) * 25.4
off_y_mm = float(frag["y"]) * 25.4
fileName = frag["path"] + "-vrml.wrl"
print "* Adding " + frag["name"] + " (" + fileName + ")..."
with open(fileName, 'rb') as f:
for line in f:
line = line.rstrip()
# skip the headers (we write our own because there should be only 1 header)
if pat_hdr.match(line):
continue
fragId = str(fId).zfill(2)
line = pat_idx.sub(r'\g<1> \g<2>' + fragId + '\g<3>', line)
line = pat_trans.sub(trans_repl, line)
outf.write(line + "\n")
f.close()
fId = fId + 1
outf.close()
print "Done!"

36
bin/create_board.sh Normal file
View File

@ -0,0 +1,36 @@
#!/bin/bash
############################################################################################
# Hellen-One: A board creation script.
# (c) andreika <prometheus.pcb@gmail.com>
############################################################################################
project_base="$1"
frame_name="$2"
frame_rev="$3"
bom_replace="$4"
python_bin="python2.7"
############################################################################################
echo "Hellen-One: Starting a board creation..."
echo "Checking dependencies..."
# check args
if [ -z "$1" ]; then
echo "This script cannot be executed directly! Please run user scripts from the base directory!"
exit 1
fi
# check python version (should be 2.x ONLY), etc...
if ! ./bin/check_all.sh; then
exit 2
fi
echo "Processing board..."
$python_bin bin/process_board.py ${project_base} ${frame_name} ${frame_rev} ${bom_replace}
echo "All done!"
exit 0

View File

@ -0,0 +1,149 @@
#!/usr/bin/env python
############################################################################################
# Hellen-One: A footprint library converter script.
# (c) andreika <prometheus.pcb@gmail.com>
############################################################################################
import sys, re
import time, calendar
#import pprint
if len(sys.argv) < 3:
print("Error! Please specify the src pcad-ascii file path and dst footprints folder name.")
sys.exit(1)
pcadFileName = sys.argv[1]
footprintPath = sys.argv[2]
# todo: This is very specific to the source files and should be moved to a separate data file
footprint2refpackage = {
"R0603_x4": "R0603-4",
"BUTTON-SKRK": "SMD-2_2.9x3.9x1.7",
"CONN-USB-B-VERTICAL": "USB-B-VERTICAL",
"CONN-MICROSD-472192001": "SDAMB-012",
"MPX4250AP": "867B",
"TSOT-23-6": "TSOT23-6",
"SOT-26": "SOT23-6",
"SOT-23-5": "SOT23-5",
"SOIC16N": "SOIC16",
"QUARTZ-SMD2012": "SMD2012",
"QUARTZ-SMD5032": "SMD5032",
"L-SMMS0650": "SMMS0650",
"PTC-SMD1206": "SMD1206",
"SOD-80": "SOD80",
}
pat_root = re.compile(r'^\((\w+)')
pat_padDef = re.compile(r'^\s*\(padStyleDef\s+\"([^\"]+)\"')
pat_viaDef = re.compile(r'^\s*\(viaStyleDef')
pat_padShapeDef = re.compile(r'^\s*\(padShape\s*\((\w+)\s+(\w+)\)\s*\(padShapeType\s+(\w+)\)\s*\(shapeWidth\s+([\w\.]+)\)\s*\(shapeHeight\s+([\w\.]+)\)')
pat_padHoleDef = re.compile(r'^\s*\(holeDiam\s+([\w\.]+)\)')
pat_patternDef = re.compile(r'^\s*\(patternDefExtended')
pat_compDef = re.compile(r'^\s*\(compDef')
pat_patternNameDef = re.compile(r'^\s*\(originalName\s+\"([^\"]+)\"')
pat_pad = re.compile(r'^\s*\(pad\s*\(padNum\s+(\w+)\)\s*\(padStyleRef\s*\"([\w\:]+)\"\)\s*\(pt\s+([+\-\w\.]+)\s+([+\-\w\.]+)\)\s*(\(rotation\s+([0-9\.]+)\))?\)')
pat_num = re.compile(r'^([+\-0-9\.]+)(mil|mm)?$')
isInLibrary = False
isInPattern = False
isInPad = False
curPadName = ""
curPatternName = ""
pads = {}
patterns = {}
shapeLut = {"hole": "circle", "RndRect": "roundrect", "Oval": "oval", "Rect": "rect" }
def getNumber(v):
if v:
num = pat_num.match(v)
if num:
val = float(num.group(1))
if (num.group(2) == "mil"):
val *= 0.0254
return val
return 0
with open(pcadFileName, 'rt') as fp:
for line in fp:
root = pat_root.match(line)
if root:
isInLibrary = True if root.group(1) == "library" else False
#print("isInLibrary=" + str(isInLibrary))
if isInLibrary:
pad = pat_padDef.match(line)
if pad:
curPadName = pad.group(1)
#print("padDef = " + curPadName)
pads[curPadName] = {"shape": "hole", "width": 0, "height": 0 }
isInPad = True
if pat_viaDef.match(line):
isInPad = False
if isInPad:
padHole = pat_padHoleDef.match(line)
if padHole:
pads[curPadName]["hole"] = padHole.group(1)
padShape = pat_padShapeDef.match(line)
if padShape:
if getNumber(padShape.group(4)) != 0.0 and getNumber(padShape.group(5)) != 0.0:
if not "shape" in pads[curPadName] or pads[curPadName]["shape"] == "hole":
pads[curPadName]["layer"] = padShape.group(2)
pads[curPadName]["shape"] = padShape.group(3)
pads[curPadName]["width"] = padShape.group(4)
pads[curPadName]["height"] = padShape.group(5)
#pprint.pprint(pads[curPadName])
if pat_patternDef.match(line):
isInPattern = True
if pat_compDef.match(line):
isInPattern = False
if isInPattern:
name = pat_patternNameDef.match(line)
if name:
curPatternName = name.group(1)
patterns[curPatternName] = {"pads":[] }
print("* Found footprint: " + curPatternName)
pad = pat_pad.match(line)
if pad:
padName = pad.group(2)
if pads[padName]:
padObj = pads[padName].copy()
padObj["id"] = pad.group(1)
padObj["x"] = pad.group(3)
padObj["y"] = pad.group(4)
padObj["rot"] = pad.group(6)
#pprint.pprint(padObj)
patterns[curPatternName]["pads"].append(padObj)
for pName in patterns:
# we have an "external" pretty name for BOM (PackageReference) and Altium's internal footprint name (Footprint), so this is a way to connect them
if pName in footprint2refpackage:
referencePackageName = footprint2refpackage[pName]
else:
referencePackageName = pName
print("Saving " + referencePackageName + "...")
footprintFileName = footprintPath + "/" + referencePackageName + ".kicad_mod"
with open(footprintFileName, 'w') as fp:
timestamp = format(int(calendar.timegm(time.gmtime())), 'X')
fp.write("(module " + pName + " (layer F.Cu) (tedit " + timestamp + ")\n")
pat = patterns[pName]
for pad in pat['pads']:
#pprint.pprint(pad)
padType = "smd"
padShape = shapeLut[pad['shape']]
padHole = getNumber(pad['hole'])
padAngle = getNumber(pad['rot'])
x = str(getNumber(pad['x']))
y = str(-getNumber(pad['y'])) # invert y
w = str(getNumber(pad['width']))
h = str(getNumber(pad['height']))
addAngle = "" if padAngle == 0.0 else (" " + str(padAngle))
addRrect = ""
addDrill = ""
if padShape == "roundrect":
addRrect = " (roundrect_rratio 0.2)"
if padHole != 0.0:
padType = "thru_hole" if pad['shape'] != "hole" else "np_thru_hole"
addDrill = " (drill " + str(padHole) + ")"
fp.write(" (pad " + pad['id'] + " " + padType + " " + padShape + " (at " + x + " " + y + addAngle + ") (size " + w + " " + h + ")"+ addDrill +" (layers F.Cu F.Mask)" + addRrect + ")\n")
fp.write(")\n")

View File

@ -0,0 +1,126 @@
#!/usr/bin/env python
############################################################################################
# Hellen-One: A script to export module footprints from Kicad module projects.
# (c) andreika <prometheus.pcb@gmail.com>
############################################################################################
import os, sys, errno
import csv, re
import glob, shutil
if len(sys.argv) < 4:
print "Error! Please specify the module project folder, module name and rev."
sys.exit(1)
project_base = sys.argv[1]
name = sys.argv[2]
rev = sys.argv[3]
base_path = project_base
src_path = base_path
dst_path = "modules"
pat_symbol = re.compile(r'^(\s+)\(symbol\s+\"([^\"]+)\"(.*)$')
pat_prop = re.compile(r'^(\s+)\(property\s+\"([^\"]+)\"\s+\"([^\"]*)\"(.*)$')
pat_close_symbol = re.compile(r'')
pat_footprint = re.compile(r'^(\s+)\(footprint\s+\"([^\"]+)\"(.*)$')
pat_zone = re.compile(r'^(\s+)\(zone\s+\(net\s+0\)\s+\(net_name\s+\"\"\)\s+\(layer\s+\"([^\"]+)\"\)(.*)$')
pat_text = re.compile(r'^(\s+)\(fp_text\s+([^\s]+)\s+\"([^\"]*)\"(.*)$')
replace_props = {
"Reference": "M",
"Value": "Module-" + name + "-" + rev,
"Footprint": "hellen-one-" + name + "-" + rev + ":" + name,
}
replace_texts = {
"reference": "M",
"value": "Module-" + name + "-" + rev,
}
def process_schematic(src_name, dst_name):
with open(src_name, 'rt') as src_f, open(dst_name, 'w') as dst_f:
in_module = False
num_symbols = 1
dst_f.write("(kicad_symbol_lib (version 20201005) (generator kicad_symbol_editor)\n")
for line in src_f:
m = pat_symbol.match(line)
if m:
if "Mod-Hellen" in m.group(2) and in_module == False:
print ("* Found symbol " + m.group(2))
# the close symbol should have the same indent as the open one
pat_close_symbol = re.compile(r'^' + m.group(1) + '\)')
line = m.group(1) + "(symbol \"" + name + ":Module-" + name + "-" + rev + "\"" + m.group(3) + "\n"
dst_f.write(line[2:])
in_module = True
continue
if in_module:
print ("* replacing symbol " + m.group(2))
line = m.group(1) + "(symbol \"Module-" + name + "-" + rev + "_" + str(num_symbols) + "_0\"" + m.group(3) + "\n"
num_symbols += 1
dst_f.write(line[2:])
continue
if in_module:
p = pat_prop.match(line)
if p and p.group(2) in replace_props:
r = replace_props[p.group(2)]
print ("* setting property " + p.group(2) + " to \"" + r + "\"")
line = p.group(1) + "(property \"" + p.group(2) + "\" \"" + r + "\"" + p.group(4) + "\n"
dst_f.write(line[2:])
if pat_close_symbol.match(line):
in_module = False
break
dst_f.write(")")
def process_pcb(src_name, dst_name):
with open(src_name, 'rt') as src_f, open(dst_name, 'w') as dst_f:
in_footprint = False
in_zone = False
for line in src_f:
m = pat_footprint.match(line)
if m:
if "Mod-Hellen" in m.group(2) and in_footprint == False:
print ("* Found footprint " + m.group(2))
# the close symbol should have the same indent as the open one
pat_close_symbol = re.compile(r'^' + m.group(1) + '\)')
line = m.group(1) + "(footprint \"module-" + name + "-" + rev + "\"" + m.group(3) + "\n"
dst_f.write(line[2:])
in_footprint = True
continue
if not in_footprint:
z = pat_zone.match(line)
if z and in_zone == False:
print ("* Found zone " + z.group(2))
in_zone = True
if in_footprint:
if pat_close_symbol.match(line):
in_footprint = False
# don't write the footprint close symbol because we might have zones later
continue
t = pat_text.match(line)
if t and t.group(2) in replace_texts:
r = replace_texts[t.group(2)]
print ("* setting text " + t.group(2) + " to \"" + r + "\"")
line = t.group(1) + "(fp_text " + t.group(2) + " \"" + r + "\"" + t.group(4) + "\n"
line = re.sub("\(net\s+[0-9]+\s+\"[^\"]*\"\)\s+", "", line)
dst_f.write(line[2:])
if in_zone:
if pat_close_symbol.match(line):
in_zone = False
# make sure that the keepout is enabled by default
line = line.replace("(copperpour allowed)", "(copperpour not_allowed)")
line = line.replace("0.508", "0.2")
dst_f.write(line)
dst_f.write(")")
#################################################
print ("Processing the schematic file...")
process_schematic(src_path + "/hellen1-" + name + ".kicad_sch", dst_path + "/" + name + "/" + rev + "/" + name + ".kicad_sym")
print ("Processing the pcb file...")
process_pcb(src_path + "/hellen1-" + name + ".kicad_pcb", dst_path + "/" + name + "/" + rev + "/" + name + ".kicad_mod")
print ("Done!")

388
bin/gen_iBOM.py Normal file
View File

@ -0,0 +1,388 @@
#!/usr/bin/env python
############################################################################################
# Hellen-One: A board rendering script.
# (c) andreika <prometheus.pcb@gmail.com>
############################################################################################
import os, sys
import re
import json, csv
import math, copy
import base64
from datetime import datetime
sys.path.append("./bin/InteractiveHtmlBom/InteractiveHtmlBom/core")
from lzstring import LZString
if len(sys.argv) < 12:
print "Error! Please specify all the parameters!"
sys.exit(1)
boardName = sys.argv[1]
revision = sys.argv[2]
renderedPcbDpi = sys.argv[3]
keepoutPath = sys.argv[4]
topSilkPath = sys.argv[5]
renderedPcbPath = sys.argv[6]
bomPath = sys.argv[7]
cplPath = sys.argv[8]
footprintsPath = sys.argv[9]
fixRotationsPath = sys.argv[10]
iBomFilePath = sys.argv[11]
htmlFileName = './bin/iBom-template.html'
inch_to_mm = 25.4
def getFormat(xI, xD, yI, yD, yInvert):
print "* Format: ", xI, xD, yI, yD
fmt_pat_x = re.compile(r'^([0-9]{'+xI+'})([0-9]{'+xD+'})$')
fmt_pat_y = re.compile(r'^([0-9]{'+yI+'})([0-9]{'+yD+'})$')
return [fmt_pat_x, fmt_pat_y, yInvert]
def getCoords(pos, format):
x = format[0].match(pos[0])
y = format[1].match(pos[1])
if x and y:
x = float(x.group(1) + "." + x.group(2)) * inch_to_mm
y = float(y.group(1) + "." + y.group(2)) * inch_to_mm
if format[2]:
y = format[2] - y
return [x, y]
sys.exit('Error! Cannot parse position ' + str(pos))
def getSize(size, format):
if type(size) is list:
size = 0.5 * (float(size[0]) + float(size[1]))
return float(size) * inch_to_mm
def readGerber(filePath, yInvert):
json = []
apertList = dict()
apert_circle_pat = re.compile(r'^%ADD([0-9]+)C,([+\-0-9\.]+)(X([+\-0-9\.]+))?\*%$')
apert_rect_pat = re.compile(r'^%ADD([0-9]+)R,([+\-0-9\.]+)(X([+\-0-9\.]+))?(X([+\-0-9\.]+))?\*%$')
op_pat = re.compile(r'^(X([+\-0-9]+))?(Y([+\-0-9]+))?D([0-9]+)\*$')
format_pat = re.compile(r'^%FSLAX([0-9])([0-9])Y([0-9])([0-9])\*%$')
cur_x = "0"
cur_y = "0"
cur_size = "0"
cur_aper_type = ""
inPoly = False
polyStartPos = []
polyOutlines = []
polyPoints = []
minCoord = [ 99999, 99999 ]
maxCoord = [ -99999, -99999 ]
format = getFormat("2", "5", "2", "5", yInvert)
invertedMask = False
with open(filePath, 'rb') as f:
for line in f:
line = line.strip()
#print line
if line == "%LPC*%":
invertedMask = True
if line == "%LPD*%":
invertedMask = False
fmt = format_pat.match(line)
if fmt:
format = getFormat(fmt.group(1), fmt.group(2), fmt.group(3), fmt.group(4), yInvert)
apertCircle = apert_circle_pat.match(line)
if apertCircle:
apertNum = int(apertCircle.group(1))
apertSize = apertCircle.group(2)
apertList[apertNum] = ["circle", apertSize]
# print "* Aperture C: " + str(apertNum) + " = " + apertSize
apertRect = apert_rect_pat.match(line)
if apertRect:
apertNum = int(apertRect.group(1))
apertSizeX = apertRect.group(2)
apertSizeY = apertRect.group(4)
apertList[apertNum] = ["rect", [apertSizeX, apertSizeY]]
# print "* Aperture R: " + str(apertNum) + " = " + apertSizeX + " " + apertSizeY
op = op_pat.match(line)
if op:
x = op.group(2) or cur_x
y = op.group(4) or cur_y
op = op.group(5)
# draw
if op == "01":
curCoords = getCoords([x, y], format)
minCoord[0] = min(curCoords[0], minCoord[0])
minCoord[1] = min(curCoords[1], minCoord[1])
maxCoord[0] = max(curCoords[0], maxCoord[0])
maxCoord[1] = max(curCoords[1], maxCoord[1])
if inPoly:
polyPoints.append(curCoords)
else:
jsonLine = {"type": "segment", "width": getSize(cur_size, format), "start": getCoords([cur_x, cur_y], format), "end": curCoords}
json.append(jsonLine)
# move
if op == "02":
if inPoly and len(polyPoints) > 0:
polyOutlines.append(polyPoints)
polyPoints = []
# flash
if op == "03":
curCoords = getCoords([x, y], format)
if cur_aper_type == "circle":
# todo: approximate with poly?
jsonCircle = {"type": "segment", "width": 0.2, "start": curCoords, "radius": getSize(cur_size, format) }
json.append(jsonCircle)
if cur_aper_type == "rect":
xS = getSize(cur_size[0], format) / 2
yS = getSize(cur_size[1], format) / 2
color = "#fff" if invertedMask else "#aa4"
jsonPoly = {"type": "polygon", "pos": curCoords, "angle": 0, "color": color, "polygons": [[[-xS, -yS], [xS, -yS], [xS, yS], [-xS, yS]]]}
json.append(jsonPoly)
if int(op) > 3:
a = int(op)
cur_aper_type = apertList[a][0]
cur_size = apertList[a][1]
# print "* Changing aperture: ", a
else:
cur_x = x
cur_y = y
if line == "G36*": # region begin
polyStartPos = [ cur_x, cur_y ]
polyOutlines = []
polyPoints = []
inPoly = True
if line == "G37*": # region end
color = "#fff" if invertedMask else "#aa4"
jsonPoly = {"type": "polygon", "pos": [0, 0], "angle": 0, "color": color, "polygons": []}
for ol in polyOutlines:
jsonOutline = []
for point in ol:
jsonOutline.append(point)
jsonPoly["polygons"].append(jsonOutline)
json.append(jsonPoly)
inPoly = False
f.close()
return { "json": json, "min": minCoord, "max": maxCoord }
def updateBbox(bbox, padXY, padWH):
bbox[0][0] = min(bbox[0][0], padXY[0] - padWH[0])
bbox[0][1] = min(bbox[0][1], padXY[1] - padWH[1])
bbox[1][0] = max(bbox[1][0], padXY[0] + padWH[0])
bbox[1][1] = max(bbox[1][1], padXY[1] + padWH[1])
return bbox
def readFootprint(fpname, footprintsPath, des):
if not fpname:
return None
pat_module = re.compile(r'\(module\s+([\w\-]+)\s+\(layer ([FB])')
pat_pad = re.compile(r'^\s*\(pad\s+([0-9]+)\s+(\w+)\s+(\w+)\s+\(at\s+([+\-0-9e\.]+)\s+([+\-0-9e\.]+)\s*([+\-0-9\.]+)?\)\s+\(size\s+([+\-0-9\.]+)\s+([+\-0-9\.]+)\)(\s*\(drill\s+([+\-0-9\.]+)\))?\s+\(layer[s]?\s+([^\)]+)\)(\s*\(roundrect_rratio\s+([+\-0-9\.]+)\))?')
fpFileName = footprintsPath + "/" + fpname + ".kicad_mod"
print("* Reading " + fpFileName)
if not os.path.isfile(fpFileName):
print("* Error! Footprint NOT FOUND! Skipping " + des)
return None
json = {"drawings": [], "pads": []}
bbox = [[ 9999.0, 9999.0 ], [ -9999.0, -9999.0 ]]
with open(fpFileName, 'rt') as f:
for line in f:
module = pat_module.match(line)
if module:
json["layer"] = module.group(2)
pad = pat_pad.match(line)
if pad:
padIdx = pad.group(1)
padType = pad.group(2)
padShape = pad.group(3)
padX = pad.group(4)
padY = pad.group(5)
padRot = pad.group(6) if pad.group(6) else "0"
padW = pad.group(7)
padH = pad.group(8)
padDrill = pad.group(10) if pad.group(10) else "0"
padLayers = pad.group(11)
padRrect = pad.group(13) if pad.group(13) else "0"
bbox = updateBbox(bbox, [float(padX), float(padY)], [float(padW) * 0.5, float(padH) * 0.5])
pad = {
"layers": ["F"], # todo: parse layers
"type": ("smd" if padType == "smd" else "th"),
"pos": [ float(padX), float(padY) ],
"size": [ float(padW), float(padH) ],
#"offset": [ 0.0, 0.0 ],
"angle": float(padRot),
"shape": padShape
}
if padIdx == "1":
pad["pin1"] = 1
if padShape == "roundrect":
pad["radius"] = padRrect
if padType != "smd":
pad["drillsize"] = [float(padDrill), float(padDrill)]
json["pads"].append(pad)
json["bbox"] = {
"relpos": bbox[0],
"size": [bbox[1][0] - bbox[0][0], bbox[1][1] - bbox[0][1]],
"offset": [(bbox[1][0] + bbox[0][0]) * 0.5, (bbox[1][1] + bbox[0][1]) * 0.5]
}
return json
def getPosValue(c):
return float(c.replace("mm", ""))
def rotate(origin, point, angle):
angleRad = math.radians(angle)
[ox, oy] = origin
[px, py] = point
qx = ox + math.cos(angleRad) * (px - ox) - math.sin(angleRad) * (py - oy)
qy = oy + math.sin(angleRad) * (px - ox) + math.cos(angleRad) * (py - oy)
return [qx, qy]
def readFootprints(bomPath, cplPath, footprintsPath, yInvert):
json = {"footprints": [],
"bom": {
"both": [],
"F": [],
"B": [],
"skipped": []
}
}
bom = {}
bomlut = []
footprints = {}
rotations = {}
# read rotations csv (to undo weird JLC's angles which are not footprint-oriented)
with open(fixRotationsPath, 'rb') as f:
next(f)
reader = csv.reader(f, delimiter=',')
for row in reader:
rotations[row[0]] = float(row[1])
# read BOM csv
with open(bomPath, 'rb') as f:
next(f)
reader = csv.reader(f, delimiter=',')
for row in reader:
if not row[2]:
print("* Skipping an empty footprint for (" + row[1] + ")...")
continue
bb = row[1].split(", ")
bomlut.append({ "value": row[0], "refs": [] })
idx = len(bomlut) - 1
for b in bb:
bom[b] = { "fp": row[2], "idx": idx }
# read CPL csv
with open(cplPath, 'rb') as f:
reader = csv.reader(f, delimiter=',')
for row in reader:
if row[0] in bom:
fpname = bom[row[0]]["fp"]
idx = bom[row[0]]["idx"]
# search the stored footprint or load a new one
if fpname in footprints:
fprint = footprints[fpname]
else:
fprint = readFootprint(fpname, footprintsPath, row[0])
# if the footprint is not found, we cannot add it to the iBOM
if not fprint:
continue
footprints[fpname] = fprint
fpr = copy.deepcopy(fprint)
fpr["ref"] = row[0]
fpr["bbox"]["pos"] = [ getPosValue(row[1]), getPosValue(row[2]) ]
fpr["bbox"]["angle"] = float(row[4])
origin = [0, 0]
rotation = 0
# reverse the JLC's rotation if this is one of 'special' corrected footprints
for rot in rotations:
if re.match(rot, fpname):
rotation = -rotations[rot]
fpr["bbox"]["angle"] += rotation
for p in range(len(fpr["pads"])):
# move and rotate the pads according to the CPL data
fpr["pads"][p]["pos"][0] -= fpr["bbox"]["offset"][0]
fpr["pads"][p]["pos"][1] -= fpr["bbox"]["offset"][1]
fpr["pads"][p]["pos"] = rotate(origin, fpr["pads"][p]["pos"], fpr["bbox"]["angle"])
fpr["pads"][p]["pos"][0] += fpr["bbox"]["pos"][0]
fpr["pads"][p]["pos"][1] += fpr["bbox"]["pos"][1]
fpr["pads"][p]["pos"][1] = yInvert - fpr["pads"][p]["pos"][1]
fpr["pads"][p]["angle"] += fpr["bbox"]["angle"]
fpr["bbox"]["pos"][1] = yInvert - fpr["bbox"]["pos"][1]
#fpr["bbox"]["size"] = rotate(origin, fpr["bbox"]["size"], fpr["bbox"]["angle"])
json["footprints"].append(fpr)
fid = len(json["footprints"]) - 1
bomlut[idx]["refs"].append([row[0], fid])
for b in bomlut:
refs = b["refs"]
bomItem = [
len(refs),
b["value"],
fpname,
refs,
[]
]
# todo: handle layers
json["bom"]["F"].append(bomItem)
json["bom"]["both"].append(bomItem)
return json
###################################################################
with open(htmlFileName, 'rb') as f:
html = f.read()
f.close()
data = {
"footprints": [ ],
"edges": [],
"ibom_version": "v2.3",
"bom": { },
"silkscreen": { "B": [], "F": [] },
"edges_bbox": { },
"font_data": { },
"metadata": { "date": datetime.now().strftime("%Y-%m-%d, %H:%M:%S"), "company": "rusEFI", "revision": revision, "title": "Hellen One: " + boardName }
}
# first, get yInvert
keepout = readGerber(keepoutPath, None)
yInvert = keepout["min"][1] + keepout["max"][1]
keepout = readGerber(keepoutPath, yInvert)
#print json.dumps(edges)
data["edges"] = keepout["json"]
data["edges_bbox"]["minx"] = keepout["min"][0]
data["edges_bbox"]["miny"] = keepout["min"][1]
data["edges_bbox"]["maxx"] = keepout["max"][0]
data["edges_bbox"]["maxy"] = keepout["max"][1]
topSilk = readGerber(topSilkPath, yInvert)
data["silkscreen"]["F"] = topSilk["json"]
footprints = readFootprints(bomPath, cplPath, footprintsPath, yInvert)
data["footprints"] = footprints["footprints"]
data["bom"] = footprints["bom"]
print("* Compressing the data...")
jsonText = json.dumps(data)
print("* Adding the pcb image...")
with open(renderedPcbPath, mode='rb') as f:
renderedPcb = f.read()
html = html.replace('___PCBDPI___', renderedPcbDpi)
html = html.replace('___PCBIMAGE___', 'data:image/png;base64,' + base64.b64encode(renderedPcb))
print("* Adding the BOM data...")
jsonBase64 = LZString().compress_to_base64(jsonText)
html = html.replace('___PCBDATA___', jsonBase64)
print("* Writing the output BOM file...")
with open(iBomFilePath, "wt") as wf:
wf.write(html)
wf.close()
print "Done!"

1
bin/gerbmerge Submodule

@ -0,0 +1 @@
Subproject commit 0cbd3fbb81c4ed985716efeaace5e44138118cad

3668
bin/iBom-template.html Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1 @@
__version__ = '1.0.0'

View File

@ -0,0 +1,19 @@
"Footprint pattern","Correction"
"^SOT-223",180
"^SOT-23",180
"^SOT23",180
"^TSOT-23",180
"^TSOT23",180
"^SOT-353",180
"^TANT",180
"^QFN",270
"^LQFP",270
"^TQFP",270
"^SOP-(?!18_)",270
"^TSSOP",270
"^DFN",270
"^SO[1-9]",270
"^SOIC",270
"^VSSOP",270
"^HTSSOP",270
"^R0603-4",270
1 Footprint pattern Correction
2 ^SOT-223 180
3 ^SOT-23 180
4 ^SOT23 180
5 ^TSOT-23 180
6 ^TSOT23 180
7 ^SOT-353 180
8 ^TANT 180
9 ^QFN 270
10 ^LQFP 270
11 ^TQFP 270
12 ^SOP-(?!18_) 270
13 ^TSSOP 270
14 ^DFN 270
15 ^SO[1-9] 270
16 ^SOIC 270
17 ^VSSOP 270
18 ^HTSSOP 270
19 ^R0603-4 270

View File

@ -0,0 +1,108 @@
#!/usr/bin/env python3
# Copyright (C) 2019 Matthew Lai
#
# This file is part of JLC Kicad Tools.
#
# JLC Kicad Tools is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# JLC Kicad Tools is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with JLC Kicad Tools. If not, see <https://www.gnu.org/licenses/>.
import os
import re
import sys
import argparse
import logging
import errno
from jlc_kicad_tools.jlc_lib.cpl_fix_rotations import ReadDB, FixRotations
from jlc_kicad_tools.jlc_lib.generate_bom import GenerateBOM
DEFAULT_DB_PATH="cpl_rotations_db.csv"
def main():
parser = argparse.ArgumentParser(formatter_class=argparse.RawDescriptionHelpFormatter, description='Generates BOM and CPL in CSV fashion to be used in JLCPCB Assembly Service', prog='generate_jlc_files')
parser.add_argument('project_dir', metavar='INPUT_DIRECTORY', type=os.path.abspath, help='Directory of KiCad project. Name should match KiCad project name.')
parser.add_argument('-d', '--database', metavar='DATABASE', type=str, help='Filename of database', default=os.path.join(os.path.dirname(__file__), DEFAULT_DB_PATH))
verbosity = parser.add_argument_group('verbosity arguments')
verbosity.add_argument('-v', '--verbose', help='Increases log verbosity for each occurrence', dest='verbose_count', action="count", default=0)
verbosity.add_argument('--warn-no-lcsc-partnumber', help='Enable warning output if lcsc part number is not found', dest='warn_no_partnumber', action='store_true')
parser.add_argument('--assume-same-lcsc-partnumber', help='Assume same lcsc partnumber for all components of a group', action='store_true', dest='assume_same_lcsc_partnumber')
parser.add_argument('-o', '--output', metavar='OUTPUT_DIRECTORY', dest='output_dir', type=os.path.abspath, help='Output directory. Default: INPUT_DIRECTORY')
if (len(sys.argv) == 1):
parser.print_help()
sys.exit()
# Parse arguments
opts = parser.parse_args(sys.argv[1:])
# Default log level is WARNING
logging.basicConfig(format="%(message)s", level=max(logging.WARNING - opts.verbose_count * 10, logging.NOTSET))
if not os.path.isdir(opts.project_dir):
logging.error("Failed to open project directory: {}".format(opts.project_dir))
return errno.ENOENT
# Set default output directory
if opts.output_dir == None:
opts.output_dir = opts.project_dir
if not os.path.isdir(opts.output_dir):
logging.info("Creating output directory {}".format(opts.output_dir))
os.mkdir(opts.output_dir)
project_name = os.path.basename(opts.project_dir)
logging.debug("Project name is '%s'.", project_name)
netlist_filename = project_name + ".xml"
cpl_filename = project_name + "-all-pos.csv"
netlist_path = None
cpl_path = None
for dir_name, subdir_list, file_list in os.walk(opts.project_dir):
for file_name in file_list:
if file_name == netlist_filename:
netlist_path = os.path.join(dir_name, file_name)
elif file_name == cpl_filename:
cpl_path = os.path.join(dir_name, file_name)
if netlist_path is None:
logging.error((
"Failed to find netlist file: {} in {} (and sub-directories). "
"Is the input directory a KiCad project? "
"If so, run 'Tools -> Generate Bill of Materials' in Eeschema (any format). "
"It will generate an intermediate file we need.").format(netlist_filename, opts.project_dir))
return errno.ENOENT
if cpl_path is None:
logging.error((
"Failed to find CPL file: {} in {} (and sub-directories). "
"Run 'File -> Fabrication Outputs -> Footprint Position (.pos) File' in Pcbnew. "
"Settings: 'CSV', 'mm', 'single file for board'.").format(cpl_filename, opts.project_dir))
return errno.ENOENT
logging.info("Netlist file found at: {}".format(netlist_path))
logging.info("CPL file found at: {}".format(cpl_path))
bom_output_path = os.path.join(opts.output_dir, project_name + "_bom_jlc.csv")
cpl_output_path = os.path.join(opts.output_dir, project_name + "_cpl_jlc.csv")
db = ReadDB(opts.database)
if GenerateBOM(netlist_path, bom_output_path, opts) and FixRotations(cpl_path, cpl_output_path, db):
logging.info("JLC BOM file written to: {}".format(bom_output_path))
logging.info("JLC CPL file written to: {}".format(cpl_output_path))
else:
return errno.EINVAL
return 0
if __name__ == '__main__':
sys.exit(main())

View File

@ -0,0 +1,168 @@
#!/usr/bin/env python3
# Copyright (C) 2019 Matthew Lai
#
# This file is part of JLC Kicad Tools.
#
# JLC Kicad Tools is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# JLC Kicad Tools is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with JLC Kicad Tools. If not, see <https://www.gnu.org/licenses/>.
import os
import re
import sys
import argparse
import logging
import errno
import csv
import re
import sys
import logging
# JLC requires columns to be named a certain way.
HEADER_REPLACEMENT_TABLE={
"Center-X(mm)": "Mid X",
"Center-Y(mm)": "Mid Y",
}
ROW_REPLACEMENT_TABLE={
"TopLayer": "Top",
"BottomLayer": "Bottom",
}
def ReadDB(filename):
db = {}
with open(filename) as csvfile:
reader = csv.reader(csvfile, delimiter=',')
for row in reader:
if row[0] == "Footprint pattern":
continue
else:
db[re.compile(row[0])] = int(row[1])
logging.info("Read {} rules from {}".format(len(db), filename))
return db
def FixRotations(input_filename, output_filename, db):
with open(input_filename) as csvfile:
reader = csv.reader(csvfile, delimiter=',')
writer = csv.writer(open(output_filename, 'w', newline=''), delimiter=',')
package_index = None
rotation_index = None
for row in reader:
if not package_index:
# if not the first data row, then skip
if len(row) < 4:
continue
# This is the first row. Find "Package" and "Rot" column indices.
for i in range(len(row)):
if row[i] == "PackageReference":
package_index = i
elif row[i] == "Rotation":
rotation_index = i
if package_index is None:
logging.warning("Failed to find 'PackageReference' column in the csv file")
return False
if rotation_index is None:
logging.warning("Failed to find 'Rotation' column in the csv file")
return False
# Replace column names with labels JLC wants.
for i in range(len(row)):
if row[i] in HEADER_REPLACEMENT_TABLE:
row[i] = HEADER_REPLACEMENT_TABLE[row[i]]
else:
for pattern, correction in db.items():
if pattern.match(row[package_index]):
logging.info("Footprint {} matched {}. Applying {} deg correction"
.format(row[package_index], pattern.pattern, correction))
row[rotation_index] = "{0:.0f}".format((float(row[rotation_index]) + correction) % 360)
break
for i in range(len(row)):
if row[i] in ROW_REPLACEMENT_TABLE:
row[i] = ROW_REPLACEMENT_TABLE[row[i]]
del row[package_index]
writer.writerow(row)
return True
DEFAULT_DB_PATH="cpl_rotations_db.csv"
def main():
parser = argparse.ArgumentParser(formatter_class=argparse.RawDescriptionHelpFormatter, description='Generates BOM and CPL in CSV fashion to be used in JLCPCB Assembly Service', prog='generate_jlc_files')
parser.add_argument('project_dir', metavar='INPUT_DIRECTORY', type=os.path.abspath, help='Directory of KiCad project. Name should match KiCad project name.')
parser.add_argument('cpl_in_filename', metavar='INPUT_PROJECT', type=str, help='File of KiCad project. Name should match KiCad project name.')
parser.add_argument('cpl_out_filename', metavar='INPUT_PROJECT', type=str, help='File of KiCad project. Name should match KiCad project name.')
parser.add_argument('-d', '--database', metavar='DATABASE', type=str, help='Filename of database', default=os.path.join(os.path.dirname(__file__), DEFAULT_DB_PATH))
verbosity = parser.add_argument_group('verbosity arguments')
verbosity.add_argument('-v', '--verbose', help='Increases log verbosity for each occurrence', dest='verbose_count', action="count", default=0)
verbosity.add_argument('--warn-no-lcsc-partnumber', help='Enable warning output if lcsc part number is not found', dest='warn_no_partnumber', action='store_true')
parser.add_argument('--assume-same-lcsc-partnumber', help='Assume same lcsc partnumber for all components of a group', action='store_true', dest='assume_same_lcsc_partnumber')
parser.add_argument('-o', '--output', metavar='OUTPUT_DIRECTORY', dest='output_dir', type=os.path.abspath, help='Output directory. Default: INPUT_DIRECTORY')
if (len(sys.argv) == 1):
parser.print_help()
sys.exit()
# Parse arguments
opts = parser.parse_args(sys.argv[1:])
# Default log level is WARNING
logging.basicConfig(format="%(message)s", level=max(logging.WARNING - opts.verbose_count * 10, logging.NOTSET))
if not os.path.isdir(opts.project_dir):
logging.error("Failed to open project directory: {}".format(opts.project_dir))
return errno.ENOENT
# Set default output directory
if opts.output_dir == None:
opts.output_dir = opts.project_dir
if not os.path.isdir(opts.output_dir):
logging.info("Creating output directory {}".format(opts.output_dir))
os.mkdir(opts.output_dir)
if opts.cpl_in_filename == None:
project_name = os.path.basename(opts.project_dir)
logging.debug("Project name is '%s'.", project_name)
cpl_filename = project_name + "-CPL.csv"
cpl_outfilename = project_name + "_cpl_jlc.csv"
else:
cpl_filename = opts.cpl_in_filename
cpl_outfilename = opts.cpl_out_filename
cpl_path = None
for dir_name, subdir_list, file_list in os.walk(opts.project_dir):
for file_name in file_list:
if file_name == cpl_filename:
cpl_path = os.path.join(dir_name, file_name)
if cpl_path is None:
logging.error((
"Failed to find CPL file: {} in {} (and sub-directories). "
"Run 'File -> Fabrication Outputs -> Footprint Position (.pos) File' in Pcbnew. "
"Settings: 'CSV', 'mm', 'single file for board'.").format(cpl_filename, opts.project_dir))
return errno.ENOENT
logging.info("CPL file found at: {}".format(cpl_path))
cpl_output_path = os.path.join(opts.output_dir, cpl_outfilename)
db = ReadDB(opts.database)
if FixRotations(cpl_path, cpl_output_path, db):
logging.info("JLC CPL file written to: {}".format(cpl_output_path))
else:
return errno.EINVAL
return 0
if __name__ == '__main__':
sys.exit(main())

View File

View File

@ -0,0 +1,76 @@
# Copyright (C) 2019 Matthew Lai
#
# This file is part of JLC Kicad Tools.
#
# JLC Kicad Tools is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# JLC Kicad Tools is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with JLC Kicad Tools. If not, see <https://www.gnu.org/licenses/>.
import csv
import re
import sys
import logging
# JLC requires columns to be named a certain way.
HEADER_REPLACEMENT_TABLE={
"Ref": "Designator",
"PosX": "Mid X",
"PosY": "Mid Y",
"Rot": "Rotation",
"Side": "Layer"
}
def ReadDB(filename):
db = {}
with open(filename) as csvfile:
reader = csv.reader(csvfile, delimiter=',')
for row in reader:
if row[0] == "Footprint pattern":
continue
else:
db[re.compile(row[0])] = int(row[1])
logging.info("Read {} rules from {}".format(len(db), filename))
return db
def FixRotations(input_filename, output_filename, db):
with open(input_filename) as csvfile:
reader = csv.reader(csvfile, delimiter=',')
writer = csv.writer(open(output_filename, 'w', newline=''), delimiter=',')
package_index = None
rotation_index = None
for row in reader:
if not package_index:
# This is the first row. Find "Package" and "Rot" column indices.
for i in range(len(row)):
if row[i] == "Package":
package_index = i
elif row[i] == "Rot":
rotation_index = i
if package_index is None:
logging.warning("Failed to find 'Package' column in the csv file")
return False
if rotation_index is None:
logging.warning("Failed to find 'Rot' column in the csv file")
return False
# Replace column names with labels JLC wants.
for i in range(len(row)):
if row[i] in HEADER_REPLACEMENT_TABLE:
row[i] = HEADER_REPLACEMENT_TABLE[row[i]]
else:
for pattern, correction in db.items():
if pattern.match(row[package_index]):
logging.info("Footprint {} matched {}. Applying {} deg correction"
.format(row[package_index], pattern.pattern, correction))
row[rotation_index] = "{0:.6f}".format((float(row[rotation_index]) + correction) % 360)
break
writer.writerow(row)
return True

View File

@ -0,0 +1,107 @@
# Copyright (C) 2019 Matthew Lai
# Copyright (C) 1992-2019 Kicad Developers Team
#
# This file is part of JLC Kicad Tools.
#
# JLC Kicad Tools is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# JLC Kicad Tools is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with JLC Kicad Tools. If not, see <https://www.gnu.org/licenses/>.
from jlc_kicad_tools.jlc_lib import kicad_netlist_reader
import csv
import re
import logging
LCSC_PART_NUMBER_MATCHER=re.compile('^C[0-9]+$')
def GenerateBOM(input_filename, output_filename, opts):
net = kicad_netlist_reader.netlist(input_filename)
try:
f = open(output_filename, mode='w', encoding='utf-8')
except IOError:
logging.error("Failed to open file for writing: {}".format(output_filename))
return False
out = csv.writer(f, lineterminator='\n', delimiter=',', quotechar='\"',
quoting=csv.QUOTE_ALL)
out.writerow(['Comment', 'Designator', 'Footprint', 'LCSC Part #'])
grouped = net.groupComponents()
num_groups_found = 0
for group in grouped:
refs = []
lcsc_part_numbers = set()
lcsc_part_numbers_none_found = False
footprints = set()
for component in group:
refs.append(component.getRef())
c = component
lcsc_part_number = None
# Get the field name for the LCSC part number.
for field_name in c.getFieldNames():
field_value = c.getField(field_name)
if LCSC_PART_NUMBER_MATCHER.match(field_value):
lcsc_part_number = field_value
if lcsc_part_number:
lcsc_part_numbers.add(lcsc_part_number)
else:
lcsc_part_numbers_none_found = True
if c.getFootprint() != '':
footprints.add(c.getFootprint())
# Check part numbers for uniqueness
if len(lcsc_part_numbers) == 0:
if opts.warn_no_partnumber:
logging.warning("No LCSC part number found for components {}".format(",".join(refs)))
continue
elif len(lcsc_part_numbers) != 1:
logging.error("Components {components} from same group have different LCSC part numbers: {partnumbers}".format(
components = ", ".join(refs),
partnumbers = ", ".join(lcsc_part_numbers)))
return False
lcsc_part_number = list(lcsc_part_numbers)[0]
if (not opts.assume_same_lcsc_partnumber) and (lcsc_part_numbers_none_found):
logging.error("Components {components} from same group do not all have LCSC part number {partnumber} set. Use --assume-same-lcsc-partnumber to ignore.".format(
components = ", ".join(refs),
partnumber = lcsc_part_number))
return False
# Check footprints for uniqueness
if (len(footprints) == 0):
logging.error("No footprint found for components {}".format(",".join(refs)))
return False
if len(footprints) != 1:
logging.error("Components {components} from same group have different foot prints: {footprints}".format(
components = ", ".join(refs),
footprints = ", ".join(footprints)))
return False
footprint = list(footprints)[0]
# They don't seem to like ':' in footprint names.
footprint = footprint[(footprint.find(':') + 1):]
# Fill in the component groups common data
out.writerow([c.getValue(), ",".join(refs), footprint, lcsc_part_number])
num_groups_found += 1
logging.info("{} component groups found from BOM file.".format(num_groups_found))
return True

View File

@ -0,0 +1,794 @@
# Copyright (C) 1992-2019 Kicad Developers Team
#
# This file is part of JLC Kicad Tools.
#
# JLC Kicad Tools is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# JLC Kicad Tools is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with JLC Kicad Tools. If not, see <https://www.gnu.org/licenses/>.
#
# KiCad python module for interpreting generic netlists which can be used
# to generate Bills of materials, etc.
#
# Remember these files use UTF8 encoding
#
# No string formatting is used on purpose as the only string formatting that
# is current compatible with python 2.4+ to 3.0+ is the '%' method, and that
# is due to be deprecated in 3.0+ soon
#
"""
@package
Helper module for interpreting generic netlist and build custom
bom generators or netlists in foreign format
"""
from __future__ import print_function
import sys
import xml.sax as sax
import re
import pdb
import logging
#-----<Configure>----------------------------------------------------------------
# excluded_fields is a list of regular expressions. If any one matches a field
# from either a component or a libpart, then that will not be included as a
# column in the BOM. Otherwise all columns from all used libparts and components
# will be unionized and will appear. Some fields are impossible to blacklist, such
# as Ref, Value, Footprint, and Datasheet. Additionally Qty and Item are supplied
# unconditionally as columns, and may not be removed.
excluded_fields = [
#'Price@1000'
]
# You may exlude components from the BOM by either:
#
# 1) adding a custom field named "Installed" to your components and filling it
# with a value of "NU" (Normally Uninstalled).
# See netlist.getInterestingComponents(), or
#
# 2) blacklisting it in any of the three following lists:
# regular expressions which match component 'Reference' fields of components that
# are to be excluded from the BOM.
excluded_references = [
'TP[0-9]+' # all test points
]
# regular expressions which match component 'Value' fields of components that
# are to be excluded from the BOM.
excluded_values = [
'MOUNTHOLE',
'SCOPETEST',
'MOUNT_HOLE',
'SOLDER_BRIDGE.*'
]
# regular expressions which match component 'Footprint' fields of components that
# are to be excluded from the BOM.
excluded_footprints = [
#'MOUNTHOLE'
]
#-----</Configure>---------------------------------------------------------------
class xmlElement():
"""xml element which can represent all nodes of the netlist tree. It can be
used to easily generate various output formats by propogating format
requests to children recursively.
"""
def __init__(self, name, parent=None):
self.name = name
self.attributes = {}
self.parent = parent
self.chars = ""
self.children = []
def __str__(self):
"""String representation of this netlist element
"""
return self.name + "[" + self.chars + "]" + " attr_count:" + str(len(self.attributes))
def formatXML(self, nestLevel=0, amChild=False):
"""Return this element formatted as XML
Keywords:
nestLevel -- increases by one for each level of nesting.
amChild -- If set to True, the start of document is not returned.
"""
s = ""
indent = ""
for i in range(nestLevel):
indent += " "
if not amChild:
s = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
s += indent + "<" + self.name
for a in self.attributes:
s += " " + a + "=\"" + self.attributes[a] + "\""
if (len(self.chars) == 0) and (len(self.children) == 0):
s += "/>"
else:
s += ">" + self.chars
for c in self.children:
s += "\n"
s += c.formatXML(nestLevel+1, True)
if (len(self.children) > 0):
s += "\n" + indent
if (len(self.children) > 0) or (len(self.chars) > 0):
s += "</" + self.name + ">"
return s
def formatHTML(self, amChild=False):
"""Return this element formatted as HTML
Keywords:
amChild -- If set to True, the start of document is not returned
"""
s = ""
if not amChild:
s = """<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
</head>
<body>
<table>
"""
s += "<tr><td><b>" + self.name + "</b><br>" + self.chars + "</td><td><ul>"
for a in self.attributes:
s += "<li>" + a + " = " + self.attributes[a] + "</li>"
s += "</ul></td></tr>\n"
for c in self.children:
s += c.formatHTML(True)
if not amChild:
s += """</table>
</body>
</html>"""
return s
def addAttribute(self, attr, value):
"""Add an attribute to this element"""
if type(value) != str: value = value.encode('utf-8')
self.attributes[attr] = value
def setAttribute(self, attr, value):
"""Set an attributes value - in fact does the same thing as add
attribute
"""
self.attributes[attr] = value
def setChars(self, chars):
"""Set the characters for this element"""
self.chars = chars
def addChars(self, chars):
"""Add characters (textual value) to this element"""
self.chars += chars
def addChild(self, child):
"""Add a child element to this element"""
self.children.append(child)
return self.children[len(self.children) - 1]
def getParent(self):
"""Get the parent of this element (Could be None)"""
return self.parent
def getChild(self, name):
"""Returns the first child element named 'name'
Keywords:
name -- The name of the child element to return"""
for child in self.children:
if child.name == name:
return child
return None
def getChildren(self, name=None):
if name:
# return _all_ children named "name"
ret = []
for child in self.children:
if child.name == name:
ret.append(child)
return ret
else:
return self.children
def get(self, elemName, attribute="", attrmatch=""):
"""Return the text data for either an attribute or an xmlElement
"""
if (self.name == elemName):
if attribute != "":
try:
if attrmatch != "":
if self.attributes[attribute] == attrmatch:
ret = self.chars
if type(ret) != str: ret = ret.encode('utf-8')
return ret
else:
ret = self.attributes[attribute]
if type(ret) != str: ret = ret.encode('utf-8')
return ret
except AttributeError:
ret = ""
if type(ret) != str: ret = ret.encode('utf-8')
return ret
else:
ret = self.chars
if type(ret) != str: ret = ret.encode('utf-8')
return ret
for child in self.children:
ret = child.get(elemName, attribute, attrmatch)
if ret != "":
if type(ret) != str: ret = ret.encode('utf-8')
return ret
ret = ""
if type(ret) != str: ret = ret.encode('utf-8')
return ret
class libpart():
"""Class for a library part, aka 'libpart' in the xml netlist file.
(Components in eeschema are instantiated from library parts.)
This part class is implemented by wrapping an xmlElement with accessors.
This xmlElement instance is held in field 'element'.
"""
def __init__(self, xml_element):
#
self.element = xml_element
#def __str__(self):
# simply print the xmlElement associated with this part
#return str(self.element)
def getLibName(self):
return self.element.get("libpart", "lib")
def getPartName(self):
return self.element.get("libpart", "part")
def getDescription(self):
return self.element.get("description")
def getField(self, name):
return self.element.get("field", "name", name)
def getFieldNames(self):
"""Return a list of field names in play for this libpart.
"""
fieldNames = []
fields = self.element.getChild('fields')
if fields:
for f in fields.getChildren():
fieldNames.append( f.get('field','name') )
return fieldNames
def getDatasheet(self):
return self.getField("Datasheet")
def getFootprint(self):
return self.getField("Footprint")
def getAliases(self):
"""Return a list of aliases or None"""
aliases = self.element.getChild("aliases")
if aliases:
ret = []
children = aliases.getChildren()
# grab the text out of each child:
for child in children:
ret.append( child.get("alias") )
return ret
return None
class comp():
"""Class for a component, aka 'comp' in the xml netlist file.
This component class is implemented by wrapping an xmlElement instance
with accessors. The xmlElement is held in field 'element'.
"""
def __init__(self, xml_element):
self.element = xml_element
self.libpart = None
# Set to true when this component is included in a component group
self.grouped = False
def __eq__(self, other):
""" Equivalency operator, remember this can be easily overloaded
2 components are equivalent ( i.e. can be grouped
if they have same value and same footprint
Override the component equivalence operator must be done before
loading the netlist, otherwise all components will have the original
equivalency operator.
You have to define a comparison module (for instance named myEqu)
and add the line;
kicad_netlist_reader.comp.__eq__ = myEqu
in your bom generator script before calling the netliste reader by something like:
net = kicad_netlist_reader.netlist(sys.argv[1])
"""
result = False
if self.getValue() == other.getValue():
if self.getFootprint() == other.getFootprint():
result = True
return result
def setLibPart(self, part):
self.libpart = part
def getLibPart(self):
return self.libpart
def getPartName(self):
return self.element.get("libsource", "part")
def getLibName(self):
return self.element.get("libsource", "lib")
def setValue(self, value):
"""Set the value of this component"""
v = self.element.getChild("value")
if v:
v.setChars(value)
def getValue(self):
return self.element.get("value")
def getField(self, name, libraryToo=True):
"""Return the value of a field named name. The component is first
checked for the field, and then the components library part is checked
for the field. If the field doesn't exist in either, an empty string is
returned
Keywords:
name -- The name of the field to return the value for
libraryToo -- look in the libpart's fields for the same name if not found
in component itself
"""
field = self.element.get("field", "name", name)
if field == "" and libraryToo and self.libpart:
field = self.libpart.getField(name)
return field
def getFieldNames(self):
"""Return a list of field names in play for this component. Mandatory
fields are not included, and they are: Value, Footprint, Datasheet, Ref.
The netlist format only includes fields with non-empty values. So if a field
is empty, it will not be present in the returned list.
"""
fieldNames = []
fields = self.element.getChild('fields')
if fields:
for f in fields.getChildren():
fieldNames.append( f.get('field','name') )
return fieldNames
def getRef(self):
return self.element.get("comp", "ref")
def getFootprint(self, libraryToo=True):
ret = self.element.get("footprint")
if ret == "" and libraryToo and self.libpart:
ret = self.libpart.getFootprint()
return ret
def getDatasheet(self, libraryToo=True):
ret = self.element.get("datasheet")
if ret == "" and libraryToo and self.libpart:
ret = self.libpart.getDatasheet()
return ret
def getTimestamp(self):
return self.element.get("tstamp")
def getDescription(self):
return self.element.get("libsource", "description")
class netlist():
""" Kicad generic netlist class. Generally loaded from a kicad generic
netlist file. Includes several helper functions to ease BOM creating
scripts
"""
def __init__(self, fname=""):
"""Initialiser for the genericNetlist class
Keywords:
fname -- The name of the generic netlist file to open (Optional)
"""
self.design = None
self.components = []
self.libparts = []
self.libraries = []
self.nets = []
# The entire tree is loaded into self.tree
self.tree = []
self._curr_element = None
# component blacklist regexs, made from exluded_* above.
self.excluded_references = []
self.excluded_values = []
self.excluded_footprints = []
if fname != "":
self.load(fname)
def addChars(self, content):
"""Add characters to the current element"""
self._curr_element.addChars(content)
def addElement(self, name):
"""Add a new kicad generic element to the list"""
if self._curr_element == None:
self.tree = xmlElement(name)
self._curr_element = self.tree
else:
self._curr_element = self._curr_element.addChild(
xmlElement(name, self._curr_element))
# If this element is a component, add it to the components list
if self._curr_element.name == "comp":
self.components.append(comp(self._curr_element))
# Assign the design element
if self._curr_element.name == "design":
self.design = self._curr_element
# If this element is a library part, add it to the parts list
if self._curr_element.name == "libpart":
self.libparts.append(libpart(self._curr_element))
# If this element is a net, add it to the nets list
if self._curr_element.name == "net":
self.nets.append(self._curr_element)
# If this element is a library, add it to the libraries list
if self._curr_element.name == "library":
self.libraries.append(self._curr_element)
return self._curr_element
def endDocument(self):
"""Called when the netlist document has been fully parsed"""
# When the document is complete, the library parts must be linked to
# the components as they are seperate in the tree so as not to
# duplicate library part information for every component
for c in self.components:
for p in self.libparts:
if p.getLibName() == c.getLibName():
if p.getPartName() == c.getPartName():
c.setLibPart(p)
break
else:
aliases = p.getAliases()
if aliases and self.aliasMatch( c.getPartName(), aliases ):
c.setLibPart(p)
break;
if not c.getLibPart():
logging.error('Missing libpart for ref {}: {}:{}'.format(c.getRef(), c.getLibName(), c.getPartName() ))
def aliasMatch(self, partName, aliasList):
for alias in aliasList:
if partName == alias:
return True
return False
def endElement(self):
"""End the current element and switch to its parent"""
self._curr_element = self._curr_element.getParent()
def getDate(self):
"""Return the date + time string generated by the tree creation tool"""
return self.design.get("date")
def getSource(self):
"""Return the source string for the design"""
return self.design.get("source")
def getTool(self):
"""Return the tool string which was used to create the netlist tree"""
return self.design.get("tool")
def gatherComponentFieldUnion(self, components=None):
"""Gather the complete 'set' of unique component fields, fields found in any component.
"""
if not components:
components=self.components
s = set()
for c in components:
s.update( c.getFieldNames() )
# omit anything matching any regex in excluded_fields
ret = set()
for field in s:
exclude = False
for rex in excluded_fields:
if re.match( rex, field ):
exclude = True
break
if not exclude:
ret.add(field)
return ret # this is a python 'set'
def gatherLibPartFieldUnion(self):
"""Gather the complete 'set' of part fields, fields found in any part.
"""
s = set()
for p in self.libparts:
s.update( p.getFieldNames() )
# omit anything matching any regex in excluded_fields
ret = set()
for field in s:
exclude = False
for rex in excluded_fields:
if re.match( rex, field ):
exclude = True
break
if not exclude:
ret.add(field)
return ret # this is a python 'set'
def getInterestingComponents(self):
"""Return a subset of all components, those that should show up in the BOM.
Omit those that should not, by consulting the blacklists:
excluded_values, excluded_refs, and excluded_footprints, which hold one
or more regular expressions. If any of the the regular expressions match
the corresponding field's value in a component, then the component is exluded.
"""
# pre-compile all the regex expressions:
del self.excluded_references[:]
del self.excluded_values[:]
del self.excluded_footprints[:]
for rex in excluded_references:
self.excluded_references.append( re.compile( rex ) )
for rex in excluded_values:
self.excluded_values.append( re.compile( rex ) )
for rex in excluded_footprints:
self.excluded_footprints.append( re.compile( rex ) )
# the subset of components to return, considered as "interesting".
ret = []
# run each component thru a series of tests, if it passes all, then add it
# to the interesting list 'ret'.
for c in self.components:
exclude = False
if not exclude:
for refs in self.excluded_references:
if refs.match(c.getRef()):
exclude = True
break;
if not exclude:
for vals in self.excluded_values:
if vals.match(c.getValue()):
exclude = True
break;
if not exclude:
for mods in self.excluded_footprints:
if mods.match(c.getFootprint()):
exclude = True
break;
if not exclude:
# This is a fairly personal way to flag DNS (Do Not Stuff). NU for
# me means Normally Uninstalled. You can 'or in' another expression here.
if c.getField( "Installed" ) == 'NU':
exclude = True
if not exclude:
ret.append(c)
# The key to sort the components in the BOM
# This sorts using a natural sorting order (e.g. 100 after 99), and if it wasn't used
# the normal sort would place 100 before 99 since it only would look at the first digit.
def sortKey( str ):
return [ int(t) if t.isdigit() else t.lower()
for t in re.split( '(\d+)', str ) ]
ret.sort(key=lambda g: sortKey(g.getRef()))
return ret
def groupComponents(self, components = None):
"""Return a list of component lists. Components are grouped together
when the value, library and part identifiers match.
Keywords:
components -- is a list of components, typically an interesting subset
of all components, or None. If None, then all components are looked at.
"""
if not components:
components = self.components
groups = []
# Make sure to start off will all components ungrouped to begin with
for c in components:
c.grouped = False
# Group components based on the value, library and part identifiers
for c in components:
if c.grouped == False:
c.grouped = True
newgroup = []
newgroup.append(c)
# Check every other ungrouped component against this component
# and add to the group as necessary
for ci in components:
if ci.grouped == False and ci == c:
newgroup.append(ci)
ci.grouped = True
# Add the new component group to the groups list
groups.append(newgroup)
# The key to sort the components in the BOM
# This sorts using a natural sorting order (e.g. 100 after 99), and if it wasn't used
# the normal sort would place 100 before 99 since it only would look at the first digit.
def sortKey( str ):
return [ int(t) if t.isdigit() else t.lower()
for t in re.split( '(\d+)', str ) ]
for g in groups:
g = sorted(g, key=lambda g: sortKey(g.getRef()))
# Finally, sort the groups to order the references alphabetically
groups = sorted(groups, key=lambda group: sortKey(group[0].getRef()))
return groups
def getGroupField(self, group, field):
"""Return the whatever is known about the given field by consulting each
component in the group. If any of them know something about the property/field,
then return that first non-blank value.
"""
for c in group:
ret = c.getField(field, False)
if ret != '':
return ret
libpart = group[0].getLibPart()
if not libpart:
return ''
return libpart.getField(field)
def getGroupFootprint(self, group):
"""Return the whatever is known about the Footprint by consulting each
component in the group. If any of them know something about the Footprint,
then return that first non-blank value.
"""
for c in group:
ret = c.getFootprint()
if ret != "":
return ret
return group[0].getLibPart().getFootprint()
def getGroupDatasheet(self, group):
"""Return the whatever is known about the Datasheet by consulting each
component in the group. If any of them know something about the Datasheet,
then return that first non-blank value.
"""
for c in group:
ret = c.getDatasheet()
if ret != "":
return ret
if len(group) > 0:
return group[0].getLibPart().getDatasheet()
else:
logging.error("NULL!")
return ''
def formatXML(self):
"""Return the whole netlist formatted in XML"""
return self.tree.formatXML()
def formatHTML(self):
"""Return the whole netlist formatted in HTML"""
return self.tree.formatHTML()
def load(self, fname):
"""Load a kicad generic netlist
Keywords:
fname -- The name of the generic netlist file to open
"""
try:
self._reader = sax.make_parser()
self._reader.setContentHandler(_gNetReader(self))
self._reader.parse(fname)
except IOError as e:
logging.error("{}: {}".format(__file__, e))
sys.exit(-1)
class _gNetReader(sax.handler.ContentHandler):
"""SAX kicad generic netlist content handler - passes most of the work back
to the 'netlist' class which builds a complete tree in RAM for the design
"""
def __init__(self, aParent):
self.parent = aParent
def startElement(self, name, attrs):
"""Start of a new XML element event"""
element = self.parent.addElement(name)
for name in attrs.getNames():
element.addAttribute(name, attrs.getValue(name))
def endElement(self, name):
self.parent.endElement()
def characters(self, content):
# Ignore erroneous white space - ignoreableWhitespace does not get rid
# of the need for this!
if not content.isspace():
self.parent.addChars(content)
def endDocument(self):
"""End of the XML document event"""
self.parent.endDocument()

1
bin/pcb-tools Submodule

@ -0,0 +1 @@
Subproject commit 72257258edf16cbda691483ef1fa722192ac0d38

93
bin/process_BOM.py Normal file
View File

@ -0,0 +1,93 @@
#!/usr/bin/env python
############################################################################################
# Hellen-One: A BOM processing script.
# (c) andreika <prometheus.pcb@gmail.com>
############################################################################################
from collections import OrderedDict
import csv, sys, re
if len(sys.argv) < 2:
print "Error! Please specify a BOM file name."
sys.exit(1)
fileName = sys.argv[1]
if len(sys.argv) > 2:
repl = sys.argv[2]
print "Opening BOM file " + fileName + "..."
rows = OrderedDict()
emptyId = 1
with open(fileName, 'rb') as f:
reader = csv.reader(f, delimiter=',')
print "Searching for duplicates..."
for row in reader:
rowName = row[3]
# all empty names should be saved separately
if not rowName:
rows["_" + str(emptyId)] = row
emptyId += 1
continue
row[1] = row[1].split(", ")
if rowName in rows:
oldRow = rows[rowName]
if oldRow[0] != row[0]:
print "* Error! Comment mismatch for the part #" + rowName + ": " + oldRow[0] + " != " + row[0]
sys.exit(2)
if oldRow[2] != row[2]:
print "* Warning! Footprint mismatch for the part #" + rowName + ": " + oldRow[2] + " != " + row[2]
#sys.exit(3)
print "* Duplicates found for " + rowName + " (" + row[0] + ")! Merging..."
row[1] = oldRow[1] + row[1]
rows[rowName] = row
#for idx,item in enumerate(row):
# print idx , ": ", item
print "Processing the board replacements..."
replList = repl.split(";")
for r in replList:
rel = re.search("(\w+)=([\w\-]+)?,?([\w\-]+)?,?(\w+)?", r)
if not rel:
continue
reDesignator = rel.group(1)
reComment = rel.group(2)
reFootprint = rel.group(3)
rePartNumber = rel.group(4)
for rowName in rows:
row = rows[rowName]
if reDesignator in row[1]:
print "* Removing " + reDesignator + " from the old row..."
row[1].remove(reDesignator)
if not row[1]:
print "* Deleting an empty row..."
del rows[rowName]
# find the matching row by partnumber (if set)
if rePartNumber:
if rePartNumber in rows:
print "* Adding " + reDesignator + " to another existing row..."
rows[rePartNumber][1] += [reDesignator]
else:
print "* Appending a new row for " + reDesignator + "..."
rows[rePartNumber] = [reComment, [reDesignator], reFootprint, rePartNumber]
print "Saving..."
with open (fileName, 'wb') as new_f:
rowIdx = 0
for rowName in rows:
#for idx,item in enumerate(rows[rowName]):
# print idx , ": ", item
if rowIdx == 0:
writer = csv.writer(new_f, quoting=csv.QUOTE_NONE, quotechar='"', delimiter=',', lineterminator='\n')
elif rowIdx == 1:
writer = csv.writer(new_f, quoting=csv.QUOTE_ALL, quotechar='"', delimiter=',', lineterminator='\n')
row = rows[rowName]
# restore empty names
if rowName[0] == '_':
row[3] = ""
if type(row[1]) == list:
row[1] = ", ".join(row[1])
writer.writerow(row)
rowIdx += 1
print "Done!"

335
bin/process_board.py Normal file
View File

@ -0,0 +1,335 @@
#!/usr/bin/env python
############################################################################################
# Hellen-One: A board processing script.
# (c) andreika <prometheus.pcb@gmail.com>
############################################################################################
from __future__ import print_function
import os, sys, shutil, errno
import csv, re
import subprocess
if len(sys.argv) < 4:
print ("Error! Please specify the project base name, frame name, revision and optional BOM replacement list.")
sys.exit(1)
project_base = sys.argv[1]
frame_name = sys.argv[2]
frame_rev = sys.argv[3]
if len(sys.argv) > 3:
bom_replace = sys.argv[4]
else:
bom_replace = ""
board_prefix = "hellen"
imageDpi = "600"
# these should match the definitions in the parent shell script (create_board.sh)!
project_name = board_prefix + frame_name
board_name = project_name + "-" + frame_rev
project_path = project_base + "/" + project_name + "/boards/" + board_name
frame_path = project_path + "/frame"
board_path = project_path + "/board"
board_path_name = board_path + "/" + board_name
board_misc_path = board_path + "/misc"
board_misc_path_name = board_misc_path + "/" + board_name
merged_gerber_path = board_path + "/gerber"
board_cfg_path = board_path + "/board.cfg"
board_place_path = board_path + "/board_place.txt"
board_bom = board_path_name + "-BOM.csv"
board_cpl = board_path_name + "-CPL.csv"
board_img = board_path_name + ".png"
board_img_top = board_misc_path_name + "-top.png"
board_img_bottom = board_misc_path_name + "-bottom.png"
board_img_outline = board_misc_path_name + "-outline.png"
board_img_components = board_misc_path_name + "-components.png"
node_bin = "node"
rotations = "bin/jlc_kicad_tools/cpl_rotations_db.csv"
# the format is: "Module:module_name/module_rev"
pat_module = re.compile(r'Module:([\w]+)/([\w\.]+)')
############################################################################################
def write_lines(f, lines):
if type(lines) == str:
f.write(lines + "\n")
else:
for l in lines:
f.write(l + "\n")
def print_module(name, prefix, fileName, flag):
with open(fileName, 'a') as file:
write_lines(file, [
"[" + name + "]",
"Prefix = " + prefix,
"*TopCopper=%(prefix)s.GTL",
"*TopSoldermask=%(prefix)s.GTS",
"*TopSolderPasteMask=%(prefix)s.GTP",
"*TopSilkscreen=%(prefix)s.GTO",
"*BottomCopper=%(prefix)s.GBL",
"*BottomSoldermask=%(prefix)s.GBS",
"*BottomSilkscreen=%(prefix)s.GBO",
"*Keepout=%(prefix)s.GKO",
"Drills=%(prefix)s.DRL"])
if (flag == 1):
write_lines(file, [
"ToolList = nul",
"Placement = nul",
"BoardOutline = nul"])
else:
write_lines(file, "BoardOutline=%(prefix)s.GM15")
def append_cpl(src_fname, dst_fname, x, y):
print ("* appending the CPL with offset (" + str(x) + "," + str(y) + ")...")
with open(src_fname, 'rb') as src_f, open(dst_fname, 'a') as dst_f:
reader = csv.reader(src_f, delimiter=',')
i=0
# skip header
next(src_f)
for row in reader:
des = row[0]
cxmm = row[1]
cymm = row[2]
lay = row[3]
rot = row[4]
# remove module designators
if (re.match("^M[0-9]+$", des)):
print ("* (skipping " + des + ")")
continue
# remove "mm" suffix
cx = float(cxmm.replace("mm", ""))
cy = float(cymm.replace("mm", ""))
# offset the coordinates
x_offset = cx + float(x)
y_offset = cy + float(y)
write_lines(dst_f, des + "," + str(x_offset) + "mm," + str(y_offset) + "mm," + lay + "," + rot)
i = i + 1
print (str(i) + " parts processed...", end = "\r")
def append_bom(src_fname, dst_fname):
print ("* appending the BOM...")
with open(src_fname, 'rb') as src_f, open(dst_fname, 'a') as dst_f:
reader = csv.reader(src_f, delimiter=',')
i = 0
# skip header
next(src_f)
for row in reader:
comment = row[0]
des = row[1]
footprint = row[2]
lcsc = row[3]
# remove module designators
if (re.match("^M[0-9]+$", des)):
print ("* (skipping " + des + ")")
continue
write_lines(dst_f, "\"" + comment + "\",\"" + des + "\",\"" + footprint + "\",\"" + lcsc + "\"")
i = i + 1
print (str(i) + " parts processed...", end = "\r")
def mkdir_p(path):
try:
os.makedirs(path)
except OSError as exc:
if exc.errno == errno.EEXIST and os.path.isdir(path):
pass
else:
raise
def print_to_file(fileName, mode, lines):
with open(fileName, mode) as f:
write_lines(f, lines)
def delete_file(fileName):
if os.path.exists(fileName):
os.remove(fileName)
############################################################################################
print ("Removing old files of the board...")
try:
if os.path.exists(board_path):
shutil.rmtree(board_path)
except OSError as e:
if exc.errno == errno.EEXIST and os.path.isdir(path):
pass
else:
print ("Error: %s - %s." % (e.filename, e.strerror))
sys.exit(1)
print ("Creating " + board_name + "...")
mkdir_p(board_path)
mkdir_p(board_misc_path)
mkdir_p(merged_gerber_path)
# create configs
print_to_file(board_cfg_path, "w", [
"[DEFAULT]",
"projdir = .",
"",
"[Options]",
"ExcellonLeadingZeros = 0",
"MeasurementUnits = inch",
"AllowMissingLayers = 1"])
# board gerbers
print_module("MergeOutputFiles", merged_gerber_path + "/" + board_name, board_cfg_path, 1)
# frame gerbers
print_module(frame_name, frame_path + "/" + frame_name, board_cfg_path, 0)
# the frame should always have zero coordinates, matching the left-bottom keepout border
print_to_file(board_place_path, "w", frame_name + " 0.000 0.000")
# add frame's BOM & CPL
print_to_file(board_cpl, "w", ["Designator,Mid X,Mid Y,Layer,Rotation"])
print_to_file(board_bom, "w", ["Comment,Designator,Footprint,LCSC Part #"])
append_cpl(frame_path + "/" + frame_name + "-CPL.csv", board_cpl, "0", "0")
append_bom(frame_path + "/" + frame_name + "-BOM.csv", board_bom)
schem_list = [frame_path + "/" + frame_name + "-schematic.pdf"]
print ("Processing modules...")
modules_list = []
with open(frame_path + "/" + frame_name + "-BOM.csv", 'r') as bom_f:
bom_reader = csv.reader(bom_f, delimiter=',')
# skip header
next(bom_f)
for bom_row in bom_reader:
module = bom_row[0]
des = bom_row[1]
footprint = bom_row[2]
# is it a module?
mod = pat_module.match(module)
if mod:
print (" ** Inserting " + module + " into " + des + "...")
module_name = mod.group(1)
module_rev = mod.group(2)
# get module coords from the CPL file
with open(frame_path + "/" + frame_name + "-CPL.csv", 'r') as cpl_f:
cpl_reader = csv.reader(cpl_f, delimiter=',')
# skip header
next(cpl_f)
for cpl_row in cpl_reader:
if des in cpl_row[0]:
cxmm = cpl_row[1]
cymm = cpl_row[2]
lay = cpl_row[3]
rot = cpl_row[4]
xmm = cpl_row[5]
ymm = cpl_row[6]
# remove "mm" suffix
x = float(xmm.replace("mm", ""))
y = float(ymm.replace("mm", ""))
# convert into inches (the gerber coords are imperial)
x_inch = x / 25.4
y_inch = y / 25.4
print (" ** adding " + module_name + "/" + module_rev + ", coords: " + str(x_inch) + "\", " + str(y_inch) + "\" (" + str(x) + " mm, " + str(y) + " mm)")
# add module gerbers
module_path = "modules/" + module_name + "/" + module_rev
print_module(module_name, module_path + "/" + module_name, board_cfg_path, 0)
# write abs. coords
print_to_file(board_place_path, "a", module_name + " " + str(x_inch) + " " + str(y_inch))
append_cpl(module_path + "/" + module_name + "-CPL.csv", board_cpl, x, y)
append_bom(module_path + "/" + module_name + "-BOM.csv", board_bom)
# adding schematics PDF for merging at the end
schem_list.append(module_path + "/" + module_name + "-schematic.pdf")
break
print ("* Done!")
print ("Merging gerbers...")
p = subprocess.Popen([sys.executable, "bin/gerbmerge/gerbmerge",
"--place-file=" + board_place_path,
board_cfg_path],
stdin=subprocess.PIPE)
# pass 'y' symbol to the subprocess as if a user pressed 'yes'
p.communicate(input='y\n')[0]
print ("Post-processing BOM...")
subprocess.call([sys.executable, "bin/process_BOM.py",
board_bom,
bom_replace])
print ("Merging Schematics...")
subprocess.call([sys.executable, "bin/python-combine-pdfs/python-combinepdf.py"]
+ schem_list
+ ["-o", board_path_name + "-schematic.pdf"])
print ("Rendering TOP side image...")
subprocess.call([sys.executable, "bin/render_gerber.py",
merged_gerber_path,
board_img_top,
"top",
imageDpi])
print ("Rendering BOTTOM side image...")
subprocess.call([sys.executable, "bin/render_gerber.py",
merged_gerber_path,
board_img_bottom,
"bottom",
imageDpi])
print ("Rendering OUTLINE image...")
subprocess.call([sys.executable, "bin/render_gerber.py",
merged_gerber_path,
board_img_outline,
"outline",
imageDpi])
print ("Merging 3D-models of components...")
subprocess.call([sys.executable, "bin/create_3d_components.py",
board_place_path,
board_cfg_path,
board_misc_path_name + "-3D.wrl.gz"])
print ("Rendering a 3D-model of the board components...")
subprocess.call([node_bin, "bin/render_vrml/render_components.js",
board_misc_path_name + "-3D.wrl.gz",
board_img_components,
imageDpi])
print ("Creating a composite board image...")
subprocess.call([node_bin, "bin/render_vrml/render_board.js",
board_img_top,
board_img_outline,
board_img_components,
board_img,
imageDpi])
print ("Creating an interactive html BOM...")
subprocess.call([sys.executable, "bin/gen_iBOM.py",
project_name,
frame_rev,
imageDpi,
merged_gerber_path + "/" + board_name + ".GKO",
merged_gerber_path + "/" + board_name + ".GTO",
board_img,
board_bom,
board_cpl,
"./ibom-data",
rotations,
board_path_name + "-ibom.html"])
print ("Cleaning up...")
delete_file(board_cfg_path)
delete_file(board_place_path)
print ("Creating a zip-archive with gerbers...")
shutil.make_archive(board_path_name + "-gerber", "zip", board_path, "gerber")
print ("Board processing done!")

@ -0,0 +1 @@
Subproject commit c9594071cd2c96413c6f5e5500384acdd4800b43

138
bin/render_gerber.py Normal file
View File

@ -0,0 +1,138 @@
#!/usr/bin/env python
############################################################################################
# Hellen-One: A board rendering script.
# (c) andreika <prometheus.pcb@gmail.com>
############################################################################################
import os, sys
sys.path.append("./bin/pcb-tools")
from gerber import PCB
from gerber.primitives import *
from gerber.render import theme
from gerber.render import RenderSettings
from gerber.render.cairo_backend import GerberCairoContext
if len(sys.argv) < 3:
print "Error! Please specify the gerber path, image filename and board side."
sys.exit(1)
gerberPath = sys.argv[1]
imageFileName = sys.argv[2]
boardSide = sys.argv[3]
dpi = sys.argv[4]
# This class is needed only to store the board outline as a filled mask
class HellenGerberCairoContext(GerberCairoContext):
def __init__(self, scale=600):
super(HellenGerberCairoContext, self).__init__(scale)
self.lineList = []
# this override is needed to adjust the scale to correspond to the given max_width/max_height values
def render_layers(self, layers, filename, theme, verbose, dpi, isOutline):
scale = int(dpi)
self.isOutline = isOutline
self.scale = (scale, scale)
self.clear()
# Render layers
bgsettings = theme['background']
for layer in layers:
settings = theme.get(layer.layer_class, RenderSettings())
self.render_layer(layer, settings=settings, bgsettings=bgsettings,
verbose=verbose)
self.dump(filename, verbose)
# this override is needed to gather all line segments from the outline layers
def _render_line(self, line, color):
if self.isOutline == False or self._render_count != 1: # outline layer
GerberCairoContext._render_line(self, line, color)
return
start = self.scale_point(line.start)
end = self.scale_point(line.end)
start = (start[0] + self.origin_in_pixels[0], start[1] + self.origin_in_pixels[1])
end = (end[0] + self.origin_in_pixels[0], end[1] + self.origin_in_pixels[1])
# we don't draw lines, we store the line segments
with self._clip_primitive(line):
self.lineList.append([start, end])
# thi override is needed to render the actual outline layers in a form of closed filled polygon
def flatten(self, color=None, alpha=None):
if self.isOutline == True and self._render_count == 1: # outline layer
# reconstruct the contour (the original lines go in no particular order)
curPoint = self.lineList[0]
countourPoints = []
for i in range(1000):
countourPoints.append(curPoint[0])
dist = sys.float_info.max
# find the closest point among the
for ll in self.lineList:
if ll == curPoint:
continue
d = (ll[0][0] - curPoint[1][0])**2 + (ll[0][1] - curPoint[1][1])**2
if d < dist:
dist = d
nextCurPoint = ll
d = (ll[1][0] - curPoint[1][0])**2 + (ll[1][1] - curPoint[1][1])**2
if d < dist:
dist = d
nextCurPoint = [ll[1], ll[0]]
if dist < 1.e-4:
break
if nextCurPoint[0] in countourPoints:
break
curPoint = nextCurPoint
# draw the filled contour
with self._new_mask() as mask:
mask.ctx.move_to(*countourPoints[0])
for ll in countourPoints:
mask.ctx.line_to(*ll)
mask.ctx.set_source_rgba(1.0, 1.0, 1.0, 1.0)
mask.ctx.fill()
self.ctx.mask_surface(mask.surface, 0.0, 0.0)
GerberCairoContext.flatten(self, color, alpha)
###################################################################
# read the gerbers
pcb = PCB.from_directory(gerberPath, None, verbose=True)
outlineTheme = theme.Theme(name='OutlineTheme',
background=RenderSettings(theme.COLORS['black'], alpha=0.0),
drill=RenderSettings(theme.COLORS['black'], alpha=1.0))
outlineTheme.outline = RenderSettings(theme.COLORS['white'], alpha=1.0)
jlcTheme = theme.Theme(name='JLC',
background=RenderSettings(theme.COLORS['fr-4']),
top=RenderSettings(theme.COLORS['hasl copper'], alpha=0.85),
bottom=RenderSettings(theme.COLORS['hasl copper'], alpha=0.85, mirror=True),
topmask=RenderSettings(theme.COLORS['green soldermask'], alpha=0.85, invert=True),
bottommask=RenderSettings(theme.COLORS['green soldermask'], alpha=0.85, invert=True, mirror=True),
topsilk=RenderSettings(theme.COLORS['white'], alpha=1.0),
bottomsilk=RenderSettings(theme.COLORS['white'], alpha=1.0, mirror=True),
drill=RenderSettings(theme.COLORS['black'], alpha=1.0))
curTheme = jlcTheme
# choose layers
if boardSide == 'top':
print "* Top Side:"
boardLayers = pcb.top_layers + pcb.drill_layers
isOutline = False
elif boardSide == 'bottom':
print "* Bottom Side:"
boardLayers = pcb.bottom_layers + pcb.drill_layers
isOutline = False
elif boardSide == 'outline':
print "* Board Outline:"
boardLayers = [pcb.outline_layer] + pcb.drill_layers
curTheme = outlineTheme
isOutline = True
else:
print "Error! Please specify the valid board side."
sys.exit(2)
# render
ctx = HellenGerberCairoContext()
ctx.render_layers(layers=boardLayers, filename=imageFileName, theme=curTheme, verbose=True, dpi=dpi, isOutline=isOutline)

1
bin/render_vrml/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
node_modules

View File

@ -0,0 +1,8 @@
{
"dependencies": {
"fs": "0.0.1-security",
"pngjs": "^6.0.0",
"puppeteer": "^5.5.0",
"zlib": "^1.0.5"
}
}

View File

@ -0,0 +1,78 @@
/*
############################################################################################
# Hellen-One: A board rendering server script.
# (c) andreika <prometheus.pcb@gmail.com>
############################################################################################
Node.js is required to run this script: https://nodejs.org/en/download/
Also please install PNGJS Node modules before running:
> npm install --prefix ./bin/render_vrml pngjs
*/
function getPixel(img, x, y) {
if (x < 0 || y < 0 || x >= img.width || y >= img.height)
return [0, 0, 0, 0];
var idx = (img.width * y + x) << 2;
return [ img.data[idx], img.data[idx + 1], img.data[idx + 2], img.data[idx + 3] ];
}
function createBoardImg(pcbImg, outlineImg, compImg) {
var boardImg = new PNG({
width: Math.max(pcbImg.width, outlineImg.width, compImg.width),
height: Math.max(pcbImg.height, outlineImg.height, compImg.height) });
var pcbOffY = (pcbImg.height < boardImg.height) ? -(boardImg.height - pcbImg.height) : 0;
// Blit the pcbImg using the outlineImg mask and add compImg.
// We cannot use PNG.bitblt() for that
for (var y = 0; y < boardImg.height; y++) {
for (var x = 0; x < boardImg.width; x++) {
var bPixel = getPixel(pcbImg, x, y + pcbOffY);
var cPixel = getPixel(compImg, x, y);
var a = parseFloat(cPixel[3]) / 255.0;
var na = 1.0 - a;
var idx = (boardImg.width * y + x) << 2;
boardImg.data[idx + 0] = na * bPixel[0] + a * cPixel[0];
boardImg.data[idx + 1] = na * bPixel[1] + a * cPixel[1];
boardImg.data[idx + 2] = na * bPixel[2] + a * cPixel[2];
boardImg.data[idx + 3] = na * getPixel(outlineImg, x, y)[0] + a * 255;
}
}
return boardImg;
}
try {
var PNG = require("pngjs").PNG;
// built-in modules
var fs = require("fs");
var args = process.argv.slice(2);
if (args.length < 4) {
console.log("* Error! Please specify correct arguments to run this script!");
process.exit(1)
}
// arguments
var pcbImgFile = args[0];
var outlineImgFile = args[1];
var compImgFile = args[2];
var boardImgFile = args[3];
console.log("* Reading the pcb image...");
var pcbImg = PNG.sync.read(fs.readFileSync(pcbImgFile));
console.log("* Reading the components image...");
var compImg = PNG.sync.read(fs.readFileSync(compImgFile));
console.log("* Reading the outline image...");
var outlineImg = PNG.sync.read(fs.readFileSync(outlineImgFile));
console.log("* Creating the final board image...");
var boardImg = createBoardImg(pcbImg, outlineImg, compImg);
console.log("* Saving the board image...");
fs.writeFileSync(boardImgFile, PNG.sync.write(boardImg, { colorType: 6 }));
console.log("* Done! Exiting...");
} catch(e) {
if (e.message.indexOf("Cannot find module") !== -1) {
console.error("Error! `pngjs` library is not installed? Try running `npm install --prefix ./bin/render_vrml`.");
}
console.log(e);
process.exit(e.code);
}

View File

@ -0,0 +1,85 @@
/*
############################################################################################
# Hellen-One: A 3D-component VRML rendering server script.
# (c) andreika <prometheus.pcb@gmail.com>
############################################################################################
Node.js is required to run this script: https://nodejs.org/en/download/
Also please install Puppeteer and PNGJS Node modules before running:
> npm install --prefix ./bin/render_vrml puppeteer
> npm install --prefix ./bin/render_vrml pngjs
*/
try {
const puppeteer = require("puppeteer");
var PNG = require("pngjs").PNG;
// built-in modules
var fs = require("fs");
const zlib = require("zlib");
var args = process.argv.slice(2);
if (args.length < 3) {
console.log("* Error! Please specify correct arguments to run this script!");
process.exit(1)
}
// arguments
var vrmlFile = args[0];
var compImgFile = args[1];
var dpi = parseFloat(args[2]);
console.log("* Starting Puppeteer (" + vrmlFile + " dpi=" + dpi + "...");
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
var contentHtml = fs.readFileSync("bin/render_vrml/render_vrml.html", "utf8");
console.log("* Reading the input file...");
var vrmlData = fs.readFileSync(vrmlFile);
if (vrmlFile.endsWith('.gz')) {
vrmlData = zlib.gunzipSync(vrmlData);
}
var vrmlDataBase64 = vrmlData.toString("base64");
// injecting the data to the client script
contentHtml = contentHtml.replace("___SCREEN_DPI___", dpi);
contentHtml = contentHtml.replace("___VRML_DATA___", "data:application/gzip;base64," + vrmlDataBase64);
page.on("console", message => {
message.args().forEach(async (arg) => {
const val = await arg.jsonValue()
if (JSON.stringify(val) !== JSON.stringify({}))
console.log(`* Script: ` + val)
else {
const { type, subtype, description } = arg._remoteObject;
console.log(`* Script: ${type} ${subtype}:\n ${description}`)
}
})
})
.on("pageerror", ({ message }) => console.log(`* LOG_ERROR: ` + message))
.on("response", response => console.log(`* Loading: ` + `${response.status()} ${response.url()}`))
.on("requestfailed", request => console.log(`* Loading Failed: ` + `${request.failure().errorText} ${request.url()}`));
console.log("* Executing the script...");
await page.setContent(contentHtml);
console.log("* Waiting for completion...");
const watchDog = page.waitForFunction("document.done");
await watchDog;
var screenWidth = await page.evaluate(() => document.compImgWidth);
var screenHeight = await page.evaluate(() => document.compImgHeight);
console.log("* Saving the screenshot (" + screenWidth + "x" + screenHeight + ")");
await page.setViewport({width: screenWidth, height: screenHeight, deviceScaleFactor: 1, });
await page.screenshot({path: compImgFile, omitBackground: true});
await browser.close();
console.log("* Done! Exiting...");
})();
} catch(e) {
if (e.message.indexOf("Cannot find module") !== -1) {
console.error("Error! `Puppeteer` or `pngjs` library is not installed? Try running `npm install --prefix ./bin/render_vrml`.");
}
console.log(e);
process.exit(e.code);
}

View File

@ -0,0 +1,91 @@
<!--
############################################################################################
# Hellen-One: A 3D-component VRML rendering client script.
# (c) andreika <prometheus.pcb@gmail.com>
############################################################################################
--><html><head>
<style>
html, body, div, canvas {
margin: 0;
padding: 0;
background-color: transparent;
}
</style></head><body><script type="module">
// these are replaced with the real data by the parent script
var dpi = ___SCREEN_DPI___;
var vrmlData = "___VRML_DATA___";
// the distance from the camera to the board doesn't really matter because of the otho-projection
var dist = 100;
var minDist = 0.001;
// the far clipping plane is intentionally set to be less than the dist - to clip the board surface!
var boardSurfaceClippingThreshold = 0.0001;
// use the official Three.js public distribution
import * as THREE from 'https://unpkg.com/three@0.119.0/build/three.module.js';
import { VRMLLoader } from 'https://unpkg.com/three@0.119.0/examples/jsm/loaders/VRMLLoader.js';
console.log('Starting...');
// this var is checked by the parent Node.js script
document.done = false;
// these are used in the parent caller script
document.compImgWidth = 0;
document.compImgHeight = 0;
var renderer;
function load() {
return new Promise((resolve, reject) => {
var loader = new VRMLLoader();
loader.load(vrmlData, function (object) {
console.log('Scene and camera setup...');
var box = new THREE.Box3().setFromObject(object);
var centerPos = new THREE.Vector3();
box.getCenter(centerPos);
var scene = new THREE.Scene();
scene.add(object);
// get the board size
var boxSize = new THREE.Vector3();
box.getSize(boxSize);
// the bounding size is in mm (metric), and DPI is 'imperial'
// we need width/height in pixels (rounded)
document.compImgWidth = parseInt(dpi * boxSize.x / 25.4 + 0.5);
document.compImgHeight = parseInt(dpi * boxSize.y / 25.4 + 0.5);
// setup the camera
var w2 = boxSize.x / 2;
var h2 = boxSize.y / 2;
var camera = new THREE.OrthographicCamera(-w2, w2, h2, -h2, minDist, dist - boardSurfaceClippingThreshold);
camera.position.set(centerPos.x, centerPos.y, dist);
scene.add(camera);
console.log('Rendering a static frame...');
renderer.setSize(document.compImgWidth, document.compImgHeight);
renderer.render(scene, camera);
// notify async consumers
resolve();
document.done = true;
});
});
}
async function run() {
console.log('Init renderer...');
renderer = new THREE.WebGLRenderer({antialias: true, alpha: true, preserveDrawingBuffer: true});
renderer.setClearColor(0x000000, 0);
document.body.appendChild(renderer.domElement);
console.log('Loading VRML...');
await load();
console.log('Exiting script...');
}
run();
</script></body></html>

View File

@ -0,0 +1,25 @@
#!/bin/bash
#
# This is a simple example of using Hellen-One scripts for your own board "Hellen999pin", revision "a".
# You have to put your folder somewhere outside of the Hellen-One repository.
# The folder should have a sub-folder for revision "a" and a sub-folder with all the files for your frame (gerber+BOM+CPL+schematic)
# as follows: ../my-boards/hellen999pin/boards/hellen999pin-a/frame/*
# For more info, please see: https://github.com/andreika-git/hellen-one/wiki
# For board examples and script usage, please see: https://github.com/andreika-git/hellen-boards/
#
# The script will create the output files for your board in:
# ../my-boards/hellen999pin/boards/hellen999pin-a/board/*
#
# (R309 and R311 are not populated).
#
project_base="../my-boards"
name="999pin"
rev="a"
if [[ ! -d ${project_base}/hellen${name}/boards/hellen${name}-${rev}/frame ]]; then
echo "The folder not found!"
exit 1
fi
sh ./bin/create_board.sh "${project_base}" "${name}" "${rev}" "R309=;R311="

10
ibom-data/867B.kicad_mod Normal file
View File

@ -0,0 +1,10 @@
(module MPX4250AP (layer F.Cu) (tedit 60129B0C)
(pad 1 thru_hole rect (at 0.0 -6.35) (size 1.7 1.7) (drill 1.1) (layers F.Cu F.Mask))
(pad 2 thru_hole oval (at 0.0 -3.81) (size 1.7 1.7) (drill 1.1) (layers F.Cu F.Mask))
(pad 3 thru_hole oval (at 0.0 -1.27) (size 1.7 1.7) (drill 1.1) (layers F.Cu F.Mask))
(pad 4 thru_hole oval (at 0.0 1.27) (size 1.7 1.7) (drill 1.1) (layers F.Cu F.Mask))
(pad 5 thru_hole oval (at 0.0 3.81) (size 1.7 1.7) (drill 1.1) (layers F.Cu F.Mask))
(pad 6 thru_hole oval (at 0.0 6.35) (size 1.7 1.7) (drill 1.1) (layers F.Cu F.Mask))
(pad 7 np_thru_hole circle (at 12.5400054 11.5549934) (size 0 0) (drill 4.0) (layers F.Cu F.Mask))
(pad 8 np_thru_hole circle (at 12.5400054 -11.5549934) (size 0 0) (drill 4.0) (layers F.Cu F.Mask))
)

View File

@ -0,0 +1,4 @@
(module C0603 (layer F.Cu) (tedit 6013001B)
(pad 1 smd roundrect (at -0.7899908 -0.0) (size 0.85 0.85) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 2 smd roundrect (at 0.7899908 -0.0) (size 0.85 0.85) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
)

View File

@ -0,0 +1,4 @@
(module C0805-T (layer F.Cu) (tedit 60130013)
(pad 1 smd roundrect (at -0.9500108 -0.0) (size 0.9 1.45) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 2 smd roundrect (at 0.9500108 -0.0) (size 0.9 1.45) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
)

View File

@ -0,0 +1,4 @@
(module C0805 (layer F.Cu) (tedit 60130013)
(pad 1 smd roundrect (at -0.9500108 -0.0) (size 1.0 1.45) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 2 smd roundrect (at 0.9500108 -0.0) (size 1.0 1.45) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
)

View File

@ -0,0 +1,4 @@
(module C1206 (layer F.Cu) (tedit 60130018)
(pad 1 smd roundrect (at -1.4500098 -0.0 90.0) (size 1.8 1.15) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 2 smd roundrect (at 1.4500098 -0.0 90.0) (size 1.8 1.15) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
)

View File

@ -0,0 +1,76 @@
(module CONN-TE-72-PIN (layer F.Cu) (tedit 60129B0C)
(pad 1 thru_hole oval (at -36.0499914 14.7750022 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 2 thru_hole oval (at -36.0499914 10.375011 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 3 thru_hole oval (at -36.0499914 6.7749928 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 4 thru_hole oval (at -33.5499964 14.7750022 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 5 thru_hole oval (at -33.5499964 10.375011 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 6 thru_hole oval (at -33.5499964 6.7749928 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 7 thru_hole oval (at -31.0500014 14.7750022 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 8 thru_hole oval (at -31.0500014 10.375011 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 9 thru_hole oval (at -31.0500014 6.7749928 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 10 thru_hole oval (at -28.5500064 14.7750022 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 11 thru_hole oval (at -28.5500064 10.375011 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 12 thru_hole oval (at -26.0500114 14.7750022 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 13 thru_hole oval (at -26.0500114 10.375011 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 14 thru_hole oval (at -26.0500114 6.7749928 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 15 thru_hole oval (at -23.549991 14.7750022 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 16 thru_hole oval (at -23.549991 10.375011 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 17 thru_hole oval (at -23.549991 6.7749928 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 18 thru_hole oval (at -17.6500028 14.7750022 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 19 thru_hole oval (at -17.6500028 10.375011 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 20 thru_hole oval (at -17.6500028 6.7749928 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 21 thru_hole oval (at -14.8500084 14.7750022 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 22 thru_hole oval (at -14.8500084 10.375011 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 23 thru_hole oval (at -14.8500084 6.7749928 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 24 thru_hole oval (at -12.349988 10.375011 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 25 thru_hole oval (at -12.349988 6.7749928 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 26 thru_hole oval (at -9.5400114 14.7750022 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 27 thru_hole oval (at -9.849993 10.375011 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 28 thru_hole oval (at -9.849993 6.7749928 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 29 thru_hole oval (at -6.4099948 14.7750022 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 30 thru_hole oval (at -7.349998 10.375011 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 31 thru_hole oval (at -7.349998 6.7749928 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 32 thru_hole oval (at -3.2800036 14.7750022 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 33 thru_hole oval (at -4.850003 10.375011 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 34 thru_hole oval (at -2.350008 10.375011 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 35 thru_hole oval (at -2.350008 6.7749928 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 36 thru_hole oval (at -0.1500124 14.7750022 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 37 thru_hole oval (at 0.1500124 10.375011 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 38 thru_hole oval (at 0.1500124 6.7749928 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 39 thru_hole oval (at 2.6500074 14.7750022 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 40 thru_hole oval (at 2.6500074 10.375011 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 41 thru_hole oval (at 2.6500074 6.7749928 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 42 thru_hole oval (at 8.5499956 14.7750022 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 43 thru_hole oval (at 30.750002 10.375011 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 44 thru_hole oval (at 30.750002 6.7749928 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 45 thru_hole oval (at 32.9200002 14.7750022 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 46 thru_hole oval (at 33.249997 10.375011 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 47 thru_hole oval (at 33.249997 6.7749928 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 48 thru_hole oval (at 36.0499914 14.7750022 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 49 thru_hole oval (at 36.0499914 10.375011 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 50 thru_hole oval (at 36.0499914 6.7749928 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 51 thru_hole oval (at 8.2499962 10.375011 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 52 thru_hole oval (at 8.2499962 6.7749928 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 53 thru_hole oval (at 11.6799868 14.7750022 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 54 thru_hole oval (at 10.7499912 10.375011 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 55 thru_hole oval (at 10.7499912 6.7749928 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 56 thru_hole oval (at 13.2500116 10.375011 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 57 thru_hole oval (at 13.2500116 6.7749928 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 58 thru_hole oval (at 15.7500066 10.375011 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 59 thru_hole oval (at 15.7500066 6.7749928 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 60 thru_hole oval (at 17.2699934 14.7750022 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 61 thru_hole oval (at 18.2500016 10.375011 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 62 thru_hole oval (at 18.2500016 6.7749928 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 63 thru_hole oval (at 20.40001 14.7750022 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 64 thru_hole oval (at 20.7499966 10.375011 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 65 thru_hole oval (at 23.5300012 14.7750022 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 66 thru_hole oval (at 23.2499916 10.375011 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 67 thru_hole oval (at 23.2499916 6.7749928 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 68 thru_hole oval (at 26.6599924 14.7750022 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 69 thru_hole oval (at 25.750012 10.375011 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 70 thru_hole oval (at 25.750012 6.7749928 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 71 thru_hole oval (at 28.250007 10.375011 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 72 thru_hole oval (at 29.7899836 14.7750022 180.0) (size 1.5 2.4) (drill 1.2) (layers F.Cu F.Mask))
(pad 73 np_thru_hole circle (at 28.250007 1.324991 180.0) (size 0 0) (drill 3.5) (layers F.Cu F.Mask))
(pad 74 np_thru_hole circle (at -28.5500064 1.324991 180.0) (size 0 0) (drill 3.5) (layers F.Cu F.Mask))
)

View File

@ -0,0 +1,91 @@
(module CONN-TE-81-PIN (layer F.Cu) (tedit 60130000)
(pad 1 thru_hole oval (at -56.2500018 -4.99999) (size 1.8 2.0) (drill 1.3) (layers F.Cu F.Mask))
(pad 2 thru_hole oval (at -50.449988 -4.99999) (size 1.8 2.0) (drill 1.3) (layers F.Cu F.Mask))
(pad 3 thru_hole oval (at -53.3500076 -7.3300082) (size 1.8 2.0) (drill 1.3) (layers F.Cu F.Mask))
(pad 4 thru_hole oval (at -56.2500018 -13.1299966) (size 1.8 2.0) (drill 1.3) (layers F.Cu F.Mask))
(pad 5 thru_hole oval (at -50.449988 -13.1299966) (size 1.8 2.0) (drill 1.3) (layers F.Cu F.Mask))
(pad 6 thru_hole oval (at 3.1800038 -12.8599946) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 7 thru_hole oval (at 0.6400038 -12.8599946) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 8 thru_hole oval (at -1.8999962 -12.8599946) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 9 thru_hole oval (at -4.4399962 -12.8599946) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 10 thru_hole oval (at -6.9799962 -12.8599946) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 11 thru_hole oval (at -9.5199962 -12.8599946) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 12 thru_hole oval (at -12.0599962 -12.8599946) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 13 thru_hole oval (at -14.5999962 -12.8599946) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 14 thru_hole oval (at -17.1399962 -12.8599946) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 15 thru_hole oval (at -19.6799962 -12.8599946) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 16 thru_hole oval (at -22.2199962 -12.8599946) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 17 thru_hole oval (at -24.7599962 -12.8599946) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 18 thru_hole oval (at -27.2999962 -12.8599946) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 19 thru_hole oval (at -29.8399962 -12.8599946) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 20 thru_hole oval (at -32.3799962 -12.8599946) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 21 thru_hole oval (at -34.9199962 -12.8599946) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 22 thru_hole oval (at -37.4599962 -12.8599946) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 23 thru_hole oval (at -39.9999962 -12.8599946) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 24 thru_hole oval (at -42.5399962 -12.8599946) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 25 thru_hole oval (at 3.1800038 -10.3199946) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 26 thru_hole oval (at 0.6400038 -10.3199946) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 27 thru_hole oval (at -1.8999962 -10.3199946) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 28 thru_hole oval (at -4.4399962 -10.3199946) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 29 thru_hole oval (at -6.9799962 -10.3199946) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 30 thru_hole oval (at -9.5199962 -10.3199946) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 31 thru_hole oval (at -12.0599962 -10.3199946) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 32 thru_hole oval (at -14.5999962 -10.3199946) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 33 thru_hole oval (at -17.1399962 -10.3199946) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 34 thru_hole oval (at -19.6799962 -10.3199946) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 35 thru_hole oval (at -22.2199962 -10.3199946) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 36 thru_hole oval (at -24.7599962 -10.3199946) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 37 thru_hole oval (at -27.2999962 -10.3199946) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 38 thru_hole oval (at -29.8399962 -10.3199946) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 39 thru_hole oval (at -32.3799962 -10.3199946) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 40 thru_hole oval (at -34.9199962 -10.3199946) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 41 thru_hole oval (at -37.4599962 -10.3199946) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 42 thru_hole oval (at -39.9999962 -10.3199946) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 43 thru_hole oval (at -42.5399962 -10.3199946) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 44 thru_hole oval (at 3.1800038 -4.539996) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 45 thru_hole oval (at 0.6400038 -4.539996) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 46 thru_hole oval (at -1.8999962 -4.539996) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 47 thru_hole oval (at -4.4399962 -4.539996) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 48 thru_hole oval (at -6.9799962 -4.539996) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 49 thru_hole oval (at -9.5199962 -4.539996) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 50 thru_hole oval (at -12.0599962 -4.539996) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 51 thru_hole oval (at -14.5999962 -4.539996) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 52 thru_hole oval (at -17.1399962 -4.539996) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 53 thru_hole oval (at -19.6799962 -4.539996) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 54 thru_hole oval (at -22.2199962 -4.539996) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 55 thru_hole oval (at -24.7599962 -4.539996) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 56 thru_hole oval (at -27.2999962 -4.539996) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 57 thru_hole oval (at -29.8399962 -4.539996) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 58 thru_hole oval (at -32.3799962 -4.539996) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 59 thru_hole oval (at -34.9199962 -4.539996) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 60 thru_hole oval (at -37.4599962 -4.539996) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 61 thru_hole oval (at -39.9999962 -4.539996) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 62 thru_hole oval (at -42.5399962 -4.539996) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 63 thru_hole oval (at 3.1800038 -1.999996) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 64 thru_hole oval (at 0.6400038 -1.999996) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 65 thru_hole oval (at -1.8999962 -1.999996) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 66 thru_hole oval (at -4.4399962 -1.999996) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 67 thru_hole oval (at -6.9799962 -1.999996) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 68 thru_hole oval (at -9.5199962 -1.999996) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 69 thru_hole oval (at -12.0599962 -1.999996) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 70 thru_hole oval (at -14.5999962 -1.999996) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 71 thru_hole oval (at -17.1399962 -1.999996) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 72 thru_hole oval (at -19.6799962 -1.999996) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 73 thru_hole oval (at -22.2199962 -1.999996) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 74 thru_hole oval (at -24.7599962 -1.999996) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 75 thru_hole oval (at -27.2999962 -1.999996) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 76 thru_hole oval (at -29.8399962 -1.999996) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 77 thru_hole oval (at -32.3799962 -1.999996) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 78 thru_hole oval (at -34.9199962 -1.999996) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 79 thru_hole oval (at -37.4599962 -1.999996) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 80 thru_hole oval (at -39.9999962 -1.999996) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 81 thru_hole oval (at -42.5399962 -1.999996) (size 1.3 1.8) (drill 1.0) (layers F.Cu F.Mask))
(pad 82 np_thru_hole circle (at 11.200003 -0.0) (size 0 0) (drill 4.0) (layers F.Cu F.Mask))
(pad 83 np_thru_hole circle (at -62.8499886 -0.0) (size 0 0) (drill 4.0) (layers F.Cu F.Mask))
(pad 84 np_thru_hole circle (at -60.9000052 -7.8000098) (size 0 0) (drill 2.5) (layers F.Cu F.Mask))
(pad 85 np_thru_hole circle (at -61.3300018 -13.1299966) (size 0 0) (drill 2.5) (layers F.Cu F.Mask))
(pad 86 np_thru_hole circle (at 10.3400098 -13.1299966) (size 0 0) (drill 2.5) (layers F.Cu F.Mask))
(pad 87 np_thru_hole circle (at -66.2200098 -4.5699934) (size 0 0) (drill 4.0) (layers F.Cu F.Mask))
(pad 88 np_thru_hole circle (at 14.7100036 -4.5699934 180.0) (size 0 0) (drill 4.0) (layers F.Cu F.Mask))
(pad 89 np_thru_hole circle (at 9.2499942 -7.8000098 180.0) (size 0 0) (drill 2.5) (layers F.Cu F.Mask))
)

View File

@ -0,0 +1,17 @@
(module CONN-USB-MINI-B (layer F.Cu) (tedit 60130000)
(pad 1 smd oval (at 1.5999968 3.826002 180.0) (size 0.5 2.25) (layers F.Cu F.Mask))
(pad 2 smd oval (at 0.7999984 3.826002 180.0) (size 0.5 2.25) (layers F.Cu F.Mask))
(pad 3 smd oval (at 0.0 3.826002 180.0) (size 0.5 2.25) (layers F.Cu F.Mask))
(pad 4 smd oval (at -0.7999984 3.826002 180.0) (size 0.5 2.25) (layers F.Cu F.Mask))
(pad 5 smd oval (at -1.5999968 3.826002 180.0) (size 0.5 2.25) (layers F.Cu F.Mask))
(pad 6 thru_hole oval (at 2.1999956 1.151001 180.0) (size 0.9 0.9) (drill 0.9) (layers F.Cu F.Mask))
(pad 7 thru_hole oval (at -2.1999956 1.151001) (size 0.9 0.9) (drill 0.9) (layers F.Cu F.Mask))
(pad 8 smd roundrect (at -4.9250092 3.501009) (size 2.05 3.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 9 smd roundrect (at -4.9250092 -0.7489952) (size 2.05 4.0) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 10 smd roundrect (at 4.9250092 3.501009 180.0) (size 2.05 3.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 11 smd roundrect (at 4.9250092 -0.7489952 180.0) (size 2.05 4.0) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 12 smd roundrect (at 4.4500038 3.731006 180.0) (size 2.0 2.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 13 smd roundrect (at 4.4500038 -1.7189958 180.0) (size 2.0 2.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 14 smd roundrect (at -4.4500038 -1.7189958) (size 2.0 2.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 15 smd roundrect (at -4.4500038 3.731006) (size 2.0 2.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
)

View File

@ -0,0 +1,12 @@
(module D2PAK-VIA-JUMPER (layer F.Cu) (tedit 60130000)
(pad 1 smd roundrect (at -5.5000144 -2.54 270.0) (size 1.05 2.0) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 2 smd rect (at 7.4749914 -3.2749998 270.0) (size 1.0 3.0) (layers F.Cu F.Mask))
(pad 3 smd rect (at 7.4749914 -0.0 270.0) (size 1.0 3.0) (layers F.Cu F.Mask))
(pad 4 smd rect (at 7.4749914 3.2749998 270.0) (size 1.0 3.0) (layers F.Cu F.Mask))
(pad 5 smd rect (at 2.9250894 -3.2500062 90.0) (size 1.0 2.0) (layers F.Cu F.Mask))
(pad 6 smd rect (at 2.4250904 0.0249936 90.0) (size 1.0 3.0) (layers F.Cu F.Mask))
(pad 7 smd rect (at 2.4250904 3.2999934 90.0) (size 1.0 3.0) (layers F.Cu F.Mask))
(pad 8 smd roundrect (at 4.1500044 1.8749518) (size 11.15 7.2) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 9 smd roundrect (at 5.499989 -3.0999938) (size 8.45 4.75) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 10 smd roundrect (at -5.499989 2.54 270.0) (size 1.05 2.0) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
)

View File

@ -0,0 +1,8 @@
(module HDR1X6 (layer F.Cu) (tedit 60129B0C)
(pad 1 thru_hole rect (at 0.0 -0.0) (size 1.5 1.5) (drill 0.9) (layers F.Cu F.Mask))
(pad 2 thru_hole oval (at 2.54 -0.0) (size 1.5 1.5) (drill 0.9) (layers F.Cu F.Mask))
(pad 3 thru_hole oval (at 5.08 -0.0) (size 1.5 1.5) (drill 0.9) (layers F.Cu F.Mask))
(pad 4 thru_hole oval (at 7.62 -0.0) (size 1.5 1.5) (drill 0.9) (layers F.Cu F.Mask))
(pad 5 thru_hole oval (at 10.16 -0.0) (size 1.5 1.5) (drill 0.9) (layers F.Cu F.Mask))
(pad 6 thru_hole oval (at 12.7 -0.0) (size 1.5 1.5) (drill 0.9) (layers F.Cu F.Mask))
)

View File

@ -0,0 +1,26 @@
(module HDR2X12 (layer F.Cu) (tedit 60129B0C)
(pad 1 thru_hole rect (at 0.0 -0.0) (size 1.5 1.5) (drill 0.9) (layers F.Cu F.Mask))
(pad 2 thru_hole oval (at 0.0 -2.54) (size 1.5 1.5) (drill 0.9) (layers F.Cu F.Mask))
(pad 3 thru_hole oval (at 2.54 -0.0) (size 1.5 1.5) (drill 0.9) (layers F.Cu F.Mask))
(pad 4 thru_hole oval (at 2.54 -2.54) (size 1.5 1.5) (drill 0.9) (layers F.Cu F.Mask))
(pad 5 thru_hole oval (at 5.08 -0.0) (size 1.5 1.5) (drill 0.9) (layers F.Cu F.Mask))
(pad 6 thru_hole oval (at 5.08 -2.54) (size 1.5 1.5) (drill 0.9) (layers F.Cu F.Mask))
(pad 7 thru_hole oval (at 7.62 -0.0) (size 1.5 1.5) (drill 0.9) (layers F.Cu F.Mask))
(pad 8 thru_hole oval (at 7.62 -2.54) (size 1.5 1.5) (drill 0.9) (layers F.Cu F.Mask))
(pad 9 thru_hole oval (at 10.16 -0.0) (size 1.5 1.5) (drill 0.9) (layers F.Cu F.Mask))
(pad 10 thru_hole oval (at 10.16 -2.54) (size 1.5 1.5) (drill 0.9) (layers F.Cu F.Mask))
(pad 11 thru_hole oval (at 12.7 -0.0) (size 1.5 1.5) (drill 0.9) (layers F.Cu F.Mask))
(pad 12 thru_hole oval (at 12.7 -2.54) (size 1.5 1.5) (drill 0.9) (layers F.Cu F.Mask))
(pad 13 thru_hole oval (at 15.24 -0.0) (size 1.5 1.5) (drill 0.9) (layers F.Cu F.Mask))
(pad 14 thru_hole oval (at 15.24 -2.54) (size 1.5 1.5) (drill 0.9) (layers F.Cu F.Mask))
(pad 15 thru_hole oval (at 17.78 -0.0) (size 1.5 1.5) (drill 0.9) (layers F.Cu F.Mask))
(pad 16 thru_hole oval (at 17.78 -2.54) (size 1.5 1.5) (drill 0.9) (layers F.Cu F.Mask))
(pad 17 thru_hole oval (at 20.32 -0.0) (size 1.5 1.5) (drill 0.9) (layers F.Cu F.Mask))
(pad 18 thru_hole oval (at 20.32 -2.54) (size 1.5 1.5) (drill 0.9) (layers F.Cu F.Mask))
(pad 19 thru_hole oval (at 22.86 -0.0) (size 1.5 1.5) (drill 0.9) (layers F.Cu F.Mask))
(pad 20 thru_hole oval (at 22.86 -2.54) (size 1.5 1.5) (drill 0.9) (layers F.Cu F.Mask))
(pad 21 thru_hole oval (at 25.4 -0.0) (size 1.5 1.5) (drill 0.9) (layers F.Cu F.Mask))
(pad 22 thru_hole oval (at 25.4 -2.54) (size 1.5 1.5) (drill 0.9) (layers F.Cu F.Mask))
(pad 23 thru_hole oval (at 27.94 -0.0) (size 1.5 1.5) (drill 0.9) (layers F.Cu F.Mask))
(pad 24 thru_hole oval (at 27.94 -2.54) (size 1.5 1.5) (drill 0.9) (layers F.Cu F.Mask))
)

View File

@ -0,0 +1,22 @@
(module HDR2X5-F-TH-SMD (layer F.Cu) (tedit 6013001B)
(pad 1 smd oval (at -5.08 2.9750004) (size 1.02 2.85) (layers F.Cu F.Mask))
(pad 2 thru_hole rect (at -5.08 1.27) (size 1.5 1.5) (drill 0.9) (layers F.Cu F.Mask))
(pad 3 smd oval (at -5.08 -2.9750004) (size 1.02 2.85) (layers F.Cu F.Mask))
(pad 4 thru_hole oval (at -5.08 -1.27) (size 1.5 1.5) (drill 0.9) (layers F.Cu F.Mask))
(pad 5 smd oval (at -2.54 2.9750004) (size 1.02 2.85) (layers F.Cu F.Mask))
(pad 6 thru_hole oval (at -2.54 1.27) (size 1.5 1.5) (drill 0.9) (layers F.Cu F.Mask))
(pad 7 smd oval (at -2.54 -2.9750004) (size 1.02 2.85) (layers F.Cu F.Mask))
(pad 8 thru_hole oval (at -2.54 -1.27) (size 1.5 1.5) (drill 0.9) (layers F.Cu F.Mask))
(pad 9 smd oval (at 0.0 2.9750004) (size 1.02 2.85) (layers F.Cu F.Mask))
(pad 10 thru_hole oval (at 0.0 1.27) (size 1.5 1.5) (drill 0.9) (layers F.Cu F.Mask))
(pad 11 smd oval (at 0.0 -2.9750004) (size 1.02 2.85) (layers F.Cu F.Mask))
(pad 12 thru_hole oval (at 0.0 -1.27) (size 1.5 1.5) (drill 0.9) (layers F.Cu F.Mask))
(pad 13 smd oval (at 2.54 2.9750004) (size 1.02 2.85) (layers F.Cu F.Mask))
(pad 14 thru_hole oval (at 2.54 1.27) (size 1.5 1.5) (drill 0.9) (layers F.Cu F.Mask))
(pad 15 smd oval (at 2.54 -2.9750004) (size 1.02 2.85) (layers F.Cu F.Mask))
(pad 16 thru_hole oval (at 2.54 -1.27) (size 1.5 1.5) (drill 0.9) (layers F.Cu F.Mask))
(pad 17 smd oval (at 5.08 2.9750004) (size 1.02 2.85) (layers F.Cu F.Mask))
(pad 18 thru_hole oval (at 5.08 1.27) (size 1.5 1.5) (drill 0.9) (layers F.Cu F.Mask))
(pad 19 smd oval (at 5.08 -2.9750004) (size 1.02 2.85) (layers F.Cu F.Mask))
(pad 20 thru_hole oval (at 5.08 -1.27) (size 1.5 1.5) (drill 0.9) (layers F.Cu F.Mask))
)

View File

@ -0,0 +1,11 @@
(module JTAG-TC2030-IDC-NL (layer F.Cu) (tedit 60130014)
(pad 1 smd oval (at -1.2700254 0.6350254) (size 0.7874 0.7874) (layers F.Cu F.Mask))
(pad 2 smd oval (at -1.2700254 -0.6349746) (size 0.7874 0.7874) (layers F.Cu F.Mask))
(pad 3 smd oval (at -2.54e-05 0.6350254) (size 0.7874 0.7874) (layers F.Cu F.Mask))
(pad 4 smd oval (at -2.54e-05 -0.6349746) (size 0.7874 0.7874) (layers F.Cu F.Mask))
(pad 5 smd oval (at 1.2699746 0.6350254) (size 0.7874 0.7874) (layers F.Cu F.Mask))
(pad 6 smd oval (at 1.2699746 -0.6349746) (size 0.7874 0.7874) (layers F.Cu F.Mask))
(pad 7 thru_hole oval (at 2.5399746 -1.0159746) (size 0.9906 0.9906) (drill 0.9906) (layers F.Cu F.Mask))
(pad 8 thru_hole oval (at -2.5400254 2.54e-05) (size 0.9906 0.9906) (drill 0.9906) (layers F.Cu F.Mask))
(pad 9 thru_hole oval (at 2.5399746 1.0160254) (size 0.9906 0.9906) (drill 0.9906) (layers F.Cu F.Mask))
)

View File

@ -0,0 +1,4 @@
(module L0805 (layer F.Cu) (tedit 60130014)
(pad 1 smd rect (at -0.9500362 -0.0) (size 1.3 1.5) (layers F.Cu F.Mask))
(pad 2 smd rect (at 0.9499854 -0.0) (size 1.3 1.5) (layers F.Cu F.Mask))
)

View File

@ -0,0 +1,4 @@
(module LED-0603 (layer F.Cu) (tedit 60130014)
(pad 1 smd roundrect (at 0.7999984 0.0500126 180.0) (size 1.0 1.1) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 2 smd roundrect (at -0.8999982 0.0500126 180.0) (size 1.0 1.1) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
)

View File

@ -0,0 +1,4 @@
(module LED-0805 (layer F.Cu) (tedit 60129B0C)
(pad 1 smd roundrect (at 0.9500108 -0.0) (size 1.3 1.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 2 smd roundrect (at -0.9500108 -0.0) (size 1.3 1.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
)

14
ibom-data/LGA12.kicad_mod Normal file
View File

@ -0,0 +1,14 @@
(module LGA12 (layer F.Cu) (tedit 60130000)
(pad 1 smd rect (at -0.7999984 -0.7500112) (size 0.35 0.25) (layers F.Cu F.Mask))
(pad 2 smd rect (at -0.7999984 -0.2499868) (size 0.35 0.25) (layers F.Cu F.Mask))
(pad 3 smd rect (at -0.7999984 0.2499868) (size 0.35 0.25) (layers F.Cu F.Mask))
(pad 4 smd rect (at -0.7999984 0.7500112) (size 0.35 0.25) (layers F.Cu F.Mask))
(pad 5 smd rect (at -0.2499868 0.7999984 90.0) (size 0.35 0.25) (layers F.Cu F.Mask))
(pad 6 smd rect (at 0.2499868 0.7999984 90.0) (size 0.35 0.25) (layers F.Cu F.Mask))
(pad 7 smd rect (at 0.7999984 0.7500112) (size 0.35 0.25) (layers F.Cu F.Mask))
(pad 8 smd rect (at 0.7999984 0.2499868) (size 0.35 0.25) (layers F.Cu F.Mask))
(pad 9 smd rect (at 0.7999984 -0.2499868) (size 0.35 0.25) (layers F.Cu F.Mask))
(pad 10 smd rect (at 0.7999984 -0.7500112) (size 0.35 0.25) (layers F.Cu F.Mask))
(pad 11 smd rect (at 0.2499868 -0.7999984 90.0) (size 0.35 0.25) (layers F.Cu F.Mask))
(pad 12 smd rect (at -0.2499868 -0.7999984 90.0) (size 0.35 0.25) (layers F.Cu F.Mask))
)

178
ibom-data/LQFP176.kicad_mod Normal file
View File

@ -0,0 +1,178 @@
(module LQFP176 (layer F.Cu) (tedit 60130014)
(pad 1 smd oval (at -13.1499864 -10.7500166 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 2 smd oval (at -13.1499864 -10.2499922 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 3 smd oval (at -13.1499864 -9.7500186 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 4 smd oval (at -13.1499864 -9.2499942 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 5 smd oval (at -13.1499864 -8.7500206 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 6 smd oval (at -13.1499864 -8.2499962 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 7 smd oval (at -13.1499864 -7.7500226 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 8 smd oval (at -13.1499864 -7.2499982 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 9 smd oval (at -13.1499864 -6.7500246 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 10 smd oval (at -13.1499864 -6.2500002 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 11 smd oval (at -13.1499864 -5.7500266 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 12 smd oval (at -13.1499864 -5.2500022 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 13 smd oval (at -13.1499864 -4.7500286 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 14 smd oval (at -13.1499864 -4.2500042 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 15 smd oval (at -13.1499864 -3.7500306 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 16 smd oval (at -13.1499864 -3.2500062 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 17 smd oval (at -13.1499864 -2.7500326 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 18 smd oval (at -13.1499864 -2.2500082 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 19 smd oval (at -13.1499864 -1.7500346 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 20 smd oval (at -13.1499864 -1.2500102 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 21 smd oval (at -13.1499864 -0.7500366 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 22 smd oval (at -13.1499864 -0.2500122 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 23 smd oval (at -13.1499864 0.2499614 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 24 smd oval (at -13.1499864 0.7499858 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 25 smd oval (at -13.1499864 1.2499594 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 26 smd oval (at -13.1499864 1.7499838 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 27 smd oval (at -13.1499864 2.2499574 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 28 smd oval (at -13.1499864 2.7499818 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 29 smd oval (at -13.1499864 3.2499554 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 30 smd oval (at -13.1499864 3.7499798 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 31 smd oval (at -13.1499864 4.2499534 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 32 smd oval (at -13.1499864 4.7499778 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 33 smd oval (at -13.1499864 5.2499514 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 34 smd oval (at -13.1499864 5.7499758 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 35 smd oval (at -13.1499864 6.2499494 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 36 smd oval (at -13.1499864 6.7499738 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 37 smd oval (at -13.1499864 7.2499474 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 38 smd oval (at -13.1499864 7.7499718 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 39 smd oval (at -13.1499864 8.2499454 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 40 smd oval (at -13.1499864 8.7499698 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 41 smd oval (at -13.1499864 9.2499434 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 42 smd oval (at -13.1499864 9.7499678 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 43 smd oval (at -13.1499864 10.2499414 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 44 smd oval (at -13.1499864 10.7499658 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 45 smd oval (at -10.7499912 13.149961) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 46 smd oval (at -10.2499668 13.149961) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 47 smd oval (at -9.7499932 13.149961) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 48 smd oval (at -9.2499688 13.149961) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 49 smd oval (at -8.7499952 13.149961) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 50 smd oval (at -8.2499708 13.149961) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 51 smd oval (at -7.7499972 13.149961) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 52 smd oval (at -7.2499728 13.149961) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 53 smd oval (at -6.7499992 13.149961) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 54 smd oval (at -6.2499748 13.149961) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 55 smd oval (at -5.7500012 13.149961) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 56 smd oval (at -5.2499768 13.149961) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 57 smd oval (at -4.7500032 13.149961) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 58 smd oval (at -4.2499788 13.149961) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 59 smd oval (at -3.7500052 13.149961) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 60 smd oval (at -3.2499808 13.149961) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 61 smd oval (at -2.7500072 13.149961) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 62 smd oval (at -2.2499828 13.149961) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 63 smd oval (at -1.7500092 13.149961) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 64 smd oval (at -1.2499848 13.149961) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 65 smd oval (at -0.7500112 13.149961) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 66 smd oval (at -0.2499868 13.149961) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 67 smd oval (at 0.2499868 13.149961) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 68 smd oval (at 0.7500112 13.149961) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 69 smd oval (at 1.2499848 13.149961) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 70 smd oval (at 1.7500092 13.149961) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 71 smd oval (at 2.2499828 13.149961) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 72 smd oval (at 2.7500072 13.149961) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 73 smd oval (at 3.2499808 13.149961) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 74 smd oval (at 3.7500052 13.149961) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 75 smd oval (at 4.2499788 13.149961) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 76 smd oval (at 4.7500032 13.149961) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 77 smd oval (at 5.2499768 13.149961) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 78 smd oval (at 5.7500012 13.149961) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 79 smd oval (at 6.2499748 13.149961) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 80 smd oval (at 6.7499992 13.149961) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 81 smd oval (at 7.2499728 13.149961) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 82 smd oval (at 7.7499972 13.149961) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 83 smd oval (at 8.2499708 13.149961) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 84 smd oval (at 8.7499952 13.149961) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 85 smd oval (at 9.2499688 13.149961) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 86 smd oval (at 9.7499932 13.149961) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 87 smd oval (at 10.2499668 13.149961) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 88 smd oval (at 10.7499912 13.149961) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 89 smd oval (at 13.1499864 10.7499658 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 90 smd oval (at 13.1499864 10.2499414 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 91 smd oval (at 13.1499864 9.7499678 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 92 smd oval (at 13.1499864 9.2499434 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 93 smd oval (at 13.1499864 8.7499698 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 94 smd oval (at 13.1499864 8.2499454 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 95 smd oval (at 13.1499864 7.7499718 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 96 smd oval (at 13.1499864 7.2499474 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 97 smd oval (at 13.1499864 6.7499738 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 98 smd oval (at 13.1499864 6.2499494 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 99 smd oval (at 13.1499864 5.7499758 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 100 smd oval (at 13.1499864 5.2499514 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 101 smd oval (at 13.1499864 4.7499778 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 102 smd oval (at 13.1499864 4.2499534 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 103 smd oval (at 13.1499864 3.7499798 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 104 smd oval (at 13.1499864 3.2499554 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 105 smd oval (at 13.1499864 2.7499818 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 106 smd oval (at 13.1499864 2.2499574 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 107 smd oval (at 13.1499864 1.7499838 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 108 smd oval (at 13.1499864 1.2499594 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 109 smd oval (at 13.1499864 0.7499858 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 110 smd oval (at 13.1499864 0.2499614 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 111 smd oval (at 13.1499864 -0.2500122 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 112 smd oval (at 13.1499864 -0.7500366 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 113 smd oval (at 13.1499864 -1.2500102 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 114 smd oval (at 13.1499864 -1.7500346 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 115 smd oval (at 13.1499864 -2.2500082 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 116 smd oval (at 13.1499864 -2.7500326 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 117 smd oval (at 13.1499864 -3.2500062 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 118 smd oval (at 13.1499864 -3.7500306 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 119 smd oval (at 13.1499864 -4.2500042 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 120 smd oval (at 13.1499864 -4.7500286 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 121 smd oval (at 13.1499864 -5.2500022 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 122 smd oval (at 13.1499864 -5.7500266 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 123 smd oval (at 13.1499864 -6.2500002 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 124 smd oval (at 13.1499864 -6.7500246 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 125 smd oval (at 13.1499864 -7.2499982 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 126 smd oval (at 13.1499864 -7.7500226 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 127 smd oval (at 13.1499864 -8.2499962 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 128 smd oval (at 13.1499864 -8.7500206 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 129 smd oval (at 13.1499864 -9.2499942 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 130 smd oval (at 13.1499864 -9.7500186 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 131 smd oval (at 13.1499864 -10.2499922 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 132 smd oval (at 13.1499864 -10.7500166 90.0) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 133 smd oval (at 10.7499912 -13.1500118) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 134 smd oval (at 10.2499668 -13.1500118) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 135 smd oval (at 9.7499932 -13.1500118) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 136 smd oval (at 9.2499688 -13.1500118) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 137 smd oval (at 8.7499952 -13.1500118) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 138 smd oval (at 8.2499708 -13.1500118) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 139 smd oval (at 7.7499972 -13.1500118) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 140 smd oval (at 7.2499728 -13.1500118) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 141 smd oval (at 6.7499992 -13.1500118) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 142 smd oval (at 6.2499748 -13.1500118) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 143 smd oval (at 5.7500012 -13.1500118) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 144 smd oval (at 5.2499768 -13.1500118) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 145 smd oval (at 4.7500032 -13.1500118) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 146 smd oval (at 4.2499788 -13.1500118) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 147 smd oval (at 3.7500052 -13.1500118) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 148 smd oval (at 3.2499808 -13.1500118) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 149 smd oval (at 2.7500072 -13.1500118) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 150 smd oval (at 2.2499828 -13.1500118) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 151 smd oval (at 1.7500092 -13.1500118) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 152 smd oval (at 1.2499848 -13.1500118) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 153 smd oval (at 0.7500112 -13.1500118) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 154 smd oval (at 0.2499868 -13.1500118) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 155 smd oval (at -0.2499868 -13.1500118) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 156 smd oval (at -0.7500112 -13.1500118) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 157 smd oval (at -1.2499848 -13.1500118) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 158 smd oval (at -1.7500092 -13.1500118) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 159 smd oval (at -2.2499828 -13.1500118) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 160 smd oval (at -2.7500072 -13.1500118) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 161 smd oval (at -3.2499808 -13.1500118) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 162 smd oval (at -3.7500052 -13.1500118) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 163 smd oval (at -4.2499788 -13.1500118) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 164 smd oval (at -4.7500032 -13.1500118) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 165 smd oval (at -5.2499768 -13.1500118) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 166 smd oval (at -5.7500012 -13.1500118) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 167 smd oval (at -6.2499748 -13.1500118) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 168 smd oval (at -6.7499992 -13.1500118) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 169 smd oval (at -7.2499728 -13.1500118) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 170 smd oval (at -7.7499972 -13.1500118) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 171 smd oval (at -8.2499708 -13.1500118) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 172 smd oval (at -8.7499952 -13.1500118) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 173 smd oval (at -9.2499688 -13.1500118) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 174 smd oval (at -9.7499932 -13.1500118) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 175 smd oval (at -10.2499668 -13.1500118) (size 0.22 1.3) (layers F.Cu F.Mask))
(pad 176 smd oval (at -10.7499912 -13.1500118) (size 0.22 1.3) (layers F.Cu F.Mask))
)

13
ibom-data/M4.kicad_mod Normal file
View File

@ -0,0 +1,13 @@
(module M4 (layer F.Cu) (tedit 60108329)
(pad 1 smd oval (at 3.9749984 -5.8874914) (size 0.5 11.4) (layers F.Cu F.Mask))
(pad 2 smd oval (at 11.3199926 -0.3499866 90.0) (size 0.5 15.2) (layers F.Cu F.Mask))
(pad 3 smd oval (at 18.6749944 -7.762494 180.0) (size 0.5 15.2) (layers F.Cu F.Mask))
(pad 4 smd oval (at 10.1750114 -15.1750268 270.0) (size 0.4 17.4) (layers F.Cu F.Mask))
(pad 5 thru_hole oval (at 3.4249868 -13.5750046 90.0) (size 0.6 0.6) (drill 0.3) (layers F.Cu F.Mask))
(pad 6 thru_hole oval (at 5.0000154 -8.6700106 180.0) (size 0.6 0.6) (drill 0.3) (layers F.Cu F.Mask))
(pad 7 thru_hole oval (at 17.7040286 -8.679053 180.0) (size 0.6 0.6) (drill 0.3) (layers F.Cu F.Mask))
(pad 8 thru_hole oval (at 9.2250006 -8.0000094 180.0) (size 0.6 0.6) (drill 0.3) (layers F.Cu F.Mask))
(pad 9 thru_hole oval (at 10.4000046 -8.0000094 180.0) (size 0.6 0.6) (drill 0.3) (layers F.Cu F.Mask))
(pad 10 thru_hole oval (at 12.5750066 -8.0000094 180.0) (size 0.6 0.6) (drill 0.3) (layers F.Cu F.Mask))
(pad 11 thru_hole oval (at 14.7999958 -8.0000094 180.0) (size 0.6 0.6) (drill 0.3) (layers F.Cu F.Mask))
)

View File

@ -0,0 +1,11 @@
(module MODULE-USB-MINI (layer F.Cu) (tedit 60129B0C)
(pad 1 thru_hole rect (at -5.08 -0.0) (size 1.5 1.5) (drill 0.9) (layers F.Cu F.Mask))
(pad 2 thru_hole oval (at -2.54 -0.0) (size 1.5 1.5) (drill 0.9) (layers F.Cu F.Mask))
(pad 3 thru_hole oval (at 0.0 -0.0) (size 1.5 1.5) (drill 0.9) (layers F.Cu F.Mask))
(pad 4 thru_hole oval (at 2.54 -0.0) (size 1.5 1.5) (drill 0.9) (layers F.Cu F.Mask))
(pad 5 thru_hole oval (at 5.08 -0.0) (size 1.5 1.5) (drill 0.9) (layers F.Cu F.Mask))
(pad 6 thru_hole rect (at 5.6500014 8.1250028 180.0) (size 1.5 1.5) (drill 0.9) (layers F.Cu F.Mask))
(pad 7 thru_hole rect (at -5.6500014 8.1250028) (size 1.5 1.5) (drill 0.9) (layers F.Cu F.Mask))
(pad 8 thru_hole rect (at 7.8000098 12.9999994 180.0) (size 1.5 1.5) (drill 0.9) (layers F.Cu F.Mask))
(pad 9 thru_hole rect (at -7.8000098 12.9999994) (size 1.5 1.5) (drill 0.9) (layers F.Cu F.Mask))
)

View File

@ -0,0 +1,13 @@
(module MOD_HELLEN_CAN (layer F.Cu) (tedit 60130015)
(pad 1 smd oval (at 0.1999996 -4.1375076 180.0) (size 0.2 5.67) (layers F.Cu F.Mask))
(pad 2 smd oval (at 6.3749936 -0.2750058 270.0) (size 0.4 9.8) (layers F.Cu F.Mask))
(pad 3 smd oval (at 11.1750094 -3.5375088 180.0) (size 0.2 6.8) (layers F.Cu F.Mask))
(pad 4 smd oval (at 5.674995 -6.8749926 90.0) (size 0.2 11.1) (layers F.Cu F.Mask))
(pad 5 smd oval (at 11.0000034 -0.2750058 180.0) (size 0.5 0.25) (layers F.Cu F.Mask))
(pad 6 smd oval (at 0.649986 -0.324993) (size 0.25 0.5) (layers F.Cu F.Mask))
(pad 7 smd oval (at 1.1500104 -0.324993) (size 0.25 0.5) (layers F.Cu F.Mask))
(pad 8 thru_hole oval (at 7.6999846 -1.3750036 180.0) (size 0.6 0.6) (drill 0.3) (layers F.Cu F.Mask))
(pad 9 thru_hole oval (at 6.8250054 -1.8999962 180.0) (size 0.6 0.6) (drill 0.3) (layers F.Cu F.Mask))
(pad 10 thru_hole oval (at 8.0000094 -2.6500074 270.0) (size 0.6 0.6) (drill 0.3) (layers F.Cu F.Mask))
(pad 11 thru_hole oval (at 7.9250032 -6.1999876 270.0) (size 0.6 0.6) (drill 0.3) (layers F.Cu F.Mask))
)

View File

@ -0,0 +1,23 @@
(module MOD_HELLEN_IGN8 (layer F.Cu) (tedit 60130019)
(pad 1 smd oval (at 0.2999994 -13.4999984 45.0) (size 0.65 0.25) (layers F.Cu F.Mask))
(pad 2 smd oval (at 3.262503 -13.6499854 90.0) (size 0.25 5.8) (layers F.Cu F.Mask))
(pad 3 smd oval (at 0.1500124 -8.4000086 90.0) (size 10.2 0.25) (layers F.Cu F.Mask))
(pad 4 smd oval (at 7.77494 -0.2753868 90.0) (size 0.4 0.2) (layers F.Cu F.Mask))
(pad 5 smd oval (at 7.014972 -0.2753868 90.0) (size 0.4 0.2) (layers F.Cu F.Mask))
(pad 6 smd oval (at 5.839968 -0.2753868 90.0) (size 0.4 0.2) (layers F.Cu F.Mask))
(pad 7 smd oval (at 4.6649894 -0.2753868 90.0) (size 0.4 0.2) (layers F.Cu F.Mask))
(pad 8 smd oval (at 3.8250876 -0.2753868 90.0) (size 0.4 0.2) (layers F.Cu F.Mask))
(pad 9 smd oval (at 3.0750002 -0.2753868 90.0) (size 0.4 0.2) (layers F.Cu F.Mask))
(pad 10 smd oval (at 1.8999962 -0.2753868 90.0) (size 0.4 0.2) (layers F.Cu F.Mask))
(pad 11 smd oval (at 0.7249922 -0.2753868 90.0) (size 0.4 0.2) (layers F.Cu F.Mask))
(pad 12 thru_hole oval (at 5.7650126 -10.3749856 180.0) (size 0.6 0.6) (drill 0.3) (layers F.Cu F.Mask))
(pad 13 thru_hole oval (at 7.6000102 -9.9499674 180.0) (size 0.6 0.6) (drill 0.3) (layers F.Cu F.Mask))
(pad 14 thru_hole oval (at 5.5500016 -9.3999812 180.0) (size 0.6 0.6) (drill 0.3) (layers F.Cu F.Mask))
(pad 15 thru_hole oval (at 5.7649872 -8.5250274) (size 0.6 0.6) (drill 0.3) (layers F.Cu F.Mask))
(pad 16 thru_hole oval (at 5.8399934 -7.674991 180.0) (size 0.6 0.6) (drill 0.3) (layers F.Cu F.Mask))
(pad 17 thru_hole oval (at 7.6000102 -7.3499726 180.0) (size 0.6 0.6) (drill 0.3) (layers F.Cu F.Mask))
(pad 18 thru_hole oval (at 6.2900052 -6.050026) (size 0.6 0.6) (drill 0.3) (layers F.Cu F.Mask))
(pad 19 thru_hole oval (at 7.6000102 -5.3999892 180.0) (size 0.6 0.6) (drill 0.3) (layers F.Cu F.Mask))
(pad 20 thru_hole oval (at 1.675003 -12.5750066 180.0) (size 0.6 0.6) (drill 0.3) (layers F.Cu F.Mask))
(pad 21 thru_hole oval (at 5.7500012 -12.2750072 180.0) (size 0.6 0.6) (drill 0.3) (layers F.Cu F.Mask))
)

View File

@ -0,0 +1,86 @@
(module MOD_HELLEN_INPUT (layer F.Cu) (tedit 60130013)
(pad 1 smd roundrect (at 30.6500022 -6.3582042 90.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 2 smd roundrect (at 30.6500022 -5.6982106 90.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 3 smd roundrect (at 30.6500022 -5.0381916 90.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 4 smd roundrect (at 30.6500022 -4.378198 90.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 5 smd roundrect (at 30.8500018 -7.5450192 180.0) (size 0.2 13.0) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 6 smd roundrect (at 30.6500022 -1.0782046 90.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 7 smd roundrect (at 17.4949866 -2.324989 90.0) (size 0.25 23.6) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 8 smd roundrect (at 17.5200056 -0.4000246 270.0) (size 0.25 23.6) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 9 smd roundrect (at 6.295009 -1.35001) (size 0.2 1.25) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 10 smd roundrect (at 7.1700136 -1.35001) (size 0.2 1.25) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 11 smd roundrect (at 7.9700374 -1.35001) (size 0.2 1.25) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 12 smd roundrect (at 8.845042 -1.35001) (size 0.2 1.25) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 13 smd roundrect (at 9.970008 -1.35001) (size 0.2 1.25) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 14 smd roundrect (at 10.8450126 -1.35001) (size 0.2 1.25) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 15 smd roundrect (at 11.645011 -1.35001) (size 0.2 1.25) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 16 smd roundrect (at 12.5200156 -1.35001) (size 0.2 1.25) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 17 smd roundrect (at 13.794994 -1.35001) (size 0.2 1.25) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 18 smd roundrect (at 14.6699986 -1.35001) (size 0.2 1.25) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 19 smd roundrect (at 15.469997 -1.35001) (size 0.2 1.25) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 20 smd roundrect (at 16.3450016 -1.35001) (size 0.2 1.25) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 21 smd roundrect (at 18.0700172 -1.35001) (size 0.2 1.25) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 22 smd roundrect (at 18.9449964 -1.35001) (size 0.2 1.25) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 23 smd roundrect (at 19.7449948 -1.35001) (size 0.2 1.25) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 24 smd roundrect (at 20.6199994 -1.35001) (size 0.2 1.25) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 25 smd roundrect (at 21.8700096 -1.35001) (size 0.2 1.25) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 26 smd roundrect (at 22.7449888 -1.35001) (size 0.2 1.25) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 27 smd roundrect (at 23.5449872 -1.35001) (size 0.2 1.25) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 28 smd roundrect (at 24.4199918 -1.35001) (size 0.2 1.25) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 29 smd roundrect (at 26.4999978 -1.35001) (size 0.2 1.25) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 30 smd roundrect (at 27.3750024 -1.35001) (size 0.2 1.25) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 31 smd roundrect (at 28.1750008 -1.35001) (size 0.2 1.25) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 32 smd roundrect (at 29.0500054 -1.35001) (size 0.2 1.25) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 33 smd roundrect (at 1.8800064 -14.326997 180.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 34 smd roundrect (at 2.9800042 -14.326997) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 35 smd roundrect (at 4.080002 -14.326997) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 36 smd roundrect (at 5.1799998 -14.326997) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 37 smd roundrect (at 6.2799976 -14.326997) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 38 smd roundrect (at 7.3799954 -14.326997) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 39 smd roundrect (at 8.4799932 -14.326997) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 40 smd roundrect (at 9.579991 -14.326997) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 41 smd roundrect (at 10.6799888 -14.326997) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 42 smd roundrect (at 11.7799866 -14.326997) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 43 smd roundrect (at 12.8799844 -14.326997) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 44 smd roundrect (at 13.9799822 -14.326997) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 45 smd roundrect (at 15.07998 -14.326997) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 46 smd roundrect (at 16.1799778 -14.326997) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 47 smd roundrect (at 17.2799756 -14.326997) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 48 smd roundrect (at 18.3799734 -14.326997) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 49 smd roundrect (at 19.4799712 -14.326997) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 50 smd roundrect (at 20.579969 -14.326997) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 51 smd roundrect (at 21.6799668 -14.326997) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 52 smd roundrect (at 22.7799646 -14.326997) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 53 smd roundrect (at 23.8799624 -14.326997) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 54 smd roundrect (at 24.9799602 -14.326997) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 55 smd roundrect (at 26.079958 -14.326997) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 56 smd roundrect (at 27.1799558 -14.326997) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 57 smd roundrect (at 28.2799536 -14.326997) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 58 smd roundrect (at 29.3799514 -14.326997) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 59 smd roundrect (at 29.1289994 -0.364998) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 60 smd roundrect (at 28.4690058 -0.364998) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 61 smd roundrect (at 27.8090122 -0.364998) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 62 smd roundrect (at 27.1490186 -0.364998) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 63 smd roundrect (at 26.4889996 -0.364998) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 64 smd roundrect (at 25.829006 -0.364998) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 65 smd roundrect (at 24.2280186 -0.364998) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 66 smd roundrect (at 23.5679996 -0.364998) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 67 smd roundrect (at 22.908006 -0.364998) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 68 smd roundrect (at 21.787104 -0.364998) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 69 smd roundrect (at 21.1271104 -0.364998) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 70 smd roundrect (at 20.4670914 -0.364998) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 71 smd roundrect (at 19.8070978 -0.364998) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 72 smd roundrect (at 16.4810186 -0.364998) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 73 smd roundrect (at 15.8209996 -0.364998) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 74 smd roundrect (at 15.161006 -0.364998) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 75 smd roundrect (at 12.5150118 -0.364998) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 76 smd roundrect (at 11.8550182 -0.364998) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 77 smd roundrect (at 11.1949992 -0.364998) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 78 smd roundrect (at 10.5350056 -0.364998) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 79 smd roundrect (at 9.875012 -0.364998) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 80 smd roundrect (at 9.2150184 -0.364998) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 81 smd roundrect (at 8.5549994 -0.364998) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 82 smd roundrect (at 7.8950058 -0.364998) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 83 smd roundrect (at 7.2350122 -0.364998) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 84 smd roundrect (at 6.5749932 -0.364998) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
)

View File

@ -0,0 +1,7 @@
(module MOD_HELLEN_KNOCK (layer F.Cu) (tedit 6013001A)
(pad 1 smd oval (at 18.1500018 -2.7500072 180.0) (size 0.5 0.25) (layers F.Cu F.Mask))
(pad 2 smd oval (at 18.1500018 -1.8750026 180.0) (size 0.5 0.25) (layers F.Cu F.Mask))
(pad 3 smd oval (at 18.1500018 -1.175004 180.0) (size 0.5 0.25) (layers F.Cu F.Mask))
(pad 4 smd oval (at 0.324993 -0.7249922) (size 0.5 0.25) (layers F.Cu F.Mask))
(pad 5 smd oval (at 0.324993 -3.1250128) (size 0.5 0.25) (layers F.Cu F.Mask))
)

View File

@ -0,0 +1,14 @@
(module MOD_Hellen_LIN (layer F.Cu) (tedit 60130016)
(pad 1 smd oval (at 0.5776214 -8.8776302 315.0) (size 0.2 1.2) (layers F.Cu F.Mask))
(pad 2 smd oval (at 0.2199894 -4.3625008) (size 0.2 8.4) (layers F.Cu F.Mask))
(pad 3 smd oval (at 2.8792678 -0.1500124 270.0) (size 0.2 5.25) (layers F.Cu F.Mask))
(pad 4 smd oval (at 5.3950108 -10.7750102 270.0) (size 0.7 0.2) (layers F.Cu F.Mask))
(pad 5 smd oval (at 5.4250082 -3.7375084) (size 0.2 7.25) (layers F.Cu F.Mask))
(pad 6 smd oval (at 1.6249904 -12.4000006 90.0) (size 1.0 0.5) (layers F.Cu F.Mask))
(pad 7 smd oval (at 0.2199894 -0.3750056 270.0) (size 0.5 0.25) (layers F.Cu F.Mask))
(pad 8 thru_hole oval (at 2.7049984 -9.6249998 90.0) (size 0.6 0.6) (drill 0.3) (layers F.Cu F.Mask))
(pad 9 thru_hole oval (at 0.8750046 -3.1999936 270.0) (size 0.6 0.6) (drill 0.3) (layers F.Cu F.Mask))
(pad 10 thru_hole oval (at 2.1500084 -3.1999936 270.0) (size 0.6 0.6) (drill 0.3) (layers F.Cu F.Mask))
(pad 11 thru_hole oval (at 3.7999924 -3.1999936 270.0) (size 0.6 0.6) (drill 0.3) (layers F.Cu F.Mask))
(pad 12 thru_hole oval (at 4.6999906 -3.1999936 270.0) (size 0.6 0.6) (drill 0.3) (layers F.Cu F.Mask))
)

View File

@ -0,0 +1,120 @@
(module MOD_HELLEN_MCU (layer F.Cu) (tedit 60130014)
(pad 1 smd roundrect (at 46.0019908 -32.3250052 90.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 2 smd roundrect (at 46.0019908 -31.6649862 270.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 3 smd roundrect (at 46.0019908 -31.0049926 270.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 4 smd roundrect (at 46.0019908 -30.344999 270.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 5 smd roundrect (at 46.0019908 -29.6850054 270.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 6 smd roundrect (at 46.0019908 -26.3849866 270.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 7 smd roundrect (at 46.0019908 -25.724993 270.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 8 smd roundrect (at 46.0019908 -25.0649994 270.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 9 smd roundrect (at 46.0019908 -24.4050058 270.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 10 smd roundrect (at 46.0019908 -23.7449868 270.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 11 smd roundrect (at 46.0019908 -23.0849932 270.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 12 smd roundrect (at 46.0019908 -22.4249996 270.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 13 smd roundrect (at 46.0019908 -21.765006 270.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 14 smd roundrect (at 46.0019908 -21.104987 270.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 15 smd roundrect (at 46.0019908 -20.4449934 270.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 16 smd roundrect (at 46.0019908 -19.7849998 270.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 17 smd roundrect (at 46.0019908 -19.1250062 270.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 18 smd roundrect (at 46.0019908 -18.4649872 270.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 19 smd roundrect (at 46.0019908 -17.8049936 270.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 20 smd roundrect (at 46.0019908 -17.145 270.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 21 smd roundrect (at 46.0019908 -16.4850064 270.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 22 smd roundrect (at 46.0019908 -15.8249874 270.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 23 smd roundrect (at 46.0019908 -15.1649938 270.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 24 smd roundrect (at 46.0019908 -14.5050002 270.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 25 smd roundrect (at 46.0019908 -13.8450066 270.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 26 smd roundrect (at 46.0019908 -13.1849876 270.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 27 smd roundrect (at 46.0019908 -12.524994 270.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 28 smd roundrect (at 46.0019908 -11.8650004 270.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 29 smd roundrect (at 46.0019908 -11.2050068 270.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 30 smd roundrect (at 46.0019908 -10.5449878 270.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 31 smd roundrect (at 46.0019908 -9.8849942 270.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 32 smd roundrect (at 46.0019908 -9.2250006 270.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 33 smd roundrect (at 46.0019908 -8.565007 270.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 34 smd roundrect (at 46.0019908 -7.904988 270.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 35 smd roundrect (at 12.0549924 -36.4519972 180.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 36 smd roundrect (at 13.375005 -36.4519972) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 37 smd roundrect (at 14.6949922 -36.4519972) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 38 smd roundrect (at 16.0250124 -36.4519972) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 39 smd roundrect (at 17.1250102 -36.4519972) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 40 smd roundrect (at 18.225008 -36.4519972) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 41 smd roundrect (at 19.3250058 -36.4519972) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 42 smd roundrect (at 20.4250036 -36.4519972) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 43 smd roundrect (at 21.5250014 -36.4519972) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 44 smd roundrect (at 22.6249992 -36.4519972) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 45 smd roundrect (at 23.724997 -36.4519972) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 46 smd roundrect (at 24.8249948 -36.4519972) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 47 smd roundrect (at 25.9249926 -36.4519972) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 48 smd roundrect (at 27.0249904 -36.4519972) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 49 smd roundrect (at 28.1249882 -36.4519972) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 50 smd roundrect (at 29.224986 -36.4519972) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 51 smd roundrect (at 30.3249838 -36.4519972) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 52 smd roundrect (at 31.4249816 -36.4519972) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 53 smd roundrect (at 32.5249794 -36.4519972) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 54 smd roundrect (at 33.6249772 -36.4519972) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 55 smd roundrect (at 34.724975 -36.4519972) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 56 smd roundrect (at 35.8249728 -36.4519972) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 57 smd roundrect (at 36.9249706 -36.4519972) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 58 smd roundrect (at 38.0249684 -36.4519972) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 59 smd roundrect (at 39.1249662 -36.4519972) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 60 smd roundrect (at 40.224964 -36.4519972) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 61 smd roundrect (at 41.3249618 -36.4519972) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 62 smd roundrect (at 42.4249596 -36.4519972) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 63 smd roundrect (at 43.5249574 -36.4519972) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 64 smd roundrect (at 44.6249552 -36.4519972) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 65 smd roundrect (at 37.6249946 -0.522986) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 66 smd roundrect (at 36.3050074 -0.4499864 180.0) (size 0.25 0.7) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 67 smd roundrect (at 0.175006 -18.722086 180.0) (size 0.2 36.19) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 68 smd roundrect (at 23.400004 -0.1999996 270.0) (size 0.2 45.6) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 69 smd roundrect (at 46.3499962 -18.3250078 180.0) (size 0.2 35.9) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 70 smd roundrect (at 22.2654114 -37.1499892 270.0) (size 0.2 43.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 71 smd roundrect (at 0.390398 -36.9345972 315.0) (size 0.2 0.8) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 72 smd roundrect (at 45.3749918 -36.424997 270.0) (size 0.2 1.6) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 73 smd roundrect (at 44.2874908 -36.7875058 45.0) (size 0.2 1.2) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 74 smd roundrect (at 46.2250028 -36.3000036 45.0) (size 0.2 0.55) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 75 smd roundrect (at 46.212506 -0.3374898 135.0) (size 0.2 0.58) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 76 smd roundrect (at 0.4374896 -0.4625086 225.0) (size 0.2 0.94) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 77 smd roundrect (at 36.3050074 -0.522986 180.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 78 smd roundrect (at 34.9849948 -0.522986 180.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 79 smd roundrect (at 33.884997 -0.522986 180.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 80 smd roundrect (at 32.7849992 -0.522986 180.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 81 smd roundrect (at 31.6850014 -0.522986 180.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 82 smd roundrect (at 30.5850036 -0.522986 180.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 83 smd roundrect (at 29.4850058 -0.522986 180.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 84 smd roundrect (at 28.385008 -0.522986 180.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 85 smd roundrect (at 27.2850102 -0.522986 180.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 86 smd roundrect (at 26.1850124 -0.522986 180.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 87 smd roundrect (at 25.0850146 -0.522986 180.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 88 smd roundrect (at 23.9850168 -0.522986 180.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 89 smd roundrect (at 22.885019 -0.522986 180.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 90 smd roundrect (at 21.7850212 -0.522986 180.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 91 smd roundrect (at 20.6850234 -0.522986 180.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 92 smd roundrect (at 19.5850256 -0.522986 180.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 93 smd roundrect (at 18.4850278 -0.522986 180.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 94 smd roundrect (at 17.38503 -0.522986 180.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 95 smd roundrect (at 16.2850322 -0.522986 180.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 96 smd roundrect (at 15.1850344 -0.522986 180.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 97 smd roundrect (at 14.0850366 -0.522986 180.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 98 smd roundrect (at 12.9850388 -0.522986 180.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 99 smd roundrect (at 11.885041 -0.522986 180.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 100 smd roundrect (at 10.7850432 -0.522986 180.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 101 smd roundrect (at 9.6850454 -0.522986 180.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 102 smd roundrect (at 8.5850476 -0.522986 180.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 103 smd roundrect (at 7.4850498 -0.522986 180.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 104 smd roundrect (at 6.385052 -0.522986 180.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 105 smd roundrect (at 5.2850542 -0.522986 180.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 106 smd roundrect (at 4.1850564 -0.522986 180.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 107 smd roundrect (at 3.0850586 -0.522986 180.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 108 smd roundrect (at 1.9850608 -0.522986 180.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 109 smd roundrect (at 0.4750054 -30.5799998 90.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 110 smd roundrect (at 0.4750054 -31.2399934 90.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 111 smd roundrect (at 0.4750054 -31.9000124 90.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 112 smd roundrect (at 0.4750054 -32.560006 90.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 113 smd roundrect (at 0.4750054 -33.2199996 90.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 114 smd roundrect (at 0.4750054 -33.8800186 90.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 115 smd roundrect (at 0.4750054 -34.5400122 90.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 116 smd roundrect (at 0.4750054 -35.2000058 90.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 117 smd roundrect (at 0.4750054 -35.8599994 90.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 118 smd roundrect (at 0.4750054 -36.5200184 90.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
)

View File

@ -0,0 +1,75 @@
(module MOD_Hellen_OUTPUT (layer F.Cu) (tedit 60130013)
(pad 1 smd oval (at 27.7450042 -42.4699938 45.0) (size 0.2 1.2) (layers F.Cu F.Mask))
(pad 2 smd oval (at 28.0999946 -21.8000072) (size 0.2 40.8) (layers F.Cu F.Mask))
(pad 3 smd oval (at 14.699996 -42.8250096) (size 25.6 0.2) (layers F.Cu F.Mask))
(pad 4 smd oval (at 28.0765504 -40.2710142 90.0) (size 4.15 0.2) (layers F.Cu F.Mask))
(pad 5 smd oval (at 27.7890478 -42.551223 315.0) (size 1.0 0.2) (layers F.Cu F.Mask))
(pad 6 smd oval (at 16.0250124 -0.2599944) (size 11.325 0.2) (layers F.Cu F.Mask))
(pad 7 smd oval (at 28.0749756 -13.4599934 90.0) (size 25.85 0.2) (layers F.Cu F.Mask))
(pad 8 smd oval (at 0.3250184 -7.3349866 90.0) (size 4.25 0.2) (layers F.Cu F.Mask))
(pad 9 smd oval (at 0.3265424 -16.6973758 90.0) (size 8.825 0.2) (layers F.Cu F.Mask))
(pad 10 smd oval (at 0.3265424 -34.0556596 90.0) (size 14.4 0.2) (layers F.Cu F.Mask))
(pad 11 smd oval (at 14.699996 -42.8350172 180.0) (size 25.7 0.2) (layers F.Cu F.Mask))
(pad 12 smd oval (at 1.134618 -42.03065 45.0) (size 2.43 0.2) (layers F.Cu F.Mask))
(pad 13 smd oval (at 1.0750042 -0.1999996) (size 1.7 0.2) (layers F.Cu F.Mask))
(pad 14 smd oval (at 0.175006 -2.0249896) (size 0.2 3.6) (layers F.Cu F.Mask))
(pad 15 smd oval (at 0.2450338 -0.273177 45.0) (size 0.2 0.3) (layers F.Cu F.Mask))
(pad 16 smd oval (at 27.3015456 -0.8137144) (size 1.0 1.5) (layers F.Cu F.Mask))
(pad 17 smd oval (at 26.045668 -0.8137144) (size 1.0 1.5) (layers F.Cu F.Mask))
(pad 18 smd oval (at 19.6015356 -0.688721) (size 11.4 1.1) (layers F.Cu F.Mask))
(pad 19 smd oval (at 25.15743 -0.838708) (size 1.0 1.5) (layers F.Cu F.Mask))
(pad 20 smd oval (at 23.9015524 -0.838708) (size 1.0 1.5) (layers F.Cu F.Mask))
(pad 21 smd oval (at 13.1515612 -0.3887216) (size 0.4 0.6) (layers F.Cu F.Mask))
(pad 22 smd oval (at 12.1765314 -0.4887214) (size 0.6 0.8) (layers F.Cu F.Mask))
(pad 23 smd oval (at 11.3067846 -0.3887216) (size 0.4 0.6) (layers F.Cu F.Mask))
(pad 24 smd oval (at 10.5765346 -0.3887216) (size 0.4 0.6) (layers F.Cu F.Mask))
(pad 25 smd oval (at 9.6817942 -0.3887216) (size 0.4 0.6) (layers F.Cu F.Mask))
(pad 26 smd oval (at 9.5265494 -0.838708) (size 1.0 1.5) (layers F.Cu F.Mask))
(pad 27 smd oval (at 7.606792 -0.3887216) (size 0.4 0.6) (layers F.Cu F.Mask))
(pad 28 smd oval (at 6.7067938 -0.3887216) (size 0.4 0.6) (layers F.Cu F.Mask))
(pad 29 smd oval (at 5.9965336 -0.3887216) (size 0.4 0.6) (layers F.Cu F.Mask))
(pad 30 smd oval (at 4.9765458 -0.4887214) (size 0.6 0.8) (layers F.Cu F.Mask))
(pad 31 smd oval (at 3.8015418 -0.4887214) (size 0.6 0.8) (layers F.Cu F.Mask))
(pad 32 smd oval (at 2.4515318 -0.4887214) (size 0.6 0.8) (layers F.Cu F.Mask))
(pad 33 smd oval (at 1.2765532 -0.4887214) (size 0.6 0.8) (layers F.Cu F.Mask))
(pad 34 smd oval (at 0.376555 -1.4189456 90.0) (size 0.4 0.6) (layers F.Cu F.Mask))
(pad 35 smd oval (at 0.376555 -2.1137118 90.0) (size 0.4 0.6) (layers F.Cu F.Mask))
(pad 36 smd oval (at 0.376555 -2.7939492 90.0) (size 0.4 0.6) (layers F.Cu F.Mask))
(pad 37 smd oval (at 0.471551 -3.6137088 90.0) (size 0.6 0.8) (layers F.Cu F.Mask))
(pad 38 smd oval (at 0.471551 -4.3349926 90.0) (size 0.6 0.8) (layers F.Cu F.Mask))
(pad 39 smd oval (at 0.376555 -4.918964 90.0) (size 0.4 0.6) (layers F.Cu F.Mask))
(pad 40 smd oval (at 0.471551 -5.8887106 90.0) (size 0.6 0.8) (layers F.Cu F.Mask))
(pad 41 smd oval (at 0.376555 -7.1637144 90.0) (size 0.4 0.6) (layers F.Cu F.Mask))
(pad 42 smd oval (at 0.376555 -7.8137258 90.0) (size 0.4 0.6) (layers F.Cu F.Mask))
(pad 43 smd oval (at 0.471551 -9.0137234 90.0) (size 0.6 0.8) (layers F.Cu F.Mask))
(pad 44 smd oval (at 0.471551 -10.0887276 90.0) (size 0.6 0.8) (layers F.Cu F.Mask))
(pad 45 smd oval (at 0.471551 -10.9637322 90.0) (size 0.6 0.8) (layers F.Cu F.Mask))
(pad 46 smd oval (at 0.376555 -11.7887242 90.0) (size 0.4 0.6) (layers F.Cu F.Mask))
(pad 47 smd oval (at 0.376555 -17.6387252 90.0) (size 0.4 0.6) (layers F.Cu F.Mask))
(pad 48 smd oval (at 0.2715514 -21.6936828 90.0) (size 0.2 0.4) (layers F.Cu F.Mask))
(pad 49 smd oval (at 0.2715514 -22.3536764 90.0) (size 0.2 0.4) (layers F.Cu F.Mask))
(pad 50 smd oval (at 0.2715514 -23.41372 90.0) (size 0.2 0.4) (layers F.Cu F.Mask))
(pad 51 smd oval (at 0.2715514 -24.117808 90.0) (size 0.2 0.4) (layers F.Cu F.Mask))
(pad 52 smd oval (at 0.2715514 -24.9178318 90.0) (size 0.2 0.4) (layers F.Cu F.Mask))
(pad 53 smd oval (at 0.2715514 -25.717881 90.0) (size 0.2 0.4) (layers F.Cu F.Mask))
(pad 54 smd oval (at 0.2715514 -26.5137138 90.0) (size 0.2 0.4) (layers F.Cu F.Mask))
(pad 55 smd oval (at 0.2715514 -28.7087056 90.0) (size 0.2 0.4) (layers F.Cu F.Mask))
(pad 56 smd oval (at 0.2715514 -29.1487098 90.0) (size 0.2 0.4) (layers F.Cu F.Mask))
(pad 57 smd oval (at 0.2715514 -29.588714 90.0) (size 0.2 0.4) (layers F.Cu F.Mask))
(pad 58 smd oval (at 0.2715514 -30.0287182 90.0) (size 0.2 0.4) (layers F.Cu F.Mask))
(pad 59 smd oval (at 0.2715514 -30.4687224 90.0) (size 0.2 0.4) (layers F.Cu F.Mask))
(pad 60 smd oval (at 0.2715514 -30.9087266 90.0) (size 0.2 0.4) (layers F.Cu F.Mask))
(pad 61 smd oval (at 0.2715514 -31.3487054 90.0) (size 0.2 0.4) (layers F.Cu F.Mask))
(pad 62 smd oval (at 0.2715514 -31.7887096 90.0) (size 0.2 0.4) (layers F.Cu F.Mask))
(pad 63 smd oval (at 0.2715514 -32.9136756 90.0) (size 0.2 0.4) (layers F.Cu F.Mask))
(pad 64 smd oval (at 0.2715514 -33.5736946 90.0) (size 0.2 0.4) (layers F.Cu F.Mask))
(pad 65 smd oval (at 0.2715514 -34.2336882 90.0) (size 0.2 0.4) (layers F.Cu F.Mask))
(pad 66 smd oval (at 0.2715514 -34.8936818 90.0) (size 0.2 0.4) (layers F.Cu F.Mask))
(pad 67 smd oval (at 0.2715514 -38.2987042 90.0) (size 0.2 0.4) (layers F.Cu F.Mask))
(pad 68 smd oval (at 0.2715514 -38.7387084 90.0) (size 0.2 0.4) (layers F.Cu F.Mask))
(pad 69 smd oval (at 0.2715514 -39.1787126 90.0) (size 0.2 0.4) (layers F.Cu F.Mask))
(pad 70 smd oval (at 0.2715514 -39.6187168 90.0) (size 0.2 0.4) (layers F.Cu F.Mask))
(pad 71 smd oval (at 0.2715514 -40.058721 90.0) (size 0.2 0.4) (layers F.Cu F.Mask))
(pad 72 smd oval (at 0.2715514 -40.4987252 90.0) (size 0.2 0.4) (layers F.Cu F.Mask))
(pad 73 smd oval (at 0.2715514 -40.938704 90.0) (size 0.2 0.4) (layers F.Cu F.Mask))
)

View File

@ -0,0 +1,16 @@
(module MOD_HELLEN_POWER_12 (layer F.Cu) (tedit 60130018)
(pad 1 smd oval (at 15.725013 -10.700004) (size 1.0 0.5) (layers F.Cu F.Mask))
(pad 2 smd oval (at 15.639796 -5.1974496 90.0) (size 8.74483 1.0) (layers F.Cu F.Mask))
(pad 3 smd oval (at 6.9000116 -0.7750048 45.0) (size 0.4 1.6) (layers F.Cu F.Mask))
(pad 4 smd oval (at 11.6499894 -0.2999994) (size 9.0 0.4) (layers F.Cu F.Mask))
(pad 5 smd oval (at 6.3999872 -3.7749988 90.0) (size 5.4 0.4) (layers F.Cu F.Mask))
(pad 6 smd oval (at 3.350006 -6.4250062) (size 6.5 0.2) (layers F.Cu F.Mask))
(pad 7 smd oval (at 0.1999996 -6.6499994) (size 0.2 0.5) (layers F.Cu F.Mask))
(pad 8 smd oval (at 0.1999996 -10.9435646 270.0) (size 9.2 0.2) (layers F.Cu F.Mask))
(pad 9 smd oval (at 7.043928 -15.550007) (size 13.8 0.2) (layers F.Cu F.Mask))
(pad 10 thru_hole oval (at 14.550009 -15.199995) (size 0.6 0.6) (drill 0.3) (layers F.Cu F.Mask))
(pad 11 thru_hole oval (at 6.3250064 -13.875004) (size 0.6 0.6) (drill 0.3) (layers F.Cu F.Mask))
(pad 12 thru_hole oval (at 6.342507 -8.6425024) (size 0.6 0.6) (drill 0.3) (layers F.Cu F.Mask))
(pad 13 thru_hole oval (at 8.2250026 -8.1499964) (size 0.6 0.6) (drill 0.3) (layers F.Cu F.Mask))
(pad 14 thru_hole oval (at 0.8750046 -7.025005) (size 0.6 0.6) (drill 0.3) (layers F.Cu F.Mask))
)

View File

@ -0,0 +1,15 @@
(module MOD_HELLEN_POWER_5 (layer F.Cu) (tedit 60130018)
(pad 1 smd oval (at 39.4949934 -2.8750006) (size 0.2 3.1) (layers F.Cu F.Mask))
(pad 2 smd oval (at 15.199995 -7.1250302 90.0) (size 0.4 30.0) (layers F.Cu F.Mask))
(pad 3 smd oval (at 39.019988 -3.175) (size 1.0 0.5) (layers F.Cu F.Mask))
(pad 4 smd oval (at 0.324993 -3.719322 180.0) (size 0.4 7.2) (layers F.Cu F.Mask))
(pad 5 smd oval (at 36.5125 -7.1750174 270.0) (size 0.4 5.0) (layers F.Cu F.Mask))
(pad 6 thru_hole oval (at 0.6367272 -6.9000116) (size 0.6 0.6) (drill 0.3) (layers F.Cu F.Mask))
(pad 7 thru_hole oval (at 12.8999996 -6.9000116) (size 0.6 0.6) (drill 0.3) (layers F.Cu F.Mask))
(pad 8 thru_hole oval (at 38.0000002 -6.9000116) (size 0.6 0.6) (drill 0.3) (layers F.Cu F.Mask))
(pad 9 thru_hole oval (at 27.0999966 -6.9000116) (size 0.6 0.6) (drill 0.3) (layers F.Cu F.Mask))
(pad 10 smd oval (at 39.019988 -5.0750216) (size 1.0 0.5) (layers F.Cu F.Mask))
(pad 11 smd oval (at 18.6000136 -0.2999994 90.0) (size 0.4 35.4) (layers F.Cu F.Mask))
(pad 12 smd oval (at 2.025015 -1.7173448 180.0) (size 0.5 3.0) (layers F.Cu F.Mask))
(pad 13 thru_hole oval (at 2.025015 -3.0999938) (size 0.6 0.6) (drill 0.3) (layers F.Cu F.Mask))
)

View File

@ -0,0 +1,15 @@
(module MOD_HELLEN_SD (layer F.Cu) (tedit 60130017)
(pad 1 smd oval (at 18.2749952 -2.9000196 90.0) (size 0.5 1.2) (layers F.Cu F.Mask))
(pad 2 smd oval (at 17.9250086 -1.6250412) (size 0.5 3.0) (layers F.Cu F.Mask))
(pad 3 smd oval (at 3.9749984 -5.8874914) (size 0.5 11.4) (layers F.Cu F.Mask))
(pad 4 smd oval (at 10.9450124 -0.3499866) (size 14.45 0.5) (layers F.Cu F.Mask))
(pad 5 smd oval (at 18.6749944 -9.0125042) (size 0.5 12.7) (layers F.Cu F.Mask))
(pad 6 smd oval (at 10.1750114 -15.1750268 270.0) (size 0.4 17.4) (layers F.Cu F.Mask))
(pad 7 thru_hole oval (at 3.4249868 -13.5750046 90.0) (size 0.6 0.6) (drill 0.3) (layers F.Cu F.Mask))
(pad 8 thru_hole oval (at 5.0000154 -8.6700106 180.0) (size 0.6 0.6) (drill 0.3) (layers F.Cu F.Mask))
(pad 9 thru_hole oval (at 17.7040286 -8.679053 180.0) (size 0.6 0.6) (drill 0.3) (layers F.Cu F.Mask))
(pad 10 thru_hole oval (at 9.2250006 -8.0000094 180.0) (size 0.6 0.6) (drill 0.3) (layers F.Cu F.Mask))
(pad 11 thru_hole oval (at 10.4000046 -8.0000094 180.0) (size 0.6 0.6) (drill 0.3) (layers F.Cu F.Mask))
(pad 12 thru_hole oval (at 12.5750066 -8.0000094 180.0) (size 0.6 0.6) (drill 0.3) (layers F.Cu F.Mask))
(pad 13 thru_hole oval (at 14.7999958 -8.0000094 180.0) (size 0.6 0.6) (drill 0.3) (layers F.Cu F.Mask))
)

View File

@ -0,0 +1,19 @@
(module MOD_Hellen_STLINK (layer F.Cu) (tedit 6013001B)
(pad 1 smd roundrect (at 9.8539808 -0.2290064 270.0) (size 0.2 16.46) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 2 smd roundrect (at 18.0174646 -5.3118258) (size 0.2 10.37) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 3 smd roundrect (at 0.9479788 -0.951992 225.0) (size 0.2 2.24) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 4 smd roundrect (at 0.2249932 -5.3224938 180.0) (size 0.2 7.49) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 5 smd roundrect (at 0.9354312 -9.7009458 135.0) (size 0.2 2.19) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 6 smd roundrect (at 9.8205544 -10.406634 270.0) (size 0.2 16.55) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 7 smd roundrect (at 18.0174646 -5.8118248) (size 0.2 9.37) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 8 smd roundrect (at 0.4479544 -1.4520164 225.0) (size 0.2 0.8) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 9 smd roundrect (at 0.2249932 -5.3224938 180.0) (size 0.2 7.49) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 10 smd roundrect (at 0.9354312 -9.7009458 135.0) (size 0.2 2.19) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 11 smd roundrect (at 9.8205544 -10.406634 270.0) (size 0.2 16.55) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 12 smd roundrect (at 11.7249956 -0.3999992 180.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 13 smd roundrect (at 10.6249978 -0.3999992 180.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 14 smd roundrect (at 9.525 -0.3999992 180.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 15 smd roundrect (at 8.4250022 -0.3999992 180.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 16 smd roundrect (at 7.3250044 -0.3999992 180.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 17 smd roundrect (at 6.2250066 -0.3999992 180.0) (size 0.25 0.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
)

View File

@ -0,0 +1,13 @@
(module MOD_Hellen_CAN_FRAME (layer F.Cu) (tedit 60107CE0)
(pad 1 smd oval (at 0.1999996 -4.1375076 180.0) (size 0.2 5.67) (layers F.Cu F.Mask))
(pad 2 smd oval (at 6.3749936 -0.2750058 270.0) (size 0.4 9.8) (layers F.Cu F.Mask))
(pad 3 smd oval (at 11.1750094 -3.5375088 180.0) (size 0.2 6.8) (layers F.Cu F.Mask))
(pad 4 smd oval (at 5.674995 -6.8749926 90.0) (size 0.2 11.1) (layers F.Cu F.Mask))
(pad 5 smd oval (at 11.0000034 -0.2750058 180.0) (size 0.5 0.25) (layers F.Cu F.Mask))
(pad 6 smd oval (at 0.649986 -0.324993) (size 0.25 0.5) (layers F.Cu F.Mask))
(pad 7 smd oval (at 1.1500104 -0.324993) (size 0.25 0.5) (layers F.Cu F.Mask))
(pad 8 thru_hole oval (at 7.6999846 -1.3750036 180.0) (size 0.6 0.6) (drill 0.3) (layers F.Cu F.Mask))
(pad 9 thru_hole oval (at 6.8250054 -1.8999962 180.0) (size 0.6 0.6) (drill 0.3) (layers F.Cu F.Mask))
(pad 10 thru_hole oval (at 8.0000094 -2.6500074 270.0) (size 0.6 0.6) (drill 0.3) (layers F.Cu F.Mask))
(pad 11 thru_hole oval (at 7.9250032 -6.1999876 270.0) (size 0.6 0.6) (drill 0.3) (layers F.Cu F.Mask))
)

View File

@ -0,0 +1,19 @@
(module MOD_Hellen_IGN8_FRAME (layer F.Cu) (tedit 60107CE0)
(pad 1 smd oval (at 16.2049968 -3.5753802) (size 0.4 0.2) (layers F.Cu F.Mask))
(pad 2 smd oval (at 16.2049968 -3.1253684) (size 0.4 0.2) (layers F.Cu F.Mask))
(pad 3 smd oval (at 16.2049968 -2.675382) (size 0.4 0.2) (layers F.Cu F.Mask))
(pad 4 smd oval (at 16.2049968 -2.2253702) (size 0.4 0.2) (layers F.Cu F.Mask))
(pad 5 smd oval (at 16.2049968 -1.7675352) (size 0.4 0.2) (layers F.Cu F.Mask))
(pad 6 smd oval (at 16.2049968 -1.3175234) (size 0.4 0.2) (layers F.Cu F.Mask))
(pad 7 smd oval (at 16.2049968 -0.867537) (size 0.4 0.2) (layers F.Cu F.Mask))
(pad 8 smd oval (at 16.2049968 -0.4175252) (size 0.4 0.2) (layers F.Cu F.Mask))
(pad 9 smd oval (at 3.0696916 -3.654044 90.0) (size 0.5 0.25) (layers F.Cu F.Mask))
(pad 10 smd oval (at 15.875 -0.2753868 90.0) (size 0.4 0.2) (layers F.Cu F.Mask))
(pad 11 smd oval (at 14.550009 -0.2753868 90.0) (size 0.4 0.2) (layers F.Cu F.Mask))
(pad 12 smd oval (at 13.375005 -0.2753868 90.0) (size 0.4 0.2) (layers F.Cu F.Mask))
(pad 13 smd oval (at 12.200001 -0.2753868 90.0) (size 0.4 0.2) (layers F.Cu F.Mask))
(pad 14 smd oval (at 11.4821208 -0.2753868 90.0) (size 0.4 0.2) (layers F.Cu F.Mask))
(pad 15 smd oval (at 9.8849942 -0.2753868 90.0) (size 0.4 0.2) (layers F.Cu F.Mask))
(pad 16 smd oval (at 8.9600024 -0.2753868 90.0) (size 0.4 0.2) (layers F.Cu F.Mask))
(pad 17 smd oval (at 7.7849984 -0.2753868 90.0) (size 0.4 0.2) (layers F.Cu F.Mask))
)

View File

@ -0,0 +1,6 @@
(module NET-JUMPER (layer F.Cu) (tedit 60130000)
(pad 1 smd rect (at -0.3750056 -0.0) (size 0.5 0.4) (layers F.Cu F.Mask))
(pad 2 smd rect (at -0.649986 -0.0) (size 0.5 0.8) (layers F.Cu F.Mask))
(pad 3 smd rect (at 0.3750056 -0.0 180.0) (size 0.5 0.4) (layers F.Cu F.Mask))
(pad 4 smd rect (at 0.6500114 -0.0) (size 0.5 0.8) (layers F.Cu F.Mask))
)

View File

@ -0,0 +1,4 @@
(module NET-TIE (layer F.Cu) (tedit 60130014)
(pad 1 smd rect (at -0.1999996 -2.54e-05) (size 0.5 0.5) (layers F.Cu F.Mask))
(pad 2 smd rect (at 0.1999996 -2.54e-05) (size 0.5 0.5) (layers F.Cu F.Mask))
)

View File

@ -0,0 +1,3 @@
(module PAD-SMD-0.8 (layer F.Cu) (tedit 60130013)
(pad 1 smd oval (at 0.0 -0.0) (size 0.8 0.8) (layers F.Cu F.Mask))
)

View File

@ -0,0 +1,3 @@
(module PAD-SMD-4.0 (layer F.Cu) (tedit 60129B0C)
(pad 1 smd oval (at 0.0 -0.0) (size 4.0 4.0) (layers F.Cu F.Mask))
)

View File

@ -0,0 +1,10 @@
(module R0603_x4 (layer F.Cu) (tedit 60130014)
(pad 1 smd roundrect (at -0.8999728 -1.2749784 270.0) (size 0.65 0.8) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 2 smd roundrect (at -0.8999728 -0.3999992 270.0) (size 0.45 0.8) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 3 smd roundrect (at -0.8999728 0.3999992 270.0) (size 0.45 0.8) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 4 smd roundrect (at -0.8999728 1.2750292 270.0) (size 0.65 0.8) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 5 smd roundrect (at 0.9000236 1.2750292 270.0) (size 0.65 0.8) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 6 smd roundrect (at 0.9000236 0.3999992 270.0) (size 0.45 0.8) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 7 smd roundrect (at 0.9000236 -0.3999992 270.0) (size 0.45 0.8) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 8 smd roundrect (at 0.9000236 -1.2749784 270.0) (size 0.65 0.8) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
)

View File

@ -0,0 +1,4 @@
(module R0603 (layer F.Cu) (tedit 6013001B)
(pad 1 smd roundrect (at -0.7999984 -0.0) (size 0.7 0.92) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 2 smd roundrect (at 0.7999984 -0.0) (size 0.7 0.92) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
)

View File

@ -0,0 +1,10 @@
(module R0603_X4 (layer F.Cu) (tedit 60130014)
(pad 1 smd roundrect (at -0.8999982 -1.2750292 270.0) (size 0.65 0.8) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 2 smd roundrect (at -0.8999982 -0.3999992 270.0) (size 0.45 0.8) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 3 smd roundrect (at -0.8999982 0.3999992 270.0) (size 0.45 0.8) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 4 smd roundrect (at -0.8999982 1.2749784 270.0) (size 0.65 0.8) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 5 smd roundrect (at 0.8999982 1.2749784 270.0) (size 0.65 0.8) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 6 smd roundrect (at 0.8999982 0.3999992 270.0) (size 0.45 0.8) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 7 smd roundrect (at 0.8999982 -0.3999992 270.0) (size 0.45 0.8) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 8 smd roundrect (at 0.8999982 -1.2750292 270.0) (size 0.65 0.8) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
)

View File

@ -0,0 +1,4 @@
(module R0805 (layer F.Cu) (tedit 60129B0C)
(pad 1 smd roundrect (at -0.9500108 -0.0) (size 1.0 1.45) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 2 smd roundrect (at 0.9500108 -0.0) (size 1.0 1.45) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
)

View File

@ -0,0 +1,4 @@
(module R1206 (layer F.Cu) (tedit 60130013)
(pad 1 smd roundrect (at -1.4500098 -0.0 90.0) (size 1.8 1.15) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 2 smd roundrect (at 1.4500098 -0.0 90.0) (size 1.8 1.15) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
)

View File

@ -0,0 +1,4 @@
(module R2512 (layer F.Cu) (tedit 60130000)
(pad 1 smd roundrect (at -2.7999944 -0.0 90.0) (size 3.2 1.8) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 2 smd roundrect (at 2.7999944 -0.0 90.0) (size 3.2 1.8) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
)

View File

@ -0,0 +1,14 @@
(module CONN-MICROSD-472192001 (layer F.Cu) (tedit 60130017)
(pad 1 smd roundrect (at 3.2049974 1.7999964 90.0) (size 1.5 0.65) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 2 smd roundrect (at 2.1049996 1.7999964 90.0) (size 1.5 0.65) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 3 smd roundrect (at 1.0050018 1.7999964 90.0) (size 1.5 0.65) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 4 smd roundrect (at -0.094996 1.7999964 90.0) (size 1.5 0.65) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 5 smd roundrect (at -1.1949938 1.7999964 90.0) (size 1.5 0.65) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 6 smd roundrect (at -2.2949916 1.7999964 90.0) (size 1.5 0.65) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 7 smd roundrect (at -3.3949894 1.7999964 90.0) (size 1.5 0.65) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 8 smd roundrect (at -4.4950126 1.7999964 90.0) (size 1.5 0.65) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 9 smd roundrect (at 6.8749926 4.3999912 90.0) (size 2.0 1.45) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 10 smd roundrect (at 6.8749926 -3.8999922 90.0) (size 2.0 1.45) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 11 smd roundrect (at -6.8749926 -3.8999922 90.0) (size 2.0 1.45) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 12 smd roundrect (at -6.8749926 4.3999912 90.0) (size 2.0 1.45) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
)

4
ibom-data/SMB.kicad_mod Normal file
View File

@ -0,0 +1,4 @@
(module SMB (layer F.Cu) (tedit 60130018)
(pad 1 smd roundrect (at -2.2500082 -0.0) (size 2.2 2.3) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 2 smd roundrect (at 2.2500082 -0.0) (size 2.2 2.3) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
)

4
ibom-data/SMC.kicad_mod Normal file
View File

@ -0,0 +1,4 @@
(module SMC (layer F.Cu) (tedit 60130018)
(pad 1 smd roundrect (at -3.4749994 -0.0) (size 2.4 3.3) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 2 smd roundrect (at 3.4749994 -0.0) (size 2.4 3.3) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
)

View File

@ -0,0 +1,4 @@
(module BUTTON-SKRK (layer F.Cu) (tedit 60130000)
(pad 1 smd roundrect (at -2.0999958 -0.0) (size 0.8 2.0) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 2 smd roundrect (at 2.0999958 -0.0) (size 0.8 2.0) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
)

View File

@ -0,0 +1,4 @@
(module PTC-SMD1206 (layer F.Cu) (tedit 60130018)
(pad 1 smd roundrect (at -1.4500098 -0.0 90.0) (size 1.8 1.15) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 2 smd roundrect (at 1.4500098 -0.0 90.0) (size 1.8 1.15) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
)

View File

@ -0,0 +1,4 @@
(module QUARTZ-SMD2012 (layer F.Cu) (tedit 60130014)
(pad 1 smd roundrect (at -0.7500112 -0.0) (size 0.7 1.4) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 2 smd roundrect (at 0.7500112 -0.0) (size 0.7 1.4) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
)

View File

@ -0,0 +1,4 @@
(module QUARTZ-SMD5032 (layer F.Cu) (tedit 60130014)
(pad 1 smd rect (at -1.8499836 -2.54e-05) (size 1.7 2.4) (layers F.Cu F.Mask))
(pad 2 smd rect (at 1.8499836 -2.54e-05) (size 1.7 2.4) (layers F.Cu F.Mask))
)

View File

@ -0,0 +1,4 @@
(module L-SMMS0650 (layer F.Cu) (tedit 60130018)
(pad 1 smd roundrect (at -3.0249876 -0.0) (size 2.35 3.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 2 smd roundrect (at 3.0249876 -0.0) (size 2.35 3.5) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
)

10
ibom-data/SO8.kicad_mod Normal file
View File

@ -0,0 +1,10 @@
(module SO8 (layer F.Cu) (tedit 60130016)
(pad 1 smd oval (at -2.3999952 -1.905 90.0) (size 0.6 2.2) (layers F.Cu F.Mask))
(pad 2 smd oval (at -2.3999952 -0.635 90.0) (size 0.6 2.2) (layers F.Cu F.Mask))
(pad 3 smd oval (at -2.3999952 0.635 90.0) (size 0.6 2.2) (layers F.Cu F.Mask))
(pad 4 smd oval (at -2.3999952 1.905 90.0) (size 0.6 2.2) (layers F.Cu F.Mask))
(pad 5 smd oval (at 2.3999952 1.905 90.0) (size 0.6 2.2) (layers F.Cu F.Mask))
(pad 6 smd oval (at 2.3999952 0.635 90.0) (size 0.6 2.2) (layers F.Cu F.Mask))
(pad 7 smd oval (at 2.3999952 -0.635 90.0) (size 0.6 2.2) (layers F.Cu F.Mask))
(pad 8 smd oval (at 2.3999952 -1.905 90.0) (size 0.6 2.2) (layers F.Cu F.Mask))
)

View File

@ -0,0 +1,4 @@
(module SOD-123 (layer F.Cu) (tedit 6013001B)
(pad 1 smd roundrect (at -1.6500094 -0.0 180.0) (size 0.91 0.85) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 2 smd roundrect (at 1.6500094 -0.0 180.0) (size 0.91 0.85) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
)

View File

@ -0,0 +1,4 @@
(module SOD-323 (layer F.Cu) (tedit 60130018)
(pad 1 smd roundrect (at -1.0999978 -0.0 270.0) (size 0.6 0.6) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 2 smd roundrect (at 1.0999978 -0.0 270.0) (size 0.6 0.6) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
)

View File

@ -0,0 +1,4 @@
(module SOD-80 (layer F.Cu) (tedit 60130018)
(pad 1 smd roundrect (at -1.850009 -0.0 180.0) (size 1.3 2.0) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 2 smd roundrect (at 1.850009 -0.0 180.0) (size 1.3 2.0) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
)

View File

@ -0,0 +1,18 @@
(module SOIC16N (layer F.Cu) (tedit 60130013)
(pad 1 smd oval (at -2.3999952 -4.445 90.0) (size 0.6 2.2) (layers F.Cu F.Mask))
(pad 2 smd oval (at -2.3999952 -3.175 90.0) (size 0.6 2.2) (layers F.Cu F.Mask))
(pad 3 smd oval (at -2.3999952 -1.905 90.0) (size 0.6 2.2) (layers F.Cu F.Mask))
(pad 4 smd oval (at -2.3999952 -0.635 90.0) (size 0.6 2.2) (layers F.Cu F.Mask))
(pad 5 smd oval (at -2.3999952 0.635 90.0) (size 0.6 2.2) (layers F.Cu F.Mask))
(pad 6 smd oval (at -2.3999952 1.905 90.0) (size 0.6 2.2) (layers F.Cu F.Mask))
(pad 7 smd oval (at -2.3999952 3.175 90.0) (size 0.6 2.2) (layers F.Cu F.Mask))
(pad 8 smd oval (at -2.3999952 4.445 90.0) (size 0.6 2.2) (layers F.Cu F.Mask))
(pad 9 smd oval (at 2.3999952 4.445 90.0) (size 0.6 2.2) (layers F.Cu F.Mask))
(pad 10 smd oval (at 2.3999952 3.175 90.0) (size 0.6 2.2) (layers F.Cu F.Mask))
(pad 11 smd oval (at 2.3999952 1.905 90.0) (size 0.6 2.2) (layers F.Cu F.Mask))
(pad 12 smd oval (at 2.3999952 0.635 90.0) (size 0.6 2.2) (layers F.Cu F.Mask))
(pad 13 smd oval (at 2.3999952 -0.635 90.0) (size 0.6 2.2) (layers F.Cu F.Mask))
(pad 14 smd oval (at 2.3999952 -1.905 90.0) (size 0.6 2.2) (layers F.Cu F.Mask))
(pad 15 smd oval (at 2.3999952 -3.175 90.0) (size 0.6 2.2) (layers F.Cu F.Mask))
(pad 16 smd oval (at 2.3999952 -4.445 90.0) (size 0.6 2.2) (layers F.Cu F.Mask))
)

10
ibom-data/SOP8.kicad_mod Normal file
View File

@ -0,0 +1,10 @@
(module SOP8 (layer F.Cu) (tedit 60130013)
(pad 1 smd oval (at -2.3999952 -1.905 90.0) (size 0.6 2.2) (layers F.Cu F.Mask))
(pad 2 smd oval (at -2.3999952 -0.635 90.0) (size 0.6 2.2) (layers F.Cu F.Mask))
(pad 3 smd oval (at -2.3999952 0.635 90.0) (size 0.6 2.2) (layers F.Cu F.Mask))
(pad 4 smd oval (at -2.3999952 1.905 90.0) (size 0.6 2.2) (layers F.Cu F.Mask))
(pad 5 smd oval (at 2.3999952 1.905 90.0) (size 0.6 2.2) (layers F.Cu F.Mask))
(pad 6 smd oval (at 2.3999952 0.635 90.0) (size 0.6 2.2) (layers F.Cu F.Mask))
(pad 7 smd oval (at 2.3999952 -0.635 90.0) (size 0.6 2.2) (layers F.Cu F.Mask))
(pad 8 smd oval (at 2.3999952 -1.905 90.0) (size 0.6 2.2) (layers F.Cu F.Mask))
)

View File

@ -0,0 +1,6 @@
(module SOT-223-3 (layer F.Cu) (tedit 60130013)
(pad 1 smd roundrect (at -3.0999938 -2.2999954 270.0) (size 1.1 2.15) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 2 smd roundrect (at -3.0999938 -0.0 270.0) (size 1.1 2.15001) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 3 smd roundrect (at -3.0999938 2.2999954 270.0) (size 1.1 2.15) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 4 smd roundrect (at 3.0999938 -0.0 270.0) (size 3.5 2.15) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
)

View File

@ -0,0 +1,6 @@
(module SOT-223 (layer F.Cu) (tedit 60130014)
(pad 1 smd roundrect (at -3.0999938 -2.2999954 270.0) (size 1.1 2.15) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 2 smd roundrect (at 3.0999938 -0.0 270.0) (size 3.5 2.15) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 3 smd roundrect (at -3.0999938 -0.0 270.0) (size 1.1 2.15001) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 4 smd roundrect (at -3.0999938 2.2999954 270.0) (size 1.1 2.15) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
)

View File

@ -0,0 +1,5 @@
(module SOT-23 (layer F.Cu) (tedit 6013001B)
(pad 1 smd roundrect (at -1.1800078 -0.9499854 270.0) (size 0.9 0.95) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 2 smd roundrect (at -1.1800078 0.9500108 270.0) (size 0.9 0.95001) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 3 smd roundrect (at 1.1700002 -0.0 270.0) (size 0.9 0.95) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
)

View File

@ -0,0 +1,7 @@
(module SOT-23-5 (layer F.Cu) (tedit 6013001A)
(pad 1 smd roundrect (at -1.0649966 -0.9500108 270.0) (size 0.55 1.45) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 2 smd roundrect (at -1.0649966 -0.0 270.0) (size 0.55001 1.45001) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 3 smd roundrect (at -1.0649966 0.9499854 270.0) (size 0.55001 1.45001) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 4 smd roundrect (at 1.0850118 0.9499854 270.0) (size 0.55001 1.45001) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 5 smd roundrect (at 1.0850118 -0.9499854 270.0) (size 0.55001 1.45001) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
)

View File

@ -0,0 +1,8 @@
(module SOT-26 (layer F.Cu) (tedit 60130014)
(pad 1 smd roundrect (at -1.1999976 -0.9500108 270.0) (size 0.6 0.9) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 2 smd roundrect (at -1.1999976 -0.0 270.0) (size 0.6 0.9) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 3 smd roundrect (at -1.1999976 0.9500108 270.0) (size 0.6 0.9) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 4 smd roundrect (at 1.1999976 0.9500108 270.0) (size 0.6 0.9) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 5 smd roundrect (at 1.1999976 -0.0 270.0) (size 0.6 0.9) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 6 smd roundrect (at 1.1999976 -0.9500108 270.0) (size 0.6 0.9) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
)

View File

@ -0,0 +1,4 @@
(module TANT-B (layer F.Cu) (tedit 60130018)
(pad 1 smd roundrect (at -1.499997 -0.0) (size 2.0 2.2) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 2 smd roundrect (at 1.499997 -0.0) (size 2.0 2.2) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
)

View File

@ -0,0 +1,8 @@
(module TSOT-23-6 (layer F.Cu) (tedit 60130018)
(pad 1 smd roundrect (at -1.2999974 -0.9500108 270.0) (size 0.55 1.1) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 2 smd roundrect (at -1.2999974 -0.0 270.0) (size 0.55 1.1) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 3 smd roundrect (at -1.2999974 0.9499854 270.0) (size 0.55 1.1) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 4 smd roundrect (at 1.2999974 0.9499854 270.0) (size 0.55 1.1) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 5 smd roundrect (at 1.2999974 -0.0 270.0) (size 0.55 1.1) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
(pad 6 smd roundrect (at 1.2999974 -0.9499854 270.0) (size 0.55 1.1) (layers F.Cu F.Mask) (roundrect_rratio 0.2))
)

View File

@ -0,0 +1,16 @@
(module TSSOP14 (layer F.Cu) (tedit 60130014)
(pad 1 smd oval (at -2.850007 -1.9499834 90.0) (size 0.3 1.1) (layers F.Cu F.Mask))
(pad 2 smd oval (at -2.850007 -1.2999974 90.0) (size 0.3 1.1) (layers F.Cu F.Mask))
(pad 3 smd oval (at -2.850007 -0.6500114 90.0) (size 0.3 1.1) (layers F.Cu F.Mask))
(pad 4 smd oval (at -2.850007 2.54e-05 90.0) (size 0.3 1.1) (layers F.Cu F.Mask))
(pad 5 smd oval (at -2.850007 0.6500114 90.0) (size 0.3 1.1) (layers F.Cu F.Mask))
(pad 6 smd oval (at -2.850007 1.2999974 90.0) (size 0.3 1.1) (layers F.Cu F.Mask))
(pad 7 smd oval (at -2.850007 1.9499834 90.0) (size 0.3 1.1) (layers F.Cu F.Mask))
(pad 8 smd oval (at 2.850007 1.9499834 90.0) (size 0.3 1.1) (layers F.Cu F.Mask))
(pad 9 smd oval (at 2.850007 1.2999974 90.0) (size 0.3 1.1) (layers F.Cu F.Mask))
(pad 10 smd oval (at 2.850007 0.6500114 90.0) (size 0.3 1.1) (layers F.Cu F.Mask))
(pad 11 smd oval (at 2.850007 2.54e-05 90.0) (size 0.3 1.1) (layers F.Cu F.Mask))
(pad 12 smd oval (at 2.850007 -0.6500114 90.0) (size 0.3 1.1) (layers F.Cu F.Mask))
(pad 13 smd oval (at 2.850007 -1.2999974 90.0) (size 0.3 1.1) (layers F.Cu F.Mask))
(pad 14 smd oval (at 2.850007 -1.9499834 90.0) (size 0.3 1.1) (layers F.Cu F.Mask))
)

View File

@ -0,0 +1,26 @@
(module TSSOP24 (layer F.Cu) (tedit 60130019)
(pad 1 smd oval (at -2.9200094 -3.5749992 90.0) (size 0.25 1.26) (layers F.Cu F.Mask))
(pad 2 smd oval (at -2.9200094 -2.9249878 90.0) (size 0.25 1.26) (layers F.Cu F.Mask))
(pad 3 smd oval (at -2.9200094 -2.2750018 90.0) (size 0.25 1.26) (layers F.Cu F.Mask))
(pad 4 smd oval (at -2.9200094 -1.6249904 90.0) (size 0.25 1.26) (layers F.Cu F.Mask))
(pad 5 smd oval (at -2.9200094 -0.9750044 90.0) (size 0.25 1.26) (layers F.Cu F.Mask))
(pad 6 smd oval (at -2.9200094 -0.324993 90.0) (size 0.25 1.26) (layers F.Cu F.Mask))
(pad 7 smd oval (at -2.9200094 0.324993 90.0) (size 0.25 1.26) (layers F.Cu F.Mask))
(pad 8 smd oval (at -2.9200094 0.9750044 90.0) (size 0.25 1.26) (layers F.Cu F.Mask))
(pad 9 smd oval (at -2.9200094 1.6249904 90.0) (size 0.25 1.26) (layers F.Cu F.Mask))
(pad 10 smd oval (at -2.9200094 2.2750018 90.0) (size 0.25 1.26) (layers F.Cu F.Mask))
(pad 11 smd oval (at -2.9200094 2.9249878 90.0) (size 0.25 1.26) (layers F.Cu F.Mask))
(pad 12 smd oval (at -2.9200094 3.5749992 90.0) (size 0.25 1.26) (layers F.Cu F.Mask))
(pad 13 smd oval (at 2.9200094 3.5749992 90.0) (size 0.25 1.26) (layers F.Cu F.Mask))
(pad 14 smd oval (at 2.9200094 2.9249878 90.0) (size 0.25 1.26) (layers F.Cu F.Mask))
(pad 15 smd oval (at 2.9200094 2.2750018 90.0) (size 0.25 1.26) (layers F.Cu F.Mask))
(pad 16 smd oval (at 2.9200094 1.6249904 90.0) (size 0.25 1.26) (layers F.Cu F.Mask))
(pad 17 smd oval (at 2.9200094 0.9750044 90.0) (size 0.25 1.26) (layers F.Cu F.Mask))
(pad 18 smd oval (at 2.9200094 0.324993 90.0) (size 0.25 1.26) (layers F.Cu F.Mask))
(pad 19 smd oval (at 2.9200094 -0.324993 90.0) (size 0.25 1.26) (layers F.Cu F.Mask))
(pad 20 smd oval (at 2.9200094 -0.9750044 90.0) (size 0.25 1.26) (layers F.Cu F.Mask))
(pad 21 smd oval (at 2.9200094 -1.6249904 90.0) (size 0.25 1.26) (layers F.Cu F.Mask))
(pad 22 smd oval (at 2.9200094 -2.2750018 90.0) (size 0.25 1.26) (layers F.Cu F.Mask))
(pad 23 smd oval (at 2.9200094 -2.9249878 90.0) (size 0.25 1.26) (layers F.Cu F.Mask))
(pad 24 smd oval (at 2.9200094 -3.5749992 90.0) (size 0.25 1.26) (layers F.Cu F.Mask))
)

View File

@ -0,0 +1,8 @@
(module CONN-USB-B-VERTICAL (layer F.Cu) (tedit 60129B0C)
(pad 1 thru_hole oval (at 1.5599918 1.2500102) (size 1.6256 1.6256) (drill 0.9144) (layers F.Cu F.Mask))
(pad 2 thru_hole oval (at 1.5599918 -1.2500102) (size 1.6256 1.6256) (drill 0.9144) (layers F.Cu F.Mask))
(pad 3 thru_hole oval (at -1.6550132 -1.2500102) (size 1.6256 1.6256) (drill 0.9144) (layers F.Cu F.Mask))
(pad 4 thru_hole oval (at -1.6550132 1.2500102) (size 1.6256 1.6256) (drill 0.9144) (layers F.Cu F.Mask))
(pad 5 thru_hole oval (at -1.1500104 -6.0200032) (size 4.0 4.0) (drill 2.3) (layers F.Cu F.Mask))
(pad 6 thru_hole oval (at -1.1500104 6.0200032) (size 4.0 4.0) (drill 2.3) (layers F.Cu F.Mask))
)

View File

@ -0,0 +1,19 @@
(footprint "C0603" (version 20210126) (generator pcbnew) (layer "F.Cu")
(tedit 0)
(fp_text reference "C" (at -0.708119 -0.74013 unlocked) (layer "F.SilkS")
(effects (font (size 0.820001 0.820001) (thickness 0.17)) (justify left bottom))
(tstamp 23a90b5a-525e-463a-babb-2a82e68733bf)
)
(fp_text value "" (at -0.227899 2.045587 -180 unlocked) (layer "F.SilkS") hide
(effects (font (size 0.820001 0.820001) (thickness 0.17)) (justify left bottom))
(tstamp b740ea1a-ef07-4648-8806-a17fb6f6db66)
)
(fp_line (start 0 -0.349986) (end 0 0.399999) (layer "F.SilkS") (width 0.2) (tstamp 192a383f-6df3-4c9f-9649-14293ef0a660))
(pad "1" smd roundrect (at -0.790001 0) (size 0.850001 0.850001) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.1) (tstamp a63d90a2-78cd-4750-9c54-c5263811e6d0))
(pad "2" smd roundrect (at 0.790001 0) (size 0.850001 0.850001) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.1) (tstamp 4ce5e553-192d-4fa5-9352-a5550bd72115))
(model "${KIPRJMOD}/ALTIUM_EMBEDDED_MODELS/0603 cap.STEP"
(offset (xyz 0.000081 0.000078 0))
(scale (xyz 1 1 1))
(rotate (xyz -90 -0 0))
)
)

Some files were not shown because too many files have changed in this diff Show More