circuit-to-svg 0.0.52 → 0.0.53
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1651,11 +1651,11 @@ function createSchematicTrace(trace, transform) {
|
|
|
1651
1651
|
let path = "";
|
|
1652
1652
|
edges.forEach((edge, index) => {
|
|
1653
1653
|
const fromPoint = {
|
|
1654
|
-
x:
|
|
1654
|
+
x: edge.from.x ?? edge.from.center?.x,
|
|
1655
1655
|
y: edge.from.y ?? edge.from.center?.y
|
|
1656
1656
|
};
|
|
1657
1657
|
const toPoint = {
|
|
1658
|
-
x:
|
|
1658
|
+
x: edge.to.x ?? edge.to.center?.x,
|
|
1659
1659
|
y: edge.to.y ?? edge.to.center?.y
|
|
1660
1660
|
};
|
|
1661
1661
|
const [transformedFromX, transformedFromY] = applyToPoint16(transform, [
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../lib/pcb/convert-circuit-json-to-pcb-svg.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-pcb-fabrication-note-path.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-pcb-fabrication-note-text.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-pcb-plated-hole.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-pcb-silkscreen-path.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-pcb-silkscreen-text.ts","../lib/utils/pairs.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-pcb-trace.ts","../lib/pcb/layer-name-to-color.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-smt-pads.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-pcb-board.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-pcb-via.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-pcb-hole.ts","../lib/pcb/colors.ts","../lib/utils/colors.ts","../lib/sch/convert-circuit-json-to-schematic-svg.ts","../lib/sch/draw-schematic-grid.ts","../lib/sch/draw-schematic-labeled-points.ts","../lib/sch/get-schematic-bounds-from-circuit-json.ts","../lib/sch/svg-object-fns/create-svg-objects-from-sch-component.ts","../lib/sch/svg-object-fns/create-svg-objects-from-sch-debug-object.ts","../lib/sch/svg-object-fns/create-svg-objects-from-sch-trace.ts"],"sourcesContent":["import type { Point, AnyCircuitElement } from \"circuit-json\"\nimport { type INode as SvgObject, stringify } from \"svgson\"\nimport {\n type Matrix,\n applyToPoint,\n compose,\n scale,\n translate,\n} from \"transformation-matrix\"\nimport { createSvgObjectsFromPcbFabricationNotePath } from \"./svg-object-fns/create-svg-objects-from-pcb-fabrication-note-path\"\nimport { createSvgObjectsFromPcbFabricationNoteText } from \"./svg-object-fns/create-svg-objects-from-pcb-fabrication-note-text\"\nimport { createSvgObjectsFromPcbPlatedHole } from \"./svg-object-fns/create-svg-objects-from-pcb-plated-hole\"\nimport { createSvgObjectsFromPcbSilkscreenPath } from \"./svg-object-fns/create-svg-objects-from-pcb-silkscreen-path\"\nimport { createSvgObjectsFromPcbSilkscreenText } from \"./svg-object-fns/create-svg-objects-from-pcb-silkscreen-text\"\nimport { createSvgObjectsFromPcbTrace } from \"./svg-object-fns/create-svg-objects-from-pcb-trace\"\nimport { createSvgObjectsFromSmtPad } from \"./svg-object-fns/create-svg-objects-from-smt-pads\"\nimport { createSvgObjectsFromPcbBoard } from \"./svg-object-fns/create-svg-objects-from-pcb-board\"\nimport { createSvgObjectsFromPcbVia } from \"./svg-object-fns/create-svg-objects-from-pcb-via\"\nimport { createSvgObjectsFromPcbHole } from \"./svg-object-fns/create-svg-objects-from-pcb-hole\"\n\nconst OBJECT_ORDER: AnyCircuitElement[\"type\"][] = [\n \"pcb_plated_hole\",\n \"pcb_fabrication_note_text\",\n \"pcb_fabrication_note_path\",\n \"pcb_silkscreen_text\",\n \"pcb_silkscreen_path\",\n \"pcb_via\",\n \"pcb_trace\",\n \"pcb_smtpad\",\n \"pcb_component\",\n \"pcb_board\",\n]\n\ninterface PointObjectNotation {\n x: number\n y: number\n}\n\ninterface Options {\n width?: number\n height?: number\n}\n\nexport function convertCircuitJsonToPcbSvg(\n soup: AnyCircuitElement[],\n options?: Options,\n): string {\n let minX = Number.POSITIVE_INFINITY\n let minY = Number.POSITIVE_INFINITY\n let maxX = Number.NEGATIVE_INFINITY\n let maxY = Number.NEGATIVE_INFINITY\n\n // Process all elements to determine bounds\n for (const item of soup) {\n if (item.type === \"pcb_board\") {\n if (\n item.outline &&\n Array.isArray(item.outline) &&\n item.outline.length >= 3\n )\n updateBoundsToIncludeOutline(item.outline)\n else if (\"center\" in item && \"width\" in item && \"height\" in item)\n updateBounds(item.center, item.width, item.height)\n } else if (\"x\" in item && \"y\" in item) {\n updateBounds({ x: item.x, y: item.y }, 0, 0)\n } else if (\"route\" in item) {\n updateTraceBounds(item.route)\n }\n }\n\n const padding = 1 // Reduced padding for tighter boundary\n const circuitWidth = maxX - minX + 2 * padding\n const circuitHeight = maxY - minY + 2 * padding\n\n const svgWidth = options?.width ?? 800\n const svgHeight = options?.height ?? 600\n const paths: PointObjectNotation[][] = []\n for (const item of soup) {\n if (\"route\" in item && item.route !== undefined) {\n paths.push(item.route as PointObjectNotation[])\n }\n }\n\n // Calculate scale factor to fit the circuit within the SVG, maintaining aspect ratio\n const scaleX = svgWidth / circuitWidth\n const scaleY = svgHeight / circuitHeight\n const scaleFactor = Math.min(scaleX, scaleY)\n\n // Calculate centering offsets\n const offsetX = (svgWidth - circuitWidth * scaleFactor) / 2\n const offsetY = (svgHeight - circuitHeight * scaleFactor) / 2\n\n const transform = compose(\n translate(\n offsetX - minX * scaleFactor + padding * scaleFactor,\n svgHeight - offsetY + minY * scaleFactor - padding * scaleFactor,\n ),\n scale(scaleFactor, -scaleFactor), // Flip in y-direction\n )\n\n const svgObjects = soup\n .sort(\n (a, b) =>\n (OBJECT_ORDER.indexOf(b.type) ?? 9999) -\n (OBJECT_ORDER.indexOf(a.type) ?? 9999),\n )\n .flatMap((item) => createSvgObjects(item, transform))\n\n let strokeWidth = String(0.05 * scaleFactor)\n\n for (const element of soup) {\n if (\"stroke_width\" in element) {\n strokeWidth = String(scaleFactor * element.stroke_width)\n break\n }\n }\n\n const svgObject: SvgObject = {\n name: \"svg\",\n type: \"element\",\n attributes: {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: svgWidth.toString(),\n height: svgHeight.toString(),\n },\n value: \"\",\n children: [\n {\n name: \"style\",\n type: \"element\",\n children: [\n {\n type: \"text\",\n value: `\n .boundary { fill: #000; }\n .pcb-board { fill: none; }\n .pcb-trace { fill: none; }\n .pcb-hole-outer { fill: rgb(200, 52, 52); }\n .pcb-hole-inner { fill: rgb(255, 38, 226); }\n .pcb-pad { }\n .pcb-boundary { fill: none; stroke: #fff; stroke-width: 0.3; }\n .pcb-silkscreen { fill: none; }\n .pcb-silkscreen-top { stroke: #f2eda1; }\n .pcb-silkscreen-bottom { stroke: #f2eda1; }\n .pcb-silkscreen-text { fill: #f2eda1; }\n `,\n },\n ],\n },\n {\n name: \"rect\",\n type: \"element\",\n attributes: {\n class: \"boundary\",\n x: \"0\",\n y: \"0\",\n width: svgWidth.toString(),\n height: svgHeight.toString(),\n },\n },\n createSvgObjectFromPcbBoundary(transform, minX, minY, maxX, maxY),\n ...svgObjects,\n ].filter((child): child is SvgObject => child !== null),\n }\n\n try {\n return stringify(svgObject as SvgObject)\n } catch (error) {\n console.error(\"Error stringifying SVG object:\", error)\n throw error\n }\n\n function updateBounds(center: any, width: any, height: any) {\n const halfWidth = width / 2\n const halfHeight = height / 2\n minX = Math.min(minX, center.x - halfWidth)\n minY = Math.min(minY, center.y - halfHeight)\n maxX = Math.max(maxX, center.x + halfWidth)\n maxY = Math.max(maxY, center.y + halfHeight)\n }\n\n function updateBoundsToIncludeOutline(outline: Point[]) {\n for (const point of outline) {\n minX = Math.min(minX, point.x)\n minY = Math.min(minY, point.y)\n maxX = Math.max(maxX, point.x)\n maxY = Math.max(maxY, point.y)\n }\n }\n\n function updateTraceBounds(route: any[]) {\n for (const point of route) {\n minX = Math.min(minX, point.x)\n minY = Math.min(minY, point.y)\n maxX = Math.max(maxX, point.x)\n maxY = Math.max(maxY, point.y)\n }\n }\n}\n\nfunction createSvgObjects(\n elm: AnyCircuitElement,\n transform: Matrix,\n): SvgObject[] {\n switch (elm.type) {\n case \"pcb_component\":\n return [createSvgObjectsFromPcbComponent(elm, transform)].filter(Boolean)\n case \"pcb_trace\":\n return createSvgObjectsFromPcbTrace(elm, transform)\n case \"pcb_plated_hole\":\n return createSvgObjectsFromPcbPlatedHole(elm, transform).filter(Boolean)\n case \"pcb_hole\":\n return createSvgObjectsFromPcbHole(elm, transform)\n case \"pcb_smtpad\":\n return createSvgObjectsFromSmtPad(elm, transform)\n case \"pcb_silkscreen_text\":\n return createSvgObjectsFromPcbSilkscreenText(elm, transform)\n case \"pcb_fabrication_note_path\":\n return createSvgObjectsFromPcbFabricationNotePath(elm, transform)\n case \"pcb_fabrication_note_text\":\n return createSvgObjectsFromPcbFabricationNoteText(elm, transform)\n case \"pcb_silkscreen_path\":\n return createSvgObjectsFromPcbSilkscreenPath(elm, transform)\n case \"pcb_board\":\n return createSvgObjectsFromPcbBoard(elm, transform)\n case \"pcb_via\":\n return createSvgObjectsFromPcbVia(elm, transform)\n default:\n return []\n }\n}\n\nfunction createSvgObjectsFromPcbComponent(component: any, transform: any): any {\n const { center, width, height, rotation = 0 } = component\n const [x, y] = applyToPoint(transform, [center.x, center.y])\n const scaledWidth = width * Math.abs(transform.a)\n const scaledHeight = height * Math.abs(transform.d)\n const transformStr = `translate(${x}, ${y}) rotate(${-rotation}) scale(1, -1)`\n\n return {\n name: \"g\",\n type: \"element\",\n attributes: { transform: transformStr },\n children: [\n {\n name: \"rect\",\n type: \"element\",\n attributes: {\n class: \"pcb-component\",\n x: (-scaledWidth / 2).toString(),\n y: (-scaledHeight / 2).toString(),\n width: scaledWidth.toString(),\n height: scaledHeight.toString(),\n },\n },\n {\n name: \"rect\",\n type: \"element\",\n attributes: {\n class: \"pcb-component-outline\",\n x: (-scaledWidth / 2).toString(),\n y: (-scaledHeight / 2).toString(),\n width: scaledWidth.toString(),\n height: scaledHeight.toString(),\n },\n },\n ],\n }\n}\n\nfunction createSvgObjectFromPcbBoundary(\n transform: any,\n minX: number,\n minY: number,\n maxX: number,\n maxY: number,\n): SvgObject {\n const [x1, y1] = applyToPoint(transform, [minX, minY])\n const [x2, y2] = applyToPoint(transform, [maxX, maxY])\n const width = Math.abs(x2 - x1)\n const height = Math.abs(y2 - y1)\n const x = Math.min(x1, x2)\n const y = Math.min(y1, y2)\n return {\n name: \"rect\",\n type: \"element\",\n value: \"\",\n children: [],\n attributes: {\n class: \"pcb-boundary\",\n x: x.toString(),\n y: y.toString(),\n width: width.toString(),\n height: height.toString(),\n },\n }\n}\n\n/**\n * @deprecated use `convertCircuitJsonToPcbSvg` instead\n */\nexport const circuitJsonToPcbSvg = convertCircuitJsonToPcbSvg\n","import type { PcbSilkscreenPath, PcbFabricationNotePath } from \"circuit-json\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\nimport type { SvgObject } from \"lib/svg-object\"\n\nexport function createSvgObjectsFromPcbFabricationNotePath(\n fabNotePath: PcbFabricationNotePath,\n transform: Matrix,\n): SvgObject[] {\n if (!fabNotePath.route || !Array.isArray(fabNotePath.route)) return []\n\n // Close the path if the first and last points are the same\n const firstPoint = fabNotePath.route[0]\n const lastPoint = fabNotePath.route[fabNotePath.route.length - 1]\n const isClosed =\n firstPoint!.x === lastPoint!.x && firstPoint!.y === lastPoint!.y\n\n const path =\n fabNotePath.route\n .slice(0, isClosed ? -1 : undefined)\n .map((point: any, index: number) => {\n const [x, y] = applyToPoint(transform, [point.x, point.y])\n return index === 0 ? `M ${x} ${y}` : `L ${x} ${y}`\n })\n .join(\" \") + (isClosed ? \" Z\" : \"\")\n\n return [\n {\n name: \"path\",\n type: \"element\",\n attributes: {\n class: \"pcb-fabrication-note-path\",\n stroke: fabNotePath.color || \"rgba(255,255,255,0.5)\",\n fill: \"none\",\n d: path,\n \"stroke-width\": (\n fabNotePath.stroke_width * Math.abs(transform.a)\n ).toString(),\n \"data-pcb-component-id\": fabNotePath.pcb_component_id,\n \"data-pcb-fabrication-note-path-id\":\n fabNotePath.pcb_fabrication_note_path_id,\n },\n value: \"\",\n children: [],\n },\n ]\n}\n","import type { PcbFabricationNoteText } from \"circuit-json\"\nimport type { INode as SvgObject } from \"svgson\"\nimport { toString as matrixToString } from \"transformation-matrix\"\nimport {\n type Matrix,\n applyToPoint,\n compose,\n rotate,\n translate,\n} from \"transformation-matrix\"\n\nexport function createSvgObjectsFromPcbFabricationNoteText(\n pcbFabNoteText: PcbFabricationNoteText,\n transform: Matrix,\n): SvgObject[] {\n const {\n anchor_position,\n anchor_alignment,\n text,\n font_size = 1,\n layer = \"top\",\n color,\n } = pcbFabNoteText\n\n if (\n !anchor_position ||\n typeof anchor_position.x !== \"number\" ||\n typeof anchor_position.y !== \"number\"\n ) {\n console.error(\"Invalid anchor_position:\", anchor_position)\n return []\n }\n\n const [transformedX, transformedY] = applyToPoint(transform, [\n anchor_position.x,\n anchor_position.y,\n ])\n const transformedFontSize = font_size * Math.abs(transform.a)\n\n // Remove ${} from text value and handle undefined text\n\n // Create a composite transformation\n const textTransform = compose(\n translate(transformedX, transformedY), // TODO do anchor_alignment\n rotate(Math.PI / 180), // Convert degrees to radians\n )\n\n const svgObject: SvgObject = {\n name: \"text\",\n type: \"element\",\n attributes: {\n x: \"0\",\n y: \"0\",\n \"font-family\": \"Arial, sans-serif\",\n \"font-size\": transformedFontSize.toString(),\n \"text-anchor\": \"middle\",\n \"dominant-baseline\": \"central\",\n transform: matrixToString(textTransform),\n class: \"pcb-fabrication-note-text\",\n fill: color || \"rgba(255,255,255,0.5)\",\n },\n children: [\n {\n type: \"text\",\n value: text,\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n value: \"\",\n }\n\n return [svgObject]\n}\n","import type { PCBPlatedHole } from \"circuit-json\"\nimport { applyToPoint } from \"transformation-matrix\"\nimport type { SvgObject } from \"lib/svg-object\"\n\nexport function createSvgObjectsFromPcbPlatedHole(\n hole: PCBPlatedHole,\n transform: any,\n): SvgObject[] {\n const [x, y] = applyToPoint(transform, [hole.x, hole.y])\n\n if (hole.shape === \"pill\") {\n const scaledOuterWidth = hole.outer_width * Math.abs(transform.a)\n const scaledOuterHeight = hole.outer_height * Math.abs(transform.a)\n const scaledHoleWidth = hole.hole_width * Math.abs(transform.a)\n const scaledHoleHeight = hole.hole_height * Math.abs(transform.a)\n\n const outerRadiusX = scaledOuterWidth / 2\n const outerRadiusY = scaledOuterHeight / 2\n const innerRadiusX = scaledHoleWidth / 2\n const innerRadiusY = scaledHoleHeight / 2\n const straightLength = scaledOuterHeight - scaledOuterWidth\n\n return [\n {\n name: \"g\",\n type: \"element\",\n children: [\n // Outer pill shape\n {\n name: \"path\",\n type: \"element\",\n attributes: {\n class: \"pcb-hole-outer\",\n d:\n `M${x - outerRadiusX},${y - straightLength / 2} ` +\n `v${straightLength} ` +\n `a${outerRadiusX},${outerRadiusX} 0 0 0 ${scaledOuterWidth},0 ` +\n `v-${straightLength} ` +\n `a${outerRadiusX},${outerRadiusX} 0 0 0 -${scaledOuterWidth},0 z`,\n },\n value: \"\",\n children: [],\n },\n // Inner pill shape\n {\n name: \"path\",\n type: \"element\",\n attributes: {\n class: \"pcb-hole-inner\",\n d:\n `M${x - innerRadiusX},${y - (scaledHoleHeight - scaledHoleWidth) / 2} ` +\n `v${scaledHoleHeight - scaledHoleWidth} ` +\n `a${innerRadiusX},${innerRadiusX} 0 0 0 ${scaledHoleWidth},0 ` +\n `v-${scaledHoleHeight - scaledHoleWidth} ` +\n `a${innerRadiusX},${innerRadiusX} 0 0 0 -${scaledHoleWidth},0 z`,\n },\n value: \"\",\n children: [],\n },\n ],\n value: \"\",\n attributes: {},\n },\n ]\n }\n // Fallback to circular hole if not pill-shaped\n if (hole.shape === \"circle\") {\n const scaledOuterWidth = hole.outer_diameter * Math.abs(transform.a)\n const scaledOuterHeight = hole.outer_diameter * Math.abs(transform.a)\n const scaledHoleWidth = hole.hole_diameter * Math.abs(transform.a)\n const scaledHoleHeight = hole.hole_diameter * Math.abs(transform.a)\n\n const outerRadius = Math.min(scaledOuterWidth, scaledOuterHeight) / 2\n const innerRadius = Math.min(scaledHoleWidth, scaledHoleHeight) / 2\n return [\n {\n name: \"g\",\n type: \"element\",\n children: [\n {\n name: \"circle\",\n type: \"element\",\n attributes: {\n class: \"pcb-hole-outer\",\n cx: x.toString(),\n cy: y.toString(),\n r: outerRadius.toString(),\n },\n value: \"\",\n children: [],\n },\n {\n name: \"circle\",\n type: \"element\",\n attributes: {\n class: \"pcb-hole-inner\",\n cx: x.toString(),\n cy: y.toString(),\n r: innerRadius.toString(),\n },\n value: \"\",\n children: [],\n },\n ],\n value: \"\",\n attributes: {},\n },\n ]\n }\n return []\n}\n","import type { PcbSilkscreenPath } from \"circuit-json\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\nimport type { SvgObject } from \"lib/svg-object\"\n\nexport function createSvgObjectsFromPcbSilkscreenPath(\n silkscreenPath: PcbSilkscreenPath,\n transform: Matrix,\n): SvgObject[] {\n if (!silkscreenPath.route || !Array.isArray(silkscreenPath.route)) return []\n\n let path = silkscreenPath.route\n .map((point: any, index: number) => {\n const [x, y] = applyToPoint(transform, [point.x, point.y])\n return index === 0 ? `M ${x} ${y}` : `L ${x} ${y}`\n })\n .join(\" \")\n\n // Close the path if the first and last points match\n const firstPoint = silkscreenPath.route[0]\n const lastPoint = silkscreenPath.route[silkscreenPath.route.length - 1]\n if (\n firstPoint &&\n lastPoint &&\n firstPoint.x === lastPoint.x &&\n firstPoint.y === lastPoint.y\n ) {\n path += \" Z\"\n }\n return [\n {\n name: \"path\",\n type: \"element\",\n attributes: {\n class: `pcb-silkscreen pcb-silkscreen-${silkscreenPath.layer}`,\n d: path,\n \"stroke-width\": (\n silkscreenPath.stroke_width * Math.abs(transform.a)\n ).toString(),\n \"data-pcb-component-id\": silkscreenPath.pcb_component_id,\n \"data-pcb-silkscreen-path-id\": silkscreenPath.pcb_silkscreen_path_id,\n },\n value: \"\",\n children: [],\n },\n ]\n}\n","import type { PcbSilkscreenText } from \"circuit-json\"\nimport type { INode as SvgObject } from \"svgson\"\nimport {\n type Matrix,\n applyToPoint,\n compose,\n rotate,\n translate,\n toString as matrixToString,\n} from \"transformation-matrix\"\n\nexport function createSvgObjectsFromPcbSilkscreenText(\n pcbSilkscreenText: PcbSilkscreenText,\n transform: Matrix,\n): SvgObject[] {\n const {\n anchor_position,\n text,\n font_size = 1,\n layer = \"top\",\n } = pcbSilkscreenText\n\n if (\n !anchor_position ||\n typeof anchor_position.x !== \"number\" ||\n typeof anchor_position.y !== \"number\"\n ) {\n console.error(\"Invalid anchor_position:\", anchor_position)\n return []\n }\n\n const [transformedX, transformedY] = applyToPoint(transform, [\n anchor_position.x,\n anchor_position.y,\n ])\n const transformedFontSize = font_size * Math.abs(transform.a)\n\n // Remove ${} from text value and handle undefined text\n\n // Create a composite transformation\n const textTransform = compose(\n translate(transformedX, transformedY),\n rotate(Math.PI / 180), // Convert degrees to radians\n )\n\n const svgObject: SvgObject = {\n name: \"text\",\n type: \"element\",\n attributes: {\n x: \"0\",\n y: \"0\",\n \"font-family\": \"Arial, sans-serif\",\n \"font-size\": transformedFontSize.toString(),\n \"text-anchor\": \"middle\",\n \"dominant-baseline\": \"central\",\n transform: matrixToString(textTransform),\n class: `pcb-silkscreen-text pcb-silkscreen-${layer}`,\n \"data-pcb-silkscreen-text-id\": pcbSilkscreenText.pcb_component_id,\n },\n children: [\n {\n type: \"text\",\n value: text,\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n value: \"\",\n }\n\n return [svgObject]\n}\n","/**\n * Return pairs of adjacent elements in an array.\n */\nexport function pairs<T>(arr: Array<T>): Array<[T, T]> {\n const result: Array<[T, T]> = []\n for (let i = 0; i < arr.length - 1; i++) {\n result.push([arr[i]!, arr[i + 1]!])\n }\n return result\n}\n","import type { PCBTrace } from \"circuit-json\"\nimport { pairs } from \"lib/utils/pairs\"\nimport type { INode as SvgObject } from \"svgson\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\nimport { LAYER_NAME_TO_COLOR } from \"../layer-name-to-color\"\n\nexport function createSvgObjectsFromPcbTrace(\n trace: PCBTrace,\n transform: Matrix,\n): SvgObject[] {\n if (!trace.route || !Array.isArray(trace.route) || trace.route.length < 2)\n return []\n\n const segments = pairs(trace.route)\n const svgObjects: SvgObject[] = []\n\n for (const [start, end] of segments) {\n const startPoint = applyToPoint(transform, [start.x, start.y])\n const endPoint = applyToPoint(transform, [end.x, end.y])\n\n const layer =\n \"layer\" in start ? start.layer : \"layer\" in end ? end.layer : null\n if (!layer) continue\n\n const layerColor =\n LAYER_NAME_TO_COLOR[layer as keyof typeof LAYER_NAME_TO_COLOR] ?? \"white\"\n\n const traceWidth =\n \"width\" in start ? start.width : \"width\" in end ? end.width : null\n\n svgObjects.push({\n name: \"path\",\n type: \"element\",\n value: \"\",\n children: [],\n attributes: {\n class: \"pcb-trace\",\n stroke: layerColor,\n d: `M ${startPoint[0]} ${startPoint[1]} L ${endPoint[0]} ${endPoint[1]}`,\n \"stroke-width\": traceWidth\n ? (traceWidth * Math.abs(transform.a)).toString()\n : \"0.3\",\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n \"shape-rendering\": \"crispEdges\",\n },\n })\n }\n return svgObjects\n}\n","/**\n * TODO use @tscircuit/pcb-colors when it's published\n */\nexport const LAYER_NAME_TO_COLOR = {\n top: \"rgb(200, 52, 52)\",\n bottom: \"rgb(77, 127, 196)\",\n}\n\nexport function layerNameToColor(layerName: string) {\n return (\n LAYER_NAME_TO_COLOR[layerName as keyof typeof LAYER_NAME_TO_COLOR] ??\n \"white\"\n )\n}\n","import type { PCBSMTPad } from \"circuit-json\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\nimport { layerNameToColor } from \"../layer-name-to-color\"\n\nexport function createSvgObjectsFromSmtPad(\n pad: PCBSMTPad,\n transform: Matrix,\n): any {\n const [x, y] = applyToPoint(transform, [pad.x, pad.y])\n\n if (pad.shape === \"rect\") {\n const width = pad.width * Math.abs(transform.a)\n const height = pad.height * Math.abs(transform.d)\n return [\n {\n name: \"rect\",\n type: \"element\",\n attributes: {\n class: \"pcb-pad\",\n fill: layerNameToColor(pad.layer),\n x: (x - width / 2).toString(),\n y: (y - height / 2).toString(),\n width: width.toString(),\n height: height.toString(),\n },\n },\n ]\n }\n // TODO implement smtpad circles/ovals etc.\n return []\n}\n","import type { PCBBoard, Point } from \"circuit-json\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\nimport type { SvgObject } from \"lib/svg-object\"\n\nexport function createSvgObjectsFromPcbBoard(\n pcbBoard: PCBBoard,\n transform: Matrix,\n): SvgObject[] {\n const { width, height, center, outline } = pcbBoard\n\n let path: string\n if (outline && Array.isArray(outline) && outline.length >= 3) {\n path = outline\n .map((point: Point, index: number) => {\n const [x, y] = applyToPoint(transform, [point.x, point.y])\n return index === 0 ? `M ${x} ${y}` : `L ${x} ${y}`\n })\n .join(\" \")\n } else {\n const halfWidth = width / 2\n const halfHeight = height / 2\n\n const topLeft = applyToPoint(transform, [\n center.x - halfWidth,\n center.y - halfHeight,\n ])\n const topRight = applyToPoint(transform, [\n center.x + halfWidth,\n center.y - halfHeight,\n ])\n const bottomRight = applyToPoint(transform, [\n center.x + halfWidth,\n center.y + halfHeight,\n ])\n const bottomLeft = applyToPoint(transform, [\n center.x - halfWidth,\n center.y + halfHeight,\n ])\n\n path =\n `M ${topLeft[0]} ${topLeft[1]} ` +\n `L ${topRight[0]} ${topRight[1]} ` +\n `L ${bottomRight[0]} ${bottomRight[1]} ` +\n `L ${bottomLeft[0]} ${bottomLeft[1]}`\n }\n\n path += \" Z\"\n\n return [\n {\n name: \"path\",\n type: \"element\",\n value: \"\",\n children: [],\n attributes: {\n class: \"pcb-board\",\n d: path,\n stroke: \"rgba(255, 255, 255, 0.5)\",\n \"stroke-width\": (0.1 * Math.abs(transform.a)).toString(),\n },\n },\n ]\n}\n","import type { PCBVia } from \"circuit-json\"\nimport { applyToPoint } from \"transformation-matrix\"\n\nexport function createSvgObjectsFromPcbVia(hole: PCBVia, transform: any): any {\n const [x, y] = applyToPoint(transform, [hole.x, hole.y])\n const scaledOuterWidth = hole.outer_diameter * Math.abs(transform.a)\n const scaledOuterHeight = hole.outer_diameter * Math.abs(transform.a)\n const scaledHoleWidth = hole.hole_diameter * Math.abs(transform.a)\n const scaledHoleHeight = hole.hole_diameter * Math.abs(transform.a)\n\n const outerRadius = Math.min(scaledOuterWidth, scaledOuterHeight) / 2\n const innerRadius = Math.min(scaledHoleWidth, scaledHoleHeight) / 2\n return {\n name: \"g\",\n type: \"element\",\n children: [\n {\n name: \"circle\",\n type: \"element\",\n attributes: {\n class: \"pcb-hole-outer\",\n cx: x.toString(),\n cy: y.toString(),\n r: outerRadius.toString(),\n },\n },\n {\n name: \"circle\",\n type: \"element\",\n attributes: {\n class: \"pcb-hole-inner\",\n cx: x.toString(),\n cy: y.toString(),\n r: innerRadius.toString(),\n },\n },\n ],\n }\n}\n","import type { PCBHole } from \"circuit-json\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\nimport type { SvgObject } from \"lib/svg-object\"\nimport { HOLE_COLOR } from \"../colors\"\n\nexport function createSvgObjectsFromPcbHole(\n hole: PCBHole,\n transform: Matrix,\n): SvgObject[] {\n const [x, y] = applyToPoint(transform, [hole.x, hole.y])\n\n if (hole.hole_shape === \"circle\" || hole.hole_shape === \"square\") {\n const scaledDiameter = hole.hole_diameter * Math.abs(transform.a)\n const radius = scaledDiameter / 2\n\n if (hole.hole_shape === \"circle\") {\n return [\n {\n name: \"circle\",\n type: \"element\",\n attributes: {\n class: \"pcb-hole\",\n cx: x.toString(),\n cy: y.toString(),\n r: radius.toString(),\n fill: HOLE_COLOR,\n },\n children: [],\n value: \"\",\n },\n ]\n }\n // Square hole\n return [\n {\n name: \"rect\",\n type: \"element\",\n attributes: {\n class: \"pcb-hole\",\n x: (x - radius).toString(),\n y: (y - radius).toString(),\n width: scaledDiameter.toString(),\n height: scaledDiameter.toString(),\n fill: HOLE_COLOR,\n },\n children: [],\n value: \"\",\n },\n ]\n }\n if (hole.hole_shape === \"oval\") {\n const scaledWidth = hole.hole_width * Math.abs(transform.a)\n const scaledHeight = hole.hole_height * Math.abs(transform.a)\n const rx = scaledWidth / 2\n const ry = scaledHeight / 2\n\n return [\n {\n name: \"ellipse\",\n type: \"element\",\n attributes: {\n class: \"pcb-hole\",\n cx: x.toString(),\n cy: y.toString(),\n rx: rx.toString(),\n ry: ry.toString(),\n fill: HOLE_COLOR,\n },\n children: [],\n value: \"\",\n },\n ]\n }\n\n return []\n}\n","export const HOLE_COLOR = \"#FF26E2\"\n","// Kicad-2020 color scheme\nexport const colorMap = {\n \"3d_viewer\": {\n background_bottom: \"rgb(102, 102, 128)\",\n background_top: \"rgb(204, 204, 230)\",\n board: \"rgb(51, 43, 23)\",\n copper: \"rgb(179, 156, 0)\",\n silkscreen_bottom: \"rgb(230, 230, 230)\",\n silkscreen_top: \"rgb(230, 230, 230)\",\n soldermask: \"rgb(20, 51, 36)\",\n solderpaste: \"rgb(128, 128, 128)\",\n },\n board: {\n anchor: \"rgb(255, 38, 226)\",\n aux_items: \"rgb(255, 255, 255)\",\n b_adhes: \"rgb(0, 0, 132)\",\n b_crtyd: \"rgb(255, 38, 226)\",\n b_fab: \"rgb(88, 93, 132)\",\n b_mask: \"rgba(2, 255, 238, 0.400)\",\n b_paste: \"rgb(0, 194, 194)\",\n b_silks: \"rgb(232, 178, 167)\",\n background: \"rgb(0, 16, 35)\",\n cmts_user: \"rgb(89, 148, 220)\",\n copper: {\n b: \"rgb(77, 127, 196)\",\n f: \"rgb(200, 52, 52)\",\n in1: \"rgb(127, 200, 127)\",\n in10: \"rgb(237, 124, 51)\",\n in11: \"rgb(91, 195, 235)\",\n in12: \"rgb(247, 111, 142)\",\n in13: \"rgb(167, 165, 198)\",\n in14: \"rgb(40, 204, 217)\",\n in15: \"rgb(232, 178, 167)\",\n in16: \"rgb(242, 237, 161)\",\n in17: \"rgb(237, 124, 51)\",\n in18: \"rgb(91, 195, 235)\",\n in19: \"rgb(247, 111, 142)\",\n in2: \"rgb(206, 125, 44)\",\n in20: \"rgb(167, 165, 198)\",\n in21: \"rgb(40, 204, 217)\",\n in22: \"rgb(232, 178, 167)\",\n in23: \"rgb(242, 237, 161)\",\n in24: \"rgb(237, 124, 51)\",\n in25: \"rgb(91, 195, 235)\",\n in26: \"rgb(247, 111, 142)\",\n in27: \"rgb(167, 165, 198)\",\n in28: \"rgb(40, 204, 217)\",\n in29: \"rgb(232, 178, 167)\",\n in3: \"rgb(79, 203, 203)\",\n in30: \"rgb(242, 237, 161)\",\n in4: \"rgb(219, 98, 139)\",\n in5: \"rgb(167, 165, 198)\",\n in6: \"rgb(40, 204, 217)\",\n in7: \"rgb(232, 178, 167)\",\n in8: \"rgb(242, 237, 161)\",\n in9: \"rgb(141, 203, 129)\",\n },\n cursor: \"rgb(255, 255, 255)\",\n drc: \"rgb(194, 194, 194)\",\n drc_error: \"rgba(215, 91, 107, 0.800)\",\n drc_exclusion: \"rgb(255, 255, 255)\",\n drc_warning: \"rgba(255, 208, 66, 0.902)\",\n dwgs_user: \"rgb(194, 194, 194)\",\n eco1_user: \"rgb(180, 219, 210)\",\n eco2_user: \"rgb(216, 200, 82)\",\n edge_cuts: \"rgb(208, 210, 205)\",\n f_adhes: \"rgb(132, 0, 132)\",\n f_crtyd: \"rgb(255, 0, 245)\",\n f_fab: \"rgb(175, 175, 175)\",\n f_mask: \"rgba(216, 100, 255, 0.400)\",\n f_paste: \"rgba(180, 160, 154, 0.902)\",\n f_silks: \"rgb(242, 237, 161)\",\n footprint_text_back: \"rgb(0, 0, 132)\",\n footprint_text_front: \"rgb(194, 194, 194)\",\n footprint_text_invisible: \"rgb(132, 132, 132)\",\n grid: \"rgb(132, 132, 132)\",\n grid_axes: \"rgb(194, 194, 194)\",\n margin: \"rgb(255, 38, 226)\",\n microvia: \"rgb(0, 132, 132)\",\n no_connect: \"rgb(0, 0, 132)\",\n pad_back: \"rgb(77, 127, 196)\",\n pad_front: \"rgb(200, 52, 52)\",\n pad_plated_hole: \"rgb(194, 194, 0)\",\n pad_through_hole: \"rgb(227, 183, 46)\",\n plated_hole: \"rgb(26, 196, 210)\",\n ratsnest: \"rgba(245, 255, 213, 0.702)\",\n select_overlay: \"rgb(4, 255, 67)\",\n through_via: \"rgb(236, 236, 236)\",\n user_1: \"rgb(194, 194, 194)\",\n user_2: \"rgb(89, 148, 220)\",\n user_3: \"rgb(180, 219, 210)\",\n user_4: \"rgb(216, 200, 82)\",\n user_5: \"rgb(194, 194, 194)\",\n user_6: \"rgb(89, 148, 220)\",\n user_7: \"rgb(180, 219, 210)\",\n user_8: \"rgb(216, 200, 82)\",\n user_9: \"rgb(232, 178, 167)\",\n via_blind_buried: \"rgb(187, 151, 38)\",\n via_hole: \"rgb(227, 183, 46)\",\n via_micro: \"rgb(0, 132, 132)\",\n via_through: \"rgb(236, 236, 236)\",\n worksheet: \"rgb(200, 114, 171)\",\n },\n gerbview: {\n axes: \"rgb(0, 0, 132)\",\n background: \"rgb(0, 0, 0)\",\n dcodes: \"rgb(255, 255, 255)\",\n grid: \"rgb(132, 132, 132)\",\n layers: [\n \"rgb(132, 0, 0)\",\n \"rgb(194, 194, 0)\",\n \"rgb(194, 0, 194)\",\n \"rgb(194, 0, 0)\",\n \"rgb(0, 132, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(0, 0, 132)\",\n \"rgb(132, 132, 132)\",\n \"rgb(132, 0, 132)\",\n \"rgb(194, 194, 194)\",\n \"rgb(132, 0, 132)\",\n \"rgb(132, 0, 0)\",\n \"rgb(132, 132, 0)\",\n \"rgb(194, 194, 194)\",\n \"rgb(0, 0, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(132, 0, 0)\",\n \"rgb(194, 194, 0)\",\n \"rgb(194, 0, 194)\",\n \"rgb(194, 0, 0)\",\n \"rgb(0, 132, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(0, 0, 132)\",\n \"rgb(132, 132, 132)\",\n \"rgb(132, 0, 132)\",\n \"rgb(194, 194, 194)\",\n \"rgb(132, 0, 132)\",\n \"rgb(132, 0, 0)\",\n \"rgb(132, 132, 0)\",\n \"rgb(194, 194, 194)\",\n \"rgb(0, 0, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(132, 0, 0)\",\n \"rgb(194, 194, 0)\",\n \"rgb(194, 0, 194)\",\n \"rgb(194, 0, 0)\",\n \"rgb(0, 132, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(0, 0, 132)\",\n \"rgb(132, 132, 132)\",\n \"rgb(132, 0, 132)\",\n \"rgb(194, 194, 194)\",\n \"rgb(132, 0, 132)\",\n \"rgb(132, 0, 0)\",\n \"rgb(132, 132, 0)\",\n \"rgb(194, 194, 194)\",\n \"rgb(0, 0, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(132, 0, 0)\",\n \"rgb(194, 194, 0)\",\n \"rgb(194, 0, 194)\",\n \"rgb(194, 0, 0)\",\n \"rgb(0, 132, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(0, 0, 132)\",\n \"rgb(132, 132, 132)\",\n \"rgb(132, 0, 132)\",\n \"rgb(194, 194, 194)\",\n \"rgb(132, 0, 132)\",\n \"rgb(132, 0, 0)\",\n ],\n negative_objects: \"rgb(132, 132, 132)\",\n worksheet: \"rgb(0, 0, 132)\",\n },\n meta: {\n filename: \"kicad_2020\",\n name: \"KiCad 2020\",\n version: 2,\n },\n palette: [\n \"rgb(132, 0, 0)\",\n \"rgb(194, 194, 0)\",\n \"rgb(194, 0, 194)\",\n \"rgb(194, 0, 0)\",\n \"rgb(0, 132, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(0, 0, 132)\",\n \"rgb(132, 132, 132)\",\n \"rgb(132, 0, 132)\",\n \"rgb(194, 194, 194)\",\n \"rgb(132, 0, 132)\",\n \"rgb(132, 0, 0)\",\n \"rgb(132, 132, 0)\",\n \"rgb(194, 194, 194)\",\n \"rgb(0, 0, 132)\",\n \"rgb(0, 132, 0)\",\n ],\n schematic: {\n aux_items: \"rgb(46, 46, 46)\",\n background: \"rgb(245, 241, 237)\",\n brightened: \"rgb(255, 0, 255)\",\n bus: \"rgb(0, 0, 132)\",\n bus_junction: \"rgb(0, 0, 132)\",\n component_body: \"rgb(255, 255, 194)\",\n component_outline: \"rgb(132, 0, 0)\",\n cursor: \"rgb(15, 15, 15)\",\n erc_error: \"rgba(230, 9, 13, 0.800)\",\n erc_warning: \"rgba(209, 146, 0, 0.800)\",\n fields: \"rgb(132, 0, 132)\",\n grid: \"rgb(181, 181, 181)\",\n grid_axes: \"rgb(0, 0, 132)\",\n hidden: \"rgb(194, 194, 194)\",\n junction: \"rgb(0, 150, 0)\",\n label_global: \"rgb(132, 0, 0)\",\n label_hier: \"rgb(114, 86, 0)\",\n label_local: \"rgb(15, 15, 15)\",\n net_name: \"rgb(132, 132, 132)\",\n no_connect: \"rgb(0, 0, 132)\",\n note: \"rgb(0, 0, 194)\",\n override_item_colors: false,\n pin: \"rgb(132, 0, 0)\",\n pin_name: \"rgb(0, 100, 100)\",\n pin_number: \"rgb(169, 0, 0)\",\n reference: \"rgb(0, 100, 100)\",\n shadow: \"rgba(102, 179, 255, 0.800)\",\n sheet: \"rgb(132, 0, 0)\",\n sheet_background: \"rgba(253, 255, 231, 0.000)\",\n sheet_fields: \"rgb(132, 0, 132)\",\n sheet_filename: \"rgb(114, 86, 0)\",\n sheet_label: \"rgb(0, 100, 100)\",\n sheet_name: \"rgb(0, 100, 100)\",\n value: \"rgb(0, 100, 100)\",\n wire: \"rgb(0, 150, 0)\",\n worksheet: \"rgb(132, 0, 0)\",\n },\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\nimport type { SvgObject } from \"lib/svg-object\"\nimport { colorMap } from \"lib/utils/colors\"\nimport { stringify } from \"svgson\"\nimport {\n applyToPoint,\n compose,\n scale,\n translate,\n type Matrix,\n} from \"transformation-matrix\"\nimport { drawSchematicGrid } from \"./draw-schematic-grid\"\nimport { drawSchematicLabeledPoints } from \"./draw-schematic-labeled-points\"\nimport { getSchematicBoundsFromCircuitJson } from \"./get-schematic-bounds-from-circuit-json\"\nimport { createSchematicComponent } from \"./svg-object-fns/create-svg-objects-from-sch-component\"\nimport { createSvgObjectsFromSchDebugObject } from \"./svg-object-fns/create-svg-objects-from-sch-debug-object\"\nimport { createSchematicTrace } from \"./svg-object-fns/create-svg-objects-from-sch-trace\"\n\ninterface Options {\n width?: number\n height?: number\n grid?: boolean | { cellSize?: number; labelCells?: boolean }\n labeledPoints?: Array<{ x: number; y: number; label: string }>\n}\n\nexport function convertCircuitJsonToSchematicSvg(\n circuitJson: AnyCircuitElement[],\n options?: Options,\n): string {\n // Get bounds with padding\n const bounds = getSchematicBoundsFromCircuitJson(circuitJson)\n const { minX, minY, maxX, maxY } = bounds\n\n const padding = 1 // Reduced padding for tighter boundary\n const circuitWidth = maxX - minX + 2 * padding\n const circuitHeight = maxY - minY + 2 * padding\n\n const svgWidth = options?.width ?? 1200\n const svgHeight = options?.height ?? 600\n\n // Calculate scale factor to fit circuit within SVG, maintaining aspect ratio\n const scaleX = svgWidth / circuitWidth\n const scaleY = svgHeight / circuitHeight\n const scaleFactor = Math.min(scaleX, scaleY)\n\n // Calculate centering offsets\n const offsetX = (svgWidth - circuitWidth * scaleFactor) / 2\n const offsetY = (svgHeight - circuitHeight * scaleFactor) / 2\n\n // Create transform matrix\n const transform = compose(\n translate(\n offsetX - minX * scaleFactor + padding * scaleFactor,\n svgHeight - offsetY + minY * scaleFactor - padding * scaleFactor,\n ),\n scale(scaleFactor, -scaleFactor), // Flip in y-direction\n )\n\n const svgChildren: SvgObject[] = []\n\n // Add background rectangle\n svgChildren.push({\n name: \"rect\",\n type: \"element\",\n attributes: {\n class: \"boundary\",\n x: \"0\",\n y: \"0\",\n width: svgWidth.toString(),\n height: svgHeight.toString(),\n },\n children: [],\n value: \"\",\n })\n\n // Add grid if enabled\n if (options?.grid) {\n const gridConfig = typeof options.grid === \"object\" ? options.grid : {}\n svgChildren.push(drawSchematicGrid({ bounds, transform, ...gridConfig }))\n }\n\n // Add labeled points if provided\n if (options?.labeledPoints) {\n svgChildren.push(\n drawSchematicLabeledPoints({\n points: options.labeledPoints,\n transform,\n }),\n )\n }\n\n const schDebugObjectSvgs: SvgObject[] = []\n const schComponentSvgs: SvgObject[] = []\n const schTraceSvgs: SvgObject[] = []\n\n // Process all elements using transform\n for (const elm of circuitJson) {\n if (elm.type === \"schematic_debug_object\") {\n schDebugObjectSvgs.push(\n ...createSvgObjectsFromSchDebugObject(elm, transform),\n )\n } else if (elm.type === \"schematic_component\") {\n schComponentSvgs.push(\n ...createSchematicComponent({\n component: elm,\n transform,\n circuitJson,\n }),\n )\n } else if (elm.type === \"schematic_trace\") {\n schTraceSvgs.push(...createSchematicTrace(elm, transform))\n }\n }\n\n // Add elements in correct order\n svgChildren.push(...schDebugObjectSvgs, ...schComponentSvgs, ...schTraceSvgs)\n\n const svgObject: SvgObject = {\n name: \"svg\",\n type: \"element\",\n attributes: {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: svgWidth.toString(),\n height: svgHeight.toString(),\n style: `background-color: ${colorMap.schematic.background}`,\n },\n children: [\n // Add styles\n {\n name: \"style\",\n type: \"element\",\n children: [\n {\n type: \"text\",\n value: `\n .boundary { fill: ${colorMap.schematic.background}; }\n .schematic-boundary { fill: none; stroke: #fff; stroke-width: 0.3; }\n .component { fill: none; stroke: ${colorMap.schematic.component_outline}; }\n .chip { fill: ${colorMap.schematic.component_body}; stroke: ${colorMap.schematic.component_outline}; }\n .component-pin { fill: none; stroke: ${colorMap.schematic.component_outline}; }\n .trace { stroke: ${colorMap.schematic.wire}; stroke-width: ${0.02 * scaleFactor}; fill: none; }\n .text { font-family: Arial, sans-serif; font-size: ${0.2 * scaleFactor}px; fill: ${colorMap.schematic.wire}; }\n .pin-number { font-size: ${0.15 * scaleFactor}px; fill: ${colorMap.schematic.pin_number}; }\n .port-label { fill: ${colorMap.schematic.reference}; }\n .component-name { font-size: ${0.25 * scaleFactor}px; fill: ${colorMap.schematic.reference}; }\n `,\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n value: \"\",\n attributes: {},\n },\n ...svgChildren,\n ],\n value: \"\",\n }\n\n return stringify(svgObject)\n}\n\n/**\n * @deprecated use `convertCircuitJsonToSchematicSvg` instead\n */\nexport const circuitJsonToSchematicSvg = convertCircuitJsonToSchematicSvg\n","import { colorMap } from \"lib/utils/colors\"\nimport type { INode as SvgObject } from \"svgson\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\n\nexport function drawSchematicGrid(params: {\n bounds: {\n minX: number\n minY: number\n maxX: number\n maxY: number\n }\n transform: Matrix\n cellSize?: number\n labelCells?: boolean\n}): SvgObject {\n const { minX, minY, maxX, maxY } = params.bounds\n const cellSize = params.cellSize ?? 1\n const labelCells = params.labelCells ?? false\n const gridLines: any[] = []\n\n // Helper function to transform points\n const transformPoint = (x: number, y: number) => {\n const [transformedX, transformedY] = applyToPoint(params.transform, [x, y])\n return { x: transformedX, y: transformedY }\n }\n\n // Vertical lines\n for (let x = Math.ceil(minX); x <= Math.floor(maxX); x += cellSize) {\n const start = transformPoint(x, minY)\n const end = transformPoint(x, maxY)\n \n gridLines.push({\n name: \"line\",\n type: \"element\",\n attributes: {\n x1: start.x.toString(),\n y1: start.y.toString(),\n x2: end.x.toString(),\n y2: end.y.toString(),\n stroke: colorMap.schematic.grid,\n \"stroke-width\": (0.01 * Math.abs(params.transform.a)).toString(),\n \"stroke-opacity\": \"0.5\",\n },\n })\n }\n\n // Horizontal lines\n for (let y = Math.ceil(minY); y <= Math.floor(maxY); y += cellSize) {\n const start = transformPoint(minX, y)\n const end = transformPoint(maxX, y)\n \n gridLines.push({\n name: \"line\",\n type: \"element\",\n attributes: {\n x1: start.x.toString(),\n y1: start.y.toString(),\n x2: end.x.toString(),\n y2: end.y.toString(),\n stroke: colorMap.schematic.grid,\n \"stroke-width\": (0.01 * Math.abs(params.transform.a)).toString(),\n \"stroke-opacity\": \"0.5\",\n },\n })\n }\n\n // Add cell labels if enabled\n if (labelCells) {\n for (let x = Math.ceil(minX); x <= Math.floor(maxX); x += cellSize) {\n for (let y = Math.ceil(minY); y <= Math.floor(maxY); y += cellSize) {\n const point = transformPoint(x, y)\n \n gridLines.push({\n name: \"text\",\n type: \"element\",\n attributes: {\n x: point.x.toString(),\n y: point.y.toString(),\n fill: colorMap.schematic.grid,\n \"font-size\": ((cellSize / 6) * Math.abs(params.transform.a)).toString(),\n \"fill-opacity\": \"0.5\",\n \"text-anchor\": \"middle\",\n \"dominant-baseline\": \"middle\",\n },\n children: [\n {\n type: \"text\",\n value: `${x},${y}`,\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n })\n }\n }\n }\n\n return {\n name: \"g\",\n value: \"\",\n type: \"element\",\n attributes: { class: \"grid\" },\n children: gridLines,\n }\n}","import { colorMap } from \"lib/utils/colors\"\nimport type { INode as SvgObject } from \"svgson\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\n\ninterface LabeledPoint {\n x: number\n y: number\n label?: string\n}\n\nexport function drawSchematicLabeledPoints(params: {\n points: LabeledPoint[]\n transform: Matrix\n}): SvgObject {\n const { points, transform } = params\n const labeledPointsGroup: any[] = []\n\n for (const point of points) {\n // Transform offset points for X marker\n const [x1, y1] = applyToPoint(transform, [point.x - 0.1, -(point.y - 0.1)])\n const [x2, y2] = applyToPoint(transform, [point.x + 0.1, -(point.y + 0.1)])\n const [x3, y3] = applyToPoint(transform, [point.x - 0.1, -(point.y + 0.1)])\n const [x4, y4] = applyToPoint(transform, [point.x + 0.1, -(point.y - 0.1)])\n\n // Add X marker\n labeledPointsGroup.push({\n name: \"path\",\n type: \"element\",\n attributes: {\n d: `M${x1},${y1} L${x2},${y2} M${x3},${y3} L${x4},${y4}`,\n stroke: colorMap.schematic.grid,\n \"stroke-width\": (0.02 * Math.abs(transform.a)).toString(),\n \"stroke-opacity\": \"0.7\",\n },\n })\n\n // Transform label position\n const [labelX, labelY] = applyToPoint(transform, [\n point.x + 0.15,\n -(point.y - 0.15),\n ])\n\n // Add label\n labeledPointsGroup.push({\n name: \"text\",\n type: \"element\",\n attributes: {\n x: labelX.toString(),\n y: labelY.toString(),\n fill: colorMap.schematic.grid,\n \"font-size\": (0.15 * Math.abs(transform.a)).toString(),\n \"fill-opacity\": \"0.7\",\n \"text-anchor\": \"start\",\n \"dominant-baseline\": \"middle\",\n },\n children: [\n {\n type: \"text\",\n value: point.label || `(${point.x},${point.y})`,\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n })\n }\n\n return {\n name: \"g\",\n value: \"\",\n type: \"element\",\n attributes: { class: \"labeled-points\" },\n children: labeledPointsGroup,\n }\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\n\ninterface Bounds {\n minX: number\n minY: number\n maxX: number\n maxY: number\n}\n\nexport function getSchematicBoundsFromCircuitJson(\n soup: AnyCircuitElement[],\n padding = 0.5,\n): Bounds {\n let minX = Number.POSITIVE_INFINITY\n let minY = Number.POSITIVE_INFINITY\n let maxX = Number.NEGATIVE_INFINITY\n let maxY = Number.NEGATIVE_INFINITY\n\n const portSize = 0.2\n\n // Find the bounds\n for (const item of soup) {\n if (item.type === \"schematic_component\") {\n updateBounds(item.center, item.size, item.rotation || 0)\n } else if (item.type === \"schematic_port\") {\n updateBounds(item.center, { width: portSize, height: portSize }, 0)\n } else if (item.type === \"schematic_debug_object\") {\n if (item.shape === \"rect\") {\n updateBounds(item.center, item.size, 0)\n } else if (item.shape === \"line\") {\n updateBounds(item.start, { width: 0.1, height: 0.1 }, 0)\n updateBounds(item.end, { width: 0.1, height: 0.1 }, 0)\n }\n }\n }\n\n // Add padding to bounds\n minX -= padding\n minY -= padding\n maxX += padding\n maxY += padding\n\n return { minX, minY, maxX, maxY }\n\n function updateBounds(center: any, size: any, rotation: number) {\n const corners = [\n { x: -size.width / 2, y: -size.height / 2 },\n { x: size.width / 2, y: -size.height / 2 },\n { x: size.width / 2, y: size.height / 2 },\n { x: -size.width / 2, y: size.height / 2 },\n ]\n\n for (const corner of corners) {\n const rotatedX =\n corner.x * Math.cos(rotation) - corner.y * Math.sin(rotation) + center.x\n const rotatedY =\n corner.x * Math.sin(rotation) + corner.y * Math.cos(rotation) + center.y\n minX = Math.min(minX, rotatedX)\n minY = Math.min(minY, rotatedY)\n maxX = Math.max(maxX, rotatedX)\n maxY = Math.max(maxY, rotatedY)\n }\n }\n}\n","import { su } from \"@tscircuit/soup-util\"\nimport type {\n AnyCircuitElement,\n SchematicComponent,\n SchematicPort,\n} from \"circuit-json\"\nimport type { SvgObject } from \"lib/svg-object\"\nimport { colorMap } from \"lib/utils/colors\"\nimport { getSvg, symbols } from \"schematic-symbols\"\nimport { parseSync } from \"svgson\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\n\nexport function createSchematicComponent({\n component,\n transform,\n circuitJson,\n}: {\n component: SchematicComponent\n transform: Matrix\n circuitJson: AnyCircuitElement[]\n}): SvgObject[] {\n const { center, size, rotation, symbol_name: symbolName } = component\n const portLabels = component.port_labels\n const sourceComponentId = component.source_component_id\n const schematicComponentId = component.schematic_component_id\n\n // Transform the center point for the main component position\n const [transformedX, transformedY] = applyToPoint(transform, [\n center.x,\n center.y,\n ])\n\n const componentScale = Math.abs(transform.a)\n let componentChildren: SvgObject[] = []\n const textChildren: SvgObject[] = []\n\n // Find source component and get its properties\n const sourceComponent = circuitJson?.find(\n (item) =>\n item.type === \"source_component\" &&\n item.source_component_id === sourceComponentId,\n )\n const componentName =\n sourceComponent && \"name\" in sourceComponent ? sourceComponent.name : \"\"\n const manufacturerNumber =\n sourceComponent && \"manufacturer_part_number\" in sourceComponent\n ? sourceComponent.manufacturer_part_number\n : \"\"\n const resistance =\n sourceComponent && \"resistance\" in sourceComponent\n ? sourceComponent.resistance\n : \"\"\n const capacitance =\n sourceComponent && \"capacitance\" in sourceComponent\n ? sourceComponent.capacitance\n : \"\"\n\n if (symbolName) {\n const symbol = (symbols as any)[symbolName]\n const paths = symbol.primitives.filter((p: any) => p.type === \"path\")\n const updatedSymbol = {\n ...symbol,\n primitives: paths,\n }\n const svg = parseSync(\n getSvg(updatedSymbol, {\n width: size.width,\n height: size.height,\n }),\n )\n\n componentChildren = svg.children\n .filter(\n (child: any) =>\n child.name === \"path\" && child.attributes.fill !== \"green\",\n )\n .map((path: any) => {\n const currentStrokeWidth = Number.parseFloat(\n path.attributes[\"stroke-width\"] || \"0.02\",\n )\n return {\n ...path,\n attributes: {\n ...path.attributes,\n stroke:\n path.attributes.stroke === \"black\"\n ? `${colorMap.schematic.component_outline}`\n : path.attributes.stroke,\n \"stroke-width\": currentStrokeWidth.toString(),\n },\n }\n })\n\n // Add resistance/capacitance text\n if (resistance || capacitance) {\n const [textX, textY] = applyToPoint(transform, [\n center.x,\n -(center.y - size.height / 2 - 0.2),\n ])\n\n const labelOffset = componentScale * 0.4\n textChildren.push({\n name: \"text\",\n type: \"element\",\n attributes: {\n class: \"component-name\",\n x: textX.toString(),\n y: textY.toString(),\n \"text-anchor\": \"middle\",\n \"dominant-baseline\": \"auto\",\n \"font-size\": \"0.2\",\n },\n children: [\n {\n type: \"text\",\n value: (resistance || capacitance || \"\").toString(),\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n value: \"\",\n })\n\n textChildren.push({\n name: \"text\",\n type: \"element\",\n attributes: {\n class: \"component-name\",\n x: textX.toString(),\n y: (textY - labelOffset).toString(),\n \"text-anchor\": \"middle\",\n \"dominant-baseline\": \"auto\",\n \"font-size\": \"0.2\",\n },\n children: [\n {\n type: \"text\",\n value: componentName || \"\",\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n value: \"\",\n })\n }\n } else {\n // Add basic rectangle for component body\n componentChildren.push({\n name: \"rect\",\n type: \"element\",\n value: \"\",\n attributes: {\n class: \"component chip\",\n x: (-size.width / 2).toString(),\n y: (-size.height / 2).toString(),\n width: size.width.toString(),\n height: size.height.toString(),\n \"stroke-width\": \"0.02\",\n },\n children: [],\n })\n\n // Add manufacturer number and component name text\n if (manufacturerNumber) {\n // Calculate position for top center of component\n const [textX, textY] = applyToPoint(transform, [\n center.x, // Center X position\n -(center.y - size.height / 2 - 0.5), // Above the component top edge\n ])\n\n const labelOffset = componentScale * 0.4\n\n textChildren.push({\n name: \"text\",\n type: \"element\",\n attributes: {\n class: \"component-name\",\n x: textX.toString(),\n y: textY.toString(),\n \"text-anchor\": \"right\", // Center align text\n \"dominant-baseline\": \"auto\",\n \"font-size\": \"0.2\",\n },\n children: [\n {\n type: \"text\",\n value: manufacturerNumber,\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n value: \"\",\n })\n\n // Component name below manufacturer number\n textChildren.push({\n name: \"text\",\n type: \"element\",\n attributes: {\n class: \"component-name\",\n x: textX.toString(),\n y: (textY - labelOffset).toString(),\n \"text-anchor\": \"right\", // Center align text\n \"dominant-baseline\": \"auto\",\n \"font-size\": \"0.2\",\n },\n children: [\n {\n type: \"text\",\n value: componentName || \"\",\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n value: \"\",\n })\n }\n\n // Process ports\n const schematicPorts = su(circuitJson as any).schematic_port.list({\n schematic_component_id: schematicComponentId,\n })\n const portLength = 0.2\n const circleRadius = 0.05\n\n for (const schPort of schematicPorts) {\n const { x: portX, y: portY } = schPort.center\n const srcPort = su(circuitJson as any).source_port.get(\n schPort.source_port_id,\n )\n const pinNumber = srcPort?.pin_number\n const relX = portX - center.x\n const relY = portY - center.y\n\n let endX = relX\n let endY = relY\n\n // @ts-expect-error TODO remove when schematic_port has \"side\" defined\n const portSide = schPort.side ?? schPort.center.side\n\n switch (portSide) {\n case \"left\":\n endX = relX - portLength\n break\n case \"right\":\n endX = relX + portLength\n break\n case \"top\":\n endY = relY - portLength\n break\n case \"bottom\":\n endY = relY + portLength\n break\n }\n\n // Add port line\n componentChildren.push({\n name: \"line\",\n type: \"element\",\n attributes: {\n class: \"component-pin\",\n x1: relX.toString(),\n y1: relY.toString(),\n x2: endX.toString(),\n y2: endY.toString(),\n \"stroke-width\": \"0.02\",\n },\n value: \"\",\n children: [],\n })\n\n // Add port circle\n componentChildren.push({\n name: \"circle\",\n type: \"element\",\n attributes: {\n class: \"component-pin\",\n cx: endX.toString(),\n cy: endY.toString(),\n r: circleRadius.toString(),\n \"stroke-width\": \"0.02\",\n },\n value: \"\",\n children: [],\n })\n\n // Transform port position for texts\n const [portEndX, portEndY] = applyToPoint(transform, [\n center.x + endX,\n center.y + endY,\n ])\n\n // Add port label\n const labelKey = `pin${pinNumber}`\n if (portLabels && labelKey in portLabels) {\n const labelText = portLabels[labelKey]!\n let labelX = portEndX\n let labelY = portEndY\n let textAnchor = \"middle\"\n const labelOffset = 0.6 * componentScale\n\n switch (portSide) {\n case \"left\":\n labelX += labelOffset\n labelY += 0 // Center aligned vertically\n textAnchor = \"start\"\n break\n case \"right\":\n labelX -= labelOffset\n labelY += 0 // Center aligned vertically\n textAnchor = \"end\"\n break\n case \"top\":\n labelY -= labelOffset\n break\n case \"bottom\":\n labelY += labelOffset\n break\n }\n\n textChildren.push({\n name: \"text\",\n type: \"element\",\n attributes: {\n class: \"port-label\",\n x: labelX.toString(),\n y: labelY.toString(),\n \"text-anchor\": textAnchor,\n \"dominant-baseline\": \"middle\",\n \"font-size\": (0.2 * componentScale).toString(),\n },\n children: [\n {\n type: \"text\",\n value: labelText,\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n value: \"\",\n })\n }\n\n // Add pin number\n const pinNumberOffset = 0.2\n let pinX = endX\n let pinY = endY\n let dominantBaseline = \"auto\"\n\n switch (portSide) {\n case \"top\":\n // For top ports, stay at the same X but offset Y upward\n pinY = -(portY - portLength + pinNumberOffset) // Move above the circle\n pinX = portX // Stay aligned with port\n dominantBaseline = \"auto\"\n break\n case \"bottom\":\n // For bottom ports, stay at the same X but offset Y downward\n pinY = portY + portLength - pinNumberOffset\n pinX = portX\n dominantBaseline = \"hanging\"\n break\n case \"left\":\n // For left ports, stay at the same Y but offset X\n pinX = portX - pinNumberOffset\n pinY = portY + pinNumberOffset\n dominantBaseline = \"auto\"\n break\n case \"right\":\n // For right ports, stay at the same Y but offset X\n pinX = portX + pinNumberOffset\n pinY = portY + pinNumberOffset\n dominantBaseline = \"auto\"\n break\n }\n\n // Transform the pin position from local to global coordinates\n const [transformedPinX, transformedPinY] = applyToPoint(transform, [\n pinX,\n pinY,\n ])\n\n textChildren.push({\n name: \"text\",\n type: \"element\",\n attributes: {\n class: \"pin-number\",\n x: transformedPinX.toString(),\n y: transformedPinY.toString(),\n \"text-anchor\": \"middle\",\n \"dominant-baseline\": dominantBaseline,\n \"font-size\": (0.15 * componentScale).toString(),\n },\n children: [\n {\n type: \"text\",\n value: pinNumber?.toString() || \"\",\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n value: \"\",\n })\n }\n }\n\n // Create component group with scaling\n const componentGroup: SvgObject = {\n name: \"g\",\n value: \"\",\n type: \"element\",\n attributes: {\n transform: `translate(${transformedX}, ${transformedY}) rotate(${\n (rotation * 180) / Math.PI\n }) scale(${componentScale})`,\n },\n children: componentChildren,\n }\n\n // Create text group without scaling\n const textGroup: SvgObject = {\n name: \"g\",\n value: \"\",\n type: \"element\",\n attributes: {},\n children: textChildren,\n }\n\n return [componentGroup, textGroup]\n}\n","import type { SchematicDebugObject } from \"circuit-json\"\nimport type { INode as SvgObject } from \"svgson\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\n\nexport function createSvgObjectsFromSchDebugObject(\n debugObject: SchematicDebugObject,\n transform: Matrix,\n): SvgObject[] {\n if (debugObject.shape === \"rect\") {\n // Transform all corners\n let [screenLeft, screenTop] = applyToPoint(transform, [\n debugObject.center.x - debugObject.size.width / 2,\n debugObject.center.y - debugObject.size.height / 2,\n ])\n let [screenRight, screenBottom] = applyToPoint(transform, [\n debugObject.center.x + debugObject.size.width / 2,\n debugObject.center.y + debugObject.size.height / 2,\n ])\n ;[screenTop, screenBottom] = [\n Math.min(screenTop, screenBottom),\n Math.max(screenTop, screenBottom),\n ]\n\n // Calculate screen width and height\n const width = Math.abs(screenRight - screenLeft)\n const height = Math.abs(screenBottom - screenTop)\n\n const [screenCenterX, screenCenterY] = applyToPoint(transform, [\n debugObject.center.x,\n debugObject.center.y,\n ])\n\n return [\n {\n name: \"rect\",\n type: \"element\",\n value: \"\",\n attributes: {\n x: screenLeft.toString(),\n y: screenTop.toString(),\n width: width.toString(),\n height: height.toString(),\n fill: \"none\",\n stroke: \"red\",\n \"stroke-width\": (0.02 * Math.abs(transform.a)).toString(),\n \"stroke-dasharray\": \"5,5\",\n },\n children: debugObject.label\n ? [\n {\n name: \"text\",\n type: \"element\",\n value: \"\",\n attributes: {\n x: screenCenterX.toString(),\n y: (screenCenterY - 10).toString(),\n \"text-anchor\": \"middle\",\n \"font-size\": (0.2 * Math.abs(transform.a)).toString(),\n fill: \"red\",\n },\n children: [\n {\n type: \"text\",\n value: debugObject.label,\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n },\n ]\n : [],\n },\n ]\n }\n if (debugObject.shape === \"line\") {\n // Transform start and end points - flip Y coordinates\n const [screenStartX, screenStartY] = applyToPoint(transform, [\n debugObject.start.x,\n debugObject.start.y,\n ])\n const [screenEndX, screenEndY] = applyToPoint(transform, [\n debugObject.end.x,\n debugObject.end.y,\n ])\n\n // Calculate midpoint for label\n const screenMidX = (screenStartX + screenEndX) / 2\n const screenMidY = (screenStartY + screenEndY) / 2\n\n return [\n {\n name: \"line\",\n type: \"element\",\n value: \"\",\n attributes: {\n x1: screenStartX.toString(),\n y1: screenStartY.toString(),\n x2: screenEndX.toString(),\n y2: screenEndY.toString(),\n stroke: \"red\",\n \"stroke-width\": (0.02 * Math.abs(transform.a)).toString(),\n \"stroke-dasharray\": \"5,5\",\n },\n children: debugObject.label\n ? [\n {\n name: \"text\",\n type: \"element\",\n value: \"\",\n attributes: {\n x: screenMidX.toString(),\n y: (screenMidY - 10).toString(),\n \"text-anchor\": \"middle\",\n \"font-size\": (0.2 * Math.abs(transform.a)).toString(),\n fill: \"red\",\n },\n children: [\n {\n type: \"text\",\n value: debugObject.label,\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n },\n ]\n : [],\n },\n ]\n }\n return []\n}\n","import type { SchematicTrace } from \"circuit-json\"\nimport type { SvgObject } from \"lib/svg-object\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\n\nexport function createSchematicTrace(\n trace: SchematicTrace,\n transform: Matrix,\n): SvgObject[] {\n const edges = trace.edges\n if (edges.length === 0) return []\n\n let path = \"\"\n\n // Process all edges\n edges.forEach((edge: any, index: number) => {\n // Get the points, applying trace offset\n const fromPoint = {\n x: (edge.from.x ?? edge.from.center?.x) - 0.15,\n y: edge.from.y ?? edge.from.center?.y,\n }\n const toPoint = {\n x: (edge.to.x ?? edge.to.center?.x) + 0.15,\n y: edge.to.y ?? edge.to.center?.y,\n }\n\n // Transform the points using the matrix\n const [transformedFromX, transformedFromY] = applyToPoint(transform, [\n fromPoint.x,\n fromPoint.y,\n ])\n const [transformedToX, transformedToY] = applyToPoint(transform, [\n toPoint.x,\n toPoint.y,\n ])\n\n // Build the path string\n if (index === 0) {\n path += `M ${transformedFromX} ${transformedFromY} L ${transformedToX} ${transformedToY}`\n } else {\n path += ` L ${transformedToX} ${transformedToY}`\n }\n })\n\n // Only create SVG object if we have a valid path\n return path\n ? [\n {\n name: \"path\",\n type: \"element\",\n attributes: {\n class: \"trace\",\n d: path,\n \"stroke-width\": (0.02 * Math.abs(transform.a)).toString(), // Scale stroke width with transform\n },\n value: \"\",\n children: [],\n },\n ]\n : []\n}\n"],"mappings":"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","names":["applyToPoint","compose","translate","applyToPoint","applyToPoint","applyToPoint","applyToPoint","compose","rotate","translate","matrixToString","applyToPoint","applyToPoint","applyToPoint","applyToPoint","applyToPoint","applyToPoint","applyToPoint","applyToPoint","compose","translate","applyToPoint","stringify","compose","scale","translate","applyToPoint","applyToPoint","applyToPoint","applyToPoint","applyToPoint","compose","translate","scale","stringify"]}
|
|
1
|
+
{"version":3,"sources":["../lib/pcb/convert-circuit-json-to-pcb-svg.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-pcb-fabrication-note-path.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-pcb-fabrication-note-text.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-pcb-plated-hole.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-pcb-silkscreen-path.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-pcb-silkscreen-text.ts","../lib/utils/pairs.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-pcb-trace.ts","../lib/pcb/layer-name-to-color.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-smt-pads.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-pcb-board.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-pcb-via.ts","../lib/pcb/svg-object-fns/create-svg-objects-from-pcb-hole.ts","../lib/pcb/colors.ts","../lib/utils/colors.ts","../lib/sch/convert-circuit-json-to-schematic-svg.ts","../lib/sch/draw-schematic-grid.ts","../lib/sch/draw-schematic-labeled-points.ts","../lib/sch/get-schematic-bounds-from-circuit-json.ts","../lib/sch/svg-object-fns/create-svg-objects-from-sch-component.ts","../lib/sch/svg-object-fns/create-svg-objects-from-sch-debug-object.ts","../lib/sch/svg-object-fns/create-svg-objects-from-sch-trace.ts"],"sourcesContent":["import type { Point, AnyCircuitElement } from \"circuit-json\"\nimport { type INode as SvgObject, stringify } from \"svgson\"\nimport {\n type Matrix,\n applyToPoint,\n compose,\n scale,\n translate,\n} from \"transformation-matrix\"\nimport { createSvgObjectsFromPcbFabricationNotePath } from \"./svg-object-fns/create-svg-objects-from-pcb-fabrication-note-path\"\nimport { createSvgObjectsFromPcbFabricationNoteText } from \"./svg-object-fns/create-svg-objects-from-pcb-fabrication-note-text\"\nimport { createSvgObjectsFromPcbPlatedHole } from \"./svg-object-fns/create-svg-objects-from-pcb-plated-hole\"\nimport { createSvgObjectsFromPcbSilkscreenPath } from \"./svg-object-fns/create-svg-objects-from-pcb-silkscreen-path\"\nimport { createSvgObjectsFromPcbSilkscreenText } from \"./svg-object-fns/create-svg-objects-from-pcb-silkscreen-text\"\nimport { createSvgObjectsFromPcbTrace } from \"./svg-object-fns/create-svg-objects-from-pcb-trace\"\nimport { createSvgObjectsFromSmtPad } from \"./svg-object-fns/create-svg-objects-from-smt-pads\"\nimport { createSvgObjectsFromPcbBoard } from \"./svg-object-fns/create-svg-objects-from-pcb-board\"\nimport { createSvgObjectsFromPcbVia } from \"./svg-object-fns/create-svg-objects-from-pcb-via\"\nimport { createSvgObjectsFromPcbHole } from \"./svg-object-fns/create-svg-objects-from-pcb-hole\"\n\nconst OBJECT_ORDER: AnyCircuitElement[\"type\"][] = [\n \"pcb_plated_hole\",\n \"pcb_fabrication_note_text\",\n \"pcb_fabrication_note_path\",\n \"pcb_silkscreen_text\",\n \"pcb_silkscreen_path\",\n \"pcb_via\",\n \"pcb_trace\",\n \"pcb_smtpad\",\n \"pcb_component\",\n \"pcb_board\",\n]\n\ninterface PointObjectNotation {\n x: number\n y: number\n}\n\ninterface Options {\n width?: number\n height?: number\n}\n\nexport function convertCircuitJsonToPcbSvg(\n soup: AnyCircuitElement[],\n options?: Options,\n): string {\n let minX = Number.POSITIVE_INFINITY\n let minY = Number.POSITIVE_INFINITY\n let maxX = Number.NEGATIVE_INFINITY\n let maxY = Number.NEGATIVE_INFINITY\n\n // Process all elements to determine bounds\n for (const item of soup) {\n if (item.type === \"pcb_board\") {\n if (\n item.outline &&\n Array.isArray(item.outline) &&\n item.outline.length >= 3\n )\n updateBoundsToIncludeOutline(item.outline)\n else if (\"center\" in item && \"width\" in item && \"height\" in item)\n updateBounds(item.center, item.width, item.height)\n } else if (\"x\" in item && \"y\" in item) {\n updateBounds({ x: item.x, y: item.y }, 0, 0)\n } else if (\"route\" in item) {\n updateTraceBounds(item.route)\n }\n }\n\n const padding = 1 // Reduced padding for tighter boundary\n const circuitWidth = maxX - minX + 2 * padding\n const circuitHeight = maxY - minY + 2 * padding\n\n const svgWidth = options?.width ?? 800\n const svgHeight = options?.height ?? 600\n const paths: PointObjectNotation[][] = []\n for (const item of soup) {\n if (\"route\" in item && item.route !== undefined) {\n paths.push(item.route as PointObjectNotation[])\n }\n }\n\n // Calculate scale factor to fit the circuit within the SVG, maintaining aspect ratio\n const scaleX = svgWidth / circuitWidth\n const scaleY = svgHeight / circuitHeight\n const scaleFactor = Math.min(scaleX, scaleY)\n\n // Calculate centering offsets\n const offsetX = (svgWidth - circuitWidth * scaleFactor) / 2\n const offsetY = (svgHeight - circuitHeight * scaleFactor) / 2\n\n const transform = compose(\n translate(\n offsetX - minX * scaleFactor + padding * scaleFactor,\n svgHeight - offsetY + minY * scaleFactor - padding * scaleFactor,\n ),\n scale(scaleFactor, -scaleFactor), // Flip in y-direction\n )\n\n const svgObjects = soup\n .sort(\n (a, b) =>\n (OBJECT_ORDER.indexOf(b.type) ?? 9999) -\n (OBJECT_ORDER.indexOf(a.type) ?? 9999),\n )\n .flatMap((item) => createSvgObjects(item, transform))\n\n let strokeWidth = String(0.05 * scaleFactor)\n\n for (const element of soup) {\n if (\"stroke_width\" in element) {\n strokeWidth = String(scaleFactor * element.stroke_width)\n break\n }\n }\n\n const svgObject: SvgObject = {\n name: \"svg\",\n type: \"element\",\n attributes: {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: svgWidth.toString(),\n height: svgHeight.toString(),\n },\n value: \"\",\n children: [\n {\n name: \"style\",\n type: \"element\",\n children: [\n {\n type: \"text\",\n value: `\n .boundary { fill: #000; }\n .pcb-board { fill: none; }\n .pcb-trace { fill: none; }\n .pcb-hole-outer { fill: rgb(200, 52, 52); }\n .pcb-hole-inner { fill: rgb(255, 38, 226); }\n .pcb-pad { }\n .pcb-boundary { fill: none; stroke: #fff; stroke-width: 0.3; }\n .pcb-silkscreen { fill: none; }\n .pcb-silkscreen-top { stroke: #f2eda1; }\n .pcb-silkscreen-bottom { stroke: #f2eda1; }\n .pcb-silkscreen-text { fill: #f2eda1; }\n `,\n },\n ],\n },\n {\n name: \"rect\",\n type: \"element\",\n attributes: {\n class: \"boundary\",\n x: \"0\",\n y: \"0\",\n width: svgWidth.toString(),\n height: svgHeight.toString(),\n },\n },\n createSvgObjectFromPcbBoundary(transform, minX, minY, maxX, maxY),\n ...svgObjects,\n ].filter((child): child is SvgObject => child !== null),\n }\n\n try {\n return stringify(svgObject as SvgObject)\n } catch (error) {\n console.error(\"Error stringifying SVG object:\", error)\n throw error\n }\n\n function updateBounds(center: any, width: any, height: any) {\n const halfWidth = width / 2\n const halfHeight = height / 2\n minX = Math.min(minX, center.x - halfWidth)\n minY = Math.min(minY, center.y - halfHeight)\n maxX = Math.max(maxX, center.x + halfWidth)\n maxY = Math.max(maxY, center.y + halfHeight)\n }\n\n function updateBoundsToIncludeOutline(outline: Point[]) {\n for (const point of outline) {\n minX = Math.min(minX, point.x)\n minY = Math.min(minY, point.y)\n maxX = Math.max(maxX, point.x)\n maxY = Math.max(maxY, point.y)\n }\n }\n\n function updateTraceBounds(route: any[]) {\n for (const point of route) {\n minX = Math.min(minX, point.x)\n minY = Math.min(minY, point.y)\n maxX = Math.max(maxX, point.x)\n maxY = Math.max(maxY, point.y)\n }\n }\n}\n\nfunction createSvgObjects(\n elm: AnyCircuitElement,\n transform: Matrix,\n): SvgObject[] {\n switch (elm.type) {\n case \"pcb_component\":\n return [createSvgObjectsFromPcbComponent(elm, transform)].filter(Boolean)\n case \"pcb_trace\":\n return createSvgObjectsFromPcbTrace(elm, transform)\n case \"pcb_plated_hole\":\n return createSvgObjectsFromPcbPlatedHole(elm, transform).filter(Boolean)\n case \"pcb_hole\":\n return createSvgObjectsFromPcbHole(elm, transform)\n case \"pcb_smtpad\":\n return createSvgObjectsFromSmtPad(elm, transform)\n case \"pcb_silkscreen_text\":\n return createSvgObjectsFromPcbSilkscreenText(elm, transform)\n case \"pcb_fabrication_note_path\":\n return createSvgObjectsFromPcbFabricationNotePath(elm, transform)\n case \"pcb_fabrication_note_text\":\n return createSvgObjectsFromPcbFabricationNoteText(elm, transform)\n case \"pcb_silkscreen_path\":\n return createSvgObjectsFromPcbSilkscreenPath(elm, transform)\n case \"pcb_board\":\n return createSvgObjectsFromPcbBoard(elm, transform)\n case \"pcb_via\":\n return createSvgObjectsFromPcbVia(elm, transform)\n default:\n return []\n }\n}\n\nfunction createSvgObjectsFromPcbComponent(component: any, transform: any): any {\n const { center, width, height, rotation = 0 } = component\n const [x, y] = applyToPoint(transform, [center.x, center.y])\n const scaledWidth = width * Math.abs(transform.a)\n const scaledHeight = height * Math.abs(transform.d)\n const transformStr = `translate(${x}, ${y}) rotate(${-rotation}) scale(1, -1)`\n\n return {\n name: \"g\",\n type: \"element\",\n attributes: { transform: transformStr },\n children: [\n {\n name: \"rect\",\n type: \"element\",\n attributes: {\n class: \"pcb-component\",\n x: (-scaledWidth / 2).toString(),\n y: (-scaledHeight / 2).toString(),\n width: scaledWidth.toString(),\n height: scaledHeight.toString(),\n },\n },\n {\n name: \"rect\",\n type: \"element\",\n attributes: {\n class: \"pcb-component-outline\",\n x: (-scaledWidth / 2).toString(),\n y: (-scaledHeight / 2).toString(),\n width: scaledWidth.toString(),\n height: scaledHeight.toString(),\n },\n },\n ],\n }\n}\n\nfunction createSvgObjectFromPcbBoundary(\n transform: any,\n minX: number,\n minY: number,\n maxX: number,\n maxY: number,\n): SvgObject {\n const [x1, y1] = applyToPoint(transform, [minX, minY])\n const [x2, y2] = applyToPoint(transform, [maxX, maxY])\n const width = Math.abs(x2 - x1)\n const height = Math.abs(y2 - y1)\n const x = Math.min(x1, x2)\n const y = Math.min(y1, y2)\n return {\n name: \"rect\",\n type: \"element\",\n value: \"\",\n children: [],\n attributes: {\n class: \"pcb-boundary\",\n x: x.toString(),\n y: y.toString(),\n width: width.toString(),\n height: height.toString(),\n },\n }\n}\n\n/**\n * @deprecated use `convertCircuitJsonToPcbSvg` instead\n */\nexport const circuitJsonToPcbSvg = convertCircuitJsonToPcbSvg\n","import type { PcbSilkscreenPath, PcbFabricationNotePath } from \"circuit-json\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\nimport type { SvgObject } from \"lib/svg-object\"\n\nexport function createSvgObjectsFromPcbFabricationNotePath(\n fabNotePath: PcbFabricationNotePath,\n transform: Matrix,\n): SvgObject[] {\n if (!fabNotePath.route || !Array.isArray(fabNotePath.route)) return []\n\n // Close the path if the first and last points are the same\n const firstPoint = fabNotePath.route[0]\n const lastPoint = fabNotePath.route[fabNotePath.route.length - 1]\n const isClosed =\n firstPoint!.x === lastPoint!.x && firstPoint!.y === lastPoint!.y\n\n const path =\n fabNotePath.route\n .slice(0, isClosed ? -1 : undefined)\n .map((point: any, index: number) => {\n const [x, y] = applyToPoint(transform, [point.x, point.y])\n return index === 0 ? `M ${x} ${y}` : `L ${x} ${y}`\n })\n .join(\" \") + (isClosed ? \" Z\" : \"\")\n\n return [\n {\n name: \"path\",\n type: \"element\",\n attributes: {\n class: \"pcb-fabrication-note-path\",\n stroke: fabNotePath.color || \"rgba(255,255,255,0.5)\",\n fill: \"none\",\n d: path,\n \"stroke-width\": (\n fabNotePath.stroke_width * Math.abs(transform.a)\n ).toString(),\n \"data-pcb-component-id\": fabNotePath.pcb_component_id,\n \"data-pcb-fabrication-note-path-id\":\n fabNotePath.pcb_fabrication_note_path_id,\n },\n value: \"\",\n children: [],\n },\n ]\n}\n","import type { PcbFabricationNoteText } from \"circuit-json\"\nimport type { INode as SvgObject } from \"svgson\"\nimport { toString as matrixToString } from \"transformation-matrix\"\nimport {\n type Matrix,\n applyToPoint,\n compose,\n rotate,\n translate,\n} from \"transformation-matrix\"\n\nexport function createSvgObjectsFromPcbFabricationNoteText(\n pcbFabNoteText: PcbFabricationNoteText,\n transform: Matrix,\n): SvgObject[] {\n const {\n anchor_position,\n anchor_alignment,\n text,\n font_size = 1,\n layer = \"top\",\n color,\n } = pcbFabNoteText\n\n if (\n !anchor_position ||\n typeof anchor_position.x !== \"number\" ||\n typeof anchor_position.y !== \"number\"\n ) {\n console.error(\"Invalid anchor_position:\", anchor_position)\n return []\n }\n\n const [transformedX, transformedY] = applyToPoint(transform, [\n anchor_position.x,\n anchor_position.y,\n ])\n const transformedFontSize = font_size * Math.abs(transform.a)\n\n // Remove ${} from text value and handle undefined text\n\n // Create a composite transformation\n const textTransform = compose(\n translate(transformedX, transformedY), // TODO do anchor_alignment\n rotate(Math.PI / 180), // Convert degrees to radians\n )\n\n const svgObject: SvgObject = {\n name: \"text\",\n type: \"element\",\n attributes: {\n x: \"0\",\n y: \"0\",\n \"font-family\": \"Arial, sans-serif\",\n \"font-size\": transformedFontSize.toString(),\n \"text-anchor\": \"middle\",\n \"dominant-baseline\": \"central\",\n transform: matrixToString(textTransform),\n class: \"pcb-fabrication-note-text\",\n fill: color || \"rgba(255,255,255,0.5)\",\n },\n children: [\n {\n type: \"text\",\n value: text,\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n value: \"\",\n }\n\n return [svgObject]\n}\n","import type { PCBPlatedHole } from \"circuit-json\"\nimport { applyToPoint } from \"transformation-matrix\"\nimport type { SvgObject } from \"lib/svg-object\"\n\nexport function createSvgObjectsFromPcbPlatedHole(\n hole: PCBPlatedHole,\n transform: any,\n): SvgObject[] {\n const [x, y] = applyToPoint(transform, [hole.x, hole.y])\n\n if (hole.shape === \"pill\") {\n const scaledOuterWidth = hole.outer_width * Math.abs(transform.a)\n const scaledOuterHeight = hole.outer_height * Math.abs(transform.a)\n const scaledHoleWidth = hole.hole_width * Math.abs(transform.a)\n const scaledHoleHeight = hole.hole_height * Math.abs(transform.a)\n\n const outerRadiusX = scaledOuterWidth / 2\n const outerRadiusY = scaledOuterHeight / 2\n const innerRadiusX = scaledHoleWidth / 2\n const innerRadiusY = scaledHoleHeight / 2\n const straightLength = scaledOuterHeight - scaledOuterWidth\n\n return [\n {\n name: \"g\",\n type: \"element\",\n children: [\n // Outer pill shape\n {\n name: \"path\",\n type: \"element\",\n attributes: {\n class: \"pcb-hole-outer\",\n d:\n `M${x - outerRadiusX},${y - straightLength / 2} ` +\n `v${straightLength} ` +\n `a${outerRadiusX},${outerRadiusX} 0 0 0 ${scaledOuterWidth},0 ` +\n `v-${straightLength} ` +\n `a${outerRadiusX},${outerRadiusX} 0 0 0 -${scaledOuterWidth},0 z`,\n },\n value: \"\",\n children: [],\n },\n // Inner pill shape\n {\n name: \"path\",\n type: \"element\",\n attributes: {\n class: \"pcb-hole-inner\",\n d:\n `M${x - innerRadiusX},${y - (scaledHoleHeight - scaledHoleWidth) / 2} ` +\n `v${scaledHoleHeight - scaledHoleWidth} ` +\n `a${innerRadiusX},${innerRadiusX} 0 0 0 ${scaledHoleWidth},0 ` +\n `v-${scaledHoleHeight - scaledHoleWidth} ` +\n `a${innerRadiusX},${innerRadiusX} 0 0 0 -${scaledHoleWidth},0 z`,\n },\n value: \"\",\n children: [],\n },\n ],\n value: \"\",\n attributes: {},\n },\n ]\n }\n // Fallback to circular hole if not pill-shaped\n if (hole.shape === \"circle\") {\n const scaledOuterWidth = hole.outer_diameter * Math.abs(transform.a)\n const scaledOuterHeight = hole.outer_diameter * Math.abs(transform.a)\n const scaledHoleWidth = hole.hole_diameter * Math.abs(transform.a)\n const scaledHoleHeight = hole.hole_diameter * Math.abs(transform.a)\n\n const outerRadius = Math.min(scaledOuterWidth, scaledOuterHeight) / 2\n const innerRadius = Math.min(scaledHoleWidth, scaledHoleHeight) / 2\n return [\n {\n name: \"g\",\n type: \"element\",\n children: [\n {\n name: \"circle\",\n type: \"element\",\n attributes: {\n class: \"pcb-hole-outer\",\n cx: x.toString(),\n cy: y.toString(),\n r: outerRadius.toString(),\n },\n value: \"\",\n children: [],\n },\n {\n name: \"circle\",\n type: \"element\",\n attributes: {\n class: \"pcb-hole-inner\",\n cx: x.toString(),\n cy: y.toString(),\n r: innerRadius.toString(),\n },\n value: \"\",\n children: [],\n },\n ],\n value: \"\",\n attributes: {},\n },\n ]\n }\n return []\n}\n","import type { PcbSilkscreenPath } from \"circuit-json\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\nimport type { SvgObject } from \"lib/svg-object\"\n\nexport function createSvgObjectsFromPcbSilkscreenPath(\n silkscreenPath: PcbSilkscreenPath,\n transform: Matrix,\n): SvgObject[] {\n if (!silkscreenPath.route || !Array.isArray(silkscreenPath.route)) return []\n\n let path = silkscreenPath.route\n .map((point: any, index: number) => {\n const [x, y] = applyToPoint(transform, [point.x, point.y])\n return index === 0 ? `M ${x} ${y}` : `L ${x} ${y}`\n })\n .join(\" \")\n\n // Close the path if the first and last points match\n const firstPoint = silkscreenPath.route[0]\n const lastPoint = silkscreenPath.route[silkscreenPath.route.length - 1]\n if (\n firstPoint &&\n lastPoint &&\n firstPoint.x === lastPoint.x &&\n firstPoint.y === lastPoint.y\n ) {\n path += \" Z\"\n }\n return [\n {\n name: \"path\",\n type: \"element\",\n attributes: {\n class: `pcb-silkscreen pcb-silkscreen-${silkscreenPath.layer}`,\n d: path,\n \"stroke-width\": (\n silkscreenPath.stroke_width * Math.abs(transform.a)\n ).toString(),\n \"data-pcb-component-id\": silkscreenPath.pcb_component_id,\n \"data-pcb-silkscreen-path-id\": silkscreenPath.pcb_silkscreen_path_id,\n },\n value: \"\",\n children: [],\n },\n ]\n}\n","import type { PcbSilkscreenText } from \"circuit-json\"\nimport type { INode as SvgObject } from \"svgson\"\nimport {\n type Matrix,\n applyToPoint,\n compose,\n rotate,\n translate,\n toString as matrixToString,\n} from \"transformation-matrix\"\n\nexport function createSvgObjectsFromPcbSilkscreenText(\n pcbSilkscreenText: PcbSilkscreenText,\n transform: Matrix,\n): SvgObject[] {\n const {\n anchor_position,\n text,\n font_size = 1,\n layer = \"top\",\n } = pcbSilkscreenText\n\n if (\n !anchor_position ||\n typeof anchor_position.x !== \"number\" ||\n typeof anchor_position.y !== \"number\"\n ) {\n console.error(\"Invalid anchor_position:\", anchor_position)\n return []\n }\n\n const [transformedX, transformedY] = applyToPoint(transform, [\n anchor_position.x,\n anchor_position.y,\n ])\n const transformedFontSize = font_size * Math.abs(transform.a)\n\n // Remove ${} from text value and handle undefined text\n\n // Create a composite transformation\n const textTransform = compose(\n translate(transformedX, transformedY),\n rotate(Math.PI / 180), // Convert degrees to radians\n )\n\n const svgObject: SvgObject = {\n name: \"text\",\n type: \"element\",\n attributes: {\n x: \"0\",\n y: \"0\",\n \"font-family\": \"Arial, sans-serif\",\n \"font-size\": transformedFontSize.toString(),\n \"text-anchor\": \"middle\",\n \"dominant-baseline\": \"central\",\n transform: matrixToString(textTransform),\n class: `pcb-silkscreen-text pcb-silkscreen-${layer}`,\n \"data-pcb-silkscreen-text-id\": pcbSilkscreenText.pcb_component_id,\n },\n children: [\n {\n type: \"text\",\n value: text,\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n value: \"\",\n }\n\n return [svgObject]\n}\n","/**\n * Return pairs of adjacent elements in an array.\n */\nexport function pairs<T>(arr: Array<T>): Array<[T, T]> {\n const result: Array<[T, T]> = []\n for (let i = 0; i < arr.length - 1; i++) {\n result.push([arr[i]!, arr[i + 1]!])\n }\n return result\n}\n","import type { PCBTrace } from \"circuit-json\"\nimport { pairs } from \"lib/utils/pairs\"\nimport type { INode as SvgObject } from \"svgson\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\nimport { LAYER_NAME_TO_COLOR } from \"../layer-name-to-color\"\n\nexport function createSvgObjectsFromPcbTrace(\n trace: PCBTrace,\n transform: Matrix,\n): SvgObject[] {\n if (!trace.route || !Array.isArray(trace.route) || trace.route.length < 2)\n return []\n\n const segments = pairs(trace.route)\n const svgObjects: SvgObject[] = []\n\n for (const [start, end] of segments) {\n const startPoint = applyToPoint(transform, [start.x, start.y])\n const endPoint = applyToPoint(transform, [end.x, end.y])\n\n const layer =\n \"layer\" in start ? start.layer : \"layer\" in end ? end.layer : null\n if (!layer) continue\n\n const layerColor =\n LAYER_NAME_TO_COLOR[layer as keyof typeof LAYER_NAME_TO_COLOR] ?? \"white\"\n\n const traceWidth =\n \"width\" in start ? start.width : \"width\" in end ? end.width : null\n\n svgObjects.push({\n name: \"path\",\n type: \"element\",\n value: \"\",\n children: [],\n attributes: {\n class: \"pcb-trace\",\n stroke: layerColor,\n d: `M ${startPoint[0]} ${startPoint[1]} L ${endPoint[0]} ${endPoint[1]}`,\n \"stroke-width\": traceWidth\n ? (traceWidth * Math.abs(transform.a)).toString()\n : \"0.3\",\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n \"shape-rendering\": \"crispEdges\",\n },\n })\n }\n return svgObjects\n}\n","/**\n * TODO use @tscircuit/pcb-colors when it's published\n */\nexport const LAYER_NAME_TO_COLOR = {\n top: \"rgb(200, 52, 52)\",\n bottom: \"rgb(77, 127, 196)\",\n}\n\nexport function layerNameToColor(layerName: string) {\n return (\n LAYER_NAME_TO_COLOR[layerName as keyof typeof LAYER_NAME_TO_COLOR] ??\n \"white\"\n )\n}\n","import type { PCBSMTPad } from \"circuit-json\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\nimport { layerNameToColor } from \"../layer-name-to-color\"\n\nexport function createSvgObjectsFromSmtPad(\n pad: PCBSMTPad,\n transform: Matrix,\n): any {\n const [x, y] = applyToPoint(transform, [pad.x, pad.y])\n\n if (pad.shape === \"rect\") {\n const width = pad.width * Math.abs(transform.a)\n const height = pad.height * Math.abs(transform.d)\n return [\n {\n name: \"rect\",\n type: \"element\",\n attributes: {\n class: \"pcb-pad\",\n fill: layerNameToColor(pad.layer),\n x: (x - width / 2).toString(),\n y: (y - height / 2).toString(),\n width: width.toString(),\n height: height.toString(),\n },\n },\n ]\n }\n // TODO implement smtpad circles/ovals etc.\n return []\n}\n","import type { PCBBoard, Point } from \"circuit-json\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\nimport type { SvgObject } from \"lib/svg-object\"\n\nexport function createSvgObjectsFromPcbBoard(\n pcbBoard: PCBBoard,\n transform: Matrix,\n): SvgObject[] {\n const { width, height, center, outline } = pcbBoard\n\n let path: string\n if (outline && Array.isArray(outline) && outline.length >= 3) {\n path = outline\n .map((point: Point, index: number) => {\n const [x, y] = applyToPoint(transform, [point.x, point.y])\n return index === 0 ? `M ${x} ${y}` : `L ${x} ${y}`\n })\n .join(\" \")\n } else {\n const halfWidth = width / 2\n const halfHeight = height / 2\n\n const topLeft = applyToPoint(transform, [\n center.x - halfWidth,\n center.y - halfHeight,\n ])\n const topRight = applyToPoint(transform, [\n center.x + halfWidth,\n center.y - halfHeight,\n ])\n const bottomRight = applyToPoint(transform, [\n center.x + halfWidth,\n center.y + halfHeight,\n ])\n const bottomLeft = applyToPoint(transform, [\n center.x - halfWidth,\n center.y + halfHeight,\n ])\n\n path =\n `M ${topLeft[0]} ${topLeft[1]} ` +\n `L ${topRight[0]} ${topRight[1]} ` +\n `L ${bottomRight[0]} ${bottomRight[1]} ` +\n `L ${bottomLeft[0]} ${bottomLeft[1]}`\n }\n\n path += \" Z\"\n\n return [\n {\n name: \"path\",\n type: \"element\",\n value: \"\",\n children: [],\n attributes: {\n class: \"pcb-board\",\n d: path,\n stroke: \"rgba(255, 255, 255, 0.5)\",\n \"stroke-width\": (0.1 * Math.abs(transform.a)).toString(),\n },\n },\n ]\n}\n","import type { PCBVia } from \"circuit-json\"\nimport { applyToPoint } from \"transformation-matrix\"\n\nexport function createSvgObjectsFromPcbVia(hole: PCBVia, transform: any): any {\n const [x, y] = applyToPoint(transform, [hole.x, hole.y])\n const scaledOuterWidth = hole.outer_diameter * Math.abs(transform.a)\n const scaledOuterHeight = hole.outer_diameter * Math.abs(transform.a)\n const scaledHoleWidth = hole.hole_diameter * Math.abs(transform.a)\n const scaledHoleHeight = hole.hole_diameter * Math.abs(transform.a)\n\n const outerRadius = Math.min(scaledOuterWidth, scaledOuterHeight) / 2\n const innerRadius = Math.min(scaledHoleWidth, scaledHoleHeight) / 2\n return {\n name: \"g\",\n type: \"element\",\n children: [\n {\n name: \"circle\",\n type: \"element\",\n attributes: {\n class: \"pcb-hole-outer\",\n cx: x.toString(),\n cy: y.toString(),\n r: outerRadius.toString(),\n },\n },\n {\n name: \"circle\",\n type: \"element\",\n attributes: {\n class: \"pcb-hole-inner\",\n cx: x.toString(),\n cy: y.toString(),\n r: innerRadius.toString(),\n },\n },\n ],\n }\n}\n","import type { PCBHole } from \"circuit-json\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\nimport type { SvgObject } from \"lib/svg-object\"\nimport { HOLE_COLOR } from \"../colors\"\n\nexport function createSvgObjectsFromPcbHole(\n hole: PCBHole,\n transform: Matrix,\n): SvgObject[] {\n const [x, y] = applyToPoint(transform, [hole.x, hole.y])\n\n if (hole.hole_shape === \"circle\" || hole.hole_shape === \"square\") {\n const scaledDiameter = hole.hole_diameter * Math.abs(transform.a)\n const radius = scaledDiameter / 2\n\n if (hole.hole_shape === \"circle\") {\n return [\n {\n name: \"circle\",\n type: \"element\",\n attributes: {\n class: \"pcb-hole\",\n cx: x.toString(),\n cy: y.toString(),\n r: radius.toString(),\n fill: HOLE_COLOR,\n },\n children: [],\n value: \"\",\n },\n ]\n }\n // Square hole\n return [\n {\n name: \"rect\",\n type: \"element\",\n attributes: {\n class: \"pcb-hole\",\n x: (x - radius).toString(),\n y: (y - radius).toString(),\n width: scaledDiameter.toString(),\n height: scaledDiameter.toString(),\n fill: HOLE_COLOR,\n },\n children: [],\n value: \"\",\n },\n ]\n }\n if (hole.hole_shape === \"oval\") {\n const scaledWidth = hole.hole_width * Math.abs(transform.a)\n const scaledHeight = hole.hole_height * Math.abs(transform.a)\n const rx = scaledWidth / 2\n const ry = scaledHeight / 2\n\n return [\n {\n name: \"ellipse\",\n type: \"element\",\n attributes: {\n class: \"pcb-hole\",\n cx: x.toString(),\n cy: y.toString(),\n rx: rx.toString(),\n ry: ry.toString(),\n fill: HOLE_COLOR,\n },\n children: [],\n value: \"\",\n },\n ]\n }\n\n return []\n}\n","export const HOLE_COLOR = \"#FF26E2\"\n","// Kicad-2020 color scheme\nexport const colorMap = {\n \"3d_viewer\": {\n background_bottom: \"rgb(102, 102, 128)\",\n background_top: \"rgb(204, 204, 230)\",\n board: \"rgb(51, 43, 23)\",\n copper: \"rgb(179, 156, 0)\",\n silkscreen_bottom: \"rgb(230, 230, 230)\",\n silkscreen_top: \"rgb(230, 230, 230)\",\n soldermask: \"rgb(20, 51, 36)\",\n solderpaste: \"rgb(128, 128, 128)\",\n },\n board: {\n anchor: \"rgb(255, 38, 226)\",\n aux_items: \"rgb(255, 255, 255)\",\n b_adhes: \"rgb(0, 0, 132)\",\n b_crtyd: \"rgb(255, 38, 226)\",\n b_fab: \"rgb(88, 93, 132)\",\n b_mask: \"rgba(2, 255, 238, 0.400)\",\n b_paste: \"rgb(0, 194, 194)\",\n b_silks: \"rgb(232, 178, 167)\",\n background: \"rgb(0, 16, 35)\",\n cmts_user: \"rgb(89, 148, 220)\",\n copper: {\n b: \"rgb(77, 127, 196)\",\n f: \"rgb(200, 52, 52)\",\n in1: \"rgb(127, 200, 127)\",\n in10: \"rgb(237, 124, 51)\",\n in11: \"rgb(91, 195, 235)\",\n in12: \"rgb(247, 111, 142)\",\n in13: \"rgb(167, 165, 198)\",\n in14: \"rgb(40, 204, 217)\",\n in15: \"rgb(232, 178, 167)\",\n in16: \"rgb(242, 237, 161)\",\n in17: \"rgb(237, 124, 51)\",\n in18: \"rgb(91, 195, 235)\",\n in19: \"rgb(247, 111, 142)\",\n in2: \"rgb(206, 125, 44)\",\n in20: \"rgb(167, 165, 198)\",\n in21: \"rgb(40, 204, 217)\",\n in22: \"rgb(232, 178, 167)\",\n in23: \"rgb(242, 237, 161)\",\n in24: \"rgb(237, 124, 51)\",\n in25: \"rgb(91, 195, 235)\",\n in26: \"rgb(247, 111, 142)\",\n in27: \"rgb(167, 165, 198)\",\n in28: \"rgb(40, 204, 217)\",\n in29: \"rgb(232, 178, 167)\",\n in3: \"rgb(79, 203, 203)\",\n in30: \"rgb(242, 237, 161)\",\n in4: \"rgb(219, 98, 139)\",\n in5: \"rgb(167, 165, 198)\",\n in6: \"rgb(40, 204, 217)\",\n in7: \"rgb(232, 178, 167)\",\n in8: \"rgb(242, 237, 161)\",\n in9: \"rgb(141, 203, 129)\",\n },\n cursor: \"rgb(255, 255, 255)\",\n drc: \"rgb(194, 194, 194)\",\n drc_error: \"rgba(215, 91, 107, 0.800)\",\n drc_exclusion: \"rgb(255, 255, 255)\",\n drc_warning: \"rgba(255, 208, 66, 0.902)\",\n dwgs_user: \"rgb(194, 194, 194)\",\n eco1_user: \"rgb(180, 219, 210)\",\n eco2_user: \"rgb(216, 200, 82)\",\n edge_cuts: \"rgb(208, 210, 205)\",\n f_adhes: \"rgb(132, 0, 132)\",\n f_crtyd: \"rgb(255, 0, 245)\",\n f_fab: \"rgb(175, 175, 175)\",\n f_mask: \"rgba(216, 100, 255, 0.400)\",\n f_paste: \"rgba(180, 160, 154, 0.902)\",\n f_silks: \"rgb(242, 237, 161)\",\n footprint_text_back: \"rgb(0, 0, 132)\",\n footprint_text_front: \"rgb(194, 194, 194)\",\n footprint_text_invisible: \"rgb(132, 132, 132)\",\n grid: \"rgb(132, 132, 132)\",\n grid_axes: \"rgb(194, 194, 194)\",\n margin: \"rgb(255, 38, 226)\",\n microvia: \"rgb(0, 132, 132)\",\n no_connect: \"rgb(0, 0, 132)\",\n pad_back: \"rgb(77, 127, 196)\",\n pad_front: \"rgb(200, 52, 52)\",\n pad_plated_hole: \"rgb(194, 194, 0)\",\n pad_through_hole: \"rgb(227, 183, 46)\",\n plated_hole: \"rgb(26, 196, 210)\",\n ratsnest: \"rgba(245, 255, 213, 0.702)\",\n select_overlay: \"rgb(4, 255, 67)\",\n through_via: \"rgb(236, 236, 236)\",\n user_1: \"rgb(194, 194, 194)\",\n user_2: \"rgb(89, 148, 220)\",\n user_3: \"rgb(180, 219, 210)\",\n user_4: \"rgb(216, 200, 82)\",\n user_5: \"rgb(194, 194, 194)\",\n user_6: \"rgb(89, 148, 220)\",\n user_7: \"rgb(180, 219, 210)\",\n user_8: \"rgb(216, 200, 82)\",\n user_9: \"rgb(232, 178, 167)\",\n via_blind_buried: \"rgb(187, 151, 38)\",\n via_hole: \"rgb(227, 183, 46)\",\n via_micro: \"rgb(0, 132, 132)\",\n via_through: \"rgb(236, 236, 236)\",\n worksheet: \"rgb(200, 114, 171)\",\n },\n gerbview: {\n axes: \"rgb(0, 0, 132)\",\n background: \"rgb(0, 0, 0)\",\n dcodes: \"rgb(255, 255, 255)\",\n grid: \"rgb(132, 132, 132)\",\n layers: [\n \"rgb(132, 0, 0)\",\n \"rgb(194, 194, 0)\",\n \"rgb(194, 0, 194)\",\n \"rgb(194, 0, 0)\",\n \"rgb(0, 132, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(0, 0, 132)\",\n \"rgb(132, 132, 132)\",\n \"rgb(132, 0, 132)\",\n \"rgb(194, 194, 194)\",\n \"rgb(132, 0, 132)\",\n \"rgb(132, 0, 0)\",\n \"rgb(132, 132, 0)\",\n \"rgb(194, 194, 194)\",\n \"rgb(0, 0, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(132, 0, 0)\",\n \"rgb(194, 194, 0)\",\n \"rgb(194, 0, 194)\",\n \"rgb(194, 0, 0)\",\n \"rgb(0, 132, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(0, 0, 132)\",\n \"rgb(132, 132, 132)\",\n \"rgb(132, 0, 132)\",\n \"rgb(194, 194, 194)\",\n \"rgb(132, 0, 132)\",\n \"rgb(132, 0, 0)\",\n \"rgb(132, 132, 0)\",\n \"rgb(194, 194, 194)\",\n \"rgb(0, 0, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(132, 0, 0)\",\n \"rgb(194, 194, 0)\",\n \"rgb(194, 0, 194)\",\n \"rgb(194, 0, 0)\",\n \"rgb(0, 132, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(0, 0, 132)\",\n \"rgb(132, 132, 132)\",\n \"rgb(132, 0, 132)\",\n \"rgb(194, 194, 194)\",\n \"rgb(132, 0, 132)\",\n \"rgb(132, 0, 0)\",\n \"rgb(132, 132, 0)\",\n \"rgb(194, 194, 194)\",\n \"rgb(0, 0, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(132, 0, 0)\",\n \"rgb(194, 194, 0)\",\n \"rgb(194, 0, 194)\",\n \"rgb(194, 0, 0)\",\n \"rgb(0, 132, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(0, 0, 132)\",\n \"rgb(132, 132, 132)\",\n \"rgb(132, 0, 132)\",\n \"rgb(194, 194, 194)\",\n \"rgb(132, 0, 132)\",\n \"rgb(132, 0, 0)\",\n ],\n negative_objects: \"rgb(132, 132, 132)\",\n worksheet: \"rgb(0, 0, 132)\",\n },\n meta: {\n filename: \"kicad_2020\",\n name: \"KiCad 2020\",\n version: 2,\n },\n palette: [\n \"rgb(132, 0, 0)\",\n \"rgb(194, 194, 0)\",\n \"rgb(194, 0, 194)\",\n \"rgb(194, 0, 0)\",\n \"rgb(0, 132, 132)\",\n \"rgb(0, 132, 0)\",\n \"rgb(0, 0, 132)\",\n \"rgb(132, 132, 132)\",\n \"rgb(132, 0, 132)\",\n \"rgb(194, 194, 194)\",\n \"rgb(132, 0, 132)\",\n \"rgb(132, 0, 0)\",\n \"rgb(132, 132, 0)\",\n \"rgb(194, 194, 194)\",\n \"rgb(0, 0, 132)\",\n \"rgb(0, 132, 0)\",\n ],\n schematic: {\n aux_items: \"rgb(46, 46, 46)\",\n background: \"rgb(245, 241, 237)\",\n brightened: \"rgb(255, 0, 255)\",\n bus: \"rgb(0, 0, 132)\",\n bus_junction: \"rgb(0, 0, 132)\",\n component_body: \"rgb(255, 255, 194)\",\n component_outline: \"rgb(132, 0, 0)\",\n cursor: \"rgb(15, 15, 15)\",\n erc_error: \"rgba(230, 9, 13, 0.800)\",\n erc_warning: \"rgba(209, 146, 0, 0.800)\",\n fields: \"rgb(132, 0, 132)\",\n grid: \"rgb(181, 181, 181)\",\n grid_axes: \"rgb(0, 0, 132)\",\n hidden: \"rgb(194, 194, 194)\",\n junction: \"rgb(0, 150, 0)\",\n label_global: \"rgb(132, 0, 0)\",\n label_hier: \"rgb(114, 86, 0)\",\n label_local: \"rgb(15, 15, 15)\",\n net_name: \"rgb(132, 132, 132)\",\n no_connect: \"rgb(0, 0, 132)\",\n note: \"rgb(0, 0, 194)\",\n override_item_colors: false,\n pin: \"rgb(132, 0, 0)\",\n pin_name: \"rgb(0, 100, 100)\",\n pin_number: \"rgb(169, 0, 0)\",\n reference: \"rgb(0, 100, 100)\",\n shadow: \"rgba(102, 179, 255, 0.800)\",\n sheet: \"rgb(132, 0, 0)\",\n sheet_background: \"rgba(253, 255, 231, 0.000)\",\n sheet_fields: \"rgb(132, 0, 132)\",\n sheet_filename: \"rgb(114, 86, 0)\",\n sheet_label: \"rgb(0, 100, 100)\",\n sheet_name: \"rgb(0, 100, 100)\",\n value: \"rgb(0, 100, 100)\",\n wire: \"rgb(0, 150, 0)\",\n worksheet: \"rgb(132, 0, 0)\",\n },\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\nimport type { SvgObject } from \"lib/svg-object\"\nimport { colorMap } from \"lib/utils/colors\"\nimport { stringify } from \"svgson\"\nimport {\n applyToPoint,\n compose,\n scale,\n translate,\n type Matrix,\n} from \"transformation-matrix\"\nimport { drawSchematicGrid } from \"./draw-schematic-grid\"\nimport { drawSchematicLabeledPoints } from \"./draw-schematic-labeled-points\"\nimport { getSchematicBoundsFromCircuitJson } from \"./get-schematic-bounds-from-circuit-json\"\nimport { createSchematicComponent } from \"./svg-object-fns/create-svg-objects-from-sch-component\"\nimport { createSvgObjectsFromSchDebugObject } from \"./svg-object-fns/create-svg-objects-from-sch-debug-object\"\nimport { createSchematicTrace } from \"./svg-object-fns/create-svg-objects-from-sch-trace\"\n\ninterface Options {\n width?: number\n height?: number\n grid?: boolean | { cellSize?: number; labelCells?: boolean }\n labeledPoints?: Array<{ x: number; y: number; label: string }>\n}\n\nexport function convertCircuitJsonToSchematicSvg(\n circuitJson: AnyCircuitElement[],\n options?: Options,\n): string {\n // Get bounds with padding\n const bounds = getSchematicBoundsFromCircuitJson(circuitJson)\n const { minX, minY, maxX, maxY } = bounds\n\n const padding = 1 // Reduced padding for tighter boundary\n const circuitWidth = maxX - minX + 2 * padding\n const circuitHeight = maxY - minY + 2 * padding\n\n const svgWidth = options?.width ?? 1200\n const svgHeight = options?.height ?? 600\n\n // Calculate scale factor to fit circuit within SVG, maintaining aspect ratio\n const scaleX = svgWidth / circuitWidth\n const scaleY = svgHeight / circuitHeight\n const scaleFactor = Math.min(scaleX, scaleY)\n\n // Calculate centering offsets\n const offsetX = (svgWidth - circuitWidth * scaleFactor) / 2\n const offsetY = (svgHeight - circuitHeight * scaleFactor) / 2\n\n // Create transform matrix\n const transform = compose(\n translate(\n offsetX - minX * scaleFactor + padding * scaleFactor,\n svgHeight - offsetY + minY * scaleFactor - padding * scaleFactor,\n ),\n scale(scaleFactor, -scaleFactor), // Flip in y-direction\n )\n\n const svgChildren: SvgObject[] = []\n\n // Add background rectangle\n svgChildren.push({\n name: \"rect\",\n type: \"element\",\n attributes: {\n class: \"boundary\",\n x: \"0\",\n y: \"0\",\n width: svgWidth.toString(),\n height: svgHeight.toString(),\n },\n children: [],\n value: \"\",\n })\n\n // Add grid if enabled\n if (options?.grid) {\n const gridConfig = typeof options.grid === \"object\" ? options.grid : {}\n svgChildren.push(drawSchematicGrid({ bounds, transform, ...gridConfig }))\n }\n\n // Add labeled points if provided\n if (options?.labeledPoints) {\n svgChildren.push(\n drawSchematicLabeledPoints({\n points: options.labeledPoints,\n transform,\n }),\n )\n }\n\n const schDebugObjectSvgs: SvgObject[] = []\n const schComponentSvgs: SvgObject[] = []\n const schTraceSvgs: SvgObject[] = []\n\n // Process all elements using transform\n for (const elm of circuitJson) {\n if (elm.type === \"schematic_debug_object\") {\n schDebugObjectSvgs.push(\n ...createSvgObjectsFromSchDebugObject(elm, transform),\n )\n } else if (elm.type === \"schematic_component\") {\n schComponentSvgs.push(\n ...createSchematicComponent({\n component: elm,\n transform,\n circuitJson,\n }),\n )\n } else if (elm.type === \"schematic_trace\") {\n schTraceSvgs.push(...createSchematicTrace(elm, transform))\n }\n }\n\n // Add elements in correct order\n svgChildren.push(...schDebugObjectSvgs, ...schComponentSvgs, ...schTraceSvgs)\n\n const svgObject: SvgObject = {\n name: \"svg\",\n type: \"element\",\n attributes: {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: svgWidth.toString(),\n height: svgHeight.toString(),\n style: `background-color: ${colorMap.schematic.background}`,\n },\n children: [\n // Add styles\n {\n name: \"style\",\n type: \"element\",\n children: [\n {\n type: \"text\",\n value: `\n .boundary { fill: ${colorMap.schematic.background}; }\n .schematic-boundary { fill: none; stroke: #fff; stroke-width: 0.3; }\n .component { fill: none; stroke: ${colorMap.schematic.component_outline}; }\n .chip { fill: ${colorMap.schematic.component_body}; stroke: ${colorMap.schematic.component_outline}; }\n .component-pin { fill: none; stroke: ${colorMap.schematic.component_outline}; }\n .trace { stroke: ${colorMap.schematic.wire}; stroke-width: ${0.02 * scaleFactor}; fill: none; }\n .text { font-family: Arial, sans-serif; font-size: ${0.2 * scaleFactor}px; fill: ${colorMap.schematic.wire}; }\n .pin-number { font-size: ${0.15 * scaleFactor}px; fill: ${colorMap.schematic.pin_number}; }\n .port-label { fill: ${colorMap.schematic.reference}; }\n .component-name { font-size: ${0.25 * scaleFactor}px; fill: ${colorMap.schematic.reference}; }\n `,\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n value: \"\",\n attributes: {},\n },\n ...svgChildren,\n ],\n value: \"\",\n }\n\n return stringify(svgObject)\n}\n\n/**\n * @deprecated use `convertCircuitJsonToSchematicSvg` instead\n */\nexport const circuitJsonToSchematicSvg = convertCircuitJsonToSchematicSvg\n","import { colorMap } from \"lib/utils/colors\"\nimport type { INode as SvgObject } from \"svgson\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\n\nexport function drawSchematicGrid(params: {\n bounds: {\n minX: number\n minY: number\n maxX: number\n maxY: number\n }\n transform: Matrix\n cellSize?: number\n labelCells?: boolean\n}): SvgObject {\n const { minX, minY, maxX, maxY } = params.bounds\n const cellSize = params.cellSize ?? 1\n const labelCells = params.labelCells ?? false\n const gridLines: any[] = []\n\n // Helper function to transform points\n const transformPoint = (x: number, y: number) => {\n const [transformedX, transformedY] = applyToPoint(params.transform, [x, y])\n return { x: transformedX, y: transformedY }\n }\n\n // Vertical lines\n for (let x = Math.ceil(minX); x <= Math.floor(maxX); x += cellSize) {\n const start = transformPoint(x, minY)\n const end = transformPoint(x, maxY)\n \n gridLines.push({\n name: \"line\",\n type: \"element\",\n attributes: {\n x1: start.x.toString(),\n y1: start.y.toString(),\n x2: end.x.toString(),\n y2: end.y.toString(),\n stroke: colorMap.schematic.grid,\n \"stroke-width\": (0.01 * Math.abs(params.transform.a)).toString(),\n \"stroke-opacity\": \"0.5\",\n },\n })\n }\n\n // Horizontal lines\n for (let y = Math.ceil(minY); y <= Math.floor(maxY); y += cellSize) {\n const start = transformPoint(minX, y)\n const end = transformPoint(maxX, y)\n \n gridLines.push({\n name: \"line\",\n type: \"element\",\n attributes: {\n x1: start.x.toString(),\n y1: start.y.toString(),\n x2: end.x.toString(),\n y2: end.y.toString(),\n stroke: colorMap.schematic.grid,\n \"stroke-width\": (0.01 * Math.abs(params.transform.a)).toString(),\n \"stroke-opacity\": \"0.5\",\n },\n })\n }\n\n // Add cell labels if enabled\n if (labelCells) {\n for (let x = Math.ceil(minX); x <= Math.floor(maxX); x += cellSize) {\n for (let y = Math.ceil(minY); y <= Math.floor(maxY); y += cellSize) {\n const point = transformPoint(x, y)\n \n gridLines.push({\n name: \"text\",\n type: \"element\",\n attributes: {\n x: point.x.toString(),\n y: point.y.toString(),\n fill: colorMap.schematic.grid,\n \"font-size\": ((cellSize / 6) * Math.abs(params.transform.a)).toString(),\n \"fill-opacity\": \"0.5\",\n \"text-anchor\": \"middle\",\n \"dominant-baseline\": \"middle\",\n },\n children: [\n {\n type: \"text\",\n value: `${x},${y}`,\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n })\n }\n }\n }\n\n return {\n name: \"g\",\n value: \"\",\n type: \"element\",\n attributes: { class: \"grid\" },\n children: gridLines,\n }\n}","import { colorMap } from \"lib/utils/colors\"\nimport type { INode as SvgObject } from \"svgson\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\n\ninterface LabeledPoint {\n x: number\n y: number\n label?: string\n}\n\nexport function drawSchematicLabeledPoints(params: {\n points: LabeledPoint[]\n transform: Matrix\n}): SvgObject {\n const { points, transform } = params\n const labeledPointsGroup: any[] = []\n\n for (const point of points) {\n // Transform offset points for X marker\n const [x1, y1] = applyToPoint(transform, [point.x - 0.1, -(point.y - 0.1)])\n const [x2, y2] = applyToPoint(transform, [point.x + 0.1, -(point.y + 0.1)])\n const [x3, y3] = applyToPoint(transform, [point.x - 0.1, -(point.y + 0.1)])\n const [x4, y4] = applyToPoint(transform, [point.x + 0.1, -(point.y - 0.1)])\n\n // Add X marker\n labeledPointsGroup.push({\n name: \"path\",\n type: \"element\",\n attributes: {\n d: `M${x1},${y1} L${x2},${y2} M${x3},${y3} L${x4},${y4}`,\n stroke: colorMap.schematic.grid,\n \"stroke-width\": (0.02 * Math.abs(transform.a)).toString(),\n \"stroke-opacity\": \"0.7\",\n },\n })\n\n // Transform label position\n const [labelX, labelY] = applyToPoint(transform, [\n point.x + 0.15,\n -(point.y - 0.15),\n ])\n\n // Add label\n labeledPointsGroup.push({\n name: \"text\",\n type: \"element\",\n attributes: {\n x: labelX.toString(),\n y: labelY.toString(),\n fill: colorMap.schematic.grid,\n \"font-size\": (0.15 * Math.abs(transform.a)).toString(),\n \"fill-opacity\": \"0.7\",\n \"text-anchor\": \"start\",\n \"dominant-baseline\": \"middle\",\n },\n children: [\n {\n type: \"text\",\n value: point.label || `(${point.x},${point.y})`,\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n })\n }\n\n return {\n name: \"g\",\n value: \"\",\n type: \"element\",\n attributes: { class: \"labeled-points\" },\n children: labeledPointsGroup,\n }\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\n\ninterface Bounds {\n minX: number\n minY: number\n maxX: number\n maxY: number\n}\n\nexport function getSchematicBoundsFromCircuitJson(\n soup: AnyCircuitElement[],\n padding = 0.5,\n): Bounds {\n let minX = Number.POSITIVE_INFINITY\n let minY = Number.POSITIVE_INFINITY\n let maxX = Number.NEGATIVE_INFINITY\n let maxY = Number.NEGATIVE_INFINITY\n\n const portSize = 0.2\n\n // Find the bounds\n for (const item of soup) {\n if (item.type === \"schematic_component\") {\n updateBounds(item.center, item.size, item.rotation || 0)\n } else if (item.type === \"schematic_port\") {\n updateBounds(item.center, { width: portSize, height: portSize }, 0)\n } else if (item.type === \"schematic_debug_object\") {\n if (item.shape === \"rect\") {\n updateBounds(item.center, item.size, 0)\n } else if (item.shape === \"line\") {\n updateBounds(item.start, { width: 0.1, height: 0.1 }, 0)\n updateBounds(item.end, { width: 0.1, height: 0.1 }, 0)\n }\n }\n }\n\n // Add padding to bounds\n minX -= padding\n minY -= padding\n maxX += padding\n maxY += padding\n\n return { minX, minY, maxX, maxY }\n\n function updateBounds(center: any, size: any, rotation: number) {\n const corners = [\n { x: -size.width / 2, y: -size.height / 2 },\n { x: size.width / 2, y: -size.height / 2 },\n { x: size.width / 2, y: size.height / 2 },\n { x: -size.width / 2, y: size.height / 2 },\n ]\n\n for (const corner of corners) {\n const rotatedX =\n corner.x * Math.cos(rotation) - corner.y * Math.sin(rotation) + center.x\n const rotatedY =\n corner.x * Math.sin(rotation) + corner.y * Math.cos(rotation) + center.y\n minX = Math.min(minX, rotatedX)\n minY = Math.min(minY, rotatedY)\n maxX = Math.max(maxX, rotatedX)\n maxY = Math.max(maxY, rotatedY)\n }\n }\n}\n","import { su } from \"@tscircuit/soup-util\"\nimport type {\n AnyCircuitElement,\n SchematicComponent,\n SchematicPort,\n} from \"circuit-json\"\nimport type { SvgObject } from \"lib/svg-object\"\nimport { colorMap } from \"lib/utils/colors\"\nimport { getSvg, symbols } from \"schematic-symbols\"\nimport { parseSync } from \"svgson\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\n\nexport function createSchematicComponent({\n component,\n transform,\n circuitJson,\n}: {\n component: SchematicComponent\n transform: Matrix\n circuitJson: AnyCircuitElement[]\n}): SvgObject[] {\n const { center, size, rotation, symbol_name: symbolName } = component\n const portLabels = component.port_labels\n const sourceComponentId = component.source_component_id\n const schematicComponentId = component.schematic_component_id\n\n // Transform the center point for the main component position\n const [transformedX, transformedY] = applyToPoint(transform, [\n center.x,\n center.y,\n ])\n\n const componentScale = Math.abs(transform.a)\n let componentChildren: SvgObject[] = []\n const textChildren: SvgObject[] = []\n\n // Find source component and get its properties\n const sourceComponent = circuitJson?.find(\n (item) =>\n item.type === \"source_component\" &&\n item.source_component_id === sourceComponentId,\n )\n const componentName =\n sourceComponent && \"name\" in sourceComponent ? sourceComponent.name : \"\"\n const manufacturerNumber =\n sourceComponent && \"manufacturer_part_number\" in sourceComponent\n ? sourceComponent.manufacturer_part_number\n : \"\"\n const resistance =\n sourceComponent && \"resistance\" in sourceComponent\n ? sourceComponent.resistance\n : \"\"\n const capacitance =\n sourceComponent && \"capacitance\" in sourceComponent\n ? sourceComponent.capacitance\n : \"\"\n\n if (symbolName) {\n const symbol = (symbols as any)[symbolName]\n const paths = symbol.primitives.filter((p: any) => p.type === \"path\")\n const updatedSymbol = {\n ...symbol,\n primitives: paths,\n }\n const svg = parseSync(\n getSvg(updatedSymbol, {\n width: size.width,\n height: size.height,\n }),\n )\n\n componentChildren = svg.children\n .filter(\n (child: any) =>\n child.name === \"path\" && child.attributes.fill !== \"green\",\n )\n .map((path: any) => {\n const currentStrokeWidth = Number.parseFloat(\n path.attributes[\"stroke-width\"] || \"0.02\",\n )\n return {\n ...path,\n attributes: {\n ...path.attributes,\n stroke:\n path.attributes.stroke === \"black\"\n ? `${colorMap.schematic.component_outline}`\n : path.attributes.stroke,\n \"stroke-width\": currentStrokeWidth.toString(),\n },\n }\n })\n\n // Add resistance/capacitance text\n if (resistance || capacitance) {\n const [textX, textY] = applyToPoint(transform, [\n center.x,\n -(center.y - size.height / 2 - 0.2),\n ])\n\n const labelOffset = componentScale * 0.4\n textChildren.push({\n name: \"text\",\n type: \"element\",\n attributes: {\n class: \"component-name\",\n x: textX.toString(),\n y: textY.toString(),\n \"text-anchor\": \"middle\",\n \"dominant-baseline\": \"auto\",\n \"font-size\": \"0.2\",\n },\n children: [\n {\n type: \"text\",\n value: (resistance || capacitance || \"\").toString(),\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n value: \"\",\n })\n\n textChildren.push({\n name: \"text\",\n type: \"element\",\n attributes: {\n class: \"component-name\",\n x: textX.toString(),\n y: (textY - labelOffset).toString(),\n \"text-anchor\": \"middle\",\n \"dominant-baseline\": \"auto\",\n \"font-size\": \"0.2\",\n },\n children: [\n {\n type: \"text\",\n value: componentName || \"\",\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n value: \"\",\n })\n }\n } else {\n // Add basic rectangle for component body\n componentChildren.push({\n name: \"rect\",\n type: \"element\",\n value: \"\",\n attributes: {\n class: \"component chip\",\n x: (-size.width / 2).toString(),\n y: (-size.height / 2).toString(),\n width: size.width.toString(),\n height: size.height.toString(),\n \"stroke-width\": \"0.02\",\n },\n children: [],\n })\n\n // Add manufacturer number and component name text\n if (manufacturerNumber) {\n // Calculate position for top center of component\n const [textX, textY] = applyToPoint(transform, [\n center.x, // Center X position\n -(center.y - size.height / 2 - 0.5), // Above the component top edge\n ])\n\n const labelOffset = componentScale * 0.4\n\n textChildren.push({\n name: \"text\",\n type: \"element\",\n attributes: {\n class: \"component-name\",\n x: textX.toString(),\n y: textY.toString(),\n \"text-anchor\": \"right\", // Center align text\n \"dominant-baseline\": \"auto\",\n \"font-size\": \"0.2\",\n },\n children: [\n {\n type: \"text\",\n value: manufacturerNumber,\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n value: \"\",\n })\n\n // Component name below manufacturer number\n textChildren.push({\n name: \"text\",\n type: \"element\",\n attributes: {\n class: \"component-name\",\n x: textX.toString(),\n y: (textY - labelOffset).toString(),\n \"text-anchor\": \"right\", // Center align text\n \"dominant-baseline\": \"auto\",\n \"font-size\": \"0.2\",\n },\n children: [\n {\n type: \"text\",\n value: componentName || \"\",\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n value: \"\",\n })\n }\n\n // Process ports\n const schematicPorts = su(circuitJson as any).schematic_port.list({\n schematic_component_id: schematicComponentId,\n })\n const portLength = 0.2\n const circleRadius = 0.05\n\n for (const schPort of schematicPorts) {\n const { x: portX, y: portY } = schPort.center\n const srcPort = su(circuitJson as any).source_port.get(\n schPort.source_port_id,\n )\n const pinNumber = srcPort?.pin_number\n const relX = portX - center.x\n const relY = portY - center.y\n\n let endX = relX\n let endY = relY\n\n // @ts-expect-error TODO remove when schematic_port has \"side\" defined\n const portSide = schPort.side ?? schPort.center.side\n\n switch (portSide) {\n case \"left\":\n endX = relX - portLength\n break\n case \"right\":\n endX = relX + portLength\n break\n case \"top\":\n endY = relY - portLength\n break\n case \"bottom\":\n endY = relY + portLength\n break\n }\n\n // Add port line\n componentChildren.push({\n name: \"line\",\n type: \"element\",\n attributes: {\n class: \"component-pin\",\n x1: relX.toString(),\n y1: relY.toString(),\n x2: endX.toString(),\n y2: endY.toString(),\n \"stroke-width\": \"0.02\",\n },\n value: \"\",\n children: [],\n })\n\n // Add port circle\n componentChildren.push({\n name: \"circle\",\n type: \"element\",\n attributes: {\n class: \"component-pin\",\n cx: endX.toString(),\n cy: endY.toString(),\n r: circleRadius.toString(),\n \"stroke-width\": \"0.02\",\n },\n value: \"\",\n children: [],\n })\n\n // Transform port position for texts\n const [portEndX, portEndY] = applyToPoint(transform, [\n center.x + endX,\n center.y + endY,\n ])\n\n // Add port label\n const labelKey = `pin${pinNumber}`\n if (portLabels && labelKey in portLabels) {\n const labelText = portLabels[labelKey]!\n let labelX = portEndX\n let labelY = portEndY\n let textAnchor = \"middle\"\n const labelOffset = 0.6 * componentScale\n\n switch (portSide) {\n case \"left\":\n labelX += labelOffset\n labelY += 0 // Center aligned vertically\n textAnchor = \"start\"\n break\n case \"right\":\n labelX -= labelOffset\n labelY += 0 // Center aligned vertically\n textAnchor = \"end\"\n break\n case \"top\":\n labelY -= labelOffset\n break\n case \"bottom\":\n labelY += labelOffset\n break\n }\n\n textChildren.push({\n name: \"text\",\n type: \"element\",\n attributes: {\n class: \"port-label\",\n x: labelX.toString(),\n y: labelY.toString(),\n \"text-anchor\": textAnchor,\n \"dominant-baseline\": \"middle\",\n \"font-size\": (0.2 * componentScale).toString(),\n },\n children: [\n {\n type: \"text\",\n value: labelText,\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n value: \"\",\n })\n }\n\n // Add pin number\n const pinNumberOffset = 0.2\n let pinX = endX\n let pinY = endY\n let dominantBaseline = \"auto\"\n\n switch (portSide) {\n case \"top\":\n // For top ports, stay at the same X but offset Y upward\n pinY = -(portY - portLength + pinNumberOffset) // Move above the circle\n pinX = portX // Stay aligned with port\n dominantBaseline = \"auto\"\n break\n case \"bottom\":\n // For bottom ports, stay at the same X but offset Y downward\n pinY = portY + portLength - pinNumberOffset\n pinX = portX\n dominantBaseline = \"hanging\"\n break\n case \"left\":\n // For left ports, stay at the same Y but offset X\n pinX = portX - pinNumberOffset\n pinY = portY + pinNumberOffset\n dominantBaseline = \"auto\"\n break\n case \"right\":\n // For right ports, stay at the same Y but offset X\n pinX = portX + pinNumberOffset\n pinY = portY + pinNumberOffset\n dominantBaseline = \"auto\"\n break\n }\n\n // Transform the pin position from local to global coordinates\n const [transformedPinX, transformedPinY] = applyToPoint(transform, [\n pinX,\n pinY,\n ])\n\n textChildren.push({\n name: \"text\",\n type: \"element\",\n attributes: {\n class: \"pin-number\",\n x: transformedPinX.toString(),\n y: transformedPinY.toString(),\n \"text-anchor\": \"middle\",\n \"dominant-baseline\": dominantBaseline,\n \"font-size\": (0.15 * componentScale).toString(),\n },\n children: [\n {\n type: \"text\",\n value: pinNumber?.toString() || \"\",\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n value: \"\",\n })\n }\n }\n\n // Create component group with scaling\n const componentGroup: SvgObject = {\n name: \"g\",\n value: \"\",\n type: \"element\",\n attributes: {\n transform: `translate(${transformedX}, ${transformedY}) rotate(${\n (rotation * 180) / Math.PI\n }) scale(${componentScale})`,\n },\n children: componentChildren,\n }\n\n // Create text group without scaling\n const textGroup: SvgObject = {\n name: \"g\",\n value: \"\",\n type: \"element\",\n attributes: {},\n children: textChildren,\n }\n\n return [componentGroup, textGroup]\n}\n","import type { SchematicDebugObject } from \"circuit-json\"\nimport type { INode as SvgObject } from \"svgson\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\n\nexport function createSvgObjectsFromSchDebugObject(\n debugObject: SchematicDebugObject,\n transform: Matrix,\n): SvgObject[] {\n if (debugObject.shape === \"rect\") {\n // Transform all corners\n let [screenLeft, screenTop] = applyToPoint(transform, [\n debugObject.center.x - debugObject.size.width / 2,\n debugObject.center.y - debugObject.size.height / 2,\n ])\n let [screenRight, screenBottom] = applyToPoint(transform, [\n debugObject.center.x + debugObject.size.width / 2,\n debugObject.center.y + debugObject.size.height / 2,\n ])\n ;[screenTop, screenBottom] = [\n Math.min(screenTop, screenBottom),\n Math.max(screenTop, screenBottom),\n ]\n\n // Calculate screen width and height\n const width = Math.abs(screenRight - screenLeft)\n const height = Math.abs(screenBottom - screenTop)\n\n const [screenCenterX, screenCenterY] = applyToPoint(transform, [\n debugObject.center.x,\n debugObject.center.y,\n ])\n\n return [\n {\n name: \"rect\",\n type: \"element\",\n value: \"\",\n attributes: {\n x: screenLeft.toString(),\n y: screenTop.toString(),\n width: width.toString(),\n height: height.toString(),\n fill: \"none\",\n stroke: \"red\",\n \"stroke-width\": (0.02 * Math.abs(transform.a)).toString(),\n \"stroke-dasharray\": \"5,5\",\n },\n children: debugObject.label\n ? [\n {\n name: \"text\",\n type: \"element\",\n value: \"\",\n attributes: {\n x: screenCenterX.toString(),\n y: (screenCenterY - 10).toString(),\n \"text-anchor\": \"middle\",\n \"font-size\": (0.2 * Math.abs(transform.a)).toString(),\n fill: \"red\",\n },\n children: [\n {\n type: \"text\",\n value: debugObject.label,\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n },\n ]\n : [],\n },\n ]\n }\n if (debugObject.shape === \"line\") {\n // Transform start and end points - flip Y coordinates\n const [screenStartX, screenStartY] = applyToPoint(transform, [\n debugObject.start.x,\n debugObject.start.y,\n ])\n const [screenEndX, screenEndY] = applyToPoint(transform, [\n debugObject.end.x,\n debugObject.end.y,\n ])\n\n // Calculate midpoint for label\n const screenMidX = (screenStartX + screenEndX) / 2\n const screenMidY = (screenStartY + screenEndY) / 2\n\n return [\n {\n name: \"line\",\n type: \"element\",\n value: \"\",\n attributes: {\n x1: screenStartX.toString(),\n y1: screenStartY.toString(),\n x2: screenEndX.toString(),\n y2: screenEndY.toString(),\n stroke: \"red\",\n \"stroke-width\": (0.02 * Math.abs(transform.a)).toString(),\n \"stroke-dasharray\": \"5,5\",\n },\n children: debugObject.label\n ? [\n {\n name: \"text\",\n type: \"element\",\n value: \"\",\n attributes: {\n x: screenMidX.toString(),\n y: (screenMidY - 10).toString(),\n \"text-anchor\": \"middle\",\n \"font-size\": (0.2 * Math.abs(transform.a)).toString(),\n fill: \"red\",\n },\n children: [\n {\n type: \"text\",\n value: debugObject.label,\n name: \"\",\n attributes: {},\n children: [],\n },\n ],\n },\n ]\n : [],\n },\n ]\n }\n return []\n}\n","import type { SchematicTrace } from \"circuit-json\"\nimport type { SvgObject } from \"lib/svg-object\"\nimport { applyToPoint, type Matrix } from \"transformation-matrix\"\n\nexport function createSchematicTrace(\n trace: SchematicTrace,\n transform: Matrix,\n): SvgObject[] {\n const edges = trace.edges\n if (edges.length === 0) return []\n\n let path = \"\"\n\n // Process all edges\n edges.forEach((edge: any, index: number) => {\n // Get the points, applying trace offset\n const fromPoint = {\n x: edge.from.x ?? edge.from.center?.x,\n y: edge.from.y ?? edge.from.center?.y,\n }\n const toPoint = {\n x: edge.to.x ?? edge.to.center?.x,\n y: edge.to.y ?? edge.to.center?.y,\n }\n\n // Transform the points using the matrix\n const [transformedFromX, transformedFromY] = applyToPoint(transform, [\n fromPoint.x,\n fromPoint.y,\n ])\n const [transformedToX, transformedToY] = applyToPoint(transform, [\n toPoint.x,\n toPoint.y,\n ])\n\n // Build the path string\n if (index === 0) {\n path += `M ${transformedFromX} ${transformedFromY} L ${transformedToX} ${transformedToY}`\n } else {\n path += ` L ${transformedToX} ${transformedToY}`\n }\n })\n\n // Only create SVG object if we have a valid path\n return path\n ? [\n {\n name: \"path\",\n type: \"element\",\n attributes: {\n class: \"trace\",\n d: path,\n \"stroke-width\": (0.02 * Math.abs(transform.a)).toString(), // Scale stroke width with transform\n },\n value: \"\",\n children: [],\n },\n ]\n : []\n}\n"],"mappings":"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","names":["applyToPoint","compose","translate","applyToPoint","applyToPoint","applyToPoint","applyToPoint","compose","rotate","translate","matrixToString","applyToPoint","applyToPoint","applyToPoint","applyToPoint","applyToPoint","applyToPoint","applyToPoint","applyToPoint","compose","translate","applyToPoint","stringify","compose","scale","translate","applyToPoint","applyToPoint","applyToPoint","applyToPoint","applyToPoint","compose","translate","scale","stringify"]}
|