-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
389 lines (355 loc) · 17.5 KB
/
index.html
File metadata and controls
389 lines (355 loc) · 17.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>G-Code Force Mapper | Identify the G-Code Line Causing Tool Failure</title>
<meta name="google-site-verification" content="LjefNg_93KtGFr6UZBWVchSGlzljVSxmkDcCiblk7mA" />
<meta name="description" content="Map dynamometer CSV data — cutting forces Fx, Fy, Fz, torque Mz, and custom sensor channels — onto ISO G-code toolpaths. Returns the exact G-code line, XYZ location, and a spatial confidence score.">
<meta name="robots" content="index, follow">
<meta property="og:title" content="G-Code Force Mapper">
<meta property="og:description" content="Map dynamometer CSV data onto ISO G-code toolpaths. Identify the exact G-code line and XYZ location linked to a force spike, torque peak, or tool failure event.">
<meta property="og:type" content="website">
<meta property="og:url" content="https://gcodemap.github.io/gcode-data-mapper/">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;600&family=DM+Sans:wght@300;400;600;700&display=swap" rel="stylesheet">
<style>
:root {
--bg: #0d0f12;
--surface: #13171e;
--border: #252c38;
--accent: #e8a020;
--accent2: #4fa3e0;
--text: #d4dae6;
--muted: #626d82;
--good: #27ae60;
--mono: 'IBM Plex Mono', monospace;
--sans: 'DM Sans', sans-serif;
}
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
body {
font-family: var(--sans);
background: var(--bg);
color: var(--text);
line-height: 1.7;
}
body::before {
content: '';
position: fixed; inset: 0;
background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.04'/%3E%3C/svg%3E");
pointer-events: none; z-index: 0; opacity: 0.4;
}
.wrap { max-width: 900px; margin: 0 auto; padding: 0 24px; position: relative; z-index: 1; }
header { border-bottom: 1px solid var(--border); padding: 16px 0; }
header .wrap { display: flex; align-items: center; gap: 12px; }
.logo-mark {
font-family: var(--mono);
font-size: 11px;
font-weight: 600;
color: var(--accent);
background: rgba(232,160,32,0.08);
border: 1px solid rgba(232,160,32,0.25);
padding: 4px 10px;
border-radius: 3px;
letter-spacing: 0.08em;
text-transform: uppercase;
}
.header-label { font-size: 13px; color: var(--muted); font-weight: 300; }
.hero { padding: 72px 0 56px; border-bottom: 1px solid var(--border); }
.hero-tag {
font-family: var(--mono);
font-size: 11px;
color: var(--accent2);
letter-spacing: 0.12em;
text-transform: uppercase;
margin-bottom: 20px;
display: flex;
align-items: center;
gap: 8px;
}
.hero-tag::before { content: ''; display: inline-block; width: 20px; height: 1px; background: var(--accent2); }
h1 {
font-family: var(--sans);
font-size: clamp(26px, 5vw, 42px);
font-weight: 700;
color: #edf2f7;
line-height: 1.15;
margin-bottom: 20px;
letter-spacing: -0.02em;
}
h1 em { font-style: normal; color: var(--accent); }
.hero-sub {
font-size: 16px;
color: #8a96a8;
max-width: 640px;
font-weight: 300;
margin-bottom: 36px;
}
.btn-launch {
display: inline-flex;
align-items: center;
gap: 10px;
background: var(--accent);
color: #0d0f12;
padding: 14px 28px;
font-family: var(--sans);
font-weight: 700;
font-size: 15px;
text-decoration: none;
border-radius: 4px;
transition: background 0.15s, transform 0.1s;
}
.btn-launch:hover { background: #f0b030; transform: translateY(-1px); }
h2 {
font-size: 13px;
font-family: var(--mono);
font-weight: 600;
color: var(--muted);
text-transform: uppercase;
letter-spacing: 0.12em;
margin-bottom: 20px;
display: flex;
align-items: center;
gap: 10px;
}
h2::after { content: ''; flex: 1; height: 1px; background: var(--border); }
section { padding: 52px 0; border-bottom: 1px solid var(--border); }
.io-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
@media (max-width: 600px) { .io-grid { grid-template-columns: 1fr; } }
.card {
background: var(--surface);
border: 1px solid var(--border);
border-radius: 6px;
padding: 24px;
}
.card-label {
font-family: var(--mono);
font-size: 10px;
font-weight: 600;
letter-spacing: 0.14em;
text-transform: uppercase;
color: var(--accent);
margin-bottom: 12px;
}
.card ul { list-style: none; }
.card li {
font-size: 14px;
color: var(--text);
padding: 6px 0;
border-bottom: 1px solid var(--border);
display: flex;
align-items: flex-start;
gap: 10px;
}
.card li:last-child { border-bottom: none; }
.card li::before { content: '—'; color: var(--accent); flex-shrink: 0; font-family: var(--mono); font-size: 12px; margin-top: 2px; }
.obj-list { display: flex; flex-direction: column; gap: 12px; }
.obj-item {
background: var(--surface);
border: 1px solid var(--border);
border-left: 3px solid var(--good);
border-radius: 4px;
padding: 16px 20px;
display: flex;
gap: 14px;
align-items: flex-start;
}
.obj-num { font-family: var(--mono); font-size: 11px; color: var(--good); font-weight: 600; flex-shrink: 0; padding-top: 2px; }
.obj-text { font-size: 14px; line-height: 1.6; }
.obj-text strong { color: #edf2f7; }
.limit-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
@media (max-width: 600px) { .limit-grid { grid-template-columns: 1fr; } }
.limit-item {
background: var(--surface);
border: 1px solid var(--border);
border-left: 3px solid #2d3a4a;
border-radius: 4px;
padding: 14px 16px;
font-size: 13px;
line-height: 1.55;
color: #8a96a8;
}
.limit-item strong { color: var(--text); display: block; margin-bottom: 2px; }
.usecase-list { display: flex; flex-direction: column; gap: 10px; }
.usecase-item {
background: var(--surface);
border: 1px solid var(--border);
border-radius: 4px;
padding: 16px 20px;
font-size: 14px;
color: #8a96a8;
line-height: 1.6;
}
.usecase-item strong { color: var(--text); display: block; margin-bottom: 4px; }
.disclaimer { background: var(--surface); border: 1px solid var(--border); border-radius: 6px; padding: 28px; }
.disclaimer h3 { font-family: var(--mono); font-size: 11px; font-weight: 600; letter-spacing: 0.12em; text-transform: uppercase; color: var(--muted); margin-bottom: 12px; }
.disclaimer p { font-size: 13px; color: #626d82; line-height: 1.7; }
.disclaimer strong { color: #8a96a8; }
.disclaimer a { color: var(--accent2); }
footer { padding: 32px 0; text-align: center; }
footer p { font-size: 12px; color: var(--muted); font-family: var(--mono); }
@keyframes fadeUp { from { opacity: 0; transform: translateY(14px); } to { opacity: 1; transform: translateY(0); } }
.hero { animation: fadeUp 0.45s ease both; }
section:nth-of-type(1) { animation: fadeUp 0.45s 0.05s ease both; }
section:nth-of-type(2) { animation: fadeUp 0.45s 0.10s ease both; }
section:nth-of-type(3) { animation: fadeUp 0.45s 0.15s ease both; }
section:nth-of-type(4) { animation: fadeUp 0.45s 0.20s ease both; }
section:nth-of-type(5) { animation: fadeUp 0.45s 0.25s ease both; }
</style>
</head>
<body>
<header>
<div class="wrap">
<span class="logo-mark">GFM</span>
<span class="header-label">G-Code Force Mapper · Spatial Data Mapping Utility</span>
</div>
</header>
<div class="wrap">
<div class="hero">
<p class="hero-tag">Machining Analysis Utility</p>
<h1>Find the <em>exact G-code line</em><br>behind a tool failure or part scrap.</h1>
<p class="hero-sub">
Upload your ISO G-code and dynamometer CSV. The tool aligns your force, torque or any user defined data to the toolpath geometry and returns the specific G-code block, XYZ coordinate, and a confidence score, without manual time-offset guesswork.
</p>
<a href="https://gcode-map.streamlit.app" class="btn-launch">
<svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M3 8h10M9 4l4 4-4 4" stroke="#0d0f12" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>
Launch Web Utility
</a>
</div>
<section>
<h2>Input and output</h2>
<div class="io-grid">
<div class="card">
<div class="card-label">Input</div>
<ul>
<li>ISO G-code file</li>
<li>Dynamometer CSV — Fx, Fy, Fz, Mz columns</li>
<li>Optional user-defined channel: Any time-series signal including Power, Vibration, Temperature, Acoustics etc. </li>
</ul>
</div>
<div class="card">
<div class="card-label">Output</div>
<ul>
<li>Peak-force G-code line number</li>
<li>XYZ location on the toolpath</li>
<li>2D and 3D force heatmap</li>
<li>Confidence score with diagnostic breakdown</li>
<li>Exportable mapped CSV </li>
</ul>
</div>
<div class="card">
<div class="card-label">Compatibility</div>
<ul>
<li>3-axis machining</li>
<li>3+2 indexed operations with ISO output</li>
</ul>
</div>
<div class="card">
<div class="card-label">Access</div>
<ul>
<li>Browser-based — no installation</li>
<li>Files processed in session memory only</li>
<li>No data stored after session ends</li>
<li>Works on any device including tablets</li>
</ul>
</div>
</div>
</section>
<section>
<h2>Accuracy objectives</h2>
<div class="obj-list">
<div class="obj-item">
<span class="obj-num">01</span>
<span class="obj-text"><strong>Late-start and early-finish recording is handled.</strong> Forces map correctly even if data logging begins after the cut starts or stops before machining ends. No manual trimming needed.</span>
</div>
<div class="obj-item">
<span class="obj-num">02</span>
<span class="obj-text"><strong>Force data is never stretched to fit the G-code.</strong> Stretching the data requires explicit user acceptance and is flagged in the export as reduced-accuracy.</span>
</div>
<div class="obj-item">
<span class="obj-num">03</span>
<span class="obj-text"><strong>Rapid moves are excluded from cutting peaks.</strong> G0 traverse blocks are identified and removed. A data spike during a rapid will not be reported as the failure location.</span>
</div>
<div class="obj-item">
<span class="obj-num">04</span>
<span class="obj-text"><strong>Every result includes a confidence score.</strong> The score reflects the quality of signal alignment. Low-confidence results are flagged. </span>
</div>
</div>
</section>
<section>
<h2>Scope boundaries</h2>
<div class="limit-grid">
<div class="limit-item">
<strong>No simultaneous 5-axis</strong>
Continuous A/B/C motion is not supported. 3+2 indexed operations with ISO output are supported.
</div>
<div class="limit-item">
<strong>ISO format required</strong>
Heidenhain Klartext, Mazatrol, and other conversational formats are not supported.
</div>
<div class="limit-item">
<strong>No subprogram expansion</strong>
Subroutine calls (M98, G65) are not expanded.
</div>
<div class="limit-item">
<strong>No canned cycle expansion</strong>
Drilling and boring cycles are not expanded into toolpath geometry.
</div>
<div class="limit-item">
<strong>Feed per revolution (G95) not supported</strong>
Feed is assumed to be G94 (per minute).
</div>
<div class="limit-item">
<strong>No multi-tool segmentation</strong>
Tool changes are not separated; the full recording is treated as a single pass.
</div>
<div class="limit-item">
<strong>No machine dynamics modelling</strong>
Look-ahead and corner deceleration are not modelled.
</div>
<div class="limit-item">
<strong>Rapids must be explicitly defined</strong>
Ambiguous blocks may not be excluded from cutting analysis.
</div>
</div>
</section>
<section>
<h2>Typical use cases</h2>
<div class="usecase-list">
<div class="usecase-item">
<strong>Tool breakage on a high-value part</strong>
Cutting data looks correct, but the tool still broke. Upload the post-run dynamometer CSV and G-code to find which toolpath block caused the overload. Applies to 3-axis and 3+2 indexed ISO operations.
</div>
<div class="usecase-item">
<strong>Identifying a specific toolpath geometry issue</strong>
A part scrapped and the question is whether a corner, thin wall, or sudden change in radial engagement caused it. The output is a G-code line number that can be searched directly in your CAM software.
</div>
<div class="usecase-item">
<strong>Comparing cutting conditions across multiple runs</strong>
Same G-code, different tools or parameters. Upload a different CSV each time to compare where peak forces occur and at what magnitude. The custom channel supports user defined input alongside Fx, Fy, Fz, Mz.
</div>
<div class="usecase-item">
<strong>First use with no signal processing background</strong>
CSV column detection is automatic. Defaults produce a usable first result. The summary panel — max force, XYZ location, G-code line — is readable without specialist knowledge and can be exported or screenshotted directly.
</div>
</div>
</section>
<section>
<h2>Disclaimer and privacy</h2>
<div class="disclaimer">
<h3>Technical use</h3>
<p>This is a free research and engineering utility. Output is provided <strong>for guidance only</strong> and does not replace professional engineering judgment, verified CAM simulation, or tooling supplier cutting data. This software is provided "as is" without warranty of any kind. <strong>No liability is accepted for machine damage, tool breakage, part scrap, or financial loss</strong> arising from use of this tool.</p>
<h3 style="margin-top:20px;">Data processing</h3>
<p>Hosted on Streamlit Community Cloud. Uploaded G-code and CSV files are <strong>processed in session memory only</strong>. No file contents are stored, saved, or transmitted beyond what is required to render results within the session. Data is not retained after the session ends.</p>
<h3 style="margin-top:20px;">Analytics</h3>
<p>Anonymous usage metadata — page views, export timestamps, confidence scores, and mapping mode — is collected via Google Analytics (GA4) for product improvement. No personal data or file contents are logged. Opt out using the <a href="https://tools.google.com/dlpage/gaoptout">Google Analytics opt-out browser add-on</a>.</p>
</div>
</section>
</div>
<footer>
<div class="wrap">
<p>G-Code Force Mapper · Free research utility · No warranty</p>
</div>
</footer>
</body>
</html>