Compare commits

..

No commits in common. "main" and "main" have entirely different histories.
main ... main

3 changed files with 53 additions and 85 deletions

View File

@ -9,6 +9,6 @@
/// - length (length, ratio): Optional base unit /// - length (length, ratio): Optional base unit
/// -> none /// -> none
#let circuit(body, length: 2em) = { #let circuit(body, length: 2em) = {
// set text(font: "Source Sans 3") set text(font: "Source Sans 3")
canvas(length: length, body) canvas(length: length, body)
} }

View File

@ -56,22 +56,18 @@
} }
if (type(y) == dictionary) { if (type(y) == dictionary) {
let offset = y.rel let from = y.from
let to = y.to let to = y.to
let (ctx, to-pos) = coordinate.resolve(ctx, (rel: (0, offset), to: to))
y = to-pos.at(1)
// let from = y.from
// let to = y.to
// let dy let dy
// if to == "out" { if to == "out" {
// dy = height / 2 dy = height / 2
// } else { } else {
// dy = height * (i + 0.5) / inputs dy = height * (i + 0.5) / inputs
// } }
// let (ctx, from-pos) = coordinate.resolve(ctx, from) let (ctx, from-pos) = coordinate.resolve(ctx, from)
// y = from-pos.at(1) + dy - height y = from-pos.at(1) + dy - height
} }
let tl = (x, y + height) let tl = (x, y + height)

View File

