@skillpet/circuit 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (332) hide show
  1. package/README.md +131 -0
  2. package/dist/circuit.bundle.js +31103 -0
  3. package/dist/circuit.bundle.js.map +7 -0
  4. package/dist/circuit.bundle.min.js +273 -0
  5. package/dist/circuit.bundle.min.js.map +7 -0
  6. package/dist/circuit.esm.js +31069 -0
  7. package/dist/circuit.esm.js.map +7 -0
  8. package/dist/config.d.ts +26 -0
  9. package/dist/config.d.ts.map +1 -0
  10. package/dist/config.js +23 -0
  11. package/dist/config.js.map +1 -0
  12. package/dist/container.d.ts +32 -0
  13. package/dist/container.d.ts.map +1 -0
  14. package/dist/container.js +101 -0
  15. package/dist/container.js.map +1 -0
  16. package/dist/drawing-gradient.d.ts +13 -0
  17. package/dist/drawing-gradient.d.ts.map +1 -0
  18. package/dist/drawing-gradient.js +39 -0
  19. package/dist/drawing-gradient.js.map +1 -0
  20. package/dist/drawing-stack.d.ts +16 -0
  21. package/dist/drawing-stack.d.ts.map +1 -0
  22. package/dist/drawing-stack.js +32 -0
  23. package/dist/drawing-stack.js.map +1 -0
  24. package/dist/drawing-transition.d.ts +34 -0
  25. package/dist/drawing-transition.d.ts.map +1 -0
  26. package/dist/drawing-transition.js +181 -0
  27. package/dist/drawing-transition.js.map +1 -0
  28. package/dist/drawing.d.ts +117 -0
  29. package/dist/drawing.d.ts.map +1 -0
  30. package/dist/drawing.js +337 -0
  31. package/dist/drawing.js.map +1 -0
  32. package/dist/element-label.d.ts +54 -0
  33. package/dist/element-label.d.ts.map +1 -0
  34. package/dist/element-label.js +377 -0
  35. package/dist/element-label.js.map +1 -0
  36. package/dist/element-style.d.ts +34 -0
  37. package/dist/element-style.d.ts.map +1 -0
  38. package/dist/element-style.js +51 -0
  39. package/dist/element-style.js.map +1 -0
  40. package/dist/element.d.ts +114 -0
  41. package/dist/element.d.ts.map +1 -0
  42. package/dist/element.js +514 -0
  43. package/dist/element.js.map +1 -0
  44. package/dist/element2term.d.ts +25 -0
  45. package/dist/element2term.d.ts.map +1 -0
  46. package/dist/element2term.js +245 -0
  47. package/dist/element2term.js.map +1 -0
  48. package/dist/elements/cables.d.ts +22 -0
  49. package/dist/elements/cables.d.ts.map +1 -0
  50. package/dist/elements/cables.js +100 -0
  51. package/dist/elements/cables.js.map +1 -0
  52. package/dist/elements/capacitor.d.ts +23 -0
  53. package/dist/elements/capacitor.d.ts.map +1 -0
  54. package/dist/elements/capacitor.js +93 -0
  55. package/dist/elements/capacitor.js.map +1 -0
  56. package/dist/elements/compound.d.ts +41 -0
  57. package/dist/elements/compound.d.ts.map +1 -0
  58. package/dist/elements/compound.js +266 -0
  59. package/dist/elements/compound.js.map +1 -0
  60. package/dist/elements/connectors.d.ts +81 -0
  61. package/dist/elements/connectors.d.ts.map +1 -0
  62. package/dist/elements/connectors.js +578 -0
  63. package/dist/elements/connectors.js.map +1 -0
  64. package/dist/elements/crystal.d.ts +8 -0
  65. package/dist/elements/crystal.d.ts.map +1 -0
  66. package/dist/elements/crystal.js +31 -0
  67. package/dist/elements/crystal.js.map +1 -0
  68. package/dist/elements/diode-more.d.ts +36 -0
  69. package/dist/elements/diode-more.d.ts.map +1 -0
  70. package/dist/elements/diode-more.js +233 -0
  71. package/dist/elements/diode-more.js.map +1 -0
  72. package/dist/elements/diode.d.ts +14 -0
  73. package/dist/elements/diode.d.ts.map +1 -0
  74. package/dist/elements/diode.js +58 -0
  75. package/dist/elements/diode.js.map +1 -0
  76. package/dist/elements/element-compound.d.ts +16 -0
  77. package/dist/elements/element-compound.d.ts.map +1 -0
  78. package/dist/elements/element-compound.js +68 -0
  79. package/dist/elements/element-compound.js.map +1 -0
  80. package/dist/elements/element-drawing.d.ts +10 -0
  81. package/dist/elements/element-drawing.d.ts.map +1 -0
  82. package/dist/elements/element-drawing.js +16 -0
  83. package/dist/elements/element-drawing.js.map +1 -0
  84. package/dist/elements/ground.d.ts +6 -0
  85. package/dist/elements/ground.d.ts.map +1 -0
  86. package/dist/elements/ground.js +30 -0
  87. package/dist/elements/ground.js.map +1 -0
  88. package/dist/elements/ic.d.ts +169 -0
  89. package/dist/elements/ic.d.ts.map +1 -0
  90. package/dist/elements/ic.js +816 -0
  91. package/dist/elements/ic.js.map +1 -0
  92. package/dist/elements/image.d.ts +9 -0
  93. package/dist/elements/image.d.ts.map +1 -0
  94. package/dist/elements/image.js +27 -0
  95. package/dist/elements/image.js.map +1 -0
  96. package/dist/elements/inductor.d.ts +15 -0
  97. package/dist/elements/inductor.d.ts.map +1 -0
  98. package/dist/elements/inductor.js +111 -0
  99. package/dist/elements/inductor.js.map +1 -0
  100. package/dist/elements/line.d.ts +8 -0
  101. package/dist/elements/line.d.ts.map +1 -0
  102. package/dist/elements/line.js +14 -0
  103. package/dist/elements/line.js.map +1 -0
  104. package/dist/elements/lines-arc-labels.d.ts +223 -0
  105. package/dist/elements/lines-arc-labels.d.ts.map +1 -0
  106. package/dist/elements/lines-arc-labels.js +822 -0
  107. package/dist/elements/lines-arc-labels.js.map +1 -0
  108. package/dist/elements/lines-elements.d.ts +89 -0
  109. package/dist/elements/lines-elements.d.ts.map +1 -0
  110. package/dist/elements/lines-elements.js +271 -0
  111. package/dist/elements/lines-elements.js.map +1 -0
  112. package/dist/elements/misc-elements.d.ts +25 -0
  113. package/dist/elements/misc-elements.d.ts.map +1 -0
  114. package/dist/elements/misc-elements.js +160 -0
  115. package/dist/elements/misc-elements.js.map +1 -0
  116. package/dist/elements/oneterm.d.ts +29 -0
  117. package/dist/elements/oneterm.d.ts.map +1 -0
  118. package/dist/elements/oneterm.js +163 -0
  119. package/dist/elements/oneterm.js.map +1 -0
  120. package/dist/elements/opamp.d.ts +11 -0
  121. package/dist/elements/opamp.d.ts.map +1 -0
  122. package/dist/elements/opamp.js +72 -0
  123. package/dist/elements/opamp.js.map +1 -0
  124. package/dist/elements/outlets.d.ts +39 -0
  125. package/dist/elements/outlets.d.ts.map +1 -0
  126. package/dist/elements/outlets.js +285 -0
  127. package/dist/elements/outlets.js.map +1 -0
  128. package/dist/elements/resistor-more.d.ts +42 -0
  129. package/dist/elements/resistor-more.d.ts.map +1 -0
  130. package/dist/elements/resistor-more.js +171 -0
  131. package/dist/elements/resistor-more.js.map +1 -0
  132. package/dist/elements/resistor.d.ts +6 -0
  133. package/dist/elements/resistor.d.ts.map +1 -0
  134. package/dist/elements/resistor.js +22 -0
  135. package/dist/elements/resistor.js.map +1 -0
  136. package/dist/elements/source-v.d.ts +3 -0
  137. package/dist/elements/source-v.d.ts.map +1 -0
  138. package/dist/elements/source-v.js +3 -0
  139. package/dist/elements/source-v.js.map +1 -0
  140. package/dist/elements/sources.d.ts +111 -0
  141. package/dist/elements/sources.d.ts.map +1 -0
  142. package/dist/elements/sources.js +519 -0
  143. package/dist/elements/sources.js.map +1 -0
  144. package/dist/elements/switches.d.ts +66 -0
  145. package/dist/elements/switches.d.ts.map +1 -0
  146. package/dist/elements/switches.js +328 -0
  147. package/dist/elements/switches.js.map +1 -0
  148. package/dist/elements/transformer.d.ts +17 -0
  149. package/dist/elements/transformer.d.ts.map +1 -0
  150. package/dist/elements/transformer.js +184 -0
  151. package/dist/elements/transformer.js.map +1 -0
  152. package/dist/elements/transistors.d.ts +197 -0
  153. package/dist/elements/transistors.d.ts.map +1 -0
  154. package/dist/elements/transistors.js +1009 -0
  155. package/dist/elements/transistors.js.map +1 -0
  156. package/dist/elements/tubes.d.ts +70 -0
  157. package/dist/elements/tubes.d.ts.map +1 -0
  158. package/dist/elements/tubes.js +386 -0
  159. package/dist/elements/tubes.js.map +1 -0
  160. package/dist/elements/twoports.d.ts +47 -0
  161. package/dist/elements/twoports.d.ts.map +1 -0
  162. package/dist/elements/twoports.js +231 -0
  163. package/dist/elements/twoports.js.map +1 -0
  164. package/dist/elements/twoterm-extras.d.ts +50 -0
  165. package/dist/elements/twoterm-extras.d.ts.map +1 -0
  166. package/dist/elements/twoterm-extras.js +243 -0
  167. package/dist/elements/twoterm-extras.js.map +1 -0
  168. package/dist/elements/twoterm.d.ts +4 -0
  169. package/dist/elements/twoterm.d.ts.map +1 -0
  170. package/dist/elements/twoterm.js +4 -0
  171. package/dist/elements/twoterm.js.map +1 -0
  172. package/dist/geometry/point.d.ts +28 -0
  173. package/dist/geometry/point.d.ts.map +1 -0
  174. package/dist/geometry/point.js +99 -0
  175. package/dist/geometry/point.js.map +1 -0
  176. package/dist/geometry/roundcorners.d.ts +7 -0
  177. package/dist/geometry/roundcorners.d.ts.map +1 -0
  178. package/dist/geometry/roundcorners.js +64 -0
  179. package/dist/geometry/roundcorners.js.map +1 -0
  180. package/dist/geometry/transform.d.ts +14 -0
  181. package/dist/geometry/transform.d.ts.map +1 -0
  182. package/dist/geometry/transform.js +33 -0
  183. package/dist/geometry/transform.js.map +1 -0
  184. package/dist/geometry/util.d.ts +12 -0
  185. package/dist/geometry/util.d.ts.map +1 -0
  186. package/dist/geometry/util.js +36 -0
  187. package/dist/geometry/util.js.map +1 -0
  188. package/dist/index.cjs +31456 -0
  189. package/dist/index.cjs.map +7 -0
  190. package/dist/index.d.ts +77 -0
  191. package/dist/index.d.ts.map +1 -0
  192. package/dist/index.js +68 -0
  193. package/dist/index.js.map +1 -0
  194. package/dist/json/anchor-ref.d.ts +5 -0
  195. package/dist/json/anchor-ref.d.ts.map +1 -0
  196. package/dist/json/anchor-ref.js +35 -0
  197. package/dist/json/anchor-ref.js.map +1 -0
  198. package/dist/json/mount.d.ts +60 -0
  199. package/dist/json/mount.d.ts.map +1 -0
  200. package/dist/json/mount.js +369 -0
  201. package/dist/json/mount.js.map +1 -0
  202. package/dist/json/registry.d.ts +7 -0
  203. package/dist/json/registry.d.ts.map +1 -0
  204. package/dist/json/registry.js +323 -0
  205. package/dist/json/registry.js.map +1 -0
  206. package/dist/json/render.d.ts +59 -0
  207. package/dist/json/render.d.ts.map +1 -0
  208. package/dist/json/render.js +113 -0
  209. package/dist/json/render.js.map +1 -0
  210. package/dist/json/theme.d.ts +18 -0
  211. package/dist/json/theme.d.ts.map +1 -0
  212. package/dist/json/theme.js +57 -0
  213. package/dist/json/theme.js.map +1 -0
  214. package/dist/json/types.d.ts +42 -0
  215. package/dist/json/types.d.ts.map +1 -0
  216. package/dist/json/types.js +2 -0
  217. package/dist/json/types.js.map +1 -0
  218. package/dist/json/validate.d.ts +11 -0
  219. package/dist/json/validate.d.ts.map +1 -0
  220. package/dist/json/validate.js +77 -0
  221. package/dist/json/validate.js.map +1 -0
  222. package/dist/label-hint.d.ts +11 -0
  223. package/dist/label-hint.d.ts.map +1 -0
  224. package/dist/label-hint.js +2 -0
  225. package/dist/label-hint.js.map +1 -0
  226. package/dist/logic/and.d.ts +13 -0
  227. package/dist/logic/and.d.ts.map +1 -0
  228. package/dist/logic/and.js +63 -0
  229. package/dist/logic/and.js.map +1 -0
  230. package/dist/logic/bitfield.d.ts +32 -0
  231. package/dist/logic/bitfield.d.ts.map +1 -0
  232. package/dist/logic/bitfield.js +271 -0
  233. package/dist/logic/bitfield.js.map +1 -0
  234. package/dist/logic/buffer.d.ts +11 -0
  235. package/dist/logic/buffer.d.ts.map +1 -0
  236. package/dist/logic/buffer.js +46 -0
  237. package/dist/logic/buffer.js.map +1 -0
  238. package/dist/logic/extras.d.ts +36 -0
  239. package/dist/logic/extras.d.ts.map +1 -0
  240. package/dist/logic/extras.js +211 -0
  241. package/dist/logic/extras.js.map +1 -0
  242. package/dist/logic/kmap.d.ts +16 -0
  243. package/dist/logic/kmap.d.ts.map +1 -0
  244. package/dist/logic/kmap.js +163 -0
  245. package/dist/logic/kmap.js.map +1 -0
  246. package/dist/logic/or.d.ts +18 -0
  247. package/dist/logic/or.d.ts.map +1 -0
  248. package/dist/logic/or.js +117 -0
  249. package/dist/logic/or.js.map +1 -0
  250. package/dist/logic/timing.d.ts +44 -0
  251. package/dist/logic/timing.d.ts.map +1 -0
  252. package/dist/logic/timing.js +791 -0
  253. package/dist/logic/timing.js.map +1 -0
  254. package/dist/logic/tristate.d.ts +11 -0
  255. package/dist/logic/tristate.d.ts.map +1 -0
  256. package/dist/logic/tristate.js +48 -0
  257. package/dist/logic/tristate.js.map +1 -0
  258. package/dist/math-render.d.ts +9 -0
  259. package/dist/math-render.d.ts.map +1 -0
  260. package/dist/math-render.js +53 -0
  261. package/dist/math-render.js.map +1 -0
  262. package/dist/package-api.d.ts +20 -0
  263. package/dist/package-api.d.ts.map +1 -0
  264. package/dist/package-api.js +75 -0
  265. package/dist/package-api.js.map +1 -0
  266. package/dist/params.d.ts +6 -0
  267. package/dist/params.d.ts.map +1 -0
  268. package/dist/params.js +35 -0
  269. package/dist/params.js.map +1 -0
  270. package/dist/react/index.d.ts +22 -0
  271. package/dist/react/index.d.ts.map +1 -0
  272. package/dist/react/index.js +52 -0
  273. package/dist/react/index.js.map +1 -0
  274. package/dist/schemdraw-ts.bundle.js +30448 -0
  275. package/dist/schemdraw-ts.bundle.js.map +7 -0
  276. package/dist/segment.d.ts +267 -0
  277. package/dist/segment.d.ts.map +1 -0
  278. package/dist/segment.js +844 -0
  279. package/dist/segment.js.map +1 -0
  280. package/dist/style.d.ts +18 -0
  281. package/dist/style.d.ts.map +1 -0
  282. package/dist/style.js +230 -0
  283. package/dist/style.js.map +1 -0
  284. package/dist/subsystems/dsp.d.ts +65 -0
  285. package/dist/subsystems/dsp.d.ts.map +1 -0
  286. package/dist/subsystems/dsp.js +267 -0
  287. package/dist/subsystems/dsp.js.map +1 -0
  288. package/dist/subsystems/flow.d.ts +92 -0
  289. package/dist/subsystems/flow.d.ts.map +1 -0
  290. package/dist/subsystems/flow.js +315 -0
  291. package/dist/subsystems/flow.js.map +1 -0
  292. package/dist/subsystems/index.d.ts +22 -0
  293. package/dist/subsystems/index.d.ts.map +1 -0
  294. package/dist/subsystems/index.js +22 -0
  295. package/dist/subsystems/index.js.map +1 -0
  296. package/dist/subsystems/parsing.d.ts +41 -0
  297. package/dist/subsystems/parsing.d.ts.map +1 -0
  298. package/dist/subsystems/parsing.js +456 -0
  299. package/dist/subsystems/parsing.js.map +1 -0
  300. package/dist/subsystems/pictorial.d.ts +73 -0
  301. package/dist/subsystems/pictorial.d.ts.map +1 -0
  302. package/dist/subsystems/pictorial.js +469 -0
  303. package/dist/subsystems/pictorial.js.map +1 -0
  304. package/dist/svg/constants.d.ts +5 -0
  305. package/dist/svg/constants.d.ts.map +1 -0
  306. package/dist/svg/constants.js +5 -0
  307. package/dist/svg/constants.js.map +1 -0
  308. package/dist/svg/figure.d.ts +157 -0
  309. package/dist/svg/figure.d.ts.map +1 -0
  310. package/dist/svg/figure.js +634 -0
  311. package/dist/svg/figure.js.map +1 -0
  312. package/dist/svg/fmt.d.ts +2 -0
  313. package/dist/svg/fmt.d.ts.map +1 -0
  314. package/dist/svg/fmt.js +7 -0
  315. package/dist/svg/fmt.js.map +1 -0
  316. package/dist/svg/svg-style.d.ts +15 -0
  317. package/dist/svg/svg-style.d.ts.map +1 -0
  318. package/dist/svg/svg-style.js +46 -0
  319. package/dist/svg/svg-style.js.map +1 -0
  320. package/dist/types.d.ts +39 -0
  321. package/dist/types.d.ts.map +1 -0
  322. package/dist/types.js +21 -0
  323. package/dist/types.js.map +1 -0
  324. package/dist/version.d.ts +3 -0
  325. package/dist/version.d.ts.map +1 -0
  326. package/dist/version.js +3 -0
  327. package/dist/version.js.map +1 -0
  328. package/dist/vue/index.d.ts +43 -0
  329. package/dist/vue/index.d.ts.map +1 -0
  330. package/dist/vue/index.js +55 -0
  331. package/dist/vue/index.js.map +1 -0
  332. package/package.json +71 -0
