@aspiresys/visor 1.3.4 → 1.4.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.
- package/dist/app.js +2 -2
- package/dist/config.js +2 -2
- package/dist/dialog.js +4 -4
- package/dist/display.js +21 -7
- package/dist/index.d.ts +156 -139
- package/dist/index.js +197 -163
- package/dist/inspector/index.js +10 -8
- package/dist/matcher.d.ts +2 -2
- package/dist/matcher.js +50 -25
- package/dist/mouse.d.ts +1 -1
- package/dist/mouse.js +4 -4
- package/dist/ocr.d.ts +2 -1
- package/dist/ocr.js +15 -15
- package/dist/path.js +1 -1
- package/dist/region.js +3 -4
- package/dist/screen.js +5 -5
- package/dist/src/index.js +15 -16
- package/dist/src/matcher.d.ts +1 -1
- package/dist/src/matcher.js +13 -12
- package/dist/src/mouse.d.ts +1 -1
- package/dist/src/mouse.js +9 -11
- package/dist/src/screen.js +12 -10
- package/dist/src/types.js +2 -2
- package/dist/templateMetadata.d.ts +1 -0
- package/dist/templateMetadata.js +20 -0
- package/dist/text.d.ts +1 -1
- package/dist/text.js +8 -8
- package/dist/types.d.ts +249 -159
- package/dist/types.js +330 -170
- package/dist/version.d.ts +1 -0
- package/dist/version.js +18 -0
- package/inspector/index.html +82 -55
- package/inspector/main.js +135 -189
- package/inspector/src/preload.js +10 -15
- package/inspector/src/renderer.js +177 -235
- package/inspector/start.js +8 -16
- package/inspector/styles.css +456 -458
- package/package.json +57 -51
- package/readme.md +790 -799
|
@@ -1,235 +1,177 @@
|
|
|
1
|
-
const captureBtn = document.getElementById(
|
|
2
|
-
const saveBtn = document.getElementById(
|
|
3
|
-
const canvas = document.getElementById(
|
|
4
|
-
const ctx = canvas.getContext(
|
|
5
|
-
const templatePreview = document.getElementById(
|
|
6
|
-
const testMatchBtn = document.getElementById(
|
|
7
|
-
const matchResult = document.getElementById(
|
|
8
|
-
const loadTemplateBtn = document.getElementById(
|
|
9
|
-
const currentTemplate = document.getElementById(
|
|
10
|
-
const confidenceInput = document.getElementById(
|
|
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(
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
);
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
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
|
+
|
|
25
|
+
captureBtn.addEventListener('click', async () => {
|
|
26
|
+
const imagePath = await window.visor.capture();
|
|
27
|
+
image.onload = () => {
|
|
28
|
+
const maxWidth = 1000;
|
|
29
|
+
const scale = image.width > maxWidth ? maxWidth / image.width : 1;
|
|
30
|
+
canvas.width = image.width * scale;
|
|
31
|
+
canvas.height = image.height * scale;
|
|
32
|
+
matchResult.textContent = ' No Match Tested ';
|
|
33
|
+
ctx.imageSmoothingEnabled = false;
|
|
34
|
+
ctx.drawImage(image, 0, 0, canvas.width, canvas.height);
|
|
35
|
+
imageScaleX = image.width / canvas.width;
|
|
36
|
+
imageScaleY = image.height / canvas.height;
|
|
37
|
+
};
|
|
38
|
+
image.src = imagePath + '?t=' + Date.now();
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
canvas.addEventListener('mousedown', (e) => {
|
|
42
|
+
displayStartX = e.offsetX;
|
|
43
|
+
displayStartY = e.offsetY;
|
|
44
|
+
startX = e.offsetX * imageScaleX;
|
|
45
|
+
startY = e.offsetY * imageScaleY;
|
|
46
|
+
selecting = true;
|
|
47
|
+
console.log('mousedown', e.offsetX, e.offsetY);
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
canvas.addEventListener('mousemove', (e) => {
|
|
51
|
+
if (!selecting) {
|
|
52
|
+
document.getElementById('mousex').innerHTML = Math.round(e.offsetX * imageScaleX);
|
|
53
|
+
document.getElementById('mousey').innerHTML = Math.round(e.offsetY * imageScaleY);
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
displayEndX = e.offsetX;
|
|
57
|
+
displayEndY = e.offsetY;
|
|
58
|
+
endX = e.offsetX * imageScaleX;
|
|
59
|
+
endY = e.offsetY * imageScaleY;
|
|
60
|
+
ctx.drawImage(image, 0, 0, canvas.width, canvas.height);
|
|
61
|
+
ctx.strokeStyle = 'red';
|
|
62
|
+
ctx.lineWidth = 2;
|
|
63
|
+
ctx.strokeRect(displayStartX, displayStartY, displayEndX - displayStartX, displayEndY - displayStartY);
|
|
64
|
+
console.log('mousemove', e.offsetX, e.offsetY);
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
canvas.addEventListener('mouseup', () => {
|
|
68
|
+
selecting = false;
|
|
69
|
+
document.getElementById('mousex').innerHTML = Math.round(startX);
|
|
70
|
+
document.getElementById('mousey').innerHTML = Math.round(startY);
|
|
71
|
+
document.getElementById('mousew').innerHTML = Math.round(Math.abs(endX - startX));
|
|
72
|
+
document.getElementById('mouseh').innerHTML = Math.round(Math.abs(endY - startY));
|
|
73
|
+
console.log(startX, startY, endX, endY);
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
saveBtn.addEventListener('click', async () => {
|
|
77
|
+
if (startX === undefined || startY === undefined || endX === undefined || endY === undefined) {
|
|
78
|
+
alert('Please select an area first.');
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
const filePath = await window.visor.saveTemplateDialog({
|
|
82
|
+
x: Math.min(startX, endX),
|
|
83
|
+
y: Math.min(startY, endY),
|
|
84
|
+
width: Math.abs(endX - startX),
|
|
85
|
+
height: Math.abs(endY - startY),
|
|
86
|
+
});
|
|
87
|
+
if (!filePath) {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
await window.visor.saveTemplate({
|
|
91
|
+
x: Math.min(startX, endX),
|
|
92
|
+
y: Math.min(startY, endY),
|
|
93
|
+
width: Math.abs(endX - startX),
|
|
94
|
+
height: Math.abs(endY - startY),
|
|
95
|
+
outputPath: filePath,
|
|
96
|
+
});
|
|
97
|
+
const fileName = filePath.split(/[\\/]/).pop();
|
|
98
|
+
selectedTemplatePath = filePath;
|
|
99
|
+
currentTemplate.textContent = fileName;
|
|
100
|
+
currentTemplate.title = filePath;
|
|
101
|
+
matchResult.innerHTML = '<b>No Match Tested</b>';
|
|
102
|
+
ctx.drawImage(image, 0, 0, canvas.width, canvas.height);
|
|
103
|
+
templatePreview.src = filePath + '?t=' + Date.now();
|
|
104
|
+
alert('Template Saved');
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
testMatchBtn.addEventListener('click', async () => {
|
|
108
|
+
if (!selectedTemplatePath) {
|
|
109
|
+
alert('Please load or save a template first.');
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
const confidence = parseFloat(confidenceInput.value);
|
|
113
|
+
if (isNaN(confidence) || confidence < 0 || confidence > 1) {
|
|
114
|
+
alert('Confidence must be between 0 and 1');
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
matchResult.textContent = '🔍 Matching...';
|
|
118
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
119
|
+
const result = await window.visor.testMatch({
|
|
120
|
+
templatePath: selectedTemplatePath,
|
|
121
|
+
confidence: confidence,
|
|
122
|
+
//isMultiMatch: document.getElementById("multiScaleCheck").checked
|
|
123
|
+
});
|
|
124
|
+
console.log('Match Result:', result);
|
|
125
|
+
if (!result || result.length == 0) {
|
|
126
|
+
matchResult.textContent = '✗ MATCH NOT FOUND';
|
|
127
|
+
ctx.drawImage(image, 0, 0, canvas.width, canvas.height);
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
ctx.drawImage(image, 0, 0, canvas.width, canvas.height);
|
|
131
|
+
let matchR = '<b>✓ MATCH FOUND</b>\n';
|
|
132
|
+
let i = 1;
|
|
133
|
+
for (const match of result) {
|
|
134
|
+
ctx.strokeStyle = 'lime';
|
|
135
|
+
ctx.lineWidth = 2;
|
|
136
|
+
ctx.strokeRect(
|
|
137
|
+
match.x / imageScaleX,
|
|
138
|
+
match.y / imageScaleY,
|
|
139
|
+
match.width / imageScaleX,
|
|
140
|
+
match.height / imageScaleY,
|
|
141
|
+
);
|
|
142
|
+
matchR += `<b>Match:</b> ${i}
|
|
143
|
+
<b>Confidence:</b>
|
|
144
|
+
${match.confidence.toFixed(3)}
|
|
145
|
+
<b>Location:</b>
|
|
146
|
+
(${match.x}, ${match.y})
|
|
147
|
+
<b>Size:</b>
|
|
148
|
+
${match.width} x ${match.height}
|
|
149
|
+
<hr>
|
|
150
|
+
`;
|
|
151
|
+
i += 1;
|
|
152
|
+
}
|
|
153
|
+
matchResult.innerHTML = matchR;
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
templatePreview.addEventListener('click', () => {
|
|
157
|
+
modalImage.src = templatePreview.src;
|
|
158
|
+
imageModal.style.display = 'flex';
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
imageModal.addEventListener('click', () => {
|
|
162
|
+
imageModal.style.display = 'none';
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
loadTemplateBtn.addEventListener('click', async () => {
|
|
166
|
+
const path = await window.visor.selectTemplate();
|
|
167
|
+
if (!path) {
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
const fileName = path.split(/[\\/]/).pop();
|
|
171
|
+
selectedTemplatePath = path;
|
|
172
|
+
currentTemplate.textContent = fileName;
|
|
173
|
+
currentTemplate.title = path;
|
|
174
|
+
matchResult.innerHTML = '<b>No Match Tested</b>';
|
|
175
|
+
ctx.drawImage(image, 0, 0, canvas.width, canvas.height);
|
|
176
|
+
templatePreview.src = path + '?t=' + Date.now();
|
|
177
|
+
});
|
package/inspector/start.js
CHANGED
|
@@ -1,16 +1,8 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
const path = require(
|
|
4
|
-
const {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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
|
+
});
|