scada-engine 1.0.0

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 (120) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +193 -0
  3. package/dist/draco/gltf/draco_decoder.js +33 -0
  4. package/dist/draco/gltf/draco_decoder.wasm +0 -0
  5. package/dist/draco/gltf/draco_encoder.js +33 -0
  6. package/dist/draco/gltf/draco_wasm_wrapper.js +116 -0
  7. package/dist/index.d.ts +3 -0
  8. package/dist/scada-engine.css +1 -0
  9. package/dist/scada-engine.es.js +22936 -0
  10. package/dist/scada-engine.umd.js +1356 -0
  11. package/dist/src/features/canvas/components/CanvasArea.d.ts +4 -0
  12. package/dist/src/features/canvas/components/CanvasConfigPanel.d.ts +2 -0
  13. package/dist/src/features/canvas/index.d.ts +9 -0
  14. package/dist/src/features/canvas/managers/configWatcher.d.ts +49 -0
  15. package/dist/src/features/canvas/managers/dataHandler.d.ts +70 -0
  16. package/dist/src/features/canvas/managers/layerManager.d.ts +88 -0
  17. package/dist/src/features/canvas/operations/edgeOperations.d.ts +52 -0
  18. package/dist/src/features/canvas/operations/graphOperations.d.ts +85 -0
  19. package/dist/src/features/canvas/operations/nodeOperations.d.ts +77 -0
  20. package/dist/src/features/data-source/components/DataSourceDialog.d.ts +26 -0
  21. package/dist/src/features/data-source/components/MappingConfigurator.d.ts +27 -0
  22. package/dist/src/features/data-source/index.d.ts +14 -0
  23. package/dist/src/features/data-source/services/dataBindingService.d.ts +86 -0
  24. package/dist/src/features/data-source/services/dataParser.d.ts +110 -0
  25. package/dist/src/features/data-source/services/dataSourceManager.d.ts +127 -0
  26. package/dist/src/features/data-source/services/httpService.d.ts +73 -0
  27. package/dist/src/features/data-source/services/mqttService.d.ts +110 -0
  28. package/dist/src/features/data-source/services/sseService.d.ts +75 -0
  29. package/dist/src/features/data-source/services/websocketService.d.ts +67 -0
  30. package/dist/src/features/data-source/types/dataAdapter.d.ts +184 -0
  31. package/dist/src/features/data-source/types/device.d.ts +131 -0
  32. package/dist/src/features/preview/Preview.d.ts +2 -0
  33. package/dist/src/features/preview/components/NodeTooltip.d.ts +62 -0
  34. package/dist/src/features/preview/index.d.ts +1 -0
  35. package/dist/src/features/property-panel/PropertyPanel.d.ts +45 -0
  36. package/dist/src/features/property-panel/cards/BindingCard.d.ts +39 -0
  37. package/dist/src/features/property-panel/cards/EventCard.d.ts +63 -0
  38. package/dist/src/features/property-panel/index.d.ts +6 -0
  39. package/dist/src/features/property-panel/tabs/BasicPropertiesTab.d.ts +51 -0
  40. package/dist/src/features/property-panel/tabs/DataPropertiesTab.d.ts +24 -0
  41. package/dist/src/features/property-panel/tabs/EdgePropertiesTab.d.ts +22 -0
  42. package/dist/src/features/workflow/WorkflowDialog.d.ts +37 -0
  43. package/dist/src/features/workflow/WorkflowEditor.d.ts +38 -0
  44. package/dist/src/features/workflow/components/AddNodeMenu.d.ts +32 -0
  45. package/dist/src/features/workflow/components/ElementSelector.d.ts +37 -0
  46. package/dist/src/features/workflow/components/PropertyPanel.d.ts +27 -0
  47. package/dist/src/features/workflow/components/WorkflowToolbar.d.ts +24 -0
  48. package/dist/src/features/workflow/components/node-configs/ClearTimerConfig.d.ts +20 -0
  49. package/dist/src/features/workflow/components/node-configs/ConditionConfig.d.ts +20 -0
  50. package/dist/src/features/workflow/components/node-configs/CustomCodeConfig.d.ts +20 -0
  51. package/dist/src/features/workflow/components/node-configs/GetPropertyConfig.d.ts +20 -0
  52. package/dist/src/features/workflow/components/node-configs/HttpRequestConfig.d.ts +20 -0
  53. package/dist/src/features/workflow/components/node-configs/SetPropertyConfig.d.ts +20 -0
  54. package/dist/src/features/workflow/components/node-configs/TimerConfig.d.ts +20 -0
  55. package/dist/src/features/workflow/config/nodeConfigRegistry.d.ts +5 -0
  56. package/dist/src/features/workflow/index.d.ts +6 -0
  57. package/dist/src/features/workflow/services/canvasElementService.d.ts +31 -0
  58. package/dist/src/features/workflow/types/element.d.ts +16 -0
  59. package/dist/src/features/workflow/types/node.d.ts +70 -0
  60. package/dist/src/index.d.ts +161 -0
  61. package/dist/src/main.d.ts +1 -0
  62. package/dist/src/scada-components/canvas/config.d.ts +17 -0
  63. package/dist/src/scada-components/canvas/index.d.ts +6 -0
  64. package/dist/src/scada-components/canvas/manager.d.ts +95 -0
  65. package/dist/src/scada-components/canvas/types.d.ts +77 -0
  66. package/dist/src/scada-components/chart/echarts-gauge/EChartsGauge.d.ts +14 -0
  67. package/dist/src/scada-components/chart/echarts-gauge/index.d.ts +6 -0
  68. package/dist/src/scada-components/chart/echarts-gauge/presets.d.ts +18 -0
  69. package/dist/src/scada-components/chart/echarts-line/EChartsLine.d.ts +14 -0
  70. package/dist/src/scada-components/chart/echarts-line/index.d.ts +6 -0
  71. package/dist/src/scada-components/chart/echarts-line/presets.d.ts +13 -0
  72. package/dist/src/scada-components/chart/index.d.ts +5 -0
  73. package/dist/src/scada-components/index.d.ts +7 -0
  74. package/dist/src/scada-components/registry.d.ts +117 -0
  75. package/dist/src/scada-components/types.d.ts +108 -0
  76. package/dist/src/shared/animation/animationEngine.d.ts +68 -0
  77. package/dist/src/shared/animation/animationScheduler.d.ts +85 -0
  78. package/dist/src/shared/animation/index.d.ts +2 -0
  79. package/dist/src/shared/components/ComponentLibrary.d.ts +34 -0
  80. package/dist/src/shared/components/ContextMenu.d.ts +63 -0
  81. package/dist/src/shared/components/Footer.d.ts +41 -0
  82. package/dist/src/shared/components/Header.d.ts +73 -0
  83. package/dist/src/shared/components/dialogs/AttributeConfigDialog.d.ts +39 -0
  84. package/dist/src/shared/components/dialogs/CustomCodeDialog.d.ts +30 -0
  85. package/dist/src/shared/components/dialogs/WorkflowSelectorDialog.d.ts +15 -0
  86. package/dist/src/shared/components/index.d.ts +8 -0
  87. package/dist/src/shared/components/selectors/ComponentPointSelector.d.ts +29 -0
  88. package/dist/src/shared/managers/contextMenuManager.d.ts +27 -0
  89. package/dist/src/shared/managers/eventManager.d.ts +62 -0
  90. package/dist/src/shared/managers/index.d.ts +3 -0
  91. package/dist/src/shared/managers/workerManager.d.ts +57 -0
  92. package/dist/src/shared/types/binding.d.ts +75 -0
  93. package/dist/src/shared/types/index.d.ts +2 -0
  94. package/dist/src/shared/types/workflow.d.ts +195 -0
  95. package/dist/src/shared/utils/commonUtils.d.ts +83 -0
  96. package/dist/src/shared/utils/edgeAnimationUtils.d.ts +16 -0
  97. package/dist/src/shared/utils/eventUtils.d.ts +43 -0
  98. package/dist/src/shared/utils/fileUtils.d.ts +43 -0
  99. package/dist/src/shared/utils/index.d.ts +7 -0
  100. package/dist/src/shared/utils/messageUtils.d.ts +56 -0
  101. package/dist/src/shared/utils/nodePropertyUtils.d.ts +33 -0
  102. package/dist/src/shared/utils/storageUtils.d.ts +32 -0
  103. package/dist/src/svg/core/index.d.ts +7 -0
  104. package/dist/src/svg/core/loader.d.ts +71 -0
  105. package/dist/src/svg/core/parser.d.ts +41 -0
  106. package/dist/src/svg/core/types.d.ts +297 -0
  107. package/dist/src/svg/helpers/demo.d.ts +20 -0
  108. package/dist/src/svg/helpers/index.d.ts +5 -0
  109. package/dist/src/svg/helpers/utils.d.ts +25 -0
  110. package/dist/src/svg/index.d.ts +9 -0
  111. package/dist/src/svg/rendering/SVGRenderer.d.ts +22 -0
  112. package/dist/src/svg/rendering/animationTemplates.d.ts +82 -0
  113. package/dist/src/svg/rendering/index.d.ts +6 -0
  114. package/dist/src/utils/authCrypto.d.ts +16 -0
  115. package/dist/src/utils/dracoLoader.d.ts +3 -0
  116. package/dist/src/utils/index.d.ts +29 -0
  117. package/dist/src/utils/viewportCulling.d.ts +63 -0
  118. package/dist/src/workers/dataProcessor.worker.d.ts +21 -0
  119. package/dist/utils-Ncgt7Dqu.js +1057 -0
  120. package/package.json +85 -0
