schematic-symbols 0.0.112 → 0.0.113
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/index.js +88 -13
- package/dist/index.js.map +1 -1
- package/drawing/defineSymbol.ts +13 -2
- package/drawing/getSvg.ts +29 -1
- package/drawing/modify-symbol/modify-symbol.ts +11 -5
- package/drawing/rotateSymbol.ts +5 -8
- package/drawing/utils/getBoundsOfPrimitives.ts +51 -0
- package/package.json +1 -1
- package/symbols/boxresistor_down.ts +0 -1
- package/symbols/boxresistor_left.ts +0 -1
- package/symbols/boxresistor_right.ts +0 -1
- package/symbols/boxresistor_up.ts +0 -1
package/drawing/defineSymbol.ts
CHANGED
@@ -1,5 +1,16 @@
|
|
1
1
|
import type { SchSymbol } from "./types"
|
2
|
+
import { getBoundsOfPrimitives } from "./utils/getBoundsOfPrimitives"
|
2
3
|
|
3
|
-
export function defineSymbol(
|
4
|
-
|
4
|
+
export function defineSymbol(
|
5
|
+
symbol: Omit<SchSymbol, "size"> & Partial<Pick<SchSymbol, "size">>,
|
6
|
+
): SchSymbol {
|
7
|
+
let size = symbol.size
|
8
|
+
if (!size) {
|
9
|
+
const bounds = getBoundsOfPrimitives(symbol.primitives)
|
10
|
+
size = {
|
11
|
+
width: bounds.maxX - bounds.minX,
|
12
|
+
height: bounds.maxY - bounds.minY,
|
13
|
+
}
|
14
|
+
}
|
15
|
+
return { ...symbol, size }
|
5
16
|
}
|
package/drawing/getSvg.ts
CHANGED
@@ -137,7 +137,35 @@ export function getInnerSvg(
|
|
137
137
|
|
138
138
|
const centerDiamond = createDiamondElement(symbol.center)
|
139
139
|
|
140
|
-
|
140
|
+
const debugElements = []
|
141
|
+
if (debug) {
|
142
|
+
const topLeft = {
|
143
|
+
x: symbol.center.x - size.width / 2,
|
144
|
+
y: symbol.center.y - size.height / 2,
|
145
|
+
}
|
146
|
+
debugElements.push(
|
147
|
+
`<text x="${topLeft.x}" y="${topLeft.y}" style="font: 0.05px monospace; fill: #833;">${size.width.toFixed(2)} x ${size.height.toFixed(2)}</text>`,
|
148
|
+
)
|
149
|
+
|
150
|
+
// Show all available port labels
|
151
|
+
ports.forEach((port, i) => {
|
152
|
+
if (port.labels.length > 1) {
|
153
|
+
const alternateLabels = port.labels.slice(1).join(", ")
|
154
|
+
debugElements.push(
|
155
|
+
`<text x="${topLeft.x}" y="${topLeft.y - (i + 1) * 0.05}" dy="-0.15" style="font: 0.05px monospace; fill: #833;">${port.labels[0]} [${alternateLabels}]</text>`,
|
156
|
+
)
|
157
|
+
}
|
158
|
+
})
|
159
|
+
|
160
|
+
debugElements.push(...debugElements)
|
161
|
+
}
|
162
|
+
|
163
|
+
return [
|
164
|
+
svgElements.join("\n "),
|
165
|
+
portElements,
|
166
|
+
centerDiamond,
|
167
|
+
...debugElements,
|
168
|
+
].join("\n")
|
141
169
|
}
|
142
170
|
|
143
171
|
export function getSvg(
|
@@ -1,5 +1,6 @@
|
|
1
1
|
import { NinePointAnchor, SchSymbol } from "drawing/types"
|
2
2
|
import { rotateRightFacingSymbol } from "drawing/rotateSymbol"
|
3
|
+
import { getBoundsOfPrimitives } from "drawing/utils/getBoundsOfPrimitives"
|
3
4
|
|
4
5
|
interface ModifySymbolBuilder {
|
5
6
|
changeTextAnchor(
|
@@ -18,6 +19,7 @@ class SymbolModifier implements ModifySymbolBuilder {
|
|
18
19
|
|
19
20
|
constructor(symbol: SchSymbol) {
|
20
21
|
this.symbol = JSON.parse(JSON.stringify(symbol))
|
22
|
+
this.symbol.size = this.computeSize()
|
21
23
|
}
|
22
24
|
|
23
25
|
changeTextAnchor(
|
@@ -60,8 +62,16 @@ class SymbolModifier implements ModifySymbolBuilder {
|
|
60
62
|
return this
|
61
63
|
}
|
62
64
|
|
65
|
+
computeSize(): { width: number; height: number } {
|
66
|
+
const bounds = getBoundsOfPrimitives(this.symbol.primitives)
|
67
|
+
return {
|
68
|
+
width: bounds.maxX - bounds.minX,
|
69
|
+
height: bounds.maxY - bounds.minY,
|
70
|
+
}
|
71
|
+
}
|
72
|
+
|
63
73
|
build(): SchSymbol {
|
64
|
-
return this.symbol
|
74
|
+
return { ...this.symbol, size: this.computeSize() }
|
65
75
|
}
|
66
76
|
}
|
67
77
|
|
@@ -83,9 +93,5 @@ export const modifySymbol = (symbol: any): ModifySymbolBuilder => {
|
|
83
93
|
x: symbol.bounds.centerX,
|
84
94
|
y: symbol.bounds.centerY,
|
85
95
|
},
|
86
|
-
size: symbol.size ?? {
|
87
|
-
width: symbol.bounds.width,
|
88
|
-
height: symbol.bounds.height,
|
89
|
-
},
|
90
96
|
})
|
91
97
|
}
|
package/drawing/rotateSymbol.ts
CHANGED
@@ -6,6 +6,7 @@ import type {
|
|
6
6
|
Port,
|
7
7
|
NinePointAnchor,
|
8
8
|
} from "./types"
|
9
|
+
import { getBoundsOfPrimitives } from "./utils/getBoundsOfPrimitives"
|
9
10
|
|
10
11
|
// Update rotateAnchor to handle all anchor rotations based on orientation
|
11
12
|
const rotateRightFacingAnchor = (
|
@@ -295,19 +296,15 @@ export const rotateRightFacingSymbol = (
|
|
295
296
|
}),
|
296
297
|
)
|
297
298
|
|
299
|
+
const bounds = getBoundsOfPrimitives(rotatedPrimitives)
|
300
|
+
|
298
301
|
return {
|
299
302
|
primitives: rotatedPrimitives,
|
300
303
|
center,
|
301
304
|
ports: rotatedPorts,
|
302
305
|
size: {
|
303
|
-
width:
|
304
|
-
|
305
|
-
? size.width
|
306
|
-
: size.height,
|
307
|
-
height:
|
308
|
-
newOrientation === "up" || newOrientation === "down"
|
309
|
-
? size.height
|
310
|
-
: size.width,
|
306
|
+
width: bounds.maxX - bounds.minX,
|
307
|
+
height: bounds.maxY - bounds.minY,
|
311
308
|
},
|
312
309
|
...overrides,
|
313
310
|
}
|
@@ -0,0 +1,51 @@
|
|
1
|
+
import { Primitive, Point } from "../types"
|
2
|
+
|
3
|
+
export function getBoundsOfPrimitives(primitives: Primitive[]): {
|
4
|
+
minX: number
|
5
|
+
maxX: number
|
6
|
+
minY: number
|
7
|
+
maxY: number
|
8
|
+
} {
|
9
|
+
if (primitives.length === 0) {
|
10
|
+
return { minX: 0, maxX: 0, minY: 0, maxY: 0 }
|
11
|
+
}
|
12
|
+
|
13
|
+
let minX = Infinity
|
14
|
+
let maxX = -Infinity
|
15
|
+
let minY = Infinity
|
16
|
+
let maxY = -Infinity
|
17
|
+
|
18
|
+
const updateBounds = (point: Point) => {
|
19
|
+
minX = Math.min(minX, point.x)
|
20
|
+
maxX = Math.max(maxX, point.x)
|
21
|
+
minY = Math.min(minY, point.y)
|
22
|
+
maxY = Math.max(maxY, point.y)
|
23
|
+
}
|
24
|
+
|
25
|
+
primitives.forEach((primitive) => {
|
26
|
+
switch (primitive.type) {
|
27
|
+
case "path":
|
28
|
+
primitive.points.forEach(updateBounds)
|
29
|
+
break
|
30
|
+
case "text":
|
31
|
+
updateBounds({ x: primitive.x, y: primitive.y })
|
32
|
+
break
|
33
|
+
case "circle": {
|
34
|
+
const { x, y, radius } = primitive
|
35
|
+
updateBounds({ x: x - radius, y: y - radius })
|
36
|
+
updateBounds({ x: x + radius, y: y + radius })
|
37
|
+
break
|
38
|
+
}
|
39
|
+
case "box": {
|
40
|
+
const { x, y, width, height } = primitive
|
41
|
+
const halfWidth = width / 2
|
42
|
+
const halfHeight = height / 2
|
43
|
+
updateBounds({ x: x - halfWidth, y: y - halfHeight })
|
44
|
+
updateBounds({ x: x + halfWidth, y: y + halfHeight })
|
45
|
+
break
|
46
|
+
}
|
47
|
+
}
|
48
|
+
})
|
49
|
+
|
50
|
+
return { minX, maxX, minY, maxY }
|
51
|
+
}
|
package/package.json
CHANGED
@@ -23,7 +23,6 @@ export default modifySymbol({
|
|
23
23
|
{ ...refblocks.left1, labels: ["1"] }, // TODO add more "standard" labels
|
24
24
|
{ ...refblocks.right1, labels: ["2"] }, // TODO add more "standard" labels
|
25
25
|
],
|
26
|
-
size: { width: bounds.width, height: bounds.height },
|
27
26
|
center: { x: bounds.centerX, y: bounds.centerY },
|
28
27
|
})
|
29
28
|
.changeTextAnchor("{VAL}", "middle_bottom")
|
@@ -23,7 +23,6 @@ export default modifySymbol({
|
|
23
23
|
{ ...refblocks.left1, labels: ["1"] }, // TODO add more "standard" labels
|
24
24
|
{ ...refblocks.right1, labels: ["2"] }, // TODO add more "standard" labels
|
25
25
|
],
|
26
|
-
size: { width: bounds.width, height: bounds.height },
|
27
26
|
center: { x: bounds.centerX, y: bounds.centerY },
|
28
27
|
})
|
29
28
|
.changeTextAnchor("{VAL}", "middle_top")
|
@@ -23,7 +23,6 @@ export default modifySymbol({
|
|
23
23
|
{ ...refblocks.left1, labels: ["1"] }, // TODO add more "standard" labels
|
24
24
|
{ ...refblocks.right1, labels: ["2"] }, // TODO add more "standard" labels
|
25
25
|
],
|
26
|
-
size: { width: bounds.width, height: bounds.height },
|
27
26
|
center: { x: bounds.centerX, y: bounds.centerY },
|
28
27
|
})
|
29
28
|
.changeTextAnchor("{VAL}", "middle_top")
|
@@ -23,7 +23,6 @@ export default modifySymbol({
|
|
23
23
|
{ ...refblocks.left1, labels: ["1"] }, // TODO add more "standard" labels
|
24
24
|
{ ...refblocks.right1, labels: ["2"] }, // TODO add more "standard" labels
|
25
25
|
],
|
26
|
-
size: { width: bounds.width, height: bounds.height },
|
27
26
|
center: { x: bounds.centerX, y: bounds.centerY },
|
28
27
|
})
|
29
28
|
.changeTextAnchor("{VAL}", "middle_bottom")
|