Skip to content
Open
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
import type {
CadComponent,
PcbComponent,
SourceSimpleFiducial,
} from "circuit-json"
import { Chip } from "lib/components/normal-components/Chip"
import type { InflatorContext } from "../InflatorFn"
import { inflateFootprintComponent } from "./inflateFootprintComponent"
import { getInflatedPcbPlacement } from "./getInflatedPcbPlacement"

export function inflateSourceFiducial(
sourceElm: SourceSimpleFiducial,
inflatorContext: InflatorContext,
) {
const { injectionDb, subcircuit, groupsMap } = inflatorContext

const pcbElm = injectionDb.pcb_component.getWhere({
source_component_id: sourceElm.source_component_id,
}) as PcbComponent | null

const cadElm = injectionDb.cad_component.getWhere({
source_component_id: sourceElm.source_component_id,
}) as CadComponent | null

const { pcbX, pcbY } = getInflatedPcbPlacement({
pcbComponent: pcbElm,
sourceGroupId: sourceElm.source_group_id,
inflatorContext,
})

const fiducial = new Chip({
name: sourceElm.name,
layer: pcbElm?.layer,
pcbX,
pcbY,
pcbRotation: pcbElm?.rotation,
doNotPlace: pcbElm?.do_not_place,
obstructsWithinBounds: pcbElm?.obstructs_within_bounds,
noSchematicRepresentation: true,
})

if (pcbElm) {
const footprint = inflateFootprintComponent(pcbElm, {
...inflatorContext,
normalComponent: fiducial,
})

if (footprint) {
fiducial.add(footprint)
}
}

if (sourceElm.source_group_id && groupsMap?.has(sourceElm.source_group_id)) {
const group = groupsMap.get(sourceElm.source_group_id)!
group.add(fiducial)
} else {
subcircuit.add(fiducial)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
import type { CadComponent, PcbComponent, SourceSimpleLed } from "circuit-json"
import { Led } from "lib/components/normal-components/Led"
import type { InflatorContext } from "../InflatorFn"
import { inflateFootprintComponent } from "./inflateFootprintComponent"
import { getInflatedPcbPlacement } from "./getInflatedPcbPlacement"

export function inflateSourceLed(
sourceElm: SourceSimpleLed,
inflatorContext: InflatorContext,
) {
const { injectionDb, subcircuit, groupsMap } = inflatorContext

const pcbElm = injectionDb.pcb_component.getWhere({
source_component_id: sourceElm.source_component_id,
}) as PcbComponent | null

const cadElm = injectionDb.cad_component.getWhere({
source_component_id: sourceElm.source_component_id,
}) as CadComponent | null

const { pcbX, pcbY } = getInflatedPcbPlacement({
pcbComponent: pcbElm,
sourceGroupId: sourceElm.source_group_id,
inflatorContext,
})

const led = new Led({
name: sourceElm.name,
color: sourceElm.color,
wavelength: sourceElm.wavelength,
layer: pcbElm?.layer,
pcbX,
pcbY,
pcbRotation: pcbElm?.rotation,
doNotPlace: pcbElm?.do_not_place,
obstructsWithinBounds: pcbElm?.obstructs_within_bounds,
})

if (pcbElm) {
const footprint = inflateFootprintComponent(pcbElm, {
...inflatorContext,
normalComponent: led,
})

if (footprint) {
led.add(footprint)
}
}

if (sourceElm.source_group_id && groupsMap?.has(sourceElm.source_group_id)) {
const group = groupsMap.get(sourceElm.source_group_id)!
group.add(led)
} else {
subcircuit.add(led)
}
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,5 @@
import type {
LayerRef,
PcbTrace,
PcbTraceRoutePoint,
SourceTrace,
} from "circuit-json"
import type { PcbTrace, PcbVia, SourceTrace } from "circuit-json"
import { Trace } from "lib/components/primitive-components/Trace/Trace"
import {
type ManualPcbPathPoint,
pcbTraceRouteToPcbPath,
} from "lib/utils/pcbTraceRouteToPcbPath"
import type { InflatorContext } from "../InflatorFn"

const getSelectorPath = (
Expand Down Expand Up @@ -90,28 +81,37 @@ export function inflateSourceTrace(
return
}

const pcbTrace = injectionDb.pcb_trace.getWhere({
source_trace_id: sourceTrace.source_trace_id,
})

let pcbPath: ManualPcbPathPoint[] | undefined
if (pcbTrace) {
pcbPath = pcbTraceRouteToPcbPath(pcbTrace.route)
}

// Extract trace width from source_trace or pcb_trace route points
const pcbTraces = injectionDb.pcb_trace
.list()
.filter(
(pcbTrace) => pcbTrace.source_trace_id === sourceTrace.source_trace_id,
)

const inflatedPcbVias: PcbVia[] | undefined =
pcbTraces.length > 0
? injectionDb.pcb_via
.list()
.filter((via) =>
pcbTraces.some(
(pcbTrace) => pcbTrace.pcb_trace_id === via.pcb_trace_id,
),
)
: undefined

// Extract trace width from source_trace or the first imported pcb_trace route
let traceWidth: number | undefined = sourceTrace.min_trace_thickness
if (!traceWidth && pcbTrace?.route) {
// Try to get width from the first wire point in the route
const wirePoint = pcbTrace.route.find((pt) => pt.route_type === "wire")
if (wirePoint && wirePoint.route_type === "wire") {
traceWidth = wirePoint.width
if (!traceWidth) {
for (const pcbTrace of pcbTraces) {
const wirePoint = pcbTrace.route.find((pt) => pt.route_type === "wire")
if (wirePoint && wirePoint.route_type === "wire") {
traceWidth = wirePoint.width
break
}
}
}

const traceProps: {
path: string[]
pcbPath?: ManualPcbPathPoint[]
pcbStraightLine?: boolean
thickness?: number
} = {
Expand All @@ -122,12 +122,8 @@ export function inflateSourceTrace(
traceProps.thickness = traceWidth
}

// If pcbPath has intermediate points, use manual routing
// Otherwise, use straight-line routing (simple 2-point traces)
if (pcbPath && pcbPath.length > 0) {
traceProps.pcbPath = pcbPath
} else if (
!pcbTrace &&
if (
pcbTraces.length === 0 &&
sourceTrace.connected_source_port_ids.length === 2 &&
sourceTrace.connected_source_net_ids.length === 0
) {
Expand All @@ -137,12 +133,9 @@ export function inflateSourceTrace(
}

const trace = new Trace(traceProps)
trace._inflatedPcbTrace = pcbTrace ?? undefined
trace._inflatedPcbVias = pcbTrace
? injectionDb.pcb_via
.list()
.filter((via) => via.pcb_trace_id === pcbTrace.pcb_trace_id)
: undefined
trace._inflatedSourceTrace = sourceTrace
trace._inflatedPcbTraces = pcbTraces.length > 0 ? pcbTraces : undefined
trace._inflatedPcbVias = inflatedPcbVias

subcircuit.add(trace)
}
19 changes: 13 additions & 6 deletions lib/components/primitive-components/Trace/Trace.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import {
type RouteHintPoint,
type SchematicNetLabel,
type SchematicTrace,
type SourceTrace,
} from "circuit-json"
import { getFullConnectivityMapFromCircuitJson } from "circuit-json-to-connectivity-map"
import { DirectLineRouter } from "lib/utils/autorouting/DirectLineRouter"
Expand Down Expand Up @@ -53,7 +54,8 @@ export class Trace
source_trace_id: string | null = null
pcb_trace_id: string | null = null
schematic_trace_id: string | null = null
_inflatedPcbTrace?: PcbTrace
_inflatedSourceTrace?: SourceTrace
_inflatedPcbTraces?: PcbTrace[]
_inflatedPcbVias?: PcbVia[]
_portsRoutedOnPcb: Port[]
subcircuit_connectivity_map_key: string | null = null
Expand Down Expand Up @@ -232,6 +234,7 @@ export class Trace
doInitialSourceTraceRender(): void {
const { db } = this.root!
const { _parsedProps: props, parent } = this
const subcircuit = this.getSubcircuit()

if (!parent) {
this.renderError("Trace has no parent")
Expand Down Expand Up @@ -260,6 +263,7 @@ export class Trace
if (!allPortsFound) return

this._traceConnectionHash = this._computeTraceConnectionHash()
const nets = this._findConnectedNets().nets

const existingTraces = db.source_trace.list()
const existingTrace = existingTraces.find(
Expand All @@ -274,19 +278,22 @@ export class Trace
return
}

const nets = this._findConnectedNets().nets
const displayName = getTraceDisplayName({ ports: ports, nets: nets })
const trace = db.source_trace.insert({
connected_source_port_ids: ports.map((p) => p.port.source_port_id!),
connected_source_net_ids: nets.map((n) => n.source_net_id!),
subcircuit_id: this.getSubcircuit()?.subcircuit_id!,
subcircuit_id: subcircuit?.subcircuit_id!,
max_length:
this._inflatedSourceTrace?.max_length ??
getMaxLengthFromConnectedCapacitors(
ports.map((p) => p.port),
{ db },
) ?? props.maxLength,
display_name: displayName,
min_trace_thickness: this._getExplicitTraceThickness(),
) ??
props.maxLength,
display_name: this._inflatedSourceTrace?.display_name ?? displayName,
min_trace_thickness:
this._inflatedSourceTrace?.min_trace_thickness ??
this._getExplicitTraceThickness(),
})

this.source_trace_id = trace.source_trace_id
Expand Down
Loading
Loading