@ -19,7 +19,7 @@
#let get-direct-wire(pts) = { #let get-direct-wire(pts) = {
let anchors = ( let anchors = (
"start": pts.first(), "start": pts.first(),
"end": pts.last(), "end": pts.last()
) )
return (pts, anchors) return (pts, anchors)
} }
@ -38,21 +38,21 @@
start, start,
(horizontal: mid, vertical: ()), (horizontal: mid, vertical: ()),
(horizontal: (), vertical: end), (horizontal: (), vertical: end),
end, end
) )
} else { } else {
( (
start, start,
(horizontal: (), vertical: mid), (horizontal: (), vertical: mid),
(horizontal: end, vertical: ()), (horizontal: end, vertical: ()),
end, end
) )
} }
let anchors = ( let anchors = (
"start": start, "start": start,
"zig": points.at(1), "zig": points.at(1),
"zag": points.at(2), "zag": points.at(2),
"end": end, "end": end
) )
return (points, anchors) return (points, anchors)
} }
@ -95,7 +95,7 @@
(horizontal: (), vertical: (0, dodge-y)), (horizontal: (), vertical: (0, dodge-y)),
(horizontal: p2, vertical: ()), (horizontal: p2, vertical: ()),
(horizontal: (), vertical: end), (horizontal: (), vertical: end),
end, end
) )
let anchors = ( let anchors = (
"start": start, "start": start,
@ -103,7 +103,7 @@
"dodge-start": points.at(2), "dodge-start": points.at(2),
"dodge-end": points.at(3), "dodge-end": points.at(3),
"end2": points.at(4), "end2": points.at(4),
"end": end, "end": end
) )
return (points, anchors) return (points, anchors)
@ -128,8 +128,7 @@
/// - dodge-sides (array): The start and end sides (going out of the connected element) of the wire (only with style "dodge") /// - dodge-sides (array): The start and end sides (going out of the connected element) of the wire (only with style "dodge")
/// - dodge-margins (array): The start and end margins (i.e. space before dodging) of the wire (only with style "dodge") /// - dodge-margins (array): The start and end margins (i.e. space before dodging) of the wire (only with style "dodge")
#let wire( #let wire(
id, id, pts,
pts,
bus: false, bus: false,
name: none, name: none,
name-pos: "middle", name-pos: "middle",
@ -144,7 +143,7 @@
zigzag-dir: "vertical", zigzag-dir: "vertical",
dodge-y: 0, dodge-y: 0,
dodge-sides: ("east", "west"), dodge-sides: ("east", "west"),
dodge-margins: (5%, 5%), dodge-margins: (5%, 5%)
) = draw.get-ctx(ctx => { ) = draw.get-ctx(ctx => {
if not style in wire-styles { if not style in wire-styles {
panic("Invalid wire style '" + style + "'") panic("Invalid wire style '" + style + "'")
@ -156,11 +155,7 @@
let stroke = ( let stroke = (
paint: color, paint: color,
thickness: if bus { thickness: if bus {bus-width} else {signal-width}
bus-width
} else {
signal-width
},
) )
if dashed { if dashed {
stroke.insert("dash", "dashed") stroke.insert("dash", "dashed")
@ -181,7 +176,7 @@
dodge-y, dodge-y,
dodge-margins, dodge-margins,
dodge-sides, dodge-sides,
ctx, ctx
) )
} }
@ -189,15 +184,12 @@
if directed { if directed {
mark = (end: ">", fill: color) mark = (end: ">", fill: color)
} }
draw.group( draw.group(name: id, {
name: id, draw.line(..points, stroke: stroke, mark: mark)
{ for (anchor-name, anchor-pos) in anchors {
draw.line(..points, stroke: stroke, mark: mark) draw.anchor(anchor-name, anchor-pos)
for (anchor-name, anchor-pos) in anchors { }
draw.anchor(anchor-name, anchor-pos) })
}
},
)
let first-pt = id + ".start" let first-pt = id + ".start"
let last-pt = id + ".end" let last-pt = id + ".end"
@ -223,13 +215,13 @@
if name != none { if name != none {
let names = () let names = ()
if type(name) == str or type(name) == content { if type(name) == str {
names = ((name, name-pos),) names = ((name, name-pos),)
} else if type(name) == array { } else if type(name) == array {
names = ( names = (
(name.at(0), "start"), (name.at(0), "start"),
(name.at(1), "end"), (name.at(1), "end")
) )
} }
@ -261,7 +253,7 @@
first-pt, first-pt,
anchor: "south-west", anchor: "south-west",
padding: 3pt, padding: 3pt,
text(slice-txt, size: 0.75em), text(slice-txt, size: 0.75em)
) )
} }
}) })
@ -275,38 +267,24 @@
/// - vertical (bool): Whether the name should be displayed vertically /// - vertical (bool): Whether the name should be displayed vertically
/// - length (number): The length of the stub /// - length (number): The length of the stub
/// - name-offset (number): The name offset, perpendicular to the stub /// - name-offset (number): The name offset, perpendicular to the stub
#let stub( #let stub(port-id, side, name: none, vertical: false, length: 1em, name-offset: 0) = {
port-id,
side,
name: none,
vertical: false,
length: 1em,
name-offset: 0,
color: black,
directed: none,
) = {
let end-offset = ( let end-offset = (
north: (0, length), north: (0, length),
east: (length, 0), east: (length, 0),
south: (0, -length), south: (0, -length),
west: (-length, 0), west: (-length, 0)
).at(side) ).at(side)
let name-offset = ( let name-offset = (
north: (name-offset, length), north: (name-offset, length),
east: (length, name-offset), east: (length, name-offset),
south: (name-offset, -length), south: (name-offset, -length),
west: (-length, name-offset), west: (-length, name-offset)
).at(side) ).at(side)
let mark = (fill: color)
if directed != none {
mark = ((directed): ">", fill: color)
}
draw.line( draw.line(
port-id, port-id,
(rel: end-offset, to: port-id), (rel: end-offset, to: port-id)
mark: mark,
) )
if name != none { if name != none {
let text-anchor = if vertical { let text-anchor = if vertical {
@ -314,21 +292,15 @@
"north": "west", "north": "west",
"south": "east", "south": "east",
"west": "south", "west": "south",
"east": "north", "east": "north"
).at(side) ).at(side)
} else { } else { opposite-anchor(side) }
opposite-anchor(side)
}
draw.content( draw.content(
anchor: text-anchor, anchor: text-anchor,
padding: 0.2em, padding: 0.2em,
angle: if vertical { angle: if vertical {90deg} else {0deg},
90deg
} else {
0deg
},
(rel: name-offset, to: port-id), (rel: name-offset, to: port-id),
name, name
) )
} }
} }