abse/smart-ring-flex

A tscircuit package created by abse.

Version
0.0.24
License
unset
Stars
0

src/saved-routing.tsx

import { Fragment } from 'react'
import originalCopper from '../routing/default-copper.json'
import jstCopper from '../routing/jst-copper.json'
const locallyRepairedNets=new Set(['VBAT_SENSE','VDD','GND','BAT_TEMP_ADC','BAT_TEMP_DRIVE','MOTION_INT','VSYS','DOCK_5V','SCL','BAT_NTC','SDA','OPT_SDA','SWDIO','SWDCLK','RESET','CHARGE_DISABLE'])
const local=(paths:any[],anchor:{cx:number;cy:number;rotation:number})=>{
 const a=-anchor.rotation*Math.PI/180,c=Math.cos(a),s=Math.sin(a)
 return paths.map(path=>path.map((p:any)=>({x:c*(p.x-anchor.cx)-s*(p.y-anchor.cy),y:s*(p.x-anchor.cx)+c*(p.y-anchor.cy)})))
}
const groups=(paths:any[],widths:number[]|undefined,fallback:number)=>{
 const result=new Map<number,any[]>()
 paths.forEach((path,i)=>{const w=widths?.[i]??fallback;result.set(w,[...(result.get(w)??[]),path])})
 return [...result.entries()]
}
export default ({jst=false,copper,coordinateAnchor,namePrefix="SAVED"}:{jst?:boolean;copper?:{nets:typeof originalCopper.nets};coordinateAnchor?:{selector:string;cx:number;cy:number;rotation:number};namePrefix?:string})=><>
 {(copper??(jst?jstCopper:originalCopper)).nets.filter(net=>namePrefix==='INTERNAL_RC'||!locallyRepairedNets.has(net.name)).map(net=>{
  const capacitors=net.ports.filter(p=>/^C\d+$/.test(p.component)),ordinary=net.ports.filter(p=>!/^C\d+$/.test(p.component))
  const anchor=coordinateAnchor??ordinary[0]??net.ports[0],via=net.vias[0],fallback=net.name==='FET_RETURN'?.2:.1
  return <Fragment key={net.name}>
   {net.vias.map(v=><Fragment key={v.name}><via name={v.name} pcbX={v.x} pcbY={v.y} fromLayer="top" toLayer="bottom" holeDiameter={v.holeDiameter} outerDiameter={v.outerDiameter} tented connectsTo={`net.${net.name}`}/></Fragment>)}
   {groups(net.top,(net as any).topWidths,fallback).map(([width,paths])=><Fragment key={`top-${width}`}><trace name={`${namePrefix}_${net.name}_TOP_${Math.round(width*1000)}`} schDisplayLabel={net.name} path={[...ordinary.map(p=>p.selector),...net.vias.map(v=>`.${v.name} > .top`),`net.${net.name}`]} pcbPathRelativeTo={anchor.selector} thickness={width} pcbPaths={local(paths,anchor)}/></Fragment>)}
   {capacitors.map(port=><Fragment key={port.selector}><trace name={`${namePrefix}_${net.name}_${port.component}_${port.pin}`} schDisplayLabel={net.name} from={port.selector} to={`net.${net.name}`} thickness={.08} pcbPaths={local([[{x:port.x,y:port.y},{x:port.x+.01,y:port.y}]],port)}/></Fragment>)}
   {ordinary.filter(port=>port.component==="R20"||port.component==="U8"||(port.component==="U3"&&port.pin==="LEDVSS")).map(port=><Fragment key={`explicit-${port.selector}`}><trace name={`${namePrefix}_PAD_${net.name}_${port.component}_${port.pin}`} schDisplayLabel={net.name} from={port.selector} to={`net.${net.name}`} thickness={.08} pcbPaths={local([[{x:port.x,y:port.y},{x:port.x+.01,y:port.y}]],port)}/></Fragment>)}
   {groups(net.bottom,(net as any).bottomWidths,fallback).map(([width,paths])=><Fragment key={`bottom-${width}`}><trace name={`${namePrefix}_${net.name}_BOTTOM_${Math.round(width*1000)}`} schDisplayLabel={net.name} path={[...net.vias.map(v=>`.${v.name} > .bottom`),`net.${net.name}`]} pcbPathRelativeTo={`.${via.name} > .bottom`} thickness={width} pcbPaths={local(paths,{cx:via.x,cy:via.y,rotation:0})}/></Fragment>)}
  </Fragment>
 })}
</>