@aspiresys/visor 1.3.5 → 1.4.1

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.
@@ -1,235 +1,180 @@
1
- const captureBtn = document.getElementById("captureBtn");
2
- const saveBtn = document.getElementById("saveBtn");
3
- const canvas = document.getElementById("screenCanvas");
4
- const ctx = canvas.getContext("2d");
5
- const templatePreview = document.getElementById("templatePreview");
6
- const testMatchBtn = document.getElementById("testMatchBtn");
7
- const matchResult = document.getElementById("matchResult");
8
- const loadTemplateBtn = document.getElementById("loadTemplateBtn");
9
- const currentTemplate = document.getElementById("currentTemplate");
10
- const confidenceInput = document.getElementById("confidenceInput");
11
- const image = new Image();
12
- let selectedTemplatePath = null;
13
- let imageScaleX = 1;
14
- let imageScaleY = 1;
15
- let startX;
16
- let startY;
17
- let endX;
18
- let endY;
19
- let selecting = false;
20
- let displayStartX;
21
- let displayStartY;
22
- let displayEndX;
23
- let displayEndY;
24
-
25
- captureBtn.addEventListener("click",
26
- async () => {
27
- const imagePath = await window.visor.capture();
28
- image.onload = () => {
29
- const maxWidth = 1000;
30
- const scale = image.width > maxWidth ? maxWidth / image.width : 1;
31
- canvas.width = image.width * scale;
32
- canvas.height = image.height * scale;
33
- matchResult.textContent = " No Match Tested ";
34
- ctx.imageSmoothingEnabled = false;
35
- ctx.drawImage(
36
- image,
37
- 0,
38
- 0,
39
- canvas.width,
40
- canvas.height
41
- );
42
- imageScaleX = image.width / canvas.width;
43
- imageScaleY = image.height / canvas.height;
44
- };
45
- image.src = imagePath + "?t=" + Date.now();
46
- }
47
- );
48
-
49
- canvas.addEventListener("mousedown",
50
- (e) => {
51
- displayStartX = e.offsetX;
52
- displayStartY = e.offsetY;
53
- startX = e.offsetX * imageScaleX;
54
- startY = e.offsetY * imageScaleY;
55
- selecting = true;
56
- console.log("mousedown", e.offsetX, e.offsetY);
57
- }
58
- );
59
-
60
- canvas.addEventListener("mousemove",
61
- (e) => {
62
- if (!selecting) {
63
- document.getElementById("mousex").innerHTML = Math.round(e.offsetX * imageScaleX);
64
- document.getElementById("mousey").innerHTML = Math.round(e.offsetY * imageScaleY);
65
- return;
66
- }
67
- displayEndX = e.offsetX;
68
- displayEndY = e.offsetY;
69
- endX = e.offsetX * imageScaleX;
70
- endY = e.offsetY * imageScaleY;
71
- ctx.drawImage(
72
- image,
73
- 0,
74
- 0,
75
- canvas.width,
76
- canvas.height
77
- );
78
- ctx.strokeStyle = "red";
79
- ctx.lineWidth = 2;
80
- ctx.strokeRect(
81
- displayStartX,
82
- displayStartY,
83
- displayEndX - displayStartX,
84
- displayEndY - displayStartY
85
- );
86
- console.log("mousemove", e.offsetX, e.offsetY);
87
- }
88
- );
89
-
90
- canvas.addEventListener("mouseup",
91
- () => {
92
- selecting = false;
93
- document.getElementById("mousex").innerHTML = Math.round(startX);
94
- document.getElementById("mousey").innerHTML = Math.round(startY);
95
- document.getElementById("mousew").innerHTML = Math.round(Math.abs(endX - startX));
96
- document.getElementById("mouseh").innerHTML = Math.round(Math.abs(endY - startY));
97
- console.log(startX, startY, endX, endY);
98
- }
99
- );
100
-
101
- saveBtn.addEventListener("click",
102
- async () => {
103
- if (startX === undefined || startY === undefined || endX === undefined || endY === undefined) {
104
- alert("Please select an area first.");
105
- return;
106
- }
107
- const filePath = await window.visor.saveTemplateDialog({
108
- x: Math.min(startX, endX),
109
- y: Math.min(startY, endY),
110
- width: Math.abs(endX - startX),
111
- height: Math.abs(endY - startY)
112
- });
113
- if (!filePath) {
114
- return;
115
- }
116
- await window.visor.saveTemplate({
117
- x: Math.min(startX, endX),
118
- y: Math.min(startY, endY),
119
- width: Math.abs(endX - startX),
120
- height: Math.abs(endY - startY),
121
- outputPath: filePath
122
- });
123
- const fileName = filePath.split(/[\\/]/).pop();
124
- selectedTemplatePath = filePath;
125
- currentTemplate.textContent = fileName;
126
- currentTemplate.title = filePath;
127
- matchResult.innerHTML = "<b>No Match Tested</b>";
128
- ctx.drawImage(
129
- image,
130
- 0,
131
- 0,
132
- canvas.width,
133
- canvas.height
134
- );
135
- templatePreview.src = filePath + "?t=" + Date.now();
136
- alert("Template Saved");
137
- }
138
- );
139
-
140
- testMatchBtn.addEventListener("click",
141
- async () => {
142
- if (!selectedTemplatePath) {
143
- alert("Please load or save a template first.");
144
- return;
145
- }
146
- const confidence = parseFloat(confidenceInput.value);
147
- if (isNaN(confidence) || confidence < 0 || confidence > 1) {
148
- alert("Confidence must be between 0 and 1");
149
- return;
150
- }
151
- matchResult.textContent = "🔍 Matching...";
152
- await new Promise(resolve => setTimeout(resolve, 10));
153
- const result = await window.visor.testMatch({
154
- templatePath: selectedTemplatePath,
155
- confidence: confidence,
156
- //isMultiMatch: document.getElementById("multiScaleCheck").checked
157
- });
158
- console.log("Match Result:", result);
159
- if (!result || result.length==0) {
160
- matchResult.textContent = "✗ MATCH NOT FOUND";
161
- ctx.drawImage(
162
- image,
163
- 0,
164
- 0,
165
- canvas.width,
166
- canvas.height
167
- );
168
- return;
169
- }
170
- ctx.drawImage(
171
- image,
172
- 0,
173
- 0,
174
- canvas.width,
175
- canvas.height
176
- );
177
- let matchR = "<b>✓ MATCH FOUND</b>\n";
178
- let i = 1;
179
- for(const match of result){
180
- ctx.strokeStyle = "lime";
181
- ctx.lineWidth = 2;
182
- ctx.strokeRect(
183
- match.x / imageScaleX,
184
- match.y / imageScaleY,
185
- match.width / imageScaleX,
186
- match.height / imageScaleY
187
- );
188
- matchR += `<b>Match:</b> ${i}
189
- <b>Confidence:</b>
190
- ${match.confidence.toFixed(3)}
191
- <b>Location:</b>
192
- (${match.x}, ${match.y})
193
- <b>Size:</b>
194
- ${match.width} x ${match.height}
195
- <hr>
196
- `;
197
- i += 1;
198
- }
199
- matchResult.innerHTML = matchR;
200
- });
201
-
202
- templatePreview.addEventListener("click",
203
- () => {
204
- modalImage.src = templatePreview.src;
205
- imageModal.style.display = "flex";
206
- }
207
- );
208
-
209
- imageModal.addEventListener("click",
210
- () => {
211
- imageModal.style.display = "none";
212
- }
213
- );
214
-
215
- loadTemplateBtn.addEventListener("click",
216
- async () => {
217
- const path = await window.visor.selectTemplate();
218
- if (!path) {
219
- return;
220
- }
221
- const fileName = path.split(/[\\/]/).pop();
222
- selectedTemplatePath = path;
223
- currentTemplate.textContent = fileName;
224
- currentTemplate.title = path;
225
- matchResult.innerHTML = "<b>No Match Tested</b>";
226
- ctx.drawImage(
227
- image,
228
- 0,
229
- 0,
230
- canvas.width,
231
- canvas.height
232
- );
233
- templatePreview.src = path + "?t=" + Date.now();
234
- }
235
- );
1
+ const captureBtn = document.getElementById('captureBtn');
2
+ const saveBtn = document.getElementById('saveBtn');
3
+ const canvas = document.getElementById('screenCanvas');
4
+ const ctx = canvas.getContext('2d');
5
+ const templatePreview = document.getElementById('templatePreview');
6
+ const testMatchBtn = document.getElementById('testMatchBtn');
7
+ const matchResult = document.getElementById('matchResult');
8
+ const loadTemplateBtn = document.getElementById('loadTemplateBtn');
9
+ const currentTemplate = document.getElementById('currentTemplate');
10
+ const confidenceInput = document.getElementById('confidenceInput');
11
+ const image = new Image();
12
+ let selectedTemplatePath = null;
13
+ let imageScaleX = 1;
14
+ let imageScaleY = 1;
15
+ let startX;
16
+ let startY;
17
+ let endX;
18
+ let endY;
19
+ let selecting = false;
20
+ let displayStartX;
21
+ let displayStartY;
22
+ let displayEndX;
23
+ let displayEndY;
24
+ let offsetX = 0;
25
+ let offsetY = 0;
26
+
27
+
28
+ captureBtn.addEventListener('click', async () => {
29
+ const imagePath = await window.visor.capture();
30
+ image.onload = () => {
31
+ const maxWidth = 1000;
32
+ const scale = image.width > maxWidth ? maxWidth / image.width : 1;
33
+ canvas.width = image.width * scale;
34
+ canvas.height = image.height * scale;
35
+ matchResult.textContent = ' No Match Tested ';
36
+ ctx.imageSmoothingEnabled = false;
37
+ ctx.drawImage(image, 0, 0, canvas.width, canvas.height);
38
+ imageScaleX = image.width / canvas.width;
39
+ imageScaleY = image.height / canvas.height;
40
+ };
41
+ image.src = imagePath + '?t=' + Date.now();
42
+ });
43
+
44
+ canvas.addEventListener('mousedown', (e) => {
45
+ displayStartX = e.offsetX;
46
+ displayStartY = e.offsetY;
47
+ startX = e.offsetX * imageScaleX;
48
+ startY = e.offsetY * imageScaleY;
49
+ selecting = true;
50
+ console.log('mousedown', e.offsetX, e.offsetY);
51
+ });
52
+
53
+ canvas.addEventListener('mousemove', (e) => {
54
+ if (!selecting) {
55
+ document.getElementById('mousex').innerHTML = Math.round(e.offsetX * imageScaleX);
56
+ document.getElementById('mousey').innerHTML = Math.round(e.offsetY * imageScaleY);
57
+ return;
58
+ }
59
+ displayEndX = e.offsetX;
60
+ displayEndY = e.offsetY;
61
+ endX = e.offsetX * imageScaleX;
62
+ endY = e.offsetY * imageScaleY;
63
+ ctx.drawImage(image, 0, 0, canvas.width, canvas.height);
64
+ ctx.strokeStyle = 'red';
65
+ ctx.lineWidth = 2;
66
+ ctx.strokeRect(displayStartX, displayStartY, displayEndX - displayStartX, displayEndY - displayStartY);
67
+ console.log('mousemove', e.offsetX, e.offsetY);
68
+ });
69
+
70
+ canvas.addEventListener('mouseup', () => {
71
+ selecting = false;
72
+ document.getElementById('mousex').innerHTML = Math.round(startX);
73
+ document.getElementById('mousey').innerHTML = Math.round(startY);
74
+ document.getElementById('mousew').innerHTML = Math.round(Math.abs(endX - startX));
75
+ document.getElementById('mouseh').innerHTML = Math.round(Math.abs(endY - startY));
76
+ console.log(startX, startY, endX, endY);
77
+ });
78
+
79
+ saveBtn.addEventListener('click', async () => {
80
+ if (startX === undefined || startY === undefined || endX === undefined || endY === undefined) {
81
+ alert('Please select an area first.');
82
+ return;
83
+ }
84
+ const filePath = await window.visor.saveTemplateDialog({
85
+ x: Math.min(startX, endX),
86
+ y: Math.min(startY, endY),
87
+ width: Math.abs(endX - startX),
88
+ height: Math.abs(endY - startY),
89
+ });
90
+ if (!filePath) {
91
+ return;
92
+ }
93
+ await window.visor.saveTemplate({
94
+ x: Math.min(startX, endX),
95
+ y: Math.min(startY, endY),
96
+ width: Math.abs(endX - startX),
97
+ height: Math.abs(endY - startY),
98
+ outputPath: filePath,
99
+ });
100
+ const fileName = filePath.split(/[\\/]/).pop();
101
+ selectedTemplatePath = filePath;
102
+ currentTemplate.textContent = fileName;
103
+ currentTemplate.title = filePath;
104
+ matchResult.innerHTML = '<b>No Match Tested</b>';
105
+ ctx.drawImage(image, 0, 0, canvas.width, canvas.height);
106
+ templatePreview.src = filePath + '?t=' + Date.now();
107
+ alert('Template Saved');
108
+ });
109
+
110
+ testMatchBtn.addEventListener('click', async () => {
111
+ if (!selectedTemplatePath) {
112
+ alert('Please load or save a template first.');
113
+ return;
114
+ }
115
+ const confidence = parseFloat(confidenceInput.value);
116
+ if (isNaN(confidence) || confidence < 0 || confidence > 1) {
117
+ alert('Confidence must be between 0 and 1');
118
+ return;
119
+ }
120
+ matchResult.textContent = '🔍 Matching...';
121
+ await new Promise((resolve) => setTimeout(resolve, 10));
122
+ const result = await window.visor.testMatch({
123
+ templatePath: selectedTemplatePath,
124
+ confidence: confidence,
125
+ //isMultiMatch: document.getElementById("multiScaleCheck").checked
126
+ });
127
+ console.log('Match Result:', result);
128
+ if (!result || result.length == 0) {
129
+ matchResult.textContent = '✗ MATCH NOT FOUND';
130
+ ctx.drawImage(image, 0, 0, canvas.width, canvas.height);
131
+ return;
132
+ }
133
+ ctx.drawImage(image, 0, 0, canvas.width, canvas.height);
134
+ let matchR = '<b>✓ MATCH FOUND</b>\n';
135
+ let i = 1;
136
+ for (const match of result) {
137
+ ctx.strokeStyle = 'lime';
138
+ ctx.lineWidth = 2;
139
+ ctx.strokeRect(
140
+ match.x / imageScaleX,
141
+ match.y / imageScaleY,
142
+ match.width / imageScaleX,
143
+ match.height / imageScaleY,
144
+ );
145
+ matchR += `<b>Match:</b> ${i}
146
+ <b>Confidence:</b>
147
+ ${match.confidence.toFixed(3)}
148
+ <b>Location:</b>
149
+ (${match.x}, ${match.y})
150
+ <b>Size:</b>
151
+ ${match.width} x ${match.height}
152
+ <hr>
153
+ `;
154
+ i += 1;
155
+ }
156
+ matchResult.innerHTML = matchR;
157
+ });
158
+
159
+ templatePreview.addEventListener('click', () => {
160
+ modalImage.src = templatePreview.src;
161
+ imageModal.style.display = 'flex';
162
+ });
163
+
164
+ imageModal.addEventListener('click', () => {
165
+ imageModal.style.display = 'none';
166
+ });
167
+
168
+ loadTemplateBtn.addEventListener('click', async () => {
169
+ const path = await window.visor.selectTemplate();
170
+ if (!path) {
171
+ return;
172
+ }
173
+ const fileName = path.split(/[\\/]/).pop();
174
+ selectedTemplatePath = path;
175
+ currentTemplate.textContent = fileName;
176
+ currentTemplate.title = path;
177
+ matchResult.innerHTML = '<b>No Match Tested</b>';
178
+ ctx.drawImage(image, 0, 0, canvas.width, canvas.height);
179
+ templatePreview.src = path + '?t=' + Date.now();
180
+ });
@@ -1,16 +1,8 @@
1
- #!/usr/bin/env node
2
-
3
- const path = require("path");
4
- const {
5
- spawn
6
- } = require("child_process");
7
- const electron = require("electron");
8
- spawn(
9
- electron,
10
- [
11
- path.join(__dirname, "main.js")
12
- ],
13
- {
14
- stdio: "inherit"
15
- }
16
- );
1
+ #!/usr/bin/env node
2
+
3
+ const path = require('path');
4
+ const { spawn } = require('child_process');
5
+ const electron = require('electron');
6
+ spawn(electron, [path.join(__dirname, 'main.js')], {
7
+ stdio: 'inherit',
8
+ });