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)}`,
)