mirror of https://github.com/rusefi/hellen-one.git
Initial
This commit is contained in:
commit
4f49a7727f
|
@ -0,0 +1,2 @@
|
|||
|
||||
*.sh text eol=lf
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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!")
|
|
@ -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!"
|
|
@ -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
|
|
@ -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")
|
||||
|
|
@ -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!")
|
|
@ -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!"
|
||||
|
|
@ -0,0 +1 @@
|
|||
Subproject commit 0cbd3fbb81c4ed985716efeaace5e44138118cad
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1 @@
|
|||
__version__ = '1.0.0'
|
|
@ -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
|
|
|
@ -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())
|
|
@ -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())
|
||||
|
|
@ -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
|
|
@ -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
|
|
@ -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()
|
|
@ -0,0 +1 @@
|
|||
Subproject commit 72257258edf16cbda691483ef1fa722192ac0d38
|
|
@ -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!"
|
|
@ -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
|
|
@ -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)
|
|
@ -0,0 +1 @@
|
|||
node_modules
|
|
@ -0,0 +1,8 @@
|
|||
{
|
||||
"dependencies": {
|
||||
"fs": "0.0.1-security",
|
||||
"pngjs": "^6.0.0",
|
||||
"puppeteer": "^5.5.0",
|
||||
"zlib": "^1.0.5"
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
|
@ -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);
|
||||
}
|
|
@ -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>
|
|
@ -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="
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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))
|
||||
)
|
|
@ -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
Loading…
Reference in New Issue