@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,816 +0,0 @@
1
- /**
2
- * Integrated circuits — aligned with Python `elements/intcircuits.py` (subset + parity-oriented).
3
- */
4
- import { Element } from "../element.js";
5
- import { Point } from "../geometry/point.js";
6
- import { linspace } from "../geometry/util.js";
7
- import { getParam } from "../params.js";
8
- import { Segment, SegmentCircle, SegmentPoly, SegmentText } from "../segment.js";
9
- function normSide(side) {
10
- const c = side[0].toUpperCase();
11
- if (c === "L" || c === "R" || c === "T" || c === "B") {
12
- return c;
13
- }
14
- return "L";
15
- }
16
- /**
17
- * Python `elements.intcircuits.IcPin` dataclass — 可与 {@link Ic} 构造函数 / {@link Ic.pin} 混用。
18
- */
19
- export class IcPin {
20
- name;
21
- pin;
22
- side;
23
- pos;
24
- slot;
25
- invert = false;
26
- invertradius = 0.15;
27
- color;
28
- rotation = 0;
29
- anchorname;
30
- lblsize;
31
- pinlblsize;
32
- href;
33
- decoration;
34
- constructor(opts = {}) {
35
- this.side = opts.side !== undefined ? normSide(String(opts.side)) : "L";
36
- if (opts.name !== undefined)
37
- this.name = opts.name;
38
- if (opts.pin !== undefined)
39
- this.pin = opts.pin;
40
- if (opts.pos !== undefined)
41
- this.pos = opts.pos;
42
- if (opts.slot !== undefined)
43
- this.slot = opts.slot;
44
- if (opts.invert !== undefined)
45
- this.invert = opts.invert;
46
- if (opts.invertradius !== undefined)
47
- this.invertradius = opts.invertradius;
48
- if (opts.color !== undefined)
49
- this.color = opts.color;
50
- if (opts.rotation !== undefined)
51
- this.rotation = opts.rotation;
52
- if (opts.anchorname !== undefined)
53
- this.anchorname = opts.anchorname;
54
- if (opts.lblsize !== undefined)
55
- this.lblsize = opts.lblsize;
56
- if (opts.pinlblsize !== undefined)
57
- this.pinlblsize = opts.pinlblsize;
58
- if (opts.href !== undefined)
59
- this.href = opts.href;
60
- if (opts.decoration !== undefined)
61
- this.decoration = opts.decoration;
62
- }
63
- }
64
- function textSizeApprox(label, sizePt) {
65
- const w = Math.max(0.15, (label.length * sizePt) / 72);
66
- const h = (sizePt / 72) * 1.2;
67
- return [w * 2, h * 2];
68
- }
69
- function cloneSide(s) {
70
- return { ...s };
71
- }
72
- export class Ic extends Element {
73
- size;
74
- slant;
75
- pins;
76
- usersides;
77
- sides;
78
- pincount = { L: 0, R: 0, T: 0, B: 0 };
79
- _sizeauto;
80
- _icbox;
81
- _dflt;
82
- constructor(opts = {}) {
83
- const { size, pins, slant, label, ...rest } = opts;
84
- super({ ...rest, ...(label !== undefined ? { label } : {}) });
85
- Object.assign(this.defaults, {
86
- pinspacing: 0,
87
- edgepadH: 0.5,
88
- edgepadW: 0.5,
89
- leadlen: 0.5,
90
- lsize: 14,
91
- lofst: 0.15,
92
- plblofst: 0.075,
93
- plblsize: 11,
94
- });
95
- this.slant = slant ?? 0;
96
- this.pins = { L: [], R: [], T: [], B: [] };
97
- this.usersides = {};
98
- this.sides = {
99
- L: this.mkSide(),
100
- R: this.mkSide(),
101
- T: this.mkSide(),
102
- B: this.mkSide(),
103
- };
104
- this._dflt = this.mkSide();
105
- this.size = size ?? this.params.size;
106
- if (pins) {
107
- for (const p of pins) {
108
- this.pins[p.side].push({ ...p, side: p.side });
109
- }
110
- }
111
- this._setsize();
112
- }
113
- mkSide() {
114
- return {
115
- spacing: getParam(this.params, "pinspacing", 0),
116
- pad: getParam(this.params, "edgepadH", 0.25),
117
- leadlen: getParam(this.params, "leadlen", 0.5),
118
- label_ofst: getParam(this.params, "lofst", 0.15),
119
- label_size: getParam(this.params, "lsize", 14),
120
- pinlabel_ofst: getParam(this.params, "plblofst", 0.05),
121
- pinlabel_size: getParam(this.params, "plblsize", 11),
122
- };
123
- }
124
- pin(spec) {
125
- const side = normSide(spec.side ?? "L");
126
- const p = {
127
- side,
128
- name: spec.name,
129
- pin: spec.pin,
130
- pos: spec.pos,
131
- slot: spec.slot,
132
- invert: spec.invert ?? false,
133
- invertradius: spec.invertradius ?? 0.15,
134
- color: spec.color,
135
- rotation: spec.rotation ?? 0,
136
- anchorname: spec.anchorname,
137
- lblsize: spec.lblsize,
138
- pinlblsize: spec.pinlblsize,
139
- href: spec.href,
140
- decoration: spec.decoration,
141
- };
142
- this.pins[side].push(p);
143
- this._setsize();
144
- return this;
145
- }
146
- side(sideStr, spacing = 0, pad = 0.5, leadlen = 0.5, label_ofst = 0.15, label_size = 14, pinlabel_ofst = 0.05, pinlabel_size = 11) {
147
- const side = normSide(sideStr);
148
- this.usersides[side] = {
149
- spacing,
150
- pad,
151
- leadlen,
152
- label_ofst,
153
- label_size,
154
- pinlabel_ofst,
155
- pinlabel_size,
156
- };
157
- this._setsize();
158
- return this;
159
- }
160
- /** Python `Ic.pinnames` — logical pin names (anchorname or name). */
161
- get pinnames() {
162
- const names = [];
163
- for (const side of ["L", "R", "T", "B"]) {
164
- for (const p of this.pins[side]) {
165
- if (p.name) {
166
- names.push(p.anchorname ?? p.name);
167
- }
168
- }
169
- }
170
- return names;
171
- }
172
- /**
173
- * Extends {@link Element.getAnchorNamesForGetattr} with {@link pinnames} and `pin{n}` (Python `Ic.__getattr__`).
174
- */
175
- getAnchorNamesForGetattr() {
176
- const set = new Set(super.getAnchorNamesForGetattr());
177
- for (const side of ["L", "R", "T", "B"]) {
178
- for (const p of this.pins[side]) {
179
- if (p.name) {
180
- set.add(p.anchorname ?? p.name);
181
- }
182
- if (p.pin) {
183
- set.add(`pin${p.pin}`);
184
- }
185
- }
186
- }
187
- return [...set];
188
- }
189
- /** Python `ic[name]`; same as {@link Element.resolveAnchor}. */
190
- getPinAnchor(name) {
191
- return this.resolveAnchor(name);
192
- }
193
- _countpins() {
194
- const out = { L: 0, R: 0, T: 0, B: 0 };
195
- for (const s of ["L", "R", "T", "B"]) {
196
- const slotnames = this.pins[s].map((p) => p.slot).filter((x) => x != null);
197
- const slots = slotnames.map((p) => Number(p.split("/")[1])).concat([0]);
198
- out[s] = Math.max(this.pins[s].length, Math.max(...slots));
199
- }
200
- return out;
201
- }
202
- _autosize() {
203
- const lengths = {};
204
- const labelwidths = {};
205
- for (const side of ["L", "R", "T", "B"]) {
206
- let sideparam = cloneSide(this.usersides[side] ?? this._dflt);
207
- if (sideparam.spacing === 0) {
208
- sideparam = { ...sideparam, spacing: 0.6 };
209
- }
210
- this.sides[side] = sideparam;
211
- const n = Math.max(1, this.pincount[side]);
212
- lengths[side] = sideparam.pad * 2 + sideparam.spacing * (n - 1);
213
- let labelw = 0;
214
- for (const p of this.pins[side]) {
215
- if (p.name) {
216
- const lbls = p.lblsize ?? getParam(this.params, "lsize", 14);
217
- labelw = Math.max(labelw, textSizeApprox(p.name, lbls)[0]);
218
- }
219
- }
220
- labelwidths[side] = labelw;
221
- }
222
- const labelw = labelwidths["L"] + labelwidths["R"] + 4 * getParam(this.params, "lofst", 0.15);
223
- const boxh = Math.max(lengths["L"] ?? 0, lengths["R"] ?? 0, 2 + getParam(this.params, "edgepadH", 0.5));
224
- const boxw = Math.max(lengths["T"] ?? 0, lengths["B"] ?? 0, 2 + getParam(this.params, "edgepadW", 0.5), labelw);
225
- this._sizeauto = [boxw, boxh];
226
- for (const side of ["L", "R"]) {
227
- const sp = this.sides[side];
228
- const pc = Math.max(1, this.pincount[side]);
229
- sp.pad = (boxh - sp.spacing * (pc - 1)) / 2;
230
- }
231
- for (const side of ["T", "B"]) {
232
- const sp = this.sides[side];
233
- const pc = Math.max(1, this.pincount[side]);
234
- sp.pad = (boxw - sp.spacing * (pc - 1)) / 2;
235
- }
236
- }
237
- _autopinlayout() {
238
- const sz = this.size;
239
- for (const side of ["L", "R", "T", "B"]) {
240
- let sideparam = cloneSide(this.usersides[side] ?? this._dflt);
241
- this.sides[side] = sideparam;
242
- const length = ["T", "B"].includes(side) ? sz[0] : sz[1];
243
- const pad = sideparam.pad;
244
- if (sideparam.spacing === 0) {
245
- if (this.pincount[side] > 1) {
246
- sideparam.spacing = (length - 2 * pad) / (this.pincount[side] - 1);
247
- }
248
- else {
249
- sideparam.pad = length / 2;
250
- }
251
- }
252
- else {
253
- sideparam.pad = (length - sideparam.spacing * (this.pincount[side] - 1)) / 2;
254
- }
255
- }
256
- }
257
- _setsize() {
258
- this.pincount = this._countpins();
259
- if (this.size === undefined) {
260
- this._autosize();
261
- }
262
- else {
263
- this._autopinlayout();
264
- }
265
- }
266
- _drawBox() {
267
- let w;
268
- let h;
269
- if (this.size) {
270
- [w, h] = this.size;
271
- }
272
- else if (this._sizeauto) {
273
- [w, h] = this._sizeauto;
274
- }
275
- else {
276
- w = 2;
277
- h = 3;
278
- }
279
- const tanslant = w * Math.tan((this.slant * Math.PI) / 180);
280
- let y1 = 0;
281
- let y2 = h;
282
- let path;
283
- if (this.slant > 0) {
284
- y1 = 0 - tanslant;
285
- y2 = h + tanslant;
286
- path = [
287
- new Point(0, 0),
288
- new Point(w, y1),
289
- new Point(w, y2),
290
- new Point(0, h),
291
- new Point(0, 0),
292
- ];
293
- }
294
- else if (this.slant < 0) {
295
- y1 = 0 + tanslant;
296
- y2 = h - tanslant;
297
- path = [new Point(0, y1), new Point(w, 0), new Point(w, h), new Point(0, y2), new Point(0, y1)];
298
- }
299
- else {
300
- y1 = 0;
301
- y2 = h;
302
- path = [new Point(0, 0), new Point(w, 0), new Point(w, h), new Point(0, h), new Point(0, 0)];
303
- }
304
- this.segments.push(new Segment(path.map((p) => [p.x, p.y]), {}));
305
- return { w, h, y1, y2 };
306
- }
307
- _pinpos(side, pin, num) {
308
- const sidesetup = this.sides[side] ?? this._dflt;
309
- let spacing = sidesetup.spacing > 0 ? sidesetup.spacing : 0.6;
310
- let idx = num;
311
- if (pin.slot) {
312
- idx = Number(pin.slot.split("/")[0]) - 1;
313
- }
314
- let z = sidesetup.pad + idx * spacing;
315
- if (pin.pos !== undefined && pin.pos !== null) {
316
- z = sidesetup.pad + pin.pos * (this.pincount[side] - 1) * spacing;
317
- }
318
- let xy;
319
- if (side === "L") {
320
- xy = new Point(0, z);
321
- }
322
- else if (side === "R") {
323
- xy = new Point(this._icbox.w, z);
324
- }
325
- else if (side === "T") {
326
- xy = new Point(z, this._icbox.h);
327
- }
328
- else {
329
- xy = new Point(z, 0);
330
- }
331
- if (side === "T" && this.slant > 0) {
332
- xy = new Point(xy.x, xy.y - xy.x * Math.tan((-this.slant * Math.PI) / 180));
333
- }
334
- else if (side === "T" && this.slant < 0) {
335
- xy = new Point(xy.x, xy.y + (this._icbox.y2 - this._icbox.h) - xy.x * Math.tan((-this.slant * Math.PI) / 180));
336
- }
337
- else if (side === "B" && this.slant < 0) {
338
- xy = new Point(xy.x, xy.y - (this._icbox.y2 - this._icbox.h) - xy.x * Math.tan((this.slant * Math.PI) / 180));
339
- }
340
- else if (side === "B" && this.slant > 0) {
341
- xy = new Point(xy.x, xy.y - xy.x * Math.tan((this.slant * Math.PI) / 180));
342
- }
343
- return xy;
344
- }
345
- _drawClkpin(xy, leadext, side) {
346
- const sidesetup = this.sides[side] ?? this._dflt;
347
- const clkw = 0.4 * (sidesetup.label_size / 16);
348
- const clkh = 0.2 * (sidesetup.label_size / 16);
349
- let clkpath;
350
- if (side === "T" || side === "B") {
351
- const sgn = leadext.y !== 0 ? Math.sign(leadext.y) : 1;
352
- const cw = Math.abs(clkw) * sgn;
353
- clkpath = [
354
- new Point(xy.x - clkh, xy.y),
355
- new Point(xy.x, xy.y - cw),
356
- new Point(xy.x + clkh, xy.y),
357
- ];
358
- }
359
- else {
360
- const sgn = leadext.x !== 0 ? -Math.sign(leadext.x) : 1;
361
- const cw = Math.abs(clkw) * sgn;
362
- clkpath = [
363
- new Point(xy.x, xy.y + clkh),
364
- new Point(xy.x + cw, xy.y),
365
- new Point(xy.x, xy.y - clkh),
366
- ];
367
- }
368
- this.segments.push(new Segment(clkpath.map((p) => [p.x, p.y])));
369
- }
370
- _drawPin(side, pin, num) {
371
- const sidesetup = this.sides[side] ?? this._dflt;
372
- const xy = this._pinpos(side, pin, num);
373
- const leadMap = {
374
- L: new Point(-sidesetup.leadlen, 0),
375
- R: new Point(sidesetup.leadlen, 0),
376
- T: new Point(0, sidesetup.leadlen),
377
- B: new Point(0, -sidesetup.leadlen),
378
- };
379
- const leadext = leadMap[side];
380
- const anchorpos = xy.add(leadext);
381
- this.anchors[`in${side}${num + 1}`] = [anchorpos.x, anchorpos.y];
382
- if (pin.anchorname) {
383
- this.anchors[pin.anchorname] = [anchorpos.x, anchorpos.y];
384
- }
385
- else if (pin.name) {
386
- if (pin.name === ">") {
387
- this.anchors.CLK = [anchorpos.x, anchorpos.y];
388
- }
389
- this.anchors[pin.name] = [anchorpos.x, anchorpos.y];
390
- }
391
- if (pin.pin) {
392
- this.anchors[`pin${pin.pin}`] = [anchorpos.x, anchorpos.y];
393
- }
394
- if (sidesetup.leadlen > 0) {
395
- if (pin.invert) {
396
- const ir = pin.invertradius ?? 0.15;
397
- const invertofst = {
398
- L: new Point(-ir, 0),
399
- R: new Point(ir, 0),
400
- T: new Point(0, ir),
401
- B: new Point(0, -ir),
402
- };
403
- const io = invertofst[side];
404
- const c = xy.add(io);
405
- this.segments.push(new SegmentCircle([c.x, c.y], ir));
406
- const start = c.add(io.mul(2));
407
- this.segments.push(new Segment([
408
- [start.x, start.y],
409
- [anchorpos.x, anchorpos.y],
410
- ], {}));
411
- }
412
- else {
413
- this.segments.push(new Segment([
414
- [xy.x, xy.y],
415
- [anchorpos.x, anchorpos.y],
416
- ], {}));
417
- }
418
- }
419
- if (pin.pin) {
420
- const invr = (pin.invert ? pin.invertradius ?? 0.15 : 0) * (pin.invert ? 1 : 0);
421
- const plbl = sidesetup.pinlabel_ofst;
422
- const pofst = {
423
- L: new Point(-plbl - invr * 2, plbl),
424
- R: new Point(plbl + invr * 2, plbl),
425
- T: new Point(plbl, plbl + invr * 2),
426
- B: new Point(plbl, -plbl - invr * 2),
427
- };
428
- let off = pofst[side];
429
- const flipU = this.userParams.flip === true;
430
- const revU = this.userParams.reverse === true;
431
- const align0 = { L: "right", R: "left", T: "left", B: "left" };
432
- const align1 = { L: "bottom", R: "bottom", T: "bottom", B: "top" };
433
- let h = align0[side];
434
- let v = align1[side];
435
- if (flipU && (side === "L" || side === "R")) {
436
- off = off.flip();
437
- }
438
- if (flipU && (side === "T" || side === "B")) {
439
- v = side === "T" ? "top" : "bottom";
440
- }
441
- if (revU && (side === "L" || side === "R")) {
442
- h = side === "L" ? "left" : "right";
443
- }
444
- if (revU && (side === "T" || side === "B")) {
445
- off = off.mirrorx(0);
446
- }
447
- const po = xy.add(off);
448
- this.segments.push(new SegmentText([po.x, po.y], String(pin.pin), {
449
- fontsize: pin.pinlblsize ?? sidesetup.pinlabel_size,
450
- align: [h, v],
451
- }));
452
- }
453
- if (pin.name === ">") {
454
- this._drawClkpin(xy, leadext, side);
455
- return;
456
- }
457
- if (pin.name && pin.name !== "") {
458
- const pofst = {
459
- L: new Point(sidesetup.label_ofst, 0),
460
- R: new Point(-sidesetup.label_ofst, 0),
461
- T: new Point(0, -sidesetup.label_ofst),
462
- B: new Point(0, sidesetup.label_ofst),
463
- };
464
- const po = xy.add(pofst[side]);
465
- const flipU = this.userParams.flip === true;
466
- const revU = this.userParams.reverse === true;
467
- const ah = { L: "left", R: "right", T: "center", B: "center" };
468
- const av = { L: "center", R: "center", T: "top", B: "bottom" };
469
- let h = ah[side];
470
- let v = av[side];
471
- if (flipU && (side === "T" || side === "B")) {
472
- v = side === "T" ? "bottom" : "top";
473
- }
474
- if (revU && (side === "L" || side === "R")) {
475
- h = side === "L" ? "right" : "left";
476
- }
477
- this.segments.push(new SegmentText([po.x, po.y], pin.name, {
478
- fontsize: pin.lblsize ?? sidesetup.label_size,
479
- color: pin.color ?? undefined,
480
- align: [h, v],
481
- href: pin.href ?? undefined,
482
- decoration: pin.decoration ?? undefined,
483
- rotation: pin.rotation ?? 0,
484
- }));
485
- }
486
- }
487
- _drawPins() {
488
- for (const side of ["L", "R", "T", "B"]) {
489
- this.pins[side].forEach((p, i) => this._drawPin(side, p, i));
490
- }
491
- }
492
- _place(dwgxy, dwgtheta, dwgparams) {
493
- this.anchors = {};
494
- this._setsize();
495
- this._icbox = this._drawBox();
496
- this._drawPins();
497
- this.elmParams.lblloc = "center";
498
- this.anchors.center = [this._icbox.w / 2, this._icbox.h / 2];
499
- this.elmParams.drop = [this._icbox.w, this._icbox.h / 2];
500
- return super._place(dwgxy, dwgtheta, dwgparams);
501
- }
502
- }
503
- export class Multiplexer extends Ic {
504
- constructor(opts = {}) {
505
- const { demux = false, ...rest } = opts;
506
- const sl = opts.slant !== undefined ? opts.slant : 25;
507
- super({ ...rest, slant: demux ? sl : -sl });
508
- }
509
- }
510
- export class DFlipFlop extends Ic {
511
- constructor(opts = {}) {
512
- const { preclr = false, preclrinvert = true, ...rest } = opts;
513
- const pins = [
514
- { name: "D", side: "L", slot: "2/2" },
515
- { name: ">", side: "L", slot: "1/2" },
516
- { name: "Q", side: "R", slot: "2/2" },
517
- { name: "Q", side: "R", slot: "1/2", anchorname: "Qbar", decoration: "overline" },
518
- ];
519
- if (preclr) {
520
- pins.push({ name: "PRE", side: "T", invert: preclrinvert });
521
- pins.push({ name: "CLR", side: "B", invert: preclrinvert });
522
- }
523
- super({ ...rest, pins, size: rest.size ?? [2, 3] });
524
- }
525
- }
526
- export class JKFlipFlop extends Ic {
527
- constructor(opts = {}) {
528
- const { preclr = false, preclrinvert = true, ...rest } = opts;
529
- const pins = [
530
- { name: "J", side: "L", slot: "3/3" },
531
- { name: ">", side: "L", slot: "2/3" },
532
- { name: "K", side: "L", slot: "1/3" },
533
- { name: "Q", side: "R", slot: "3/3" },
534
- { name: "Q", side: "R", slot: "1/3", anchorname: "Qbar", decoration: "overline" },
535
- ];
536
- if (preclr) {
537
- pins.push({ name: "PRE", side: "T", invert: preclrinvert });
538
- pins.push({ name: "CLR", side: "B", invert: preclrinvert });
539
- }
540
- super({ ...rest, pins, size: rest.size ?? [2, 3] });
541
- }
542
- }
543
- export class VoltageRegulator extends Ic {
544
- constructor(opts = {}) {
545
- const pins = [
546
- { name: "in", side: "L", slot: "3/3" },
547
- { name: "out", side: "R", slot: "3/3" },
548
- { name: "gnd", side: "B" },
549
- ];
550
- super({ ...opts, pins, size: opts.size ?? [2, 1.5] });
551
- }
552
- }
553
- export class Ic555 extends Ic {
554
- constructor(opts = {}) {
555
- const pins = [
556
- { name: "TRG", side: "L", pin: "2" },
557
- { name: "THR", side: "L", pin: "6" },
558
- { name: "DIS", side: "L", pin: "7" },
559
- { name: "CTL", side: "R", pin: "5" },
560
- { name: "OUT", side: "R", pin: "3" },
561
- { name: "RST", side: "T", pin: "4" },
562
- { name: "Vcc", side: "T", pin: "8" },
563
- { name: "GND", side: "B", pin: "1" },
564
- ];
565
- super({
566
- ...opts,
567
- edgepadW: 0.5,
568
- edgepadH: 1,
569
- pinspacing: 1.5,
570
- leadlen: 1,
571
- pins,
572
- label: "555",
573
- });
574
- }
575
- }
576
- /** 生成七段数码管几何片段(与 Python `sevensegdigit` 对齐)。 */
577
- export function sevensegdigit(opts) {
578
- const bottom = opts.bottom ?? 0;
579
- const left = opts.left ?? 0;
580
- const seglen = opts.seglen ?? 1.5;
581
- const segw = opts.segw ?? 0.3;
582
- const spacing = opts.spacing ?? 0.12;
583
- const digit = opts.digit ?? 8;
584
- const segcolor = opts.segcolor ?? "red";
585
- const tilt = opts.tilt ?? 10;
586
- const labelsegments = opts.labelsegments ?? true;
587
- const halfw = segw / 2;
588
- const marginy = segw / 5;
589
- const halfspace = spacing / 2;
590
- const tiltRad = (tilt * Math.PI) / 180;
591
- const lam = Math.sin(tiltRad);
592
- let segDx = [halfspace, halfspace + halfw, seglen - halfspace - halfw, seglen - halfspace, seglen - halfspace - halfw, halfspace + halfw];
593
- let segDy = [0, halfw, halfw, 0, -halfw, -halfw];
594
- let segAx = [...segDx];
595
- let segGx = [...segDx];
596
- let segAy = segDy.map((k) => k + seglen * 2);
597
- let segGy = segDy.map((k) => k + seglen);
598
- let segEx = [0, halfw, halfw, 0, -halfw, -halfw];
599
- let segEy = [halfspace, halfspace + halfw, seglen - halfspace - halfw, seglen - halfspace, seglen - halfspace - halfw, halfspace + halfw];
600
- let segFx = [...segEx];
601
- let segFy = segEy.map((k) => k + seglen);
602
- let segBx = segEx.map((k) => k + seglen);
603
- let segBy = [...segFy];
604
- let segCx = [...segBx];
605
- let segCy = [...segEy];
606
- let segAlabel = [seglen / 2 + halfspace, seglen * 2 + halfw + marginy];
607
- let segGlabel = [seglen / 2 + halfspace, seglen + halfw + marginy];
608
- let segDlabel = [seglen / 2 + halfspace, halfw + marginy];
609
- let segBlabel = [seglen + halfw + halfspace, seglen * 1.5];
610
- let segClabel = [seglen + halfw + halfspace, seglen * 0.5];
611
- let segElabel = [-halfw - halfspace, seglen * 0.5];
612
- let segFlabel = [-halfw - halfspace, seglen * 1.5];
613
- const shift = (lab) => [lab[0] + lab[1] * lam, lab[1]];
614
- let leftAdj = left;
615
- if (tilt !== 0) {
616
- segAx = segAx.map((k, i) => k + lam * segAy[i]);
617
- segBx = segBx.map((k, i) => k + lam * segBy[i]);
618
- segCx = segCx.map((k, i) => k + lam * segCy[i]);
619
- segDx = segDx.map((k, i) => k + lam * segDy[i]);
620
- segEx = segEx.map((k, i) => k + lam * segEy[i]);
621
- segFx = segFx.map((k, i) => k + lam * segFy[i]);
622
- segGx = segGx.map((k, i) => k + lam * segGy[i]);
623
- segAlabel = shift(segAlabel);
624
- segGlabel = shift(segGlabel);
625
- segDlabel = shift(segDlabel);
626
- segBlabel = shift(segBlabel);
627
- segClabel = shift(segClabel);
628
- segElabel = shift(segElabel);
629
- segFlabel = shift(segFlabel);
630
- leftAdj -= lam * seglen;
631
- }
632
- const tx = (xs) => xs.map((k) => k + leftAdj);
633
- const ty = (ys) => ys.map((k) => k + bottom);
634
- segDx = tx(segDx);
635
- segDy = ty(segDy);
636
- segGx = tx(segGx);
637
- segGy = ty(segGy);
638
- segAx = tx(segAx);
639
- segAy = ty(segAy);
640
- segEx = tx(segEx);
641
- segEy = ty(segEy);
642
- segFx = tx(segFx);
643
- segFy = ty(segFy);
644
- segBx = tx(segBx);
645
- segBy = ty(segBy);
646
- segCx = tx(segCx);
647
- segCy = ty(segCy);
648
- segAlabel = [segAlabel[0] + leftAdj, segAlabel[1] + bottom];
649
- segGlabel = [segGlabel[0] + leftAdj, segGlabel[1] + bottom];
650
- segDlabel = [segDlabel[0] + leftAdj, segDlabel[1] + bottom];
651
- segBlabel = [segBlabel[0] + leftAdj, segBlabel[1] + bottom];
652
- segClabel = [segClabel[0] + leftAdj, segClabel[1] + bottom];
653
- segElabel = [segElabel[0] + leftAdj, segElabel[1] + bottom];
654
- segFlabel = [segFlabel[0] + leftAdj, segFlabel[1] + bottom];
655
- const ds = String(digit).toLowerCase();
656
- const fillA = ["2", "3", "5", "6", "7", "8", "9", "0", "a", "c", "e", "f"].includes(ds) ? segcolor : undefined;
657
- const fillB = ["1", "2", "3", "4", "7", "8", "9", "0", "a", "d"].includes(ds) ? segcolor : undefined;
658
- const fillC = ["1", "3", "4", "5", "6", "7", "8", "9", "0", "a", "b", "d"].includes(ds) ? segcolor : undefined;
659
- const fillD = ["2", "3", "5", "6", "8", "9", "0", "b", "c", "d", "e"].includes(ds) ? segcolor : undefined;
660
- const fillE = ["2", "6", "8", "0", "a", "b", "c", "d", "e", "f"].includes(ds) ? segcolor : undefined;
661
- const fillF = ["4", "5", "6", "8", "9", "0", "a", "b", "c", "e", "f"].includes(ds) ? segcolor : undefined;
662
- const fillG = ["2", "3", "4", "5", "6", "8", "9", "a", "b", "d", "e", "f"].includes(ds) ? segcolor : undefined;
663
- const segs = [];
664
- const poly = (xs, ys, fill) => segs.push(new SegmentPoly(xs.map((x, i) => [x, ys[i]]), { closed: true, fill: fill ?? false, color: "gray", lw: 0.5 }));
665
- poly(segAx, segAy, fillA);
666
- poly(segBx, segBy, fillB);
667
- poly(segCx, segCy, fillC);
668
- poly(segDx, segDy, fillD);
669
- poly(segEx, segEy, fillE);
670
- poly(segFx, segFy, fillF);
671
- poly(segGx, segGy, fillG);
672
- if (labelsegments) {
673
- segs.push(new SegmentText(segAlabel, "a", { align: ["center", "bottom"], fontsize: 10 }));
674
- segs.push(new SegmentText(segGlabel, "g", { align: ["center", "bottom"], fontsize: 10 }));
675
- segs.push(new SegmentText(segDlabel, "d", { align: ["center", "bottom"], fontsize: 10 }));
676
- segs.push(new SegmentText(segBlabel, "b", { align: ["left", "center"], fontsize: 10 }));
677
- segs.push(new SegmentText(segClabel, "c", { align: ["left", "center"], fontsize: 10 }));
678
- segs.push(new SegmentText(segElabel, "e", { align: ["right", "center"], fontsize: 10 }));
679
- segs.push(new SegmentText(segFlabel, "f", { align: ["right", "center"], fontsize: 10 }));
680
- }
681
- if (opts.decimal) {
682
- const dotrad = 0.15;
683
- segs.push(new SegmentCircle([leftAdj + seglen + segw + dotrad / 2, bottom], dotrad, {
684
- color: "gray",
685
- fill: segcolor,
686
- lw: 0.5,
687
- }));
688
- }
689
- return segs;
690
- }
691
- export class SevenSegment extends Ic {
692
- constructor(opts = {}) {
693
- const dec = getParam(opts, "decimal", false);
694
- const slots = dec ? "8" : "7";
695
- const boxheight = dec ? 5.9 : 5.3;
696
- const boxwidth = 3;
697
- const size = opts.size ?? [boxwidth, boxheight];
698
- const pins = [
699
- { pin: "a", side: "L", slot: `${7 + (dec ? 1 : 0)}/${slots}`, anchorname: "a" },
700
- { pin: "b", side: "L", slot: `${6 + (dec ? 1 : 0)}/${slots}`, anchorname: "b" },
701
- { pin: "c", side: "L", slot: `${5 + (dec ? 1 : 0)}/${slots}`, anchorname: "c" },
702
- { pin: "d", side: "L", slot: `${4 + (dec ? 1 : 0)}/${slots}`, anchorname: "d" },
703
- { pin: "e", side: "L", slot: `${3 + (dec ? 1 : 0)}/${slots}`, anchorname: "e" },
704
- { pin: "f", side: "L", slot: `${2 + (dec ? 1 : 0)}/${slots}`, anchorname: "f" },
705
- { pin: "g", side: "L", slot: `${1 + (dec ? 1 : 0)}/${slots}`, anchorname: "g" },
706
- ];
707
- if (dec) {
708
- pins.push({ pin: "dp", side: "L", slot: `1/${slots}`, anchorname: "dp" });
709
- }
710
- if (getParam(opts, "anode", false)) {
711
- pins.push({ pin: "ca", side: "T", anchorname: "anode" });
712
- }
713
- if (getParam(opts, "cathode", false)) {
714
- pins.push({ pin: "cc", side: "B", anchorname: "cathode" });
715
- }
716
- super({ ...opts, pins, size, pinspacing: 0.6 });
717
- const left = 0.8;
718
- const seglen = 1.5;
719
- const bot = (boxheight - seglen * 2) / 2;
720
- this.segments.push(...sevensegdigit({
721
- left,
722
- bottom: bot,
723
- decimal: dec,
724
- digit: getParam(opts, "digit", 8),
725
- segcolor: getParam(opts, "segcolor", "red"),
726
- tilt: getParam(opts, "tilt", 10),
727
- labelsegments: getParam(opts, "labelsegments", true),
728
- }));
729
- }
730
- }
731
- /** DIP 封装(双列直插)。 */
732
- export class IcDIP extends Element {
733
- constructor(opts = {}) {
734
- super(opts);
735
- Object.assign(this.defaults, {
736
- pins: 8,
737
- notch: true,
738
- width: 3,
739
- pinw: 0.6,
740
- spacing: 0.5,
741
- number: true,
742
- fontsize: 12,
743
- pfontsize: 10,
744
- });
745
- const w = getParam(this.params, "width", 3);
746
- const pw = getParam(this.params, "pinw", 0.6);
747
- const space = getParam(this.params, "spacing", 0.5);
748
- const np = getParam(this.params, "pins", 8);
749
- const names = getParam(this.params, "names", undefined);
750
- if (np % 2 === 1) {
751
- throw new Error("pins must be even");
752
- }
753
- const height = (np / 2) * pw + space * (np / 2 + 1);
754
- this.segments.push(new SegmentPoly([
755
- [0, 0],
756
- [w, 0],
757
- [w, height],
758
- [0, height],
759
- ], { closed: true }));
760
- if (getParam(this.params, "notch", true)) {
761
- const c = w / 2;
762
- const theta = linspace(-Math.PI, 0, 50);
763
- const notchr = pw / 2;
764
- const notchx = theta.map((t) => c + notchr * Math.cos(t));
765
- const notchy = theta.map((t) => height + notchr * Math.sin(t));
766
- this.segments.push(new Segment(notchx.map((x, i) => [x, notchy[i]])));
767
- }
768
- const half = np / 2;
769
- for (let i = 0; i < half; i++) {
770
- const y1 = space + space * i + i * pw;
771
- const y2 = space + space * i + (i + 1) * pw;
772
- const ymid = (y1 + y2) / 2;
773
- this.segments.push(new SegmentPoly([
774
- [0, y1],
775
- [0, y2],
776
- [-pw, y2],
777
- [-pw, y1],
778
- ], { closed: true }));
779
- let pnum = half - i;
780
- this.anchors[`p${pnum}`] = [-pw, ymid];
781
- this.anchors[`p${pnum}_in`] = [0, ymid];
782
- if (getParam(this.params, "number", true)) {
783
- this.segments.push(new SegmentText([-pw / 2, ymid], String(pnum), { fontsize: getParam(this.params, "pfontsize", 10) }));
784
- }
785
- if (names && names[pnum - 1]) {
786
- this.segments.push(new SegmentText([0.1, ymid], names[pnum - 1], {
787
- align: ["left", "center"],
788
- fontsize: getParam(this.params, "fontsize", 12),
789
- }));
790
- this.anchors[names[pnum - 1]] = [-pw, ymid];
791
- this.anchors[`${names[pnum - 1]}_in`] = [0, ymid];
792
- }
793
- this.segments.push(new SegmentPoly([
794
- [w, y1],
795
- [w, y2],
796
- [w + pw, y2],
797
- [w + pw, y1],
798
- ], { closed: true }));
799
- pnum = half + i + 1;
800
- this.anchors[`p${pnum}`] = [w + pw, ymid];
801
- this.anchors[`p${pnum}_in`] = [w, ymid];
802
- if (getParam(this.params, "number", true)) {
803
- this.segments.push(new SegmentText([w + pw / 2, ymid], String(pnum), { fontsize: getParam(this.params, "pfontsize", 10) }));
804
- }
805
- if (names && names[pnum - 1]) {
806
- this.segments.push(new SegmentText([w - 0.1, ymid], names[pnum - 1], {
807
- align: ["right", "center"],
808
- fontsize: getParam(this.params, "fontsize", 12),
809
- }));
810
- this.anchors[names[pnum - 1]] = [w + pw, ymid];
811
- this.anchors[`${names[pnum - 1]}_in`] = [w, ymid];
812
- }
813
- }
814
- }
815
- }
816
- //# sourceMappingURL=ic.js.map