@@ -0,0 +1,1057 @@
1
+ import { svgLoader as l } from "./scada-engine.es.js";
2
+ /*!
3
+ * @nywqs/scada-engine v1.1.31
4
+ * Copyright (c) 2025 leoncheng
5
+ * Licensed under proprietary license - see LICENSE file
6
+ * Contact: nywqs@outlook.com
7
+ */
8
+ const a = `<?xml version="1.0" encoding="UTF-8"?>
9
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 80 80">
10
+ <metadata>
11
+ <scada-config><![CDATA[
12
+ {
13
+ "component": {
14
+ "id": "circle",
15
+ "name": "\\u5706\\u5f62",
16
+ "category": "basic",
17
+ "icon": "\\u25CB",
18
+ "description": "\\u57fa\\u7840\\u5706\\u5f62\\u56fe\\u5f62\\u7ec4\\u4ef6",
19
+ "version": "1.0.0",
20
+ "author": "SCADA Engine"
21
+ },
22
+ "size": {
23
+ "width": 80,
24
+ "height": 80
25
+ },
26
+ "presetBindings": [
27
+ {
28
+ "partId": "part-label",
29
+ "suggestedDriverProperty": "text",
30
+ "label": "\\u663e\\u793a\\u6587\\u672c",
31
+ "valueType": "string",
32
+ "suggestedTemplate": "value-text",
33
+ "suggestedParams": {
34
+ "type": "value-text",
35
+ "defaultText": "\\u5706\\u5f62"
36
+ }
37
+ },
38
+ {
39
+ "partId": "part-body",
40
+ "suggestedDriverProperty": "fill",
41
+ "label": "\\u586b\\u5145\\u8272",
42
+ "valueType": "color",
43
+ "suggestedTemplate": "status-color",
44
+ "suggestedParams": {
45
+ "type": "status-color",
46
+ "colorMap": {},
47
+ "defaultColor": "#10b981",
48
+ "applyTo": "fill"
49
+ }
50
+ }
51
+ ],
52
+ "ports": [
53
+ { "id": "port-top", "group": "top" },
54
+ { "id": "port-right", "group": "right" },
55
+ { "id": "port-bottom", "group": "bottom" },
56
+ { "id": "port-left", "group": "left" }
57
+ ]
58
+ }
59
+ ]]></scada-config>
60
+ </metadata>
61
+ <defs>
62
+ <radialGradient id="circle-gradient" cx="30%" cy="30%">
63
+ <stop offset="0%" stop-color="#34d399" />
64
+ <stop offset="100%" stop-color="#10b981" />
65
+ </radialGradient>
66
+ </defs>
67
+ <g id="root">
68
+ <circle
69
+ id="part-body"
70
+ cx="40"
71
+ cy="40"
72
+ r="35"
73
+ fill="url(#circle-gradient)"
74
+ stroke="#059669"
75
+ stroke-width="2"
76
+ />
77
+ <text
78
+ id="part-label"
79
+ x="40"
80
+ y="40"
81
+ text-anchor="middle"
82
+ dominant-baseline="middle"
83
+ font-size="14"
84
+ fill="#ffffff"
85
+ font-family="system-ui, sans-serif"
86
+ >\\u5706\\u5f62</text>
87
+ </g>
88
+ </svg>
89
+ `, s = `<?xml version="1.0" encoding="UTF-8"?>\r
90
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">\r
91
+ <!-- 组件元数据 -->\r
92
+ <metadata>\r
93
+ <scada-config><![CDATA[\r
94
+ {\r
95
+ "component": {\r
96
+ "id": "light-bulb",\r
97
+ "name": "灯泡",\r
98
+ "category": "iot",\r
99
+ "icon": "💡",\r
100
+ "description": "可控制开关状态和颜色的灯泡组件",\r
101
+ "version": "1.0.0",\r
102
+ "author": "SCADA Engine"\r
103
+ },\r
104
+ "size": {\r
105
+ "width": 100,\r
106
+ "height": 120\r
107
+ },\r
108
+ "presetBindings": [\r
109
+ {\r
110
+ "partId": "part-bulbGlow",\r
111
+ "suggestedDriverProperty": "state",\r
112
+ "label": "开关状态",\r
113
+ "valueType": "boolean",\r
114
+ "booleanOptions": [\r
115
+ { "value": 0, "label": "关闭" },\r
116
+ { "value": 1, "label": "开启" }\r
117
+ ],\r
118
+ "suggestedTemplate": "value-opacity",\r
119
+ "suggestedParams": {\r
120
+ "type": "value-opacity",\r
121
+ "inputRange": { "min": 0, "max": 1 },\r
122
+ "outputRange": { "min": 0, "max": 1 }\r
123
+ }\r
124
+ },\r
125
+ {\r
126
+ "partId": "part-outerGlow",\r
127
+ "suggestedDriverProperty": "state",\r
128
+ "label": "开关状态",\r
129
+ "valueType": "boolean",\r
130
+ "booleanOptions": [\r
131
+ { "value": 0, "label": "关闭" },\r
132
+ { "value": 1, "label": "开启" }\r
133
+ ],\r
134
+ "suggestedTemplate": "value-opacity",\r
135
+ "suggestedParams": {\r
136
+ "type": "value-opacity",\r
137
+ "inputRange": { "min": 0, "max": 1 },\r
138
+ "outputRange": { "min": 0, "max": 0.3 }\r
139
+ }\r
140
+ },\r
141
+ {\r
142
+ "partId": "part-filament",\r
143
+ "suggestedDriverProperty": "state",\r
144
+ "label": "开关状态",\r
145
+ "valueType": "boolean",\r
146
+ "booleanOptions": [\r
147
+ { "value": 0, "label": "关闭" },\r
148
+ { "value": 1, "label": "开启" }\r
149
+ ],\r
150
+ "suggestedTemplate": "value-opacity",\r
151
+ "suggestedParams": {\r
152
+ "type": "value-opacity",\r
153
+ "inputRange": { "min": 0, "max": 1 },\r
154
+ "outputRange": { "min": 0, "max": 0.8 }\r
155
+ }\r
156
+ }\r
157
+ ],\r
158
+ "ports": [\r
159
+ {\r
160
+ "id": "port-power-in",\r
161
+ "group": "bottom"\r
162
+ },\r
163
+ {\r
164
+ "id": "port-control",\r
165
+ "group": "left",\r
166
+ "args": {\r
167
+ "y": "50%"\r
168
+ }\r
169
+ }\r
170
+ ]\r
171
+ }\r
172
+ ]]></scada-config>\r
173
+ </metadata>\r
174
+ \r
175
+ <!-- 渐变定义 -->\r
176
+ <defs>\r
177
+ <!-- 灯泡玻璃渐变(关闭状态) -->\r
178
+ <radialGradient id="bulb-gradient-off" cx="40%" cy="30%">\r
179
+ <stop offset="0%" stop-color="#e5e7eb" />\r
180
+ <stop offset="50%" stop-color="#d1d5db" />\r
181
+ <stop offset="100%" stop-color="#9ca3af" />\r
182
+ </radialGradient>\r
183
+ \r
184
+ <!-- 灯泡玻璃渐变(开启状态) -->\r
185
+ <radialGradient id="bulb-gradient-on" cx="40%" cy="30%">\r
186
+ <stop offset="0%" stop-color="#fff9e6" />\r
187
+ <stop offset="50%" stop-color="#fbbf24" />\r
188
+ <stop offset="100%" stop-color="#d97706" />\r
189
+ </radialGradient>\r
190
+ \r
191
+ <!-- 灯泡底座渐变 -->\r
192
+ <linearGradient id="base-gradient" x1="0%" y1="0%" x2="0%" y2="100%">\r
193
+ <stop offset="0%" stop-color="#94a3b8" />\r
194
+ <stop offset="50%" stop-color="#64748b" />\r
195
+ <stop offset="100%" stop-color="#475569" />\r
196
+ </linearGradient>\r
197
+ \r
198
+ <!-- 光晕滤镜 -->\r
199
+ <filter id="glow-filter">\r
200
+ <feGaussianBlur stdDeviation="3" result="coloredBlur"/>\r
201
+ <feMerge>\r
202
+ <feMergeNode in="coloredBlur"/>\r
203
+ <feMergeNode in="SourceGraphic"/>\r
204
+ </feMerge>\r
205
+ </filter>\r
206
+ \r
207
+ <!-- 外发光滤镜 -->\r
208
+ <filter id="outer-glow-filter">\r
209
+ <feGaussianBlur stdDeviation="5" result="blur"/>\r
210
+ <feFlood flood-color="#fbbf24" flood-opacity="0.6" result="color"/>\r
211
+ <feComposite in="color" in2="blur" operator="in" result="glow"/>\r
212
+ <feMerge>\r
213
+ <feMergeNode in="glow"/>\r
214
+ <feMergeNode in="SourceGraphic"/>\r
215
+ </feMerge>\r
216
+ </filter>\r
217
+ </defs>\r
218
+ \r
219
+ <!-- 组件主体 -->\r
220
+ <g id="root">\r
221
+ <!-- 外发光(根据状态控制透明度) -->\r
222
+ <circle \r
223
+ id="part-outerGlow"\r
224
+ cx="50" \r
225
+ cy="35" \r
226
+ r="32"\r
227
+ fill="#fbbf24"\r
228
+ opacity="0"\r
229
+ filter="url(#outer-glow-filter)"\r
230
+ />\r
231
+ \r
232
+ <!-- 灯泡玻璃球体 -->\r
233
+ <ellipse\r
234
+ cx="50"\r
235
+ cy="35"\r
236
+ rx="25"\r
237
+ ry="28"\r
238
+ fill="url(#bulb-gradient-off)"\r
239
+ stroke="#cbd5e1"\r
240
+ stroke-width="0.5"\r
241
+ />\r
242
+ \r
243
+ <!-- 灯泡发光层(根据状态控制) -->\r
244
+ <ellipse\r
245
+ id="part-bulbGlow"\r
246
+ cx="50"\r
247
+ cy="35"\r
248
+ rx="25"\r
249
+ ry="28"\r
250
+ fill="url(#bulb-gradient-on)"\r
251
+ opacity="0"\r
252
+ filter="url(#glow-filter)"\r
253
+ />\r
254
+ \r
255
+ <!-- 灯泡高光 -->\r
256
+ <ellipse\r
257
+ cx="42"\r
258
+ cy="25"\r
259
+ rx="8"\r
260
+ ry="10"\r
261
+ fill="#ffffff"\r
262
+ opacity="0.3"\r
263
+ />\r
264
+ \r
265
+ <!-- 灯丝(根据状态显示) -->\r
266
+ <g id="part-filament" opacity="0">\r
267
+ <path\r
268
+ d="M 45 30 Q 47 35 45 40"\r
269
+ stroke="#ff9500"\r
270
+ stroke-width="1.5"\r
271
+ fill="none"\r
272
+ />\r
273
+ <path\r
274
+ d="M 55 30 Q 53 35 55 40"\r
275
+ stroke="#ff9500"\r
276
+ stroke-width="1.5"\r
277
+ fill="none"\r
278
+ />\r
279
+ </g>\r
280
+ \r
281
+ <!-- 灯泡底部连接部分 -->\r
282
+ <ellipse\r
283
+ cx="50"\r
284
+ cy="60"\r
285
+ rx="15"\r
286
+ ry="4"\r
287
+ fill="#94a3b8"\r
288
+ />\r
289
+ \r
290
+ <!-- 灯泡螺纹底座 -->\r
291
+ <g>\r
292
+ <!-- 螺纹线条 -->\r
293
+ <rect x="40" y="63" width="20" height="3" fill="url(#base-gradient)" rx="1"/>\r
294
+ <rect x="40" y="67" width="20" height="3" fill="url(#base-gradient)" rx="1"/>\r
295
+ <rect x="40" y="71" width="20" height="3" fill="url(#base-gradient)" rx="1"/>\r
296
+ <rect x="40" y="75" width="20" height="3" fill="url(#base-gradient)" rx="1"/>\r
297
+ \r
298
+ <!-- 螺纹阴影 -->\r
299
+ <rect x="40" y="66" width="20" height="1" fill="#1e293b" opacity="0.3"/>\r
300
+ <rect x="40" y="70" width="20" height="1" fill="#1e293b" opacity="0.3"/>\r
301
+ <rect x="40" y="74" width="20" height="1" fill="#1e293b" opacity="0.3"/>\r
302
+ <rect x="40" y="78" width="20" height="1" fill="#1e293b" opacity="0.3"/>\r
303
+ </g>\r
304
+ \r
305
+ <!-- 底座 -->\r
306
+ <ellipse\r
307
+ cx="50"\r
308
+ cy="80"\r
309
+ rx="12"\r
310
+ ry="5"\r
311
+ fill="url(#base-gradient)"\r
312
+ />\r
313
+ \r
314
+ <!-- 底座底部 -->\r
315
+ <ellipse\r
316
+ cx="50"\r
317
+ cy="83"\r
318
+ rx="8"\r
319
+ ry="3"\r
320
+ fill="#334155"\r
321
+ />\r
322
+ \r
323
+ <!-- 底部接触点 -->\r
324
+ <circle\r
325
+ cx="50"\r
326
+ cy="85"\r
327
+ r="2"\r
328
+ fill="#475569"\r
329
+ />\r
330
+ </g>\r
331
+ </svg>\r
332
+ `, d = `<?xml version="1.0" encoding="UTF-8"?>
333
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 120 60">
334
+ <metadata>
335
+ <scada-config><![CDATA[
336
+ {
337
+ "component": {
338
+ "id": "rect",
339
+ "name": "\\u77e9\\u5f62",
340
+ "category": "basic",
341
+ "icon": "\\u25A2",
342
+ "description": "\\u57fa\\u7840\\u77e9\\u5f62\\u56fe\\u5f62\\u7ec4\\u4ef6",
343
+ "version": "1.0.0",
344
+ "author": "SCADA Engine"
345
+ },
346
+ "size": {
347
+ "width": 120,
348
+ "height": 60
349
+ },
350
+ "presetBindings": [
351
+ {
352
+ "partId": "part-label",
353
+ "suggestedDriverProperty": "name",
354
+ "label": "\\u663e\\u793a\\u6587\\u672c",
355
+ "valueType": "string",
356
+ "suggestedTemplate": "value-text",
357
+ "suggestedParams": {
358
+ "type": "value-text",
359
+ "defaultText": "\\u77e9\\u5f62"
360
+ }
361
+ },
362
+ {
363
+ "partId": "part-body",
364
+ "suggestedDriverProperty": "fill",
365
+ "label": "\\u586b\\u5145\\u8272",
366
+ "valueType": "color",
367
+ "suggestedTemplate": "status-color",
368
+ "suggestedParams": {
369
+ "type": "status-color",
370
+ "colorMap": {},
371
+ "defaultColor": "#3b82f6",
372
+ "applyTo": "fill"
373
+ }
374
+ }
375
+ ],
376
+ "ports": [
377
+ { "id": "port-top", "group": "top" },
378
+ { "id": "port-right", "group": "right" },
379
+ { "id": "port-bottom", "group": "bottom" },
380
+ { "id": "port-left", "group": "left" }
381
+ ]
382
+ }
383
+ ]]></scada-config>
384
+ </metadata>
385
+ <defs>
386
+ <linearGradient id="rect-gradient" x1="0%" y1="0%" x2="0%" y2="100%">
387
+ <stop offset="0%" stop-color="#60a5fa" />
388
+ <stop offset="100%" stop-color="#3b82f6" />
389
+ </linearGradient>
390
+ </defs>
391
+ <g id="root">
392
+ <rect
393
+ id="part-body"
394
+ x="10"
395
+ y="10"
396
+ width="100"
397
+ height="40"
398
+ rx="4"
399
+ fill="url(#rect-gradient)"
400
+ stroke="#2563eb"
401
+ stroke-width="2"
402
+ />
403
+ <text
404
+ id="part-label"
405
+ x="60"
406
+ y="30"
407
+ text-anchor="middle"
408
+ dominant-baseline="middle"
409
+ font-size="14"
410
+ fill="#ffffff"
411
+ font-family="system-ui, sans-serif"
412
+ >\\u77e9\\u5f62</text>
413
+ </g>
414
+ </svg>
415
+ `, c = `<?xml version="1.0" encoding="UTF-8"?>\r
416
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 120 80">\r
417
+ <!-- 组件元数据 -->\r
418
+ <metadata>\r
419
+ <scada-config><![CDATA[\r
420
+ {\r
421
+ "component": {\r
422
+ "id": "switch-toggle",\r
423
+ "name": "拨动开关",\r
424
+ "category": "iot",\r
425
+ "icon": "🔘",\r
426
+ "description": "可控制开关状态的拨动开关组件",\r
427
+ "version": "1.0.0",\r
428
+ "author": "SCADA Engine"\r
429
+ },\r
430
+ "size": {\r
431
+ "width": 140,\r
432
+ "height": 100\r
433
+ },\r
434
+ "presetBindings": [\r
435
+ {\r
436
+ "partId": "part-handle",\r
437
+ "suggestedDriverProperty": "state",\r
438
+ "label": "开关状态",\r
439
+ "valueType": "boolean",\r
440
+ "booleanOptions": [\r
441
+ { "value": 0, "label": "关闭" },\r
442
+ { "value": 1, "label": "开启" }\r
443
+ ],\r
444
+ "suggestedTemplate": "value-position",\r
445
+ "suggestedParams": {\r
446
+ "type": "value-position",\r
447
+ "inputRange": { "min": 0, "max": 1 },\r
448
+ "movement": {\r
449
+ "axis": "x",\r
450
+ "distance": 24\r
451
+ }\r
452
+ }\r
453
+ },\r
454
+ {\r
455
+ "partId": "part-indicatorOff",\r
456
+ "suggestedDriverProperty": "state",\r
457
+ "label": "开关状态",\r
458
+ "valueType": "boolean",\r
459
+ "booleanOptions": [\r
460
+ { "value": 0, "label": "关闭" },\r
461
+ { "value": 1, "label": "开启" }\r
462
+ ],\r
463
+ "suggestedTemplate": "value-opacity",\r
464
+ "suggestedParams": {\r
465
+ "type": "value-opacity",\r
466
+ "inputRange": { "min": 0, "max": 1 },\r
467
+ "outputRange": { "min": 1, "max": 0 }\r
468
+ }\r
469
+ },\r
470
+ {\r
471
+ "partId": "part-indicatorOn",\r
472
+ "suggestedDriverProperty": "state",\r
473
+ "label": "开关状态",\r
474
+ "valueType": "boolean",\r
475
+ "booleanOptions": [\r
476
+ { "value": 0, "label": "关闭" },\r
477
+ { "value": 1, "label": "开启" }\r
478
+ ],\r
479
+ "suggestedTemplate": "value-opacity",\r
480
+ "suggestedParams": {\r
481
+ "type": "value-opacity",\r
482
+ "inputRange": { "min": 0, "max": 1 },\r
483
+ "outputRange": { "min": 0, "max": 1 }\r
484
+ }\r
485
+ }\r
486
+ ],\r
487
+ "ports": [\r
488
+ {\r
489
+ "id": "port-power-in",\r
490
+ "group": "left",\r
491
+ "args": {\r
492
+ "y": "50%"\r
493
+ }\r
494
+ },\r
495
+ {\r
496
+ "id": "port-power-out",\r
497
+ "group": "right",\r
498
+ "args": {\r
499
+ "y": "50%"\r
500
+ }\r
501
+ },\r
502
+ {\r
503
+ "id": "port-control",\r
504
+ "group": "bottom"\r
505
+ }\r
506
+ ]\r
507
+ }\r
508
+ ]]></scada-config>\r
509
+ </metadata>\r
510
+ \r
511
+ <!-- 渐变定义 -->\r
512
+ <defs>\r
513
+ <!-- 开关底座渐变 -->\r
514
+ <linearGradient id="base-gradient-switch" x1="0%" y1="0%" x2="0%" y2="100%">\r
515
+ <stop offset="0%" stop-color="#475569" />\r
516
+ <stop offset="50%" stop-color="#334155" />\r
517
+ <stop offset="100%" stop-color="#1e293b" />\r
518
+ </linearGradient>\r
519
+ \r
520
+ <!-- 开关轨道渐变 -->\r
521
+ <linearGradient id="track-gradient-switch" x1="0%" y1="0%" x2="0%" y2="100%">\r
522
+ <stop offset="0%" stop-color="#1e293b" />\r
523
+ <stop offset="50%" stop-color="#0f172a" />\r
524
+ <stop offset="100%" stop-color="#1e293b" />\r
525
+ </linearGradient>\r
526
+ \r
527
+ <!-- 拨杆渐变 -->\r
528
+ <linearGradient id="handle-gradient-switch" x1="0%" y1="0%" x2="0%" y2="100%">\r
529
+ <stop offset="0%" stop-color="#e2e8f0" />\r
530
+ <stop offset="50%" stop-color="#cbd5e1" />\r
531
+ <stop offset="100%" stop-color="#94a3b8" />\r
532
+ </linearGradient>\r
533
+ \r
534
+ <!-- 指示灯光晕 -->\r
535
+ <filter id="indicator-glow-switch">\r
536
+ <feGaussianBlur stdDeviation="3" result="coloredBlur"/>\r
537
+ <feMerge>\r
538
+ <feMergeNode in="coloredBlur"/>\r
539
+ <feMergeNode in="SourceGraphic"/>\r
540
+ </feMerge>\r
541
+ </filter>\r
542
+ </defs>\r
543
+ \r
544
+ <!-- 组件主体 -->\r
545
+ <g id="root">\r
546
+ <!-- 底座 -->\r
547
+ <rect x="20" y="25" width="80" height="50" rx="8" fill="url(#base-gradient-switch)" stroke="#0f172a" stroke-width="1"/>\r
548
+ \r
549
+ <!-- 固定螺丝 -->\r
550
+ <g>\r
551
+ <circle cx="30" cy="35" r="3" fill="#0f172a"/>\r
552
+ <circle cx="30" cy="35" r="1.5" fill="#475569"/>\r
553
+ <line x1="28" y1="35" x2="32" y2="35" stroke="#1e293b" stroke-width="0.5"/>\r
554
+ \r
555
+ <circle cx="90" cy="35" r="3" fill="#0f172a"/>\r
556
+ <circle cx="90" cy="35" r="1.5" fill="#475569"/>\r
557
+ <line x1="88" y1="35" x2="92" y2="35" stroke="#1e293b" stroke-width="0.5"/>\r
558
+ \r
559
+ <circle cx="30" cy="65" r="3" fill="#0f172a"/>\r
560
+ <circle cx="30" cy="65" r="1.5" fill="#475569"/>\r
561
+ <line x1="28" y1="65" x2="32" y2="65" stroke="#1e293b" stroke-width="0.5"/>\r
562
+ \r
563
+ <circle cx="90" cy="65" r="3" fill="#0f172a"/>\r
564
+ <circle cx="90" cy="65" r="1.5" fill="#475569"/>\r
565
+ <line x1="88" y1="65" x2="92" y2="65" stroke="#1e293b" stroke-width="0.5"/>\r
566
+ </g>\r
567
+ \r
568
+ <!-- 开关轨道槽 -->\r
569
+ <rect x="40" y="38" width="40" height="24" rx="12" fill="url(#track-gradient-switch)" stroke="#0f172a" stroke-width="1"/>\r
570
+ \r
571
+ <!-- OFF标记 -->\r
572
+ <text x="48" y="53" font-size="8" fill="#64748b" text-anchor="middle" font-weight="bold">OFF</text>\r
573
+ \r
574
+ <!-- ON标记 -->\r
575
+ <text x="72" y="53" font-size="8" fill="#64748b" text-anchor="middle" font-weight="bold">ON</text>\r
576
+ \r
577
+ <!-- 拨杆(可移动部分,基准位置 48px,value-position 动画叠加 0~24px) -->\r
578
+ <g transform="translate(48, 0)">\r
579
+ <g id="part-handle">\r
580
+ <!-- 拨杆阴影 -->\r
581
+ <ellipse cx="0" cy="52" rx="10" ry="3" fill="#000" opacity="0.3"/>\r
582
+ \r
583
+ <!-- 拨杆主体 -->\r
584
+ <rect x="-8" y="40" width="16" height="20" rx="8" fill="url(#handle-gradient-switch)" stroke="#94a3b8" stroke-width="1"/>\r
585
+ \r
586
+ <!-- 拨杆纹理 -->\r
587
+ <g opacity="0.3">\r
588
+ <line x1="-4" y1="43" x2="-4" y2="57" stroke="#64748b" stroke-width="0.5"/>\r
589
+ <line x1="0" y1="43" x2="0" y2="57" stroke="#64748b" stroke-width="0.5"/>\r
590
+ <line x1="4" y1="43" x2="4" y2="57" stroke="#64748b" stroke-width="0.5"/>\r
591
+ </g>\r
592
+ \r
593
+ <!-- 拨杆高光 -->\r
594
+ <rect x="-6" y="42" width="4" height="8" rx="2" fill="#ffffff" opacity="0.4"/>\r
595
+ </g>\r
596
+ </g>\r
597
+ \r
598
+ <!-- 状态指示灯 -->\r
599
+ <g>\r
600
+ <!-- OFF指示灯 -->\r
601
+ <g id="part-indicatorOff">\r
602
+ <circle \r
603
+ cx="35" \r
604
+ cy="50" \r
605
+ r="3" \r
606
+ fill="#ef4444"\r
607
+ filter="url(#indicator-glow-switch)"\r
608
+ />\r
609
+ <circle \r
610
+ cx="35" \r
611
+ cy="50" \r
612
+ r="1.5" \r
613
+ fill="#ffffff"\r
614
+ opacity="0.6"\r
615
+ />\r
616
+ </g>\r
617
+ \r
618
+ <!-- ON指示灯 -->\r
619
+ <g id="part-indicatorOn" opacity="0">\r
620
+ <circle \r
621
+ cx="85" \r
622
+ cy="50" \r
623
+ r="3" \r
624
+ fill="#22c55e"\r
625
+ filter="url(#indicator-glow-switch)"\r
626
+ />\r
627
+ <circle \r
628
+ cx="85" \r
629
+ cy="50" \r
630
+ r="1.5" \r
631
+ fill="#ffffff"\r
632
+ opacity="0.6"\r
633
+ />\r
634
+ </g>\r
635
+ </g>\r
636
+ \r
637
+ <!-- 接线端子 -->\r
638
+ <g>\r
639
+ <rect x="15" y="47" width="8" height="6" rx="1" fill="#64748b" stroke="#475569" stroke-width="0.5"/>\r
640
+ <circle cx="19" cy="50" r="1.5" fill="#94a3b8"/>\r
641
+ \r
642
+ <rect x="97" y="47" width="8" height="6" rx="1" fill="#64748b" stroke="#475569" stroke-width="0.5"/>\r
643
+ <circle cx="101" cy="50" r="1.5" fill="#94a3b8"/>\r
644
+ </g>\r
645
+ \r
646
+ <!-- 型号标识 -->\r
647
+ <rect x="50" y="67" width="20" height="6" rx="1" fill="#0f172a" opacity="0.7"/>\r
648
+ <text x="60" y="71" font-size="3" fill="#64748b" text-anchor="middle" font-family="monospace">KCD1-101</text>\r
649
+ </g>\r
650
+ </svg>\r
651
+ `, g = `<?xml version="1.0" encoding="UTF-8"?>\r
652
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 120 160">\r
653
+ <!-- 组件元数据 -->\r
654
+ <metadata>\r
655
+ <scada-config><![CDATA[\r
656
+ {\r
657
+ "component": {\r
658
+ "id": "tank-level",\r
659
+ "name": "液位罐",\r
660
+ "category": "iot",\r
661
+ "icon": "🛢️",\r
662
+ "description": "带液位显示的储罐组件",\r
663
+ "version": "1.0.0",\r
664
+ "author": "SCADA Engine"\r
665
+ },\r
666
+ "size": {\r
667
+ "width": 120,\r
668
+ "height": 160\r
669
+ },\r
670
+ "presetBindings": [\r
671
+ {\r
672
+ "partId": "part-liquidFill",\r
673
+ "suggestedDriverProperty": "level",\r
674
+ "label": "液位",\r
675
+ "valueType": "number",\r
676
+ "suggestedTemplate": "level-height",\r
677
+ "suggestedParams": {\r
678
+ "type": "level-height",\r
679
+ "inputRange": { "min": 0, "max": 100 },\r
680
+ "direction": "bottom-up"\r
681
+ }\r
682
+ },\r
683
+ {\r
684
+ "partId": "part-alarmLight",\r
685
+ "suggestedDriverProperty": "alarm",\r
686
+ "label": "报警状态",\r
687
+ "valueType": "boolean",\r
688
+ "booleanOptions": [\r
689
+ { "value": 0, "label": "正常" },\r
690
+ { "value": 1, "label": "报警" }\r
691
+ ],\r
692
+ "suggestedTemplate": "status-color",\r
693
+ "suggestedParams": {\r
694
+ "type": "status-color",\r
695
+ "colorMap": {\r
696
+ "0": "#10b981",\r
697
+ "1": "#ef4444",\r
698
+ "false": "#10b981",\r
699
+ "true": "#ef4444",\r
700
+ "normal": "#10b981",\r
701
+ "alarm": "#ef4444"\r
702
+ },\r
703
+ "defaultColor": "#94a3b8",\r
704
+ "applyTo": "fill"\r
705
+ }\r
706
+ }\r
707
+ ],\r
708
+ "ports": [\r
709
+ {\r
710
+ "id": "port-inlet",\r
711
+ "group": "top"\r
712
+ },\r
713
+ {\r
714
+ "id": "port-outlet",\r
715
+ "group": "bottom"\r
716
+ },\r
717
+ {\r
718
+ "id": "port-level-sensor",\r
719
+ "group": "left",\r
720
+ "args": {\r
721
+ "y": "50%"\r
722
+ }\r
723
+ },\r
724
+ {\r
725
+ "id": "port-control",\r
726
+ "group": "right",\r
727
+ "args": {\r
728
+ "y": "50%"\r
729
+ }\r
730
+ }\r
731
+ ]\r
732
+ }\r
733
+ ]]></scada-config>\r
734
+ </metadata>\r
735
+ \r
736
+ <!-- 渐变定义 -->\r
737
+ <defs>\r
738
+ <linearGradient id="tank-body-gradient" x1="0%" y1="0%" x2="100%" y2="0%">\r
739
+ <stop offset="0%" stop-color="#e2e8f0" />\r
740
+ <stop offset="50%" stop-color="#f8fafc" />\r
741
+ <stop offset="100%" stop-color="#e2e8f0" />\r
742
+ </linearGradient>\r
743
+ <linearGradient id="liquid-gradient" x1="0%" y1="0%" x2="100%" y2="0%">\r
744
+ <stop offset="0%" stop-color="#3b82f6" />\r
745
+ <stop offset="50%" stop-color="#60a5fa" />\r
746
+ <stop offset="100%" stop-color="#3b82f6" />\r
747
+ </linearGradient>\r
748
+ </defs>\r
749
+ \r
750
+ <!-- 组件主体 -->\r
751
+ <g id="root">\r
752
+ <!-- 罐体外壳 -->\r
753
+ <rect \r
754
+ x="20" \r
755
+ y="30" \r
756
+ width="80" \r
757
+ height="110" \r
758
+ rx="4" \r
759
+ fill="url(#tank-body-gradient)" \r
760
+ stroke="#64748b" \r
761
+ stroke-width="3"\r
762
+ opacity="0.9"\r
763
+ />\r
764
+ \r
765
+ <!-- 液位填充(动态高度) -->\r
766
+ <rect \r
767
+ id="part-liquidFill"\r
768
+ x="23" \r
769
+ y="33" \r
770
+ width="74" \r
771
+ height="104" \r
772
+ rx="2" \r
773
+ fill="url(#liquid-gradient)" \r
774
+ opacity="0.8"\r
775
+ data-original-height="104"\r
776
+ data-original-y="33"\r
777
+ />\r
778
+ \r
779
+ <!-- 罐体顶部 -->\r
780
+ <ellipse \r
781
+ cx="60" \r
782
+ cy="30" \r
783
+ rx="40" \r
784
+ ry="8" \r
785
+ fill="#cbd5e1" \r
786
+ stroke="#64748b" \r
787
+ stroke-width="2"\r
788
+ />\r
789
+ \r
790
+ <!-- 罐体底部 -->\r
791
+ <ellipse \r
792
+ cx="60" \r
793
+ cy="140" \r
794
+ rx="40" \r
795
+ ry="8" \r
796
+ fill="#94a3b8" \r
797
+ stroke="#64748b" \r
798
+ stroke-width="2"\r
799
+ />\r
800
+ \r
801
+ <!-- 管道连接(底部出口) -->\r
802
+ <rect \r
803
+ x="55" \r
804
+ y="145" \r
805
+ width="10" \r
806
+ height="15" \r
807
+ fill="#64748b"\r
808
+ />\r
809
+ \r
810
+ <!-- 刻度线 -->\r
811
+ <line x1="15" y1="50" x2="20" y2="50" stroke="#64748b" stroke-width="1"/>\r
812
+ <line x1="15" y1="70" x2="20" y2="70" stroke="#64748b" stroke-width="1"/>\r
813
+ <line x1="15" y1="90" x2="20" y2="90" stroke="#64748b" stroke-width="1"/>\r
814
+ <line x1="15" y1="110" x2="20" y2="110" stroke="#64748b" stroke-width="1"/>\r
815
+ <line x1="15" y1="130" x2="20" y2="130" stroke="#64748b" stroke-width="1"/>\r
816
+ \r
817
+ <!-- 报警灯 -->\r
818
+ <circle \r
819
+ id="part-alarmLight"\r
820
+ cx="60" \r
821
+ cy="15" \r
822
+ r="8" \r
823
+ fill="#10b981" \r
824
+ stroke="#334155" \r
825
+ stroke-width="2"\r
826
+ />\r
827
+ \r
828
+ <!-- 液位文字背景 -->\r
829
+ <rect \r
830
+ x="45" \r
831
+ y="80" \r
832
+ width="30" \r
833
+ height="20" \r
834
+ rx="2" \r
835
+ fill="rgba(255,255,255,0.9)" \r
836
+ stroke="#64748b" \r
837
+ stroke-width="1"\r
838
+ />\r
839
+ \r
840
+ <!-- 装饰环 -->\r
841
+ <ellipse \r
842
+ cx="60" \r
843
+ cy="60" \r
844
+ rx="42" \r
845
+ ry="4" \r
846
+ fill="none" \r
847
+ stroke="#94a3b8" \r
848
+ stroke-width="2"\r
849
+ opacity="0.5"\r
850
+ />\r
851
+ <ellipse \r
852
+ cx="60" \r
853
+ cy="110" \r
854
+ rx="42" \r
855
+ ry="4" \r
856
+ fill="none" \r
857
+ stroke="#94a3b8" \r
858
+ stroke-width="2"\r
859
+ opacity="0.5"\r
860
+ />\r
861
+ </g>\r
862
+ </svg>\r
863
+ `, p = `<?xml version="1.0" encoding="UTF-8"?>
864
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 40">
865
+ <metadata>
866
+ <scada-config><![CDATA[
867
+ {
868
+ "component": {
869
+ "id": "text",
870
+ "name": "\\u6587\\u672c",
871
+ "category": "basic",
872
+ "icon": "T",
873
+ "description": "\\u6587\\u672c\\u6807\\u7b7e\\u7ec4\\u4ef6",
874
+ "version": "1.0.0",
875
+ "author": "SCADA Engine"
876
+ },
877
+ "size": {
878
+ "width": 100,
879
+ "height": 40
880
+ },
881
+ "presetBindings": [],
882
+ "ports": [
883
+ { "id": "port-top", "group": "top" },
884
+ { "id": "port-right", "group": "right" },
885
+ { "id": "port-bottom", "group": "bottom" },
886
+ { "id": "port-left", "group": "left" }
887
+ ]
888
+ }
889
+ ]]></scada-config>
890
+ </metadata>
891
+ <g id="root">
892
+ <rect
893
+ x="2"
894
+ y="2"
895
+ width="96"
896
+ height="36"
897
+ rx="2"
898
+ fill="transparent"
899
+ stroke="#64748b"
900
+ stroke-width="1"
901
+ stroke-dasharray="5 5"
902
+ />
903
+ <text
904
+ id="part-text"
905
+ x="50"
906
+ y="24"
907
+ text-anchor="middle"
908
+ dominant-baseline="middle"
909
+ font-size="16"
910
+ fill="#e2e8f0"
911
+ font-family="system-ui, sans-serif"
912
+ >&#25991;&#26412;</text>
913
+ </g>
914
+ </svg>
915
+ `, f = `<?xml version="1.0" encoding="UTF-8"?>\r
916
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 120 120">\r
917
+ <!-- 组件元数据 -->\r
918
+ <metadata>\r
919
+ <scada-config><![CDATA[\r
920
+ {\r
921
+ "component": {\r
922
+ "id": "valve-standard",\r
923
+ "name": "标准阀门",\r
924
+ "category": "iot",\r
925
+ "icon": "🚰",\r
926
+ "description": "带开度指示的标准阀门组件",\r
927
+ "version": "1.0.0",\r
928
+ "author": "SCADA Engine"\r
929
+ },\r
930
+ "size": {\r
931
+ "width": 120,\r
932
+ "height": 120\r
933
+ },\r
934
+ "presetBindings": [\r
935
+ {\r
936
+ "partId": "part-valveHandle",\r
937
+ "suggestedDriverProperty": "opening",\r
938
+ "label": "阀门开度",\r
939
+ "valueType": "number",\r
940
+ "suggestedTemplate": "opening-rotate",\r
941
+ "suggestedParams": {\r
942
+ "type": "opening-rotate",\r
943
+ "inputRange": { "min": 0, "max": 90 },\r
944
+ "outputRange": { "min": 0, "max": 90 },\r
945
+ "origin": "center"\r
946
+ }\r
947
+ }\r
948
+ ],\r
949
+ "ports": [\r
950
+ {\r
951
+ "id": "port-inlet",\r
952
+ "group": "top"\r
953
+ },\r
954
+ {\r
955
+ "id": "port-outlet",\r
956
+ "group": "bottom"\r
957
+ },\r
958
+ {\r
959
+ "id": "port-control",\r
960
+ "group": "left",\r
961
+ "args": {\r
962
+ "y": "50%"\r
963
+ }\r
964
+ },\r
965
+ {\r
966
+ "id": "port-feedback",\r
967
+ "group": "right",\r
968
+ "args": {\r
969
+ "y": "50%"\r
970
+ }\r
971
+ }\r
972
+ ]\r
973
+ }\r
974
+ ]]></scada-config>\r
975
+ </metadata>\r
976
+ \r
977
+ <!-- 渐变定义 -->\r
978
+ <defs>\r
979
+ <linearGradient id="valve-body-gradient" x1="0%" y1="0%" x2="0%" y2="100%">\r
980
+ <stop offset="0%" stop-color="#64748b" />\r
981
+ <stop offset="100%" stop-color="#475569" />\r
982
+ </linearGradient>\r
983
+ <linearGradient id="valve-handle-gradient" x1="0%" y1="0%" x2="100%" y2="0%">\r
984
+ <stop offset="0%" stop-color="#94a3b8" />\r
985
+ <stop offset="100%" stop-color="#64748b" />\r
986
+ </linearGradient>\r
987
+ </defs>\r
988
+ \r
989
+ <!-- 组件主体 -->\r
990
+ <g id="root">\r
991
+ <!-- 阀门主体 -->\r
992
+ <rect \r
993
+ x="35" \r
994
+ y="40" \r
995
+ width="50" \r
996
+ height="40" \r
997
+ rx="4" \r
998
+ fill="url(#valve-body-gradient)" \r
999
+ stroke="#334155" \r
1000
+ stroke-width="2"\r
1001
+ />\r
1002
+ \r
1003
+ <!-- 阀门手柄(可旋转部分) -->\r
1004
+ <g id="part-valveHandle">\r
1005
+ <rect \r
1006
+ x="52" \r
1007
+ y="35" \r
1008
+ width="16" \r
1009
+ height="50" \r
1010
+ rx="2" \r
1011
+ fill="url(#valve-handle-gradient)" \r
1012
+ stroke="#334155" \r
1013
+ stroke-width="2"\r
1014
+ />\r
1015
+ <circle cx="60" cy="60" r="6" fill="#475569" stroke="#334155" stroke-width="1"/>\r
1016
+ </g>\r
1017
+ \r
1018
+ <!-- 状态指示灯 -->\r
1019
+ <circle \r
1020
+ id="part-statusIndicator" \r
1021
+ cx="60" \r
1022
+ cy="25" \r
1023
+ r="8" \r
1024
+ fill="#94a3b8" \r
1025
+ stroke="#334155" \r
1026
+ stroke-width="2"\r
1027
+ />\r
1028
+ \r
1029
+ <!-- 管道连接点 -->\r
1030
+ <line x1="60" y1="20" x2="60" y2="0" stroke="#475569" stroke-width="4" stroke-linecap="round"/>\r
1031
+ <line x1="60" y1="100" x2="60" y2="120" stroke="#475569" stroke-width="4" stroke-linecap="round"/>\r
1032
+ \r
1033
+ <!-- 装饰螺栓 -->\r
1034
+ <circle cx="40" cy="50" r="3" fill="#334155"/>\r
1035
+ <circle cx="80" cy="50" r="3" fill="#334155"/>\r
1036
+ <circle cx="40" cy="70" r="3" fill="#334155"/>\r
1037
+ <circle cx="80" cy="70" r="3" fill="#334155"/>\r
1038
+ </g>\r
1039
+ </svg>\r
1040
+ `;
1041
+ async function x() {
1042
+ try {
1043
+ const n = /* @__PURE__ */ Object.assign({ "../examples/circle.svg": a, "../examples/light-bulb.svg": s, "../examples/rect.svg": d, "../examples/switch-toggle.svg": c, "../examples/tank-level.svg": g, "../examples/text.svg": p, "../examples/valve-standard.svg": f });
1044
+ let r = 0;
1045
+ const t = [];
1046
+ for (const [o, i] of Object.entries(n)) {
1047
+ const e = o.split("/").pop() || "unknown.svg";
1048
+ l.loadFromString(i, e) ? r++ : t.push(e);
1049
+ }
1050
+ r > 0 && console.log(`[SCADA Engine] ✅ 已加载 ${r} 个 SVG 组件`);
1051
+ } catch {
1052
+ console.warn("[SCADA Engine] SVG 组件加载失败,请手动调用 loadExampleSvgComponents()");
1053
+ }
1054
+ }
1055
+ export {
1056
+ x as loadExampleSvgComponents
1057
+ };