forked from HEL/circuiteria
Defining a block and placing elements into that block has the benefit
that you can use the ports to align the elements within the block to the
ports of that outer ("shell") block
78 lines
2.0 KiB
Typst
78 lines
2.0 KiB
Typst
#import "/src/cetz.typ": draw
|
|
#import "element.typ"
|
|
|
|
#let draw-shape(id, tl, tr, br, bl, fill, stroke, radius: 0.5em) = {
|
|
let f = draw.rect(
|
|
radius: radius,
|
|
inset: 0.5em,
|
|
fill: fill,
|
|
stroke: stroke,
|
|
name: id,
|
|
bl, tr
|
|
)
|
|
return (f, tl, tr, br, bl)
|
|
}
|
|
|
|
/// Draws a block element
|
|
///
|
|
/// #examples.block
|
|
///
|
|
/// Ports can be given a pentagon shape (with configurable direction, size,
|
|
/// stroke and fill) via `port-shape` and per-port overrides:
|
|
/// #examples.port-shape
|
|
///
|
|
/// Port name labels can be placed outside the block via `port-names-outside`:
|
|
/// #examples.port-names-outside
|
|
/// For other parameters description, see #doc-ref("element.elmt")
|
|
/// - radius (number, length, ratio, dictionary): The corner radius of the block. See CeTZ documentation for more information
|
|
/// - shell (bool): If true, the block behaves like a shell/container (analogous to a group): port name labels default to being drawn outside the block, and wires attach to the inside tip of pentagon-shaped ports. See #doc-ref("element.elmt")
|
|
///
|
|
/// Use `shell: true` to wrap child elements inside a bordered container without
|
|
/// having ports overlap the interior:
|
|
/// #examples.shell
|
|
#let block(
|
|
..args,
|
|
x: none,
|
|
y: none,
|
|
w: none,
|
|
h: none,
|
|
name: none,
|
|
name-anchor: "center",
|
|
ports: (),
|
|
ports-margins: (),
|
|
port-name-padding: 2pt,
|
|
port-names-outside: auto,
|
|
port-shape: none,
|
|
port-kind: "in",
|
|
port-size: 1em,
|
|
fill: none,
|
|
radius: 0.5em,
|
|
stroke: black + 1pt,
|
|
id: "",
|
|
shell: false,
|
|
debug: (
|
|
ports: false
|
|
)
|
|
) = element.elmt(
|
|
draw-shape: draw-shape.with(radius: radius),
|
|
body: if args.pos().len() > 0 { args.pos().first() } else { none },
|
|
x: x,
|
|
y: y,
|
|
w: w,
|
|
h: h,
|
|
name: name,
|
|
name-anchor: name-anchor,
|
|
ports: ports,
|
|
ports-margins: ports-margins,
|
|
port-name-padding: port-name-padding,
|
|
port-names-outside: port-names-outside,
|
|
port-shape: port-shape,
|
|
port-kind: port-kind,
|
|
port-size: port-size,
|
|
fill: fill,
|
|
stroke: stroke,
|
|
id: id,
|
|
shell: shell,
|
|
debug: debug
|
|
)
|