ShiboSoftwareDev/i-wan

This code defines a PCB and schematic for a microcontroller development board, incorporating various surface-mount components (resistors, capacitors, headers, connectors, crystals, and an IC), with detailed footprints, electrical nets, and routing instructions.

Version
1.0.10
License
unset
Stars
0

scripts/export-latest-gerbers.mjs

import { execFile as execFileCallback } from "node:child_process"
import { mkdir, mkdtemp, readFile, readdir, rename, rm, writeFile } from "node:fs/promises"
import { tmpdir } from "node:os"
import { basename, dirname, join, resolve } from "node:path"
import { promisify } from "node:util"
import {
  convertSoupToExcellonDrillCommandLayers,
  convertSoupToGerberCommands,
  stringifyExcellonDrill,
  stringifyGerberCommandLayers,
} from "circuit-json-to-gerber"

const inputPath = process.argv[2] ?? "dist/index/circuit.json"
const outputDirectory = process.argv[3] ?? "fabrication/gerbers"
const circuitJson = JSON.parse(await readFile(inputPath, "utf8"))
const execFile = promisify(execFileCallback)

const gerberLayers = stringifyGerberCommandLayers(
  convertSoupToGerberCommands(circuitJson),
)
const drillLayers = convertSoupToExcellonDrillCommandLayers({ circuitJson })

// The set of drill spans can shrink after a reroute. Recreate this generated
// directory so obsolete blind/buried drill files cannot leak into the archive.
await rm(outputDirectory, { recursive: true, force: true })
await mkdir(outputDirectory, { recursive: true })

for (const [filename, contents] of Object.entries(gerberLayers)) {
  await writeFile(`${outputDirectory}/${filename}.gbr`, contents)
}

for (const [filename, commands] of Object.entries(drillLayers)) {
  await writeFile(
    `${outputDirectory}/${filename}`,
    stringifyExcellonDrill(commands),
  )
}

const archiveName = "msp-exp430fr2433-4layer-gerbers.zip"
const archivePath = resolve(dirname(outputDirectory), archiveName)
const temporaryDirectory = await mkdtemp(join(tmpdir(), "tscircuit-gerbers-"))
const temporaryArchivePath = join(temporaryDirectory, archiveName)
const generatedFiles = (await readdir(outputDirectory))
  .sort()
  .map((filename) => resolve(outputDirectory, filename))

try {
  await execFile("zip", ["-j", "-q", temporaryArchivePath, ...generatedFiles])
  await rename(temporaryArchivePath, archivePath)
} finally {
  await rm(temporaryDirectory, { recursive: true, force: true })
}

console.log(
  `Exported ${Object.keys(gerberLayers).length} Gerber and ${Object.keys(drillLayers).length} drill layers to ${outputDirectory} and ${basename(archivePath)}`,
)