Initial PromptPCB Parts store — 18 curated parts, PBR viewer, submit flow

This commit is contained in:
gator 2026-08-14 23:47:37 +00:00
parent f55a83f3f6
commit dc767edabc
28 changed files with 114224 additions and 0 deletions

64
assets/app.js Normal file
View file

@ -0,0 +1,64 @@
// app.js — catalog gallery: load parts, functional search over use-cases, class filter, PBR thumbnails.
import { renderThumbnail } from '/assets/viewer.js';
const $ = (s) => document.querySelector(s);
let PARTS = [], activeClass = null;
function haystack(p) {
return [p.role, p.summary, p.when_to_use, p.usage, p.mpn, p.class, p.subclass, p.package,
(p.use_cases || []).join(' '), Object.values(p.tags || {}).flat().join(' ')].join(' ').toLowerCase();
}
function score(p, terms) {
const h = haystack(p); let s = 0;
for (const t of terms) {
if (!t) continue;
const uc = (p.use_cases || []).join(' ').toLowerCase();
if (uc.includes(t)) s += 3; // functional use-case match weighs most
if ((p.class || '').toLowerCase().includes(t)) s += 2;
if ((p.mpn || '').toLowerCase().includes(t)) s += 2;
if (h.includes(t)) s += 1;
}
return s;
}
function chip(label, val) {
const c = document.createElement('span'); c.className = 'chip' + (activeClass === val ? ' on' : '');
c.textContent = label; c.onclick = () => { activeClass = activeClass === val ? null : val; render(); };
return c;
}
function renderChips() {
const counts = {}; for (const p of PARTS) counts[p.class] = (counts[p.class] || 0) + 1;
const box = $('#chips'); box.innerHTML = '';
box.appendChild(chip('All', null));
Object.entries(counts).sort((a, b) => b[1] - a[1]).forEach(([c, n]) => box.appendChild(chip(`${c} (${n})`, c)));
}
function card(p) {
const el = document.createElement('a'); el.className = 'card'; el.href = `/part.html?id=${p.id}`;
el.innerHTML = `<div class="thumb"><span class="cls">${p.class}</span>${p.type === 'series' ? '<span class="ser">SERIES</span>' : ''}<canvas></canvas></div>
<div class="body"><div class="nm">${(p.role || p.summary || '').split('—')[0].slice(0, 46)}</div>
<div class="mpn">${p.mpn || p.id}</div>
<div class="sm">${p.when_to_use || p.summary || ''}</div>
<div class="meta"><span><b>PKG</b> ${p.package || (p.series && p.series.package) || '—'}</span>
<span><b>3D</b> ✓</span>${p.stock ? `<span><b>STK</b> ${(p.stock / 1000).toFixed(0)}k</span>` : ''}</div></div>`;
return el;
}
async function render() {
const terms = ($('#q').value || '').toLowerCase().split(/\s+/).filter((t) => t.length > 1);
let list = PARTS.filter((p) => !activeClass || p.class === activeClass);
if (terms.length) list = list.map((p) => ({ p, s: score(p, terms) })).filter((x) => x.s > 0).sort((a, b) => b.s - a.s).map((x) => x.p);
$('#count').textContent = `${list.length} part${list.length === 1 ? '' : 's'}${activeClass ? ' · ' + activeClass : ''}${terms.length ? ' · ranked by relevance' : ''}`;
const grid = $('#grid'); grid.innerHTML = '';
if (!list.length) { grid.innerHTML = '<div class="empty">No parts match — try a broader description, or <a href="/submit.html">contribute one</a>.</div>'; return; }
const cards = list.map((p) => { const el = card(p); grid.appendChild(el); return { el, p }; });
// thumbnails one at a time through the shared renderer
for (const { el, p } of cards) {
const cv = el.querySelector('canvas');
const data = await renderThumbnail(p.model_3d, 340);
if (data) { const img = new Image(); img.src = data; img.style.cssText = 'width:100%;height:100%;object-fit:contain'; cv.replaceWith(img); }
}
}
(async () => {
PARTS = await (await fetch('/assets/catalog.json')).json();
$('#cred-n').textContent = localStorage.getItem('ppcb_credits') || '5';
renderChips(); render();
let t; $('#q').addEventListener('input', () => { clearTimeout(t); t = setTimeout(render, 160); });
})();

1
assets/catalog.json Normal file

File diff suppressed because one or more lines are too long

78
assets/part.js Normal file
View file