@@ -0,0 +1,822 @@
1
+ /**
2
+ * Arcs and labels — aligned with Python `elements/lines.py` (`Arc2`–`EncircleBox`).
3
+ */
4
+ import { Element } from "../element.js";
5
+ import { linspace } from "../geometry/util.js";
6
+ import { Point } from "../geometry/point.js";
7
+ import { getParam } from "../params.js";
8
+ import { pushElement } from "../drawing-stack.js";
9
+ function xyTuple(p) {
10
+ return p instanceof Point ? [p.x, p.y] : [p[0], p[1]];
11
+ }
12
+ import { Segment, SegmentArc, SegmentBezier, SegmentPoly, } from "../segment.js";
13
+ function isClose(a, b, tol = 0.01) {
14
+ return Math.abs(a - b) <= tol;
15
+ }
16
+ /** Python `ZLabel`/`CurrentLabelInline.at(Element)`: `xy.center` or local bbox center → drawing coords. */
17
+ function elementCenterInDrawing(el) {
18
+ const c = el.absanchors.center;
19
+ if (c !== undefined) {
20
+ return c;
21
+ }
22
+ const bb = el.getBBox(false, false);
23
+ const mx = (bb.xmin + bb.xmax) / 2;
24
+ const my = (bb.ymin + bb.ymax) / 2;
25
+ return el.transform.transform([mx, my]);
26
+ }
27
+ /** Quadratic Bezier arc between `at` and `to` (or `delta`). */
28
+ export class Arc2 extends Element {
29
+ constructor(userParams = {}) {
30
+ super(userParams);
31
+ Object.assign(this.defaults, { k: 0.5 });
32
+ }
33
+ to(target, dx = 0, dy = 0) {
34
+ const p = Point.fromXY(xyTuple(target));
35
+ this.userParams.to = [p.x + dx, p.y + dy];
36
+ return this;
37
+ }
38
+ delta(dx, dy) {
39
+ this.userParams.delta = [dx, dy];
40
+ return this;
41
+ }
42
+ k(k) {
43
+ this.userParams.k = k;
44
+ return this;
45
+ }
46
+ arrow(arrow) {
47
+ this.userParams.arrow = arrow;
48
+ return this;
49
+ }
50
+ _place(dwgxy, dwgtheta, dwgparams) {
51
+ this.dwgParams = { ...dwgparams };
52
+ if (!this._positioned) {
53
+ this._position();
54
+ }
55
+ this.segments = [];
56
+ this.elmParams.theta = 0;
57
+ const xy = this.params.at ?? dwgxy;
58
+ const to = this.params.to ?? [xy[0] + 3, xy[1]];
59
+ const delta = this.params.delta;
60
+ let dx;
61
+ let dy;
62
+ if (delta !== undefined) {
63
+ dx = delta[0];
64
+ dy = delta[1];
65
+ }
66
+ else {
67
+ dx = to[0] - xy[0];
68
+ dy = to[1] - xy[1];
69
+ }
70
+ const k = this.params.k ?? 0.5;
71
+ const pa = [dx / 2 - dy * k, dy / 2 + dx * k];
72
+ const mid = [dx / 2 - (dy * k) / 2, dy / 2 + (dx * k) / 2];
73
+ const arrow = this.params.arrow;
74
+ this.segments.push(new SegmentBezier([[0, 0], pa, [dx, dy]], { arrow }));
75
+ this.anchors.ctrl = pa;
76
+ this.anchors.mid = mid;
77
+ this.anchors.start = [0, 0];
78
+ this.anchors.end = [dx, dy];
79
+ this.elmParams.lblloc = "mid";
80
+ this.elmParams.drop = [dx, dy];
81
+ let valign = "bottom";
82
+ let halign = "left";
83
+ let vofst = 0.1;
84
+ let hofst = 0;
85
+ if (isClose(mid[1], pa[1])) {
86
+ valign = "center";
87
+ vofst = 0;
88
+ }
89
+ else if (mid[1] > pa[1]) {
90
+ valign = "top";
91
+ vofst = -0.1;
92
+ }
93
+ if (isClose(mid[0], pa[0])) {
94
+ halign = "center";
95
+ }
96
+ else if (mid[0] > pa[0]) {
97
+ halign = "right";
98
+ vofst = 0;
99
+ hofst = -0.1;
100
+ }
101
+ else {
102
+ hofst = 0.1;
103
+ vofst = 0;
104
+ }
105
+ this.elmParams.lblofst = [hofst, vofst];
106
+ this.elmParams.lblalign = [halign, valign];
107
+ this._positioned = true;
108
+ return super._place(dwgxy, dwgtheta, dwgparams);
109
+ }
110
+ }
111
+ /** Cubic Bezier arc (`th1`/`th2` in degrees). */
112
+ export class Arc3 extends Element {
113
+ constructor(userParams = {}) {
114
+ super(userParams);
115
+ Object.assign(this.defaults, {
116
+ k: 0.75,
117
+ th1: 0,
118
+ th2: 180,
119
+ to: [1, 0],
120
+ arrowlength: 0.25,
121
+ arrowwidth: 0.2,
122
+ });
123
+ }
124
+ to(target, dx = 0, dy = 0) {
125
+ const p = Point.fromXY(xyTuple(target));
126
+ this.userParams.to = [p.x + dx, p.y + dy];
127
+ return this;
128
+ }
129
+ delta(dx, dy) {
130
+ this.userParams.delta = [dx, dy];
131
+ return this;
132
+ }
133
+ k(k) {
134
+ this.userParams.k = k;
135
+ return this;
136
+ }
137
+ th1(deg) {
138
+ this.userParams.th1 = deg;
139
+ return this;
140
+ }
141
+ th2(deg) {
142
+ this.userParams.th2 = deg;
143
+ return this;
144
+ }
145
+ arrow(arrow) {
146
+ this.userParams.arrow = arrow;
147
+ return this;
148
+ }
149
+ arrowlength(len) {
150
+ this.userParams.arrowlength = len;
151
+ return this;
152
+ }
153
+ arrowwidth(w) {
154
+ this.userParams.arrowwidth = w;
155
+ return this;
156
+ }
157
+ setLabelAlign(dx, dy) {
158
+ this.elmParams.lblloc = "center";
159
+ let halign = "left";
160
+ let valign = "bottom";
161
+ if (dy > 0) {
162
+ valign = "top";
163
+ this.elmParams.lblofst = -0.1;
164
+ }
165
+ if (dx <= 0) {
166
+ halign = "right";
167
+ }
168
+ this.elmParams.lblalign = [halign, valign];
169
+ }
170
+ _place(dwgxy, dwgtheta, dwgparams) {
171
+ this.dwgParams = { ...dwgparams };
172
+ if (!this._positioned) {
173
+ this._position();
174
+ }
175
+ this.segments = [];
176
+ this.userParams.theta = 0;
177
+ const xy = this.params.at ?? dwgxy;
178
+ const to = this.params.to ?? dwgxy;
179
+ const delta = this.params.delta;
180
+ let dx;
181
+ let dy;
182
+ if (delta !== undefined) {
183
+ dx = delta[0];
184
+ dy = delta[1];
185
+ }
186
+ else {
187
+ dx = to[0] - xy[0];
188
+ dy = to[1] - xy[1];
189
+ }
190
+ const k = this.params.k ?? 0.75;
191
+ const th1 = (this.params.th1 ?? 0) * (Math.PI / 180);
192
+ const th2 = (this.params.th2 ?? 180) * (Math.PI / 180);
193
+ const pa1 = [dx * k * Math.cos(th1), dy * k * Math.sin(th1)];
194
+ const pa2 = [dx + dx * k * Math.cos(th2), dy + dy * k * Math.sin(th2)];
195
+ const arrow = this.params.arrow;
196
+ const arrowlength = this.params.arrowlength;
197
+ const arrowwidth = this.params.arrowwidth;
198
+ this.segments.push(new SegmentBezier([[0, 0], pa1, pa2, [dx, dy]], {
199
+ arrow,
200
+ arrowlength,
201
+ arrowwidth,
202
+ }));
203
+ this.anchors.center = [dx / 2, dy / 2];
204
+ this.anchors.start = [0, 0];
205
+ this.anchors.end = [dx, dy];
206
+ this.anchors.ctrl1 = pa1;
207
+ this.anchors.ctrl2 = pa2;
208
+ this.elmParams.drop = [dx, dy];
209
+ this.setLabelAlign(dx, dy);
210
+ this._positioned = true;
211
+ return super._place(dwgxy, dwgtheta, dwgparams);
212
+ }
213
+ }
214
+ /** Curved annotation arrow (label near tail). */
215
+ export class Annotate extends Arc3 {
216
+ constructor(userParams = {}) {
217
+ super({
218
+ ...userParams,
219
+ to: userParams.to ?? [1, 1],
220
+ th1: userParams.th1 ?? 75,
221
+ th2: userParams.th2 ?? 180,
222
+ arrow: userParams.arrow ?? "<-",
223
+ });
224
+ }
225
+ setLabelAlign(_dx, dy) {
226
+ this.elmParams.lblloc = "end";
227
+ const p1 = this.anchors.ctrl2;
228
+ const p2 = this.anchors.end;
229
+ let th2;
230
+ if (p1[0] === p2[0] && p1[1] === p2[1]) {
231
+ th2 = dy < 0 ? -90 : 90;
232
+ }
233
+ else {
234
+ th2 = (Math.atan2(p2[1] - p1[1], p2[0] - p1[0]) * 180) / Math.PI;
235
+ }
236
+ while (th2 < 0) {
237
+ th2 += 360;
238
+ }
239
+ if (th2 < 45 || th2 > 315) {
240
+ this.elmParams.lblalign = ["left", "center"];
241
+ this.elmParams.lblofst = [0.1, 0];
242
+ }
243
+ else if (th2 >= 45 && th2 <= 135) {
244
+ this.elmParams.lblalign = ["center", "bottom"];
245
+ this.elmParams.lblofst = [0, 0.1];
246
+ }
247
+ else if (th2 > 135 && th2 <= 225) {
248
+ this.elmParams.lblalign = ["right", "center"];
249
+ this.elmParams.lblofst = [-0.1, 0];
250
+ }
251
+ else {
252
+ this.elmParams.lblalign = ["center", "top"];
253
+ this.elmParams.lblofst = [0, -0.1];
254
+ }
255
+ }
256
+ }
257
+ /** Arc3 with horizontal tangents at endpoints (Z-shaped). */
258
+ export class ArcZ extends Arc3 {
259
+ constructor(userParams = {}) {
260
+ super({ ...userParams, th1: 0, th2: 180 });
261
+ }
262
+ }
263
+ /** Arc3 with vertical tangents at endpoints (N-shaped). */
264
+ export class ArcN extends Arc3 {
265
+ constructor(userParams = {}) {
266
+ super({ ...userParams, th1: 90, th2: -90 });
267
+ }
268
+ }
269
+ /** Circular arc through `at` and `to`. */
270
+ export class ArcLoop extends Element {
271
+ constructor(userParams = {}) {
272
+ super(userParams);
273
+ Object.assign(this.defaults, { radius: 0.6, arrowlength: 0.25, arrowwidth: 0.2 });
274
+ }
275
+ to(target, dx = 0, dy = 0) {
276
+ const p = Point.fromXY(xyTuple(target));
277
+ this.userParams.to = [p.x + dx, p.y + dy];
278
+ return this;
279
+ }
280
+ delta(dx, dy) {
281
+ this.userParams.delta = [dx, dy];
282
+ return this;
283
+ }
284
+ radius(r) {
285
+ this.userParams.radius = r;
286
+ return this;
287
+ }
288
+ arrow(arrow) {
289
+ this.userParams.arrow = arrow;
290
+ return this;
291
+ }
292
+ arrowlength(len) {
293
+ this.userParams.arrowlength = len;
294
+ return this;
295
+ }
296
+ arrowwidth(w) {
297
+ this.userParams.arrowwidth = w;
298
+ return this;
299
+ }
300
+ _place(dwgxy, dwgtheta, dwgparams) {
301
+ this.dwgParams = { ...dwgparams };
302
+ if (!this._positioned) {
303
+ this._position();
304
+ }
305
+ this.segments = [];
306
+ this.elmParams.theta = 0;
307
+ const xy = this.params.at ?? dwgxy;
308
+ const to = this.params.to ?? dwgxy;
309
+ const delta = this.params.delta;
310
+ let dx;
311
+ let dy;
312
+ if (delta !== undefined) {
313
+ dx = delta[0];
314
+ dy = delta[1];
315
+ }
316
+ else {
317
+ dx = to[0] - xy[0];
318
+ dy = to[1] - xy[1];
319
+ }
320
+ const radius = this.params.radius ?? 0.6;
321
+ const xa = dx / 2;
322
+ const ya = dy / 2;
323
+ const q = Math.sqrt(dx * dx + dy * dy);
324
+ const inner = radius * radius - (q / 2) * (q / 2);
325
+ if (inner < 0) {
326
+ throw new Error(`ArcLoop: no solution for radius ${radius}`);
327
+ }
328
+ const s = Math.sqrt(inner);
329
+ const center = [
330
+ xa + s * (-dy / q),
331
+ ya + s * (dx / q),
332
+ ];
333
+ const da = Math.sqrt(xa * xa + ya * ya);
334
+ const thetaa = Math.atan2(ya, xa);
335
+ const thda = Math.acos(da / radius);
336
+ const t1 = thetaa - thda;
337
+ const t2 = thetaa + thda;
338
+ const tAng = linspace(Math.PI + t2, t1, 50);
339
+ const x = [];
340
+ const y = [];
341
+ for (const ti of tAng) {
342
+ x.push(center[0] + radius * Math.cos(ti));
343
+ y.push(center[1] + radius * Math.sin(ti));
344
+ }
345
+ const pts = x.map((xi, i) => [xi, y[i]]);
346
+ const arrow = this.params.arrow;
347
+ const arrowlength = this.params.arrowlength;
348
+ const arrowwidth = this.params.arrowwidth;
349
+ this.segments.push(new Segment(pts, { arrow, arrowlength, arrowwidth }));
350
+ const mid = Math.floor(x.length / 2);
351
+ this.anchors.start = [0, 0];
352
+ this.anchors.end = [x[x.length - 1], y[y.length - 1]];
353
+ this.anchors.mid = [x[mid], y[mid]];
354
+ this.anchors.BL = [Math.min(...x), Math.min(...y)];
355
+ this.anchors.BR = [Math.max(...x), Math.min(...y)];
356
+ this.anchors.TL = [Math.min(...x), Math.max(...y)];
357
+ this.anchors.TR = [Math.max(...x), Math.max(...y)];
358
+ this.elmParams.lblloc = "mid";
359
+ this.elmParams.drop = [to[0] - xy[0], to[1] - xy[1]];
360
+ this.elmParams.lblofst = [0, 0.2];
361
+ if (y[mid] < y[0]) {
362
+ this.elmParams.lblofst = [0, -0.25];
363
+ }
364
+ this._positioned = true;
365
+ return super._place(dwgxy, dwgtheta, dwgparams);
366
+ }
367
+ }
368
+ /** Current arrow above/below a line (use `overElement` to mimic Python `.at(el)`). */
369
+ export class CurrentLabel extends Element {
370
+ _side = "top";
371
+ constructor(userParams = {}) {
372
+ super(userParams);
373
+ Object.assign(this.defaults, {
374
+ ofst: 0.15,
375
+ length: 2,
376
+ top: true,
377
+ reverse: false,
378
+ headlength: 0.3,
379
+ headwidth: 0.2,
380
+ anchor: "center",
381
+ drop: null,
382
+ });
383
+ this.anchors.center = [0, 0];
384
+ }
385
+ /**
386
+ * When `xy` is an {@link Element}, behave like Python `CurrentLabel.at(el)`:
387
+ * inherit placement from that element (stored as `overElement`).
388
+ */
389
+ at(xy, dx = 0, dy = 0) {
390
+ if (xy instanceof Element) {
391
+ this.userParams.overElement = xy;
392
+ return this;
393
+ }
394
+ return super.at(xy, dx, dy);
395
+ }
396
+ /** Alias for `at(otherElement)` (Python-style name). */
397
+ over(el) {
398
+ this.userParams.overElement = el;
399
+ return this;
400
+ }
401
+ placeArrowSegment(_loc) {
402
+ let ofst = this.params.ofst ?? 0.15;
403
+ const length = this.params.length ?? 2;
404
+ if (this._side === "bottom") {
405
+ ofst = -ofst;
406
+ }
407
+ const a = [-length / 2, ofst];
408
+ const b = [length / 2, ofst];
409
+ const headwidth = this.params.headwidth ?? 0.2;
410
+ const headlength = this.params.headlength ?? 0.3;
411
+ this.segments.push(new Segment([a, b], {
412
+ arrow: "->",
413
+ arrowwidth: headwidth,
414
+ arrowlength: headlength,
415
+ }));
416
+ }
417
+ /**
418
+ * Python `CurrentLabel.at(Element)` — `ilabel`, host `flip`/`reverse`, bbox in **local** coords then `transform`.
419
+ */
420
+ placeFromOverElement(over) {
421
+ let side = String(getParam(over.params, "ilabel", "top")).toLowerCase();
422
+ if (side === "bot") {
423
+ side = "bottom";
424
+ }
425
+ const clTop = this.params.top !== false;
426
+ if (!clTop) {
427
+ const m = {
428
+ top: "bottom",
429
+ bottom: "top",
430
+ left: "right",
431
+ right: "left",
432
+ };
433
+ side = m[side] ?? side;
434
+ }
435
+ let rev = this.userParams.reverse === true;
436
+ if (over.userParams.reverse === true) {
437
+ const sw = { left: "right", right: "left" };
438
+ if (sw[side] !== undefined) {
439
+ side = sw[side];
440
+ }
441
+ else {
442
+ rev = !rev;
443
+ }
444
+ }
445
+ if (over.userParams.flip === true && (side === "left" || side === "right")) {
446
+ rev = !rev;
447
+ }
448
+ if (side === "left") {
449
+ rev = !rev;
450
+ }
451
+ this.userParams.reverse = rev;
452
+ let theta = over.transform.theta;
453
+ const bb = over.getBBox(false, false);
454
+ let pos;
455
+ let lblloc;
456
+ if (side === "top") {
457
+ pos = new Point((bb.xmin + bb.xmax) / 2, bb.ymax);
458
+ lblloc = "top";
459
+ }
460
+ else if (side === "bottom") {
461
+ pos = new Point((bb.xmin + bb.xmax) / 2, bb.ymin);
462
+ lblloc = "bot";
463
+ }
464
+ else if (side === "right") {
465
+ pos = new Point(bb.xmax, (bb.ymin + bb.ymax) / 2);
466
+ lblloc = "bot";
467
+ theta -= 90;
468
+ }
469
+ else if (side === "left") {
470
+ pos = new Point(bb.xmin, (bb.ymin + bb.ymax) / 2);
471
+ lblloc = "top";
472
+ theta += 90;
473
+ }
474
+ else {
475
+ pos = new Point((bb.xmin + bb.xmax) / 2, bb.ymax);
476
+ lblloc = "top";
477
+ }
478
+ const abs = over.transform.transform(pos.toTuple());
479
+ this.userParams.at = [abs.x, abs.y];
480
+ this.userParams.theta = theta;
481
+ this.elmParams.lblloc = lblloc;
482
+ this._side = (side === "bottom" ? "bottom" : side === "top" ? "top" : side === "left" ? "left" : "right");
483
+ const c = over.userParams.color;
484
+ if (c !== undefined) {
485
+ this.userParams.color = c;
486
+ }
487
+ }
488
+ _place(dwgxy, dwgtheta, dwgparams) {
489
+ this.dwgParams = { ...dwgparams };
490
+ const over = this.params.overElement;
491
+ if (over !== undefined) {
492
+ this.placeFromOverElement(over);
493
+ }
494
+ this.segments = [];
495
+ const theta = ((((this.params.theta ?? 0) % 360) + 360) % 360);
496
+ let loc = this.params.lblloc ?? "top";
497
+ const side = this._side;
498
+ if (side === "right" && (theta <= 90 || theta > 270)) {
499
+ const l0 = this.elmParams.lblloc ?? "top";
500
+ this.elmParams.lblloc = l0 === "bot" ? "top" : "bot";
501
+ loc = this.elmParams.lblloc;
502
+ }
503
+ else if ((side === "top" || side === "left" || side === "bottom") &&
504
+ theta > 90 &&
505
+ theta <= 270) {
506
+ const l0 = this.elmParams.lblloc ?? "top";
507
+ this.elmParams.lblloc = l0 === "bot" ? "top" : "bot";
508
+ loc = this.elmParams.lblloc;
509
+ }
510
+ this.placeArrowSegment(loc);
511
+ return super._place(dwgxy, dwgtheta, dwgparams);
512
+ }
513
+ }
514
+ /** Voltage label as a quadratic arc. */
515
+ export class VoltageLabelArc extends CurrentLabel {
516
+ constructor(userParams = {}) {
517
+ super(userParams);
518
+ Object.assign(this.defaults, { length: 1.75, ofst: 0.075, bend: 0.6 });
519
+ }
520
+ placeArrowSegment(_loc) {
521
+ let ofst = this.params.ofst ?? 0.075;
522
+ let bend = this.params.bend ?? 0.6;
523
+ const length = this.params.length ?? 1.75;
524
+ if (this._side === "bottom") {
525
+ ofst = -ofst;
526
+ bend = -bend;
527
+ }
528
+ const headwidth = this.params.headwidth ?? 0.2;
529
+ const headlength = this.params.headlength ?? 0.3;
530
+ const arrow = this.params.reverse === true ? "<-" : "->";
531
+ const p1 = [-length / 2, ofst];
532
+ const p2 = [length / 2, ofst];
533
+ const pa = [0, bend];
534
+ this.segments.push(new SegmentBezier([p1, pa, p2], {
535
+ arrow,
536
+ arrowlength: headlength,
537
+ arrowwidth: headwidth,
538
+ }));
539
+ }
540
+ }
541
+ /** Inline current arrow on a lead (`overElement` mimics `.at(el)`). */
542
+ export class CurrentLabelInline extends Element {
543
+ constructor(direction = "in", ofst = 0.8, start = true, userParams = {}) {
544
+ super(userParams);
545
+ Object.assign(this.defaults, { headlength: 0.3, headwidth: 0.3 });
546
+ this.elmParams.lblofst = 0;
547
+ this.elmParams.drop = null;
548
+ this.elmParams.zorder = 4;
549
+ let x = ofst;
550
+ let dx = this.params.headlength ?? 0.3;
551
+ if (direction === "in") {
552
+ x += this.params.headlength ?? 0.3;
553
+ dx = -dx;
554
+ }
555
+ if (start) {
556
+ x = -x;
557
+ dx = -dx;
558
+ }
559
+ const hw = this.params.headwidth ?? 0.3;
560
+ const hl = this.params.headlength ?? 0.3;
561
+ this.segments.push(new Segment([
562
+ [x, 0],
563
+ [x + dx, 0],
564
+ ], { arrow: "->", arrowwidth: hw, arrowlength: hl }));
565
+ }
566
+ at(xy, dx = 0, dy = 0) {
567
+ if (xy instanceof Element) {
568
+ this.userParams.overElement = xy;
569
+ return this;
570
+ }
571
+ return super.at(xy, dx, dy);
572
+ }
573
+ over(el) {
574
+ this.userParams.overElement = el;
575
+ return this;
576
+ }
577
+ _place(dwgxy, dwgtheta, dwgparams) {
578
+ this.dwgParams = { ...dwgparams };
579
+ if (!this._positioned) {
580
+ this._position();
581
+ }
582
+ const over = this.params.overElement;
583
+ if (over !== undefined) {
584
+ const pos = elementCenterInDrawing(over);
585
+ this.userParams.at = [pos.x, pos.y];
586
+ this.userParams.theta = over.transform.theta;
587
+ const col = over.userParams.color;
588
+ if (col !== undefined) {
589
+ this.userParams.color = col;
590
+ }
591
+ }
592
+ this._positioned = true;
593
+ return super._place(dwgxy, dwgtheta, dwgparams);
594
+ }
595
+ }
596
+ /** Right-angle impedance-style arrow. */
597
+ export class ZLabel extends Element {
598
+ constructor(userParams = {}) {
599
+ super(userParams);
600
+ Object.assign(this.defaults, {
601
+ ofst: 0.5,
602
+ hofst: 0.4,
603
+ length: 1,
604
+ lengthtip: 0.5,
605
+ headlength: 0.25,
606
+ headwidth: 0.15,
607
+ });
608
+ this.userParams.anchor = "center";
609
+ this.anchors.center = [0, 0];
610
+ }
611
+ at(xy, dx = 0, dy = 0) {
612
+ if (xy instanceof Element) {
613
+ this.userParams.overElement = xy;
614
+ return this;
615
+ }
616
+ return super.at(xy, dx, dy);
617
+ }
618
+ over(el) {
619
+ this.userParams.overElement = el;
620
+ return this;
621
+ }
622
+ _place(dwgxy, dwgtheta, dwgparams) {
623
+ this.dwgParams = { ...dwgparams };
624
+ if (!this._positioned) {
625
+ this._position();
626
+ }
627
+ const over = this.params.overElement;
628
+ if (over !== undefined) {
629
+ const pos = elementCenterInDrawing(over);
630
+ this.userParams.at = [pos.x, pos.y];
631
+ let th = over.transform.theta;
632
+ if (((th % 360) + 360) % 360 > 90 && ((th % 360) + 360) % 360 <= 270) {
633
+ th += 180;
634
+ }
635
+ this.userParams.theta = th;
636
+ const col = over.userParams.color;
637
+ if (col !== undefined) {
638
+ this.userParams.color = col;
639
+ }
640
+ }
641
+ const hf = this.params.hofst ?? 0.4;
642
+ const os = this.params.ofst ?? 0.5;
643
+ const lt = this.params.lengthtip ?? 0.5;
644
+ const ln = this.params.length ?? 1;
645
+ const hw = this.params.headwidth ?? 0.15;
646
+ const hl = this.params.headlength ?? 0.25;
647
+ const a = [-hf, os];
648
+ const b = [-hf - lt, os];
649
+ const c = [-hf - lt, os - ln];
650
+ this.anchors.head = a;
651
+ this.anchors.tail = c;
652
+ this.segments = [];
653
+ this.segments.push(new Segment([c, b, a], {
654
+ arrow: "->",
655
+ arrowwidth: hw,
656
+ arrowlength: hl,
657
+ }));
658
+ this.elmParams.lblloc = "tail";
659
+ let th = this.params.theta ?? 0;
660
+ if (this.params.flip === true) {
661
+ th += 180;
662
+ }
663
+ th -= 90;
664
+ th = ((th % 360) + 360) % 360;
665
+ if (th < 45 || th > 315) {
666
+ this.elmParams.lblalign = ["left", "center"];
667
+ this.elmParams.lblofst = [0, -0.1];
668
+ }
669
+ else if (th >= 45 && th <= 135) {
670
+ this.elmParams.lblalign = ["center", "bottom"];
671
+ this.elmParams.lblofst = [0, 0.1];
672
+ }
673
+ else if (th > 135 && th <= 225) {
674
+ this.elmParams.lblalign = ["right", "center"];
675
+ this.elmParams.lblofst = [0, 0.1];
676
+ }
677
+ else {
678
+ this.elmParams.lblalign = ["center", "top"];
679
+ this.elmParams.lblofst = [0, -0.1];
680
+ }
681
+ this._positioned = true;
682
+ return super._place(dwgxy, dwgtheta, dwgparams);
683
+ }
684
+ }
685
+ /** Elliptical loop arrow (mesh notation). */
686
+ export class LoopArrow extends Element {
687
+ constructor(userParams = {}) {
688
+ super(userParams);
689
+ Object.assign(this.defaults, { lblloc: "center", lblofst: 0, theta: 0 });
690
+ const direction = userParams.direction ?? "cw";
691
+ const theta1 = userParams.theta1 ?? 35;
692
+ const theta2 = userParams.theta2 ?? -35;
693
+ const width = userParams.width ?? 1;
694
+ const height = userParams.height ?? 1;
695
+ this.segments.push(new SegmentArc([0, 0], width, height, {
696
+ theta1,
697
+ theta2,
698
+ arrow: direction,
699
+ }));
700
+ this.anchors.center = [0, 0];
701
+ }
702
+ }
703
+ /** Loop current inside a quad of placed elements (order: top, right, bottom, left). */
704
+ export class LoopCurrent extends LoopArrow {
705
+ constructor(userParams) {
706
+ pushElement(null);
707
+ const { elm_list, pad = 0.2, ...rest } = userParams;
708
+ const bbox1 = elm_list[0].getBBox(true, false);
709
+ const bbox2 = elm_list[1].getBBox(true, false);
710
+ const bbox3 = elm_list[2].getBBox(true, false);
711
+ const bbox4 = elm_list[3].getBBox(true, false);
712
+ const top = bbox1.ymin - pad;
713
+ const bot = bbox3.ymax + pad;
714
+ const left = bbox4.xmax + pad;
715
+ const rght = bbox2.xmin - pad;
716
+ const center = [(left + rght) / 2, (top + bot) / 2];
717
+ const width = rght - left;
718
+ const height = top - bot;
719
+ super({ ...rest, width, height, at: center });
720
+ }
721
+ }
722
+ /** Ellipse around a list of elements. */
723
+ export class Encircle extends Element {
724
+ constructor(userParams) {
725
+ pushElement(null);
726
+ const { elm_list, includelabels = true, ...rest } = userParams;
727
+ super(rest);
728
+ Object.assign(this.defaults, { padx: 0.2, pady: 0.2, theta: 0 });
729
+ let xmin = Infinity;
730
+ let xmax = -Infinity;
731
+ let ymin = Infinity;
732
+ let ymax = -Infinity;
733
+ for (const element of elm_list) {
734
+ const bb = element.getBBox(true, includelabels);
735
+ xmin = Math.min(xmin, bb.xmin);
736
+ xmax = Math.max(xmax, bb.xmax);
737
+ ymin = Math.min(ymin, bb.ymin);
738
+ ymax = Math.max(ymax, bb.ymax);
739
+ }
740
+ const padx = this.params.padx ?? 0.2;
741
+ const pady = this.params.pady ?? 0.2;
742
+ xmin -= padx;
743
+ xmax += padx;
744
+ ymin -= pady;
745
+ ymax += pady;
746
+ const w = xmax - xmin;
747
+ const h = ymax - ymin;
748
+ const center = [(xmax + xmin) / 2, (ymax + ymin) / 2];
749
+ this.userParams.at = center;
750
+ this.segments.push(new SegmentArc([0, 0], w, h, {
751
+ theta1: 0,
752
+ theta2: 360,
753
+ }));
754
+ const sinpi4 = Math.sin(Math.PI / 4);
755
+ const cospi4 = Math.cos(Math.PI / 4);
756
+ const sinpi8 = Math.sin(Math.PI / 8);
757
+ const cospi8 = Math.cos(Math.PI / 8);
758
+ this.anchors.N = [0, h / 2];
759
+ this.anchors.S = [0, -h / 2];
760
+ this.anchors.E = [w / 2, 0];
761
+ this.anchors.W = [-w / 2, 0];
762
+ this.anchors.SE = [(w / 2) * cospi4, (-h / 2) * sinpi4];
763
+ this.anchors.SW = [(-w / 2) * cospi4, (-h / 2) * sinpi4];
764
+ this.anchors.NW = [(-w / 2) * cospi4, (h / 2) * sinpi4];
765
+ this.anchors.NE = [(w / 2) * cospi4, (h / 2) * sinpi4];
766
+ this.anchors.ENE = [(w / 2) * cospi8, (h / 2) * sinpi8];
767
+ this.anchors.WNW = [(-w / 2) * cospi8, (h / 2) * sinpi8];
768
+ this.anchors.ESE = [(w / 2) * cospi8, (-h / 2) * sinpi8];
769
+ this.anchors.WSW = [(-w / 2) * cospi8, (-h / 2) * sinpi8];
770
+ this.anchors.NNE = [(w / 2) * sinpi8, (h / 2) * cospi8];
771
+ this.anchors.NNW = [(-w / 2) * sinpi8, (h / 2) * cospi8];
772
+ this.anchors.SSE = [(w / 2) * sinpi8, (-h / 2) * cospi8];
773
+ this.anchors.SSW = [(-w / 2) * sinpi8, (-h / 2) * cospi8];
774
+ }
775
+ }
776
+ /** Rounded rectangle around a list of elements. */
777
+ export class EncircleBox extends Element {
778
+ constructor(userParams) {
779
+ pushElement(null);
780
+ const { elm_list, includelabels = true, ...rest } = userParams;
781
+ super(rest);
782
+ Object.assign(this.defaults, { cornerradius: 0.3, padx: 0.2, pady: 0.2, theta: 0 });
783
+ let xmin = Infinity;
784
+ let xmax = -Infinity;
785
+ let ymin = Infinity;
786
+ let ymax = -Infinity;
787
+ for (const element of elm_list) {
788
+ const bb = element.getBBox(true, includelabels);
789
+ xmin = Math.min(xmin, bb.xmin);
790
+ xmax = Math.max(xmax, bb.xmax);
791
+ ymin = Math.min(ymin, bb.ymin);
792
+ ymax = Math.max(ymax, bb.ymax);
793
+ }
794
+ const padx = this.params.padx ?? 0.2;
795
+ const pady = this.params.pady ?? 0.2;
796
+ xmin -= padx;
797
+ xmax += padx;
798
+ ymin -= pady;
799
+ ymax += pady;
800
+ const w = xmax - xmin;
801
+ const h = ymax - ymin;
802
+ const center = [(xmax + xmin) / 2, (ymax + ymin) / 2];
803
+ this.userParams.at = center;
804
+ const cr = this.params.cornerradius ?? 0.3;
805
+ this.segments.push(new SegmentPoly([
806
+ [-w / 2, h / 2],
807
+ [w / 2, h / 2],
808
+ [w / 2, -h / 2],
809
+ [-w / 2, -h / 2],
810
+ ], { closed: true, cornerradius: cr }));
811
+ const k = cr - (cr * Math.sqrt(2)) / 2;
812
+ this.anchors.NE = [w / 2 - k, h / 2 - k];
813
+ this.anchors.NW = [-w / 2 + k, h / 2 - k];
814
+ this.anchors.SE = [w / 2 - k, -h / 2 + k];
815
+ this.anchors.SW = [-w / 2 + k, -h / 2 + k];
816
+ this.anchors.N = [0, h / 2];
817
+ this.anchors.S = [0, -h / 2];
818
+ this.anchors.E = [w / 2, 0];
819
+ this.anchors.W = [-w / 2, 0];
820
+ }
821
+ }
822
+ //# sourceMappingURL=lines-arc-labels.js.map