schematic-symbols 0.0.120 → 0.0.122
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/index.d.ts +25 -5
- package/dist/index.js +1658 -704
- package/dist/index.js.map +1 -1
- package/package.json +2 -5
- package/drawing/arc.ts +0 -31
- package/drawing/arrow.ts +0 -41
- package/drawing/box.ts +0 -5
- package/drawing/circle.ts +0 -7
- package/drawing/cubicBezierCurveArc.ts +0 -28
- package/drawing/defineSymbol.ts +0 -16
- package/drawing/getSvg.ts +0 -199
- package/drawing/index.ts +0 -10
- package/drawing/mapColor.ts +0 -10
- package/drawing/modify-symbol/modify-symbol.ts +0 -97
- package/drawing/ninePointAnchorToSvgAnchor.ts +0 -11
- package/drawing/path.ts +0 -5
- package/drawing/pathToSvgD.ts +0 -22
- package/drawing/resizeSymbol.ts +0 -67
- package/drawing/rotateSymbol.ts +0 -324
- package/drawing/svgPathToPoints.ts +0 -109
- package/drawing/text.ts +0 -8
- package/drawing/typeguards.ts +0 -155
- package/drawing/types.ts +0 -93
- package/drawing/utils/getBoundsOfPrimitives.ts +0 -51
- package/drawing/utils/makeYUpPositive.ts +0 -46
- package/index.ts +0 -24
- package/symbols/SPDT_switch_horz.ts +0 -22
- package/symbols/SPDT_switch_vert.ts +0 -20
- package/symbols/SPST_switch_horz.ts +0 -12
- package/symbols/SPST_switch_vert.ts +0 -20
- package/symbols/ac_voltmeter_horz.ts +0 -31
- package/symbols/ac_voltmeter_vert.ts +0 -8
- package/symbols/avalanche_diode_horz.ts +0 -19
- package/symbols/avalanche_diode_vert.ts +0 -10
- package/symbols/battery_horz.ts +0 -20
- package/symbols/battery_vert.ts +0 -6
- package/symbols/boxresistor_down.ts +0 -33
- package/symbols/boxresistor_left.ts +0 -33
- package/symbols/boxresistor_right.ts +0 -33
- package/symbols/boxresistor_up.ts +0 -33
- package/symbols/capacitor_down.ts +0 -34
- package/symbols/capacitor_left.ts +0 -11
- package/symbols/capacitor_polarized_down.ts +0 -34
- package/symbols/capacitor_polarized_left.ts +0 -10
- package/symbols/capacitor_polarized_right.ts +0 -10
- package/symbols/capacitor_polarized_up.ts +0 -34
- package/symbols/capacitor_right.ts +0 -10
- package/symbols/capacitor_up.ts +0 -34
- package/symbols/constant_current_diode_horz.ts +0 -9
- package/symbols/constant_current_diode_vert.ts +0 -11
- package/symbols/crystal_4pin_horz.ts +0 -11
- package/symbols/crystal_4pin_vert.ts +0 -10
- package/symbols/crystal_horz.ts +0 -9
- package/symbols/crystal_vert.ts +0 -10
- package/symbols/darlington_pair_transistor_horz.ts +0 -10
- package/symbols/darlington_pair_transistor_vert.ts +0 -12
- package/symbols/dc_ammeter_horz.ts +0 -32
- package/symbols/dc_ammeter_vert.ts +0 -51
- package/symbols/dc_voltmeter_horz.ts +0 -31
- package/symbols/dc_voltmeter_vert.ts +0 -19
- package/symbols/diac_horz.ts +0 -9
- package/symbols/diac_vert.ts +0 -16
- package/symbols/diode_down.ts +0 -4
- package/symbols/diode_left.ts +0 -4
- package/symbols/diode_right.ts +0 -9
- package/symbols/diode_up.ts +0 -4
- package/symbols/dpdt_switch_horz.ts +0 -26
- package/symbols/dpdt_switch_vert.ts +0 -20
- package/symbols/dpst_switch_horz.ts +0 -23
- package/symbols/dpst_switch_vert.ts +0 -20
- package/symbols/filled_diode_horz.ts +0 -9
- package/symbols/filled_diode_vert.ts +0 -4
- package/symbols/frequency_meter_horz.ts +0 -32
- package/symbols/frequency_meter_vert.ts +0 -19
- package/symbols/fuse_horz.ts +0 -24
- package/symbols/fuse_vert.ts +0 -4
- package/symbols/ground_horz.ts +0 -37
- package/symbols/ground_vert.ts +0 -4
- package/symbols/gunn_diode_horz.ts +0 -11
- package/symbols/gunn_diode_vert.ts +0 -11
- package/symbols/icled_down.ts +0 -4
- package/symbols/icled_left.ts +0 -4
- package/symbols/icled_right.ts +0 -11
- package/symbols/icled_up.ts +0 -27
- package/symbols/igbt_transistor_horz.ts +0 -10
- package/symbols/igbt_transistor_vert.ts +0 -21
- package/symbols/illuminated_push_button_normally_open_horz.ts +0 -9
- package/symbols/illuminated_push_button_normally_open_vert.ts +0 -20
- package/symbols/inductor_down.ts +0 -4
- package/symbols/inductor_left.ts +0 -4
- package/symbols/inductor_right.ts +0 -20
- package/symbols/inductor_up.ts +0 -4
- package/symbols/laser_diode_horz.ts +0 -10
- package/symbols/laser_diode_vert.ts +0 -13
- package/symbols/led_down.ts +0 -4
- package/symbols/led_left.ts +0 -4
- package/symbols/led_right.ts +0 -20
- package/symbols/led_up.ts +0 -27
- package/symbols/light_dependent_resistor_horz.ts +0 -20
- package/symbols/light_dependent_resistor_vert.ts +0 -20
- package/symbols/mosfet_depletion_normally_on_horz.ts +0 -19
- package/symbols/mosfet_depletion_normally_on_vert.ts +0 -21
- package/symbols/mushroom_head_normally_open_momentary_horz.ts +0 -20
- package/symbols/mushroom_head_normally_open_momentary_vert.ts +0 -23
- package/symbols/n_channel_d_mosfet_transistor_horz.ts +0 -20
- package/symbols/n_channel_d_mosfet_transistor_vert.ts +0 -20
- package/symbols/n_channel_e_mosfet_transistor_horz.ts +0 -21
- package/symbols/n_channel_e_mosfet_transistor_vert.ts +0 -20
- package/symbols/njfet_transistor_horz.ts +0 -20
- package/symbols/njfet_transistor_vert.ts +0 -20
- package/symbols/npn_bipolar_transistor_horz.ts +0 -11
- package/symbols/npn_bipolar_transistor_vert.ts +0 -21
- package/symbols/opamp_no_power_down.ts +0 -4
- package/symbols/opamp_no_power_left.ts +0 -4
- package/symbols/opamp_no_power_right.ts +0 -10
- package/symbols/opamp_no_power_up.ts +0 -4
- package/symbols/opamp_with_power_down.ts +0 -4
- package/symbols/opamp_with_power_left.ts +0 -4
- package/symbols/opamp_with_power_right.ts +0 -12
- package/symbols/opamp_with_power_up.ts +0 -4
- package/symbols/p_channel_d_mosfet_transistor_horz.ts +0 -20
- package/symbols/p_channel_d_mosfet_transistor_vert.ts +0 -20
- package/symbols/p_channel_e_mosfet_transistor_horz.ts +0 -20
- package/symbols/p_channel_e_mosfet_transistor_vert.ts +0 -20
- package/symbols/photodiode_horz.ts +0 -9
- package/symbols/photodiode_vert.ts +0 -13
- package/symbols/pjfet_transistor_horz.ts +0 -20
- package/symbols/pjfet_transistor_vert.ts +0 -20
- package/symbols/pnp_bipolar_transistor_horz.ts +0 -10
- package/symbols/pnp_bipolar_transistor_vert.ts +0 -20
- package/symbols/potentiometer2_horz.ts +0 -18
- package/symbols/potentiometer2_vert.ts +0 -14
- package/symbols/potentiometer3_down.ts +0 -4
- package/symbols/potentiometer3_left.ts +0 -4
- package/symbols/potentiometer3_right.ts +0 -10
- package/symbols/potentiometer3_up.ts +0 -4
- package/symbols/potentiometer_horz.ts +0 -18
- package/symbols/potentiometer_vert.ts +0 -6
- package/symbols/power_factor_meter_horz.ts +0 -42
- package/symbols/power_factor_meter_vert.ts +0 -19
- package/symbols/push_button_normally_closed_momentary_horz.ts +0 -20
- package/symbols/push_button_normally_closed_momentary_vert.ts +0 -4
- package/symbols/push_button_normally_open_momentary_horz.ts +0 -20
- package/symbols/push_button_normally_open_momentary_vert.ts +0 -4
- package/symbols/rectifier_diode_horz.ts +0 -21
- package/symbols/rectifier_diode_vert.ts +0 -17
- package/symbols/resonator_horz.ts +0 -34
- package/symbols/resonator_vert.ts +0 -4
- package/symbols/schottky_diode_horz.ts +0 -10
- package/symbols/schottky_diode_vert.ts +0 -18
- package/symbols/silicon_controlled_rectifier_horz.ts +0 -13
- package/symbols/silicon_controlled_rectifier_vert.ts +0 -15
- package/symbols/step_recovery_diode_horz.ts +0 -11
- package/symbols/step_recovery_diode_vert.ts +0 -4
- package/symbols/tachometer_horz.ts +0 -32
- package/symbols/tachometer_vert.ts +0 -19
- package/symbols/triac_horz.ts +0 -13
- package/symbols/triac_vert.ts +0 -16
- package/symbols/tunnel_diode_horz.ts +0 -19
- package/symbols/tunnel_diode_vert.ts +0 -18
- package/symbols/unijunction_transistor_horz.ts +0 -20
- package/symbols/unijunction_transistor_vert.ts +0 -19
- package/symbols/var_meter_horz.ts +0 -30
- package/symbols/var_meter_vert.ts +0 -4
- package/symbols/varactor_diode_horz.ts +0 -19
- package/symbols/varactor_diode_vert.ts +0 -18
- package/symbols/varistor_horz.ts +0 -24
- package/symbols/varistor_vert.ts +0 -4
- package/symbols/varmeter_horz.ts +0 -32
- package/symbols/varmeter_vert.ts +0 -19
- package/symbols/volt_meter_horz.ts +0 -10
- package/symbols/volt_meter_vert.ts +0 -4
- package/symbols/watt_hour_meter_horz.ts +0 -32
- package/symbols/watt_hour_meter_vert.ts +0 -19
- package/symbols/wattmeter_horz.ts +0 -32
- package/symbols/wattmeter_vert.ts +0 -19
- package/symbols/zener_diode_horz.ts +0 -19
- package/symbols/zener_diode_vert.ts +0 -17
package/drawing/rotateSymbol.ts
DELETED
@@ -1,324 +0,0 @@
|
|
1
|
-
import { rotate, applyToPoint, transform, scale } from "transformation-matrix"
|
2
|
-
import type {
|
3
|
-
SchSymbol,
|
4
|
-
Primitive,
|
5
|
-
Point,
|
6
|
-
Port,
|
7
|
-
NinePointAnchor,
|
8
|
-
} from "./types"
|
9
|
-
import { getBoundsOfPrimitives } from "./utils/getBoundsOfPrimitives"
|
10
|
-
|
11
|
-
// Update rotateAnchor to handle all anchor rotations based on orientation
|
12
|
-
const rotateRightFacingAnchor = (
|
13
|
-
anchor: NinePointAnchor,
|
14
|
-
newOrientation: "up" | "down" | "left" | "right" = "right",
|
15
|
-
): NinePointAnchor => {
|
16
|
-
switch (newOrientation) {
|
17
|
-
case "down":
|
18
|
-
switch (anchor) {
|
19
|
-
case "middle_top":
|
20
|
-
return "middle_right"
|
21
|
-
case "middle_bottom":
|
22
|
-
return "middle_left"
|
23
|
-
case "middle_left":
|
24
|
-
return "middle_bottom"
|
25
|
-
case "middle_right":
|
26
|
-
return "middle_top"
|
27
|
-
}
|
28
|
-
break
|
29
|
-
case "up":
|
30
|
-
switch (anchor) {
|
31
|
-
case "middle_top":
|
32
|
-
return "middle_left"
|
33
|
-
case "middle_bottom":
|
34
|
-
return "middle_right"
|
35
|
-
case "middle_left":
|
36
|
-
return "middle_top"
|
37
|
-
case "middle_right":
|
38
|
-
return "middle_bottom"
|
39
|
-
}
|
40
|
-
break
|
41
|
-
case "left":
|
42
|
-
switch (anchor) {
|
43
|
-
case "middle_top":
|
44
|
-
return "middle_bottom"
|
45
|
-
case "middle_bottom":
|
46
|
-
return "middle_top"
|
47
|
-
case "middle_left":
|
48
|
-
return "middle_right"
|
49
|
-
case "middle_right":
|
50
|
-
return "middle_left"
|
51
|
-
}
|
52
|
-
break
|
53
|
-
case "right":
|
54
|
-
return anchor // No change if orientation is "right"
|
55
|
-
}
|
56
|
-
return anchor
|
57
|
-
}
|
58
|
-
|
59
|
-
export const flipSymbolOverXAxis = (
|
60
|
-
symbol: SchSymbol,
|
61
|
-
overrides?: Partial<SchSymbol>,
|
62
|
-
): SchSymbol => {
|
63
|
-
const { primitives, center, ports, size } = symbol
|
64
|
-
const transformMatrix = transform({
|
65
|
-
a: 1,
|
66
|
-
b: 0,
|
67
|
-
c: 0,
|
68
|
-
d: -1,
|
69
|
-
e: 0,
|
70
|
-
f: 2 * center.y,
|
71
|
-
})
|
72
|
-
|
73
|
-
const flippedPrimitives = primitives.map((primitive): Primitive => {
|
74
|
-
primitive = { ...primitive }
|
75
|
-
switch (primitive.type) {
|
76
|
-
case "path":
|
77
|
-
return {
|
78
|
-
...primitive,
|
79
|
-
points: primitive.points.map(
|
80
|
-
(point) => applyToPoint(transformMatrix, point) as Point,
|
81
|
-
),
|
82
|
-
}
|
83
|
-
case "text":
|
84
|
-
const flippedPoint = applyToPoint(transformMatrix, {
|
85
|
-
x: primitive.x,
|
86
|
-
y: primitive.y,
|
87
|
-
}) as Point
|
88
|
-
|
89
|
-
// Flip text anchors vertically
|
90
|
-
const anchorMap: Record<NinePointAnchor, NinePointAnchor> = {
|
91
|
-
top_left: "bottom_left",
|
92
|
-
top_right: "bottom_right",
|
93
|
-
bottom_left: "top_left",
|
94
|
-
bottom_right: "top_right",
|
95
|
-
center: "center",
|
96
|
-
middle_top: "middle_bottom",
|
97
|
-
middle_bottom: "middle_top",
|
98
|
-
middle_left: "middle_left",
|
99
|
-
middle_right: "middle_right",
|
100
|
-
}
|
101
|
-
|
102
|
-
return {
|
103
|
-
...primitive,
|
104
|
-
x: flippedPoint.x,
|
105
|
-
y: flippedPoint.y,
|
106
|
-
anchor: anchorMap[primitive.anchor],
|
107
|
-
}
|
108
|
-
case "circle":
|
109
|
-
case "box":
|
110
|
-
const flippedCenter = applyToPoint(transformMatrix, {
|
111
|
-
x: primitive.x,
|
112
|
-
y: primitive.y,
|
113
|
-
}) as Point
|
114
|
-
return {
|
115
|
-
...primitive,
|
116
|
-
x: flippedCenter.x,
|
117
|
-
y: flippedCenter.y,
|
118
|
-
}
|
119
|
-
}
|
120
|
-
})
|
121
|
-
|
122
|
-
const flippedPorts = ports.map(
|
123
|
-
(port): Port => ({
|
124
|
-
...port,
|
125
|
-
...(applyToPoint(transformMatrix, port) as Point),
|
126
|
-
}),
|
127
|
-
)
|
128
|
-
|
129
|
-
return {
|
130
|
-
primitives: flippedPrimitives,
|
131
|
-
center,
|
132
|
-
ports: flippedPorts,
|
133
|
-
size,
|
134
|
-
...overrides,
|
135
|
-
}
|
136
|
-
}
|
137
|
-
|
138
|
-
export const flipSymbolOverYAxis = (
|
139
|
-
symbol: SchSymbol,
|
140
|
-
overrides?: Partial<SchSymbol>,
|
141
|
-
): SchSymbol => {
|
142
|
-
const { primitives, center, ports, size } = symbol
|
143
|
-
const transformMatrix = transform({
|
144
|
-
a: -1,
|
145
|
-
b: 0,
|
146
|
-
c: 0,
|
147
|
-
d: 1,
|
148
|
-
e: 0,
|
149
|
-
f: 2 * center.x,
|
150
|
-
})
|
151
|
-
|
152
|
-
const flippedPrimitives = primitives.map((primitive): Primitive => {
|
153
|
-
primitive = { ...primitive }
|
154
|
-
switch (primitive.type) {
|
155
|
-
case "path":
|
156
|
-
return {
|
157
|
-
...primitive,
|
158
|
-
points: primitive.points.map(
|
159
|
-
(point) => applyToPoint(transformMatrix, point) as Point,
|
160
|
-
),
|
161
|
-
}
|
162
|
-
case "text":
|
163
|
-
const flippedPoint = applyToPoint(transformMatrix, {
|
164
|
-
x: primitive.x,
|
165
|
-
y: primitive.y,
|
166
|
-
}) as Point
|
167
|
-
|
168
|
-
// Flip text anchors horizontally
|
169
|
-
const anchorMap: Record<NinePointAnchor, NinePointAnchor> = {
|
170
|
-
top_left: "top_right",
|
171
|
-
top_right: "top_left",
|
172
|
-
bottom_left: "bottom_right",
|
173
|
-
bottom_right: "bottom_left",
|
174
|
-
center: "center",
|
175
|
-
middle_top: "middle_top",
|
176
|
-
middle_bottom: "middle_bottom",
|
177
|
-
middle_left: "middle_right",
|
178
|
-
middle_right: "middle_left",
|
179
|
-
}
|
180
|
-
|
181
|
-
return {
|
182
|
-
...primitive,
|
183
|
-
x: flippedPoint.x,
|
184
|
-
y: flippedPoint.y,
|
185
|
-
anchor: anchorMap[primitive.anchor],
|
186
|
-
}
|
187
|
-
case "circle":
|
188
|
-
case "box":
|
189
|
-
const flippedCenter = applyToPoint(transformMatrix, {
|
190
|
-
x: primitive.x,
|
191
|
-
y: primitive.y,
|
192
|
-
}) as Point
|
193
|
-
return {
|
194
|
-
...primitive,
|
195
|
-
x: flippedCenter.x,
|
196
|
-
y: flippedCenter.y,
|
197
|
-
}
|
198
|
-
}
|
199
|
-
})
|
200
|
-
|
201
|
-
const flippedPorts = ports.map(
|
202
|
-
(port): Port => ({
|
203
|
-
...port,
|
204
|
-
...(applyToPoint(transformMatrix, port) as Point),
|
205
|
-
}),
|
206
|
-
)
|
207
|
-
|
208
|
-
return {
|
209
|
-
primitives: flippedPrimitives,
|
210
|
-
center,
|
211
|
-
ports: flippedPorts,
|
212
|
-
size,
|
213
|
-
...overrides,
|
214
|
-
}
|
215
|
-
}
|
216
|
-
|
217
|
-
export const rotateRightFacingSymbol = (
|
218
|
-
symbol: SchSymbol,
|
219
|
-
opts: {
|
220
|
-
newOrientation?: "up" | "down" | "left" | "right"
|
221
|
-
overrides?: Partial<SchSymbol>
|
222
|
-
},
|
223
|
-
): SchSymbol => {
|
224
|
-
const { newOrientation, overrides } = opts
|
225
|
-
// Assuming the default orientation is "right"
|
226
|
-
const angleMap = {
|
227
|
-
up: Math.PI / 2,
|
228
|
-
right: 0,
|
229
|
-
down: -Math.PI / 2,
|
230
|
-
left: -Math.PI,
|
231
|
-
}
|
232
|
-
|
233
|
-
const transform = rotate(
|
234
|
-
newOrientation ? angleMap[newOrientation] : Math.PI / 2,
|
235
|
-
symbol.center.x,
|
236
|
-
symbol.center.y,
|
237
|
-
)
|
238
|
-
|
239
|
-
const { primitives, center, size, ports } = symbol
|
240
|
-
|
241
|
-
const rotatedPrimitives = primitives.map((primitive): Primitive => {
|
242
|
-
primitive = { ...primitive }
|
243
|
-
switch (primitive.type) {
|
244
|
-
case "path":
|
245
|
-
return {
|
246
|
-
...primitive,
|
247
|
-
points: primitive.points.map(
|
248
|
-
(point) => applyToPoint(transform, point) as Point,
|
249
|
-
),
|
250
|
-
}
|
251
|
-
case "text":
|
252
|
-
const rotatedPoint = applyToPoint(transform, {
|
253
|
-
x: primitive.x,
|
254
|
-
y: primitive.y,
|
255
|
-
}) as Point
|
256
|
-
|
257
|
-
primitive.anchor = rotateRightFacingAnchor(
|
258
|
-
primitive.anchor,
|
259
|
-
newOrientation ?? "right",
|
260
|
-
)
|
261
|
-
|
262
|
-
return {
|
263
|
-
...primitive,
|
264
|
-
x: rotatedPoint.x,
|
265
|
-
y: rotatedPoint.y,
|
266
|
-
}
|
267
|
-
case "circle":
|
268
|
-
const rotatedCenter = applyToPoint(transform, {
|
269
|
-
x: primitive.x,
|
270
|
-
y: primitive.y,
|
271
|
-
}) as Point
|
272
|
-
return {
|
273
|
-
...primitive,
|
274
|
-
x: rotatedCenter.x,
|
275
|
-
y: rotatedCenter.y,
|
276
|
-
}
|
277
|
-
case "box":
|
278
|
-
const rotatedCorner = applyToPoint(transform, {
|
279
|
-
x: primitive.x,
|
280
|
-
y: primitive.y,
|
281
|
-
}) as Point
|
282
|
-
return {
|
283
|
-
...primitive,
|
284
|
-
x: rotatedCorner.x,
|
285
|
-
y: rotatedCorner.y,
|
286
|
-
width: primitive.height,
|
287
|
-
height: primitive.width,
|
288
|
-
}
|
289
|
-
}
|
290
|
-
})
|
291
|
-
|
292
|
-
const rotatedPorts = ports.map(
|
293
|
-
(port): Port => ({
|
294
|
-
...port,
|
295
|
-
...(applyToPoint(transform, port) as Point),
|
296
|
-
}),
|
297
|
-
)
|
298
|
-
|
299
|
-
const bounds = getBoundsOfPrimitives(rotatedPrimitives)
|
300
|
-
|
301
|
-
return {
|
302
|
-
primitives: rotatedPrimitives,
|
303
|
-
center,
|
304
|
-
ports: rotatedPorts,
|
305
|
-
size: {
|
306
|
-
width: bounds.maxX - bounds.minX,
|
307
|
-
height: bounds.maxY - bounds.minY,
|
308
|
-
},
|
309
|
-
...overrides,
|
310
|
-
}
|
311
|
-
}
|
312
|
-
|
313
|
-
/**
|
314
|
-
* @deprecated use rotateRightFacingSymbol instead
|
315
|
-
*/
|
316
|
-
export const rotateSymbol = (
|
317
|
-
symbol: SchSymbol,
|
318
|
-
orientation: "up" | "down" | "left" | "right" = "down",
|
319
|
-
overrides: Partial<SchSymbol> = {},
|
320
|
-
): SchSymbol =>
|
321
|
-
rotateRightFacingSymbol(symbol, {
|
322
|
-
newOrientation: orientation,
|
323
|
-
overrides,
|
324
|
-
})
|
@@ -1,109 +0,0 @@
|
|
1
|
-
import type { Point } from "./types"
|
2
|
-
import { approximateArc } from "./arc"
|
3
|
-
import { approximateBezier } from "./cubicBezierCurveArc"
|
4
|
-
|
5
|
-
export function svgPathToPoints(pathString: string): Point[] {
|
6
|
-
const points: Point[] = []
|
7
|
-
const commands =
|
8
|
-
pathString.match(/[MmLlHhVvCcSsQqTtAaZz][^MmLlHhVvCcSsQqTtAaZz]*/g) || []
|
9
|
-
let currentX = 0
|
10
|
-
let currentY = 0
|
11
|
-
|
12
|
-
function addPoint(x: number, y: number) {
|
13
|
-
points.push({ x, y })
|
14
|
-
currentX = x
|
15
|
-
currentY = y
|
16
|
-
}
|
17
|
-
|
18
|
-
for (const command of commands) {
|
19
|
-
const type = command[0]
|
20
|
-
const args = command
|
21
|
-
.slice(1)
|
22
|
-
.trim()
|
23
|
-
.split(/[\s,]+/)
|
24
|
-
.map(Number.parseFloat)
|
25
|
-
|
26
|
-
switch (type.toUpperCase()) {
|
27
|
-
case "M":
|
28
|
-
addPoint(args[0], args[1])
|
29
|
-
break
|
30
|
-
case "L":
|
31
|
-
addPoint(args[0], args[1])
|
32
|
-
break
|
33
|
-
case "H":
|
34
|
-
addPoint(args[0], currentY)
|
35
|
-
break
|
36
|
-
case "V":
|
37
|
-
addPoint(currentX, args[0])
|
38
|
-
break
|
39
|
-
case "C": {
|
40
|
-
const [x1, y1, x2, y2, x, y] = args
|
41
|
-
|
42
|
-
// Approximate the cubic Bézier curve
|
43
|
-
const bezierPoints = approximateBezier(
|
44
|
-
{ x: currentX, y: currentY }, // Start point
|
45
|
-
{ x: x1, y: y1 }, // Control point 1
|
46
|
-
{ x: x2, y: y2 }, // Control point 2
|
47
|
-
{ x, y }, // End point
|
48
|
-
)
|
49
|
-
|
50
|
-
points.push(...bezierPoints)
|
51
|
-
addPoint(x, y) // Update the current position
|
52
|
-
break
|
53
|
-
}
|
54
|
-
case "Q":
|
55
|
-
// For Q command, we add both the control point and the end point
|
56
|
-
points.push({ x: args[0], y: args[1] }) // Control point
|
57
|
-
addPoint(args[2], args[3]) // End point
|
58
|
-
break
|
59
|
-
case "Z":
|
60
|
-
// Close path - no new point
|
61
|
-
break
|
62
|
-
case "A":
|
63
|
-
// For A command, we add the end point and intermediate points to approximate the arc
|
64
|
-
const [rx, ry, xAxisRotation, largeArcFlag, sweepFlag, x, y] = args
|
65
|
-
const arcPoints = approximateArc(
|
66
|
-
currentX,
|
67
|
-
currentY,
|
68
|
-
rx,
|
69
|
-
ry,
|
70
|
-
largeArcFlag,
|
71
|
-
sweepFlag,
|
72
|
-
x,
|
73
|
-
y,
|
74
|
-
)
|
75
|
-
arcPoints.forEach((point) => points.push(point))
|
76
|
-
addPoint(x, y)
|
77
|
-
break
|
78
|
-
// Add cases for other commands (S, T) if needed
|
79
|
-
default:
|
80
|
-
console.warn(`Unsupported SVG command: ${type}`)
|
81
|
-
}
|
82
|
-
|
83
|
-
// Handle relative commands
|
84
|
-
if (type === type.toLowerCase() && type !== "z" && type !== "a") {
|
85
|
-
if (type === "c") {
|
86
|
-
// For relative c, adjust both control points and end point
|
87
|
-
points[points.length - 3].x += currentX
|
88
|
-
points[points.length - 3].y += currentY
|
89
|
-
points[points.length - 2].x += currentX
|
90
|
-
points[points.length - 2].y += currentY
|
91
|
-
points[points.length - 1].x += currentX
|
92
|
-
points[points.length - 1].y += currentY
|
93
|
-
} else if (type === "q") {
|
94
|
-
// For relative q, adjust both control point and end point
|
95
|
-
points[points.length - 2].x += currentX
|
96
|
-
points[points.length - 2].y += currentY
|
97
|
-
points[points.length - 1].x += currentX
|
98
|
-
points[points.length - 1].y += currentY
|
99
|
-
} else {
|
100
|
-
points[points.length - 1].x += currentX
|
101
|
-
points[points.length - 1].y += currentY
|
102
|
-
}
|
103
|
-
currentX = points[points.length - 1].x
|
104
|
-
currentY = points[points.length - 1].y
|
105
|
-
}
|
106
|
-
}
|
107
|
-
|
108
|
-
return points
|
109
|
-
}
|
package/drawing/text.ts
DELETED
package/drawing/typeguards.ts
DELETED
@@ -1,155 +0,0 @@
|
|
1
|
-
import {
|
2
|
-
PathPrimitive,
|
3
|
-
TextPrimitive,
|
4
|
-
CirclePrimitive,
|
5
|
-
BoxPrimitive,
|
6
|
-
Primitive,
|
7
|
-
NinePointAnchor,
|
8
|
-
Point,
|
9
|
-
SchSymbol,
|
10
|
-
Port,
|
11
|
-
SvgData,
|
12
|
-
Bounds,
|
13
|
-
} from "./types"
|
14
|
-
|
15
|
-
// Basic types
|
16
|
-
function isPoint(value: any): value is Point {
|
17
|
-
return (
|
18
|
-
typeof value === "object" &&
|
19
|
-
value !== null &&
|
20
|
-
typeof value.x === "number" &&
|
21
|
-
typeof value.y === "number"
|
22
|
-
)
|
23
|
-
}
|
24
|
-
|
25
|
-
export function isNinePointAnchor(value: any): value is NinePointAnchor {
|
26
|
-
return [
|
27
|
-
"top_left",
|
28
|
-
"top_right",
|
29
|
-
"bottom_left",
|
30
|
-
"bottom_right",
|
31
|
-
"center",
|
32
|
-
"middle_top",
|
33
|
-
"middle_bottom",
|
34
|
-
"middle_left",
|
35
|
-
"middle_right",
|
36
|
-
].includes(value)
|
37
|
-
}
|
38
|
-
|
39
|
-
// Primitive types
|
40
|
-
export function isPathPrimitive(value: any): value is PathPrimitive {
|
41
|
-
return (
|
42
|
-
typeof value === "object" &&
|
43
|
-
value !== null &&
|
44
|
-
value.type === "path" &&
|
45
|
-
Array.isArray(value.points) &&
|
46
|
-
value.points.every(isPoint) &&
|
47
|
-
typeof value.color === "string"
|
48
|
-
)
|
49
|
-
}
|
50
|
-
|
51
|
-
export function isTextPrimitive(value: any): value is TextPrimitive {
|
52
|
-
return (
|
53
|
-
typeof value === "object" &&
|
54
|
-
value !== null &&
|
55
|
-
value.type === "text" &&
|
56
|
-
typeof value.text === "string" &&
|
57
|
-
typeof value.x === "number" &&
|
58
|
-
typeof value.y === "number" &&
|
59
|
-
isNinePointAnchor(value.anchor)
|
60
|
-
)
|
61
|
-
}
|
62
|
-
|
63
|
-
export function isCirclePrimitive(value: any): value is CirclePrimitive {
|
64
|
-
return (
|
65
|
-
typeof value === "object" &&
|
66
|
-
value !== null &&
|
67
|
-
value.type === "circle" &&
|
68
|
-
typeof value.x === "number" &&
|
69
|
-
typeof value.y === "number" &&
|
70
|
-
typeof value.radius === "number" &&
|
71
|
-
typeof value.fill === "boolean" &&
|
72
|
-
typeof value.color === "string"
|
73
|
-
)
|
74
|
-
}
|
75
|
-
|
76
|
-
export function isBoxPrimitive(value: any): value is BoxPrimitive {
|
77
|
-
return (
|
78
|
-
typeof value === "object" &&
|
79
|
-
value !== null &&
|
80
|
-
value.type === "box" &&
|
81
|
-
typeof value.x === "number" &&
|
82
|
-
typeof value.y === "number" &&
|
83
|
-
typeof value.width === "number" &&
|
84
|
-
typeof value.height === "number" &&
|
85
|
-
isNinePointAnchor(value.anchor)
|
86
|
-
)
|
87
|
-
}
|
88
|
-
|
89
|
-
export function isPrimitive(value: any): value is Primitive {
|
90
|
-
return (
|
91
|
-
isPathPrimitive(value) ||
|
92
|
-
isTextPrimitive(value) ||
|
93
|
-
isCirclePrimitive(value) ||
|
94
|
-
isBoxPrimitive(value)
|
95
|
-
)
|
96
|
-
}
|
97
|
-
|
98
|
-
// Complex types
|
99
|
-
export function isPort(value: any): value is Port {
|
100
|
-
return (
|
101
|
-
typeof value === "object" &&
|
102
|
-
value !== null &&
|
103
|
-
typeof value.x === "number" &&
|
104
|
-
typeof value.y === "number" &&
|
105
|
-
Array.isArray(value.labels) &&
|
106
|
-
value.labels.every((label: any) => typeof label === "string")
|
107
|
-
)
|
108
|
-
}
|
109
|
-
|
110
|
-
export function isSchSymbol(value: any): value is SchSymbol {
|
111
|
-
return (
|
112
|
-
typeof value === "object" &&
|
113
|
-
value !== null &&
|
114
|
-
Array.isArray(value.primitives) &&
|
115
|
-
value.primitives.every(isPrimitive) &&
|
116
|
-
isPoint(value.center) &&
|
117
|
-
Array.isArray(value.ports) &&
|
118
|
-
value.ports.every(isPort) &&
|
119
|
-
typeof value.size === "object" &&
|
120
|
-
value.size !== null &&
|
121
|
-
typeof value.size.width === "number" &&
|
122
|
-
typeof value.size.height === "number"
|
123
|
-
)
|
124
|
-
}
|
125
|
-
|
126
|
-
export function isBounds(value: any): value is Bounds {
|
127
|
-
return (
|
128
|
-
typeof value === "object" &&
|
129
|
-
value !== null &&
|
130
|
-
typeof value.minX === "number" &&
|
131
|
-
typeof value.maxX === "number" &&
|
132
|
-
typeof value.minY === "number" &&
|
133
|
-
typeof value.maxY === "number" &&
|
134
|
-
typeof value.width === "number" &&
|
135
|
-
typeof value.height === "number" &&
|
136
|
-
typeof value.centerX === "number" &&
|
137
|
-
typeof value.centerY === "number"
|
138
|
-
)
|
139
|
-
}
|
140
|
-
|
141
|
-
export function isSvgData(value: any): value is SvgData {
|
142
|
-
return (
|
143
|
-
typeof value === "object" &&
|
144
|
-
value !== null &&
|
145
|
-
typeof value.paths === "object" &&
|
146
|
-
Object.values(value.paths).every(isPathPrimitive) &&
|
147
|
-
typeof value.texts === "object" &&
|
148
|
-
Object.values(value.texts).every(isTextPrimitive) &&
|
149
|
-
typeof value.refblocks === "object" &&
|
150
|
-
Object.values(value.refblocks).every(isPoint) &&
|
151
|
-
isBounds(value.bounds) &&
|
152
|
-
typeof value.circles === "object" &&
|
153
|
-
Object.values(value.circles).every(isCirclePrimitive)
|
154
|
-
)
|
155
|
-
}
|
package/drawing/types.ts
DELETED
@@ -1,93 +0,0 @@
|
|
1
|
-
export interface Point {
|
2
|
-
x: number
|
3
|
-
y: number
|
4
|
-
}
|
5
|
-
|
6
|
-
export interface Port {
|
7
|
-
x: number
|
8
|
-
y: number
|
9
|
-
labels: string[]
|
10
|
-
}
|
11
|
-
|
12
|
-
export interface PathPrimitive {
|
13
|
-
type: "path"
|
14
|
-
fill?: boolean
|
15
|
-
points: Point[]
|
16
|
-
color: string
|
17
|
-
closed?: boolean
|
18
|
-
}
|
19
|
-
|
20
|
-
export interface TextPrimitive {
|
21
|
-
type: "text"
|
22
|
-
text: string
|
23
|
-
fontSize?: number
|
24
|
-
x: number
|
25
|
-
y: number
|
26
|
-
anchor: NinePointAnchor
|
27
|
-
}
|
28
|
-
|
29
|
-
export interface CirclePrimitive {
|
30
|
-
type: "circle"
|
31
|
-
x: number
|
32
|
-
y: number
|
33
|
-
radius: number
|
34
|
-
fill: boolean
|
35
|
-
color: string
|
36
|
-
}
|
37
|
-
|
38
|
-
export interface BoxPrimitive {
|
39
|
-
type: "box"
|
40
|
-
x: number
|
41
|
-
y: number
|
42
|
-
width: number
|
43
|
-
height: number
|
44
|
-
anchor: string
|
45
|
-
}
|
46
|
-
|
47
|
-
export type Primitive =
|
48
|
-
| PathPrimitive
|
49
|
-
| TextPrimitive
|
50
|
-
| CirclePrimitive
|
51
|
-
| BoxPrimitive
|
52
|
-
|
53
|
-
export interface SchSymbol {
|
54
|
-
primitives: Primitive[]
|
55
|
-
center: Point
|
56
|
-
ports: Port[]
|
57
|
-
size: {
|
58
|
-
width: number
|
59
|
-
height: number
|
60
|
-
}
|
61
|
-
}
|
62
|
-
|
63
|
-
export type Bounds = {
|
64
|
-
minX: number
|
65
|
-
maxX: number
|
66
|
-
minY: number
|
67
|
-
maxY: number
|
68
|
-
width: number
|
69
|
-
height: number
|
70
|
-
centerX: number
|
71
|
-
centerY: number
|
72
|
-
}
|
73
|
-
|
74
|
-
export interface SvgData {
|
75
|
-
paths: Record<string, PathPrimitive>
|
76
|
-
texts: Record<string, TextPrimitive>
|
77
|
-
refblocks: Record<string, Point>
|
78
|
-
bounds: Bounds
|
79
|
-
circles: Record<string, CirclePrimitive>
|
80
|
-
}
|
81
|
-
|
82
|
-
export type SvgAnchor = "start" | "middle" | "end"
|
83
|
-
|
84
|
-
export type NinePointAnchor =
|
85
|
-
| "top_left"
|
86
|
-
| "top_right"
|
87
|
-
| "bottom_left"
|
88
|
-
| "bottom_right"
|
89
|
-
| "center"
|
90
|
-
| "middle_top"
|
91
|
-
| "middle_bottom"
|
92
|
-
| "middle_left"
|
93
|
-
| "middle_right"
|