@ -0,0 +1,78 @@
// part.js — part detail: interactive PBR viewer + full curated record (specs, pins, spice, downloads).
import { mountViewer } from '/assets/viewer.js';
const esc = (s) => (s == null ? '' : String(s).replace(/[&<>]/g, (c) => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;' }[c])));
const id = new URLSearchParams(location.search).get('id');
function dl(name, text, mime = 'text/plain') {
const a = document.createElement('a'); a.href = URL.createObjectURL(new Blob([text], { type: mime }));
a.download = name; a.click();
}
function spendCredit() {
let c = parseInt(localStorage.getItem('ppcb_credits') || '5', 10);
if (c <= 0) { alert('Out of download credits — contribute a curated part to earn 5 more.'); return false; }
localStorage.setItem('ppcb_credits', --c); document.getElementById('cred-n').textContent = c; return true;
}
(async () => {
const parts = await (await fetch('/assets/catalog.json')).json();
const p = parts.find((x) => x.id === id);
const root = document.getElementById('root');
document.getElementById('cred-n').textContent = localStorage.getItem('ppcb_credits') || '5';
if (!p) { root.innerHTML = '<div class="empty">Part not found. <a href="/">Back to catalog</a></div>'; return; }
document.title = `${p.mpn || p.id} — PromptPCB Parts`;
const params = (p.params || []).map((x) => `<tr><td>${esc(x.name)}</td><td class="v">${esc(x.value)} ${esc(x.unit || '')}${x.note ? `<span class="cond">${esc(x.note)}</span>` : ''}</td></tr>`).join('');
const pins = (p.pins || []).map((x) => `<div class="pin"><span class="n">${esc(x.pin ?? '')}</span>${esc(x.name || '')}<span class="t">${esc(x.type || '')}</span></div>`).join('');
const ucs = (p.use_cases || []).map((u) => `<li>${esc(u)}</li>`).join('');
const tagList = Object.entries(p.tags || {}).filter(([, v]) => v != null && v !== '' && !Array.isArray(v)).map(([k, v]) => `<span class="tag"><b>${esc(k)}</b> ${esc(v)}</span>`).join('');
const kr = ((p.tags || {}).key_ratings || []).map((r) => `<span class="tag">${esc(r)}</span>`).join('');
const ser = p.series ? `<div class="tags" style="margin-top:8px">${Object.entries(p.series).filter(([k]) => k !== 'mesh').map(([k, v]) => `<span class="tag"><b>${esc(k)}</b> ${esc(v)}</span>`).join('')}</div>` : '';
root.innerHTML = `<div class="detail">
<div>
<div class="viewer"><canvas id="cv"></canvas>
<div class="vbar"><span class="vtag">PBR · drag to orbit</span><span class="vtag">${esc(p.package || (p.series && p.series.package) || '')}</span><span class="vtag">${(p.pins || []).length} pins</span></div>
</div>
</div>
<div>
<div style="font-family:var(--mono);font-size:12px;color:var(--dim);text-transform:uppercase;letter-spacing:1px">${esc(p.class)}${p.type === 'series' ? ' · series' : ''}</div>
<h1 class="dh1">${esc((p.role || p.summary || '').split('—')[0])}</h1>
<div class="dmpn">${esc(p.mpn || p.id)} · ${esc(p.manufacturer || '')} · ${esc(p.lcsc || '')}</div>
<p style="color:var(--dim);line-height:1.6;margin:0 0 6px">${esc(p.summary)}</p>
<div class="dactions">
<button class="btn" id="dl-all">↓ Download files</button>
<a class="btn ghost" href="${esc(p.datasheet_url)}" target="_blank" rel="noopener">Datasheet ↗</a>
<button class="btn ghost" id="lib">+ My library</button>
</div>
<div class="assets">
<span class="asset"><span class="ok">✓</span> 3D model</span>
<span class="asset"><span class="ok">✓</span> SPICE</span>
<span class="asset"><span class="ok">✓</span> Datasheet</span>
<span class="asset"><span class="ok">✓</span> Pin map (${(p.pins || []).length})</span>
<span class="asset"><span class="ok">✓</span> Verified</span>
</div>
${p.when_to_use ? `<div class="section"><h3>When to use</h3><p style="color:var(--text);line-height:1.6;margin:0">${esc(p.when_to_use)}</p></div>` : ''}
${ucs ? `<div class="section"><h3>What it's used for</h3><ul class="uc">${ucs}</ul></div>` : ''}
${params ? `<div class="section"><h3>Specifications</h3><table class="ptable">${params}</table></div>` : ''}
${ser}
${pins ? `<div class="section"><h3>Pins &amp; pads · aligned to footprint</h3><div class="pins">${pins}</div></div>` : ''}
${(tagList || kr) ? `<div class="section"><h3>Requirement tags</h3><div class="tags">${kr}${tagList}</div></div>` : ''}
${p.spice ? `<div class="section"><h3>SPICE model</h3><pre class="spice">${esc(p.spice)}</pre></div>` : ''}
</div>
</div>`;
mountViewer(document.getElementById('cv'), p.model_3d);
document.getElementById('dl-all').onclick = async () => {
if (!spendCredit()) return;
const obj = await (await fetch(p.model_3d)).text();
dl(`${p.id}.obj`, obj);
dl(`${p.id}.cir`, `* ${p.mpn} SPICE model — PromptPCB Parts\n${p.spice || ''}\n`);
dl(`${p.id}.json`, JSON.stringify(p, null, 2), 'application/json');
};
document.getElementById('lib').onclick = () => {
const lib = JSON.parse(localStorage.getItem('ppcb_lib') || '[]');
if (!lib.includes(p.id)) { lib.push(p.id); localStorage.setItem('ppcb_lib', JSON.stringify(lib)); }
document.getElementById('lib').textContent = '✓ In library';
};
})();

120
assets/style.css Normal file
View file

@ -0,0 +1,120 @@
:root{
--bg:#0a0d13; --bg2:#0f141c; --panel:#121924; --panel2:#161f2c; --line:#1e2a3a;
--line2:#2a3b52; --text:#e6edf5; --dim:#8aa0b8; --dim2:#5f7488;
--acc:#39e6b0; --acc2:#4db8ff; --copper:#e8944a; --warn:#ffcc66; --bad:#ff6b6b;
--radius:14px; --mono:"SFMono-Regular",ui-monospace,"JetBrains Mono",Menlo,Consolas,monospace;
--sans:-apple-system,BlinkMacSystemFont,"Segoe UI",Inter,Roboto,sans-serif;
}
*{box-sizing:border-box}
html,body{margin:0;background:var(--bg);color:var(--text);font-family:var(--sans);-webkit-font-smoothing:antialiased}
a{color:var(--acc2);text-decoration:none}
a:hover{color:var(--acc)}
.wrap{max-width:1240px;margin:0 auto;padding:0 22px}
/* header */
header.top{position:sticky;top:0;z-index:50;background:rgba(10,13,19,.82);backdrop-filter:blur(12px);border-bottom:1px solid var(--line)}
.top .wrap{display:flex;align-items:center;gap:22px;height:62px}
.brand{display:flex;align-items:center;gap:10px;font-weight:700;letter-spacing:.2px}
.brand .dot{width:12px;height:12px;border-radius:3px;background:linear-gradient(135deg,var(--acc),var(--acc2));box-shadow:0 0 14px var(--acc)}
.brand small{color:var(--dim);font-weight:500;font-family:var(--mono);font-size:12px}
nav.main{display:flex;gap:20px;margin-left:8px}
nav.main a{color:var(--dim);font-size:14px;font-weight:500}
nav.main a:hover,nav.main a.active{color:var(--text)}
.spacer{flex:1}
.credits{display:flex;align-items:center;gap:8px;font-family:var(--mono);font-size:13px;color:var(--acc);
border:1px solid var(--line2);padding:6px 12px;border-radius:20px;background:var(--panel)}
.btn{display:inline-flex;align-items:center;gap:8px;background:var(--acc);color:#04120c;border:none;
padding:9px 16px;border-radius:9px;font-weight:600;font-size:14px;cursor:pointer;transition:.15s}
.btn:hover{filter:brightness(1.08);transform:translateY(-1px)}
.btn.ghost{background:transparent;color:var(--text);border:1px solid var(--line2)}
.btn.ghost:hover{border-color:var(--acc);color:var(--acc)}
/* hero */
.hero{padding:48px 0 26px}
.hero h1{font-size:38px;line-height:1.1;margin:0 0 12px;letter-spacing:-.5px}
.hero h1 .g{background:linear-gradient(120deg,var(--acc),var(--acc2));-webkit-background-clip:text;background-clip:text;color:transparent}
.hero p{color:var(--dim);font-size:17px;max-width:680px;margin:0}
.searchbar{margin:26px 0 8px;display:flex;gap:10px;align-items:center;background:var(--panel);border:1px solid var(--line2);
border-radius:12px;padding:4px 6px 4px 16px;box-shadow:0 6px 30px rgba(0,0,0,.3)}
.searchbar svg{opacity:.6}
.searchbar input{flex:1;background:none;border:none;outline:none;color:var(--text);font-size:16px;padding:12px 4px}
.searchbar input::placeholder{color:var(--dim2)}
.chips{display:flex;flex-wrap:wrap;gap:8px;margin:16px 0 4px}
.chip{font-family:var(--mono);font-size:12.5px;color:var(--dim);background:var(--panel);border:1px solid var(--line);
padding:6px 12px;border-radius:20px;cursor:pointer;transition:.12s}
.chip:hover{border-color:var(--line2);color:var(--text)}
.chip.on{background:var(--acc);color:#04120c;border-color:var(--acc);font-weight:600}
.count{color:var(--dim);font-size:13px;font-family:var(--mono);margin:18px 0 10px}
/* grid */
.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(268px,1fr));gap:18px;padding-bottom:60px}
.card{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);overflow:hidden;
cursor:pointer;transition:.18s;display:flex;flex-direction:column}
.card:hover{transform:translateY(-3px);border-color:var(--line2);box-shadow:0 12px 40px rgba(0,0,0,.4)}
.thumb{aspect-ratio:16/11;background:radial-gradient(120% 120% at 50% 30%,#16202e 0%,#0c1119 100%);position:relative;display:flex;align-items:center;justify-content:center}
.thumb canvas{width:100%;height:100%;display:block}
.thumb .cls{position:absolute;top:10px;left:10px;font-family:var(--mono);font-size:11px;color:var(--acc);
background:rgba(4,18,12,.7);border:1px solid var(--line2);padding:3px 9px;border-radius:14px}
.thumb .ser{position:absolute;top:10px;right:10px;font-family:var(--mono);font-size:10px;color:var(--copper);
background:rgba(20,12,4,.7);border:1px solid #3a2a18;padding:3px 8px;border-radius:14px}
.card .body{padding:14px 16px 16px}
.card .nm{font-weight:600;font-size:15px;margin:0 0 3px}
.card .mpn{font-family:var(--mono);font-size:12px;color:var(--acc2);margin-bottom:8px}
.card .sm{color:var(--dim);font-size:13px;line-height:1.45;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;min-height:38px}
.card .meta{display:flex;gap:10px;margin-top:11px;font-family:var(--mono);font-size:11px;color:var(--dim2)}
.card .meta b{color:var(--dim);font-weight:500}
/* detail */
.detail{display:grid;grid-template-columns:1.05fr 1fr;gap:30px;padding:30px 0 70px}
@media(max-width:900px){.detail{grid-template-columns:1fr}.hero h1{font-size:30px}}
.viewer{position:sticky;top:82px;height:min(66vh,560px);background:radial-gradient(120% 120% at 50% 30%,#16202e,#0a0e15);
border:1px solid var(--line2);border-radius:16px;overflow:hidden}
.viewer canvas{width:100%;height:100%;display:block}
.vbar{position:absolute;bottom:0;left:0;right:0;display:flex;gap:10px;padding:12px;background:linear-gradient(0deg,rgba(8,11,17,.9),transparent)}
.vtag{font-family:var(--mono);font-size:11px;color:var(--dim);border:1px solid var(--line2);padding:4px 10px;border-radius:14px;background:rgba(10,14,20,.6)}
.dh1{font-size:27px;margin:0 0 4px;letter-spacing:-.3px}
.dmpn{font-family:var(--mono);color:var(--acc2);font-size:15px;margin-bottom:14px}
.section{margin:24px 0}
.section h3{font-size:13px;text-transform:uppercase;letter-spacing:1px;color:var(--dim);margin:0 0 12px;font-weight:600}
.ptable{width:100%;border-collapse:collapse;font-size:13.5px}
.ptable td{padding:8px 10px;border-bottom:1px solid var(--line);vertical-align:top}
.ptable td:first-child{color:var(--dim);width:44%}
.ptable td.v{font-family:var(--mono);color:var(--text)}
.ptable td .cond{color:var(--dim2);font-size:11.5px;display:block}
.uc{display:flex;flex-direction:column;gap:9px}
.uc li{list-style:none;padding:11px 14px;background:var(--panel);border:1px solid var(--line);border-radius:10px;font-size:13.5px;line-height:1.5;color:var(--text)}
.uc li::before{content:"→ ";color:var(--acc)}
.pins{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:7px}
.pin{display:flex;gap:8px;align-items:center;font-family:var(--mono);font-size:12px;background:var(--panel);border:1px solid var(--line);border-radius:8px;padding:7px 10px}
.pin .n{background:var(--panel2);border:1px solid var(--line2);border-radius:5px;min-width:24px;text-align:center;color:var(--acc);padding:1px 4px}
.pin .t{margin-left:auto;color:var(--dim2);font-size:10px}
pre.spice{background:#080b10;border:1px solid var(--line);border-radius:10px;padding:14px;overflow-x:auto;
font-family:var(--mono);font-size:12px;color:#a9c7d6;line-height:1.5;margin:0}
.tags{display:flex;flex-wrap:wrap;gap:7px}
.tag{font-family:var(--mono);font-size:11.5px;color:var(--dim);background:var(--panel);border:1px solid var(--line2);padding:5px 10px;border-radius:6px}
.tag b{color:var(--acc)}
.dactions{display:flex;gap:10px;flex-wrap:wrap;margin:6px 0 20px}
.assets{display:flex;flex-wrap:wrap;gap:8px}
.asset{display:flex;align-items:center;gap:8px;font-family:var(--mono);font-size:12px;color:var(--text);
background:var(--panel);border:1px solid var(--line2);padding:8px 12px;border-radius:9px}
.asset .ok{color:var(--acc)}
/* submit form */
.form{max-width:820px;padding:20px 0 70px}
.banner{background:linear-gradient(120deg,rgba(57,230,176,.09),rgba(77,184,255,.06));border:1px solid var(--line2);
border-radius:14px;padding:18px 20px;margin:14px 0 26px;color:var(--dim);font-size:14.5px;line-height:1.55}
.banner b{color:var(--acc)}
.field{margin:16px 0}
.field label{display:block;font-size:13px;color:var(--dim);margin-bottom:7px;font-weight:500}
.field input,.field select,.field textarea{width:100%;background:var(--panel);border:1px solid var(--line2);border-radius:9px;
color:var(--text);padding:11px 13px;font-size:14px;font-family:var(--sans);outline:none}
.field textarea{min-height:90px;font-family:var(--mono);font-size:13px}
.field input:focus,.field textarea:focus,.field select:focus{border-color:var(--acc)}
.row2{display:grid;grid-template-columns:1fr 1fr;gap:14px}
.drop{border:1.5px dashed var(--line2);border-radius:12px;padding:22px;text-align:center;color:var(--dim);cursor:pointer;transition:.15s}
.drop:hover{border-color:var(--acc);color:var(--text)}
.footer{border-top:1px solid var(--line);color:var(--dim2);font-size:13px;padding:26px 0;margin-top:20px}
.footer .wrap{display:flex;gap:20px;flex-wrap:wrap;align-items:center}
.empty{text-align:center;color:var(--dim);padding:70px 0;font-family:var(--mono)}
.spin{width:16px;height:16px;border:2px solid rgba(255,255,255,.25);border-top-color:var(--acc);border-radius:50%;animation:sp 1s linear infinite;display:inline-block}
@keyframes sp{to{transform:rotate(360deg)}}

65
assets/submit.js Normal file
View file

@ -0,0 +1,65 @@
// submit.js — contribute-a-part flow: AI auto-fill from datasheet + submission to Corben functions.
const API = 'https://api.corben.world';
const FN_AUTOFILL = 'd4f34d9c-6e8f-4328-89a2-b3c3b79017db';
const TK_AUTOFILL = '3f5dc4a97de91e7e9117b9a12a3061f6';
const FN_SUBMIT = 'b02d634b-cd6d-414d-bf9c-80cf6cc2ccdc';
const TK_SUBMIT = '9c3ed2ece766bcc18ed7d33996bfeb86';
const $ = (id) => document.getElementById(id);
$('cred-n').textContent = localStorage.getItem('ppcb_credits') || '5';
async function invoke(fn, token, payload) {
const r = await fetch(`${API}/functions/${fn}/invoke?token=${token}`, {
method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload) });
return r.json();
}
$('autofill').onclick = async (e) => {
e.preventDefault();
const mpn = $('mpn').value.trim();
if (!mpn && !$('description').value.trim()) { $('af-status').textContent = 'Enter an MPN or paste datasheet text first.'; return; }
$('autofill').disabled = true; $('af-status').innerHTML = '<span class="spin"></span> drafting from datasheet…';
try {
const d = await invoke(FN_AUTOFILL, TK_AUTOFILL, { mpn, class: $('class').value, description: $('description').value.trim() });
if (!d.ok) throw new Error(d.error || 'autofill failed');
const s = d.suggested;
if (s.summary) $('summary').value = s.summary;
if (s.when_to_use) $('when_to_use').value = s.when_to_use;
if (s.use_cases) $('use_cases').value = s.use_cases.join('\n');
if (s.params) $('params').value = s.params.map((p) => `${p.name}: ${p.value}${p.unit ? ' ' + p.unit : ''}`).join('\n');
if (s.spice_model) $('spice').value = s.spice_model;
const t = s.requirements_tags || {};
if (t.package && !$('package').value) $('package').value = t.package;
if (t.class && !$('class').value) $('class').value = t.class;
$('af-status').innerHTML = '✓ drafted — <b style="color:var(--acc)">review every field</b> before submitting.';
} catch (err) { $('af-status').textContent = '⚠ ' + err.message; }
$('autofill').disabled = false;
};
$('model3d').onchange = () => { const f = $('model3d').files[0]; if (f) $('drop-label').textContent = '✓ ' + f.name; };
$('submit').onclick = async () => {
const parseParams = (t) => t.split('\n').map((l) => l.trim()).filter(Boolean).map((l) => {
const [n, ...rest] = l.split(':'); const v = rest.join(':').trim(); const m = v.match(/^([\d.\-+/]+)\s*(.*)$/);
return { name: n.trim(), value: m ? m[1] : v, unit: m ? m[2] : '' };
});
const part = {
mpn: $('mpn').value.trim(), name: $('mpn').value.trim(), class: $('class').value,
manufacturer: $('manufacturer').value.trim(), package: $('package').value.trim(),
datasheet_url: $('datasheet_url').value.trim(), summary: $('summary').value.trim(),
when_to_use: $('when_to_use').value.trim(),
use_cases: $('use_cases').value.split('\n').map((l) => l.trim()).filter(Boolean),
params: parseParams($('params').value), spice: $('spice').value.trim(),
model_3d_name: $('model3d').files[0] ? $('model3d').files[0].name : '',
};
const email = $('email').value.trim();
$('submit').disabled = true; $('sub-status').innerHTML = '<span class="spin"></span> submitting…';
try {
const d = await invoke(FN_SUBMIT, TK_SUBMIT, { email, part });
if (!d.ok) throw new Error(d.error || 'submit failed');
localStorage.setItem('ppcb_credits', d.credits); $('cred-n').textContent = d.credits;
document.querySelector('.form').innerHTML = `<h1 class="dh1">Thank you — submitted for review ✓</h1>
<div class="banner">Your part <b>${part.mpn}</b> is queued for curation review. <b>+5 download credits</b> added — you now have <b>${d.credits}</b>.
<br><br>Ref: <code>${d.sub_id}</code></div><a class="btn" href="/">Browse the catalog →</a>`;
} catch (err) { $('sub-status').textContent = '⚠ ' + err.message; $('submit').disabled = false; }
};

77
assets/viewer.js Normal file
View file

@ -0,0 +1,77 @@
// viewer.js — PBR 3D rendering for the part store, same three.js + environment-lit PBR approach as the
// flagship PromptPCB board renders. Two entry points: renderThumbnail() (one shared offscreen renderer
// -> data URL, so a gallery of N parts uses ONE WebGL context) and mountViewer() (interactive orbit).
import * as THREE from 'three';
import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
import { OBJLoader } from 'three/addons/loaders/OBJLoader.js';
import { RoomEnvironment } from 'three/addons/environments/RoomEnvironment.js';
const objCache = new Map();
function loadObj(url) {
if (objCache.has(url)) return objCache.get(url);
const p = new Promise((res, rej) => new OBJLoader().load(url, res, undefined, rej));
objCache.set(url, p); return p;
}
// dark epoxy / metal PBR material (IC body look); env reflections give the photoreal feel
function pbrMaterial() {
return new THREE.MeshPhysicalMaterial({ color: 0x1a2230, metalness: 0.55, roughness: 0.42,
clearcoat: 0.5, clearcoatRoughness: 0.35, envMapIntensity: 1.1 });
}
function frame(obj, camera, controls, pad = 1.35) {
const box = new THREE.Box3().setFromObject(obj);
const size = box.getSize(new THREE.Vector3()), center = box.getCenter(new THREE.Vector3());
obj.position.sub(center);
const r = Math.max(size.x, size.y, size.z) * pad || 5;
const d = r / Math.tan((camera.fov * Math.PI / 180) / 2);
camera.position.set(d * 0.7, d * 0.75, d * 0.9);
camera.near = d / 100; camera.far = d * 10; camera.updateProjectionMatrix();
camera.lookAt(0, 0, 0); if (controls) { controls.target.set(0, 0, 0); controls.update(); }
}
// ---- shared offscreen renderer for thumbnails ----
let shared = null;
function sharedRenderer(size) {
if (!shared) {
const r = new THREE.WebGLRenderer({ antialias: true, alpha: true, preserveDrawingBuffer: true });
r.setPixelRatio(Math.min(devicePixelRatio, 2)); r.toneMapping = THREE.ACESFilmicToneMapping; r.toneMappingExposure = 1.05;
const pmrem = new THREE.PMREMGenerator(r); const env = pmrem.fromScene(new RoomEnvironment(), 0.04).texture;
shared = { r, env };
}
shared.r.setSize(size, size, false); return shared;
}
export async function renderThumbnail(url, size = 340) {
const { r, env } = sharedRenderer(size);
const scene = new THREE.Scene(); scene.environment = env;
const cam = new THREE.PerspectiveCamera(35, 1, 0.1, 1000);
const key = new THREE.DirectionalLight(0xffffff, 1.7); key.position.set(4, 8, 6); scene.add(key);
scene.add(new THREE.AmbientLight(0x88aaff, 0.25));
try {
const src = await loadObj(url); const obj = src.clone(true);
obj.traverse((m) => { if (m.isMesh) m.material = pbrMaterial(); });
scene.add(obj); frame(obj, cam, null, 1.5);
r.render(scene, cam);
return r.domElement.toDataURL('image/png');
} catch { return null; }
}
// ---- interactive viewer (one canvas = one context) ----
export async function mountViewer(canvas, url) {
const r = new THREE.WebGLRenderer({ canvas, antialias: true, alpha: true });
r.setPixelRatio(Math.min(devicePixelRatio, 2)); r.toneMapping = THREE.ACESFilmicToneMapping; r.toneMappingExposure = 1.05;
const resize = () => { const w = canvas.clientWidth, h = canvas.clientHeight; r.setSize(w, h, false); cam.aspect = w / h; cam.updateProjectionMatrix(); };
const pmrem = new THREE.PMREMGenerator(r);
const scene = new THREE.Scene(); scene.environment = pmrem.fromScene(new RoomEnvironment(), 0.04).texture;
const cam = new THREE.PerspectiveCamera(35, 1, 0.1, 2000);
const key = new THREE.DirectionalLight(0xffffff, 1.9); key.position.set(5, 9, 7); scene.add(key);
const rim = new THREE.DirectionalLight(0x4db8ff, 0.6); rim.position.set(-6, 2, -4); scene.add(rim);
scene.add(new THREE.AmbientLight(0x8899bb, 0.3));
const controls = new OrbitControls(cam, canvas); controls.enableDamping = true; controls.autoRotate = true; controls.autoRotateSpeed = 1.1;
try {
const src = await loadObj(url); const obj = src.clone(true);
obj.traverse((m) => { if (m.isMesh) m.material = pbrMaterial(); });
scene.add(obj); resize(); frame(obj, cam, controls, 1.4);
} catch (e) { /* ignore */ }
addEventListener('resize', resize);
(function loop() { requestAnimationFrame(loop); controls.update(); r.render(scene, cam); })();
return { stop: () => (controls.autoRotate = !controls.autoRotate) };
}

39
index.html Normal file
View file

@ -0,0 +1,39 @@
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>PromptPCB Parts — curated, verified, ready to drop in</title>
<meta name="description" content="A hand-curated open parts library: real specs, datasheets, pin/pad maps, SPICE models and PBR 3D models for every part. Search by what you need.">
<link rel="stylesheet" href="/assets/style.css">
<header class="top"><div class="wrap">
<a class="brand" href="/"><span class="dot"></span> PromptPCB <small>· Parts</small></a>
<nav class="main">
<a href="/" class="active">Catalog</a>
<a href="/submit.html">Submit a part</a>
<a href="/mcp.html">MCP / API</a>
</nav>
<span class="spacer"></span>
<span class="credits" id="credits" title="Download credits">◆ <b id="cred-n">5</b> credits</span>
</div></header>
<div class="wrap">
<section class="hero">
<h1>The <span class="g">curated</span> part store for real boards.</h1>
<p>Every part is hand-verified: organized specs, datasheet, labelled pins &amp; pads, a SPICE model,
and a PBR 3D model — searchable by <em>what you need it to do</em>. Contribute a novel part, earn downloads.</p>
<div class="searchbar">
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="11" cy="11" r="7"/><path d="M21 21l-4.3-4.3"/></svg>
<input id="q" placeholder='Describe what you need — "drive a brushless motor", "3.3V rail", "blink an LED", "50 ohm resistor"…' autofocus>
</div>
<div class="chips" id="chips"></div>
</section>
<div class="count" id="count"></div>
<div class="grid" id="grid"></div>
</div>
<footer class="footer"><div class="wrap">
<span>PromptPCB Parts — open curated component library</span>
<span class="spacer"></span>
<a href="/submit.html">Contribute a part</a><a href="/mcp.html">Use via MCP</a>
</div></footer>
<script type="importmap">{"imports":{"three":"https://unpkg.com/three@0.160.0/build/three.module.js","three/addons/":"https://unpkg.com/three@0.160.0/examples/jsm/"}}</script>
<script type="module" src="/assets/app.js"></script>

38
mcp.html Normal file
View file

@ -0,0 +1,38 @@
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>MCP & API — PromptPCB Parts</title>
<link rel="stylesheet" href="/assets/style.css">
<header class="top"><div class="wrap">
<a class="brand" href="/"><span class="dot"></span> PromptPCB <small>· Parts</small></a>
<nav class="main"><a href="/">Catalog</a><a href="/submit.html">Submit a part</a><a href="/mcp.html" class="active">MCP / API</a></nav>
<span class="spacer"></span><span class="credits">◆ <b>5</b> credits</span>
</div></header>
<div class="wrap"><div class="form" style="max-width:900px">
<h1 class="dh1">Ground your design agent in real parts</h1>
<p style="color:var(--dim);line-height:1.6">Every part here is exposed to AI design tools over <b>MCP</b> and a plain HTTP <b>API</b>, so a model can ask
<em>"what do I have to blink an LED"</em> or <em>"a connector rated 20&nbsp;A"</em> and get real, verified, in-stock options — with
labelled pins, SPICE, and a 3D model — <b>before</b> it starts building a module.</p>
<div class="section"><h3>MCP tools</h3><div class="uc">
<li><b>library_overview</b> — the whole catalog at a glance</li>
<li><b>search_parts</b> — semantic reverse lookup ("something to drive a brushless motor")</li>
<li><b>suggest_for_need</b> — a functional need → ranked options with the reason to pick each</li>
<li><b>find_parts_by_requirements</b> — filters where a rating must <em>cover</em> the ask, e.g. <code>{class:"connector", min_current_a:20}</code></li>
<li><b>resolve_value</b> — "50 ohm resistor" → the series + closest standard value</li>
<li><b>list_parts_in_class</b> · <b>get_part</b> — browse a class / full record (specs, pins, SPICE, datasheet, 3D)</li>
</div></div>
<div class="section"><h3>HTTP API</h3>
<pre class="spice">GET /overview | /classes | /class/:class | /part/:id
POST /search { "query": "reverse polarity protection" }
POST /requirements { "class": "connector", "min_current_a": 20 }
POST /suggest { "need": "step 5V down to 3.3V" }
POST /resolve_value{ "query": "100nF" }</pre>
</div>
<div class="section"><h3>Your saved library</h3>
<p style="color:var(--dim);line-height:1.6">Add specific parts to <b>your library</b> and they're cached to your account — search over just your parts, reuse
them forever, and pull their files without spending credits again. Contribute a novel curated part to top up your download credits.</p>
</div>
<a class="btn" href="/">Browse the catalog →</a>
</div></div>

30651
models/buck_lm5164.obj Normal file

File diff suppressed because it is too large Load diff

127
models/can_tja1051.obj Normal file
View file

@ -0,0 +1,127 @@
# generated body mesh (SOIC-8_L4.9-W3.9-P1.27-LS6.0-BL) 4.90x6.00x1.20mm, 8 pads
v 1.6110 -3.5925 0.0000
v 2.1990 -3.5925 0.0000
v 2.1990 -1.5475 0.0000
v 1.6110 -1.5475 0.0000
v 1.6110 -3.5925 0.1200
v 2.1990 -3.5925 0.1200
v 2.1990 -1.5475 0.1200
v 1.6110 -1.5475 0.1200
v 0.3410 -3.5925 0.0000
v 0.9290 -3.5925 0.0000
v 0.9290 -1.5475 0.0000
v 0.3410 -1.5475 0.0000
v 0.3410 -3.5925 0.1200
v 0.9290 -3.5925 0.1200
v 0.9290 -1.5475 0.1200
v 0.3410 -1.5475 0.1200
v -0.9290 -3.5925 0.0000
v -0.3410 -3.5925 0.0000
v -0.3410 -1.5475 0.0000
v -0.9290 -1.5475 0.0000
v -0.9290 -3.5925 0.1200
v -0.3410 -3.5925 0.1200
v -0.3410 -1.5475 0.1200
v -0.9290 -1.5475 0.1200
v -2.1990 -3.5925 0.0000
v -1.6110 -3.5925 0.0000
v -1.6110 -1.5475 0.0000
v -2.1990 -1.5475 0.0000
v -2.1990 -3.5925 0.1200
v -1.6110 -3.5925 0.1200
v -1.6110 -1.5475 0.1200
v -2.1990 -1.5475 0.1200
v 1.6110 1.5475 0.0000
v 2.1990 1.5475 0.0000
v 2.1990 3.5925 0.0000
v 1.6110 3.5925 0.0000
v 1.6110 1.5475 0.1200
v 2.1990 1.5475 0.1200
v 2.1990 3.5925 0.1200
v 1.6110 3.5925 0.1200
v 0.3410 1.5475 0.0000
v 0.9290 1.5475 0.0000
v 0.9290 3.5925 0.0000
v 0.3410 3.5925 0.0000
v 0.3410 1.5475 0.1200
v 0.9290 1.5475 0.1200
v 0.9290 3.5925 0.1200
v 0.3410 3.5925 0.1200
v -0.9290 1.5475 0.0000
v -0.3410 1.5475 0.0000
v -0.3410 3.5925 0.0000
v -0.9290 3.5925 0.0000
v -0.9290 1.5475 0.1200
v -0.3410 1.5475 0.1200
v -0.3410 3.5925 0.1200
v -0.9290 3.5925 0.1200
v -2.1990 1.5475 0.0000
v -1.6110 1.5475 0.0000
v -1.6110 3.5925 0.0000
v -2.1990 3.5925 0.0000
v -2.1990 1.5475 0.1200
v -1.6110 1.5475 0.1200
v -1.6110 3.5925 0.1200
v -2.1990 3.5925 0.1200
v -2.4500 -3.0000 0.1000
v 2.4500 -3.0000 0.1000
v 2.4500 3.0000 0.1000
v -2.4500 3.0000 0.1000
v -2.4500 -3.0000 1.3000
v 2.4500 -3.0000 1.3000
v 2.4500 3.0000 1.3000
v -2.4500 3.0000 1.3000
f 1 4 3 2
f 5 6 7 8
f 1 2 6 5
f 2 3 7 6
f 3 4 8 7
f 4 1 5 8
f 9 12 11 10
f 13 14 15 16
f 9 10 14 13
f 10 11 15 14
f 11 12 16 15
f 12 9 13 16
f 17 20 19 18
f 21 22 23 24
f 17 18 22 21
f 18 19 23 22
f 19 20 24 23
f 20 17 21 24
f 25 28 27 26
f 29 30 31 32
f 25 26 30 29
f 26 27 31 30
f 27 28 32 31
f 28 25 29 32
f 33 36 35 34
f 37 38 39 40
f 33 34 38 37
f 34 35 39 38
f 35 36 40 39
f 36 33 37 40
f 41 44 43 42
f 45 46 47 48
f 41 42 46 45
f 42 43 47 46
f 43 44 48 47
f 44 41 45 48
f 49 52 51 50
f 53 54 55 56
f 49 50 54 53
f 50 51 55 54
f 51 52 56 55
f 52 49 53 56
f 57 60 59 58
f 61 62 63 64
f 57 58 62 61
f 58 59 63 62
f 59 60 64 63
f 60 57 61 64
f 65 68 67 66
f 69 70 71 72
f 65 66 70 69
f 66 67 71 70
f 67 68 72 71
f 68 65 69 72

View file

@ -0,0 +1,43 @@
# standard C0603 chip mesh 1.6x0.8x0.8mm (shared)
v -0.8000 -0.4000 0.0000
v -0.4000 -0.4000 0.0000
v -0.4000 0.4000 0.0000
v -0.8000 0.4000 0.0000
v -0.8000 -0.4000 0.1500
v -0.4000 -0.4000 0.1500
v -0.4000 0.4000 0.1500
v -0.8000 0.4000 0.1500
v 0.4000 -0.4000 0.0000
v 0.8000 -0.4000 0.0000
v 0.8000 0.4000 0.0000
v 0.4000 0.4000 0.0000
v 0.4000 -0.4000 0.1500
v 0.8000 -0.4000 0.1500
v 0.8000 0.4000 0.1500
v 0.4000 0.4000 0.1500
v -0.5500 -0.4000 0.0500
v 0.5500 -0.4000 0.0500
v 0.5500 0.4000 0.0500
v -0.5500 0.4000 0.0500
v -0.5500 -0.4000 0.8000
v 0.5500 -0.4000 0.8000
v 0.5500 0.4000 0.8000
v -0.5500 0.4000 0.8000
f 1 4 3 2
f 5 6 7 8
f 1 2 6 5
f 2 3 7 6
f 3 4 8 7
f 4 1 5 8
f 9 12 11 10
f 13 14 15 16
f 9 10 14 13
f 10 11 15 14
f 11 12 16 15
f 12 9 13 16
f 17 20 19 18
f 21 22 23 24
f 17 18 22 21
f 18 19 23 22
f 19 20 24 23
f 20 17 21 24

View file

@ -0,0 +1,43 @@
# standard ELEC-D6.3 chip mesh 6.6x6.6x5.4mm (shared)
v -3.3000 -3.3000 0.0000
v -2.9000 -3.3000 0.0000
v -2.9000 3.3000 0.0000
v -3.3000 3.3000 0.0000
v -3.3000 -3.3000 0.1500
v -2.9000 -3.3000 0.1500
v -2.9000 3.3000 0.1500
v -3.3000 3.3000 0.1500
v 2.9000 -3.3000 0.0000
v 3.3000 -3.3000 0.0000
v 3.3000 3.3000 0.0000
v 2.9000 3.3000 0.0000
v 2.9000 -3.3000 0.1500
v 3.3000 -3.3000 0.1500
v 3.3000 3.3000 0.1500
v 2.9000 3.3000 0.1500
v -3.0500 -3.3000 0.0500
v 3.0500 -3.3000 0.0500
v 3.0500 3.3000 0.0500
v -3.0500 3.3000 0.0500
v -3.0500 -3.3000 5.4000
v 3.0500 -3.3000 5.4000
v 3.0500 3.3000 5.4000
v -3.0500 3.3000 5.4000
f 1 4 3 2
f 5 6 7 8
f 1 2 6 5
f 2 3 7 6
f 3 4 8 7
f 4 1 5 8
f 9 12 11 10
f 13 14 15 16
f 9 10 14 13
f 10 11 15 14
f 11 12 16 15
f 12 9 13 16
f 17 20 19 18
f 21 22 23 24
f 17 18 22 21
f 18 19 23 22
f 19 20 24 23
f 20 17 21 24

43
models/conn_xt60.obj Normal file
View file

@ -0,0 +1,43 @@
# generated body mesh (CONN-TH_XT60PB-F) 15.70x7.90x8.00mm, 2 pads
v 0.8420 -2.7580 0.0000
v 6.3580 -2.7580 0.0000
v 6.3580 2.7580 0.0000
v 0.8420 2.7580 0.0000
v 0.8420 -2.7580 0.1200
v 6.3580 -2.7580 0.1200
v 6.3580 2.7580 0.1200
v 0.8420 2.7580 0.1200
v -6.3580 -2.7580 0.0000
v -0.8420 -2.7580 0.0000
v -0.8420 2.7580 0.0000
v -6.3580 2.7580 0.0000
v -6.3580 -2.7580 0.1200
v -0.8420 -2.7580 0.1200
v -0.8420 2.7580 0.1200
v -6.3580 2.7580 0.1200
v -7.8500 -3.9500 0.1000
v 7.8500 -3.9500 0.1000
v 7.8500 3.9500 0.1000
v -7.8500 3.9500 0.1000
v -7.8500 -3.9500 8.1000
v 7.8500 -3.9500 8.1000
v 7.8500 3.9500 8.1000
v -7.8500 3.9500 8.1000
f 1 4 3 2
f 5 6 7 8
f 1 2 6 5
f 2 3 7 6
f 3 4 8 7
f 4 1 5 8
f 9 12 11 10
f 13 14 15 16
f 9 10 14 13
f 10 11 15 14
f 11 12 16 15
f 12 9 13 16
f 17 20 19 18
f 21 22 23 24
f 17 18 22 21
f 18 19 23 22
f 19 20 24 23
f 20 17 21 24

23180
models/esd_usblc6.obj Normal file

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,701 @@
# generated body mesh (VQFN-48_L7.0-W7.0-P0.50-TL-EP5.1) 7.02x7.02x1.20mm, 49 pads
v -3.7395 -2.8900 0.0000
v -3.0745 -2.8900 0.0000
v -3.0745 -2.6100 0.0000
v -3.7395 -2.6100 0.0000
v -3.7395 -2.8900 0.1200
v -3.0745 -2.8900 0.1200
v -3.0745 -2.6100 0.1200
v -3.7395 -2.6100 0.1200
v -3.7395 -2.3900 0.0000
v -3.0745 -2.3900 0.0000
v -3.0745 -2.1100 0.0000
v -3.7395 -2.1100 0.0000
v -3.7395 -2.3900 0.1200
v -3.0745 -2.3900 0.1200
v -3.0745 -2.1100 0.1200
v -3.7395 -2.1100 0.1200
v -3.7395 -1.8900 0.0000
v -3.0745 -1.8900 0.0000
v -3.0745 -1.6100 0.0000
v -3.7395 -1.6100 0.0000
v -3.7395 -1.8900 0.1200
v -3.0745 -1.8900 0.1200
v -3.0745 -1.6100 0.1200
v -3.7395 -1.6100 0.1200
v -3.7395 -1.3900 0.0000
v -3.0745 -1.3900 0.0000
v -3.0745 -1.1100 0.0000
v -3.7395 -1.1100 0.0000
v -3.7395 -1.3900 0.1200
v -3.0745 -1.3900 0.1200
v -3.0745 -1.1100 0.1200
v -3.7395 -1.1100 0.1200
v -3.7395 -0.8900 0.0000
v -3.0745 -0.8900 0.0000
v -3.0745 -0.6100 0.0000
v -3.7395 -0.6100 0.0000
v -3.7395 -0.8900 0.1200
v -3.0745 -0.8900 0.1200
v -3.0745 -0.6100 0.1200
v -3.7395 -0.6100 0.1200
v -3.7395 -0.3900 0.0000
v -3.0745 -0.3900 0.0000
v -3.0745 -0.1100 0.0000
v -3.7395 -0.1100 0.0000
v -3.7395 -0.3900 0.1200
v -3.0745 -0.3900 0.1200
v -3.0745 -0.1100 0.1200
v -3.7395 -0.1100 0.1200
v -3.7395 0.1100 0.0000
v -3.0745 0.1100 0.0000
v -3.0745 0.3900 0.0000
v -3.7395 0.3900 0.0000
v -3.7395 0.1100 0.1200
v -3.0745 0.1100 0.1200
v -3.0745 0.3900 0.1200
v -3.7395 0.3900 0.1200
v -3.7395 0.6100 0.0000
v -3.0745 0.6100 0.0000
v -3.0745 0.8900 0.0000
v -3.7395 0.8900 0.0000
v -3.7395 0.6100 0.1200
v -3.0745 0.6100 0.1200
v -3.0745 0.8900 0.1200
v -3.7395 0.8900 0.1200
v -3.7395 1.1100 0.0000
v -3.0745 1.1100 0.0000
v -3.0745 1.3900 0.0000
v -3.7395 1.3900 0.0000
v -3.7395 1.1100 0.1200
v -3.0745 1.1100 0.1200
v -3.0745 1.3900 0.1200
v -3.7395 1.3900 0.1200
v -3.7395 1.6100 0.0000
v -3.0745 1.6100 0.0000
v -3.0745 1.8900 0.0000
v -3.7395 1.8900 0.0000
v -3.7395 1.6100 0.1200
v -3.0745 1.6100 0.1200
v -3.0745 1.8900 0.1200
v -3.7395 1.8900 0.1200
v -3.7395 2.1100 0.0000
v -3.0745 2.1100 0.0000
v -3.0745 2.3900 0.0000
v -3.7395 2.3900 0.0000
v -3.7395 2.1100 0.1200
v -3.0745 2.1100 0.1200
v -3.0745 2.3900 0.1200
v -3.7395 2.3900 0.1200
v -3.7395 2.6100 0.0000
v -3.0745 2.6100 0.0000
v -3.0745 2.8900 0.0000
v -3.7395 2.8900 0.0000
v -3.7395 2.6100 0.1200
v -3.0745 2.6100 0.1200
v -3.0745 2.8900 0.1200
v -3.7395 2.8900 0.1200
v -2.8900 3.0745 0.0000
v -2.6100 3.0745 0.0000
v -2.6100 3.7395 0.0000
v -2.8900 3.7395 0.0000
v -2.8900 3.0745 0.1200
v -2.6100 3.0745 0.1200
v -2.6100 3.7395 0.1200
v -2.8900 3.7395 0.1200
v -2.3900 3.0745 0.0000
v -2.1100 3.0745 0.0000
v -2.1100 3.7395 0.0000
v -2.3900 3.7395 0.0000
v -2.3900 3.0745 0.1200
v -2.1100 3.0745 0.1200
v -2.1100 3.7395 0.1200
v -2.3900 3.7395 0.1200
v -1.8900 3.0745 0.0000
v -1.6100 3.0745 0.0000
v -1.6100 3.7395 0.0000
v -1.8900 3.7395 0.0000
v -1.8900 3.0745 0.1200
v -1.6100 3.0745 0.1200
v -1.6100 3.7395 0.1200
v -1.8900 3.7395 0.1200
v -1.3900 3.0745 0.0000
v -1.1100 3.0745 0.0000
v -1.1100 3.7395 0.0000
v -1.3900 3.7395 0.0000
v -1.3900 3.0745 0.1200
v -1.1100 3.0745 0.1200
v -1.1100 3.7395 0.1200
v -1.3900 3.7395 0.1200
v -0.8900 3.0745 0.0000
v -0.6100 3.0745 0.0000
v -0.6100 3.7395 0.0000
v -0.8900 3.7395 0.0000
v -0.8900 3.0745 0.1200
v -0.6100 3.0745 0.1200
v -0.6100 3.7395 0.1200
v -0.8900 3.7395 0.1200
v -0.3900 3.0745 0.0000
v -0.1100 3.0745 0.0000
v -0.1100 3.7395 0.0000
v -0.3900 3.7395 0.0000
v -0.3900 3.0745 0.1200
v -0.1100 3.0745 0.1200
v -0.1100 3.7395 0.1200
v -0.3900 3.7395 0.1200
v 0.1100 3.0745 0.0000
v 0.3900 3.0745 0.0000
v 0.3900 3.7395 0.0000
v 0.1100 3.7395 0.0000
v 0.1100 3.0745 0.1200
v 0.3900 3.0745 0.1200
v 0.3900 3.7395 0.1200
v 0.1100 3.7395 0.1200
v 0.6100 3.0745 0.0000
v 0.8900 3.0745 0.0000
v 0.8900 3.7395 0.0000
v 0.6100 3.7395 0.0000
v 0.6100 3.0745 0.1200
v 0.8900 3.0745 0.1200
v 0.8900 3.7395 0.1200
v 0.6100 3.7395 0.1200
v 1.1100 3.0745 0.0000
v 1.3900 3.0745 0.0000
v 1.3900 3.7395 0.0000
v 1.1100 3.7395 0.0000
v 1.1100 3.0745 0.1200
v 1.3900 3.0745 0.1200
v 1.3900 3.7395 0.1200
v 1.1100 3.7395 0.1200
v 1.6100 3.0745 0.0000
v 1.8900 3.0745 0.0000
v 1.8900 3.7395 0.0000
v 1.6100 3.7395 0.0000
v 1.6100 3.0745 0.1200
v 1.8900 3.0745 0.1200
v 1.8900 3.7395 0.1200
v 1.6100 3.7395 0.1200
v 2.1100 3.0745 0.0000
v 2.3900 3.0745 0.0000
v 2.3900 3.7395 0.0000
v 2.1100 3.7395 0.0000
v 2.1100 3.0745 0.1200
v 2.3900 3.0745 0.1200
v 2.3900 3.7395 0.1200
v 2.1100 3.7395 0.1200
v 2.6100 3.0745 0.0000
v 2.8900 3.0745 0.0000
v 2.8900 3.7395 0.0000
v 2.6100 3.7395 0.0000
v 2.6100 3.0745 0.1200
v 2.8900 3.0745 0.1200
v 2.8900 3.7395 0.1200
v 2.6100 3.7395 0.1200
v 3.0745 2.6100 0.0000
v 3.7395 2.6100 0.0000
v 3.7395 2.8900 0.0000
v 3.0745 2.8900 0.0000
v 3.0745 2.6100 0.1200
v 3.7395 2.6100 0.1200
v 3.7395 2.8900 0.1200
v 3.0745 2.8900 0.1200
v 3.0745 2.1100 0.0000
v 3.7395 2.1100 0.0000
v 3.7395 2.3900 0.0000
v 3.0745 2.3900 0.0000
v 3.0745 2.1100 0.1200
v 3.7395 2.1100 0.1200
v 3.7395 2.3900 0.1200
v 3.0745 2.3900 0.1200
v 3.0745 1.6100 0.0000
v 3.7395 1.6100 0.0000
v 3.7395 1.8900 0.0000
v 3.0745 1.8900 0.0000
v 3.0745 1.6100 0.1200
v 3.7395 1.6100 0.1200
v 3.7395 1.8900 0.1200
v 3.0745 1.8900 0.1200
v 3.0745 1.1100 0.0000
v 3.7395 1.1100 0.0000
v 3.7395 1.3900 0.0000
v 3.0745 1.3900 0.0000
v 3.0745 1.1100 0.1200
v 3.7395 1.1100 0.1200
v 3.7395 1.3900 0.1200
v 3.0745 1.3900 0.1200
v 3.0745 0.6100 0.0000
v 3.7395 0.6100 0.0000
v 3.7395 0.8900 0.0000
v 3.0745 0.8900 0.0000
v 3.0745 0.6100 0.1200
v 3.7395 0.6100 0.1200
v 3.7395 0.8900 0.1200
v 3.0745 0.8900 0.1200
v 3.0745 0.1100 0.0000
v 3.7395 0.1100 0.0000
v 3.7395 0.3900 0.0000
v 3.0745 0.3900 0.0000
v 3.0745 0.1100 0.1200
v 3.7395 0.1100 0.1200
v 3.7395 0.3900 0.1200
v 3.0745 0.3900 0.1200
v 3.0745 -0.3900 0.0000
v 3.7395 -0.3900 0.0000
v 3.7395 -0.1100 0.0000
v 3.0745 -0.1100 0.0000
v 3.0745 -0.3900 0.1200
v 3.7395 -0.3900 0.1200
v 3.7395 -0.1100 0.1200
v 3.0745 -0.1100 0.1200
v 3.0745 -0.8900 0.0000
v 3.7395 -0.8900 0.0000
v 3.7395 -0.6100 0.0000
v 3.0745 -0.6100 0.0000
v 3.0745 -0.8900 0.1200
v 3.7395 -0.8900 0.1200
v 3.7395 -0.6100 0.1200
v 3.0745 -0.6100 0.1200
v 3.0745 -1.3900 0.0000
v 3.7395 -1.3900 0.0000
v 3.7395 -1.1100 0.0000
v 3.0745 -1.1100 0.0000
v 3.0745 -1.3900 0.1200
v 3.7395 -1.3900 0.1200
v 3.7395 -1.1100 0.1200
v 3.0745 -1.1100 0.1200
v 3.0745 -1.8900 0.0000
v 3.7395 -1.8900 0.0000
v 3.7395 -1.6100 0.0000
v 3.0745 -1.6100 0.0000
v 3.0745 -1.8900 0.1200
v 3.7395 -1.8900 0.1200
v 3.7395 -1.6100 0.1200
v 3.0745 -1.6100 0.1200
v 3.0745 -2.3900 0.0000
v 3.7395 -2.3900 0.0000
v 3.7395 -2.1100 0.0000
v 3.0745 -2.1100 0.0000
v 3.0745 -2.3900 0.1200
v 3.7395 -2.3900 0.1200
v 3.7395 -2.1100 0.1200
v 3.0745 -2.1100 0.1200
v 3.0745 -2.8900 0.0000
v 3.7395 -2.8900 0.0000
v 3.7395 -2.6100 0.0000
v 3.0745 -2.6100 0.0000
v 3.0745 -2.8900 0.1200
v 3.7395 -2.8900 0.1200
v 3.7395 -2.6100 0.1200
v 3.0745 -2.6100 0.1200
v 2.6100 -3.7395 0.0000
v 2.8900 -3.7395 0.0000
v 2.8900 -3.0745 0.0000
v 2.6100 -3.0745 0.0000
v 2.6100 -3.7395 0.1200
v 2.8900 -3.7395 0.1200
v 2.8900 -3.0745 0.1200
v 2.6100 -3.0745 0.1200
v 2.1100 -3.7395 0.0000
v 2.3900 -3.7395 0.0000
v 2.3900 -3.0745 0.0000
v 2.1100 -3.0745 0.0000
v 2.1100 -3.7395 0.1200
v 2.3900 -3.7395 0.1200
v 2.3900 -3.0745 0.1200
v 2.1100 -3.0745 0.1200
v 1.6100 -3.7395 0.0000
v 1.8900 -3.7395 0.0000
v 1.8900 -3.0745 0.0000
v 1.6100 -3.0745 0.0000
v 1.6100 -3.7395 0.1200
v 1.8900 -3.7395 0.1200
v 1.8900 -3.0745 0.1200
v 1.6100 -3.0745 0.1200
v 1.1100 -3.7395 0.0000
v 1.3900 -3.7395 0.0000
v 1.3900 -3.0745 0.0000
v 1.1100 -3.0745 0.0000
v 1.1100 -3.7395 0.1200
v 1.3900 -3.7395 0.1200
v 1.3900 -3.0745 0.1200
v 1.1100 -3.0745 0.1200
v 0.6100 -3.7395 0.0000
v 0.8900 -3.7395 0.0000
v 0.8900 -3.0745 0.0000
v 0.6100 -3.0745 0.0000
v 0.6100 -3.7395 0.1200
v 0.8900 -3.7395 0.1200
v 0.8900 -3.0745 0.1200
v 0.6100 -3.0745 0.1200
v 0.1100 -3.7395 0.0000
v 0.3900 -3.7395 0.0000
v 0.3900 -3.0745 0.0000
v 0.1100 -3.0745 0.0000
v 0.1100 -3.7395 0.1200
v 0.3900 -3.7395 0.1200
v 0.3900 -3.0745 0.1200
v 0.1100 -3.0745 0.1200
v -0.3900 -3.7395 0.0000
v -0.1100 -3.7395 0.0000
v -0.1100 -3.0745 0.0000
v -0.3900 -3.0745 0.0000
v -0.3900 -3.7395 0.1200
v -0.1100 -3.7395 0.1200
v -0.1100 -3.0745 0.1200
v -0.3900 -3.0745 0.1200
v -0.8900 -3.7395 0.0000
v -0.6100 -3.7395 0.0000
v -0.6100 -3.0745 0.0000
v -0.8900 -3.0745 0.0000
v -0.8900 -3.7395 0.1200
v -0.6100 -3.7395 0.1200
v -0.6100 -3.0745 0.1200
v -0.8900 -3.0745 0.1200
v -1.3900 -3.7395 0.0000
v -1.1100 -3.7395 0.0000
v -1.1100 -3.0745 0.0000
v -1.3900 -3.0745 0.0000
v -1.3900 -3.7395 0.1200
v -1.1100 -3.7395 0.1200
v -1.1100 -3.0745 0.1200
v -1.3900 -3.0745 0.1200
v -1.8900 -3.7395 0.0000
v -1.6100 -3.7395 0.0000
v -1.6100 -3.0745 0.0000
v -1.8900 -3.0745 0.0000
v -1.8900 -3.7395 0.1200
v -1.6100 -3.7395 0.1200
v -1.6100 -3.0745 0.1200
v -1.8900 -3.0745 0.1200
v -2.3900 -3.7395 0.0000
v -2.1100 -3.7395 0.0000
v -2.1100 -3.0745 0.0000
v -2.3900 -3.0745 0.0000
v -2.3900 -3.7395 0.1200
v -2.1100 -3.7395 0.1200
v -2.1100 -3.0745 0.1200
v -2.3900 -3.0745 0.1200
v -2.8900 -3.7395 0.0000
v -2.6100 -3.7395 0.0000
v -2.6100 -3.0745 0.0000
v -2.8900 -3.0745 0.0000
v -2.8900 -3.7395 0.1200
v -2.6100 -3.7395 0.1200
v -2.6100 -3.0745 0.1200
v -2.8900 -3.0745 0.1200
v -2.5750 -2.5750 0.0000
v 2.5750 -2.5750 0.0000
v 2.5750 2.5750 0.0000
v -2.5750 2.5750 0.0000
v -2.5750 -2.5750 0.1200
v 2.5750 -2.5750 0.1200
v 2.5750 2.5750 0.1200
v -2.5750 2.5750 0.1200
v -3.5100 -3.5100 0.1000
v 3.5100 -3.5100 0.1000
v 3.5100 3.5100 0.1000
v -3.5100 3.5100 0.1000
v -3.5100 -3.5100 1.3000
v 3.5100 -3.5100 1.3000
v 3.5100 3.5100 1.3000
v -3.5100 3.5100 1.3000
f 1 4 3 2
f 5 6 7 8
f 1 2 6 5
f 2 3 7 6
f 3 4 8 7
f 4 1 5 8
f 9 12 11 10
f 13 14 15 16
f 9 10 14 13
f 10 11 15 14
f 11 12 16 15
f 12 9 13 16
f 17 20 19 18
f 21 22 23 24
f 17 18 22 21
f 18 19 23 22
f 19 20 24 23
f 20 17 21 24
f 25 28 27 26
f 29 30 31 32
f 25 26 30 29
f 26 27 31 30
f 27 28 32 31
f 28 25 29 32
f 33 36 35 34
f 37 38 39 40
f 33 34 38 37
f 34 35 39 38
f 35 36 40 39
f 36 33 37 40
f 41 44 43 42
f 45 46 47 48
f 41 42 46 45
f 42 43 47 46
f 43 44 48 47
f 44 41 45 48
f 49 52 51 50
f 53 54 55 56
f 49 50 54 53
f 50 51 55 54
f 51 52 56 55
f 52 49 53 56
f 57 60 59 58
f 61 62 63 64
f 57 58 62 61
f 58 59 63 62
f 59 60 64 63
f 60 57 61 64
f 65 68 67 66
f 69 70 71 72
f 65 66 70 69
f 66 67 71 70
f 67 68 72 71
f 68 65 69 72
f 73 76 75 74
f 77 78 79 80
f 73 74 78 77
f 74 75 79 78
f 75 76 80 79
f 76 73 77 80
f 81 84 83 82
f 85 86 87 88
f 81 82 86 85
f 82 83 87 86
f 83 84 88 87
f 84 81 85 88
f 89 92 91 90
f 93 94 95 96
f 89 90 94 93
f 90 91 95 94
f 91 92 96 95
f 92 89 93 96
f 97 100 99 98
f 101 102 103 104
f 97 98 102 101
f 98 99 103 102
f 99 100 104 103
f 100 97 101 104
f 105 108 107 106
f 109 110 111 112
f 105 106 110 109
f 106 107 111 110
f 107 108 112 111
f 108 105 109 112
f 113 116 115 114
f 117 118 119 120
f 113 114 118 117
f 114 115 119 118
f 115 116 120 119
f 116 113 117 120
f 121 124 123 122
f 125 126 127 128
f 121 122 126 125
f 122 123 127 126
f 123 124 128 127
f 124 121 125 128
f 129 132 131 130
f 133 134 135 136
f 129 130 134 133
f 130 131 135 134
f 131 132 136 135
f 132 129 133 136
f 137 140 139 138
f 141 142 143 144
f 137 138 142 141
f 138 139 143 142
f 139 140 144 143
f 140 137 141 144
f 145 148 147 146
f 149 150 151 152
f 145 146 150 149
f 146 147 151 150
f 147 148 152 151
f 148 145 149 152
f 153 156 155 154
f 157 158 159 160
f 153 154 158 157
f 154 155 159 158
f 155 156 160 159
f 156 153 157 160
f 161 164 163 162
f 165 166 167 168
f 161 162 166 165
f 162 163 167 166
f 163 164 168 167
f 164 161 165 168
f 169 172 171 170
f 173 174 175 176
f 169 170 174 173
f 170 171 175 174
f 171 172 176 175
f 172 169 173 176
f 177 180 179 178
f 181 182 183 184
f 177 178 182 181
f 178 179 183 182
f 179 180 184 183
f 180 177 181 184
f 185 188 187 186
f 189 190 191 192
f 185 186 190 189
f 186 187 191 190
f 187 188 192 191
f 188 185 189 192
f 193 196 195 194
f 197 198 199 200
f 193 194 198 197
f 194 195 199 198
f 195 196 200 199
f 196 193 197 200
f 201 204 203 202
f 205 206 207 208
f 201 202 206 205
f 202 203 207 206
f 203 204 208 207
f 204 201 205 208
f 209 212 211 210
f 213 214 215 216
f 209 210 214 213
f 210 211 215 214
f 211 212 216 215
f 212 209 213 216
f 217 220 219 218
f 221 222 223 224
f 217 218 222 221
f 218 219 223 222
f 219 220 224 223
f 220 217 221 224
f 225 228 227 226
f 229 230 231 232
f 225 226 230 229
f 226 227 231 230
f 227 228 232 231
f 228 225 229 232
f 233 236 235 234
f 237 238 239 240
f 233 234 238 237
f 234 235 239 238
f 235 236 240 239
f 236 233 237 240
f 241 244 243 242
f 245 246 247 248
f 241 242 246 245
f 242 243 247 246
f 243 244 248 247
f 244 241 245 248
f 249 252 251 250
f 253 254 255 256
f 249 250 254 253
f 250 251 255 254
f 251 252 256 255
f 252 249 253 256
f 257 260 259 258
f 261 262 263 264
f 257 258 262 261
f 258 259 263 262
f 259 260 264 263
f 260 257 261 264
f 265 268 267 266
f 269 270 271 272
f 265 266 270 269
f 266 267 271 270
f 267 268 272 271
f 268 265 269 272
f 273 276 275 274
f 277 278 279 280
f 273 274 278 277
f 274 275 279 278
f 275 276 280 279
f 276 273 277 280
f 281 284 283 282
f 285 286 287 288
f 281 282 286 285
f 282 283 287 286
f 283 284 288 287
f 284 281 285 288
f 289 292 291 290
f 293 294 295 296
f 289 290 294 293
f 290 291 295 294
f 291 292 296 295
f 292 289 293 296
f 297 300 299 298
f 301 302 303 304
f 297 298 302 301
f 298 299 303 302
f 299 300 304 303
f 300 297 301 304
f 305 308 307 306
f 309 310 311 312
f 305 306 310 309
f 306 307 311 310
f 307 308 312 311
f 308 305 309 312
f 313 316 315 314
f 317 318 319 320
f 313 314 318 317
f 314 315 319 318
f 315 316 320 319
f 316 313 317 320
f 321 324 323 322
f 325 326 327 328
f 321 322 326 325
f 322 323 327 326
f 323 324 328 327
f 324 321 325 328
f 329 332 331 330
f 333 334 335 336
f 329 330 334 333
f 330 331 335 334
f 331 332 336 335
f 332 329 333 336
f 337 340 339 338
f 341 342 343 344
f 337 338 342 341
f 338 339 343 342
f 339 340 344 343
f 340 337 341 344
f 345 348 347 346
f 349 350 351 352
f 345 346 350 349
f 346 347 351 350
f 347 348 352 351
f 348 345 349 352
f 353 356 355 354
f 357 358 359 360
f 353 354 358 357
f 354 355 359 358
f 355 356 360 359
f 356 353 357 360
f 361 364 363 362
f 365 366 367 368
f 361 362 366 365
f 362 363 367 366
f 363 364 368 367
f 364 361 365 368
f 369 372 371 370
f 373 374 375 376
f 369 370 374 373
f 370 371 375 374
f 371 372 376 375
f 372 369 373 376
f 377 380 379 378
f 381 382 383 384
f 377 378 382 381
f 378 379 383 382
f 379 380 384 383
f 380 377 381 384
f 385 388 387 386
f 389 390 391 392
f 385 386 390 389
f 386 387 391 390
f 387 388 392 391
f 388 385 389 392
f 393 396 395 394
f 397 398 399 400
f 393 394 398 397
f 394 395 399 398
f 395 396 400 399
f 396 393 397 400

7838
models/inductor_buck.obj Normal file

File diff suppressed because it is too large Load diff

13130
models/ldo_ams1117_33.obj Normal file

File diff suppressed because it is too large Load diff

1823
models/led_indicator.obj Normal file

File diff suppressed because it is too large Load diff

911
models/mcu_stm32f405.obj Normal file
View file

@ -0,0 +1,911 @@
# generated body mesh (LQFP-64_L10.0-W10.0-P0.50-LS12.0-BL) 12.00x12.00x1.20mm, 64 pads
v -3.9000 4.9440 0.0000
v -3.6000 4.9440 0.0000
v -3.6000 6.4440 0.0000
v -3.9000 6.4440 0.0000
v -3.9000 4.9440 0.1200
v -3.6000 4.9440 0.1200
v -3.6000 6.4440 0.1200
v -3.9000 6.4440 0.1200
v -3.4000 4.9440 0.0000
v -3.1000 4.9440 0.0000
v -3.1000 6.4440 0.0000
v -3.4000 6.4440 0.0000
v -3.4000 4.9440 0.1200
v -3.1000 4.9440 0.1200
v -3.1000 6.4440 0.1200
v -3.4000 6.4440 0.1200
v -2.9000 4.9440 0.0000
v -2.6000 4.9440 0.0000
v -2.6000 6.4440 0.0000
v -2.9000 6.4440 0.0000
v -2.9000 4.9440 0.1200
v -2.6000 4.9440 0.1200
v -2.6000 6.4440 0.1200
v -2.9000 6.4440 0.1200
v -2.4000 4.9440 0.0000
v -2.1000 4.9440 0.0000
v -2.1000 6.4440 0.0000
v -2.4000 6.4440 0.0000
v -2.4000 4.9440 0.1200
v -2.1000 4.9440 0.1200
v -2.1000 6.4440 0.1200
v -2.4000 6.4440 0.1200
v -1.9000 4.9440 0.0000
v -1.6000 4.9440 0.0000
v -1.6000 6.4440 0.0000
v -1.9000 6.4440 0.0000
v -1.9000 4.9440 0.1200
v -1.6000 4.9440 0.1200
v -1.6000 6.4440 0.1200
v -1.9000 6.4440 0.1200
v -1.4000 4.9440 0.0000
v -1.1000 4.9440 0.0000
v -1.1000 6.4440 0.0000
v -1.4000 6.4440 0.0000
v -1.4000 4.9440 0.1200
v -1.1000 4.9440 0.1200
v -1.1000 6.4440 0.1200
v -1.4000 6.4440 0.1200
v -0.9000 4.9440 0.0000
v -0.6000 4.9440 0.0000
v -0.6000 6.4440 0.0000
v -0.9000 6.4440 0.0000
v -0.9000 4.9440 0.1200
v -0.6000 4.9440 0.1200
v -0.6000 6.4440 0.1200
v -0.9000 6.4440 0.1200
v -0.4000 4.9440 0.0000
v -0.1000 4.9440 0.0000
v -0.1000 6.4440 0.0000
v -0.4000 6.4440 0.0000
v -0.4000 4.9440 0.1200
v -0.1000 4.9440 0.1200
v -0.1000 6.4440 0.1200
v -0.4000 6.4440 0.1200
v 0.1000 4.9440 0.0000
v 0.4000 4.9440 0.0000
v 0.4000 6.4440 0.0000
v 0.1000 6.4440 0.0000
v 0.1000 4.9440 0.1200
v 0.4000 4.9440 0.1200
v 0.4000 6.4440 0.1200
v 0.1000 6.4440 0.1200
v 0.6000 4.9440 0.0000
v 0.9000 4.9440 0.0000
v 0.9000 6.4440 0.0000
v 0.6000 6.4440 0.0000
v 0.6000 4.9440 0.1200
v 0.9000 4.9440 0.1200
v 0.9000 6.4440 0.1200
v 0.6000 6.4440 0.1200
v 1.1000 4.9440 0.0000
v 1.4000 4.9440 0.0000
v 1.4000 6.4440 0.0000
v 1.1000 6.4440 0.0000
v 1.1000 4.9440 0.1200
v 1.4000 4.9440 0.1200
v 1.4000 6.4440 0.1200
v 1.1000 6.4440 0.1200
v 1.6000 4.9440 0.0000
v 1.9000 4.9440 0.0000
v 1.9000 6.4440 0.0000
v 1.6000 6.4440 0.0000
v 1.6000 4.9440 0.1200
v 1.9000 4.9440 0.1200
v 1.9000 6.4440 0.1200
v 1.6000 6.4440 0.1200
v 2.1000 4.9440 0.0000
v 2.4000 4.9440 0.0000
v 2.4000 6.4440 0.0000
v 2.1000 6.4440 0.0000
v 2.1000 4.9440 0.1200
v 2.4000 4.9440 0.1200
v 2.4000 6.4440 0.1200
v 2.1000 6.4440 0.1200
v 2.6000 4.9440 0.0000
v 2.9000 4.9440 0.0000
v 2.9000 6.4440 0.0000
v 2.6000 6.4440 0.0000
v 2.6000 4.9440 0.1200
v 2.9000 4.9440 0.1200
v 2.9000 6.4440 0.1200
v 2.6000 6.4440 0.1200
v 3.1000 4.9440 0.0000
v 3.4000 4.9440 0.0000
v 3.4000 6.4440 0.0000
v 3.1000 6.4440 0.0000
v 3.1000 4.9440 0.1200
v 3.4000 4.9440 0.1200
v 3.4000 6.4440 0.1200
v 3.1000 6.4440 0.1200
v 3.6000 4.9440 0.0000
v 3.9000 4.9440 0.0000
v 3.9000 6.4440 0.0000
v 3.6000 6.4440 0.0000
v 3.6000 4.9440 0.1200
v 3.9000 4.9440 0.1200
v 3.9000 6.4440 0.1200
v 3.6000 6.4440 0.1200
v 4.9500 3.5940 0.0000
v 6.4500 3.5940 0.0000
v 6.4500 3.8940 0.0000
v 4.9500 3.8940 0.0000
v 4.9500 3.5940 0.1200
v 6.4500 3.5940 0.1200
v 6.4500 3.8940 0.1200
v 4.9500 3.8940 0.1200
v 4.9500 3.0940 0.0000
v 6.4500 3.0940 0.0000
v 6.4500 3.3940 0.0000
v 4.9500 3.3940 0.0000
v 4.9500 3.0940 0.1200
v 6.4500 3.0940 0.1200
v 6.4500 3.3940 0.1200
v 4.9500 3.3940 0.1200
v 4.9500 2.5940 0.0000
v 6.4500 2.5940 0.0000
v 6.4500 2.8940 0.0000
v 4.9500 2.8940 0.0000
v 4.9500 2.5940 0.1200
v 6.4500 2.5940 0.1200
v 6.4500 2.8940 0.1200
v 4.9500 2.8940 0.1200
v 4.9500 2.0940 0.0000
v 6.4500 2.0940 0.0000
v 6.4500 2.3940 0.0000
v 4.9500 2.3940 0.0000
v 4.9500 2.0940 0.1200
v 6.4500 2.0940 0.1200
v 6.4500 2.3940 0.1200
v 4.9500 2.3940 0.1200
v 4.9500 1.5940 0.0000
v 6.4500 1.5940 0.0000
v 6.4500 1.8940 0.0000
v 4.9500 1.8940 0.0000
v 4.9500 1.5940 0.1200
v 6.4500 1.5940 0.1200
v 6.4500 1.8940 0.1200
v 4.9500 1.8940 0.1200
v 4.9500 1.0940 0.0000
v 6.4500 1.0940 0.0000
v 6.4500 1.3940 0.0000
v 4.9500 1.3940 0.0000
v 4.9500 1.0940 0.1200
v 6.4500 1.0940 0.1200
v 6.4500 1.3940 0.1200
v 4.9500 1.3940 0.1200
v 4.9500 0.5940 0.0000
v 6.4500 0.5940 0.0000
v 6.4500 0.8940 0.0000
v 4.9500 0.8940 0.0000
v 4.9500 0.5940 0.1200
v 6.4500 0.5940 0.1200
v 6.4500 0.8940 0.1200
v 4.9500 0.8940 0.1200
v 4.9500 0.0940 0.0000
v 6.4500 0.0940 0.0000
v 6.4500 0.3940 0.0000
v 4.9500 0.3940 0.0000
v 4.9500 0.0940 0.1200
v 6.4500 0.0940 0.1200
v 6.4500 0.3940 0.1200
v 4.9500 0.3940 0.1200
v 4.9500 -0.4060 0.0000
v 6.4500 -0.4060 0.0000
v 6.4500 -0.1060 0.0000
v 4.9500 -0.1060 0.0000
v 4.9500 -0.4060 0.1200
v 6.4500 -0.4060 0.1200
v 6.4500 -0.1060 0.1200
v 4.9500 -0.1060 0.1200
v 4.9500 -0.9060 0.0000
v 6.4500 -0.9060 0.0000
v 6.4500 -0.6060 0.0000
v 4.9500 -0.6060 0.0000
v 4.9500 -0.9060 0.1200
v 6.4500 -0.9060 0.1200
v 6.4500 -0.6060 0.1200
v 4.9500 -0.6060 0.1200
v 4.9500 -1.4060 0.0000
v 6.4500 -1.4060 0.0000
v 6.4500 -1.1060 0.0000
v 4.9500 -1.1060 0.0000
v 4.9500 -1.4060 0.1200
v 6.4500 -1.4060 0.1200
v 6.4500 -1.1060 0.1200
v 4.9500 -1.1060 0.1200
v 4.9500 -1.9060 0.0000
v 6.4500 -1.9060 0.0000
v 6.4500 -1.6060 0.0000
v 4.9500 -1.6060 0.0000
v 4.9500 -1.9060 0.1200
v 6.4500 -1.9060 0.1200
v 6.4500 -1.6060 0.1200
v 4.9500 -1.6060 0.1200
v 4.9500 -2.4060 0.0000
v 6.4500 -2.4060 0.0000
v 6.4500 -2.1060 0.0000
v 4.9500 -2.1060 0.0000
v 4.9500 -2.4060 0.1200
v 6.4500 -2.4060 0.1200
v 6.4500 -2.1060 0.1200
v 4.9500 -2.1060 0.1200
v 4.9500 -2.9060 0.0000
v 6.4500 -2.9060 0.0000
v 6.4500 -2.6060 0.0000
v 4.9500 -2.6060 0.0000
v 4.9500 -2.9060 0.1200
v 6.4500 -2.9060 0.1200
v 6.4500 -2.6060 0.1200
v 4.9500 -2.6060 0.1200
v 4.9500 -3.4060 0.0000
v 6.4500 -3.4060 0.0000
v 6.4500 -3.1060 0.0000
v 4.9500 -3.1060 0.0000
v 4.9500 -3.4060 0.1200
v 6.4500 -3.4060 0.1200
v 6.4500 -3.1060 0.1200
v 4.9500 -3.1060 0.1200
v 4.9500 -3.9060 0.0000
v 6.4500 -3.9060 0.0000
v 6.4500 -3.6060 0.0000
v 4.9500 -3.6060 0.0000
v 4.9500 -3.9060 0.1200
v 6.4500 -3.9060 0.1200
v 6.4500 -3.6060 0.1200
v 4.9500 -3.6060 0.1200
v 3.6000 -6.4320 0.0000
v 3.9000 -6.4320 0.0000
v 3.9000 -4.9320 0.0000
v 3.6000 -4.9320 0.0000
v 3.6000 -6.4320 0.1200
v 3.9000 -6.4320 0.1200
v 3.9000 -4.9320 0.1200
v 3.6000 -4.9320 0.1200
v 3.1000 -6.4320 0.0000
v 3.4000 -6.4320 0.0000
v 3.4000 -4.9320 0.0000
v 3.1000 -4.9320 0.0000
v 3.1000 -6.4320 0.1200
v 3.4000 -6.4320 0.1200
v 3.4000 -4.9320 0.1200
v 3.1000 -4.9320 0.1200
v 2.6000 -6.4320 0.0000
v 2.9000 -6.4320 0.0000
v 2.9000 -4.9320 0.0000
v 2.6000 -4.9320 0.0000
v 2.6000 -6.4320 0.1200
v 2.9000 -6.4320 0.1200
v 2.9000 -4.9320 0.1200
v 2.6000 -4.9320 0.1200
v 2.1000 -6.4320 0.0000
v 2.4000 -6.4320 0.0000
v 2.4000 -4.9320 0.0000
v 2.1000 -4.9320 0.0000
v 2.1000 -6.4320 0.1200
v 2.4000 -6.4320 0.1200
v 2.4000 -4.9320 0.1200
v 2.1000 -4.9320 0.1200
v 1.6000 -6.4320 0.0000
v 1.9000 -6.4320 0.0000
v 1.9000 -4.9320 0.0000
v 1.6000 -4.9320 0.0000
v 1.6000 -6.4320 0.1200
v 1.9000 -6.4320 0.1200
v 1.9000 -4.9320 0.1200
v 1.6000 -4.9320 0.1200
v 1.1000 -6.4320 0.0000
v 1.4000 -6.4320 0.0000
v 1.4000 -4.9320 0.0000
v 1.1000 -4.9320 0.0000
v 1.1000 -6.4320 0.1200
v 1.4000 -6.4320 0.1200
v 1.4000 -4.9320 0.1200
v 1.1000 -4.9320 0.1200
v 0.6000 -6.4320 0.0000
v 0.9000 -6.4320 0.0000
v 0.9000 -4.9320 0.0000
v 0.6000 -4.9320 0.0000
v 0.6000 -6.4320 0.1200
v 0.9000 -6.4320 0.1200
v 0.9000 -4.9320 0.1200
v 0.6000 -4.9320 0.1200
v 0.1000 -6.4320 0.0000
v 0.4000 -6.4320 0.0000
v 0.4000 -4.9320 0.0000
v 0.1000 -4.9320 0.0000
v 0.1000 -6.4320 0.1200
v 0.4000 -6.4320 0.1200
v 0.4000 -4.9320 0.1200
v 0.1000 -4.9320 0.1200
v -0.4000 -6.4320 0.0000
v -0.1000 -6.4320 0.0000
v -0.1000 -4.9320 0.0000
v -0.4000 -4.9320 0.0000
v -0.4000 -6.4320 0.1200
v -0.1000 -6.4320 0.1200
v -0.1000 -4.9320 0.1200
v -0.4000 -4.9320 0.1200
v -0.9000 -6.4320 0.0000
v -0.6000 -6.4320 0.0000
v -0.6000 -4.9320 0.0000
v -0.9000 -4.9320 0.0000
v -0.9000 -6.4320 0.1200
v -0.6000 -6.4320 0.1200
v -0.6000 -4.9320 0.1200
v -0.9000 -4.9320 0.1200
v -1.4000 -6.4320 0.0000
v -1.1000 -6.4320 0.0000
v -1.1000 -4.9320 0.0000
v -1.4000 -4.9320 0.0000
v -1.4000 -6.4320 0.1200
v -1.1000 -6.4320 0.1200
v -1.1000 -4.9320 0.1200
v -1.4000 -4.9320 0.1200
v -1.9000 -6.4320 0.0000
v -1.6000 -6.4320 0.0000
v -1.6000 -4.9320 0.0000
v -1.9000 -4.9320 0.0000
v -1.9000 -6.4320 0.1200
v -1.6000 -6.4320 0.1200
v -1.6000 -4.9320 0.1200
v -1.9000 -4.9320 0.1200
v -2.4000 -6.4320 0.0000
v -2.1000 -6.4320 0.0000
v -2.1000 -4.9320 0.0000
v -2.4000 -4.9320 0.0000
v -2.4000 -6.4320 0.1200
v -2.1000 -6.4320 0.1200
v -2.1000 -4.9320 0.1200
v -2.4000 -4.9320 0.1200
v -2.9000 -6.4320 0.0000
v -2.6000 -6.4320 0.0000
v -2.6000 -4.9320 0.0000
v -2.9000 -4.9320 0.0000
v -2.9000 -6.4320 0.1200
v -2.6000 -6.4320 0.1200
v -2.6000 -4.9320 0.1200
v -2.9000 -4.9320 0.1200
v -3.4000 -6.4320 0.0000
v -3.1000 -6.4320 0.0000
v -3.1000 -4.9320 0.0000
v -3.4000 -4.9320 0.0000
v -3.4000 -6.4320 0.1200
v -3.1000 -6.4320 0.1200
v -3.1000 -4.9320 0.1200
v -3.4000 -4.9320 0.1200
v -3.9000 -6.4320 0.0000
v -3.6000 -6.4320 0.0000
v -3.6000 -4.9320 0.0000
v -3.9000 -4.9320 0.0000
v -3.9000 -6.4320 0.1200
v -3.6000 -6.4320 0.1200
v -3.6000 -4.9320 0.1200
v -3.9000 -4.9320 0.1200
v -6.4500 -3.9060 0.0000
v -4.9500 -3.9060 0.0000
v -4.9500 -3.6060 0.0000
v -6.4500 -3.6060 0.0000
v -6.4500 -3.9060 0.1200
v -4.9500 -3.9060 0.1200
v -4.9500 -3.6060 0.1200
v -6.4500 -3.6060 0.1200
v -6.4500 -3.4060 0.0000
v -4.9500 -3.4060 0.0000
v -4.9500 -3.1060 0.0000
v -6.4500 -3.1060 0.0000
v -6.4500 -3.4060 0.1200
v -4.9500 -3.4060 0.1200
v -4.9500 -3.1060 0.1200
v -6.4500 -3.1060 0.1200
v -6.4500 -2.9060 0.0000
v -4.9500 -2.9060 0.0000
v -4.9500 -2.6060 0.0000
v -6.4500 -2.6060 0.0000
v -6.4500 -2.9060 0.1200
v -4.9500 -2.9060 0.1200
v -4.9500 -2.6060 0.1200
v -6.4500 -2.6060 0.1200
v -6.4500 -2.4060 0.0000
v -4.9500 -2.4060 0.0000
v -4.9500 -2.1060 0.0000
v -6.4500 -2.1060 0.0000
v -6.4500 -2.4060 0.1200
v -4.9500 -2.4060 0.1200
v -4.9500 -2.1060 0.1200
v -6.4500 -2.1060 0.1200
v -6.4500 -1.9060 0.0000
v -4.9500 -1.9060 0.0000
v -4.9500 -1.6060 0.0000
v -6.4500 -1.6060 0.0000
v -6.4500 -1.9060 0.1200
v -4.9500 -1.9060 0.1200
v -4.9500 -1.6060 0.1200
v -6.4500 -1.6060 0.1200
v -6.4500 -1.4060 0.0000
v -4.9500 -1.4060 0.0000
v -4.9500 -1.1060 0.0000
v -6.4500 -1.1060 0.0000
v -6.4500 -1.4060 0.1200
v -4.9500 -1.4060 0.1200
v -4.9500 -1.1060 0.1200
v -6.4500 -1.1060 0.1200
v -6.4500 -0.9060 0.0000
v -4.9500 -0.9060 0.0000
v -4.9500 -0.6060 0.0000
v -6.4500 -0.6060 0.0000
v -6.4500 -0.9060 0.1200
v -4.9500 -0.9060 0.1200
v -4.9500 -0.6060 0.1200
v -6.4500 -0.6060 0.1200
v -6.4500 -0.4060 0.0000
v -4.9500 -0.4060 0.0000
v -4.9500 -0.1060 0.0000
v -6.4500 -0.1060 0.0000
v -6.4500 -0.4060 0.1200
v -4.9500 -0.4060 0.1200
v -4.9500 -0.1060 0.1200
v -6.4500 -0.1060 0.1200
v -6.4500 0.0940 0.0000
v -4.9500 0.0940 0.0000
v -4.9500 0.3940 0.0000
v -6.4500 0.3940 0.0000
v -6.4500 0.0940 0.1200
v -4.9500 0.0940 0.1200
v -4.9500 0.3940 0.1200
v -6.4500 0.3940 0.1200
v -6.4500 0.5940 0.0000
v -4.9500 0.5940 0.0000
v -4.9500 0.8940 0.0000
v -6.4500 0.8940 0.0000
v -6.4500 0.5940 0.1200
v -4.9500 0.5940 0.1200
v -4.9500 0.8940 0.1200
v -6.4500 0.8940 0.1200
v -6.4500 1.0940 0.0000
v -4.9500 1.0940 0.0000
v -4.9500 1.3940 0.0000
v -6.4500 1.3940 0.0000
v -6.4500 1.0940 0.1200
v -4.9500 1.0940 0.1200
v -4.9500 1.3940 0.1200
v -6.4500 1.3940 0.1200
v -6.4500 1.5940 0.0000
v -4.9500 1.5940 0.0000
v -4.9500 1.8940 0.0000
v -6.4500 1.8940 0.0000
v -6.4500 1.5940 0.1200
v -4.9500 1.5940 0.1200
v -4.9500 1.8940 0.1200
v -6.4500 1.8940 0.1200
v -6.4500 2.0940 0.0000
v -4.9500 2.0940 0.0000
v -4.9500 2.3940 0.0000
v -6.4500 2.3940 0.0000
v -6.4500 2.0940 0.1200
v -4.9500 2.0940 0.1200
v -4.9500 2.3940 0.1200
v -6.4500 2.3940 0.1200
v -6.4500 2.5940 0.0000
v -4.9500 2.5940 0.0000
v -4.9500 2.8940 0.0000
v -6.4500 2.8940 0.0000
v -6.4500 2.5940 0.1200
v -4.9500 2.5940 0.1200
v -4.9500 2.8940 0.1200
v -6.4500 2.8940 0.1200
v -6.4500 3.0940 0.0000
v -4.9500 3.0940 0.0000
v -4.9500 3.3940 0.0000
v -6.4500 3.3940 0.0000
v -6.4500 3.0940 0.1200
v -4.9500 3.0940 0.1200
v -4.9500 3.3940 0.1200
v -6.4500 3.3940 0.1200
v -6.4500 3.5940 0.0000
v -4.9500 3.5940 0.0000
v -4.9500 3.8940 0.0000
v -6.4500 3.8940 0.0000
v -6.4500 3.5940 0.1200
v -4.9500 3.5940 0.1200
v -4.9500 3.8940 0.1200
v -6.4500 3.8940 0.1200
v -6.0000 -6.0000 0.1000
v 6.0000 -6.0000 0.1000
v 6.0000 6.0000 0.1000
v -6.0000 6.0000 0.1000
v -6.0000 -6.0000 1.3000
v 6.0000 -6.0000 1.3000
v 6.0000 6.0000 1.3000
v -6.0000 6.0000 1.3000
f 1 4 3 2
f 5 6 7 8
f 1 2 6 5
f 2 3 7 6
f 3 4 8 7
f 4 1 5 8
f 9 12 11 10
f 13 14 15 16
f 9 10 14 13
f 10 11 15 14
f 11 12 16 15
f 12 9 13 16
f 17 20 19 18
f 21 22 23 24
f 17 18 22 21
f 18 19 23 22
f 19 20 24 23
f 20 17 21 24
f 25 28 27 26
f 29 30 31 32
f 25 26 30 29
f 26 27 31 30
f 27 28 32 31
f 28 25 29 32
f 33 36 35 34
f 37 38 39 40
f 33 34 38 37
f 34 35 39 38
f 35 36 40 39
f 36 33 37 40
f 41 44 43 42
f 45 46 47 48
f 41 42 46 45
f 42 43 47 46
f 43 44 48 47
f 44 41 45 48
f 49 52 51 50
f 53 54 55 56
f 49 50 54 53
f 50 51 55 54
f 51 52 56 55
f 52 49 53 56
f 57 60 59 58
f 61 62 63 64
f 57 58 62 61
f 58 59 63 62
f 59 60 64 63
f 60 57 61 64
f 65 68 67 66
f 69 70 71 72
f 65 66 70 69
f 66 67 71 70
f 67 68 72 71
f 68 65 69 72
f 73 76 75 74
f 77 78 79 80
f 73 74 78 77
f 74 75 79 78
f 75 76 80 79
f 76 73 77 80
f 81 84 83 82
f 85 86 87 88
f 81 82 86 85
f 82 83 87 86
f 83 84 88 87
f 84 81 85 88
f 89 92 91 90
f 93 94 95 96
f 89 90 94 93
f 90 91 95 94
f 91 92 96 95
f 92 89 93 96
f 97 100 99 98
f 101 102 103 104
f 97 98 102 101
f 98 99 103 102
f 99 100 104 103
f 100 97 101 104
f 105 108 107 106
f 109 110 111 112
f 105 106 110 109
f 106 107 111 110
f 107 108 112 111
f 108 105 109 112
f 113 116 115 114
f 117 118 119 120
f 113 114 118 117
f 114 115 119 118
f 115 116 120 119
f 116 113 117 120
f 121 124 123 122
f 125 126 127 128
f 121 122 126 125
f 122 123 127 126
f 123 124 128 127
f 124 121 125 128
f 129 132 131 130
f 133 134 135 136
f 129 130 134 133
f 130 131 135 134
f 131 132 136 135
f 132 129 133 136
f 137 140 139 138
f 141 142 143 144
f 137 138 142 141
f 138 139 143 142
f 139 140 144 143
f 140 137 141 144
f 145 148 147 146
f 149 150 151 152
f 145 146 150 149
f 146 147 151 150
f 147 148 152 151
f 148 145 149 152
f 153 156 155 154
f 157 158 159 160
f 153 154 158 157
f 154 155 159 158
f 155 156 160 159
f 156 153 157 160
f 161 164 163 162
f 165 166 167 168
f 161 162 166 165
f 162 163 167 166
f 163 164 168 167
f 164 161 165 168
f 169 172 171 170
f 173 174 175 176
f 169 170 174 173
f 170 171 175 174
f 171 172 176 175
f 172 169 173 176
f 177 180 179 178
f 181 182 183 184
f 177 178 182 181
f 178 179 183 182
f 179 180 184 183
f 180 177 181 184
f 185 188 187 186
f 189 190 191 192
f 185 186 190 189
f 186 187 191 190
f 187 188 192 191
f 188 185 189 192
f 193 196 195 194
f 197 198 199 200
f 193 194 198 197
f 194 195 199 198
f 195 196 200 199
f 196 193 197 200
f 201 204 203 202
f 205 206 207 208
f 201 202 206 205
f 202 203 207 206
f 203 204 208 207
f 204 201 205 208
f 209 212 211 210
f 213 214 215 216
f 209 210 214 213
f 210 211 215 214
f 211 212 216 215
f 212 209 213 216
f 217 220 219 218
f 221 222 223 224
f 217 218 222 221
f 218 219 223 222
f 219 220 224 223
f 220 217 221 224
f 225 228 227 226
f 229 230 231 232
f 225 226 230 229
f 226 227 231 230
f 227 228 232 231
f 228 225 229 232
f 233 236 235 234
f 237 238 239 240
f 233 234 238 237
f 234 235 239 238
f 235 236 240 239
f 236 233 237 240
f 241 244 243 242
f 245 246 247 248
f 241 242 246 245
f 242 243 247 246
f 243 244 248 247
f 244 241 245 248
f 249 252 251 250
f 253 254 255 256
f 249 250 254 253
f 250 251 255 254
f 251 252 256 255
f 252 249 253 256
f 257 260 259 258
f 261 262 263 264
f 257 258 262 261
f 258 259 263 262
f 259 260 264 263
f 260 257 261 264
f 265 268 267 266
f 269 270 271 272
f 265 266 270 269
f 266 267 271 270
f 267 268 272 271
f 268 265 269 272
f 273 276 275 274
f 277 278 279 280
f 273 274 278 277
f 274 275 279 278
f 275 276 280 279
f 276 273 277 280
f 281 284 283 282
f 285 286 287 288
f 281 282 286 285
f 282 283 287 286
f 283 284 288 287
f 284 281 285 288
f 289 292 291 290
f 293 294 295 296
f 289 290 294 293
f 290 291 295 294
f 291 292 296 295
f 292 289 293 296
f 297 300 299 298
f 301 302 303 304
f 297 298 302 301
f 298 299 303 302
f 299 300 304 303
f 300 297 301 304
f 305 308 307 306
f 309 310 311 312
f 305 306 310 309
f 306 307 311 310
f 307 308 312 311
f 308 305 309 312
f 313 316 315 314
f 317 318 319 320
f 313 314 318 317
f 314 315 319 318
f 315 316 320 319
f 316 313 317 320
f 321 324 323 322
f 325 326 327 328
f 321 322 326 325
f 322 323 327 326
f 323 324 328 327
f 324 321 325 328
f 329 332 331 330
f 333 334 335 336
f 329 330 334 333
f 330 331 335 334
f 331 332 336 335
f 332 329 333 336
f 337 340 339 338
f 341 342 343 344
f 337 338 342 341
f 338 339 343 342
f 339 340 344 343
f 340 337 341 344
f 345 348 347 346
f 349 350 351 352
f 345 346 350 349
f 346 347 351 350
f 347 348 352 351
f 348 345 349 352
f 353 356 355 354
f 357 358 359 360
f 353 354 358 357
f 354 355 359 358
f 355 356 360 359
f 356 353 357 360
f 361 364 363 362
f 365 366 367 368
f 361 362 366 365
f 362 363 367 366
f 363 364 368 367
f 364 361 365 368
f 369 372 371 370
f 373 374 375 376
f 369 370 374 373
f 370 371 375 374
f 371 372 376 375
f 372 369 373 376
f 377 380 379 378
f 381 382 383 384
f 377 378 382 381
f 378 379 383 382
f 379 380 384 383
f 380 377 381 384
f 385 388 387 386
f 389 390 391 392
f 385 386 390 389
f 386 387 391 390
f 387 388 392 391
f 388 385 389 392
f 393 396 395 394
f 397 398 399 400
f 393 394 398 397
f 394 395 399 398
f 395 396 400 399
f 396 393 397 400
f 401 404 403 402
f 405 406 407 408
f 401 402 406 405
f 402 403 407 406
f 403 404 408 407
f 404 401 405 408
f 409 412 411 410
f 413 414 415 416
f 409 410 414 413
f 410 411 415 414
f 411 412 416 415
f 412 409 413 416
f 417 420 419 418
f 421 422 423 424
f 417 418 422 421
f 418 419 423 422
f 419 420 424 423
f 420 417 421 424
f 425 428 427 426
f 429 430 431 432
f 425 426 430 429
f 426 427 431 430
f 427 428 432 431
f 428 425 429 432
f 433 436 435 434
f 437 438 439 440
f 433 434 438 437
f 434 435 439 438
f 435 436 440 439
f 436 433 437 440
f 441 444 443 442
f 445 446 447 448
f 441 442 446 445
f 442 443 447 446
f 443 444 448 447
f 444 441 445 448
f 449 452 451 450
f 453 454 455 456
f 449 450 454 453
f 450 451 455 454
f 451 452 456 455
f 452 449 453 456
f 457 460 459 458
f 461 462 463 464
f 457 458 462 461
f 458 459 463 462
f 459 460 464 463
f 460 457 461 464
f 465 468 467 466
f 469 470 471 472
f 465 466 470 469
f 466 467 471 470
f 467 468 472 471
f 468 465 469 472
f 473 476 475 474
f 477 478 479 480
f 473 474 478 477
f 474 475 479 478
f 475 476 480 479
f 476 473 477 480
f 481 484 483 482
f 485 486 487 488
f 481 482 486 485
f 482 483 487 486
f 483 484 488 487
f 484 481 485 488
f 489 492 491 490
f 493 494 495 496
f 489 490 494 493
f 490 491 495 494
f 491 492 496 495
f 492 489 493 496
f 497 500 499 498
f 501 502 503 504
f 497 498 502 501
f 498 499 503 502
f 499 500 504 503
f 500 497 501 504
f 505 508 507 506
f 509 510 511 512
f 505 506 510 509
f 506 507 511 510
f 507 508 512 511
f 508 505 509 512
f 513 516 515 514
f 517 518 519 520
f 513 514 518 517
f 514 515 519 518
f 515 516 520 519
f 516 513 517 520

127
models/ne555_timer.obj Normal file
View file

@ -0,0 +1,127 @@
# generated body mesh (SOIC-8_L4.9-W3.9-P1.27-LS6.0-BL) 4.90x6.00x1.70mm, 8 pads
v 1.6110 -3.5925 0.0000
v 2.1990 -3.5925 0.0000
v 2.1990 -1.5475 0.0000
v 1.6110 -1.5475 0.0000
v 1.6110 -3.5925 0.1200
v 2.1990 -3.5925 0.1200
v 2.1990 -1.5475 0.1200
v 1.6110 -1.5475 0.1200
v 0.3410 -3.5925 0.0000
v 0.9290 -3.5925 0.0000
v 0.9290 -1.5475 0.0000
v 0.3410 -1.5475 0.0000
v 0.3410 -3.5925 0.1200
v 0.9290 -3.5925 0.1200
v 0.9290 -1.5475 0.1200
v 0.3410 -1.5475 0.1200
v -0.9290 -3.5925 0.0000
v -0.3410 -3.5925 0.0000
v -0.3410 -1.5475 0.0000
v -0.9290 -1.5475 0.0000
v -0.9290 -3.5925 0.1200
v -0.3410 -3.5925 0.1200
v -0.3410 -1.5475 0.1200
v -0.9290 -1.5475 0.1200
v -2.1990 -3.5925 0.0000
v -1.6110 -3.5925 0.0000
v -1.6110 -1.5475 0.0000
v -2.1990 -1.5475 0.0000
v -2.1990 -3.5925 0.1200
v -1.6110 -3.5925 0.1200
v -1.6110 -1.5475 0.1200
v -2.1990 -1.5475 0.1200
v 1.6110 1.5475 0.0000
v 2.1990 1.5475 0.0000
v 2.1990 3.5925 0.0000
v 1.6110 3.5925 0.0000
v 1.6110 1.5475 0.1200
v 2.1990 1.5475 0.1200
v 2.1990 3.5925 0.1200
v 1.6110 3.5925 0.1200
v 0.3410 1.5475 0.0000
v 0.9290 1.5475 0.0000
v 0.9290 3.5925 0.0000
v 0.3410 3.5925 0.0000
v 0.3410 1.5475 0.1200
v 0.9290 1.5475 0.1200
v 0.9290 3.5925 0.1200
v 0.3410 3.5925 0.1200
v -0.9290 1.5475 0.0000
v -0.3410 1.5475 0.0000
v -0.3410 3.5925 0.0000
v -0.9290 3.5925 0.0000
v -0.9290 1.5475 0.1200
v -0.3410 1.5475 0.1200
v -0.3410 3.5925 0.1200
v -0.9290 3.5925 0.1200
v -2.1990 1.5475 0.0000
v -1.6110 1.5475 0.0000
v -1.6110 3.5925 0.0000
v -2.1990 3.5925 0.0000
v -2.1990 1.5475 0.1200
v -1.6110 1.5475 0.1200
v -1.6110 3.5925 0.1200
v -2.1990 3.5925 0.1200
v -2.4500 -3.0000 0.1000
v 2.4500 -3.0000 0.1000
v 2.4500 3.0000 0.1000
v -2.4500 3.0000 0.1000
v -2.4500 -3.0000 1.8000
v 2.4500 -3.0000 1.8000
v 2.4500 3.0000 1.8000
v -2.4500 3.0000 1.8000
f 1 4 3 2
f 5 6 7 8
f 1 2 6 5
f 2 3 7 6
f 3 4 8 7
f 4 1 5 8
f 9 12 11 10
f 13 14 15 16
f 9 10 14 13
f 10 11 15 14
f 11 12 16 15
f 12 9 13 16
f 17 20 19 18
f 21 22 23 24
f 17 18 22 21
f 18 19 23 22
f 19 20 24 23
f 20 17 21 24
f 25 28 27 26
f 29 30 31 32
f 25 26 30 29
f 26 27 31 30
f 27 28 32 31
f 28 25 29 32
f 33 36 35 34
f 37 38 39 40
f 33 34 38 37
f 34 35 39 38
f 35 36 40 39
f 36 33 37 40
f 41 44 43 42
f 45 46 47 48
f 41 42 46 45
f 42 43 47 46
f 43 44 48 47
f 44 41 45 48
f 49 52 51 50
f 53 54 55 56
f 49 50 54 53
f 50 51 55 54
f 51 52 56 55
f 52 49 53 56
f 57 60 59 58
f 61 62 63 64
f 57 58 62 61
f 58 59 63 62
f 59 60 64 63
f 60 57 61 64
f 65 68 67 66
f 69 70 71 72
f 65 66 70 69
f 66 67 71 70
f 67 68 72 71
f 68 65 69 72

113
models/nmos_power_60v.obj Normal file
View file

@ -0,0 +1,113 @@
# generated body mesh (D2PAK-7_L10.6-W9.6-P1.27-LS15.9-BR) 15.24x10.10x1.20mm, 7 pads
v 0.6271 3.4290 0.0000
v 2.5131 3.4290 0.0000
v 2.5131 4.1910 0.0000
v 0.6271 4.1910 0.0000
v 0.6271 3.4290 0.1200
v 2.5131 3.4290 0.1200
v 2.5131 4.1910 0.1200
v 0.6271 4.1910 0.1200
v 0.6271 2.1590 0.0000
v 2.5131 2.1590 0.0000
v 2.5131 2.9210 0.0000
v 0.6271 2.9210 0.0000
v 0.6271 2.1590 0.1200
v 2.5131 2.1590 0.1200
v 2.5131 2.9210 0.1200
v 0.6271 2.9210 0.1200
v 0.6271 0.8890 0.0000
v 2.5131 0.8890 0.0000
v 2.5131 1.6510 0.0000
v 0.6271 1.6510 0.0000
v 0.6271 0.8890 0.1200
v 2.5131 0.8890 0.1200
v 2.5131 1.6510 0.1200
v 0.6271 1.6510 0.1200
v 0.6271 -1.6510 0.0000
v 2.5131 -1.6510 0.0000
v 2.5131 -0.8890 0.0000
v 0.6271 -0.8890 0.0000
v 0.6271 -1.6510 0.1200
v 2.5131 -1.6510 0.1200
v 2.5131 -0.8890 0.1200
v 0.6271 -0.8890 0.1200
v 0.6271 -2.9210 0.0000
v 2.5131 -2.9210 0.0000
v 2.5131 -2.1590 0.0000
v 0.6271 -2.1590 0.0000
v 0.6271 -2.9210 0.1200
v 2.5131 -2.9210 0.1200
v 2.5131 -2.1590 0.1200
v 0.6271 -2.1590 0.1200
v 0.6271 -4.1910 0.0000
v 2.5131 -4.1910 0.0000
v 2.5131 -3.4290 0.0000
v 0.6271 -3.4290 0.0000
v 0.6271 -4.1910 0.1200
v 2.5131 -4.1910 0.1200
v 2.5131 -3.4290 0.1200
v 0.6271 -3.4290 0.1200
v -13.0989 -5.3300 0.0000
v -5.7429 -5.3300 0.0000
v -5.7429 5.3300 0.0000
v -13.0989 5.3300 0.0000
v -13.0989 -5.3300 0.1200
v -5.7429 -5.3300 0.1200
v -5.7429 5.3300 0.1200
v -13.0989 5.3300 0.1200
v -7.6200 -5.0500 0.1000
v 7.6200 -5.0500 0.1000
v 7.6200 5.0500 0.1000
v -7.6200 5.0500 0.1000
v -7.6200 -5.0500 1.3000
v 7.6200 -5.0500 1.3000
v 7.6200 5.0500 1.3000
v -7.6200 5.0500 1.3000
f 1 4 3 2
f 5 6 7 8
f 1 2 6 5
f 2 3 7 6
f 3 4 8 7
f 4 1 5 8
f 9 12 11 10
f 13 14 15 16
f 9 10 14 13
f 10 11 15 14
f 11 12 16 15
f 12 9 13 16
f 17 20 19 18
f 21 22 23 24
f 17 18 22 21
f 18 19 23 22
f 19 20 24 23
f 20 17 21 24
f 25 28 27 26
f 29 30 31 32
f 25 26 30 29
f 26 27 31 30
f 27 28 32 31
f 28 25 29 32
f 33 36 35 34
f 37 38 39 40
f 33 34 38 37
f 34 35 39 38
f 35 36 40 39
f 36 33 37 40
f 41 44 43 42
f 45 46 47 48
f 41 42 46 45
f 42 43 47 46
f 43 44 48 47
f 44 41 45 48
f 49 52 51 50
f 53 54 55 56
f 49 50 54 53
f 50 51 55 54
f 51 52 56 55
f 52 49 53 56
f 57 60 59 58
f 61 62 63 64
f 57 58 62 61
f 58 59 63 62
f 59 60 64 63
f 60 57 61 64

19582
models/opamp_opa356.obj Normal file

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,43 @@
# standard R0603 chip mesh 1.6x0.8x0.55mm (shared)
v -0.8000 -0.4000 0.0000
v -0.4000 -0.4000 0.0000
v -0.4000 0.4000 0.0000
v -0.8000 0.4000 0.0000
v -0.8000 -0.4000 0.1500
v -0.4000 -0.4000 0.1500
v -0.4000 0.4000 0.1500
v -0.8000 0.4000 0.1500
v 0.4000 -0.4000 0.0000
v 0.8000 -0.4000 0.0000
v 0.8000 0.4000 0.0000
v 0.4000 0.4000 0.0000
v 0.4000 -0.4000 0.1500
v 0.8000 -0.4000 0.1500
v 0.8000 0.4000 0.1500
v 0.4000 0.4000 0.1500
v -0.5500 -0.4000 0.0500
v 0.5500 -0.4000 0.0500
v 0.5500 0.4000 0.0500
v -0.5500 0.4000 0.0500
v -0.5500 -0.4000 0.5500
v 0.5500 -0.4000 0.5500
v 0.5500 0.4000 0.5500
v -0.5500 0.4000 0.5500
f 1 4 3 2
f 5 6 7 8
f 1 2 6 5
f 2 3 7 6
f 3 4 8 7
f 4 1 5 8
f 9 12 11 10
f 13 14 15 16
f 9 10 14 13
f 10 11 15 14
f 11 12 16 15
f 12 9 13 16
f 17 20 19 18
f 21 22 23 24
f 17 18 22 21
f 18 19 23 22
f 19 20 24 23
f 20 17 21 24

8314
models/schottky_ss34.obj Normal file

File diff suppressed because it is too large Load diff

1157
models/tvs_smbj.obj Normal file

File diff suppressed because it is too large Load diff

5846
models/xtal_8mhz.obj Normal file

File diff suppressed because it is too large Load diff

13
part.html Normal file
View file

@ -0,0 +1,13 @@
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Part — PromptPCB Parts</title>
<link rel="stylesheet" href="/assets/style.css">
<header class="top"><div class="wrap">
<a class="brand" href="/"><span class="dot"></span> PromptPCB <small>· Parts</small></a>
<nav class="main"><a href="/">Catalog</a><a href="/submit.html">Submit a part</a><a href="/mcp.html">MCP / API</a></nav>
<span class="spacer"></span>
<span class="credits">◆ <b id="cred-n">5</b> credits</span>
</div></header>
<div class="wrap" id="root"><div class="empty">Loading…</div></div>
<script type="importmap">{"imports":{"three":"https://unpkg.com/three@0.160.0/build/three.module.js","three/addons/":"https://unpkg.com/three@0.160.0/examples/jsm/"}}</script>
<script type="module" src="/assets/part.js"></script>

57
submit.html Normal file
View file

@ -0,0 +1,57 @@
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Contribute a part — PromptPCB Parts</title>
<link rel="stylesheet" href="/assets/style.css">
<header class="top"><div class="wrap">
<a class="brand" href="/"><span class="dot"></span> PromptPCB <small>· Parts</small></a>
<nav class="main"><a href="/">Catalog</a><a href="/submit.html" class="active">Submit a part</a><a href="/mcp.html">MCP / API</a></nav>
<span class="spacer"></span>
<span class="credits">◆ <b id="cred-n">5</b> credits</span>
</div></header>
<div class="wrap"><div class="form">
<h1 class="dh1">Contribute a curated part</h1>
<div class="banner">Add one <b>novel, verified</b> part — 3D model, datasheet, labelled pins &amp; pads, specs, a SPICE model, and what it's used for — and earn <b>5 download credits</b>. Hit <b>Auto-fill with AI</b> to draft the specs, use-cases and SPICE from the datasheet, then <b>review every field</b> before submitting. Honor system: only submit data you've checked.</div>
<div class="row2">
<div class="field"><label>Manufacturer part number (MPN) *</label><input id="mpn" placeholder="e.g. BSS138"></div>
<div class="field"><label>Class *</label><select id="class">
<option value="">Select…</option>
<option>resistor</option><option>capacitor</option><option>inductor</option><option>diode</option>
<option>mosfet</option><option>bjt</option><option>led</option><option>mcu</option><option>ic</option>
<option>gate_driver</option><option>op_amp</option><option>voltage_regulator_linear</option>
<option>voltage_regulator_switching</option><option>crystal</option><option>connector</option>
<option>timer</option><option>sensor</option><option>other</option></select></div>
</div>
<div class="row2">
<div class="field"><label>Manufacturer</label><input id="manufacturer" placeholder="e.g. onsemi"></div>
<div class="field"><label>Package</label><input id="package" placeholder="e.g. SOT-23"></div>
</div>
<div class="field"><label>Datasheet URL *</label><input id="datasheet_url" placeholder="https://…/datasheet.pdf"></div>
<div class="field">
<label>Datasheet text / notes (paste key specs — powers Auto-fill)</label>
<textarea id="description" placeholder="Paste the electrical characteristics table or a description; the AI drafts specs, use-cases and a SPICE model from this."></textarea>
<button class="btn ghost" id="autofill" style="margin-top:10px">✦ Auto-fill with AI</button>
<span id="af-status" style="margin-left:10px;color:var(--dim);font-size:13px"></span>
</div>
<div class="field"><label>Summary *</label><textarea id="summary" style="min-height:60px;font-family:var(--sans)"></textarea></div>
<div class="field"><label>When to use *</label><textarea id="when_to_use" style="min-height:60px;font-family:var(--sans)"></textarea></div>
<div class="field"><label>Use cases * — one per line ("This part can be used to …")</label><textarea id="use_cases" style="min-height:130px"></textarea></div>
<div class="field"><label>Specifications * — one per line as <code>name: value unit</code></label><textarea id="params" style="min-height:110px" placeholder="Vds max: 50 V&#10;Rds(on): 3.5 ohm&#10;Id: 0.22 A"></textarea></div>
<div class="field"><label>SPICE model *</label><textarea id="spice" style="min-height:110px" placeholder=".SUBCKT / .MODEL …"></textarea></div>
<div class="row2">
<div class="field"><label>3D model file (.obj / .glb / .step) *</label>
<label class="drop" for="model3d"><span id="drop-label">Click to attach a 3D model</span></label>
<input id="model3d" type="file" accept=".obj,.glb,.gltf,.step,.stp,.wrl" style="display:none"></div>
<div class="field"><label>Your email *</label><input id="email" type="email" placeholder="you@example.com"></div>
</div>
<div style="display:flex;align-items:center;gap:14px;margin-top:8px">
<button class="btn" id="submit">Submit part &amp; earn 5 credits</button>
<span id="sub-status" style="color:var(--dim);font-size:14px"></span>
</div>
</div></div>
<script src="/assets/submit.js"></script>