forked from HEL/circuiteria
		
	improved wire arguments
This commit is contained in:
		| @@ -116,22 +116,29 @@ | ||||
|   return coord | ||||
| } | ||||
|  | ||||
| #let make-bounds(elmt, x, y, w, h) = { | ||||
|   let w2 = w / 2 | ||||
|   let h2 = h / 2 | ||||
|    | ||||
|   let bounds = ( | ||||
|     bl: (x, y), | ||||
|     tl: (x, y + h), | ||||
|     tr: (x + w, y + h), | ||||
|     br: (x + w, y), | ||||
|     center: (x + w2, y + h2), | ||||
|     b: (x + w2, y), | ||||
|     t: (x + w2, y + h), | ||||
|     l: (x, y + h2), | ||||
|     r: (x + w, y + h2), | ||||
|   ) | ||||
| #let complete-bounds(elmt, bounds) = { | ||||
|   let b = bounds | ||||
|   bounds += ( | ||||
|     center: ( | ||||
|       (b.br.at(0) + b.tl.at(0))/2, | ||||
|       (b.br.at(1) + b.tl.at(1))/2 | ||||
|     ), | ||||
|     b: ( | ||||
|       (b.br.at(0) + b.bl.at(0))/2, | ||||
|       (b.br.at(1) + b.bl.at(1))/2 | ||||
|     ), | ||||
|     t: ( | ||||
|       (b.tr.at(0) + b.tl.at(0))/2, | ||||
|       (b.tr.at(1) + b.tl.at(1))/2 | ||||
|     ), | ||||
|     l: ( | ||||
|       (b.bl.at(0) + b.tl.at(0))/2, | ||||
|       (b.bl.at(1) + b.tl.at(1))/2 | ||||
|     ), | ||||
|     r: ( | ||||
|       (b.br.at(0) + b.tr.at(0))/2, | ||||
|       (b.br.at(1) + b.tr.at(1))/2 | ||||
|     ), | ||||
|     sides: ( | ||||
|       north: (bounds.tl, bounds.tr), | ||||
|       south: (bounds.bl, bounds.br), | ||||
| @@ -160,6 +167,19 @@ | ||||
|   return bounds | ||||
| } | ||||
|  | ||||
| #let make-bounds(elmt, x, y, w, h) = { | ||||
|   let w2 = w / 2 | ||||
|   let h2 = h / 2 | ||||
|    | ||||
|   let bounds = ( | ||||
|     bl: (x, y), | ||||
|     tl: (x, y + h), | ||||
|     tr: (x + w, y + h), | ||||
|     br: (x + w, y), | ||||
|   ) | ||||
|   return complete-bounds(elmt, bounds) | ||||
| } | ||||
|  | ||||
| #let render(draw-shape, elmt) = draw.group(name: elmt.id, ctx => { | ||||
|   let width = elmt.size.first() | ||||
|   let height = elmt.size.last() | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
| @@ -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) = { | ||||
|   | ||||
| @@ -73,4 +73,11 @@ | ||||
| #let valid-anchors = ( | ||||
|   "center", "north", "east", "west", "south", | ||||
|   "north-east", "north-west", "south-east", "south-west" | ||||
| ) | ||||
| ) | ||||
|  | ||||
| #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) | ||||
|   ) | ||||
| } | ||||
							
								
								
									
										30
									
								
								src/wire.typ
									
									
									
									
									
								
							
							
						
						
									
										30
									
								
								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 | ||||
|   } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user