by adom
0402 Thick Film Resistor · 47 kΩ ±1% · 1/16 W
← Commit history
Publish CR0402-FX-4702GLF characterization with datasheet-verified specs
9 files changed
+4341
CR0402-FX-4702GLF-fpview.htmladded+790@@ -0,0 +1,790 @@+<!DOCTYPE html>+<html lang="en">+<head>+<meta charset="UTF-8">+<meta name="viewport" content="width=device-width, initial-scale=1.0">+<title>CR0402-FX-4702GLF</title>+<style>+ * { margin: 0; padding: 0; box-sizing: border-box; }+ body {+ background: #0d1117;+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;+ overflow: hidden;+ height: 100vh;+ display: flex;+ flex-direction: column;+ color: #e6edf3;+ }++ .toolbar {+ display: flex;+ align-items: center;+ gap: 6px;+ padding: 8px 14px;+ background: #161b22;+ border-bottom: 1px solid #21262d;+ flex-shrink: 0;+ font-size: 13px;+ }+ .toolbar .title {+ font-weight: 600;+ color: #00b8b0;+ font-size: 15px;+ letter-spacing: 0.02em;+ overflow: hidden;+ text-overflow: ellipsis;+ white-space: nowrap;+ min-width: 0;+ }+ .toolbar .badge {+ font-size: 10px;+ padding: 2px 6px;+ border-radius: 4px;+ background: rgba(0, 184, 176, 0.12);+ color: #00b8b0;+ border: 1px solid rgba(0, 184, 176, 0.25);+ margin-left: 6px;+ }+ .toolbar .spacer { flex: 1; }+ .toolbar .sep {+ width: 1px;+ height: 22px;+ background: #21262d;+ margin: 0 4px;+ flex-shrink: 0;+ }+ .toolbar .btn-group {+ display: flex;+ align-items: center;+ gap: 2px;+ flex-shrink: 0;+ }+ .toolbar button {+ background: rgba(0, 184, 176, 0.12);+ border: 1px solid rgba(0, 184, 176, 0.25);+ border-radius: 4px;+ padding: 4px 10px;+ cursor: pointer;+ font-size: 12px;+ color: #8b949e;+ transition: all 0.15s;+ }+ .toolbar button:hover { background: rgba(0,184,176,0.18); color: #e6edf3; border-color: rgba(0,184,176,0.4); }+ .toolbar button:active { background: rgba(0,184,176,0.28); }+ .toolbar button.active { background: rgba(0,184,176,0.2); color: #00b8b0; border-color: rgba(0,184,176,0.4); }+ .toolbar .zoom-level {+ font-size: 11px;+ color: #8b949e;+ min-width: 44px;+ text-align: center;+ font-variant-numeric: tabular-nums;+ }++ .canvas-wrap {+ flex: 1;+ overflow: hidden;+ position: relative;+ cursor: grab;+ background-color: #0d1117;+ background-image:+ linear-gradient(rgba(255, 255, 255, 0.03) 1px, transparent 1px),+ linear-gradient(90deg, rgba(255, 255, 255, 0.03) 1px, transparent 1px);+ background-size: 20px 20px;+ }+ .canvas-wrap.dragging { cursor: grabbing; }+ .canvas-wrap.no-grid { background-image: none; }++ .canvas {+ position: absolute;+ transform-origin: 0 0;+ }+ .canvas svg { display: block; }++ .tooltip {+ display: none;+ position: fixed;+ background: #21262d;+ backdrop-filter: blur(12px);+ color: #e6edf3;+ padding: 10px 14px;+ border-radius: 8px;+ border: 1px solid rgba(0, 184, 176, 0.25);+ font-size: 12px;+ line-height: 1.6;+ pointer-events: none;+ z-index: 100;+ max-width: 280px;+ box-shadow: 0 8px 24px rgba(0,0,0,0.4);+ }+ .tooltip.visible { display: block; }+ .tooltip .tt-pad { font-weight: 700; font-size: 15px; color: #00e6dc; }+ .tooltip .tt-signal { color: #f0c040; font-size: 13px; margin-left: 6px; font-weight: 600; }+ .tooltip .tt-dims {+ display: inline-block;+ margin-top: 4px;+ padding: 2px 8px;+ border-radius: 4px;+ font-size: 11px;+ font-weight: 500;+ background: rgba(200,52,52,0.15);+ color: #C83434;+ border: 1px solid rgba(200,52,52,0.3);+ }+ .tooltip .tt-desc {+ margin-top: 6px;+ padding-top: 6px;+ border-top: 1px solid #21262d;+ color: #8b949e;+ font-size: 11px;+ line-height: 1.5;+ }+ .tooltip.sticky {+ pointer-events: auto;+ user-select: text;+ border-color: #00e6dc;+ }+ .tooltip .tt-hint {+ margin-top: 6px;+ font-size: 9px;+ color: #484f58;+ text-align: center;+ }+ .tooltip .tt-source {+ margin-top: 6px;+ padding-top: 4px;+ border-top: 1px solid #21262d;+ font-size: 9px;+ }+ .tooltip .tt-source-label { color: #8C6BF7; }+ .tooltip .tt-source a { color: #58a6ff; text-decoration: none; }+ .tooltip .tt-source a:hover { text-decoration: underline; }++ .edit-btn {+ position: absolute; top: 10px; right: 10px; z-index: 100;+ display: flex; align-items: center; gap: 6px;+ padding: 5px 10px;+ background: rgba(22,27,34,0.75);+ backdrop-filter: blur(8px);+ border: 1px solid rgba(140,107,247,0.2);+ border-radius: 6px;+ color: #8b949e; font-size: 11px;+ cursor: pointer; text-decoration: none;+ transition: all 0.2s; opacity: 0.7;+ }+ .edit-btn:hover {+ opacity: 1;+ background: rgba(140,107,247,0.12);+ border-color: rgba(140,107,247,0.4);+ color: #C5B3FF;+ }+ .edit-btn svg { width: 12px; height: 12px; }++ /* Regen prompt modal */+ .regen-overlay {+ display: none;+ position: fixed; inset: 0;+ background: rgba(0,0,0,0.6);+ z-index: 2000;+ align-items: center; justify-content: center;+ }+ .regen-overlay.visible { display: flex; }+ .regen-modal {+ background: #161b22;+ border: 1px solid #21262d;+ border-radius: 10px;+ padding: 20px 24px;+ max-width: 520px;+ width: 90%;+ box-shadow: 0 12px 40px rgba(0,0,0,0.5);+ }+ .regen-modal h3 {+ margin: 0 0 12px;+ font-size: 14px;+ font-weight: 600;+ color: #00b8b0;+ }+ .regen-modal .prompt-text {+ background: undefined;+ border: 1px solid #21262d;+ border-radius: 6px;+ padding: 12px 14px;+ font-size: 13px;+ line-height: 1.5;+ color: undefined;+ white-space: pre-wrap;+ word-break: break-word;+ user-select: all;+ }+ .regen-modal .modal-footer {+ display: flex;+ align-items: center;+ justify-content: space-between;+ margin-top: 14px;+ }+ .regen-modal .copy-status {+ font-size: 11px;+ color: #484f58;+ }+ .regen-modal .copy-status.copied { color: #00b8b0; }+ .regen-modal .modal-btns { display: flex; gap: 8px; }+ .regen-modal .modal-btns button {+ padding: 6px 14px;+ border-radius: 6px;+ border: 1px solid #21262d;+ background: #161b22;+ color: #8b949e;+ font-size: 12px;+ cursor: pointer;+ }+ .regen-modal .modal-btns button:hover { background: rgba(255,255,255,0.06); }+ .regen-modal .modal-btns .copy-btn {+ background: rgba(0,184,176,0.12);+ border-color: rgba(0,184,176,0.3);+ color: #00b8b0;+ }+ .regen-modal .modal-btns .copy-btn:hover { background: rgba(0,184,176,0.22); }++ /* Pad highlight */+ .pad-highlight {+ stroke: #00b8b0 !important;+ stroke-width: 0.15 !important;+ fill-opacity: 0.6 !important;+ }++ .bottom-panel {+ background: #161b22;+ border-top: 1px solid #21262d;+ flex-shrink: 0;+ }+ .info-row {+ display: flex;+ align-items: baseline;+ flex-wrap: wrap;+ gap: 1px 0;+ padding: 5px 8px;+ font-size: 10px;+ }+ .info-item {+ display: inline-flex;+ align-items: baseline;+ gap: 5px;+ padding: 1px 0;+ margin-right: 8px;+ }+ .info-item::after {+ content: '';+ display: inline-block;+ width: 1px;+ height: 10px;+ background: #21262d;+ margin-left: 8px;+ vertical-align: middle;+ }+ .info-item:last-child::after { display: none; }+ .info-item:last-child { margin-right: 0; }+ .info-label {+ color: #484f58;+ text-transform: uppercase;+ letter-spacing: 0.04em;+ font-size: 9px;+ }+ .info-value { color: #8b949e; }+ .info-value a { color: #00b8b0; text-decoration: none; }+ .info-value a:hover { text-decoration: underline; }+ .info-divider {+ height: 1px;+ background: #21262d;+ margin: 0 8px;+ }+ .coord-row {+ display: flex;+ align-items: center;+ justify-content: space-between;+ padding: 4px 8px;+ font-size: 10px;+ color: #8b949e;+ font-variant-numeric: tabular-nums;+ }+</style>+</head>+<body>++<div class="toolbar">+ <span class="title">CR0402-FX-4702GLF</span>+ <span class="badge">Footprint</span>+ <span class="badge" style="background:rgba(248,81,73,0.15);color:#f85149;border-color:rgba(248,81,73,0.3);">Local Render</span>+ <div class="spacer"></div>+ <div class="btn-group">+ <button onclick="zoomOut()">−</button>+ <span class="zoom-level" id="zoom-level">100%</span>+ <button onclick="zoomIn()">+</button>+ </div>+ <div class="sep"></div>+ <button onclick="zoomFit()">Fit</button>+ <button onclick="zoomReset()">1:1</button>+ <button onclick="toggleGrid()" id="grid-btn" class="active">Grid</button>+ <button onclick="toggleSolder()" id="solder-btn" class="active" title="250µm solder jet blobs for Adom InstaPCB paste jetting. Adom uses this placement data for its jetting sequence. Blob count, position, and size (250–600µm) are adjustable. Placement accuracy: ±50µm.">Solder</button>+ <button onclick="toggleLabels()" id="labels-btn">Labels</button>+ <div class="sep"></div>+ <button onclick="showRegenPrompt()" id="regen-btn" title="Show regeneration prompt to paste into Claude Code">Regen</button>+</div>++<div class="regen-overlay" id="regen-overlay" onclick="if(event.target===this)closeRegenPrompt()">+ <div class="regen-modal">+ <h3>Regeneration Prompt</h3>+ <div class="prompt-text" id="regen-prompt-text"></div>+ <div class="modal-footer">+ <span class="copy-status" id="regen-copy-status">Copied to clipboard</span>+ <div class="modal-btns">+ <button onclick="closeRegenPrompt()">Close</button>+ <button class="copy-btn" onclick="copyRegenText()">Copy</button>+ </div>+ </div>+ </div>+</div>++<div class="canvas-wrap" id="canvas-wrap">+ <div class="canvas" id="canvas">+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 10 10"><text x="5" y="5" text-anchor="middle" font-size="1" fill="#888">No geometry</text></svg>+ </div>+ <a class="edit-btn" href="https://coder.john-service-wiki-a054078430ce38e4.containers.adom.inc/proxy/8785/wiki/components/cr0402-fx-4702glf/edit?field=content" target="_blank" title="Suggest corrections on Adom Wiki">+ <svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">+ <path d="M11.5 1.5l3 3L5 14H2v-3L11.5 1.5z"/>+ <path d="M9.5 3.5l3 3"/>+ </svg>+ Suggest edit+ </a>+</div>++<div class="tooltip" id="tooltip"></div>++<div class="bottom-panel">+ <div class="info-row">+ <div class="info-item"><span class="info-label">Pads</span><span class="info-value">0</span></div>+ </div>+ <div class="info-divider"></div>+ <div class="coord-row">+ <span id="cursor-pos">X: 0.00 Y: 0.00 mm</span>+ </div>+</div>++<script>+ const pads = [];+ const svgW = 10;+ const svgH = 10;+ const svgVbX = 0;+ const svgVbY = 0;+ const offsetX = 0;+ const offsetY = 0;+ const datasheetUrl = "";+ const _partName = "";+ const _fpName = "CR0402-FX-4702GLF";+ const _kicadModPath = "/home/adom/project/project-content/schematics/footprints/CR0402-FX-4702GLF/CR0402-FX-4702GLF.kicad_mod";++ const wrap = document.getElementById('canvas-wrap');+ const canvas = document.getElementById('canvas');+ const tooltip = document.getElementById('tooltip');+ const zoomLabel = document.getElementById('zoom-level');+ const cursorPos = document.getElementById('cursor-pos');++ let scale = 1, panX = 0, panY = 0;+ let isDragging = false;+ let dragStartX, dragStartY, panStartX, panStartY;+ let gridVisible = true;++ const MM_TO_PX = 3.78;+ const svgPxW = svgW * MM_TO_PX;+ const svgPxH = svgH * MM_TO_PX;++ const svgEl = canvas.querySelector('svg');+ if (svgEl) {+ svgEl.setAttribute('width', svgPxW + 'px');+ svgEl.setAttribute('height', svgPxH + 'px');+ }++ function updateTransform() {+ canvas.style.transform = 'translate(' + panX + 'px,' + panY + 'px) scale(' + scale + ')';+ zoomLabel.textContent = Math.round(scale * 100) + '%';+ }++ function zoomFit() {+ const ww = wrap.clientWidth, wh = wrap.clientHeight;+ if (ww === 0 || wh === 0) return; // iframe not laid out yet — ResizeObserver will retry+ const margin = 24;+ // Use getBBox() to fit to visible content only (excludes hidden labels)+ let fitW = svgPxW, fitH = svgPxH, fitX = 0, fitY = 0;+ if (svgEl) {+ try {+ const bb = svgEl.getBBox();+ if (bb.width > 0 && bb.height > 0) {+ fitW = bb.width * MM_TO_PX;+ fitH = bb.height * MM_TO_PX;+ fitX = (bb.x - svgVbX) * MM_TO_PX;+ fitY = (bb.y - svgVbY) * MM_TO_PX;+ }+ } catch {}+ }+ scale = Math.min((ww - margin * 2) / fitW, (wh - margin * 2) / fitH, 100);+ panX = (ww - fitW * scale) / 2 - fitX * scale;+ panY = (wh - fitH * scale) / 2 - fitY * scale;+ updateTransform();+ }++ function zoomReset() {+ scale = 1;+ panX = (wrap.clientWidth - svgPxW) / 2;+ panY = (wrap.clientHeight - svgPxH) / 2;+ updateTransform();+ }++ function zoomIn() { zoomAt(wrap.clientWidth / 2, wrap.clientHeight / 2, 1.25); }+ function zoomOut() { zoomAt(wrap.clientWidth / 2, wrap.clientHeight / 2, 0.8); }++ function zoomAt(cx, cy, factor) {+ const ns = Math.max(0.1, Math.min(scale * factor, 40));+ const r = ns / scale;+ panX = cx - (cx - panX) * r;+ panY = cy - (cy - panY) * r;+ scale = ns;+ updateTransform();+ }++ function toggleGrid() {+ gridVisible = !gridVisible;+ wrap.classList.toggle('no-grid', !gridVisible);+ document.getElementById('grid-btn').classList.toggle('active', gridVisible);+ }++ // ── Solder blob jetting layer ──+ let solderVisible = true;+ let solderGroup = null;++ function setupSolderBlobs() {+ if (!svgEl) return;++ solderGroup = document.createElementNS('http://www.w3.org/2000/svg', 'g');+ solderGroup.setAttribute('id', 'solder-layer');+ solderGroup.style.display = '';+ solderGroup.style.pointerEvents = 'none';++ const BLOB_RADIUS = 0.125; // 250µm diameter / 2+ const BLOB_SPACING = 0.25; // center-to-center (blobs touching — fills the pad)++ pads.forEach(pad => {+ if (pad.mountType !== 'smd') return;++ const cx = pad.x + offsetX;+ const cy = pad.y + offsetY;+ const rot = (pad.rotation || 0) * Math.PI / 180;++ // Each axis computed independently: if pad is wide enough, grid; otherwise single centered blob+ const inset = BLOB_RADIUS; // blob edges align with pad edges — no overhang+ const availW = pad.width - 2 * inset;+ const availH = pad.height - 2 * inset;++ // At minimum 1 blob per axis — even narrow pads get a centered row/column+ const nCols = availW > 0 ? Math.max(1, Math.floor(availW / BLOB_SPACING) + 1) : 1;+ const nRows = availH > 0 ? Math.max(1, Math.floor(availH / BLOB_SPACING) + 1) : 1;+ const spanW = availW > 0 ? availW : 0;+ const spanH = availH > 0 ? availH : 0;+ const stepX = nCols > 1 ? spanW / (nCols - 1) : 0;+ const stepY = nRows > 1 ? spanH / (nRows - 1) : 0;+ const startX = -spanW / 2;+ const startY = -spanH / 2;+ const cosR = Math.cos(rot);+ const sinR = Math.sin(rot);++ for (let row = 0; row < nRows; row++) {+ for (let col = 0; col < nCols; col++) {+ const lx = startX + col * stepX;+ const ly = startY + row * stepY;+ const rx = lx * cosR - ly * sinR;+ const ry = lx * sinR + ly * cosR;++ const circle = document.createElementNS('http://www.w3.org/2000/svg', 'circle');+ circle.setAttribute('cx', (cx + rx).toFixed(4));+ circle.setAttribute('cy', (cy + ry).toFixed(4));+ circle.setAttribute('r', BLOB_RADIUS.toFixed(4));+ circle.setAttribute('fill', '#D4AA70');+ circle.setAttribute('fill-opacity', '0.75');+ circle.setAttribute('stroke', '#B8860B');+ circle.setAttribute('stroke-width', '0.015');+ solderGroup.appendChild(circle);+ }+ }+ });++ svgEl.appendChild(solderGroup);+ }++ function toggleSolder() {+ solderVisible = !solderVisible;+ if (solderGroup) solderGroup.style.display = solderVisible ? '' : 'none';+ document.getElementById('solder-btn').classList.toggle('active', solderVisible);+ }++ // ── Label visibility toggle ──+ let labelsVisible = false;+ let labelGroups = [];++ function setupLabelToggle() {+ if (!svgEl) return;+ // KiCad SVGs render labels as <g> containing <text> + <g class="stroked-text">+ // Find all <text> elements and collect their parent <g> groups+ svgEl.querySelectorAll('text').forEach(txt => {+ const parent = txt.parentElement;+ if (parent && parent.tagName === 'g' && !labelGroups.includes(parent)) {+ labelGroups.push(parent);+ parent.style.display = 'none'; // hidden by default+ }+ });+ }++ function toggleLabels() {+ labelsVisible = !labelsVisible;+ labelGroups.forEach(g => g.style.display = labelsVisible ? '' : 'none');+ document.getElementById('labels-btn').classList.toggle('active', labelsVisible);+ }++ // ── Regen prompt modal ──+ let _regenPrompt = '';+ function buildRegenPrompt() {+ const name = _partName || _fpName;+ const folder = _kicadModPath.replace(/\/[^/]+$/, '');+ return 'Regenerate the FpView for ' + name + '.\n\n'+ + 'Footprint: ' + _kicadModPath + '\n'+ + 'Metadata: ' + folder + '/\n\n'+ + 'Re-export the SVG via the KiCad service, regenerate the FpView HTML at the same path, '+ + 'and re-display it.';+ }+ function showRegenPrompt() {+ _regenPrompt = buildRegenPrompt();+ document.getElementById('regen-prompt-text').textContent = _regenPrompt;+ document.getElementById('regen-overlay').classList.add('visible');+ const status = document.getElementById('regen-copy-status');+ navigator.clipboard.writeText(_regenPrompt).then(() => {+ status.textContent = 'Copied to clipboard';+ status.classList.add('copied');+ }).catch(() => {+ status.textContent = 'Click Copy to copy';+ status.classList.remove('copied');+ });+ }+ function closeRegenPrompt() {+ document.getElementById('regen-overlay').classList.remove('visible');+ }+ function copyRegenText() {+ navigator.clipboard.writeText(_regenPrompt).then(() => {+ const status = document.getElementById('regen-copy-status');+ status.textContent = 'Copied to clipboard';+ status.classList.add('copied');+ });+ }++ wrap.addEventListener('wheel', (e) => {+ e.preventDefault();+ const r = wrap.getBoundingClientRect();+ zoomAt(e.clientX - r.left, e.clientY - r.top, e.deltaY < 0 ? 1.12 : 0.89);+ }, { passive: false });++ wrap.addEventListener('mousedown', (e) => {+ if (e.button !== 0) return;+ isDragging = true;+ dragStartX = e.clientX; dragStartY = e.clientY;+ panStartX = panX; panStartY = panY;+ wrap.classList.add('dragging');+ });+ window.addEventListener('mousemove', (e) => {+ const r = wrap.getBoundingClientRect();+ // Convert screen coords to kicad_mod coords+ const svgX = (e.clientX - r.left - panX) / scale / MM_TO_PX;+ const svgY = (e.clientY - r.top - panY) / scale / MM_TO_PX;+ const kicadX = svgX - offsetX;+ const kicadY = svgY - offsetY;+ cursorPos.innerHTML = 'X: ' + kicadX.toFixed(2) + ' Y: ' + kicadY.toFixed(2) + ' mm';+ if (!isDragging) return;+ panX = panStartX + (e.clientX - dragStartX);+ panY = panStartY + (e.clientY - dragStartY);+ updateTransform();+ });+ window.addEventListener('mouseup', () => { isDragging = false; wrap.classList.remove('dragging'); });++ // ── Pad hit zones ──+ let highlightedRects = [];+ let stickyPad = null;++ function setupPadHitZones() {+ if (!svgEl) return;+ pads.forEach(pad => {+ const cx = pad.x + offsetX;+ const cy = pad.y + offsetY;+ const rx = cx - pad.width / 2;+ const ry = cy - pad.height / 2;++ const rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');+ rect.setAttribute('x', rx);+ rect.setAttribute('y', ry);+ rect.setAttribute('width', pad.width);+ rect.setAttribute('height', pad.height);+ rect.setAttribute('fill', 'transparent');+ rect.setAttribute('stroke', 'none');+ rect.setAttribute('data-pad', pad.number);+ rect.style.cursor = 'pointer';+ rect.style.pointerEvents = 'all';+ svgEl.appendChild(rect);++ rect.addEventListener('mouseenter', (ev) => showPadTooltip(ev.clientX, ev.clientY, pad, rect));+ rect.addEventListener('mousemove', (ev) => showPadTooltip(ev.clientX, ev.clientY, pad, rect));+ rect.addEventListener('mouseleave', () => hidePadTooltip(rect));+ rect.addEventListener('click', (ev) => { ev.stopPropagation(); handlePadClick(pad, rect); });+ });+ }++ function buildTooltipHtml(pad) {+ let html = '<div><span class="tt-pad">Pad ' + pad.number + '</span>';+ if (pad.signal) html += '<span class="tt-signal">' + pad.signal + '</span>';+ html += '</div>';+ html += '<div><span class="tt-dims">' + pad.width.toFixed(3) + ' × ' + pad.height.toFixed(3) + ' mm · ' + pad.shape + ' · ' + pad.mountType + '</span></div>';+ if (pad.desc) {+ html += '<div class="tt-desc">' + pad.desc + '</div>';+ }+ if (datasheetUrl) {+ html += '<div class="tt-source"><span class="tt-source-label">Source:</span> <a href="' + datasheetUrl + '" target="_blank">Datasheet</a></div>';+ }+ html += '<div class="tt-hint">click to pin · select text</div>';+ return html;+ }++ function positionTooltip(x, y) {+ // Render first to measure+ tooltip.style.left = '0px';+ tooltip.style.top = '0px';+ const ttRect = tooltip.getBoundingClientRect();+ const ttW = ttRect.width, ttH = ttRect.height;+ const pad = 14;+ let tx = x + 14, ty = y + 14;+ if (tx + ttW > window.innerWidth - pad) tx = x - ttW - 14;+ if (ty + ttH > window.innerHeight - pad) ty = y - ttH - 14;+ tx = Math.max(pad, Math.min(tx, window.innerWidth - ttW - pad));+ ty = Math.max(pad, Math.min(ty, window.innerHeight - ttH - pad));+ tooltip.style.left = tx + 'px';+ tooltip.style.top = ty + 'px';+ }++ function showPadTooltip(x, y, pad, rect) {+ if (stickyPad !== null) return; // suppress hover while sticky++ clearHighlight();+ rect.setAttribute('stroke', '#00b8b1');+ rect.setAttribute('stroke-width', '0.12');+ rect.setAttribute('fill', 'rgba(0,184,177,0.2)');+ highlightedRects.push(rect);++ tooltip.innerHTML = buildTooltipHtml(pad);+ tooltip.classList.add('visible');+ tooltip.classList.remove('sticky');+ positionTooltip(x, y);+ }++ function hidePadTooltip(rect) {+ if (stickyPad !== null) return; // don't hide while sticky+ tooltip.classList.remove('visible');+ clearHighlight();+ }++ function handlePadClick(pad, rect) {+ if (stickyPad === pad.number) {+ // Unpin+ stickyPad = null;+ tooltip.classList.remove('sticky', 'visible');+ clearHighlight();+ } else {+ // Pin this pad+ stickyPad = pad.number;+ clearHighlight();+ rect.setAttribute('stroke', '#00b8b1');+ rect.setAttribute('stroke-width', '0.12');+ rect.setAttribute('fill', 'rgba(0,184,177,0.2)');+ highlightedRects.push(rect);+ tooltip.innerHTML = buildTooltipHtml(pad);+ tooltip.classList.add('visible', 'sticky');+ // Remove hint when sticky+ const hint = tooltip.querySelector('.tt-hint');+ if (hint) hint.style.display = 'none';+ }+ }++ // Dismiss sticky tooltip on click outside+ document.addEventListener('click', (e) => {+ if (stickyPad !== null && !tooltip.contains(e.target)) {+ stickyPad = null;+ tooltip.classList.remove('sticky', 'visible');+ clearHighlight();+ }+ });++ function clearHighlight() {+ highlightedRects.forEach(r => {+ r.setAttribute('fill', 'transparent');+ r.setAttribute('stroke', 'none');+ });+ highlightedRects = [];+ }++ wrap.addEventListener('mouseleave', () => {+ if (stickyPad !== null) return;+ tooltip.classList.remove('visible');+ clearHighlight();+ });++ // Keyboard+ window.addEventListener('keydown', (e) => {+ if (e.key === 'Escape') closeRegenPrompt();+ else if (e.key === 'f' || e.key === 'F') zoomFit();+ else if (e.key === '1') zoomReset();+ else if (e.key === '+' || e.key === '=') zoomIn();+ else if (e.key === '-') zoomOut();+ else if (e.key === 'g' || e.key === 'G') toggleGrid();+ else if (e.key === 's' || e.key === 'S') toggleSolder();+ else if (e.key === 'l' || e.key === 'L') toggleLabels();+ });++ // Screenshot capture via postMessage (parent viewer sends mgmt_capture_request)+ window.addEventListener('message', (e) => {+ if (e.data?.type === 'mgmt_capture_request' && svgEl) {+ const xml = new XMLSerializer().serializeToString(svgEl);+ parent.postMessage({+ type: 'mgmt_canvas_capture',+ _reqId: e.data._reqId,+ svgXml: xml,+ svgWidth: svgW,+ svgHeight: svgH,+ bgColor: 'undefined',+ }, '*');+ }+ });++ // Auto-fit on window/container resize+ new ResizeObserver(() => zoomFit()).observe(wrap);+ window.addEventListener('resize', () => requestAnimationFrame(zoomFit));++ // Init — set up layers then fit. Use multiple retries because srcdoc iframes+ // may not have layout dimensions during the first requestAnimationFrame.+ let inited = false;+ function init() {+ if (inited) return;+ setupLabelToggle();+ setupSolderBlobs();+ setupPadHitZones();+ inited = true;+ }+ function initAndFit() {+ init();+ zoomFit();+ }+ requestAnimationFrame(initAndFit);+ setTimeout(initAndFit, 100);+ setTimeout(initAndFit, 500);+</script>+</body>+</html>
CR0402-FX-4702GLF-symview.htmladded+1205@@ -0,0 +1,1205 @@+<!DOCTYPE html>+<html lang="en">+<head>+<meta charset="UTF-8">+<meta name="viewport" content="width=device-width, initial-scale=1.0">+<title>CR0402-FX-4702GLF</title>+<style>+ * { margin: 0; padding: 0; box-sizing: border-box; }+ body {+ background: #0d1117;+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;+ overflow: hidden;+ height: 100vh;+ display: flex;+ flex-direction: column;+ color: #e6edf3;+ }++ /* ── Top toolbar ── */+ .toolbar {+ display: flex;+ align-items: center;+ gap: 6px;+ padding: 8px 14px;+ background: #161b22;+ border-bottom: 1px solid #21262d;+ flex-shrink: 0;+ font-size: 13px;+ }+ .toolbar .title {+ font-weight: 600;+ color: #00b8b0;+ font-size: 15px;+ letter-spacing: 0.02em;+ }+ .toolbar .spacer { flex: 1; }+ .toolbar .sep {+ width: 1px;+ height: 22px;+ background: #21262d;+ margin: 0 4px;+ flex-shrink: 0;+ }+ .toolbar .btn-group {+ display: flex;+ align-items: center;+ gap: 2px;+ flex-shrink: 0;+ }+ .toolbar button {+ background: rgba(0, 184, 176, 0.12);+ border: 1px solid rgba(0, 184, 176, 0.25);+ border-radius: 4px;+ padding: 4px 10px;+ cursor: pointer;+ font-size: 12px;+ color: #8b949e;+ transition: all 0.15s;+ }+ .toolbar button:hover { background: rgba(0,184,176,0.18); color: #e6edf3; border-color: rgba(0,184,176,0.4); }+ .toolbar button:active { background: rgba(0,184,176,0.28); }+ .toolbar button.active { background: rgba(0,184,176,0.2); color: #00b8b0; border-color: rgba(0,184,176,0.4); }+ .toolbar .zoom-level {+ font-size: 11px;+ color: #8b949e;+ min-width: 44px;+ text-align: center;+ font-variant-numeric: tabular-nums;+ }++ /* ── Canvas (dark background) ── */+ .canvas-wrap {+ flex: 1;+ overflow: hidden;+ position: relative;+ cursor: grab;+ background-color: #0d1117;+ background-image:+ radial-gradient(ellipse at 50% 50%, rgba(0,184,176,0.03) 0%, transparent 70%),+ linear-gradient(rgba(255,255,255,0.015) 1px, transparent 1px),+ linear-gradient(90deg, rgba(255,255,255,0.015) 1px, transparent 1px);+ background-size: 100% 100%, 20px 20px, 20px 20px;+ }+ .canvas-wrap.dragging { cursor: grabbing; }+ .canvas-wrap.no-grid {+ background-image: radial-gradient(ellipse at 50% 50%, rgba(0,184,176,0.03) 0%, transparent 70%);+ background-size: 100% 100%;+ }++ .canvas {+ position: absolute;+ transform-origin: 0 0;+ }+ .canvas svg { display: block; }++ /* ── Tooltip ── */+ .tooltip {+ display: none;+ position: fixed;+ background: #21262d;+ backdrop-filter: blur(16px);+ -webkit-backdrop-filter: blur(16px);+ color: #e6edf3;+ padding: 10px 14px;+ border-radius: 10px;+ border: 1px solid rgba(0, 184, 176, 0.25);+ font-size: 12px;+ line-height: 1.6;+ pointer-events: none;+ user-select: none;+ z-index: 100;+ max-width: 300px;+ box-shadow: 0 8px 24px rgba(0,0,0,0.4);+ transition: border-color 0.15s;+ }+ .tooltip.visible { display: block; }+ .tooltip.sticky {+ pointer-events: auto;+ user-select: text;+ border-color: #00e6dc;+ box-shadow: 0 8px 32px rgba(0,184,176,0.15), 0 8px 24px rgba(0,0,0,0.4);+ }+ .tooltip .tt-name { font-weight: 700; font-size: 15px; color: #00e6dc; }+ .tooltip .tt-pin { color: #8b949e; font-size: 11px; margin-left: 4px; }+ .tooltip .tt-type {+ display: inline-block;+ margin-top: 4px;+ padding: 2px 8px;+ border-radius: 4px;+ font-size: 11px;+ font-weight: 500;+ }+ .tooltip .tt-desc {+ margin-top: 6px;+ padding-top: 6px;+ border-top: 1px solid #21262d;+ color: #8b949e;+ font-size: 11px;+ line-height: 1.5;+ }+ .tooltip .tt-source {+ margin-top: 6px;+ padding-top: 6px;+ border-top: 1px solid #21262d;+ font-size: 10px;+ color: #484f58;+ }+ .tooltip .tt-source a { color: #00b8b0; text-decoration: none; }+ .tooltip .tt-source a:hover { text-decoration: underline; }+ .tooltip .tt-source-label { color: #E6B450; font-weight: 600; }+ .tooltip .tt-hint {+ margin-top: 6px;+ font-size: 9px;+ color: #484f58;+ font-style: italic;+ }+ .tooltip .tt-group-name { font-weight: 700; font-size: 14px; color: #E6B450; }+ .tooltip .tt-group-badge {+ display: inline-block;+ margin-top: 4px;+ padding: 2px 8px;+ border-radius: 4px;+ font-size: 11px;+ font-weight: 500;+ background: rgba(230,180,80,0.15);+ color: #FFD180;+ border: 1px solid rgba(230,180,80,0.3);+ }++ /* ── Wiki edit button ── */+ .edit-btn {+ position: absolute; top: 10px; right: 10px; z-index: 100;+ display: flex; align-items: center; gap: 6px;+ padding: 5px 10px;+ background: rgba(22,27,34,0.75);+ backdrop-filter: blur(8px);+ border: 1px solid rgba(230,180,80,0.2);+ border-radius: 6px;+ color: #8b949e; font-size: 11px;+ cursor: pointer; text-decoration: none;+ transition: all 0.2s; opacity: 0.7;+ }+ .edit-btn:hover {+ opacity: 1;+ background: rgba(230,180,80,0.12);+ border-color: rgba(230,180,80,0.4);+ color: #FFD180;+ }+ .edit-btn svg { width: 12px; height: 12px; }++ /* Regen prompt modal */+ .regen-overlay {+ display: none;+ position: fixed; inset: 0;+ background: rgba(0,0,0,0.6);+ z-index: 2000;+ align-items: center; justify-content: center;+ }+ .regen-overlay.visible { display: flex; }+ .regen-modal {+ background: undefined;+ border: 1px solid undefined;+ border-radius: 10px;+ padding: 20px 24px;+ max-width: 520px;+ width: 90%;+ box-shadow: 0 12px 40px rgba(0,0,0,0.5);+ }+ .regen-modal h3 {+ margin: 0 0 12px;+ font-size: 14px;+ font-weight: 600;+ color: undefined;+ }+ .regen-modal .prompt-text {+ background: undefined;+ border: 1px solid undefined;+ border-radius: 6px;+ padding: 12px 14px;+ font-size: 13px;+ line-height: 1.5;+ color: undefined;+ white-space: pre-wrap;+ word-break: break-word;+ user-select: all;+ }+ .regen-modal .modal-footer {+ display: flex;+ align-items: center;+ justify-content: space-between;+ margin-top: 14px;+ }+ .regen-modal .copy-status {+ font-size: 11px;+ color: undefined;+ }+ .regen-modal .copy-status.copied { color: undefined; }+ .regen-modal .modal-btns { display: flex; gap: 8px; }+ .regen-modal .modal-btns button {+ padding: 6px 14px;+ border-radius: 6px;+ border: 1px solid undefined;+ background: undefined;+ color: undefined;+ font-size: 12px;+ cursor: pointer;+ }+ .regen-modal .modal-btns button:hover { background: rgba(255,255,255,0.06); }+ .regen-modal .modal-btns .copy-btn {+ background: rgba(0,230,220,0.12);+ border-color: rgba(0,230,220,0.3);+ color: undefined;+ }+ .regen-modal .modal-btns .copy-btn:hover { background: rgba(0,230,220,0.22); }++ /* Pin highlight on hover */+ .canvas svg .pin-highlight path, .canvas svg path.pin-highlight { stroke: #00e6dc !important; }+ .canvas svg .group-highlight path { stroke: #FFD180 !important; }++ /* Discrete pin label highlight (injected <text> elements) */+ .canvas svg text.pin-label-highlight { fill: #00e6dc !important; }+ .canvas svg text.pin-num-highlight { fill: #00e6dc !important; }++ /* Discrete pin hit zone outline (visible on hover) */+ .canvas svg rect.pin-hit-zone { fill: rgba(0,230,220,0.06); stroke: #00e6dc; stroke-width: 0.12; stroke-dasharray: 0.3,0.2; stroke-opacity: 0.5; pointer-events: all; cursor: pointer; rx: 0.3; }+ .canvas svg rect.pin-hit-zone:hover { fill: rgba(0,230,220,0.12); stroke-opacity: 0.8; stroke-width: 0.15; }++ /* ── Bottom panel ── */+ .bottom-panel {+ background: #161b22;+ border-top: 1px solid #21262d;+ flex-shrink: 0;+ }+ .info-row {+ display: flex;+ align-items: baseline;+ flex-wrap: wrap;+ gap: 1px 0;+ padding: 5px 8px;+ font-size: 10px;+ }+ .info-item {+ display: inline-flex;+ align-items: baseline;+ gap: 5px;+ padding: 1px 0;+ margin-right: 8px;+ }+ .info-item::after {+ content: '';+ display: inline-block;+ width: 1px;+ height: 10px;+ background: #21262d;+ margin-left: 8px;+ vertical-align: middle;+ }+ .info-item:last-child::after { display: none; }+ .info-item:last-child { margin-right: 0; }+ .info-label {+ color: #484f58;+ text-transform: uppercase;+ letter-spacing: 0.04em;+ font-size: 9px;+ }+ .info-value { color: #8b949e; }+ .info-value a { color: #00b8b0; text-decoration: none; }+ .info-value a:hover { text-decoration: underline; }+ .info-divider { height: 1px; background: #21262d; margin: 0 8px; }+ .coord-row {+ display: flex;+ align-items: center;+ justify-content: space-between;+ padding: 4px 8px;+ font-size: 10px;+ color: #8b949e;+ font-variant-numeric: tabular-nums;+ }+</style>+</head>+<body>++<div class="toolbar">+ <span class="title">CR0402-FX-4702GLF</span>+ <div class="spacer"></div>+ <div class="btn-group">+ <button onclick="zoomOut()">−</button>+ <span class="zoom-level" id="zoom-level">100%</span>+ <button onclick="zoomIn()">+</button>+ </div>+ <div class="sep"></div>+ <button onclick="zoomFit()">Fit</button>+ <button onclick="zoomReset()">1:1</button>+ <button onclick="toggleGrid()" id="grid-btn" class="active">Grid</button>+ <button onclick="toggleBBox()" id="bbox-btn" class="active">BBox</button>+ <button onclick="toggleHits()" id="hits-btn">Hits</button>+ <div class="sep"></div>+ <button onclick="showRegenPrompt()" title="Show regeneration prompt to paste into Claude Code">Regen</button>+</div>++<div class="regen-overlay" id="regen-overlay" onclick="if(event.target===this)closeRegenPrompt()">+ <div class="regen-modal">+ <h3>Regeneration Prompt</h3>+ <div class="prompt-text" id="regen-prompt-text"></div>+ <div class="modal-footer">+ <span class="copy-status" id="regen-copy-status">Copied to clipboard</span>+ <div class="modal-btns">+ <button onclick="closeRegenPrompt()">Close</button>+ <button class="copy-btn" onclick="copyRegenText()">Copy</button>+ </div>+ </div>+ </div>+</div>++<div class="canvas-wrap" id="canvas-wrap">+ <a class="edit-btn" href="https://coder.john-service-wiki-a054078430ce38e4.containers.adom.inc/proxy/8785/wiki/components/cr0402-fx-4702glf/edit?field=content" target="_blank" title="Suggest corrections to this symbol on the Adom Wiki">+ <svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">+ <path d="M11.5 1.5l3 3L5 14H2v-3L11.5 1.5z"/>+ <path d="M9.5 3.5l3 3"/>+ </svg>+ Suggest edit+ </a>+ <div class="canvas" id="canvas">+ <svg+ xmlns:svg="http://www.w3.org/2000/svg"+ xmlns="http://www.w3.org/2000/svg"+ xmlns:xlink="http://www.w3.org/1999/xlink"+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"+ version="1.1"+ width="5.0292mm" height="10.0584mm" viewBox="-4.7567 -4.0808 12.6320 18.2200">++<defs>+ <linearGradient id="adom-body-grad" x1="0" y1="0" x2="0" y2="1">+ <stop offset="0%" stop-color="#1a2332"/>+ <stop offset="100%" stop-color="#141c27"/>+ </linearGradient>+</defs>++<style>+ /* Stroked text groups (KiCad renders text as paths in <g class="stroked-text">) */+ g.stroked-text path {+ stroke: #ffffff !important;+ fill: #ffffff !important;+ }++ /* Hidden text elements (used for hit detection) */+ text[opacity="0"] {+ fill: #ffffff !important;+ }++ /* Pin highlight state (toggled by JS) */+ .pin-highlight path {+ stroke: #00e6dc !important;+ }+ .pin-highlight g.stroked-text path {+ stroke: #00e6dc !important;+ }++ /* Group label highlight */+ .group-highlight g.stroked-text path {+ stroke: #FFD180 !important;+ }+</style>++ <desc>Image generated by Eeschema-SVG </desc>+<g style="fill:none; fill-opacity:1.0000;stroke:#000000; stroke-opacity:1.0000;+stroke-linecap:round; stroke-linejoin:round;"+ transform="translate(0 0) scale(1 1)">+</g>+<g style="fill:none; +stroke:#4a5568; stroke-width:0.2540; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;">+<rect x="0.543300" y="2.489200" width="2.032000" height="5.080000" rx="0.000000" />+</g>+<g style="fill:none; +stroke:#4a5568; stroke-width:0.1524; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;">+<path d="M1.5593 2.4892+L1.5593 1.2192+" />+<path d="M1.5593 7.5692+L1.5593 8.8392+" />+</g>+<g style="fill:none; +stroke:#484f58; stroke-width:0.1524; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;">+<g transform="rotate(-90.000000 3.5913 5.0292)">++</g>+<g transform="rotate(-90.000000 1.5593 5.0292)">++</g>+</g> +<text x="1.559" y="0.219" font-size="1.1" font-family="sans-serif" fill="#ffffff" text-anchor="middle" class="pin-num-label">1</text>+<text x="1.559" y="10.939" font-size="1.1" font-family="sans-serif" fill="#ffffff" text-anchor="middle" class="pin-num-label">2</text>+<rect x="-4.4567" y="-3.7807999999999997" width="12.032" height="17.619999999999997" fill="none" stroke="#00e6dc" stroke-width="0.1" stroke-dasharray="0.3,0.3" opacity="0.4" class="debug-bbox"/></svg>+ </div>+</div>++<div class="tooltip" id="tooltip"></div>++<div class="bottom-panel">+ <div class="info-row">+ <div class="info-item"><span class="info-label">Pins</span><span class="info-value">2</span></div><div class="info-item"><span class="info-label">Datasheet</span><span class="info-value"><a href="~" target="_blank">PDF</a></span></div><div class="info-item"><span class="info-label">Desc</span><span class="info-value">Resistor</span></div>+ </div>+ <div class="info-divider"></div>+ <div class="coord-row">+ <span id="cursor-pos">X: 0.00 Y: 0.00 mm</span>+ <span style="margin-left:auto;color:#00b8b0;font-weight:600;font-size:12px">SymView</span>+ </div>+</div>++<script>+ const pins = [{"name":"1","number":"1","type":"Passive","electricalType":"passive","color":"#78909c","desc":"","x":0,"y":3.81,"angle":270,"length":1.27},{"name":"2","number":"2","type":"Passive","electricalType":"passive","color":"#78909c","desc":"","x":0,"y":-3.81,"angle":90,"length":1.27}];+ const groups = [];+ const svgW = 12.632;+ const svgH = 18.22;+ const contentBounds = {"x":-4.4567,"y":-3.7807999999999997,"w":12.032,"h":17.619999999999997};+ const svgOffset = {"x":1.5593,"y":5.0292};+ const hidePinNames = true;+ const hidePinNumbers = true;+ const datasheetUrl = "~";+ const mfrName = "";+ const _symbolName = "CR0402-FX-4702GLF";+ const _symPath = "/home/adom/project/project-content/schematics/symbols/CR0402-FX-4702GLF/CR0402-FX-4702GLF.kicad_sym";++ const wrap = document.getElementById('canvas-wrap');+ const canvas = document.getElementById('canvas');+ const tooltip = document.getElementById('tooltip');+ const zoomLabel = document.getElementById('zoom-level');+ const cursorPos = document.getElementById('cursor-pos');++ let scale = 1, panX = 0, panY = 0;+ let isDragging = false;+ let dragStartX, dragStartY, panStartX, panStartY;+ let gridVisible = true;+ let stickyPin = null; // currently pinned tooltip++ const MM_TO_PX = 3.78;+ const svgPxW = svgW * MM_TO_PX;+ const svgPxH = svgH * MM_TO_PX;++ const svgEl = canvas.querySelector('svg');+ if (svgEl) {+ svgEl.setAttribute('width', svgPxW + 'px');+ svgEl.setAttribute('height', svgPxH + 'px');+ }++ function updateTransform() {+ canvas.style.transform = 'translate(' + panX + 'px,' + panY + 'px) scale(' + scale + ')';+ zoomLabel.textContent = Math.round(scale * 100) + '%';+ }++ function zoomFit() {+ const ww = wrap.clientWidth, wh = wrap.clientHeight;+ const pad = 40;+ // Read the bbox rect directly from the SVG DOM — it's already positioned correctly+ const bboxRect = svgEl ? svgEl.querySelector('.debug-bbox') : null;+ if (bboxRect) {+ const bb = bboxRect.getBBox();+ const vb = svgEl.viewBox.baseVal;+ // Convert SVG user-space coords to pixel coords within the SVG element+ const pxPerUnitX = svgPxW / vb.width;+ const pxPerUnitY = svgPxH / vb.height;+ const pxX = (bb.x - vb.x) * pxPerUnitX;+ const pxY = (bb.y - vb.y) * pxPerUnitY;+ const pxW = bb.width * pxPerUnitX;+ const pxH = bb.height * pxPerUnitY;+ scale = Math.min((ww - pad * 2) / pxW, (wh - pad * 2) / pxH, 10);+ if (!isFinite(scale) || scale <= 0) scale = 1;+ panX = (ww - pxW * scale) / 2 - pxX * scale;+ panY = (wh - pxH * scale) / 2 - pxY * scale;+ } else {+ scale = Math.min((ww - pad * 2) / svgPxW, (wh - pad * 2) / svgPxH, 10);+ if (!isFinite(scale) || scale <= 0) scale = 1;+ panX = (ww - svgPxW * scale) / 2;+ panY = (wh - svgPxH * scale) / 2;+ }+ updateTransform();+ }++ function zoomReset() {+ scale = 1;+ panX = (wrap.clientWidth - svgPxW) / 2;+ panY = (wrap.clientHeight - svgPxH) / 2;+ updateTransform();+ }++ function zoomIn() { zoomAt(wrap.clientWidth / 2, wrap.clientHeight / 2, 1.25); }+ function zoomOut() { zoomAt(wrap.clientWidth / 2, wrap.clientHeight / 2, 0.8); }++ function zoomAt(cx, cy, factor) {+ const ns = Math.max(0.1, Math.min(scale * factor, 20));+ const r = ns / scale;+ panX = cx - (cx - panX) * r;+ panY = cy - (cy - panY) * r;+ scale = ns;+ updateTransform();+ }++ function toggleGrid() {+ gridVisible = !gridVisible;+ wrap.classList.toggle('no-grid', !gridVisible);+ document.getElementById('grid-btn').classList.toggle('active', gridVisible);+ }++ let bboxVisible = true;+ function toggleBBox() {+ bboxVisible = !bboxVisible;+ const el = svgEl && svgEl.querySelector('.debug-bbox');+ if (el) el.setAttribute('opacity', bboxVisible ? '0.4' : '0');+ document.getElementById('bbox-btn').classList.toggle('active', bboxVisible);+ }++ let hitsVisible = false;+ function toggleHits() {+ hitsVisible = !hitsVisible;+ if (svgEl) {+ svgEl.querySelectorAll('.pin-hit-zone').forEach(r => {+ r.style.visibility = hitsVisible ? '' : 'hidden';+ });+ }+ document.getElementById('hits-btn').classList.toggle('active', hitsVisible);+ }++ // ── Regen prompt modal ──+ let _regenPrompt = '';+ function buildRegenPrompt() {+ const folder = _symPath.substring(0, _symPath.lastIndexOf('/'));+ return 'Regenerate the SymView for ' + _symbolName + '.\n\n'+ + 'Symbol: ' + _symPath + '\n'+ + 'Metadata: ' + folder + '/' + _symbolName + '-metadata.json\n\n'+ + 'Re-export the SVG via the KiCad service, regenerate the SymView HTML at the same path, '+ + 'and re-display it in the Adom app.';+ }+ function showRegenPrompt() {+ _regenPrompt = buildRegenPrompt();+ document.getElementById('regen-prompt-text').textContent = _regenPrompt;+ document.getElementById('regen-overlay').classList.add('visible');+ const status = document.getElementById('regen-copy-status');+ navigator.clipboard.writeText(_regenPrompt).then(() => {+ status.textContent = 'Copied to clipboard';+ status.classList.add('copied');+ }).catch(() => {+ status.textContent = 'Click Copy to copy';+ status.classList.remove('copied');+ });+ }+ function closeRegenPrompt() {+ document.getElementById('regen-overlay').classList.remove('visible');+ }+ function copyRegenText() {+ navigator.clipboard.writeText(_regenPrompt).then(() => {+ const status = document.getElementById('regen-copy-status');+ status.textContent = 'Copied to clipboard';+ status.classList.add('copied');+ });+ }++ // Mouse wheel zoom+ wrap.addEventListener('wheel', (e) => {+ e.preventDefault();+ const r = wrap.getBoundingClientRect();+ zoomAt(e.clientX - r.left, e.clientY - r.top, e.deltaY < 0 ? 1.12 : 0.89);+ }, { passive: false });++ // Pan+ wrap.addEventListener('mousedown', (e) => {+ if (e.button !== 0) return;+ isDragging = true;+ dragStartX = e.clientX; dragStartY = e.clientY;+ panStartX = panX; panStartY = panY;+ wrap.classList.add('dragging');+ });+ window.addEventListener('mousemove', (e) => {+ const r = wrap.getBoundingClientRect();+ const mx = (e.clientX - r.left - panX) / scale / MM_TO_PX;+ const my = (e.clientY - r.top - panY) / scale / MM_TO_PX;+ cursorPos.innerHTML = 'X: ' + mx.toFixed(2) + ' Y: ' + my.toFixed(2) + ' mm';+ if (!isDragging) return;+ panX = panStartX + (e.clientX - dragStartX);+ panY = panStartY + (e.clientY - dragStartY);+ updateTransform();+ });+ window.addEventListener('mouseup', () => { isDragging = false; wrap.classList.remove('dragging'); });++ // ── Pin highlighting ──+ const pinTextGroups = new Map();+ const pinWireGroups = new Map();+ if (svgEl) {+ // Build text group lookup+ svgEl.querySelectorAll('g.stroked-text').forEach(g => {+ const desc = g.querySelector('desc');+ if (desc) pinTextGroups.set(desc.textContent.trim(), g);+ });++ // Build wire group lookup using coordinate matching (not sibling navigation)+ if (svgOffset) {+ const ox = svgOffset.x, oy = svgOffset.y;+ // Collect all simple 2-point line paths in the SVG+ const allPaths = svgEl.querySelectorAll('path');+ const wirePaths = [];+ allPaths.forEach(p => {+ const d = p.getAttribute('d');+ if (!d) return;+ const m = d.match(/^M([\d.]+)\s+([\d.]+)\s+L([\d.]+)\s+([\d.]+)\s*$/);+ if (m) wirePaths.push({ el: p, x1: parseFloat(m[1]), y1: parseFloat(m[2]), x2: parseFloat(m[3]), y2: parseFloat(m[4]) });+ });++ for (const pin of pins) {+ const tipX = ox + pin.x;+ const tipY = oy - pin.y;+ const wireLen = pin.length || 2.54;+ const isHoriz = (pin.angle === 0 || pin.angle === 180);++ for (const w of wirePaths) {+ const dx = Math.abs(w.x2 - w.x1), dy = Math.abs(w.y2 - w.y1);+ const len = Math.sqrt(dx * dx + dy * dy);+ if (Math.abs(len - wireLen) > 0.05) continue;+ if (isHoriz && dy > 0.01) continue;+ if (!isHoriz && dx > 0.01) continue;+ // Check if one endpoint is near the pin tip+ const d1 = Math.hypot(w.x1 - tipX, w.y1 - tipY);+ const d2 = Math.hypot(w.x2 - tipX, w.y2 - tipY);+ if (Math.min(d1, d2) < 0.1) {+ // Found the wire path element directly+ pinWireGroups.set(pin.name, w.el);+ break;+ }+ }+ }+ }+ }++ function highlightPin(pin) {+ clearHighlight();+ // IC symbols: stroked-text groups+ [pin.name, pin.number].forEach(label => {+ const g = pinTextGroups.get(label);+ if (g) g.classList.add('pin-highlight');+ });+ const wireG = pinWireGroups.get(pin.name);+ if (wireG) wireG.classList.add('pin-highlight');+ // Discrete symbols: injected <text> labels+ if (svgEl && hidePinNames) {+ svgEl.querySelectorAll('text.pin-label').forEach(t => {+ if (t.textContent.trim() === pin.name) t.classList.add('pin-label-highlight');+ });+ svgEl.querySelectorAll('text.pin-num-label').forEach(t => {+ if (t.textContent.trim() === pin.number) t.classList.add('pin-num-highlight');+ });+ }+ }+ function clearHighlight() {+ if (svgEl) {+ svgEl.querySelectorAll('.pin-highlight').forEach(g => g.classList.remove('pin-highlight'));+ svgEl.querySelectorAll('.group-highlight').forEach(g => g.classList.remove('group-highlight'));+ svgEl.querySelectorAll('.pin-label-highlight').forEach(t => t.classList.remove('pin-label-highlight'));+ svgEl.querySelectorAll('.pin-num-highlight').forEach(t => t.classList.remove('pin-num-highlight'));+ }+ }++ // ── Tooltip positioning ──+ function positionTooltip(x, y) {+ const tw = tooltip.offsetWidth || 280;+ const th = tooltip.offsetHeight || 120;+ let tx = x + 14;+ let ty = y + 14;+ if (tx + tw > window.innerWidth - 14) tx = x - tw - 14;+ if (ty + th > window.innerHeight - 14) ty = y - th - 14;+ tx = Math.max(14, tx);+ ty = Math.max(14, ty);+ tooltip.style.left = tx + 'px';+ tooltip.style.top = ty + 'px';+ }++ // ── Source attribution HTML ──+ function sourceHtml() {+ if (!datasheetUrl || !mfrName) return '';+ return '<div class="tt-source"><span class="tt-source-label">Source:</span> <a href="' + datasheetUrl + '" target="_blank">' + mfrName + ' Datasheet</a></div>';+ }++ function hintHtml() {+ return '<div class="tt-hint">click to pin · select text</div>';+ }++ function showTooltip(x, y, pin) {+ if (stickyPin) return; // don't override sticky+ highlightPin(pin);+ let html = '<div><span class="tt-name">' + pin.name + '</span><span class="tt-pin">Pin ' + pin.number + '</span></div>' ++ '<div><span class="tt-type" style="background:' + pin.color + '22; color:' + pin.color + '; border:1px solid ' + pin.color + '44">' + pin.type + '</span></div>';+ if (pin.desc) html += '<div class="tt-desc">' + pin.desc + '</div>';+ html += sourceHtml();+ html += hintHtml();+ tooltip.innerHTML = html;+ tooltip.classList.add('visible');+ tooltip.classList.remove('sticky');+ positionTooltip(x, y);+ }++ function showGroupTooltip(x, y, group) {+ if (stickyPin) return;+ clearHighlight();+ const g = pinTextGroups.get(group.name);+ if (g) g.classList.add('group-highlight');+ let html = '<div><span class="tt-group-name">' + group.name + '</span></div>' ++ '<div><span class="tt-group-badge">Function Group</span></div>';+ if (group.desc) html += '<div class="tt-desc">' + group.desc + '</div>';+ tooltip.innerHTML = html;+ tooltip.classList.add('visible');+ tooltip.classList.remove('sticky');+ positionTooltip(x, y);+ }++ function hideTooltip() {+ if (stickyPin) return;+ tooltip.classList.remove('visible');+ clearHighlight();+ }++ // ── Sticky tooltip (click-to-pin) ──+ function toggleSticky(pin, x, y) {+ if (stickyPin === pin) {+ // Unpin+ stickyPin = null;+ tooltip.classList.remove('sticky');+ hideTooltip();+ } else {+ // Pin+ stickyPin = pin;+ highlightPin(pin);+ let html = '<div><span class="tt-name">' + pin.name + '</span><span class="tt-pin">Pin ' + pin.number + '</span></div>' ++ '<div><span class="tt-type" style="background:' + pin.color + '22; color:' + pin.color + '; border:1px solid ' + pin.color + '44">' + pin.type + '</span></div>';+ if (pin.desc) html += '<div class="tt-desc">' + pin.desc + '</div>';+ html += sourceHtml();+ tooltip.innerHTML = html;+ tooltip.classList.add('visible', 'sticky');+ positionTooltip(x, y);+ }+ }++ // Dismiss sticky on click outside+ document.addEventListener('click', (e) => {+ if (!stickyPin) return;+ if (tooltip.contains(e.target)) return; // click inside tooltip+ if (e.target.closest('[data-pin]') || e.target.closest('[data-pin-num]') || e.target.closest('[data-pin-wire]')) return;+ stickyPin = null;+ tooltip.classList.remove('sticky', 'visible');+ clearHighlight();+ });++ wrap.addEventListener('mouseleave', hideTooltip);++ // ── Pin hit zones ──+ function setupPinHitZones() {+ if (!svgEl) return;++ if (hidePinNames) {+ // Discrete components (hidden pin names): compute hit zones from injected labels+ // Covers MOSFETs, resistors, etc. — standard KiCad discrete symbols hide pin names+ // but may leave pin numbers visible, so we check hidePinNames only+ setupDiscreteHitZones();+ } else {+ // Standard IC: use hidden text elements for hit detection+ setupTextHitZones();+ }+ }++ function setupTextHitZones() {+ // IC symbols: two hit zones per pin, derived from actual rendered text bounds (getBBox):+ // 1. INSIDE body — covers pin name text (bbox from stroked-text group)+ // 2. OUTSIDE body — covers pin wire + number area (bbox or coordinate-based)+ if (!svgOffset) return;+ const ox = svgOffset.x, oy = svgOffset.y;+ const pitch = 2.54;+ const zoneH = pitch * 0.95;+ const wireExt = 1.5;+ const pad = 0.3; // padding around text bbox++ // Build lookup: text content → stroked-text group bbox+ const textBBoxMap = {};+ svgEl.querySelectorAll('g.stroked-text').forEach(g => {+ const desc = g.querySelector('desc');+ if (desc) {+ try {+ const bbox = g.getBBox();+ if (bbox.width > 0 && bbox.height > 0) {+ const key = desc.textContent.trim();+ if (!textBBoxMap[key]) textBBoxMap[key] = [];+ textBBoxMap[key].push(bbox);+ }+ } catch (e) {}+ }+ });++ function addHitZone(hx, hy, hw, hh, pin) {+ const rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');+ rect.setAttribute('x', hx);+ rect.setAttribute('y', hy);+ rect.setAttribute('width', hw);+ rect.setAttribute('height', hh);+ rect.setAttribute('class', 'pin-hit-zone');+ rect.setAttribute('data-pin', pin.name);+ rect.setAttribute('rx', '0.3');+ svgEl.appendChild(rect);+ rect.addEventListener('mouseenter', (ev) => showTooltip(ev.clientX, ev.clientY, pin));+ rect.addEventListener('mousemove', (ev) => { if (!stickyPin) positionTooltip(ev.clientX, ev.clientY); });+ rect.addEventListener('mouseleave', hideTooltip);+ rect.addEventListener('click', (ev) => { ev.stopPropagation(); toggleSticky(pin, ev.clientX, ev.clientY); });+ }++ for (const pin of pins) {+ const tipSvgX = ox + pin.x;+ const tipSvgY = oy - pin.y;+ const wireLen = pin.length || 2.54;+ const isHoriz = (pin.angle === 0 || pin.angle === 180);++ // Pin name hitbox: use actual text bbox if available+ const nameBBoxes = textBBoxMap[pin.name];+ if (nameBBoxes && nameBBoxes.length > 0) {+ // Pick the bbox closest to this pin's body-edge position+ const bodyEdgeX = isHoriz+ ? (pin.angle === 0 ? tipSvgX + wireLen : tipSvgX - wireLen)+ : tipSvgX;+ const bodyEdgeY = isHoriz+ ? tipSvgY+ : (pin.angle === 90 ? tipSvgY - wireLen : tipSvgY + wireLen);+ let best = nameBBoxes[0];+ let bestDist = Infinity;+ for (const bb of nameBBoxes) {+ const cx = bb.x + bb.width / 2, cy = bb.y + bb.height / 2;+ const d = Math.hypot(cx - bodyEdgeX, cy - bodyEdgeY);+ if (d < bestDist) { bestDist = d; best = bb; }+ }+ addHitZone(best.x - pad, best.y - pad, best.width + pad * 2, best.height + pad * 2, pin);+ } else {+ // Fallback: fixed-width zone inside body+ const bodyDepth = 8;+ if (isHoriz) {+ const cy = tipSvgY - zoneH / 2;+ if (pin.angle === 0) addHitZone(tipSvgX + wireLen, cy, bodyDepth, zoneH, pin);+ else addHitZone(tipSvgX - wireLen - bodyDepth, cy, bodyDepth, zoneH, pin);+ } else {+ const cx = tipSvgX - zoneH / 2;+ if (pin.angle === 90) addHitZone(cx, tipSvgY - wireLen - bodyDepth, zoneH, bodyDepth, pin);+ else addHitZone(cx, tipSvgY + wireLen, zoneH, bodyDepth, pin);+ }+ }++ // Pin number hitbox: use actual text bbox if available+ const numBBoxes = textBBoxMap[pin.number];+ if (numBBoxes && numBBoxes.length > 0) {+ const tipDist = (bb) => Math.hypot(bb.x + bb.width / 2 - tipSvgX, bb.y + bb.height / 2 - tipSvgY);+ let best = numBBoxes[0], bestD = tipDist(best);+ for (const bb of numBBoxes) { const d = tipDist(bb); if (d < bestD) { bestD = d; best = bb; } }+ addHitZone(best.x - pad, best.y - pad, best.width + pad * 2, best.height + pad * 2, pin);+ } else {+ // Fallback: wire area+ if (isHoriz) {+ const cy = tipSvgY - zoneH / 2;+ if (pin.angle === 0) addHitZone(tipSvgX - wireExt, cy, wireLen + wireExt, zoneH, pin);+ else addHitZone(tipSvgX, cy, wireLen + wireExt, zoneH, pin);+ } else {+ const cx = tipSvgX - zoneH / 2;+ if (pin.angle === 90) addHitZone(cx, tipSvgY, zoneH, wireLen + wireExt, pin);+ else addHitZone(cx, tipSvgY - wireExt, zoneH, wireLen + wireExt, pin);+ }+ }+ }+ }++ function setupDiscreteHitZones() {+ // For discrete components (hidden pin names/numbers), create hit zones+ // using getBBox() on injected text labels for precise alignment.+ // Falls back to coordinate-based zones if text elements aren't found.+ if (!svgOffset) return;+ const ox = svgOffset.x, oy = svgOffset.y;+ const pad = 0.5; // generous padding for easy hover on small labels++ // Build lookup: text content → getBBox for injected labels+ const labelBBoxMap = {};+ const allTextEls = svgEl.querySelectorAll('text.pin-label, text.pin-num-label');+ allTextEls.forEach(t => {+ try {+ const bbox = t.getBBox();+ if (bbox.width > 0 && bbox.height > 0) {+ const key = t.textContent.trim();+ if (!labelBBoxMap[key]) labelBBoxMap[key] = [];+ labelBBoxMap[key].push(bbox);+ }+ } catch (e) {}+ });++ for (const pin of pins) {+ const tipSvgX = ox + pin.x;+ const tipSvgY = oy - pin.y;+ const wireLen = pin.length || 2.54;++ // Collect bounding boxes of this pin's name and number labels+ const bboxes = [];++ // Find name label bbox (closest to pin tip)+ const nameBBs = labelBBoxMap[pin.name];+ if (nameBBs) {+ let best = nameBBs[0], bestD = Infinity;+ for (const bb of nameBBs) {+ const d = Math.hypot(bb.x + bb.width / 2 - tipSvgX, bb.y + bb.height / 2 - tipSvgY);+ if (d < bestD) { bestD = d; best = bb; }+ }+ bboxes.push(best);+ }++ // Find number label bbox (closest to pin tip)+ const numBBs = labelBBoxMap[pin.number];+ if (numBBs) {+ let best = numBBs[0], bestD = Infinity;+ for (const bb of numBBs) {+ const d = Math.hypot(bb.x + bb.width / 2 - tipSvgX, bb.y + bb.height / 2 - tipSvgY);+ if (d < bestD) { bestD = d; best = bb; }+ }+ bboxes.push(best);+ }++ if (bboxes.length > 0) {+ // Union text bboxes into a single hit zone (just covers labels near the tip)+ let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;+ for (const bb of bboxes) {+ minX = Math.min(minX, bb.x);+ minY = Math.min(minY, bb.y);+ maxX = Math.max(maxX, bb.x + bb.width);+ maxY = Math.max(maxY, bb.y + bb.height);+ }++ const rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');+ rect.setAttribute('x', minX - pad);+ rect.setAttribute('y', minY - pad);+ rect.setAttribute('width', maxX - minX + pad * 2);+ rect.setAttribute('height', maxY - minY + pad * 2);+ rect.setAttribute('class', 'pin-hit-zone');+ rect.setAttribute('data-pin-wire', pin.name);+ rect.setAttribute('rx', '0.3');+ svgEl.appendChild(rect);++ rect.addEventListener('mouseenter', (ev) => showTooltip(ev.clientX, ev.clientY, pin));+ rect.addEventListener('mousemove', (ev) => { if (!stickyPin) positionTooltip(ev.clientX, ev.clientY); });+ rect.addEventListener('mouseleave', hideTooltip);+ rect.addEventListener('click', (ev) => { ev.stopPropagation(); toggleSticky(pin, ev.clientX, ev.clientY); });+ } else {+ // Fallback: coordinate-based zone around wire area+ const perpHalf = 1.5;+ let hitX, hitY, hitW, hitH;+ switch (pin.angle) {+ case 0: hitX = tipSvgX - 1; hitY = tipSvgY - perpHalf; hitW = wireLen + 1; hitH = perpHalf * 2; break;+ case 180: hitX = tipSvgX - wireLen; hitY = tipSvgY - perpHalf; hitW = wireLen + 1; hitH = perpHalf * 2; break;+ case 270: hitX = tipSvgX - perpHalf; hitY = tipSvgY; hitW = perpHalf * 2; hitH = wireLen + 1; break;+ case 90: hitX = tipSvgX - perpHalf; hitY = tipSvgY - wireLen; hitW = perpHalf * 2; hitH = wireLen + 1; break;+ default: hitX = tipSvgX - 2; hitY = tipSvgY - 2; hitW = 4; hitH = 4;+ }+ const rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');+ rect.setAttribute('x', hitX);+ rect.setAttribute('y', hitY);+ rect.setAttribute('width', hitW);+ rect.setAttribute('height', hitH);+ rect.setAttribute('class', 'pin-hit-zone');+ rect.setAttribute('data-pin-wire', pin.name);+ rect.setAttribute('rx', '0.3');+ svgEl.appendChild(rect);+ rect.addEventListener('mouseenter', (ev) => showTooltip(ev.clientX, ev.clientY, pin));+ rect.addEventListener('mousemove', (ev) => { if (!stickyPin) positionTooltip(ev.clientX, ev.clientY); });+ rect.addEventListener('mouseleave', hideTooltip);+ rect.addEventListener('click', (ev) => { ev.stopPropagation(); toggleSticky(pin, ev.clientX, ev.clientY); });+ }+ }+ }++ // ── Group label hit zones ──+ function setupGroupHitZones() {+ if (!svgEl) return;+ const texts = svgEl.querySelectorAll('text');+ texts.forEach(textEl => {+ const label = textEl.textContent.trim();+ const group = groups.find(g => g.name === label);+ if (!group) return;+ const fSize = parseFloat(textEl.getAttribute('font-size')) || 1;+ if (Math.abs(fSize - 1.016) > 0.1) return;++ const x = parseFloat(textEl.getAttribute('x')) || 0;+ const y = parseFloat(textEl.getAttribute('y')) || 0;+ const tLen = parseFloat(textEl.getAttribute('textLength')) || 6;+ const anchor = textEl.getAttribute('text-anchor') || 'start';++ const padX = fSize * 0.4;+ const padY = fSize * 0.15; // tight vertical padding to avoid spilling into pin zones+ let rx, rw = tLen + padX * 2, rh = fSize + padY * 2;+ if (anchor === 'end') rx = x - tLen - padX;+ else if (anchor === 'middle') rx = x - tLen / 2 - padX;+ else rx = x - padX;+ const ry = y - fSize - padY;++ const rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');+ rect.setAttribute('x', rx);+ rect.setAttribute('y', ry);+ rect.setAttribute('width', rw);+ rect.setAttribute('height', rh);+ rect.setAttribute('class', 'pin-hit-zone');+ rect.setAttribute('data-group', group.name);+ rect.setAttribute('rx', '0.3');+ svgEl.appendChild(rect);++ rect.addEventListener('mouseenter', (ev) => showGroupTooltip(ev.clientX, ev.clientY, group));+ rect.addEventListener('mousemove', (ev) => { if (!stickyPin) positionTooltip(ev.clientX, ev.clientY); });+ rect.addEventListener('mouseleave', hideTooltip);+ });+ }++ // Keyboard shortcuts+ window.addEventListener('keydown', (e) => {+ if (e.key === 'f' || e.key === 'F') zoomFit();+ else if (e.key === '1') zoomReset();+ else if (e.key === '+' || e.key === '=') zoomIn();+ else if (e.key === '-') zoomOut();+ else if (e.key === 'g' || e.key === 'G') toggleGrid();+ else if (e.key === 'Escape') {+ closeRegenPrompt();+ stickyPin = null;+ tooltip.classList.remove('sticky', 'visible');+ clearHighlight();+ }+ });++ // Auto-fit on window/container resize (e.g. iframe becoming visible)+ new ResizeObserver(() => zoomFit()).observe(wrap);++ // Init+ requestAnimationFrame(() => {+ zoomFit();+ setupPinHitZones();+ setupGroupHitZones();+ // Hide hit zones by default (user can toggle with Hits button)+ if (!hitsVisible && svgEl) {+ svgEl.querySelectorAll('.pin-hit-zone').forEach(r => { r.style.visibility = 'hidden'; });+ }+ });++ // Zoom to a named region of the symbol (for AI screenshot verification)+ // Regions: 'top', 'bottom', 'left', 'right', 'fit' (full symbol)+ function zoomToRegion(region) {+ if (!contentBounds) { zoomFit(); return; }+ const ww = wrap.clientWidth, wh = wrap.clientHeight;+ const svgEl = document.querySelector('#canvas svg');+ if (!svgEl) return;+ const vb = svgEl.viewBox.baseVal;+ const svgPxW = svgEl.clientWidth || svgEl.getBoundingClientRect().width;+ const svgPxH = svgEl.clientHeight || svgEl.getBoundingClientRect().height;+ const pxPerUnitX = svgPxW / vb.width;+ const pxPerUnitY = svgPxH / vb.height;++ // Content bounds in SVG user-space+ const cb = contentBounds;+ const cx = cb.x, cy = cb.y, cw = cb.w || cb.width, ch = cb.h || cb.height;+ // Region crop (SVG user-space coordinates)+ let rx, ry, rw, rh;+ const margin = 2; // mm padding+ if (region === 'top') {+ rx = cx - margin; ry = cy - margin; rw = cw + margin * 2; rh = Math.min(ch * 0.12, 50) + margin;+ } else if (region === 'bottom') {+ const cropH = Math.min(ch * 0.12, 50);+ ry = cy + ch - cropH - margin; rx = cx - margin; rw = cw + margin * 2; rh = cropH + margin * 2;+ } else if (region === 'top-left') {+ rx = cx - margin; ry = cy - margin; rw = cw * 0.4 + margin; rh = Math.min(ch * 0.12, 50) + margin;+ } else if (region === 'top-right') {+ rx = cx + cw * 0.6 - margin; ry = cy - margin; rw = cw * 0.4 + margin * 2; rh = Math.min(ch * 0.12, 50) + margin;+ } else if (region === 'bottom-left') {+ const cropH = Math.min(ch * 0.12, 50);+ ry = cy + ch - cropH - margin; rx = cx - margin; rw = cw * 0.4 + margin; rh = cropH + margin * 2;+ } else if (region === 'bottom-right') {+ const cropH = Math.min(ch * 0.12, 50);+ ry = cy + ch - cropH - margin; rx = cx + cw * 0.6 - margin; rw = cw * 0.4 + margin * 2; rh = cropH + margin * 2;+ } else if (region === 'left') {+ rx = cx - margin; ry = cy - margin; rw = cw * 0.35 + margin; rh = ch + margin * 2;+ } else if (region === 'right') {+ rx = cx + cw * 0.65 - margin; ry = cy - margin; rw = cw * 0.35 + margin * 2; rh = ch + margin * 2;+ } else {+ zoomFit(); return;+ }+ // Convert to pixel coords+ const pxX = (rx - vb.x) * pxPerUnitX;+ const pxY = (ry - vb.y) * pxPerUnitY;+ const pxW = rw * pxPerUnitX;+ const pxH = rh * pxPerUnitY;+ // Compute scale to fit region in viewport+ const ns = Math.min(ww / pxW, wh / pxH) * 0.92;+ scale = Math.max(0.1, Math.min(ns, 20));+ panX = ww / 2 - (pxX + pxW / 2) * scale;+ panY = wh / 2 - (pxY + pxH / 2) * scale;+ updateTransform();+ }++ // Screenshot capture handler for Adom Viewer mgmt relay+ // Send SVG data back to parent for rendering (avoids sandbox restrictions on Image loading)+ window.addEventListener('message', (e) => {+ // Zoom-to-region command (from AI via mgmt relay)+ if (e.data?.type === 'sym_zoom_region') {+ zoomToRegion(e.data.region || 'fit');+ return;+ }+ if (e.data?.type === 'mgmt_capture_request') {+ const reqId = e.data._reqId;+ try {+ const svg = document.querySelector('#canvas svg');+ if (!svg) { window.parent.postMessage({ type: 'mgmt_canvas_capture', _reqId: reqId, data: null }, '*'); return; }+ const clone = svg.cloneNode(true);+ // Inline pin-hit-zone styles so they're visible in standalone SVG+ clone.querySelectorAll('.pin-hit-zone').forEach(el => {+ el.setAttribute('fill', 'rgba(0,230,220,0.06)');+ el.setAttribute('stroke', '#00e6dc');+ el.setAttribute('stroke-width', '0.12');+ el.setAttribute('stroke-dasharray', '0.3,0.2');+ el.setAttribute('stroke-opacity', '0.5');+ el.setAttribute('rx', '0.3');+ });+ const vb = svg.getAttribute('viewBox');+ const parts = vb ? vb.split(/\s+/).map(Number) : [0, 0, 100, 100];+ let vbX = parts[0], vbY = parts[1], vbW = parts[2] || 100, vbH = parts[3] || 100;++ // Crop to visible viewport when zoomed/panned+ const svgPxW = svg.clientWidth || svg.getBoundingClientRect().width;+ const svgPxH = svg.clientHeight || svg.getBoundingClientRect().height;+ const ww = wrap.clientWidth, wh = wrap.clientHeight;+ if (scale !== 1 || panX !== (ww - svgPxW) / 2 || panY !== (wh - svgPxH) / 2) {+ const pxPerUnitX = svgPxW / vbW;+ const pxPerUnitY = svgPxH / vbH;+ // Visible viewport in pixel space of the SVG element+ const visLeft = -panX / scale;+ const visTop = -panY / scale;+ const visW = ww / scale;+ const visH = wh / scale;+ // Convert to SVG user-space+ vbX = vbX + visLeft / pxPerUnitX;+ vbY = vbY + visTop / pxPerUnitY;+ vbW = visW / pxPerUnitX;+ vbH = visH / pxPerUnitY;+ }++ clone.setAttribute('viewBox', vbX + ' ' + vbY + ' ' + vbW + ' ' + vbH);+ clone.setAttribute('xmlns', 'http://www.w3.org/2000/svg');+ const xml = new XMLSerializer().serializeToString(clone);+ // Send SVG XML + dimensions to parent for canvas rendering+ window.parent.postMessage({+ type: 'mgmt_canvas_capture',+ _reqId: reqId,+ svgXml: xml,+ svgWidth: vbW,+ svgHeight: vbH,+ bgColor: '#0d1117'+ }, '*');+ } catch (err) {+ window.parent.postMessage({ type: 'mgmt_canvas_capture', _reqId: reqId, data: null }, '*');+ }+ }+ });+</script>+</body>+</html>
CR0402-FX-4702GLF.htmladded+933@@ -0,0 +1,933 @@+<!DOCTYPE html>+<html lang="en">+<head>+<meta charset="UTF-8">+<meta name="viewport" content="width=device-width, initial-scale=1.0">+<title>CR0402-FX-4702GLF — Component Characterization</title>+<style>++ @font-face { font-family: 'Familjen Grotesk'; src: url('https://adom.inc/fonts/familjen-grotesk/familjen-grotesk-latin-700-normal.woff2') format('woff2'); font-weight: 700; }+ @font-face { font-family: 'Familjen Grotesk'; src: url('https://adom.inc/fonts/familjen-grotesk/familjen-grotesk-latin-500-normal.woff2') format('woff2'); font-weight: 500; }+ @font-face { font-family: 'Satoshi'; src: url('https://adom.inc/fonts/satoshi/satoshi-400-normal.woff2') format('woff2'); font-weight: 400; }+ @font-face { font-family: 'Satoshi'; src: url('https://adom.inc/fonts/satoshi/satoshi-500-normal.woff2') format('woff2'); font-weight: 500; }+ @font-face { font-family: 'JetBrains Mono'; src: url('https://fonts.gstatic.com/s/jetbrainsmono/v24/tDbv2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8yKwBNntkaToggR7BYRbKPx3cwhsk.woff2') format('woff2'); font-weight: 400; }++ :root {+ --bg: #0d1117; --surface: #161b22; --elevated: #1c2128; --border: #30363d; --border-muted: #21262d;+ --text: #e6edf3; --text-muted: #8b949e; --text-dim: #484f58;+ --accent: #00b8b0; --accent-bright: #00e6dc; --accent-dim: rgba(0,184,176,0.12); --accent-border: rgba(0,184,176,0.25);+ --green: #3fb950; --orange: #d29922; --red: #f85149; --purple: #8C6BF7; --blue: #58a6ff;+ }+ * { margin: 0; padding: 0; box-sizing: border-box; }+ body { font-family: 'Satoshi', sans-serif; background: var(--bg); color: var(--text); font-size: 13px; line-height: 1.6; overflow-y: auto; }+ h1,h2,h3 { font-family: 'Familjen Grotesk', sans-serif; font-weight: 700; }+ code { font-family: 'JetBrains Mono', monospace; font-size: 12px; }+ a { color: var(--accent); text-decoration: none; }+ a:hover { color: var(--accent-bright); text-decoration: underline; }++ .header { background: var(--surface); border-bottom: 1px solid var(--border-muted); padding: 20px 24px; }+ .header-top { display: flex; align-items: center; gap: 12px; margin-bottom: 4px; }+ .header .brand { color: var(--accent); font-family: 'Familjen Grotesk', sans-serif; font-size: 12px; font-weight: 600; }+ .header .vsep { width: 1px; height: 16px; background: var(--border); }+ .header .crumb { color: var(--text-dim); font-size: 12px; }+ .header h1 { font-size: 22px; margin-bottom: 2px; }+ .header h1 .val { color: var(--accent); }+ .header .subtitle { color: var(--text-muted); font-size: 13px; }+ .header .tags { display: flex; gap: 6px; margin-top: 10px; flex-wrap: wrap; }+ .tag { display: inline-flex; align-items: center; gap: 4px; padding: 3px 10px; border-radius: 12px; font-size: 11px; font-weight: 500; }+ .tag.pkg { background: rgba(0,184,176,0.12); color: var(--accent); }+ .tag.mfr { background: rgba(88,166,255,0.12); color: var(--blue); }+ .tag.series { background: rgba(140,107,247,0.12); color: var(--purple); }+ .tag.rohs { background: rgba(63,185,80,0.12); color: var(--green); }+ .tag.app { background: rgba(210,153,34,0.12); color: var(--orange); }++ .container { max-width: 1100px; margin: 0 auto; padding: 24px; }+ .grid-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }+ .grid-3 { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 12px; }+ @media (max-width: 800px) { .grid-2, .grid-3 { grid-template-columns: 1fr; } }++ .section { margin-bottom: 28px; }+ .section-title { font-size: 14px; color: var(--text); margin-bottom: 12px; padding-bottom: 6px; border-bottom: 1px solid var(--border-muted); display: flex; align-items: center; gap: 8px; }+ .section-title .icon { color: var(--accent); font-size: 16px; }++ .card { background: var(--surface); border: 1px solid var(--border-muted); border-radius: 8px; padding: 16px; }+ .card:hover { border-color: var(--accent-border); }++ .spec-cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); gap: 10px; }+ .spec-card { background: var(--surface); border: 1px solid var(--border-muted); border-radius: 8px; padding: 12px 14px; text-align: center; }+ .spec-card .sc-label { font-size: 10px; text-transform: uppercase; letter-spacing: 0.5px; color: var(--text-dim); margin-bottom: 4px; }+ .spec-card .sc-value { font-size: 22px; font-weight: 700; font-family: 'Familjen Grotesk', sans-serif; }+ .spec-card .sc-detail { font-size: 11px; color: var(--text-muted); margin-top: 2px; }+ .spec-card.highlight { border-color: var(--accent-border); background: linear-gradient(180deg, rgba(0,184,176,0.06), var(--surface)); }+ .spec-card.highlight .sc-value { color: var(--accent); }++ .detail-table { width: 100%; border-collapse: collapse; }+ .detail-table tr { border-bottom: 1px solid var(--border-muted); }+ .detail-table tr:last-child { border-bottom: none; }+ .detail-table td { padding: 8px 0; }+ .detail-table td:first-child { color: var(--text-muted); font-size: 12px; width: 45%; }+ .detail-table td:last-child { font-family: 'JetBrains Mono', monospace; font-size: 13px; text-align: right; }++ .chart-wrap { background: var(--surface); border: 1px solid var(--border-muted); border-radius: 8px; padding: 16px; }+ .chart-wrap h3 { font-size: 13px; color: var(--text); margin-bottom: 12px; }+ .chart-wrap .chart-note { font-size: 11px; color: var(--text-dim); margin-top: 8px; }+ svg text { font-family: 'JetBrains Mono', monospace; }++ .pkg-drawing { display: flex; align-items: center; justify-content: center; padding: 20px; }++ .profile-table { width: 100%; border-collapse: collapse; font-size: 12px; margin-top: 12px; }+ .profile-table th { background: var(--elevated); padding: 6px 10px; font-size: 10px; font-weight: 500; text-transform: uppercase; letter-spacing: 0.5px; color: var(--text-dim); text-align: left; border-bottom: 1px solid var(--border); }+ .profile-table td { padding: 6px 10px; border-bottom: 1px solid var(--border-muted); }++ .env-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }+ @media (max-width: 700px) { .env-grid { grid-template-columns: 1fr; } }+ .env-card { background: var(--surface); border: 1px solid var(--border-muted); border-radius: 8px; padding: 12px 14px; }+ .env-card .env-name { font-size: 12px; font-weight: 600; margin-bottom: 4px; }+ .env-card .env-spec { font-size: 11px; color: var(--text-muted); }+ .env-card .env-detail { font-family: 'JetBrains Mono', monospace; font-size: 11px; color: var(--text); margin-top: 4px; }++ .vendor-cards { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; }+ @media (max-width: 700px) { .vendor-cards { grid-template-columns: 1fr; } }+ .vendor-card { background: var(--surface); border: 1px solid var(--border-muted); border-radius: 8px; padding: 14px; }+ .vendor-card .vc-name { font-size: 12px; font-weight: 600; margin-bottom: 6px; }+ .vendor-card .vc-name.mouser { color: var(--blue); }+ .vendor-card .vc-name.digikey { color: var(--red); }+ .vendor-card .vc-name.jlcpcb { color: var(--green); }+ .vendor-card .vc-price { font-size: 20px; font-weight: 700; font-family: 'Familjen Grotesk', sans-serif; }+ .vendor-card .vc-detail { font-size: 11px; color: var(--text-muted); margin-top: 4px; }+ .vendor-card .vc-link { display: inline-block; margin-top: 8px; font-size: 11px; color: var(--accent); }+ .vendor-card.recommended { border-color: var(--accent-border); }+ .vendor-card.recommended::before { content: 'RECOMMENDED'; display: block; font-size: 9px; letter-spacing: 1px; color: var(--accent); margin-bottom: 6px; font-weight: 600; }++ .copy-btn { background: none; border: 1px solid var(--border); color: var(--text-muted); border-radius: 4px; padding: 2px 6px; font-size: 13px; cursor: pointer; font-family: 'JetBrains Mono', monospace; vertical-align: middle; transition: border-color 0.15s, color 0.15s; }+ .copy-btn:hover { border-color: var(--accent); color: var(--accent); }++ .dl-btn { display: inline-block; margin-top: 10px; padding: 6px 14px; background: var(--accent-dim); border: 1px solid var(--accent-border); border-radius: 6px; color: var(--accent); font-size: 11px; font-weight: 500; font-family: 'Satoshi', sans-serif; text-decoration: none; transition: background 0.15s, border-color 0.15s; }+ .dl-btn:hover { background: rgba(0,184,176,0.2); border-color: var(--accent); text-decoration: none; color: var(--accent-bright); }++ .open-full-banner { display: flex; align-items: center; justify-content: center; padding: 12px 24px; background: linear-gradient(90deg, rgba(0,184,176,0.12), rgba(0,184,176,0.06)); border-bottom: 1px solid var(--accent-border); }+ .open-full-btn { display: inline-flex; align-items: center; gap: 8px; padding: 8px 20px; background: var(--accent); color: var(--bg); font-family: 'Familjen Grotesk', sans-serif; font-size: 13px; font-weight: 600; border-radius: 6px; text-decoration: none; transition: background 0.15s; }+ .open-full-btn:hover { background: var(--accent-bright); text-decoration: none; color: var(--bg); }++ .source { text-align: center; color: var(--text-dim); font-size: 11px; padding: 24px 0 12px; border-top: 1px solid var(--border-muted); margin-top: 20px; }++</style>+</head>+<body>++<div class="open-full-banner" id="fullPageBanner" style="display:none">+ <span style="color:var(--text-muted);font-size:12px;margin-right:8px">Full page:</span>+ <code style="color:var(--accent);font-size:11px;background:var(--elevated);padding:4px 8px;border-radius:4px;user-select:all">https://wiki-ufypy5dpx93o.adom.cloud/static/libraries/cr0402-fx-4702glf/CR0402-FX-4702GLF.html</code>+ <button class="open-full-btn" id="copyFullUrl" style="margin-left:8px">Copy Link</button>+</div>+<script>+if(window.self!==window.top){document.getElementById('fullPageBanner').style.display='flex'}+document.getElementById('copyFullUrl').addEventListener('click',function(){var t=document.createElement('textarea');t.value='https://wiki-ufypy5dpx93o.adom.cloud/static/libraries/cr0402-fx-4702glf/CR0402-FX-4702GLF.html';document.body.appendChild(t);t.select();document.execCommand('copy');document.body.removeChild(t);this.textContent='Copied!';var b=this;setTimeout(function(){b.textContent='Copy Link'},1500)});+</script>++<div class="header">+ <div class="header-top">+ <div class="brand">Adom</div>+ <div class="vsep"></div>+ <div class="crumb">Components › Resistors › 0402</div>+ </div>+ <h1>CR0402-FX-4702GLF — <span class="val">47kΩ</span></h1>+ <div class="subtitle">Bourns · Thick Film Chip Resistor · General Purpose</div>+ <div class="tags">+ <span class="tag pkg">0402</span>+ <span class="tag mfr">Bourns</span>+ <span class="tag series">CR0402</span>+ <span class="tag rohs">RoHS</span>+ <span class="tag app">Thick Film</span>+ </div>+</div>++<div class="container">++ <div class="section">+ <div class="spec-cards">+ <div class="spec-card highlight">+ <div class="sc-label">Resistance</div>+ <div class="sc-value">47kΩ</div>+ <div class="sc-detail">±1%</div>+ </div>+ <div class="spec-card">+ <div class="sc-label">Power Rating</div>+ <div class="sc-value">62.5mW</div>+ <div class="sc-detail">1/16W @ 70°C</div>+ </div>+ <div class="spec-card">+ <div class="sc-label">Tolerance</div>+ <div class="sc-value">±1%</div>+ <div class="sc-detail">F grade</div>+ </div>+ <div class="spec-card">+ <div class="sc-label">TCR</div>+ <div class="sc-value">±100</div>+ <div class="sc-detail">ppm/°C</div>+ </div>+ <div class="spec-card">+ <div class="sc-label">Max Voltage</div>+ <div class="sc-value">50V</div>+ <div class="sc-detail">working voltage</div>+ </div>+ <div class="spec-card">+ <div class="sc-label">Mouser</div>+ <div class="sc-value">—</div>+ <div class="sc-detail">search for price</div>+ </div>+ </div>+ </div>++ <div class="grid-2">+ <!-- Left column -->+ <div>+ <div class="section">+ <h2 class="section-title">Electrical Characteristics</h2>+ <div class="card">+ <table class="detail-table">+ <tr><td>Resistance</td><td>47kΩ ±1%</td></tr>+ <tr><td>Power Rating</td><td>62.5mW (1/16W)</td></tr>+ <tr><td>Derate Above</td><td>70°C → 0W at 155°C</td></tr>+ <tr><td>Max Working Voltage</td><td>50V</td></tr>+ <tr><td>Max Overload Voltage</td><td>100V</td></tr>+ <tr><td>Rated Current</td><td>1.2mA</td></tr>+ <tr><td>TCR</td><td>±100 ppm/°C</td></tr>+ <tr><td>Insulation Resistance</td><td>≥1GΩ @ 100V</td></tr>+ <tr><td>Dielectric Withstanding</td><td>300V</td></tr>+ </table>+ </div>+ </div>++ <div class="section">+ <h2 class="section-title">Operating Conditions</h2>+ <div class="card">+ <table class="detail-table">+ <tr><td>Operating Temp</td><td>−55°C to +155°C</td></tr>+ <tr><td>Power Derating</td><td>100% to 70°C, 0% at 155°C</td></tr>+ <tr><td>Solder Compatibility</td><td>Sn96.5/Ag3.0/Cu0.5</td></tr>+ <tr><td>Solderability Test</td><td>245±5°C, 2±0.5s</td></tr>+ <tr><td>Mass</td><td>∼0.001g</td></tr>+ </table>+ </div>+ </div>+ </div>++ <!-- Right column -->+ <div>+ <div class="section">+ <h2 class="section-title">Package & Dimensions</h2>+ <div class="card">+ <div class="pkg-drawing">+ <svg width="100%" height="170" viewBox="0 0 480 170">+ <!-- Top view centered at x=110 -->+ <text x="110" y="14" fill="#8b949e" font-size="10" text-anchor="middle">Top View</text>+ <rect x="50" y="22" width="120" height="60" rx="2" fill="#1c2128" stroke="#30363d" stroke-width="1.5"/>+ <rect x="50" y="22" width="24" height="60" rx="1" fill="rgba(0,184,176,0.15)" stroke="#00b8b0" stroke-width="1"/>+ <rect x="146" y="22" width="24" height="60" rx="1" fill="rgba(0,184,176,0.15)" stroke="#00b8b0" stroke-width="1"/>+ <!-- No polarity mark — resistors are non-polarized -->+ <!-- Width dim -->+ <line x1="50" y1="94" x2="170" y2="94" stroke="#484f58" stroke-width="0.5"/>+ <line x1="50" y1="90" x2="50" y2="98" stroke="#484f58" stroke-width="0.5"/>+ <line x1="170" y1="90" x2="170" y2="98" stroke="#484f58" stroke-width="0.5"/>+ <text x="110" y="110" fill="#e6edf3" font-size="10" text-anchor="middle">1.00 ± 0.05</text>+ <!-- Depth dim -->+ <line x1="180" y1="22" x2="180" y2="82" stroke="#484f58" stroke-width="0.5"/>+ <line x1="176" y1="22" x2="184" y2="22" stroke="#484f58" stroke-width="0.5"/>+ <line x1="176" y1="82" x2="184" y2="82" stroke="#484f58" stroke-width="0.5"/>+ <text x="195" y="56" fill="#e6edf3" font-size="10">0.50 ± 0.05</text>+ <!-- Terminal width -->+ <line x1="50" y1="122" x2="74" y2="122" stroke="#484f58" stroke-width="0.5" stroke-dasharray="2,2"/>+ <text x="62" y="134" fill="#8b949e" font-size="9" text-anchor="middle">C: 0.20±0.10</text>++ <!-- Side view centered at x=370 -->+ <text x="370" y="14" fill="#8b949e" font-size="10" text-anchor="middle">Side View</text>+ <rect x="310" y="46" width="120" height="28" rx="2" fill="#1c2128" stroke="#30363d" stroke-width="1.5"/>+ <rect x="310" y="46" width="20" height="28" rx="1" fill="rgba(0,184,176,0.15)" stroke="#00b8b0" stroke-width="1"/>+ <rect x="410" y="46" width="20" height="28" rx="1" fill="rgba(0,184,176,0.15)" stroke="#00b8b0" stroke-width="1"/>+ <!-- Height dim -->+ <line x1="440" y1="46" x2="440" y2="74" stroke="#484f58" stroke-width="0.5"/>+ <line x1="436" y1="46" x2="444" y2="46" stroke="#484f58" stroke-width="0.5"/>+ <line x1="436" y1="74" x2="444" y2="74" stroke="#484f58" stroke-width="0.5"/>+ <text x="455" y="64" fill="#e6edf3" font-size="10">0.32 ± 0.05</text>++ <!-- Physical specs -->+ <text x="110" y="155" fill="#8b949e" font-size="10" text-anchor="middle">0402 (1005 metric)</text>+ <text x="370" y="95" fill="#8b949e" font-size="10" text-anchor="middle">Mass: ~0.001g</text>+ </svg>+ </div>+ </div>+ </div>++ <div class="section">+ <h2 class="section-title">Recommended Land Pattern</h2>+ <div class="card">+ <table class="detail-table">+ <tr><td>Pad Width</td><td>0.40mm</td></tr>+ <tr><td>Pad Height</td><td>0.50mm</td></tr>+ <tr><td>Pad-to-Pad (Reflow)</td><td>1.0mm</td></tr>+ <tr><td>Solder Paste Thickness</td><td>100–130 µm</td></tr>+ </table>+ </div>+ </div>+ </div>+ </div>++ <div class="section">+ <h2 class="section-title">Power Derating</h2>+ <div class="chart-wrap">+ <h3>Power Derating vs. Ambient Temperature (CR0402 — 62.5mW)</h3>+ <svg id="derating-chart" width="100%" height="260" viewBox="0 0 700 260">+ <rect x="60" y="20" width="600" height="200" fill="#0d1117" rx="4"/>+ <line x1="60" y1="220" x2="660" y2="220" stroke="#21262d" stroke-width="1"/>+ <line x1="60" y1="20" x2="60" y2="220" stroke="#21262d" stroke-width="1"/>+ <line x1="60" y1="178" x2="660" y2="178" stroke="#21262d" stroke-width="0.5" stroke-dasharray="4,4"/>+ <text x="55" y="182" fill="#484f58" font-size="9" text-anchor="end">25%</text>+ <line x1="60" y1="137" x2="660" y2="137" stroke="#21262d" stroke-width="0.5" stroke-dasharray="4,4"/>+ <text x="55" y="141" fill="#484f58" font-size="9" text-anchor="end">50%</text>+ <line x1="60" y1="95" x2="660" y2="95" stroke="#21262d" stroke-width="0.5" stroke-dasharray="4,4"/>+ <text x="55" y="99" fill="#484f58" font-size="9" text-anchor="end">75%</text>+ <line x1="60" y1="53" x2="660" y2="53" stroke="#21262d" stroke-width="0.5" stroke-dasharray="4,4"/>+ <text x="55" y="57" fill="#484f58" font-size="9" text-anchor="end">100%</text>+ <line x1="60" y1="20" x2="60" y2="220" stroke="#21262d" stroke-width="0.5" stroke-dasharray="4,4"/>+ <text x="60" y="240" fill="#484f58" font-size="9" text-anchor="middle">-55°C</text>+ <line x1="207" y1="20" x2="207" y2="220" stroke="#21262d" stroke-width="0.5" stroke-dasharray="4,4"/>+ <text x="207" y="240" fill="#484f58" font-size="9" text-anchor="middle">0°C</text>+ <line x1="273" y1="20" x2="273" y2="220" stroke="#21262d" stroke-width="0.5" stroke-dasharray="4,4"/>+ <text x="273" y="240" fill="#484f58" font-size="9" text-anchor="middle">25°C</text>+ <line x1="393" y1="20" x2="393" y2="220" stroke="#21262d" stroke-width="0.5" stroke-dasharray="4,4"/>+ <text x="393" y="240" fill="#484f58" font-size="9" text-anchor="middle">70°C</text>+ <line x1="473" y1="20" x2="473" y2="220" stroke="#21262d" stroke-width="0.5" stroke-dasharray="4,4"/>+ <text x="473" y="240" fill="#484f58" font-size="9" text-anchor="middle">100°C</text>+ <line x1="620" y1="20" x2="620" y2="220" stroke="#21262d" stroke-width="0.5" stroke-dasharray="4,4"/>+ <text x="620" y="240" fill="#484f58" font-size="9" text-anchor="middle">155°C</text>++ <!-- Derating line: flat at 100% from -55C to 70C, then linear to 0% at 155C -->+ <path d="M60,53 L393,53 L620,220" stroke="#00b8b0" stroke-width="2.5" fill="none"/>+ <!-- Fill under curve -->+ <path d="M60,53 L393,53 L620,220 L620,220 L60,220 Z" fill="rgba(0,184,176,0.08)"/>+ <!-- Key point dots -->+ <circle cx="393" cy="53" r="4" fill="#00b8b0" opacity="0.8"/>+ <circle cx="620" cy="220" r="4" fill="#f85149" opacity="0.8"/>+ <!-- Annotations -->+ <text x="393" y="43" fill="#00b8b0" font-size="10" text-anchor="middle">70°C / 100%</text>+ <text x="620" y="210" fill="#f85149" font-size="10" text-anchor="middle">155°C / 0%</text>+ <!-- Axis labels -->+ <text x="12" y="124" fill="#484f58" font-size="9" text-anchor="middle" transform="rotate(-90,12,124)">Rated Power (%)</text>+ <text x="360" y="255" fill="#484f58" font-size="9" text-anchor="middle">Ambient Temperature</text>+ <!-- 0% label -->+ <text x="55" y="224" fill="#484f58" font-size="9" text-anchor="end">0%</text>+ </svg>+ <div class="chart-note">Full rated power (62.5mW) up to 70°C ambient. Above 70°C, derate linearly to zero at 155°C. Formula: P = 62.5mW × (155 − T<sub>amb</sub>) / 85 for T > 70°C.</div>+ </div>+ </div>++ <div class="section">+ <h2 class="section-title">Reflow Soldering Profile</h2>+ <div class="chart-wrap">+ <h3>Lead-Free Reflow Profile (Bourns CR Series)</h3>+ <svg id="reflow-chart" width="100%" height="260" viewBox="0 0 700 260">+ <rect x="60" y="10" width="600" height="180" fill="#0d1117" rx="4"/>+ <!-- Grid -->+ <line x1="60" y1="190" x2="660" y2="190" stroke="#21262d" stroke-width="1"/>+ <line x1="60" y1="10" x2="60" y2="190" stroke="#21262d" stroke-width="1"/>+ <line x1="60" y1="145" x2="660" y2="145" stroke="#21262d" stroke-width="0.5" stroke-dasharray="4,4"/>+ <line x1="60" y1="90" x2="660" y2="90" stroke="#21262d" stroke-width="0.5" stroke-dasharray="4,4"/>+ <line x1="60" y1="40" x2="660" y2="40" stroke="#21262d" stroke-width="0.5" stroke-dasharray="4,4"/>++ <!-- Temperature profile (standard) -->+ <!-- Ramp to 150C preheat, hold 60-120s, ramp to 220C zone, 60-90s above 220C, peak 255C -->+ <path d="M80,185 L180,145 L300,145 L370,90 L420,30 L460,30 L500,90 L580,145 L660,185" stroke="#d29922" stroke-width="2.5" fill="none"/>++ <!-- Limit profile (dashed, peak 260C) -->+ <path d="M80,185 L180,145 L300,145 L360,80 L410,18 L470,18 L510,80 L580,145 L660,185" stroke="#f85149" stroke-width="1.5" fill="none" stroke-dasharray="5,4" opacity="0.6"/>++ <!-- Zone annotations -->+ <rect x="210" y="155" width="80" height="16" rx="3" fill="rgba(210,153,34,0.15)"/>+ <text x="250" y="167" fill="#d29922" font-size="9" text-anchor="middle">Pre-heat</text>+ <rect x="310" y="4" width="80" height="16" rx="3" fill="rgba(248,81,73,0.15)"/>+ <text x="350" y="16" fill="#f85149" font-size="9" text-anchor="middle">Peak zone</text>++ <!-- Temperature markers -->+ <text x="55" y="148" fill="#484f58" font-size="9" text-anchor="end">150°C</text>+ <text x="55" y="93" fill="#484f58" font-size="9" text-anchor="end">220°C</text>+ <text x="55" y="33" fill="#484f58" font-size="9" text-anchor="end">255°C</text>++ <!-- 260C limit line -->+ <text x="480" y="15" fill="#f85149" font-size="9">260°C limit</text>+ <line x1="60" y1="18" x2="660" y2="18" stroke="#f85149" stroke-width="0.5" stroke-dasharray="2,3" opacity="0.4"/>++ <!-- Pre-heat duration bracket -->+ <line x1="180" y1="195" x2="300" y2="195" stroke="#484f58" stroke-width="1"/>+ <line x1="180" y1="191" x2="180" y2="199" stroke="#484f58" stroke-width="1"/>+ <line x1="300" y1="191" x2="300" y2="199" stroke="#484f58" stroke-width="1"/>+ <text x="240" y="207" fill="#8b949e" font-size="8" text-anchor="middle">60–120s preheat</text>++ <!-- Above 220C bracket -->+ <line x1="370" y1="95" x2="500" y2="95" stroke="#484f58" stroke-width="1"/>+ <line x1="370" y1="91" x2="370" y2="99" stroke="#484f58" stroke-width="1"/>+ <line x1="500" y1="91" x2="500" y2="99" stroke="#484f58" stroke-width="1"/>+ <text x="435" y="107" fill="#8b949e" font-size="8" text-anchor="middle">60–90s >220°C</text>++ <!-- Total time bracket -->+ <line x1="80" y1="220" x2="660" y2="220" stroke="#484f58" stroke-width="0.5"/>+ <line x1="80" y1="216" x2="80" y2="224" stroke="#484f58" stroke-width="0.5"/>+ <line x1="660" y1="216" x2="660" y2="224" stroke="#484f58" stroke-width="0.5"/>++ <!-- X axis time markers -->+ <text x="80" y="234" fill="#484f58" font-size="8" text-anchor="middle">0s</text>+ <text x="180" y="234" fill="#484f58" font-size="8" text-anchor="middle">~50s</text>+ <text x="300" y="234" fill="#484f58" font-size="8" text-anchor="middle">~170s</text>+ <text x="420" y="234" fill="#484f58" font-size="8" text-anchor="middle">~220s</text>+ <text x="500" y="234" fill="#484f58" font-size="8" text-anchor="middle">~260s</text>+ <text x="660" y="234" fill="#484f58" font-size="8" text-anchor="middle">~360s</text>++ <!-- Legend -->+ <line x1="250" y1="248" x2="270" y2="248" stroke="#d29922" stroke-width="2"/>+ <text x="275" y="252" fill="#8b949e" font-size="9">Standard</text>+ <line x1="360" y1="248" x2="380" y2="248" stroke="#f85149" stroke-width="1.5" stroke-dasharray="4,3"/>+ <text x="385" y="252" fill="#8b949e" font-size="9">Limit</text>+ </svg>+ <table class="profile-table">+ <thead><tr><th>Phase</th><th>Standard</th><th>Limit</th></tr></thead>+ <tbody>+ <tr><td>Ramp Up</td><td>3°C/s max</td><td>Same</td></tr>+ <tr><td>Pre-heat</td><td>150°C, 60–120s</td><td>Same</td></tr>+ <tr><td>Reflow Zone</td><td>190–220°C</td><td>60–90s above 220°C</td></tr>+ <tr><td>Peak Temperature</td><td>255°C, ≤20s</td><td>260°C max</td></tr>+ <tr><td>Ramp Down</td><td>6°C/s max</td><td>Same</td></tr>+ </tbody>+ </table>+ </div>+ </div>++ <div class="section">+ <h2 class="section-title">Environmental & Reliability</h2>+ <div class="env-grid">+ <div class="env-card">+ <div class="env-name">Short Time Overload</div>+ <div class="env-spec">ΔR ≤ ±(2% + 0.1Ω)</div>+ <div class="env-detail">2.5× rated voltage, 5s</div>+ </div>+ <div class="env-card">+ <div class="env-name">Intermittent Overload</div>+ <div class="env-spec">ΔR ≤ ±(3% + 0.1Ω)</div>+ <div class="env-detail">2.5× rated voltage, 10,000 cycles</div>+ </div>+ <div class="env-card">+ <div class="env-name">Load Life</div>+ <div class="env-spec">ΔR ≤ ±(3% + 0.1Ω)</div>+ <div class="env-detail">1000h @ 70°C, 1.5h ON / 0.5h OFF</div>+ </div>+ <div class="env-card">+ <div class="env-name">Load Life (Humidity)</div>+ <div class="env-spec">ΔR ≤ ±(3% + 0.1Ω)</div>+ <div class="env-detail">1000h @ 40±2°C, 90–95% RH</div>+ </div>+ <div class="env-card">+ <div class="env-name">Rapid Temp Change</div>+ <div class="env-spec">ΔR ≤ ±(3% + 0.1Ω)</div>+ <div class="env-detail">−55°C / +155°C, 5 cycles</div>+ </div>+ <div class="env-card">+ <div class="env-name">Solder Heat</div>+ <div class="env-spec">ΔR ≤ ±(3% + 0.05Ω) for 1%</div>+ <div class="env-detail">270±5°C, 10±1s</div>+ </div>+ <div class="env-card">+ <div class="env-name">Solderability</div>+ <div class="env-spec">≥95% wetting</div>+ <div class="env-detail">245±5°C, 2±0.5s, Sn96.5/Ag3.0/Cu0.5</div>+ </div>+ <div class="env-card">+ <div class="env-name">Board Flex / Bending</div>+ <div class="env-spec">ΔR ≤ ±(2% + 0.1Ω)</div>+ <div class="env-detail">3mm deflection</div>+ </div>+ <div class="env-card">+ <div class="env-name">Dry Heat</div>+ <div class="env-spec">ΔR ≤ ±(1% + 0.05Ω)</div>+ <div class="env-detail">155±5°C, 96±4h</div>+ </div>+ </div>+ </div> <!-- Symbol, Footprint & 3D View -->+ <div class="section">+ <h2 class="section-title">Symbol, Footprint & 3D Model</h2>+ <div class="grid-2" style="margin-bottom:12px">+ <!-- Interactive SymView -->+ <div class="card" style="padding:0;overflow:hidden">+ <div style="font-size:12px;font-weight:500;text-transform:uppercase;letter-spacing:0.5px;color:var(--text-dim);padding:12px 16px 0">Schematic Symbol</div>+ <iframe src="CR0402-FX-4702GLF-symview.html" style="width:100%;height:340px;border:none;display:block" allow="fullscreen"></iframe>+ </div>+ <!-- Interactive FpView -->+ <div class="card" style="padding:0;overflow:hidden">+ <div style="font-size:12px;font-weight:500;text-transform:uppercase;letter-spacing:0.5px;color:var(--text-dim);padding:12px 16px 0">Footprint (0402) — with solder jetting layout</div>+ <iframe src="CR0402-FX-4702GLF-fpview.html" style="width:100%;height:340px;border:none;display:block" allow="fullscreen"></iframe>+ </div>+ </div>+ <!-- 3D Model -->+ <div class="card" style="text-align:center;margin-bottom:12px">+ <div style="font-size:12px;font-weight:500;text-transform:uppercase;letter-spacing:0.5px;color:var(--text-dim);margin-bottom:12px">3D Model (interactive)</div>+ <canvas id="viewer3d" width="600" height="300" style="width:100%;height:300px;border-radius:4px;cursor:grab"></canvas>+ <div style="font-size:10px;color:var(--text-dim);margin-top:6px">Click & drag to rotate · Scroll to zoom</div>+ </div>+ <!-- Download / Export Bar -->+ <div class="card" style="display:flex;align-items:center;gap:10px;flex-wrap:wrap">+ <span style="font-size:11px;font-weight:600;color:var(--text-muted);text-transform:uppercase;letter-spacing:0.5px">Export:</span>+ <a class="dl-btn" href="https://wiki-ufypy5dpx93o.adom.cloud/static/libraries/cr0402-fx-4702glf/CR0402-FX-4702GLF.kicad_sym" download>KiCad Symbol (.kicad_sym)</a>+ <a class="dl-btn" href="https://wiki-ufypy5dpx93o.adom.cloud/static/libraries/cr0402-fx-4702glf/CR0402-FX-4702GLF.kicad_mod" download>KiCad Footprint (.kicad_mod)</a>+ <a class="dl-btn" href="https://wiki-ufypy5dpx93o.adom.cloud/static/libraries/cr0402-fx-4702glf/CR0402-FX-4702GLF.lbr" download>Fusion 360 (.lbr)</a>+ <a class="dl-btn" href="https://wiki-ufypy5dpx93o.adom.cloud/static/libraries/cr0402-fx-4702glf/CR0402-FX-4702GLF.step" download>3D Model (.step)</a>+ </div>+ </div>++ <div class="section">+ <h2 class="section-title">Pricing & Availability</h2>+ <div class="vendor-cards">+ <div class="vendor-card recommended">+ <div class="vc-name mouser">Mouser Electronics</div>+ <div class="vc-price">—</div>+ <div class="vc-detail">Search for current pricing</div>+ <div class="vc-detail">PN: CR0402-FX-4702GLF</div>+ <a class="vc-link" href="https://www.mouser.com/c/?q=CR0402-FX-4702GLF" target="_blank">Search on Mouser →</a>+ </div>+ <div class="vendor-card">+ <div class="vc-name digikey">DigiKey</div>+ <div class="vc-price">—</div>+ <div class="vc-detail">Search for current pricing</div>+ <a class="vc-link" href="https://www.digikey.com/en/products/result?keywords=CR0402-FX-4702GLF" target="_blank">Search on DigiKey →</a>+ </div>+ <div class="vendor-card">+ <div class="vc-name jlcpcb">JLCPCB / LCSC</div>+ <div class="vc-price">—</div>+ <div class="vc-detail">Search for availability</div>+ <a class="vc-link" href="https://www.lcsc.com/search?q=CR0402-FX-4702GLF" target="_blank">Search on LCSC →</a>+ </div>+ </div>+ <div class="chart-note" style="margin-top:8px"><strong>Adom Basic Part</strong> — Always on hand, no shipping fee.</div>+ </div>++ <div class="section">+ <h2 class="section-title">Documents</h2>+ <div class="card">+ <table class="detail-table">+ <tr><td>Datasheet</td><td><button class="copy-btn" title="Copy link to clipboard" id="ds-copy-btn">⎘</button>+<script>document.getElementById('ds-copy-btn').addEventListener('click',function(){var t=document.createElement('textarea');t.value='https://www.bourns.com/docs/product-datasheets/cr.pdf';document.body.appendChild(t);t.select();document.execCommand('copy');document.body.removeChild(t);this.textContent='Copied!';var b=this;setTimeout(function(){b.innerHTML='⎘'},1500)});</script> <a href="https://www.bourns.com/docs/product-datasheets/cr.pdf" target="_blank">Bourns CR Series Datasheet (PDF) →</a></td></tr>+ <tr><td>Series</td><td>CR0402</td></tr>+ <tr><td>Manufacturer</td><td>Bourns</td></tr>+ <tr><td>Inventory Source</td><td><a href="https://inventory-2w8z8d9ojzzl.adom.cloud" target="_blank">Adom Parts Inventory →</a></td></tr>+ </table>+ </div>+ </div>++ <!-- Molecule -->+ <div class="section">+ <h2 class="section-title">Molecule — Single-Passive Board</h2>+ <div class="card" style="padding:0;overflow:hidden;border-radius:8px">+ <div style="font-size:12px;font-weight:500;text-transform:uppercase;letter-spacing:0.5px;color:var(--text-dim);padding:12px 16px 0">Interactive 3D Board Viewer</div>+ <iframe src="https://wiki-ufypy5dpx93o.adom.cloud/static/libraries/cr0402-fx-4702glf/tsci-viewer/molecule-viewer/index.html"+ style="width:100%;height:500px;border:none;border-radius:0 0 8px 8px;display:block"+ allow="fullscreen"></iframe>+ </div>+ <div style="font-size:11px;color:var(--text-dim);margin-top:8px;text-align:center">+ Orbit: click & drag · Zoom: scroll · Inspect: click a component · X-ray: toggle in toolbar+ </div>+ </div>++ <div class="source">+ CR0402-FX-4702GLF characterization · Data from Bourns datasheet (CR0402 series) + adom-parts-search · 2026-06-03+ </div>++</div>++<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script>+<script src="https://cdn.jsdelivr.net/npm/[email protected]/examples/js/pmrem/PMREMGenerator.js"></script>+<script>+(function() {+ const canvas = document.getElementById('viewer3d');+ if (canvas && window.THREE) {+ const scene = new THREE.Scene();++ const renderer = new THREE.WebGLRenderer({ canvas, antialias: true, alpha: true, logarithmicDepthBuffer: true });+ renderer.setSize(canvas.width, canvas.height);+ renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));+ renderer.outputEncoding = THREE.sRGBEncoding;+ renderer.toneMapping = THREE.ACESFilmicToneMapping;+ renderer.toneMappingExposure = 1.2;+ renderer.physicallyCorrectLights = true;++ canvas.style.background = 'linear-gradient(180deg, #5a6b7e 0%, #2a3340 100%)';++ const camera = new THREE.PerspectiveCamera(35, canvas.width / canvas.height, 0.01, 1000);++ const pmremGen = new THREE.PMREMGenerator(renderer);+ pmremGen.compileEquirectangularShader();+ const envScene = new THREE.Scene();+ envScene.background = new THREE.Color(0x3a4550);+ const envLight1 = new THREE.DirectionalLight(0xffffff, 2);+ envLight1.position.set(1, 3, 2);+ envScene.add(envLight1);+ const envLight2 = new THREE.DirectionalLight(0x8899bb, 1);+ envLight2.position.set(-2, 1, -1);+ envScene.add(envLight2);+ const envRT = pmremGen.fromScene(envScene, 0.04);+ scene.environment = envRT.texture;++ const hemi = new THREE.HemisphereLight(0xe6edf3, 0xb3a699, 0.5);+ scene.add(hemi);+ const keyLight = new THREE.DirectionalLight(0xffffff, 1.5);+ keyLight.position.set(2, 5, 3);+ scene.add(keyLight);+ const fillLight = new THREE.DirectionalLight(0x8899aa, 0.5);+ fillLight.position.set(-3, 2, -2);+ scene.add(fillLight);+ const rimLight = new THREE.DirectionalLight(0x00b8b0, 0.3);+ rimLight.position.set(0, -1, 3);+ scene.add(rimLight);++ const S = 2.5; // Scale factor (0402 is tiny, so scale up more)++ const bodyMat = new THREE.MeshStandardMaterial({ color: 0x1a1a2e, metalness: 0.0, roughness: 0.45 });+ const termMat = new THREE.MeshStandardMaterial({ color: 0xc8ccd1, metalness: 1.0, roughness: 0.25,+ polygonOffset: true, polygonOffsetFactor: -1, polygonOffsetUnits: -1 });+ const padMat = new THREE.MeshStandardMaterial({ color: 0xc9a04c, metalness: 1.0, roughness: 0.22 });+ const pcbMat = new THREE.MeshStandardMaterial({ color: 0x0a2a0a, metalness: 0.0, roughness: 0.6 });++ // Body: 1.0 x 0.5 x 0.32 mm+ const bodyW = 1.0, bodyD = 0.5, bodyH = 0.32;+ const termW = 0.20;+ const innerW = bodyW - termW * 2 + 0.02;+ const body = new THREE.Mesh(new THREE.BoxGeometry(innerW*S, bodyH*S, bodyD*S), bodyMat);+ body.position.y = bodyH*S/2;+ scene.add(body);++ // Terminals — no polarity mark+ function makeTerminal(xSign) {+ const group = new THREE.Group();+ const front = new THREE.Mesh(new THREE.BoxGeometry(termW*S, bodyH*S, bodyD*S*0.99), termMat);+ front.position.set(xSign*(bodyW/2 - termW/2)*S, bodyH*S/2, 0);+ group.add(front);+ const bot = new THREE.Mesh(new THREE.BoxGeometry((termW+0.04)*S, 0.04*S, bodyD*S*0.99), termMat);+ bot.position.set(xSign*(bodyW/2 - termW/2)*S, 0.02*S, 0);+ group.add(bot);+ const top = new THREE.Mesh(new THREE.BoxGeometry((termW+0.04)*S, 0.04*S, bodyD*S*0.99), termMat);+ top.position.set(xSign*(bodyW/2 - termW/2)*S, (bodyH-0.02)*S, 0);+ group.add(top);+ return group;+ }+ scene.add(makeTerminal(-1));+ scene.add(makeTerminal(1));++ // PCB+ const pcb = new THREE.Mesh(new THREE.BoxGeometry(12*S, 0.08*S, 10*S), pcbMat);+ pcb.position.y = -0.04*S;+ scene.add(pcb);++ // Gold ENIG pads+ const pad1 = new THREE.Mesh(new THREE.BoxGeometry(0.4*S, 0.025*S, 0.5*S), padMat);+ pad1.position.set(-0.4*S, 0.005*S, 0);+ scene.add(pad1);+ const pad2 = new THREE.Mesh(new THREE.BoxGeometry(0.4*S, 0.025*S, 0.5*S), padMat);+ pad2.position.set(0.4*S, 0.005*S, 0);+ scene.add(pad2);++ // Grid+ const gridMat2 = new THREE.LineBasicMaterial({ color: 0x0d3d0d, transparent: true, opacity: 0.3 });+ for (let i = -10; i <= 10; i++) {+ const pts1 = [new THREE.Vector3(i*0.5*S, 0.045*S, -5*S), new THREE.Vector3(i*0.5*S, 0.045*S, 5*S)];+ scene.add(new THREE.Line(new THREE.BufferGeometry().setFromPoints(pts1), gridMat2));+ const pts2 = [new THREE.Vector3(-5*S, 0.045*S, i*0.5*S), new THREE.Vector3(5*S, 0.045*S, i*0.5*S)];+ scene.add(new THREE.Line(new THREE.BufferGeometry().setFromPoints(pts2), gridMat2));+ }++ // Camera orbit+ let isDragging = false, prevX = 0, prevY = 0;+ let theta = Math.PI/4, phi = Math.PI/5.5, radius = 4.5;+ const target = new THREE.Vector3(0, 0.3, 0);++ function updateCamera() {+ camera.position.x = radius * Math.sin(theta) * Math.cos(phi);+ camera.position.y = radius * Math.sin(phi) + target.y;+ camera.position.z = radius * Math.cos(theta) * Math.cos(phi);+ camera.lookAt(target);+ }+ updateCamera();++ canvas.addEventListener('mousedown', e => { isDragging = true; prevX = e.clientX; prevY = e.clientY; canvas.style.cursor = 'grabbing'; });+ window.addEventListener('mouseup', () => { isDragging = false; canvas.style.cursor = 'grab'; });+ canvas.addEventListener('mousemove', e => {+ if (!isDragging) return;+ theta -= (e.clientX - prevX) * 0.008;+ phi = Math.max(0.05, Math.min(Math.PI/2.2, phi + (e.clientY - prevY) * 0.008));+ prevX = e.clientX; prevY = e.clientY;+ updateCamera();+ });+ canvas.addEventListener('wheel', e => {+ e.preventDefault();+ radius = Math.max(2, Math.min(10, radius + e.deltaY * 0.004));+ updateCamera();+ }, { passive: false });++ function animate() { requestAnimationFrame(animate); renderer.render(scene, camera); }+ animate();+ }+++ // Derating chart tooltip+ (function() {+ const svg = document.getElementById('derating-chart');+ if (!svg) return;+ const ns = 'http://www.w3.org/2000/svg';++ // Key points on the derating curve: temp -> power %+ // -55C=100%, 70C=100%, 155C=0%+ function tempToX(t) { return 60 + (t - (-55)) / (170 - (-55)) * 600; }+ function pwrToY(pct) { return 220 - (pct / 120) * 200; }+ function getPower(t) {+ if (t <= 70) return 100;+ if (t >= 155) return 0;+ return 100 * (155 - t) / 85;+ }++ const dot = document.createElementNS(ns, 'circle');+ dot.setAttribute('r', '5');+ dot.setAttribute('fill', '#00b8b0');+ dot.setAttribute('stroke', '#0d1117');+ dot.setAttribute('stroke-width', '2');+ dot.style.display = 'none';+ dot.style.pointerEvents = 'none';+ svg.appendChild(dot);++ const vLine = document.createElementNS(ns, 'line');+ vLine.setAttribute('stroke', '#00b8b0');+ vLine.setAttribute('stroke-width', '0.5');+ vLine.setAttribute('stroke-dasharray', '3,3');+ vLine.setAttribute('opacity', '0.5');+ vLine.style.display = 'none';+ vLine.style.pointerEvents = 'none';+ svg.appendChild(vLine);++ const tipGroup = document.createElementNS(ns, 'g');+ tipGroup.style.display = 'none';+ tipGroup.style.pointerEvents = 'none';+ const tipBg = document.createElementNS(ns, 'rect');+ tipBg.setAttribute('rx', '4');+ tipBg.setAttribute('fill', '#161b22');+ tipBg.setAttribute('stroke', '#30363d');+ tipBg.setAttribute('stroke-width', '1');+ const tipLine1 = document.createElementNS(ns, 'text');+ tipLine1.setAttribute('font-family', 'JetBrains Mono, monospace');+ tipLine1.setAttribute('font-size', '10');+ tipLine1.setAttribute('fill', '#e6edf3');+ const tipLine2 = document.createElementNS(ns, 'text');+ tipLine2.setAttribute('font-family', 'JetBrains Mono, monospace');+ tipLine2.setAttribute('font-size', '10');+ tipLine2.setAttribute('fill', '#00b8b0');+ tipGroup.appendChild(tipBg);+ tipGroup.appendChild(tipLine1);+ tipGroup.appendChild(tipLine2);+ svg.appendChild(tipGroup);++ svg.addEventListener('mousemove', function(e) {+ const pt = svg.createSVGPoint();+ pt.x = e.clientX; pt.y = e.clientY;+ const svgPt = pt.matrixTransform(svg.getScreenCTM().inverse());++ const minX = tempToX(-55), maxX = tempToX(155);+ if (svgPt.x < minX - 10 || svgPt.x > maxX + 10) {+ dot.style.display = 'none'; tipGroup.style.display = 'none'; vLine.style.display = 'none';+ return;+ }++ // Convert SVG x back to temperature+ const temp = ((svgPt.x - 60) / 600) * (170 - (-55)) + (-55);+ const clampedTemp = Math.max(-55, Math.min(155, temp));+ const pwr = getPower(clampedTemp);+ const cx = tempToX(clampedTemp);+ const cy = pwrToY(pwr);++ dot.setAttribute('cx', cx);+ dot.setAttribute('cy', cy);+ dot.style.display = '';++ vLine.setAttribute('x1', cx); vLine.setAttribute('y1', cy);+ vLine.setAttribute('x2', cx); vLine.setAttribute('y2', 220);+ vLine.style.display = '';++ const xLabel = clampedTemp.toFixed(0) + String.fromCharCode(176) + 'C';+ const yLabel = 'Power: ' + pwr.toFixed(1) + '% (' + (pwr * 0.625).toFixed(1) + 'mW)';++ tipLine1.textContent = xLabel;+ tipLine2.textContent = yLabel;++ const tipX = cx + 12, tipY = cy - 28;+ const boxW = Math.max(xLabel.length, yLabel.length) * 7 + 16;+ const boxH = 32;+ const adjustedX = tipX + boxW > 660 ? cx - boxW - 12 : tipX;+ const adjustedY = tipY < 10 ? cy + 12 : tipY;++ tipBg.setAttribute('x', adjustedX); tipBg.setAttribute('y', adjustedY);+ tipBg.setAttribute('width', boxW); tipBg.setAttribute('height', boxH);+ tipLine1.setAttribute('x', adjustedX + 8); tipLine1.setAttribute('y', adjustedY + 13);+ tipLine2.setAttribute('x', adjustedX + 8); tipLine2.setAttribute('y', adjustedY + 26);+ tipGroup.style.display = '';+ });++ svg.addEventListener('mouseleave', function() {+ dot.style.display = 'none'; tipGroup.style.display = 'none'; vLine.style.display = 'none';+ });+ })();+++ // Reflow chart tooltip+ (function() {+ const svg = document.getElementById('reflow-chart');+ if (!svg) return;+ const ns = 'http://www.w3.org/2000/svg';++ const reflowStd = [+ {sx:80, sy:185, vx:0, vy:25},+ {sx:180, sy:145, vx:50, vy:150},+ {sx:300, sy:145, vx:170, vy:150},+ {sx:370, sy:90, vx:200, vy:220},+ {sx:420, sy:30, vx:220, vy:255},+ {sx:460, sy:30, vx:240, vy:255},+ {sx:500, sy:90, vx:260, vy:220},+ {sx:580, sy:145, vx:300, vy:150},+ {sx:660, sy:185, vx:360, vy:25},+ ];+ const reflowLim = [+ {sx:80, sy:185, vx:0, vy:25},+ {sx:180, sy:145, vx:50, vy:150},+ {sx:300, sy:145, vx:170, vy:150},+ {sx:360, sy:80, vx:195, vy:230},+ {sx:410, sy:18, vx:215, vy:260},+ {sx:470, sy:18, vx:240, vy:260},+ {sx:510, sy:80, vx:260, vy:230},+ {sx:580, sy:145, vx:300, vy:150},+ {sx:660, sy:185, vx:360, vy:25},+ ];++ const curves = [+ { data: reflowStd, color: '#d29922', label: 'Standard' },+ { data: reflowLim, color: '#f85149', label: 'Limit' },+ ];+ let activeIdx = 0;++ const dot = document.createElementNS(ns, 'circle');+ dot.setAttribute('r', '5');+ dot.setAttribute('stroke', '#0d1117');+ dot.setAttribute('stroke-width', '2');+ dot.style.display = 'none';+ dot.style.pointerEvents = 'none';+ svg.appendChild(dot);++ const vLine = document.createElementNS(ns, 'line');+ vLine.setAttribute('stroke-width', '0.5');+ vLine.setAttribute('stroke-dasharray', '3,3');+ vLine.setAttribute('opacity', '0.5');+ vLine.style.display = 'none';+ vLine.style.pointerEvents = 'none';+ svg.appendChild(vLine);++ const tipGroup = document.createElementNS(ns, 'g');+ tipGroup.style.display = 'none';+ tipGroup.style.pointerEvents = 'none';+ const tipBg = document.createElementNS(ns, 'rect');+ tipBg.setAttribute('rx', '4');+ tipBg.setAttribute('fill', '#161b22');+ tipBg.setAttribute('stroke', '#30363d');+ tipBg.setAttribute('stroke-width', '1');+ const tipLine1 = document.createElementNS(ns, 'text');+ tipLine1.setAttribute('font-family', 'JetBrains Mono, monospace');+ tipLine1.setAttribute('font-size', '10');+ tipLine1.setAttribute('fill', '#e6edf3');+ const tipLine2 = document.createElementNS(ns, 'text');+ tipLine2.setAttribute('font-family', 'JetBrains Mono, monospace');+ tipLine2.setAttribute('font-size', '10');+ const tipLine3 = document.createElementNS(ns, 'text');+ tipLine3.setAttribute('font-family', 'JetBrains Mono, monospace');+ tipLine3.setAttribute('font-size', '9');+ tipLine3.setAttribute('fill', '#484f58');+ tipGroup.appendChild(tipBg);+ tipGroup.appendChild(tipLine1);+ tipGroup.appendChild(tipLine2);+ tipGroup.appendChild(tipLine3);+ svg.appendChild(tipGroup);++ function setActive(idx) {+ activeIdx = idx;+ const c = curves[idx];+ dot.setAttribute('fill', c.color);+ vLine.setAttribute('stroke', c.color);+ tipLine2.setAttribute('fill', c.color);+ }+ setActive(0);++ function lerp(pts, svgX) {+ if (svgX <= pts[0].sx) return pts[0];+ if (svgX >= pts[pts.length-1].sx) return pts[pts.length-1];+ for (let i = 0; i < pts.length - 1; i++) {+ if (svgX >= pts[i].sx && svgX <= pts[i+1].sx) {+ const t = (svgX - pts[i].sx) / (pts[i+1].sx - pts[i].sx);+ return {+ sx: svgX,+ sy: pts[i].sy + t * (pts[i+1].sy - pts[i].sy),+ vx: pts[i].vx + t * (pts[i+1].vx - pts[i].vx),+ vy: pts[i].vy + t * (pts[i+1].vy - pts[i].vy),+ };+ }+ }+ return pts[0];+ }++ svg.addEventListener('click', function() { setActive((activeIdx + 1) % curves.length); });++ svg.addEventListener('mousemove', function(e) {+ const pt = svg.createSVGPoint();+ pt.x = e.clientX; pt.y = e.clientY;+ const svgPt = pt.matrixTransform(svg.getScreenCTM().inverse());+ const c = curves[activeIdx];+ const minX = c.data[0].sx, maxX = c.data[c.data.length-1].sx;+ if (svgPt.x < minX - 10 || svgPt.x > maxX + 10) {+ dot.style.display = 'none'; tipGroup.style.display = 'none'; vLine.style.display = 'none';+ return;+ }+ const p = lerp(c.data, svgPt.x);+ dot.setAttribute('cx', p.sx); dot.setAttribute('cy', p.sy); dot.style.display = '';+ vLine.setAttribute('x1', p.sx); vLine.setAttribute('y1', p.sy);+ vLine.setAttribute('x2', p.sx); vLine.setAttribute('y2', 195); vLine.style.display = '';++ const xLabel = p.vx.toFixed(0) + 's';+ const yLabel = 'Temp = ' + p.vy.toFixed(0) + String.fromCharCode(176) + 'C';+ const curveLabel = 'Click to switch ' + String.fromCharCode(8226) + ' ' + c.label;+ tipLine1.textContent = xLabel;+ tipLine2.textContent = yLabel;+ tipLine3.textContent = curveLabel;++ const tipX = p.sx + 12, tipY = p.sy - 38;+ const boxW = Math.max(xLabel.length, yLabel.length, curveLabel.length) * 6.5 + 16;+ const boxH = 44;+ const adjustedX = tipX + boxW > 660 ? p.sx - boxW - 12 : tipX;+ const adjustedY = tipY < 10 ? p.sy + 12 : tipY;++ tipBg.setAttribute('x', adjustedX); tipBg.setAttribute('y', adjustedY);+ tipBg.setAttribute('width', boxW); tipBg.setAttribute('height', boxH);+ tipLine1.setAttribute('x', adjustedX + 8); tipLine1.setAttribute('y', adjustedY + 13);+ tipLine2.setAttribute('x', adjustedX + 8); tipLine2.setAttribute('y', adjustedY + 26);+ tipLine3.setAttribute('x', adjustedX + 8); tipLine3.setAttribute('y', adjustedY + 39);+ tipGroup.style.display = '';+ });++ svg.addEventListener('mouseleave', function() {+ dot.style.display = 'none'; tipGroup.style.display = 'none'; vLine.style.display = 'none';+ });++ svg.style.cursor = 'pointer';+ })();++})();+</script>+</div>+</body>+</html>
CR0402-FX-4702GLF.kicad_modadded+15@@ -0,0 +1,15 @@+(footprint "CR0402-FX-4702GLF"+ (version 20240108)+ (generator "adom-footprint")+ (layer "F.Cu")+ (descr "Bourns · Thick Film Chip Resistor · General Purpose")+ (attr smd)+ (fp_text reference "REF**" (at 0 -2.8)+ (layer "F.SilkS") (effects (font (size 1 1) (thickness 0.15))))+ (fp_text value "CR0402-FX-4702GLF" (at 0 2.8)+ (layer "F.Fab") (effects (font (size 1 1) (thickness 0.15))))+ (pad "1" smd roundrect (at -0.5 0) (size 0.6 0.5)+ (layers F.Cu,F.Paste,F.Mask) (roundrect_rratio 0.25))+ (pad "2" smd roundrect (at 0.5 0) (size 0.6 0.5)+ (layers F.Cu,F.Paste,F.Mask) (roundrect_rratio 0.25))+)
CR0402-FX-4702GLF.kicad_symadded+90@@ -0,0 +1,90 @@+(kicad_symbol_lib+ (version 20231120)+ (generator "adom")+ (symbol "CR0402-FX-4702GLF"+ (pin_numbers (hide yes))+ (pin_names (offset 0) (hide yes))+ (exclude_from_sim no)+ (in_bom yes)+ (on_board yes)+ (property "Reference" "R"+ (at 2.032 0 90)+ (effects+ (font+ (size 1.27 1.27)+ )+ )+ )+ (property "Value" "CR0402-FX-4702GLF"+ (at 0 0 90)+ (effects+ (font+ (size 1.27 1.27)+ )+ )+ )+ (property "Footprint" ""+ (at 0 0 0)+ (effects (font (size 1.27 1.27)) (hide yes))+ )+ (property "Datasheet" "~"+ (at 0 0 0)+ (effects (font (size 1.27 1.27)) (hide yes))+ )+ (property "Description" "Resistor"+ (at 0 0 0)+ (effects (font (size 1.27 1.27)) (hide yes))+ )+ (symbol "CR0402-FX-4702GLF_0_1"+ (rectangle+ (start -1.016 -2.54)+ (end 1.016 2.54)+ (stroke+ (width 0.254)+ (type default)+ )+ (fill+ (type none)+ )+ )+ )+ (symbol "CR0402-FX-4702GLF_1_1"+ (pin passive line+ (at 0 3.81 270)+ (length 1.27)+ (name "~"+ (effects+ (font+ (size 1.27 1.27)+ )+ )+ )+ (number "1"+ (effects+ (font+ (size 1.27 1.27)+ )+ )+ )+ )+ (pin passive line+ (at 0 -3.81 90)+ (length 1.27)+ (name "~"+ (effects+ (font+ (size 1.27 1.27)+ )+ )+ )+ (number "2"+ (effects+ (font+ (size 1.27 1.27)+ )+ )+ )+ )+ )+ )+)
CR0402-FX-4702GLF.lbradded+83@@ -0,0 +1,83 @@+<?xml version="1.0" encoding="utf-8"?>+<!DOCTYPE eagle SYSTEM "eagle.dtd">+<eagle version="9.6.2">+<drawing>+<settings><setting alwaysvectorfont="no"/></settings>+<grid distance="0.1" unitdist="inch" unit="inch" style="lines" multiple="1" display="no" altdistance="0.01" altunitdist="inch" altunit="inch"/>+<layers>+<layer number="1" name="Top" color="4" fill="1" visible="yes" active="yes"/>+<layer number="16" name="Bottom" color="1" fill="1" visible="yes" active="yes"/>+<layer number="17" name="Pads" color="2" fill="1" visible="yes" active="yes"/>+<layer number="18" name="Vias" color="2" fill="1" visible="yes" active="yes"/>+<layer number="19" name="Unrouted" color="6" fill="1" visible="yes" active="yes"/>+<layer number="20" name="Dimension" color="15" fill="1" visible="yes" active="yes"/>+<layer number="21" name="tPlace" color="7" fill="1" visible="yes" active="yes"/>+<layer number="22" name="bPlace" color="7" fill="1" visible="yes" active="yes"/>+<layer number="23" name="tOrigins" color="15" fill="1" visible="yes" active="yes"/>+<layer number="24" name="bOrigins" color="15" fill="1" visible="yes" active="yes"/>+<layer number="25" name="tNames" color="7" fill="1" visible="yes" active="yes"/>+<layer number="26" name="bNames" color="7" fill="1" visible="yes" active="yes"/>+<layer number="27" name="tValues" color="7" fill="1" visible="yes" active="yes"/>+<layer number="28" name="bValues" color="7" fill="1" visible="yes" active="yes"/>+<layer number="29" name="tStop" color="7" fill="3" visible="no" active="yes"/>+<layer number="30" name="bStop" color="7" fill="6" visible="no" active="yes"/>+<layer number="31" name="tCream" color="7" fill="4" visible="no" active="yes"/>+<layer number="32" name="bCream" color="7" fill="5" visible="no" active="yes"/>+<layer number="33" name="tFinish" color="6" fill="3" visible="no" active="yes"/>+<layer number="34" name="bFinish" color="6" fill="6" visible="no" active="yes"/>+<layer number="35" name="tGlue" color="7" fill="4" visible="no" active="yes"/>+<layer number="36" name="bGlue" color="7" fill="5" visible="no" active="yes"/>+<layer number="37" name="tTest" color="7" fill="1" visible="no" active="yes"/>+<layer number="38" name="bTest" color="7" fill="1" visible="no" active="yes"/>+<layer number="39" name="tKeepout" color="4" fill="11" visible="no" active="yes"/>+<layer number="40" name="bKeepout" color="1" fill="11" visible="no" active="yes"/>+<layer number="41" name="tRestrict" color="4" fill="10" visible="no" active="yes"/>+<layer number="42" name="bRestrict" color="1" fill="10" visible="no" active="yes"/>+<layer number="43" name="vRestrict" color="2" fill="10" visible="no" active="yes"/>+<layer number="44" name="Drills" color="7" fill="1" visible="no" active="yes"/>+<layer number="45" name="Holes" color="7" fill="1" visible="no" active="yes"/>+<layer number="46" name="Milling" color="3" fill="1" visible="no" active="yes"/>+<layer number="47" name="Measures" color="7" fill="1" visible="no" active="yes"/>+<layer number="48" name="Document" color="7" fill="1" visible="yes" active="yes"/>+<layer number="49" name="Reference" color="7" fill="1" visible="yes" active="yes"/>+<layer number="91" name="Nets" color="2" fill="1" visible="yes" active="yes"/>+<layer number="92" name="Busses" color="1" fill="1" visible="yes" active="yes"/>+<layer number="93" name="Pins" color="2" fill="1" visible="no" active="yes"/>+<layer number="94" name="Symbols" color="4" fill="1" visible="yes" active="yes"/>+<layer number="95" name="Names" color="7" fill="1" visible="yes" active="yes"/>+<layer number="96" name="Values" color="7" fill="1" visible="yes" active="yes"/>+<layer number="97" name="Info" color="7" fill="1" visible="yes" active="yes"/>+<layer number="98" name="Guide" color="6" fill="1" visible="yes" active="yes"/>+</layers>+<library>+<description>CR0402-FX-4702GLF — 47kΩ 0402 — Bourns</description>+<packages></packages>+<symbols>+<symbol name="CR0402-FX-4702GLF">+ <wire x1="-1.016" y1="2.54" x2="1.016" y2="2.54" width="0.254" layer="94"/>+ <wire x1="1.016" y1="2.54" x2="1.016" y2="-2.54" width="0.254" layer="94"/>+ <wire x1="1.016" y1="-2.54" x2="-1.016" y2="-2.54" width="0.254" layer="94"/>+ <wire x1="-1.016" y1="-2.54" x2="-1.016" y2="2.54" width="0.254" layer="94"/>+ <text x="0" y="5.08" size="1.27" layer="95" align="bottom-center">>NAME</text>+ <text x="0" y="-5.08" size="1.27" layer="96" align="top-center">>VALUE</text>+ <pin name="1" x="0" y="3.81" length="middle" direction="pas" rot="R270"/>+ <pin name="2" x="0" y="-3.81" length="middle" direction="pas" rot="R90"/>+</symbol>+</symbols>+<devicesets>+<deviceset name="CR0402-FX-4702GLF" prefix="R">+ <description>47kΩ 0402 — Bourns</description>+ <gates>+ <gate name="G$1" symbol="CR0402-FX-4702GLF" x="0" y="0"/>+ </gates>+ <devices>+ <device name="">+ <connects/>+ <technologies><technology name=""/></technologies>+ </device>+ </devices>+</deviceset>+</devicesets>+</library>+</drawing>+</eagle>
CR0402-FX-4702GLF.stepadded+1049@@ -0,0 +1,1049 @@+ISO-10303-21;+HEADER;+/* R_0402_1005Metric.step 3D STEP model for use in ECAD systems+ * Copyright (C) 2018, kicad StepUp+ * + * This work is licensed under the [Creative Commons CC-BY-SA 4.0 License](https://creativecommons.org/licenses/by-sa/4.0/legalcode), + * with the following exception:+ * To the extent that the creation of electronic designs that use 'Licensed Material' can be considered to be 'Adapted Material', + * then the copyright holder waives article 3 of the license with respect to these designs and any generated files which use data provided + * as part of the 'Licensed Material'.+ * You are free to use the library data in your own projects without the obligation to share your project files under this or any other license agreement.+ * However, if you wish to redistribute these libraries, or parts thereof (including in modified form) as a collection then the exception above does not apply. + * Please refer to https://github.com/KiCad/kicad-packages3D/blob/master/LICENSE.md for further clarification of the exception.+ * Disclaimer of Warranties and Limitation of Liability.+ * These libraries are provided in the hope that they will be useful, but are provided without warranty of any kind, express or implied.+ * *USE 3D CAD DATA AT YOUR OWN RISK*+ * *DO NOT RELY UPON ANY INFORMATION FOUND HERE WITHOUT INDEPENDENT VERIFICATION.*+ * + */++FILE_DESCRIPTION(+/* description */ ('model of R_0402_1005Metric'),+/* implementation_level */ '2;1');++FILE_NAME(+/* name */ 'R_0402_1005Metric.step',+/* time_stamp */ '2018-01-04T00:45:35',+/* author */ ('kicad StepUp','ksu'),+/* organization */ ('FreeCAD'),+/* preprocessor_version */ 'OCC',+/* originating_system */ 'kicad StepUp',+/* authorisation */ '');++FILE_SCHEMA(('AUTOMOTIVE_DESIGN { 1 0 10303 214 1 1 1 1 }'));+ENDSEC;++DATA;+#1 = APPLICATION_PROTOCOL_DEFINITION('international standard',+'automotive_design',2000,#2);+#2 = APPLICATION_CONTEXT(+'core data for automotive mechanical design processes');+#3 = SHAPE_DEFINITION_REPRESENTATION(#4,#10);+#4 = PRODUCT_DEFINITION_SHAPE('','',#5);+#5 = PRODUCT_DEFINITION('design','',#6,#9);+#6 = PRODUCT_DEFINITION_FORMATION('','',#7);+#7 = PRODUCT('R_0402_1005Metric','R_0402_1005Metric','',(#8));+#8 = PRODUCT_CONTEXT('',#2,'mechanical');+#9 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design');+#10 = ADVANCED_BREP_SHAPE_REPRESENTATION('',(#11,#15),#805);+#11 = AXIS2_PLACEMENT_3D('',#12,#13,#14);+#12 = CARTESIAN_POINT('',(0.,0.,0.));+#13 = DIRECTION('',(0.,0.,1.));+#14 = DIRECTION('',(1.,0.,-0.));+#15 = MANIFOLD_SOLID_BREP('',#16);+#16 = CLOSED_SHELL('',(#17,#57,#140,#165,#190,#257,#274,#291,#340,#357,+#374,#423,#440,#509,#540,#564,#633,#657,#674,#691,#708,#725,#742,+#759,#776,#793));+#17 = ADVANCED_FACE('',(#18),#52,.F.);+#18 = FACE_BOUND('',#19,.F.);+#19 = EDGE_LOOP('',(#20,#30,#38,#46));+#20 = ORIENTED_EDGE('',*,*,#21,.F.);+#21 = EDGE_CURVE('',#22,#24,#26,.T.);+#22 = VERTEX_POINT('',#23);+#23 = CARTESIAN_POINT('',(-0.5,-0.25,3.5E-02));+#24 = VERTEX_POINT('',#25);+#25 = CARTESIAN_POINT('',(-0.5,-0.25,0.315));+#26 = LINE('',#27,#28);+#27 = CARTESIAN_POINT('',(-0.5,-0.25,0.));+#28 = VECTOR('',#29,1.);+#29 = DIRECTION('',(0.,0.,1.));+#30 = ORIENTED_EDGE('',*,*,#31,.T.);+#31 = EDGE_CURVE('',#22,#32,#34,.T.);+#32 = VERTEX_POINT('',#33);+#33 = CARTESIAN_POINT('',(-0.5,0.25,3.5E-02));+#34 = LINE('',#35,#36);+#35 = CARTESIAN_POINT('',(-0.5,-0.25,3.5E-02));+#36 = VECTOR('',#37,1.);+#37 = DIRECTION('',(0.,1.,0.));+#38 = ORIENTED_EDGE('',*,*,#39,.T.);+#39 = EDGE_CURVE('',#32,#40,#42,.T.);+#40 = VERTEX_POINT('',#41);+#41 = CARTESIAN_POINT('',(-0.5,0.25,0.315));+#42 = LINE('',#43,#44);+#43 = CARTESIAN_POINT('',(-0.5,0.25,0.));+#44 = VECTOR('',#45,1.);+#45 = DIRECTION('',(0.,0.,1.));+#46 = ORIENTED_EDGE('',*,*,#47,.F.);+#47 = EDGE_CURVE('',#24,#40,#48,.T.);+#48 = LINE('',#49,#50);+#49 = CARTESIAN_POINT('',(-0.5,-0.25,0.315));+#50 = VECTOR('',#51,1.);+#51 = DIRECTION('',(0.,1.,0.));+#52 = PLANE('',#53);+#53 = AXIS2_PLACEMENT_3D('',#54,#55,#56);+#54 = CARTESIAN_POINT('',(-0.5,-0.25,0.));+#55 = DIRECTION('',(1.,0.,0.));+#56 = DIRECTION('',(0.,0.,1.));+#57 = ADVANCED_FACE('',(#58),#135,.F.);+#58 = FACE_BOUND('',#59,.F.);+#59 = EDGE_LOOP('',(#60,#70,#77,#78,#87,#95,#104,#112,#120,#128));+#60 = ORIENTED_EDGE('',*,*,#61,.F.);+#61 = EDGE_CURVE('',#62,#64,#66,.T.);+#62 = VERTEX_POINT('',#63);+#63 = CARTESIAN_POINT('',(-0.465,-0.25,-2.775557561563E-17));+#64 = VERTEX_POINT('',#65);+#65 = CARTESIAN_POINT('',(-0.335,-0.25,-2.775557561563E-17));+#66 = LINE('',#67,#68);+#67 = CARTESIAN_POINT('',(-0.5,-0.25,0.));+#68 = VECTOR('',#69,1.);+#69 = DIRECTION('',(1.,0.,0.));+#70 = ORIENTED_EDGE('',*,*,#71,.F.);+#71 = EDGE_CURVE('',#22,#62,#72,.T.);+#72 = CIRCLE('',#73,3.5E-02);+#73 = AXIS2_PLACEMENT_3D('',#74,#75,#76);+#74 = CARTESIAN_POINT('',(-0.465,-0.25,3.5E-02));+#75 = DIRECTION('',(0.,-1.,0.));+#76 = DIRECTION('',(0.,0.,1.));+#77 = ORIENTED_EDGE('',*,*,#21,.T.);+#78 = ORIENTED_EDGE('',*,*,#79,.T.);+#79 = EDGE_CURVE('',#24,#80,#82,.T.);+#80 = VERTEX_POINT('',#81);+#81 = CARTESIAN_POINT('',(-0.465,-0.25,0.35));+#82 = CIRCLE('',#83,3.5E-02);+#83 = AXIS2_PLACEMENT_3D('',#84,#85,#86);+#84 = CARTESIAN_POINT('',(-0.465,-0.25,0.315));+#85 = DIRECTION('',(0.,1.,0.));+#86 = DIRECTION('',(0.,0.,1.));+#87 = ORIENTED_EDGE('',*,*,#88,.T.);+#88 = EDGE_CURVE('',#80,#89,#91,.T.);+#89 = VERTEX_POINT('',#90);+#90 = CARTESIAN_POINT('',(-0.335,-0.25,0.35));+#91 = LINE('',#92,#93);+#92 = CARTESIAN_POINT('',(-0.5,-0.25,0.35));+#93 = VECTOR('',#94,1.);+#94 = DIRECTION('',(1.,0.,0.));+#95 = ORIENTED_EDGE('',*,*,#96,.F.);+#96 = EDGE_CURVE('',#97,#89,#99,.T.);+#97 = VERTEX_POINT('',#98);+#98 = CARTESIAN_POINT('',(-0.3,-0.25,0.315));+#99 = CIRCLE('',#100,3.5E-02);+#100 = AXIS2_PLACEMENT_3D('',#101,#102,#103);+#101 = CARTESIAN_POINT('',(-0.335,-0.25,0.315));+#102 = DIRECTION('',(0.,-1.,0.));+#103 = DIRECTION('',(0.,0.,1.));+#104 = ORIENTED_EDGE('',*,*,#105,.F.);+#105 = EDGE_CURVE('',#106,#97,#108,.T.);+#106 = VERTEX_POINT('',#107);+#107 = CARTESIAN_POINT('',(-0.465,-0.25,0.315));+#108 = LINE('',#109,#110);+#109 = CARTESIAN_POINT('',(-0.465,-0.25,0.315));+#110 = VECTOR('',#111,1.);+#111 = DIRECTION('',(1.,0.,0.));+#112 = ORIENTED_EDGE('',*,*,#113,.F.);+#113 = EDGE_CURVE('',#114,#106,#116,.T.);+#114 = VERTEX_POINT('',#115);+#115 = CARTESIAN_POINT('',(-0.465,-0.25,3.5E-02));+#116 = LINE('',#117,#118);+#117 = CARTESIAN_POINT('',(-0.465,-0.25,3.5E-02));+#118 = VECTOR('',#119,1.);+#119 = DIRECTION('',(0.,0.,1.));+#120 = ORIENTED_EDGE('',*,*,#121,.T.);+#121 = EDGE_CURVE('',#114,#122,#124,.T.);+#122 = VERTEX_POINT('',#123);+#123 = CARTESIAN_POINT('',(-0.3,-0.25,3.5E-02));+#124 = LINE('',#125,#126);+#125 = CARTESIAN_POINT('',(-0.465,-0.25,3.5E-02));+#126 = VECTOR('',#127,1.);+#127 = DIRECTION('',(1.,0.,0.));+#128 = ORIENTED_EDGE('',*,*,#129,.T.);+#129 = EDGE_CURVE('',#122,#64,#130,.T.);+#130 = CIRCLE('',#131,3.5E-02);+#131 = AXIS2_PLACEMENT_3D('',#132,#133,#134);+#132 = CARTESIAN_POINT('',(-0.335,-0.25,3.5E-02));+#133 = DIRECTION('',(0.,1.,0.));+#134 = DIRECTION('',(0.,0.,1.));+#135 = PLANE('',#136);+#136 = AXIS2_PLACEMENT_3D('',#137,#138,#139);+#137 = CARTESIAN_POINT('',(-0.5,-0.25,0.));+#138 = DIRECTION('',(0.,1.,0.));+#139 = DIRECTION('',(0.,0.,1.));+#140 = ADVANCED_FACE('',(#141),#160,.T.);+#141 = FACE_BOUND('',#142,.F.);+#142 = EDGE_LOOP('',(#143,#144,#152,#159));+#143 = ORIENTED_EDGE('',*,*,#71,.T.);+#144 = ORIENTED_EDGE('',*,*,#145,.T.);+#145 = EDGE_CURVE('',#62,#146,#148,.T.);+#146 = VERTEX_POINT('',#147);+#147 = CARTESIAN_POINT('',(-0.465,0.25,-2.775557561563E-17));+#148 = LINE('',#149,#150);+#149 = CARTESIAN_POINT('',(-0.465,-0.25,-2.775557561563E-17));+#150 = VECTOR('',#151,1.);+#151 = DIRECTION('',(0.,1.,0.));+#152 = ORIENTED_EDGE('',*,*,#153,.F.);+#153 = EDGE_CURVE('',#32,#146,#154,.T.);+#154 = CIRCLE('',#155,3.5E-02);+#155 = AXIS2_PLACEMENT_3D('',#156,#157,#158);+#156 = CARTESIAN_POINT('',(-0.465,0.25,3.5E-02));+#157 = DIRECTION('',(0.,-1.,0.));+#158 = DIRECTION('',(0.,0.,1.));+#159 = ORIENTED_EDGE('',*,*,#31,.F.);+#160 = CYLINDRICAL_SURFACE('',#161,3.5E-02);+#161 = AXIS2_PLACEMENT_3D('',#162,#163,#164);+#162 = CARTESIAN_POINT('',(-0.465,-0.25,3.5E-02));+#163 = DIRECTION('',(0.,1.,0.));+#164 = DIRECTION('',(-1.,0.,0.));+#165 = ADVANCED_FACE('',(#166),#185,.T.);+#166 = FACE_BOUND('',#167,.T.);+#167 = EDGE_LOOP('',(#168,#169,#177,#184));+#168 = ORIENTED_EDGE('',*,*,#79,.T.);+#169 = ORIENTED_EDGE('',*,*,#170,.T.);+#170 = EDGE_CURVE('',#80,#171,#173,.T.);+#171 = VERTEX_POINT('',#172);+#172 = CARTESIAN_POINT('',(-0.465,0.25,0.35));+#173 = LINE('',#174,#175);+#174 = CARTESIAN_POINT('',(-0.465,-0.25,0.35));+#175 = VECTOR('',#176,1.);+#176 = DIRECTION('',(0.,1.,0.));+#177 = ORIENTED_EDGE('',*,*,#178,.F.);+#178 = EDGE_CURVE('',#40,#171,#179,.T.);+#179 = CIRCLE('',#180,3.5E-02);+#180 = AXIS2_PLACEMENT_3D('',#181,#182,#183);+#181 = CARTESIAN_POINT('',(-0.465,0.25,0.315));+#182 = DIRECTION('',(0.,1.,0.));+#183 = DIRECTION('',(0.,0.,1.));+#184 = ORIENTED_EDGE('',*,*,#47,.F.);+#185 = CYLINDRICAL_SURFACE('',#186,3.5E-02);+#186 = AXIS2_PLACEMENT_3D('',#187,#188,#189);+#187 = CARTESIAN_POINT('',(-0.465,-0.25,0.315));+#188 = DIRECTION('',(0.,1.,0.));+#189 = DIRECTION('',(-1.,0.,0.));+#190 = ADVANCED_FACE('',(#191),#252,.T.);+#191 = FACE_BOUND('',#192,.T.);+#192 = EDGE_LOOP('',(#193,#201,#202,#203,#204,#212,#221,#229,#237,#245)+);+#193 = ORIENTED_EDGE('',*,*,#194,.F.);+#194 = EDGE_CURVE('',#146,#195,#197,.T.);+#195 = VERTEX_POINT('',#196);+#196 = CARTESIAN_POINT('',(-0.335,0.25,-2.775557561563E-17));+#197 = LINE('',#198,#199);+#198 = CARTESIAN_POINT('',(-0.5,0.25,0.));+#199 = VECTOR('',#200,1.);+#200 = DIRECTION('',(1.,0.,0.));+#201 = ORIENTED_EDGE('',*,*,#153,.F.);+#202 = ORIENTED_EDGE('',*,*,#39,.T.);+#203 = ORIENTED_EDGE('',*,*,#178,.T.);+#204 = ORIENTED_EDGE('',*,*,#205,.T.);+#205 = EDGE_CURVE('',#171,#206,#208,.T.);+#206 = VERTEX_POINT('',#207);+#207 = CARTESIAN_POINT('',(-0.335,0.25,0.35));+#208 = LINE('',#209,#210);+#209 = CARTESIAN_POINT('',(-0.5,0.25,0.35));+#210 = VECTOR('',#211,1.);+#211 = DIRECTION('',(1.,0.,0.));+#212 = ORIENTED_EDGE('',*,*,#213,.F.);+#213 = EDGE_CURVE('',#214,#206,#216,.T.);+#214 = VERTEX_POINT('',#215);+#215 = CARTESIAN_POINT('',(-0.3,0.25,0.315));+#216 = CIRCLE('',#217,3.5E-02);+#217 = AXIS2_PLACEMENT_3D('',#218,#219,#220);+#218 = CARTESIAN_POINT('',(-0.335,0.25,0.315));+#219 = DIRECTION('',(0.,-1.,0.));+#220 = DIRECTION('',(0.,0.,1.));+#221 = ORIENTED_EDGE('',*,*,#222,.F.);+#222 = EDGE_CURVE('',#223,#214,#225,.T.);+#223 = VERTEX_POINT('',#224);+#224 = CARTESIAN_POINT('',(-0.465,0.25,0.315));+#225 = LINE('',#226,#227);+#226 = CARTESIAN_POINT('',(-0.465,0.25,0.315));+#227 = VECTOR('',#228,1.);+#228 = DIRECTION('',(1.,0.,0.));+#229 = ORIENTED_EDGE('',*,*,#230,.F.);+#230 = EDGE_CURVE('',#231,#223,#233,.T.);+#231 = VERTEX_POINT('',#232);+#232 = CARTESIAN_POINT('',(-0.465,0.25,3.5E-02));+#233 = LINE('',#234,#235);+#234 = CARTESIAN_POINT('',(-0.465,0.25,3.5E-02));+#235 = VECTOR('',#236,1.);+#236 = DIRECTION('',(0.,0.,1.));+#237 = ORIENTED_EDGE('',*,*,#238,.T.);+#238 = EDGE_CURVE('',#231,#239,#241,.T.);+#239 = VERTEX_POINT('',#240);+#240 = CARTESIAN_POINT('',(-0.3,0.25,3.5E-02));+#241 = LINE('',#242,#243);+#242 = CARTESIAN_POINT('',(-0.465,0.25,3.5E-02));+#243 = VECTOR('',#244,1.);+#244 = DIRECTION('',(1.,0.,0.));+#245 = ORIENTED_EDGE('',*,*,#246,.T.);+#246 = EDGE_CURVE('',#239,#195,#247,.T.);+#247 = CIRCLE('',#248,3.5E-02);+#248 = AXIS2_PLACEMENT_3D('',#249,#250,#251);+#249 = CARTESIAN_POINT('',(-0.335,0.25,3.5E-02));+#250 = DIRECTION('',(0.,1.,0.));+#251 = DIRECTION('',(0.,0.,1.));+#252 = PLANE('',#253);+#253 = AXIS2_PLACEMENT_3D('',#254,#255,#256);+#254 = CARTESIAN_POINT('',(-0.5,0.25,0.));+#255 = DIRECTION('',(0.,1.,0.));+#256 = DIRECTION('',(0.,0.,1.));+#257 = ADVANCED_FACE('',(#258),#269,.F.);+#258 = FACE_BOUND('',#259,.F.);+#259 = EDGE_LOOP('',(#260,#261,#262,#263));+#260 = ORIENTED_EDGE('',*,*,#194,.F.);+#261 = ORIENTED_EDGE('',*,*,#145,.F.);+#262 = ORIENTED_EDGE('',*,*,#61,.T.);+#263 = ORIENTED_EDGE('',*,*,#264,.T.);+#264 = EDGE_CURVE('',#64,#195,#265,.T.);+#265 = LINE('',#266,#267);+#266 = CARTESIAN_POINT('',(-0.335,-0.25,-2.775557561563E-17));+#267 = VECTOR('',#268,1.);+#268 = DIRECTION('',(0.,1.,0.));+#269 = PLANE('',#270);+#270 = AXIS2_PLACEMENT_3D('',#271,#272,#273);+#271 = CARTESIAN_POINT('',(-0.5,-0.25,0.));+#272 = DIRECTION('',(0.,0.,1.));+#273 = DIRECTION('',(1.,0.,0.));+#274 = ADVANCED_FACE('',(#275),#286,.T.);+#275 = FACE_BOUND('',#276,.T.);+#276 = EDGE_LOOP('',(#277,#278,#279,#280));+#277 = ORIENTED_EDGE('',*,*,#129,.T.);+#278 = ORIENTED_EDGE('',*,*,#264,.T.);+#279 = ORIENTED_EDGE('',*,*,#246,.F.);+#280 = ORIENTED_EDGE('',*,*,#281,.F.);+#281 = EDGE_CURVE('',#122,#239,#282,.T.);+#282 = LINE('',#283,#284);+#283 = CARTESIAN_POINT('',(-0.3,-0.25,3.5E-02));+#284 = VECTOR('',#285,1.);+#285 = DIRECTION('',(0.,1.,0.));+#286 = CYLINDRICAL_SURFACE('',#287,3.5E-02);+#287 = AXIS2_PLACEMENT_3D('',#288,#289,#290);+#288 = CARTESIAN_POINT('',(-0.335,-0.25,3.5E-02));+#289 = DIRECTION('',(0.,1.,0.));+#290 = DIRECTION('',(1.,0.,0.));+#291 = ADVANCED_FACE('',(#292),#335,.F.);+#292 = FACE_BOUND('',#293,.F.);+#293 = EDGE_LOOP('',(#294,#295,#296,#297,#305,#313,#321,#329));+#294 = ORIENTED_EDGE('',*,*,#121,.F.);+#295 = ORIENTED_EDGE('',*,*,#113,.T.);+#296 = ORIENTED_EDGE('',*,*,#105,.T.);+#297 = ORIENTED_EDGE('',*,*,#298,.T.);+#298 = EDGE_CURVE('',#97,#299,#301,.T.);+#299 = VERTEX_POINT('',#300);+#300 = CARTESIAN_POINT('',(0.3,-0.25,0.315));+#301 = LINE('',#302,#303);+#302 = CARTESIAN_POINT('',(-0.3,-0.25,0.315));+#303 = VECTOR('',#304,1.);+#304 = DIRECTION('',(1.,0.,0.));+#305 = ORIENTED_EDGE('',*,*,#306,.T.);+#306 = EDGE_CURVE('',#299,#307,#309,.T.);+#307 = VERTEX_POINT('',#308);+#308 = CARTESIAN_POINT('',(0.465,-0.25,0.315));+#309 = LINE('',#310,#311);+#310 = CARTESIAN_POINT('',(-0.465,-0.25,0.315));+#311 = VECTOR('',#312,1.);+#312 = DIRECTION('',(1.,0.,0.));+#313 = ORIENTED_EDGE('',*,*,#314,.F.);+#314 = EDGE_CURVE('',#315,#307,#317,.T.);+#315 = VERTEX_POINT('',#316);+#316 = CARTESIAN_POINT('',(0.465,-0.25,3.5E-02));+#317 = LINE('',#318,#319);+#318 = CARTESIAN_POINT('',(0.465,-0.25,3.5E-02));+#319 = VECTOR('',#320,1.);+#320 = DIRECTION('',(0.,0.,1.));+#321 = ORIENTED_EDGE('',*,*,#322,.F.);+#322 = EDGE_CURVE('',#323,#315,#325,.T.);+#323 = VERTEX_POINT('',#324);+#324 = CARTESIAN_POINT('',(0.3,-0.25,3.5E-02));+#325 = LINE('',#326,#327);+#326 = CARTESIAN_POINT('',(-0.465,-0.25,3.5E-02));+#327 = VECTOR('',#328,1.);+#328 = DIRECTION('',(1.,0.,0.));+#329 = ORIENTED_EDGE('',*,*,#330,.F.);+#330 = EDGE_CURVE('',#122,#323,#331,.T.);+#331 = LINE('',#332,#333);+#332 = CARTESIAN_POINT('',(-0.465,-0.25,3.5E-02));+#333 = VECTOR('',#334,1.);+#334 = DIRECTION('',(1.,0.,0.));+#335 = PLANE('',#336);+#336 = AXIS2_PLACEMENT_3D('',#337,#338,#339);+#337 = CARTESIAN_POINT('',(-0.465,-0.25,3.5E-02));+#338 = DIRECTION('',(0.,1.,0.));+#339 = DIRECTION('',(0.,0.,1.));+#340 = ADVANCED_FACE('',(#341),#352,.T.);+#341 = FACE_BOUND('',#342,.T.);+#342 = EDGE_LOOP('',(#343,#344,#345,#346));+#343 = ORIENTED_EDGE('',*,*,#205,.F.);+#344 = ORIENTED_EDGE('',*,*,#170,.F.);+#345 = ORIENTED_EDGE('',*,*,#88,.T.);+#346 = ORIENTED_EDGE('',*,*,#347,.T.);+#347 = EDGE_CURVE('',#89,#206,#348,.T.);+#348 = LINE('',#349,#350);+#349 = CARTESIAN_POINT('',(-0.335,-0.25,0.35));+#350 = VECTOR('',#351,1.);+#351 = DIRECTION('',(0.,1.,0.));+#352 = PLANE('',#353);+#353 = AXIS2_PLACEMENT_3D('',#354,#355,#356);+#354 = CARTESIAN_POINT('',(-0.5,-0.25,0.35));+#355 = DIRECTION('',(0.,0.,1.));+#356 = DIRECTION('',(1.,0.,0.));+#357 = ADVANCED_FACE('',(#358),#369,.T.);+#358 = FACE_BOUND('',#359,.F.);+#359 = EDGE_LOOP('',(#360,#361,#362,#363));+#360 = ORIENTED_EDGE('',*,*,#96,.T.);+#361 = ORIENTED_EDGE('',*,*,#347,.T.);+#362 = ORIENTED_EDGE('',*,*,#213,.F.);+#363 = ORIENTED_EDGE('',*,*,#364,.F.);+#364 = EDGE_CURVE('',#97,#214,#365,.T.);+#365 = LINE('',#366,#367);+#366 = CARTESIAN_POINT('',(-0.3,-0.25,0.315));+#367 = VECTOR('',#368,1.);+#368 = DIRECTION('',(0.,1.,0.));+#369 = CYLINDRICAL_SURFACE('',#370,3.5E-02);+#370 = AXIS2_PLACEMENT_3D('',#371,#372,#373);+#371 = CARTESIAN_POINT('',(-0.335,-0.25,0.315));+#372 = DIRECTION('',(0.,1.,0.));+#373 = DIRECTION('',(1.,0.,0.));+#374 = ADVANCED_FACE('',(#375),#418,.T.);+#375 = FACE_BOUND('',#376,.T.);+#376 = EDGE_LOOP('',(#377,#378,#379,#380,#388,#396,#404,#412));+#377 = ORIENTED_EDGE('',*,*,#238,.F.);+#378 = ORIENTED_EDGE('',*,*,#230,.T.);+#379 = ORIENTED_EDGE('',*,*,#222,.T.);+#380 = ORIENTED_EDGE('',*,*,#381,.T.);+#381 = EDGE_CURVE('',#214,#382,#384,.T.);+#382 = VERTEX_POINT('',#383);+#383 = CARTESIAN_POINT('',(0.3,0.25,0.315));+#384 = LINE('',#385,#386);+#385 = CARTESIAN_POINT('',(-0.3,0.25,0.315));+#386 = VECTOR('',#387,1.);+#387 = DIRECTION('',(1.,0.,0.));+#388 = ORIENTED_EDGE('',*,*,#389,.T.);+#389 = EDGE_CURVE('',#382,#390,#392,.T.);+#390 = VERTEX_POINT('',#391);+#391 = CARTESIAN_POINT('',(0.465,0.25,0.315));+#392 = LINE('',#393,#394);+#393 = CARTESIAN_POINT('',(-0.465,0.25,0.315));+#394 = VECTOR('',#395,1.);+#395 = DIRECTION('',(1.,0.,0.));+#396 = ORIENTED_EDGE('',*,*,#397,.F.);+#397 = EDGE_CURVE('',#398,#390,#400,.T.);+#398 = VERTEX_POINT('',#399);+#399 = CARTESIAN_POINT('',(0.465,0.25,3.5E-02));+#400 = LINE('',#401,#402);+#401 = CARTESIAN_POINT('',(0.465,0.25,3.5E-02));+#402 = VECTOR('',#403,1.);+#403 = DIRECTION('',(0.,0.,1.));+#404 = ORIENTED_EDGE('',*,*,#405,.F.);+#405 = EDGE_CURVE('',#406,#398,#408,.T.);+#406 = VERTEX_POINT('',#407);+#407 = CARTESIAN_POINT('',(0.3,0.25,3.5E-02));+#408 = LINE('',#409,#410);+#409 = CARTESIAN_POINT('',(-0.465,0.25,3.5E-02));+#410 = VECTOR('',#411,1.);+#411 = DIRECTION('',(1.,0.,0.));+#412 = ORIENTED_EDGE('',*,*,#413,.F.);+#413 = EDGE_CURVE('',#239,#406,#414,.T.);+#414 = LINE('',#415,#416);+#415 = CARTESIAN_POINT('',(-0.465,0.25,3.5E-02));+#416 = VECTOR('',#417,1.);+#417 = DIRECTION('',(1.,0.,0.));+#418 = PLANE('',#419);+#419 = AXIS2_PLACEMENT_3D('',#420,#421,#422);+#420 = CARTESIAN_POINT('',(-0.465,0.25,3.5E-02));+#421 = DIRECTION('',(0.,1.,0.));+#422 = DIRECTION('',(0.,0.,1.));+#423 = ADVANCED_FACE('',(#424),#435,.F.);+#424 = FACE_BOUND('',#425,.F.);+#425 = EDGE_LOOP('',(#426,#427,#428,#434));+#426 = ORIENTED_EDGE('',*,*,#281,.F.);+#427 = ORIENTED_EDGE('',*,*,#330,.T.);+#428 = ORIENTED_EDGE('',*,*,#429,.T.);+#429 = EDGE_CURVE('',#323,#406,#430,.T.);+#430 = LINE('',#431,#432);+#431 = CARTESIAN_POINT('',(0.3,-0.25,3.5E-02));+#432 = VECTOR('',#433,1.);+#433 = DIRECTION('',(0.,1.,0.));+#434 = ORIENTED_EDGE('',*,*,#413,.F.);+#435 = PLANE('',#436);+#436 = AXIS2_PLACEMENT_3D('',#437,#438,#439);+#437 = CARTESIAN_POINT('',(-0.465,-0.25,3.5E-02));+#438 = DIRECTION('',(0.,0.,1.));+#439 = DIRECTION('',(1.,0.,0.));+#440 = ADVANCED_FACE('',(#441),#504,.F.);+#441 = FACE_BOUND('',#442,.F.);+#442 = EDGE_LOOP('',(#443,#453,#460,#461,#462,#463,#472,#480,#489,#497)+);+#443 = ORIENTED_EDGE('',*,*,#444,.F.);+#444 = EDGE_CURVE('',#445,#447,#449,.T.);+#445 = VERTEX_POINT('',#446);+#446 = CARTESIAN_POINT('',(0.335,-0.25,-2.775557561563E-17));+#447 = VERTEX_POINT('',#448);+#448 = CARTESIAN_POINT('',(0.465,-0.25,-2.775557561563E-17));+#449 = LINE('',#450,#451);+#450 = CARTESIAN_POINT('',(0.3,-0.25,0.));+#451 = VECTOR('',#452,1.);+#452 = DIRECTION('',(1.,0.,0.));+#453 = ORIENTED_EDGE('',*,*,#454,.F.);+#454 = EDGE_CURVE('',#323,#445,#455,.T.);+#455 = CIRCLE('',#456,3.5E-02);+#456 = AXIS2_PLACEMENT_3D('',#457,#458,#459);+#457 = CARTESIAN_POINT('',(0.335,-0.25,3.5E-02));+#458 = DIRECTION('',(0.,-1.,0.));+#459 = DIRECTION('',(0.,0.,1.));+#460 = ORIENTED_EDGE('',*,*,#322,.T.);+#461 = ORIENTED_EDGE('',*,*,#314,.T.);+#462 = ORIENTED_EDGE('',*,*,#306,.F.);+#463 = ORIENTED_EDGE('',*,*,#464,.T.);+#464 = EDGE_CURVE('',#299,#465,#467,.T.);+#465 = VERTEX_POINT('',#466);+#466 = CARTESIAN_POINT('',(0.335,-0.25,0.35));+#467 = CIRCLE('',#468,3.5E-02);+#468 = AXIS2_PLACEMENT_3D('',#469,#470,#471);+#469 = CARTESIAN_POINT('',(0.335,-0.25,0.315));+#470 = DIRECTION('',(0.,1.,0.));+#471 = DIRECTION('',(0.,0.,1.));+#472 = ORIENTED_EDGE('',*,*,#473,.T.);+#473 = EDGE_CURVE('',#465,#474,#476,.T.);+#474 = VERTEX_POINT('',#475);+#475 = CARTESIAN_POINT('',(0.465,-0.25,0.35));+#476 = LINE('',#477,#478);+#477 = CARTESIAN_POINT('',(0.3,-0.25,0.35));+#478 = VECTOR('',#479,1.);+#479 = DIRECTION('',(1.,0.,0.));+#480 = ORIENTED_EDGE('',*,*,#481,.F.);+#481 = EDGE_CURVE('',#482,#474,#484,.T.);+#482 = VERTEX_POINT('',#483);+#483 = CARTESIAN_POINT('',(0.5,-0.25,0.315));+#484 = CIRCLE('',#485,3.5E-02);+#485 = AXIS2_PLACEMENT_3D('',#486,#487,#488);+#486 = CARTESIAN_POINT('',(0.465,-0.25,0.315));+#487 = DIRECTION('',(0.,-1.,0.));+#488 = DIRECTION('',(0.,0.,1.));+#489 = ORIENTED_EDGE('',*,*,#490,.F.);+#490 = EDGE_CURVE('',#491,#482,#493,.T.);+#491 = VERTEX_POINT('',#492);+#492 = CARTESIAN_POINT('',(0.5,-0.25,3.5E-02));+#493 = LINE('',#494,#495);+#494 = CARTESIAN_POINT('',(0.5,-0.25,0.));+#495 = VECTOR('',#496,1.);+#496 = DIRECTION('',(0.,0.,1.));+#497 = ORIENTED_EDGE('',*,*,#498,.T.);+#498 = EDGE_CURVE('',#491,#447,#499,.T.);+#499 = CIRCLE('',#500,3.5E-02);+#500 = AXIS2_PLACEMENT_3D('',#501,#502,#503);+#501 = CARTESIAN_POINT('',(0.465,-0.25,3.5E-02));+#502 = DIRECTION('',(0.,1.,0.));+#503 = DIRECTION('',(0.,0.,1.));+#504 = PLANE('',#505);+#505 = AXIS2_PLACEMENT_3D('',#506,#507,#508);+#506 = CARTESIAN_POINT('',(0.3,-0.25,0.));+#507 = DIRECTION('',(0.,1.,0.));+#508 = DIRECTION('',(0.,0.,1.));+#509 = ADVANCED_FACE('',(#510),#535,.F.);+#510 = FACE_BOUND('',#511,.F.);+#511 = EDGE_LOOP('',(#512,#513,#521,#529));+#512 = ORIENTED_EDGE('',*,*,#298,.F.);+#513 = ORIENTED_EDGE('',*,*,#514,.T.);+#514 = EDGE_CURVE('',#97,#515,#517,.T.);+#515 = VERTEX_POINT('',#516);+#516 = CARTESIAN_POINT('',(-0.3,-0.25,0.35));+#517 = LINE('',#518,#519);+#518 = CARTESIAN_POINT('',(-0.3,-0.25,0.315));+#519 = VECTOR('',#520,1.);+#520 = DIRECTION('',(0.,0.,1.));+#521 = ORIENTED_EDGE('',*,*,#522,.T.);+#522 = EDGE_CURVE('',#515,#523,#525,.T.);+#523 = VERTEX_POINT('',#524);+#524 = CARTESIAN_POINT('',(0.3,-0.25,0.35));+#525 = LINE('',#526,#527);+#526 = CARTESIAN_POINT('',(-0.3,-0.25,0.35));+#527 = VECTOR('',#528,1.);+#528 = DIRECTION('',(1.,0.,0.));+#529 = ORIENTED_EDGE('',*,*,#530,.F.);+#530 = EDGE_CURVE('',#299,#523,#531,.T.);+#531 = LINE('',#532,#533);+#532 = CARTESIAN_POINT('',(0.3,-0.25,0.315));+#533 = VECTOR('',#534,1.);+#534 = DIRECTION('',(0.,0.,1.));+#535 = PLANE('',#536);+#536 = AXIS2_PLACEMENT_3D('',#537,#538,#539);+#537 = CARTESIAN_POINT('',(-0.3,-0.25,0.315));+#538 = DIRECTION('',(0.,1.,0.));+#539 = DIRECTION('',(0.,0.,1.));+#540 = ADVANCED_FACE('',(#541),#559,.F.);+#541 = FACE_BOUND('',#542,.F.);+#542 = EDGE_LOOP('',(#543,#544,#545,#553));+#543 = ORIENTED_EDGE('',*,*,#514,.F.);+#544 = ORIENTED_EDGE('',*,*,#364,.T.);+#545 = ORIENTED_EDGE('',*,*,#546,.T.);+#546 = EDGE_CURVE('',#214,#547,#549,.T.);+#547 = VERTEX_POINT('',#548);+#548 = CARTESIAN_POINT('',(-0.3,0.25,0.35));+#549 = LINE('',#550,#551);+#550 = CARTESIAN_POINT('',(-0.3,0.25,0.315));+#551 = VECTOR('',#552,1.);+#552 = DIRECTION('',(0.,0.,1.));+#553 = ORIENTED_EDGE('',*,*,#554,.F.);+#554 = EDGE_CURVE('',#515,#547,#555,.T.);+#555 = LINE('',#556,#557);+#556 = CARTESIAN_POINT('',(-0.3,-0.25,0.35));+#557 = VECTOR('',#558,1.);+#558 = DIRECTION('',(0.,1.,0.));+#559 = PLANE('',#560);+#560 = AXIS2_PLACEMENT_3D('',#561,#562,#563);+#561 = CARTESIAN_POINT('',(-0.3,-0.25,0.315));+#562 = DIRECTION('',(1.,0.,0.));+#563 = DIRECTION('',(0.,0.,1.));+#564 = ADVANCED_FACE('',(#565),#628,.T.);+#565 = FACE_BOUND('',#566,.T.);+#566 = EDGE_LOOP('',(#567,#577,#584,#585,#586,#587,#596,#604,#613,#621)+);+#567 = ORIENTED_EDGE('',*,*,#568,.F.);+#568 = EDGE_CURVE('',#569,#571,#573,.T.);+#569 = VERTEX_POINT('',#570);+#570 = CARTESIAN_POINT('',(0.335,0.25,-2.775557561563E-17));+#571 = VERTEX_POINT('',#572);+#572 = CARTESIAN_POINT('',(0.465,0.25,-2.775557561563E-17));+#573 = LINE('',#574,#575);+#574 = CARTESIAN_POINT('',(0.3,0.25,0.));+#575 = VECTOR('',#576,1.);+#576 = DIRECTION('',(1.,0.,0.));+#577 = ORIENTED_EDGE('',*,*,#578,.F.);+#578 = EDGE_CURVE('',#406,#569,#579,.T.);+#579 = CIRCLE('',#580,3.5E-02);+#580 = AXIS2_PLACEMENT_3D('',#581,#582,#583);+#581 = CARTESIAN_POINT('',(0.335,0.25,3.5E-02));+#582 = DIRECTION('',(0.,-1.,0.));+#583 = DIRECTION('',(0.,0.,1.));+#584 = ORIENTED_EDGE('',*,*,#405,.T.);+#585 = ORIENTED_EDGE('',*,*,#397,.T.);+#586 = ORIENTED_EDGE('',*,*,#389,.F.);+#587 = ORIENTED_EDGE('',*,*,#588,.T.);+#588 = EDGE_CURVE('',#382,#589,#591,.T.);+#589 = VERTEX_POINT('',#590);+#590 = CARTESIAN_POINT('',(0.335,0.25,0.35));+#591 = CIRCLE('',#592,3.5E-02);+#592 = AXIS2_PLACEMENT_3D('',#593,#594,#595);+#593 = CARTESIAN_POINT('',(0.335,0.25,0.315));+#594 = DIRECTION('',(0.,1.,0.));+#595 = DIRECTION('',(0.,0.,1.));+#596 = ORIENTED_EDGE('',*,*,#597,.T.);+#597 = EDGE_CURVE('',#589,#598,#600,.T.);+#598 = VERTEX_POINT('',#599);+#599 = CARTESIAN_POINT('',(0.465,0.25,0.35));+#600 = LINE('',#601,#602);+#601 = CARTESIAN_POINT('',(0.3,0.25,0.35));+#602 = VECTOR('',#603,1.);+#603 = DIRECTION('',(1.,0.,0.));+#604 = ORIENTED_EDGE('',*,*,#605,.F.);+#605 = EDGE_CURVE('',#606,#598,#608,.T.);+#606 = VERTEX_POINT('',#607);+#607 = CARTESIAN_POINT('',(0.5,0.25,0.315));+#608 = CIRCLE('',#609,3.5E-02);+#609 = AXIS2_PLACEMENT_3D('',#610,#611,#612);+#610 = CARTESIAN_POINT('',(0.465,0.25,0.315));+#611 = DIRECTION('',(0.,-1.,0.));+#612 = DIRECTION('',(0.,0.,1.));+#613 = ORIENTED_EDGE('',*,*,#614,.F.);+#614 = EDGE_CURVE('',#615,#606,#617,.T.);+#615 = VERTEX_POINT('',#616);+#616 = CARTESIAN_POINT('',(0.5,0.25,3.5E-02));+#617 = LINE('',#618,#619);+#618 = CARTESIAN_POINT('',(0.5,0.25,0.));+#619 = VECTOR('',#620,1.);+#620 = DIRECTION('',(0.,0.,1.));+#621 = ORIENTED_EDGE('',*,*,#622,.T.);+#622 = EDGE_CURVE('',#615,#571,#623,.T.);+#623 = CIRCLE('',#624,3.5E-02);+#624 = AXIS2_PLACEMENT_3D('',#625,#626,#627);+#625 = CARTESIAN_POINT('',(0.465,0.25,3.5E-02));+#626 = DIRECTION('',(0.,1.,0.));+#627 = DIRECTION('',(0.,0.,1.));+#628 = PLANE('',#629);+#629 = AXIS2_PLACEMENT_3D('',#630,#631,#632);+#630 = CARTESIAN_POINT('',(0.3,0.25,0.));+#631 = DIRECTION('',(0.,1.,0.));+#632 = DIRECTION('',(0.,0.,1.));+#633 = ADVANCED_FACE('',(#634),#652,.T.);+#634 = FACE_BOUND('',#635,.T.);+#635 = EDGE_LOOP('',(#636,#637,#638,#646));+#636 = ORIENTED_EDGE('',*,*,#381,.F.);+#637 = ORIENTED_EDGE('',*,*,#546,.T.);+#638 = ORIENTED_EDGE('',*,*,#639,.T.);+#639 = EDGE_CURVE('',#547,#640,#642,.T.);+#640 = VERTEX_POINT('',#641);+#641 = CARTESIAN_POINT('',(0.3,0.25,0.35));+#642 = LINE('',#643,#644);+#643 = CARTESIAN_POINT('',(-0.3,0.25,0.35));+#644 = VECTOR('',#645,1.);+#645 = DIRECTION('',(1.,0.,0.));+#646 = ORIENTED_EDGE('',*,*,#647,.F.);+#647 = EDGE_CURVE('',#382,#640,#648,.T.);+#648 = LINE('',#649,#650);+#649 = CARTESIAN_POINT('',(0.3,0.25,0.315));+#650 = VECTOR('',#651,1.);+#651 = DIRECTION('',(0.,0.,1.));+#652 = PLANE('',#653);+#653 = AXIS2_PLACEMENT_3D('',#654,#655,#656);+#654 = CARTESIAN_POINT('',(-0.3,0.25,0.315));+#655 = DIRECTION('',(0.,1.,0.));+#656 = DIRECTION('',(0.,0.,1.));+#657 = ADVANCED_FACE('',(#658),#669,.T.);+#658 = FACE_BOUND('',#659,.F.);+#659 = EDGE_LOOP('',(#660,#661,#667,#668));+#660 = ORIENTED_EDGE('',*,*,#454,.T.);+#661 = ORIENTED_EDGE('',*,*,#662,.T.);+#662 = EDGE_CURVE('',#445,#569,#663,.T.);+#663 = LINE('',#664,#665);+#664 = CARTESIAN_POINT('',(0.335,-0.25,-2.775557561563E-17));+#665 = VECTOR('',#666,1.);+#666 = DIRECTION('',(0.,1.,0.));+#667 = ORIENTED_EDGE('',*,*,#578,.F.);+#668 = ORIENTED_EDGE('',*,*,#429,.F.);+#669 = CYLINDRICAL_SURFACE('',#670,3.5E-02);+#670 = AXIS2_PLACEMENT_3D('',#671,#672,#673);+#671 = CARTESIAN_POINT('',(0.335,-0.25,3.5E-02));+#672 = DIRECTION('',(0.,1.,0.));+#673 = DIRECTION('',(-1.,0.,0.));+#674 = ADVANCED_FACE('',(#675),#686,.F.);+#675 = FACE_BOUND('',#676,.F.);+#676 = EDGE_LOOP('',(#677,#678,#679,#680));+#677 = ORIENTED_EDGE('',*,*,#568,.F.);+#678 = ORIENTED_EDGE('',*,*,#662,.F.);+#679 = ORIENTED_EDGE('',*,*,#444,.T.);+#680 = ORIENTED_EDGE('',*,*,#681,.T.);+#681 = EDGE_CURVE('',#447,#571,#682,.T.);+#682 = LINE('',#683,#684);+#683 = CARTESIAN_POINT('',(0.465,-0.25,-2.775557561563E-17));+#684 = VECTOR('',#685,1.);+#685 = DIRECTION('',(0.,1.,0.));+#686 = PLANE('',#687);+#687 = AXIS2_PLACEMENT_3D('',#688,#689,#690);+#688 = CARTESIAN_POINT('',(0.3,-0.25,0.));+#689 = DIRECTION('',(0.,0.,1.));+#690 = DIRECTION('',(1.,0.,0.));+#691 = ADVANCED_FACE('',(#692),#703,.T.);+#692 = FACE_BOUND('',#693,.T.);+#693 = EDGE_LOOP('',(#694,#695,#696,#697));+#694 = ORIENTED_EDGE('',*,*,#498,.T.);+#695 = ORIENTED_EDGE('',*,*,#681,.T.);+#696 = ORIENTED_EDGE('',*,*,#622,.F.);+#697 = ORIENTED_EDGE('',*,*,#698,.F.);+#698 = EDGE_CURVE('',#491,#615,#699,.T.);+#699 = LINE('',#700,#701);+#700 = CARTESIAN_POINT('',(0.5,-0.25,3.5E-02));+#701 = VECTOR('',#702,1.);+#702 = DIRECTION('',(0.,1.,0.));+#703 = CYLINDRICAL_SURFACE('',#704,3.5E-02);+#704 = AXIS2_PLACEMENT_3D('',#705,#706,#707);+#705 = CARTESIAN_POINT('',(0.465,-0.25,3.5E-02));+#706 = DIRECTION('',(0.,1.,0.));+#707 = DIRECTION('',(1.,0.,0.));+#708 = ADVANCED_FACE('',(#709),#720,.T.);+#709 = FACE_BOUND('',#710,.T.);+#710 = EDGE_LOOP('',(#711,#712,#713,#714));+#711 = ORIENTED_EDGE('',*,*,#490,.F.);+#712 = ORIENTED_EDGE('',*,*,#698,.T.);+#713 = ORIENTED_EDGE('',*,*,#614,.T.);+#714 = ORIENTED_EDGE('',*,*,#715,.F.);+#715 = EDGE_CURVE('',#482,#606,#716,.T.);+#716 = LINE('',#717,#718);+#717 = CARTESIAN_POINT('',(0.5,-0.25,0.315));+#718 = VECTOR('',#719,1.);+#719 = DIRECTION('',(0.,1.,0.));+#720 = PLANE('',#721);+#721 = AXIS2_PLACEMENT_3D('',#722,#723,#724);+#722 = CARTESIAN_POINT('',(0.5,-0.25,0.));+#723 = DIRECTION('',(1.,0.,0.));+#724 = DIRECTION('',(0.,0.,1.));+#725 = ADVANCED_FACE('',(#726),#737,.T.);+#726 = FACE_BOUND('',#727,.F.);+#727 = EDGE_LOOP('',(#728,#729,#735,#736));+#728 = ORIENTED_EDGE('',*,*,#481,.T.);+#729 = ORIENTED_EDGE('',*,*,#730,.T.);+#730 = EDGE_CURVE('',#474,#598,#731,.T.);+#731 = LINE('',#732,#733);+#732 = CARTESIAN_POINT('',(0.465,-0.25,0.35));+#733 = VECTOR('',#734,1.);+#734 = DIRECTION('',(0.,1.,0.));+#735 = ORIENTED_EDGE('',*,*,#605,.F.);+#736 = ORIENTED_EDGE('',*,*,#715,.F.);+#737 = CYLINDRICAL_SURFACE('',#738,3.5E-02);+#738 = AXIS2_PLACEMENT_3D('',#739,#740,#741);+#739 = CARTESIAN_POINT('',(0.465,-0.25,0.315));+#740 = DIRECTION('',(0.,1.,0.));+#741 = DIRECTION('',(1.,0.,0.));+#742 = ADVANCED_FACE('',(#743),#754,.T.);+#743 = FACE_BOUND('',#744,.T.);+#744 = EDGE_LOOP('',(#745,#746,#752,#753));+#745 = ORIENTED_EDGE('',*,*,#597,.F.);+#746 = ORIENTED_EDGE('',*,*,#747,.F.);+#747 = EDGE_CURVE('',#465,#589,#748,.T.);+#748 = LINE('',#749,#750);+#749 = CARTESIAN_POINT('',(0.335,-0.25,0.35));+#750 = VECTOR('',#751,1.);+#751 = DIRECTION('',(0.,1.,0.));+#752 = ORIENTED_EDGE('',*,*,#473,.T.);+#753 = ORIENTED_EDGE('',*,*,#730,.T.);+#754 = PLANE('',#755);+#755 = AXIS2_PLACEMENT_3D('',#756,#757,#758);+#756 = CARTESIAN_POINT('',(0.3,-0.25,0.35));+#757 = DIRECTION('',(0.,0.,1.));+#758 = DIRECTION('',(1.,0.,0.));+#759 = ADVANCED_FACE('',(#760),#771,.T.);+#760 = FACE_BOUND('',#761,.T.);+#761 = EDGE_LOOP('',(#762,#763,#764,#765));+#762 = ORIENTED_EDGE('',*,*,#464,.T.);+#763 = ORIENTED_EDGE('',*,*,#747,.T.);+#764 = ORIENTED_EDGE('',*,*,#588,.F.);+#765 = ORIENTED_EDGE('',*,*,#766,.F.);+#766 = EDGE_CURVE('',#299,#382,#767,.T.);+#767 = LINE('',#768,#769);+#768 = CARTESIAN_POINT('',(0.3,-0.25,0.315));+#769 = VECTOR('',#770,1.);+#770 = DIRECTION('',(0.,1.,0.));+#771 = CYLINDRICAL_SURFACE('',#772,3.5E-02);+#772 = AXIS2_PLACEMENT_3D('',#773,#774,#775);+#773 = CARTESIAN_POINT('',(0.335,-0.25,0.315));+#774 = DIRECTION('',(0.,1.,0.));+#775 = DIRECTION('',(-1.,0.,0.));+#776 = ADVANCED_FACE('',(#777),#788,.T.);+#777 = FACE_BOUND('',#778,.T.);+#778 = EDGE_LOOP('',(#779,#780,#781,#782));+#779 = ORIENTED_EDGE('',*,*,#530,.F.);+#780 = ORIENTED_EDGE('',*,*,#766,.T.);+#781 = ORIENTED_EDGE('',*,*,#647,.T.);+#782 = ORIENTED_EDGE('',*,*,#783,.F.);+#783 = EDGE_CURVE('',#523,#640,#784,.T.);+#784 = LINE('',#785,#786);+#785 = CARTESIAN_POINT('',(0.3,-0.25,0.35));+#786 = VECTOR('',#787,1.);+#787 = DIRECTION('',(0.,1.,0.));+#788 = PLANE('',#789);+#789 = AXIS2_PLACEMENT_3D('',#790,#791,#792);+#790 = CARTESIAN_POINT('',(0.3,-0.25,0.315));+#791 = DIRECTION('',(1.,0.,0.));+#792 = DIRECTION('',(0.,0.,1.));+#793 = ADVANCED_FACE('',(#794),#800,.T.);+#794 = FACE_BOUND('',#795,.T.);+#795 = EDGE_LOOP('',(#796,#797,#798,#799));+#796 = ORIENTED_EDGE('',*,*,#554,.F.);+#797 = ORIENTED_EDGE('',*,*,#522,.T.);+#798 = ORIENTED_EDGE('',*,*,#783,.T.);+#799 = ORIENTED_EDGE('',*,*,#639,.F.);+#800 = PLANE('',#801);+#801 = AXIS2_PLACEMENT_3D('',#802,#803,#804);+#802 = CARTESIAN_POINT('',(-0.3,-0.25,0.35));+#803 = DIRECTION('',(0.,0.,1.));+#804 = DIRECTION('',(1.,0.,0.));+#805 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3)+GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#809)) GLOBAL_UNIT_ASSIGNED_CONTEXT+((#806,#807,#808)) REPRESENTATION_CONTEXT('Context #1',+'3D Context with UNIT and UNCERTAINTY') );+#806 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) );+#807 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) );+#808 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() );+#809 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-07),#806,+'distance_accuracy_value','confusion accuracy');+#810 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#7));+#811 = MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#812,+#820,#827,#834,#841,#848,#855,#862,#870,#877,#884,#891,#898,#905,+#913,#920,#927,#934,#941,#948,#955,#962,#969,#976,#983,#990),#805);+#812 = STYLED_ITEM('color',(#813),#17);+#813 = PRESENTATION_STYLE_ASSIGNMENT((#814));+#814 = SURFACE_STYLE_USAGE(.BOTH.,#815);+#815 = SURFACE_SIDE_STYLE('',(#816));+#816 = SURFACE_STYLE_FILL_AREA(#817);+#817 = FILL_AREA_STYLE('',(#818));+#818 = FILL_AREA_STYLE_COLOUR('',#819);+#819 = COLOUR_RGB('',0.824000000954,0.819999992847,0.78100001812);+#820 = STYLED_ITEM('color',(#821),#57);+#821 = PRESENTATION_STYLE_ASSIGNMENT((#822));+#822 = SURFACE_STYLE_USAGE(.BOTH.,#823);+#823 = SURFACE_SIDE_STYLE('',(#824));+#824 = SURFACE_STYLE_FILL_AREA(#825);+#825 = FILL_AREA_STYLE('',(#826));+#826 = FILL_AREA_STYLE_COLOUR('',#819);+#827 = STYLED_ITEM('color',(#828),#140);+#828 = PRESENTATION_STYLE_ASSIGNMENT((#829));+#829 = SURFACE_STYLE_USAGE(.BOTH.,#830);+#830 = SURFACE_SIDE_STYLE('',(#831));+#831 = SURFACE_STYLE_FILL_AREA(#832);+#832 = FILL_AREA_STYLE('',(#833));+#833 = FILL_AREA_STYLE_COLOUR('',#819);+#834 = STYLED_ITEM('color',(#835),#165);+#835 = PRESENTATION_STYLE_ASSIGNMENT((#836));+#836 = SURFACE_STYLE_USAGE(.BOTH.,#837);+#837 = SURFACE_SIDE_STYLE('',(#838));+#838 = SURFACE_STYLE_FILL_AREA(#839);+#839 = FILL_AREA_STYLE('',(#840));+#840 = FILL_AREA_STYLE_COLOUR('',#819);+#841 = STYLED_ITEM('color',(#842),#190);+#842 = PRESENTATION_STYLE_ASSIGNMENT((#843));+#843 = SURFACE_STYLE_USAGE(.BOTH.,#844);+#844 = SURFACE_SIDE_STYLE('',(#845));+#845 = SURFACE_STYLE_FILL_AREA(#846);+#846 = FILL_AREA_STYLE('',(#847));+#847 = FILL_AREA_STYLE_COLOUR('',#819);+#848 = STYLED_ITEM('color',(#849),#257);+#849 = PRESENTATION_STYLE_ASSIGNMENT((#850));+#850 = SURFACE_STYLE_USAGE(.BOTH.,#851);+#851 = SURFACE_SIDE_STYLE('',(#852));+#852 = SURFACE_STYLE_FILL_AREA(#853);+#853 = FILL_AREA_STYLE('',(#854));+#854 = FILL_AREA_STYLE_COLOUR('',#819);+#855 = STYLED_ITEM('color',(#856),#274);+#856 = PRESENTATION_STYLE_ASSIGNMENT((#857));+#857 = SURFACE_STYLE_USAGE(.BOTH.,#858);+#858 = SURFACE_SIDE_STYLE('',(#859));+#859 = SURFACE_STYLE_FILL_AREA(#860);+#860 = FILL_AREA_STYLE('',(#861));+#861 = FILL_AREA_STYLE_COLOUR('',#819);+#862 = STYLED_ITEM('color',(#863),#291);+#863 = PRESENTATION_STYLE_ASSIGNMENT((#864));+#864 = SURFACE_STYLE_USAGE(.BOTH.,#865);+#865 = SURFACE_SIDE_STYLE('',(#866));+#866 = SURFACE_STYLE_FILL_AREA(#867);+#867 = FILL_AREA_STYLE('',(#868));+#868 = FILL_AREA_STYLE_COLOUR('',#869);+#869 = COLOUR_RGB('',0.894999980927,0.89099997282,0.813000023365);+#870 = STYLED_ITEM('color',(#871),#340);+#871 = PRESENTATION_STYLE_ASSIGNMENT((#872));+#872 = SURFACE_STYLE_USAGE(.BOTH.,#873);+#873 = SURFACE_SIDE_STYLE('',(#874));+#874 = SURFACE_STYLE_FILL_AREA(#875);+#875 = FILL_AREA_STYLE('',(#876));+#876 = FILL_AREA_STYLE_COLOUR('',#819);+#877 = STYLED_ITEM('color',(#878),#357);+#878 = PRESENTATION_STYLE_ASSIGNMENT((#879));+#879 = SURFACE_STYLE_USAGE(.BOTH.,#880);+#880 = SURFACE_SIDE_STYLE('',(#881));+#881 = SURFACE_STYLE_FILL_AREA(#882);+#882 = FILL_AREA_STYLE('',(#883));+#883 = FILL_AREA_STYLE_COLOUR('',#819);+#884 = STYLED_ITEM('color',(#885),#374);+#885 = PRESENTATION_STYLE_ASSIGNMENT((#886));+#886 = SURFACE_STYLE_USAGE(.BOTH.,#887);+#887 = SURFACE_SIDE_STYLE('',(#888));+#888 = SURFACE_STYLE_FILL_AREA(#889);+#889 = FILL_AREA_STYLE('',(#890));+#890 = FILL_AREA_STYLE_COLOUR('',#869);+#891 = STYLED_ITEM('color',(#892),#423);+#892 = PRESENTATION_STYLE_ASSIGNMENT((#893));+#893 = SURFACE_STYLE_USAGE(.BOTH.,#894);+#894 = SURFACE_SIDE_STYLE('',(#895));+#895 = SURFACE_STYLE_FILL_AREA(#896);+#896 = FILL_AREA_STYLE('',(#897));+#897 = FILL_AREA_STYLE_COLOUR('',#869);+#898 = STYLED_ITEM('color',(#899),#440);+#899 = PRESENTATION_STYLE_ASSIGNMENT((#900));+#900 = SURFACE_STYLE_USAGE(.BOTH.,#901);+#901 = SURFACE_SIDE_STYLE('',(#902));+#902 = SURFACE_STYLE_FILL_AREA(#903);+#903 = FILL_AREA_STYLE('',(#904));+#904 = FILL_AREA_STYLE_COLOUR('',#819);+#905 = STYLED_ITEM('color',(#906),#509);+#906 = PRESENTATION_STYLE_ASSIGNMENT((#907));+#907 = SURFACE_STYLE_USAGE(.BOTH.,#908);+#908 = SURFACE_SIDE_STYLE('',(#909));+#909 = SURFACE_STYLE_FILL_AREA(#910);+#910 = FILL_AREA_STYLE('',(#911));+#911 = FILL_AREA_STYLE_COLOUR('',#912);+#912 = COLOUR_RGB('',8.200000226498E-02,8.600000292063E-02,+9.399999678135E-02);+#913 = STYLED_ITEM('color',(#914),#540);+#914 = PRESENTATION_STYLE_ASSIGNMENT((#915));+#915 = SURFACE_STYLE_USAGE(.BOTH.,#916);+#916 = SURFACE_SIDE_STYLE('',(#917));+#917 = SURFACE_STYLE_FILL_AREA(#918);+#918 = FILL_AREA_STYLE('',(#919));+#919 = FILL_AREA_STYLE_COLOUR('',#912);+#920 = STYLED_ITEM('color',(#921),#564);+#921 = PRESENTATION_STYLE_ASSIGNMENT((#922));+#922 = SURFACE_STYLE_USAGE(.BOTH.,#923);+#923 = SURFACE_SIDE_STYLE('',(#924));+#924 = SURFACE_STYLE_FILL_AREA(#925);+#925 = FILL_AREA_STYLE('',(#926));+#926 = FILL_AREA_STYLE_COLOUR('',#819);+#927 = STYLED_ITEM('color',(#928),#633);+#928 = PRESENTATION_STYLE_ASSIGNMENT((#929));+#929 = SURFACE_STYLE_USAGE(.BOTH.,#930);+#930 = SURFACE_SIDE_STYLE('',(#931));+#931 = SURFACE_STYLE_FILL_AREA(#932);+#932 = FILL_AREA_STYLE('',(#933));+#933 = FILL_AREA_STYLE_COLOUR('',#912);+#934 = STYLED_ITEM('color',(#935),#657);+#935 = PRESENTATION_STYLE_ASSIGNMENT((#936));+#936 = SURFACE_STYLE_USAGE(.BOTH.,#937);+#937 = SURFACE_SIDE_STYLE('',(#938));+#938 = SURFACE_STYLE_FILL_AREA(#939);+#939 = FILL_AREA_STYLE('',(#940));+#940 = FILL_AREA_STYLE_COLOUR('',#819);+#941 = STYLED_ITEM('color',(#942),#674);+#942 = PRESENTATION_STYLE_ASSIGNMENT((#943));+#943 = SURFACE_STYLE_USAGE(.BOTH.,#944);+#944 = SURFACE_SIDE_STYLE('',(#945));+#945 = SURFACE_STYLE_FILL_AREA(#946);+#946 = FILL_AREA_STYLE('',(#947));+#947 = FILL_AREA_STYLE_COLOUR('',#819);+#948 = STYLED_ITEM('color',(#949),#691);+#949 = PRESENTATION_STYLE_ASSIGNMENT((#950));+#950 = SURFACE_STYLE_USAGE(.BOTH.,#951);+#951 = SURFACE_SIDE_STYLE('',(#952));+#952 = SURFACE_STYLE_FILL_AREA(#953);+#953 = FILL_AREA_STYLE('',(#954));+#954 = FILL_AREA_STYLE_COLOUR('',#819);+#955 = STYLED_ITEM('color',(#956),#708);+#956 = PRESENTATION_STYLE_ASSIGNMENT((#957));+#957 = SURFACE_STYLE_USAGE(.BOTH.,#958);+#958 = SURFACE_SIDE_STYLE('',(#959));+#959 = SURFACE_STYLE_FILL_AREA(#960);+#960 = FILL_AREA_STYLE('',(#961));+#961 = FILL_AREA_STYLE_COLOUR('',#819);+#962 = STYLED_ITEM('color',(#963),#725);+#963 = PRESENTATION_STYLE_ASSIGNMENT((#964));+#964 = SURFACE_STYLE_USAGE(.BOTH.,#965);+#965 = SURFACE_SIDE_STYLE('',(#966));+#966 = SURFACE_STYLE_FILL_AREA(#967);+#967 = FILL_AREA_STYLE('',(#968));+#968 = FILL_AREA_STYLE_COLOUR('',#819);+#969 = STYLED_ITEM('color',(#970),#742);+#970 = PRESENTATION_STYLE_ASSIGNMENT((#971));+#971 = SURFACE_STYLE_USAGE(.BOTH.,#972);+#972 = SURFACE_SIDE_STYLE('',(#973));+#973 = SURFACE_STYLE_FILL_AREA(#974);+#974 = FILL_AREA_STYLE('',(#975));+#975 = FILL_AREA_STYLE_COLOUR('',#819);+#976 = STYLED_ITEM('color',(#977),#759);+#977 = PRESENTATION_STYLE_ASSIGNMENT((#978));+#978 = SURFACE_STYLE_USAGE(.BOTH.,#979);+#979 = SURFACE_SIDE_STYLE('',(#980));+#980 = SURFACE_STYLE_FILL_AREA(#981);+#981 = FILL_AREA_STYLE('',(#982));+#982 = FILL_AREA_STYLE_COLOUR('',#819);+#983 = STYLED_ITEM('color',(#984),#776);+#984 = PRESENTATION_STYLE_ASSIGNMENT((#985));+#985 = SURFACE_STYLE_USAGE(.BOTH.,#986);+#986 = SURFACE_SIDE_STYLE('',(#987));+#987 = SURFACE_STYLE_FILL_AREA(#988);+#988 = FILL_AREA_STYLE('',(#989));+#989 = FILL_AREA_STYLE_COLOUR('',#912);+#990 = STYLED_ITEM('color',(#991),#793);+#991 = PRESENTATION_STYLE_ASSIGNMENT((#992));+#992 = SURFACE_STYLE_USAGE(.BOTH.,#993);+#993 = SURFACE_SIDE_STYLE('',(#994));+#994 = SURFACE_STYLE_FILL_AREA(#995);+#995 = FILL_AREA_STYLE('',(#996));+#996 = FILL_AREA_STYLE_COLOUR('',#912);+ENDSEC;+END-ISO-10303-21;
CR0402-FX-4702GLF.svgadded+162@@ -0,0 +1,162 @@+<?xml version="1.0" standalone="no"?>+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" + "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg+ xmlns:svg="http://www.w3.org/2000/svg"+ xmlns="http://www.w3.org/2000/svg"+ xmlns:xlink="http://www.w3.org/1999/xlink"+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"+ version="1.1"+ width="5.0292mm" height="10.0584mm" viewBox="0.0000 0.0000 5.0292 10.0584">+<title>SVG Image created as R_unit1.svg date 2026-06-08T19:59:22 </title>+ <desc>Image generated by Eeschema-SVG </desc>+<g style="fill:#000000; fill-opacity:1.0000;stroke:#000000; stroke-opacity:1.0000;+stroke-linecap:round; stroke-linejoin:round;"+ transform="translate(0 0) scale(1 1)">+</g>+<g style="fill:none; +stroke:#840000; stroke-width:0.2540; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;">+<rect x="0.543300" y="2.489200" width="2.032000" height="5.080000" rx="0.000000" />+</g>+<g style="fill:none; +stroke:#840000; stroke-width:0.1524; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;">+<path d="M1.5593 2.4892+L1.5593 1.2192+" />+<path d="M1.5593 7.5692+L1.5593 8.8392+" />+</g>+<g style="fill:none; +stroke:#006464; stroke-width:0.1524; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;">+<g transform="rotate(-90.000000 3.5913 5.0292)">+<text x="3.5913" y="5.6642"+textLength="2.5618" font-size="1.6933" lengthAdjust="spacingAndGlyphs"+text-anchor="middle" opacity="0" stroke-opacity="0">R?</text>+</g>+<g class="stroked-text"><desc>R?</desc>+<path d="M4.1708 5.1804+L3.5661 5.6037+" />+<path d="M4.1708 5.9061+L2.9008 5.9061+" />+<path d="M2.9008 5.9061+L2.9008 5.4223+" />+<path d="M2.9008 5.4223+L2.9613 5.3013+" />+<path d="M2.9613 5.3013+L3.0218 5.2408+" />+<path d="M3.0218 5.2408+L3.1427 5.1804+" />+<path d="M3.1427 5.1804+L3.3242 5.1804+" />+<path d="M3.3242 5.1804+L3.4451 5.2408+" />+<path d="M3.4451 5.2408+L3.5056 5.3013+" />+<path d="M3.5056 5.3013+L3.5661 5.4223+" />+<path d="M3.5661 5.4223+L3.5661 5.9061+" />+<path d="M4.0499 4.4546+L4.1104 4.3942+" />+<path d="M4.1104 4.3942+L4.1708 4.4546+" />+<path d="M4.1708 4.4546+L4.1104 4.5151+" />+<path d="M4.1104 4.5151+L4.0499 4.4546+" />+<path d="M4.0499 4.4546+L4.1708 4.4546+" />+<path d="M2.9613 4.6965+L2.9008 4.5756+" />+<path d="M2.9008 4.5756+L2.9008 4.2732+" />+<path d="M2.9008 4.2732+L2.9613 4.1523+" />+<path d="M2.9613 4.1523+L3.0823 4.0918+" />+<path d="M3.0823 4.0918+L3.2032 4.0918+" />+<path d="M3.2032 4.0918+L3.3242 4.1523+" />+<path d="M3.3242 4.1523+L3.3846 4.2127+" />+<path d="M3.3846 4.2127+L3.4451 4.3337+" />+<path d="M3.4451 4.3337+L3.5056 4.3942+" />+<path d="M3.5056 4.3942+L3.6265 4.4546+" />+<path d="M3.6265 4.4546+L3.6870 4.4546+" />+</g><g transform="rotate(-90.000000 1.5593 5.0292)">+<text x="1.5593" y="5.6642"+textLength="1.4732" font-size="1.6933" lengthAdjust="spacingAndGlyphs"+text-anchor="middle" opacity="0" stroke-opacity="0">R</text>+</g>+<g class="stroked-text"><desc>R</desc>+<path d="M2.1388 4.6361+L1.5341 5.0594+" />+<path d="M2.1388 5.3618+L0.8688 5.3618+" />+<path d="M0.8688 5.3618+L0.8688 4.8780+" />+<path d="M0.8688 4.8780+L0.9293 4.7570+" />+<path d="M0.9293 4.7570+L0.9898 4.6965+" />+<path d="M0.9898 4.6965+L1.1107 4.6361+" />+<path d="M1.1107 4.6361+L1.2922 4.6361+" />+<path d="M1.2922 4.6361+L1.4131 4.6965+" />+<path d="M1.4131 4.6965+L1.4736 4.7570+" />+<path d="M1.4736 4.7570+L1.5341 4.8780+" />+<path d="M1.5341 4.8780+L1.5341 5.3618+" />+</g></g> +</svg>
README.md+14@@ -1,3 +1,17 @@ # CR0402-FX-4702GLF +**Bourns** · 47kΩ · 0402 · Resistor+ Bourns · Thick Film Chip Resistor · General Purpose++## Characterization++<iframe src="/blob/component/cr0402-fx-4702glf/CR0402-FX-4702GLF.html" width="100%" height="2400" frameborder="0" style="border: none; border-radius: 8px;" allowfullscreen></iframe>++## Downloads++| File | Description |+|------|-------------|+| [CR0402-FX-4702GLF.kicad_sym](/blob/component/cr0402-fx-4702glf/CR0402-FX-4702GLF.kicad_sym) | KiCad Symbol |+| [CR0402-FX-4702GLF.kicad_mod](/blob/component/cr0402-fx-4702glf/CR0402-FX-4702GLF.kicad_mod) | KiCad Footprint |+| [CR0402-FX-4702GLF.step](/blob/component/cr0402-fx-4702glf/CR0402-FX-4702GLF.step) | 3D STEP Model |