feat: Support cross-element port alignment via align-with
Extend the port `align-with` field to accept references to ports of other elements, in addition to the existing local-port form: - "<local-id>" → same-element port (unchanged) - (element: "<id>", port: "<id>") → cross-element reference - "<raw-anchor>" → arbitrary CeTZ anchor name Cross-element alignment is implemented via CeTZ perpendicular projection (`|-`) so the port sits on this element's side line while sharing the remote port's y (east/west) or x (north/south) coordinate. Local resolution still validates matching axis and detects cycles; external refs skip axis validation (remote side unknown at eval time) and require the target element to be drawn first. Also enrich port-related panic messages with the element id and port context to make offending figures easier to locate, and add a manual example (`examples.align-with-ports`) demonstrating both local and cross-element alignment.
This commit is contained in:
1 parent
f7cb457202
commit
fff5b2ecd5
4 files changed
+8774
-8388
No files matched your search
@@ -23,6 +23,31 @@ wire.stub("block-port-in2", "west")
|
||||
wire.stub("block-port-out", "east")
|
||||
```)
|
||||
|
||||
#let align-with-ports = example(```
|
||||
// `align-with` reuses another port's coord
|
||||
// (E/W: y, N/S: x). Forms:
|
||||
// 1. "id" — local
|
||||
// 2. (element:"e", port:"p") — cross-elmt
|
||||
// 3. "raw-anchor" — CeTZ anchor
|
||||
element.block(x: 0, y: 0, w: 2, h: 2, id: "b1",
|
||||
ports: (
|
||||
west: ((id: "a", name: "A", y: 30%),),
|
||||
east: ((id: "oa", name: "A'",
|
||||
"align-with": "a"),),
|
||||
))
|
||||
element.block(x: 4, y: -.3, w: 2, h: 2.6, id: "b2",
|
||||
ports: (
|
||||
west: ((id: "ia", name: "A",
|
||||
"align-with":
|
||||
(element: "b1", port: "oa")),),
|
||||
east: ((id: "o", name: "C"),),
|
||||
))
|
||||
wire.stub("b1-port-a", "west")
|
||||
wire.wire("w", ("b1-port-oa", "b2-port-ia"),
|
||||
style: "direct")
|
||||
wire.stub("b2-port-o", "east")
|
||||
```, vertical: true)
|
||||
|
||||
#let extender = example(```
|
||||
element.extender(
|
||||
x: 0, y: 0, w: 3, h: 1,
|
||||
|
||||
Reference in new issue
Block a user