From 3e9272255c21392c3c120f6360e49f5a2a1c6427 Mon Sep 17 00:00:00 2001 From: LordBaryhobal Date: Sat, 19 Apr 2025 15:56:20 +0200 Subject: [PATCH] improved wire arguments --- gallery/target_api.pdf | Bin 7586 -> 7016 bytes gallery/target_api.typ | 15 ++++++----- src/elements/element.typ | 50 ++++++++++++++++++++++++----------- src/elements/multiplexer.typ | 34 ++++++++++++++---------- src/elements/ports.typ | 2 +- src/util.typ | 9 ++++++- src/wire.typ | 30 ++++++++++++--------- 7 files changed, 90 insertions(+), 50 deletions(-) diff --git a/gallery/target_api.pdf b/gallery/target_api.pdf index d1a960055e43e7ceac6a7fbbbfce8792de7e7f3a..e0ecee5faca38d69eb89badeab5978dc225bc36e 100644 GIT binary patch delta 3720 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 delta 4397 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 { let width = elmt.size.first() let height = elmt.size.last() diff --git a/src/elements/multiplexer.typ b/src/elements/multiplexer.typ index 8e55173..1e4832a 100644 --- a/src/elements/multiplexer.typ +++ b/src/elements/multiplexer.typ @@ -5,27 +5,33 @@ #let draw-shape(elmt, bounds) = { let margin = (100% - elmt.l-ratio) / 2 - let tr2 = (bounds.tr, margin, bounds.br) - let br2 = (bounds.br, margin, bounds.tr) - let f = draw.group(name: elmt.id, { + let tr2 = util.lerp(bounds.tr, margin, bounds.br) + let br2 = util.lerp(bounds.br, margin, bounds.tr) + let bounds2 = element.complete-bounds(elmt, ( + tl: bounds.tl, + bl: bounds.bl, + tr: tr2, + br: br2, + )) + let f = { draw.merge-path( inset: 0.5em, fill: elmt.fill, stroke: elmt.stroke, close: true, - draw.line(bounds.tl, tr2, br2, bounds.bl) + draw.line(bounds2.tl, bounds2.tr, bounds2.br, bounds2.bl) ) - draw.anchor("north", (bounds.tl, 50%, tr2)) - draw.anchor("south", (bounds.bl, 50%, br2)) - draw.anchor("west", (bounds.tl, 50%, bounds.bl)) - draw.anchor("east", (tr2, 50%, br2)) - draw.anchor("north-west", bounds.tl) - draw.anchor("north-east", tr2) - draw.anchor("south-east", br2) - draw.anchor("south-west", bounds.bl) - }) + draw.anchor("north", bounds2.t) + draw.anchor("south", bounds2.b) + draw.anchor("west", bounds2.l) + draw.anchor("east", bounds2.r) + draw.anchor("north-west", bounds2.tl) + draw.anchor("north-east", bounds2.tr) + draw.anchor("south-east", bounds2.br) + draw.anchor("south-west", bounds2.bl) + } - return (f, bounds) + return (f, bounds2) } /// Draws a multiplexer diff --git a/src/elements/ports.typ b/src/elements/ports.typ index eecd300..f6bde71 100644 --- a/src/elements/ports.typ +++ b/src/elements/ports.typ @@ -9,7 +9,7 @@ } } } - panic("Unknown port " + port + " on element " + element.id) + panic("Unknown port " + port + " on element " + elmt.id) } #let get-port-idx(elmt, port, side: auto) = { diff --git a/src/util.typ b/src/util.typ index a444434..3d91749 100644 --- a/src/util.typ +++ b/src/util.typ @@ -73,4 +73,11 @@ #let valid-anchors = ( "center", "north", "east", "west", "south", "north-east", "north-west", "south-east", "south-west" -) \ No newline at end of file +) + +#let lerp(pt0, ratio, pt1) = { + return ( + (pt1.at(0) - pt0.at(0)) * ratio / 100% + pt0.at(0), + (pt1.at(1) - pt0.at(1)) * ratio / 100% + pt0.at(1) + ) +} \ No newline at end of file diff --git a/src/wire.typ b/src/wire.typ index 899e4c1..13d6ffb 100644 --- a/src/wire.typ +++ b/src/wire.typ @@ -130,10 +130,11 @@ /// - 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") #let wire( - id, pts, + pt0, + pt1, + id: none, bus: false, name: none, - name-pos: "middle", slice: none, color: black, dashed: false, @@ -145,15 +146,14 @@ zigzag-dir: "vertical", dodge-y: 0, dodge-sides: ("east", "west"), - dodge-margins: (5%, 5%) + dodge-margins: (5%, 5%), + ..args ) = draw.get-ctx(ctx => { if not style in wire-styles { panic("Invalid wire style '" + style + "'") } - if pts.len() != 2 { - panic("Wrong number of points (got " + str(pts.len()) + " instead of 2)") - } + let pts = (pt0, pt1) let stroke = ( paint: color, @@ -218,7 +218,7 @@ let names = () if type(name) == str { - names = ((name, name-pos),) + names = ((name, "middle"),) } else if type(name) == array { names = ( @@ -228,6 +228,9 @@ } for (name, pos) in names { + if name == none { + continue + } let point let anchor @@ -269,7 +272,7 @@ /// - vertical (bool): Whether the name should be displayed vertically /// - length (number): The length of the stub /// - name-offset (number): The name offset, perpendicular to the stub -#let stub(anchor, name: none, vertical: false, length: 1em, name-offset: 0) = { +#let stub(anchor, side: auto, name: none, vertical: false, length: 1em, name-offset: 0) = { if "." not in anchor { panic("`anchor` must be a valid anchor of an element") } @@ -280,11 +283,14 @@ let pre-process = (elements, elmt) => { let eid = elmt.id - if port-elmt-id not in elements { - panic("Unknown element " + port-elmt-id) + let side = side + if side == auto { + if port-elmt-id not in elements { + panic("Unknown element " + port-elmt-id) + } + let port-elmt = elements.at(port-elmt-id) + side = get-port-side(port-elmt, port-id) } - let port-elmt = elements.at(port-elmt-id) - let side = get-port-side(port-elmt, port-id) elements.at(eid).insert("side", side) return elements }