schematic-symbols 0.0.95 → 0.0.97

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,4 +1,4 @@
1
- import { rotate, applyToPoint } from "transformation-matrix"
1
+ import { rotate, applyToPoint, transform, scale } from "transformation-matrix"
2
2
  import type {
3
3
  SchSymbol,
4
4
  Primitive,
@@ -55,6 +55,164 @@ const rotateAnchor = (
55
55
  return anchor
56
56
  }
57
57
 
58
+ export const flipSymbolOverXAxis = (
59
+ symbol: SchSymbol,
60
+ overrides?: Partial<SchSymbol>,
61
+ ): SchSymbol => {
62
+ const { primitives, center, ports, size } = symbol
63
+ const transformMatrix = transform({
64
+ a: 1,
65
+ b: 0,
66
+ c: 0,
67
+ d: -1,
68
+ e: 0,
69
+ f: 2 * center.y,
70
+ })
71
+
72
+ const flippedPrimitives = primitives.map((primitive): Primitive => {
73
+ primitive = { ...primitive }
74
+ switch (primitive.type) {
75
+ case "path":
76
+ return {
77
+ ...primitive,
78
+ points: primitive.points.map(
79
+ (point) => applyToPoint(transformMatrix, point) as Point,
80
+ ),
81
+ }
82
+ case "text":
83
+ const flippedPoint = applyToPoint(transformMatrix, {
84
+ x: primitive.x,
85
+ y: primitive.y,
86
+ }) as Point
87
+
88
+ // Flip text anchors vertically
89
+ const anchorMap: Record<NinePointAnchor, NinePointAnchor> = {
90
+ top_left: "bottom_left",
91
+ top_right: "bottom_right",
92
+ bottom_left: "top_left",
93
+ bottom_right: "top_right",
94
+ center: "center",
95
+ middle_top: "middle_bottom",
96
+ middle_bottom: "middle_top",
97
+ middle_left: "middle_left",
98
+ middle_right: "middle_right",
99
+ }
100
+
101
+ return {
102
+ ...primitive,
103
+ x: flippedPoint.x,
104
+ y: flippedPoint.y,
105
+ anchor: anchorMap[primitive.anchor],
106
+ }
107
+ case "circle":
108
+ case "box":
109
+ const flippedCenter = applyToPoint(transformMatrix, {
110
+ x: primitive.x,
111
+ y: primitive.y,
112
+ }) as Point
113
+ return {
114
+ ...primitive,
115
+ x: flippedCenter.x,
116
+ y: flippedCenter.y,
117
+ }
118
+ }
119
+ })
120
+
121
+ const flippedPorts = ports.map(
122
+ (port): Port => ({
123
+ ...port,
124
+ ...(applyToPoint(transformMatrix, port) as Point),
125
+ }),
126
+ )
127
+
128
+ return {
129
+ primitives: flippedPrimitives,
130
+ center,
131
+ ports: flippedPorts,
132
+ size,
133
+ ...overrides,
134
+ }
135
+ }
136
+
137
+ export const flipSymbolOverYAxis = (
138
+ symbol: SchSymbol,
139
+ overrides?: Partial<SchSymbol>,
140
+ ): SchSymbol => {
141
+ const { primitives, center, ports, size } = symbol
142
+ const transformMatrix = transform({
143
+ a: -1,
144
+ b: 0,
145
+ c: 0,
146
+ d: 1,
147
+ e: 0,
148
+ f: 2 * center.x,
149
+ })
150
+
151
+ const flippedPrimitives = primitives.map((primitive): Primitive => {
152
+ primitive = { ...primitive }
153
+ switch (primitive.type) {
154
+ case "path":
155
+ return {
156
+ ...primitive,
157
+ points: primitive.points.map(
158
+ (point) => applyToPoint(transformMatrix, point) as Point,
159
+ ),
160
+ }
161
+ case "text":
162
+ const flippedPoint = applyToPoint(transformMatrix, {
163
+ x: primitive.x,
164
+ y: primitive.y,
165
+ }) as Point
166
+
167
+ // Flip text anchors horizontally
168
+ const anchorMap: Record<NinePointAnchor, NinePointAnchor> = {
169
+ top_left: "top_right",
170
+ top_right: "top_left",
171
+ bottom_left: "bottom_right",
172
+ bottom_right: "bottom_left",
173
+ center: "center",
174
+ middle_top: "middle_top",
175
+ middle_bottom: "middle_bottom",
176
+ middle_left: "middle_right",
177
+ middle_right: "middle_left",
178
+ }
179
+
180
+ return {
181
+ ...primitive,
182
+ x: flippedPoint.x,
183
+ y: flippedPoint.y,
184
+ anchor: anchorMap[primitive.anchor],
185
+ }
186
+ case "circle":
187
+ case "box":
188
+ const flippedCenter = applyToPoint(transformMatrix, {
189
+ x: primitive.x,
190
+ y: primitive.y,
191
+ }) as Point
192
+ return {
193
+ ...primitive,
194
+ x: flippedCenter.x,
195
+ y: flippedCenter.y,
196
+ }
197
+ }
198
+ })
199
+
200
+ const flippedPorts = ports.map(
201
+ (port): Port => ({
202
+ ...port,
203
+ ...(applyToPoint(transformMatrix, port) as Point),
204
+ }),
205
+ )
206
+
207
+ return {
208
+ primitives: flippedPrimitives,
209
+ center,
210
+ ports: flippedPorts,
211
+ size,
212
+ ...overrides,
213
+ }
214
+ }
215
+
58
216
  export const rotateSymbol = (
59
217
  symbol: SchSymbol,
60
218
  orientation?: "up" | "down" | "left" | "right",
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "schematic-symbols",
3
3
  "main": "./dist/index.js",
4
- "version": "0.0.95",
4
+ "version": "0.0.97",
5
5
  "type": "module",
6
6
  "files": [
7
7
  "dist",
@@ -1,4 +1,4 @@
1
- import { rotateSymbol } from "drawing/rotateSymbol"
1
+ import { flipSymbolOverYAxis, rotateSymbol } from "drawing/rotateSymbol"
2
2
  import led_right from "./led_right"
3
3
 
4
- export default rotateSymbol(led_right, "left")
4
+ export default flipSymbolOverYAxis(led_right)
package/symbols/led_up.ts CHANGED
@@ -1,4 +1,27 @@
1
1
  import { rotateSymbol } from "drawing/rotateSymbol"
2
2
  import led_right from "./led_right"
3
3
 
4
- export default rotateSymbol(led_right, "up")
4
+ const baseSymbol = rotateSymbol(led_right, "up")
5
+
6
+ // Flip path25-0 and path78 over X axis
7
+ const modifiedSymbol = {
8
+ ...baseSymbol,
9
+ primitives: baseSymbol.primitives.map((primitive) => {
10
+ if (
11
+ primitive.type === "path" &&
12
+ (primitive.points.length === 3 || primitive.points.length === 4)
13
+ ) {
14
+ // This matches both the triangle shape (path25-0) and path78
15
+ return {
16
+ ...primitive,
17
+ points: primitive.points.map((point) => ({
18
+ x: point.x,
19
+ y: -point.y + 2 * baseSymbol.center.y,
20
+ })),
21
+ }
22
+ }
23
+ return primitive
24
+ }),
25
+ }
26
+
27
+ export default modifiedSymbol
@@ -6,8 +6,8 @@ const { paths, texts, bounds, refblocks } = svgJson
6
6
  export default defineSymbol({
7
7
  primitives: [
8
8
  ...Object.values(paths),
9
- { ...texts.bottom1, anchor: "middle_right" },
10
- { ...texts.top1, anchor: "middle_left" },
9
+ { ...texts.bottom1, anchor: "middle_top" },
10
+ { ...texts.top1, anchor: "middle_bottom" },
11
11
  ] as any,
12
12
  ports: [
13
13
  { ...refblocks.left1, labels: ["1"] }, // TODO add more "standard" labels
@@ -1,4 +1,14 @@
1
1
  import { rotateSymbol } from "drawing/rotateSymbol"
2
2
  import potentiometer2_horz from "./potentiometer2_horz"
3
3
 
4
- export default rotateSymbol(potentiometer2_horz)
4
+ const rotated = rotateSymbol(potentiometer2_horz)
5
+
6
+ const texts = rotated.primitives.filter((p) => p.type === "text")!
7
+
8
+ const val = texts.find((t) => t.text === "{VAL}")!
9
+ val.anchor = "middle_right"
10
+
11
+ const ref = texts.find((t) => t.text === "{REF}")!
12
+ ref.anchor = "middle_left"
13
+
14
+ export default rotated