@skillpet/circuit 0.5.0 → 0.5.2

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 (333) hide show
  1. package/LICENSE +43 -0
  2. package/README.md +24 -30
  3. package/dist/circuit.bundle.js +0 -1
  4. package/dist/circuit.bundle.min.js +0 -1
  5. package/dist/circuit.esm.js +0 -1
  6. package/dist/config.d.ts +0 -1
  7. package/dist/container.d.ts +0 -1
  8. package/dist/drawing-gradient.d.ts +0 -1
  9. package/dist/drawing-stack.d.ts +0 -1
  10. package/dist/drawing-transition.d.ts +0 -1
  11. package/dist/drawing.d.ts +0 -1
  12. package/dist/element-label.d.ts +0 -1
  13. package/dist/element-style.d.ts +0 -1
  14. package/dist/element.d.ts +0 -1
  15. package/dist/element2term.d.ts +0 -1
  16. package/dist/elements/cables.d.ts +0 -1
  17. package/dist/elements/capacitor.d.ts +0 -1
  18. package/dist/elements/compound.d.ts +0 -1
  19. package/dist/elements/connectors.d.ts +0 -1
  20. package/dist/elements/crystal.d.ts +0 -1
  21. package/dist/elements/diode-more.d.ts +0 -1
  22. package/dist/elements/diode.d.ts +0 -1
  23. package/dist/elements/element-compound.d.ts +0 -1
  24. package/dist/elements/element-drawing.d.ts +0 -1
  25. package/dist/elements/ground.d.ts +0 -1
  26. package/dist/elements/ic.d.ts +0 -1
  27. package/dist/elements/image.d.ts +0 -1
  28. package/dist/elements/inductor.d.ts +0 -1
  29. package/dist/elements/line.d.ts +0 -1
  30. package/dist/elements/lines-arc-labels.d.ts +0 -1
  31. package/dist/elements/lines-elements.d.ts +0 -1
  32. package/dist/elements/misc-elements.d.ts +0 -1
  33. package/dist/elements/oneterm.d.ts +0 -1
  34. package/dist/elements/opamp.d.ts +0 -1
  35. package/dist/elements/outlets.d.ts +0 -1
  36. package/dist/elements/resistor-more.d.ts +0 -1
  37. package/dist/elements/resistor.d.ts +0 -1
  38. package/dist/elements/source-v.d.ts +0 -1
  39. package/dist/elements/sources.d.ts +0 -1
  40. package/dist/elements/switches.d.ts +0 -1
  41. package/dist/elements/transformer.d.ts +0 -1
  42. package/dist/elements/transistors.d.ts +0 -1
  43. package/dist/elements/tubes.d.ts +0 -1
  44. package/dist/elements/twoports.d.ts +0 -1
  45. package/dist/elements/twoterm-extras.d.ts +0 -1
  46. package/dist/elements/twoterm.d.ts +0 -1
  47. package/dist/geometry/point.d.ts +0 -1
  48. package/dist/geometry/roundcorners.d.ts +0 -1
  49. package/dist/geometry/transform.d.ts +0 -1
  50. package/dist/geometry/util.d.ts +0 -1
  51. package/dist/index.cjs +0 -1
  52. package/dist/index.d.ts +0 -1
  53. package/dist/json/anchor-ref.d.ts +0 -1
  54. package/dist/json/mount.d.ts +0 -1
  55. package/dist/json/registry.d.ts +0 -1
  56. package/dist/json/render.d.ts +0 -1
  57. package/dist/json/theme.d.ts +0 -1
  58. package/dist/json/types.d.ts +0 -1
  59. package/dist/json/validate.d.ts +0 -1
  60. package/dist/label-hint.d.ts +0 -1
  61. package/dist/logic/and.d.ts +0 -1
  62. package/dist/logic/bitfield.d.ts +0 -1
  63. package/dist/logic/buffer.d.ts +0 -1
  64. package/dist/logic/extras.d.ts +0 -1
  65. package/dist/logic/kmap.d.ts +0 -1
  66. package/dist/logic/or.d.ts +0 -1
  67. package/dist/logic/timing.d.ts +0 -1
  68. package/dist/logic/tristate.d.ts +0 -1
  69. package/dist/math-render.d.ts +0 -1
  70. package/dist/package-api.d.ts +0 -1
  71. package/dist/params.d.ts +0 -1
  72. package/dist/react/index.d.ts +0 -1
  73. package/dist/react/index.js +0 -1
  74. package/dist/segment.d.ts +0 -1
  75. package/dist/style.d.ts +0 -1
  76. package/dist/subsystems/dsp.d.ts +0 -1
  77. package/dist/subsystems/flow.d.ts +0 -1
  78. package/dist/subsystems/index.d.ts +0 -1
  79. package/dist/subsystems/parsing.d.ts +0 -1
  80. package/dist/subsystems/pictorial.d.ts +0 -1
  81. package/dist/svg/constants.d.ts +0 -1
  82. package/dist/svg/figure.d.ts +0 -1
  83. package/dist/svg/fmt.d.ts +0 -1
  84. package/dist/svg/svg-style.d.ts +0 -1
  85. package/dist/types.d.ts +0 -1
  86. package/dist/version.d.ts +0 -1
  87. package/dist/vue/index.d.ts +0 -1
  88. package/dist/vue/index.js +0 -1
  89. package/package.json +22 -9
  90. package/dist/circuit.bundle.js.map +0 -7
  91. package/dist/circuit.bundle.min.js.map +0 -7
  92. package/dist/circuit.esm.js.map +0 -7
  93. package/dist/config.d.ts.map +0 -1
  94. package/dist/config.js +0 -23
  95. package/dist/config.js.map +0 -1
  96. package/dist/container.d.ts.map +0 -1
  97. package/dist/container.js +0 -101
  98. package/dist/container.js.map +0 -1
  99. package/dist/drawing-gradient.d.ts.map +0 -1
  100. package/dist/drawing-gradient.js +0 -39
  101. package/dist/drawing-gradient.js.map +0 -1
  102. package/dist/drawing-stack.d.ts.map +0 -1
  103. package/dist/drawing-stack.js +0 -32
  104. package/dist/drawing-stack.js.map +0 -1
  105. package/dist/drawing-transition.d.ts.map +0 -1
  106. package/dist/drawing-transition.js +0 -181
  107. package/dist/drawing-transition.js.map +0 -1
  108. package/dist/drawing.d.ts.map +0 -1
  109. package/dist/drawing.js +0 -337
  110. package/dist/drawing.js.map +0 -1
  111. package/dist/element-label.d.ts.map +0 -1
  112. package/dist/element-label.js +0 -377
  113. package/dist/element-label.js.map +0 -1
  114. package/dist/element-style.d.ts.map +0 -1
  115. package/dist/element-style.js +0 -51
  116. package/dist/element-style.js.map +0 -1
  117. package/dist/element.d.ts.map +0 -1
  118. package/dist/element.js +0 -514
  119. package/dist/element.js.map +0 -1
  120. package/dist/element2term.d.ts.map +0 -1
  121. package/dist/element2term.js +0 -245
  122. package/dist/element2term.js.map +0 -1
  123. package/dist/elements/cables.d.ts.map +0 -1
  124. package/dist/elements/cables.js +0 -100
  125. package/dist/elements/cables.js.map +0 -1
  126. package/dist/elements/capacitor.d.ts.map +0 -1
  127. package/dist/elements/capacitor.js +0 -93
  128. package/dist/elements/capacitor.js.map +0 -1
  129. package/dist/elements/compound.d.ts.map +0 -1
  130. package/dist/elements/compound.js +0 -266
  131. package/dist/elements/compound.js.map +0 -1
  132. package/dist/elements/connectors.d.ts.map +0 -1
  133. package/dist/elements/connectors.js +0 -578
  134. package/dist/elements/connectors.js.map +0 -1
  135. package/dist/elements/crystal.d.ts.map +0 -1
  136. package/dist/elements/crystal.js +0 -31
  137. package/dist/elements/crystal.js.map +0 -1
  138. package/dist/elements/diode-more.d.ts.map +0 -1
  139. package/dist/elements/diode-more.js +0 -233
  140. package/dist/elements/diode-more.js.map +0 -1
  141. package/dist/elements/diode.d.ts.map +0 -1
  142. package/dist/elements/diode.js +0 -58
  143. package/dist/elements/diode.js.map +0 -1
  144. package/dist/elements/element-compound.d.ts.map +0 -1
  145. package/dist/elements/element-compound.js +0 -68
  146. package/dist/elements/element-compound.js.map +0 -1
  147. package/dist/elements/element-drawing.d.ts.map +0 -1
  148. package/dist/elements/element-drawing.js +0 -16
  149. package/dist/elements/element-drawing.js.map +0 -1
  150. package/dist/elements/ground.d.ts.map +0 -1
  151. package/dist/elements/ground.js +0 -30
  152. package/dist/elements/ground.js.map +0 -1
  153. package/dist/elements/ic.d.ts.map +0 -1
  154. package/dist/elements/ic.js +0 -816
  155. package/dist/elements/ic.js.map +0 -1
  156. package/dist/elements/image.d.ts.map +0 -1
  157. package/dist/elements/image.js +0 -27
  158. package/dist/elements/image.js.map +0 -1
  159. package/dist/elements/inductor.d.ts.map +0 -1
  160. package/dist/elements/inductor.js +0 -111
  161. package/dist/elements/inductor.js.map +0 -1
  162. package/dist/elements/line.d.ts.map +0 -1
  163. package/dist/elements/line.js +0 -14
  164. package/dist/elements/line.js.map +0 -1
  165. package/dist/elements/lines-arc-labels.d.ts.map +0 -1
  166. package/dist/elements/lines-arc-labels.js +0 -822
  167. package/dist/elements/lines-arc-labels.js.map +0 -1
  168. package/dist/elements/lines-elements.d.ts.map +0 -1
  169. package/dist/elements/lines-elements.js +0 -271
  170. package/dist/elements/lines-elements.js.map +0 -1
  171. package/dist/elements/misc-elements.d.ts.map +0 -1
  172. package/dist/elements/misc-elements.js +0 -160
  173. package/dist/elements/misc-elements.js.map +0 -1
  174. package/dist/elements/oneterm.d.ts.map +0 -1
  175. package/dist/elements/oneterm.js +0 -163
  176. package/dist/elements/oneterm.js.map +0 -1
  177. package/dist/elements/opamp.d.ts.map +0 -1
  178. package/dist/elements/opamp.js +0 -72
  179. package/dist/elements/opamp.js.map +0 -1
  180. package/dist/elements/outlets.d.ts.map +0 -1
  181. package/dist/elements/outlets.js +0 -285
  182. package/dist/elements/outlets.js.map +0 -1
  183. package/dist/elements/resistor-more.d.ts.map +0 -1
  184. package/dist/elements/resistor-more.js +0 -171
  185. package/dist/elements/resistor-more.js.map +0 -1
  186. package/dist/elements/resistor.d.ts.map +0 -1
  187. package/dist/elements/resistor.js +0 -22
  188. package/dist/elements/resistor.js.map +0 -1
  189. package/dist/elements/source-v.d.ts.map +0 -1
  190. package/dist/elements/source-v.js +0 -3
  191. package/dist/elements/source-v.js.map +0 -1
  192. package/dist/elements/sources.d.ts.map +0 -1
  193. package/dist/elements/sources.js +0 -519
  194. package/dist/elements/sources.js.map +0 -1
  195. package/dist/elements/switches.d.ts.map +0 -1
  196. package/dist/elements/switches.js +0 -328
  197. package/dist/elements/switches.js.map +0 -1
  198. package/dist/elements/transformer.d.ts.map +0 -1
  199. package/dist/elements/transformer.js +0 -184
  200. package/dist/elements/transformer.js.map +0 -1
  201. package/dist/elements/transistors.d.ts.map +0 -1
  202. package/dist/elements/transistors.js +0 -1009
  203. package/dist/elements/transistors.js.map +0 -1
  204. package/dist/elements/tubes.d.ts.map +0 -1
  205. package/dist/elements/tubes.js +0 -386
  206. package/dist/elements/tubes.js.map +0 -1
  207. package/dist/elements/twoports.d.ts.map +0 -1
  208. package/dist/elements/twoports.js +0 -231
  209. package/dist/elements/twoports.js.map +0 -1
  210. package/dist/elements/twoterm-extras.d.ts.map +0 -1
  211. package/dist/elements/twoterm-extras.js +0 -243
  212. package/dist/elements/twoterm-extras.js.map +0 -1
  213. package/dist/elements/twoterm.d.ts.map +0 -1
  214. package/dist/elements/twoterm.js +0 -4
  215. package/dist/elements/twoterm.js.map +0 -1
  216. package/dist/geometry/point.d.ts.map +0 -1
  217. package/dist/geometry/point.js +0 -99
  218. package/dist/geometry/point.js.map +0 -1
  219. package/dist/geometry/roundcorners.d.ts.map +0 -1
  220. package/dist/geometry/roundcorners.js +0 -64
  221. package/dist/geometry/roundcorners.js.map +0 -1
  222. package/dist/geometry/transform.d.ts.map +0 -1
  223. package/dist/geometry/transform.js +0 -33
  224. package/dist/geometry/transform.js.map +0 -1
  225. package/dist/geometry/util.d.ts.map +0 -1
  226. package/dist/geometry/util.js +0 -36
  227. package/dist/geometry/util.js.map +0 -1
  228. package/dist/index.cjs.map +0 -7
  229. package/dist/index.d.ts.map +0 -1
  230. package/dist/index.js +0 -68
  231. package/dist/index.js.map +0 -1
  232. package/dist/json/anchor-ref.d.ts.map +0 -1
  233. package/dist/json/anchor-ref.js +0 -35
  234. package/dist/json/anchor-ref.js.map +0 -1
  235. package/dist/json/mount.d.ts.map +0 -1
  236. package/dist/json/mount.js +0 -369
  237. package/dist/json/mount.js.map +0 -1
  238. package/dist/json/registry.d.ts.map +0 -1
  239. package/dist/json/registry.js +0 -323
  240. package/dist/json/registry.js.map +0 -1
  241. package/dist/json/render.d.ts.map +0 -1
  242. package/dist/json/render.js +0 -113
  243. package/dist/json/render.js.map +0 -1
  244. package/dist/json/theme.d.ts.map +0 -1
  245. package/dist/json/theme.js +0 -57
  246. package/dist/json/theme.js.map +0 -1
  247. package/dist/json/types.d.ts.map +0 -1
  248. package/dist/json/types.js +0 -2
  249. package/dist/json/types.js.map +0 -1
  250. package/dist/json/validate.d.ts.map +0 -1
  251. package/dist/json/validate.js +0 -77
  252. package/dist/json/validate.js.map +0 -1
  253. package/dist/label-hint.d.ts.map +0 -1
  254. package/dist/label-hint.js +0 -2
  255. package/dist/label-hint.js.map +0 -1
  256. package/dist/logic/and.d.ts.map +0 -1
  257. package/dist/logic/and.js +0 -63
  258. package/dist/logic/and.js.map +0 -1
  259. package/dist/logic/bitfield.d.ts.map +0 -1
  260. package/dist/logic/bitfield.js +0 -271
  261. package/dist/logic/bitfield.js.map +0 -1
  262. package/dist/logic/buffer.d.ts.map +0 -1
  263. package/dist/logic/buffer.js +0 -46
  264. package/dist/logic/buffer.js.map +0 -1
  265. package/dist/logic/extras.d.ts.map +0 -1
  266. package/dist/logic/extras.js +0 -211
  267. package/dist/logic/extras.js.map +0 -1
  268. package/dist/logic/kmap.d.ts.map +0 -1
  269. package/dist/logic/kmap.js +0 -163
  270. package/dist/logic/kmap.js.map +0 -1
  271. package/dist/logic/or.d.ts.map +0 -1
  272. package/dist/logic/or.js +0 -117
  273. package/dist/logic/or.js.map +0 -1
  274. package/dist/logic/timing.d.ts.map +0 -1
  275. package/dist/logic/timing.js +0 -791
  276. package/dist/logic/timing.js.map +0 -1
  277. package/dist/logic/tristate.d.ts.map +0 -1
  278. package/dist/logic/tristate.js +0 -48
  279. package/dist/logic/tristate.js.map +0 -1
  280. package/dist/math-render.d.ts.map +0 -1
  281. package/dist/math-render.js +0 -53
  282. package/dist/math-render.js.map +0 -1
  283. package/dist/package-api.d.ts.map +0 -1
  284. package/dist/package-api.js +0 -75
  285. package/dist/package-api.js.map +0 -1
  286. package/dist/params.d.ts.map +0 -1
  287. package/dist/params.js +0 -35
  288. package/dist/params.js.map +0 -1
  289. package/dist/react/index.d.ts.map +0 -1
  290. package/dist/react/index.js.map +0 -1
  291. package/dist/schemdraw-ts.bundle.js +0 -30448
  292. package/dist/schemdraw-ts.bundle.js.map +0 -7
  293. package/dist/segment.d.ts.map +0 -1
  294. package/dist/segment.js +0 -844
  295. package/dist/segment.js.map +0 -1
  296. package/dist/style.d.ts.map +0 -1
  297. package/dist/style.js +0 -230
  298. package/dist/style.js.map +0 -1
  299. package/dist/subsystems/dsp.d.ts.map +0 -1
  300. package/dist/subsystems/dsp.js +0 -267
  301. package/dist/subsystems/dsp.js.map +0 -1
  302. package/dist/subsystems/flow.d.ts.map +0 -1
  303. package/dist/subsystems/flow.js +0 -315
  304. package/dist/subsystems/flow.js.map +0 -1
  305. package/dist/subsystems/index.d.ts.map +0 -1
  306. package/dist/subsystems/index.js +0 -22
  307. package/dist/subsystems/index.js.map +0 -1
  308. package/dist/subsystems/parsing.d.ts.map +0 -1
  309. package/dist/subsystems/parsing.js +0 -456
  310. package/dist/subsystems/parsing.js.map +0 -1
  311. package/dist/subsystems/pictorial.d.ts.map +0 -1
  312. package/dist/subsystems/pictorial.js +0 -469
  313. package/dist/subsystems/pictorial.js.map +0 -1
  314. package/dist/svg/constants.d.ts.map +0 -1
  315. package/dist/svg/constants.js +0 -5
  316. package/dist/svg/constants.js.map +0 -1
  317. package/dist/svg/figure.d.ts.map +0 -1
  318. package/dist/svg/figure.js +0 -634
  319. package/dist/svg/figure.js.map +0 -1
  320. package/dist/svg/fmt.d.ts.map +0 -1
  321. package/dist/svg/fmt.js +0 -7
  322. package/dist/svg/fmt.js.map +0 -1
  323. package/dist/svg/svg-style.d.ts.map +0 -1
  324. package/dist/svg/svg-style.js +0 -46
  325. package/dist/svg/svg-style.js.map +0 -1
  326. package/dist/types.d.ts.map +0 -1
  327. package/dist/types.js +0 -21
  328. package/dist/types.js.map +0 -1
  329. package/dist/version.d.ts.map +0 -1
  330. package/dist/version.js +0 -3
  331. package/dist/version.js.map +0 -1
  332. package/dist/vue/index.d.ts.map +0 -1
  333. package/dist/vue/index.js.map +0 -1
@@ -1,822 +0,0 @@
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