Spaces:
Running
on
A100
Running
on
A100
Zhen Ye
commited on
Commit
·
3bcc90a
1
Parent(s):
48ece04
Fix ReferenceError by removing renderSummary calls and cleanup UI code
Browse files
LaserPerception/LaserPerception.css
CHANGED
|
@@ -750,7 +750,7 @@ input[type="number"]:focus {
|
|
| 750 |
|
| 751 |
.engage-grid {
|
| 752 |
display: grid;
|
| 753 |
-
grid-template-columns:
|
| 754 |
gap: 12px;
|
| 755 |
min-height: 0;
|
| 756 |
transition: grid-template-columns 0.3s ease;
|
|
|
|
| 750 |
|
| 751 |
.engage-grid {
|
| 752 |
display: grid;
|
| 753 |
+
grid-template-columns: 1.6fr .9fr;
|
| 754 |
gap: 12px;
|
| 755 |
min-height: 0;
|
| 756 |
transition: grid-template-columns 0.3s ease;
|
LaserPerception/LaserPerception.html
CHANGED
|
@@ -353,142 +353,143 @@
|
|
| 353 |
</div>
|
| 354 |
|
| 355 |
</div>
|
| 356 |
-
</div>
|
| 357 |
-
</section>
|
| 358 |
-
|
| 359 |
-
<!-- ===== Tab 2 ===== -->
|
| 360 |
-
<section class="tab" id="tab-engage">
|
| 361 |
-
<div class="engage-grid">
|
| 362 |
-
<div class="panel">
|
| 363 |
-
<h3>
|
| 364 |
-
<span>Video Engage · Tracking + Dynamic Dwell</span>
|
| 365 |
-
<div style="display: flex; gap: 8px; align-items: center;">
|
| 366 |
-
<button class="collapse-btn" id="btnToggleSidebar">◀ Hide Sidebar</button>
|
| 367 |
-
<span class="rightnote" id="engageNote">Awaiting video</span>
|
| 368 |
-
</div>
|
| 369 |
-
</h3>
|
| 370 |
-
|
| 371 |
-
<div class="viewbox" style="min-height: 420px;">
|
| 372 |
-
<video id="videoEngage" playsinline muted></video>
|
| 373 |
-
<canvas id="engageOverlay" class="overlay"></canvas>
|
| 374 |
-
<div class="watermark">LOCK · DIST · DWELL · AIMPOINT · FIRE/ASSESS</div>
|
| 375 |
-
<div class="empty" id="engageEmpty">
|
| 376 |
-
<div class="big">No video loaded</div>
|
| 377 |
-
<div class="small">Upload a video. Run <b>Reason</b> first to initialize aimpoints and baseline dwell.
|
| 378 |
-
Then click <b>Engage</b>.</div>
|
| 379 |
-
</div>
|
| 380 |
-
</div>
|
| 381 |
|
| 382 |
-
|
| 383 |
-
<button id="btnEngage" class="btn">Engage</button>
|
| 384 |
-
<button id="btnPause" class="btn secondary">Pause</button>
|
| 385 |
-
<button id="btnReset" class="btn secondary">Reset</button>
|
| 386 |
-
</div>
|
| 387 |
|
| 388 |
-
|
| 389 |
-
|
| 390 |
-
|
| 391 |
-
<
|
| 392 |
-
|
| 393 |
-
|
| 394 |
-
|
| 395 |
-
|
|
|
|
|
|
|
|
|
|
| 396 |
|
| 397 |
-
|
| 398 |
-
|
| 399 |
-
|
| 400 |
-
|
| 401 |
-
|
| 402 |
-
|
| 403 |
-
|
|
|
|
|
|
|
|
|
|
| 404 |
|
| 405 |
-
|
| 406 |
-
|
| 407 |
-
|
|
|
|
|
|
|
| 408 |
|
| 409 |
-
|
| 410 |
-
|
| 411 |
-
|
| 412 |
-
|
| 413 |
-
|
| 414 |
-
|
| 415 |
-
|
| 416 |
-
|
| 417 |
|
| 418 |
-
|
| 419 |
-
|
| 420 |
-
|
| 421 |
-
|
| 422 |
-
|
| 423 |
-
|
| 424 |
-
|
| 425 |
-
|
| 426 |
-
</div>
|
| 427 |
-
</section>
|
| 428 |
-
|
| 429 |
-
<!-- ===== Tab 3 ===== -->
|
| 430 |
-
<section class="tab" id="tab-trade">
|
| 431 |
-
<div class="trade-grid">
|
| 432 |
-
<div class="panel plot">
|
| 433 |
-
<h3>
|
| 434 |
-
<span>Range Sensitivity · Max vs Required Power · Dwell</span>
|
| 435 |
-
<span class="rightnote">Interactive</span>
|
| 436 |
-
</h3>
|
| 437 |
-
<canvas id="tradeCanvas" width="1100" height="420" class="full-size"></canvas>
|
| 438 |
-
</div>
|
| 439 |
|
| 440 |
-
|
| 441 |
-
|
| 442 |
-
|
| 443 |
-
<span class="rightnote">What-if</span>
|
| 444 |
-
</h3>
|
| 445 |
-
<div class="hint">This plot is computed from your current HEL and atmosphere knobs. It uses the selected
|
| 446 |
-
target’s baseline requirements (from Tab 1) as a reference curve.</div>
|
| 447 |
|
| 448 |
-
|
| 449 |
-
|
| 450 |
-
|
| 451 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 452 |
|
| 453 |
-
|
| 454 |
-
|
| 455 |
-
|
| 456 |
-
|
| 457 |
-
|
| 458 |
-
|
| 459 |
-
|
| 460 |
-
<input id="rMax" type="number" value="6000" min="100" max="20000" step="50" />
|
| 461 |
</div>
|
| 462 |
</div>
|
|
|
|
| 463 |
|
| 464 |
-
|
| 465 |
-
|
| 466 |
-
|
| 467 |
-
|
| 468 |
-
<
|
| 469 |
-
|
| 470 |
-
|
|
|
|
|
|
|
|
|
|
| 471 |
|
| 472 |
-
|
| 473 |
-
|
| 474 |
-
|
| 475 |
-
|
|
|
|
|
|
|
|
|
|
| 476 |
|
| 477 |
-
|
| 478 |
-
|
| 479 |
-
|
| 480 |
-
|
| 481 |
-
|
| 482 |
-
|
| 483 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 484 |
|
| 485 |
-
|
| 486 |
-
|
| 487 |
-
|
| 488 |
-
|
| 489 |
|
| 490 |
-
|
| 491 |
-
|
| 492 |
</div>
|
| 493 |
|
| 494 |
<script>
|
|
|
|
| 353 |
</div>
|
| 354 |
|
| 355 |
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 356 |
|
| 357 |
+
</section>
|
|
|
|
|
|
|
|
|
|
|
|
|
| 358 |
|
| 359 |
+
<!-- ===== Tab 2 ===== -->
|
| 360 |
+
<section class="tab" id="tab-engage">
|
| 361 |
+
<div class="engage-grid">
|
| 362 |
+
<div class="panel">
|
| 363 |
+
<h3>
|
| 364 |
+
<span>Video Engage · Tracking + Dynamic Dwell</span>
|
| 365 |
+
<div style="display: flex; gap: 8px; align-items: center;">
|
| 366 |
+
<button class="collapse-btn" id="btnToggleSidebar">◀ Hide Sidebar</button>
|
| 367 |
+
<span class="rightnote" id="engageNote">Awaiting video</span>
|
| 368 |
+
</div>
|
| 369 |
+
</h3>
|
| 370 |
|
| 371 |
+
<div class="viewbox" style="min-height: 420px;">
|
| 372 |
+
<video id="videoEngage" playsinline muted></video>
|
| 373 |
+
<canvas id="engageOverlay" class="overlay"></canvas>
|
| 374 |
+
<div class="watermark">LOCK · DIST · DWELL · AIMPOINT · FIRE/ASSESS</div>
|
| 375 |
+
<div class="empty" id="engageEmpty">
|
| 376 |
+
<div class="big">No video loaded</div>
|
| 377 |
+
<div class="small">Upload a video. Run <b>Reason</b> first to initialize aimpoints and baseline dwell.
|
| 378 |
+
Then click <b>Engage</b>.</div>
|
| 379 |
+
</div>
|
| 380 |
+
</div>
|
| 381 |
|
| 382 |
+
<div class="btnrow mt-md">
|
| 383 |
+
<button id="btnEngage" class="btn">Engage</button>
|
| 384 |
+
<button id="btnPause" class="btn secondary">Pause</button>
|
| 385 |
+
<button id="btnReset" class="btn secondary">Reset</button>
|
| 386 |
+
</div>
|
| 387 |
|
| 388 |
+
<div class="strip mt-md">
|
| 389 |
+
<span class="chip" id="chipPolicy">POLICY:AUTO</span>
|
| 390 |
+
<span class="chip" id="chipTracks">TRACKS:0</span>
|
| 391 |
+
<span class="chip" id="chipBeam">BEAM:OFF</span>
|
| 392 |
+
<span class="chip" id="chipHz">DET:6Hz</span>
|
| 393 |
+
<span class="chip" id="chipFeed" title="Toggle raw vs HF-processed feed (if available)">FEED:RAW</span>
|
| 394 |
+
<span class="chip" id="chipDepth" title="Toggle depth view (if available)">VIEW:DEFAULT</span>
|
| 395 |
+
</div>
|
| 396 |
|
| 397 |
+
<div class="mt-md">
|
| 398 |
+
<div class="row"><label>Active dwell progress (selected)</label><small class="mini"
|
| 399 |
+
id="dwellText">—</small>
|
| 400 |
+
</div>
|
| 401 |
+
<div class="bar">
|
| 402 |
+
<div id="dwellBar"></div>
|
| 403 |
+
</div>
|
| 404 |
+
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 405 |
|
| 406 |
+
<div class="hint mt-md">Manual targeting: choose “Manual” in Engagement Policy, then
|
| 407 |
+
click a target in the video. The “beam” will track its aimpoint and accumulate dwell.</div>
|
| 408 |
+
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
| 409 |
|
| 410 |
+
<div class="engage-right">
|
| 411 |
+
<div class="panel radar">
|
| 412 |
+
<h3>
|
| 413 |
+
<span>Radar / Relative Geometry</span>
|
| 414 |
+
<span class="rightnote">Dynamic</span>
|
| 415 |
+
</h3>
|
| 416 |
+
<canvas id="radarCanvas" width="600" height="260" class="full-size"></canvas>
|
| 417 |
+
</div>
|
| 418 |
|
| 419 |
+
<div class="panel" style="flex:1; min-height:0">
|
| 420 |
+
<h3>
|
| 421 |
+
<span>Live Track Cards</span>
|
| 422 |
+
<span class="rightnote" id="liveStamp">—</span>
|
| 423 |
+
</h3>
|
| 424 |
+
<div class="list" id="trackList" style="max-height:none"></div>
|
| 425 |
+
</div>
|
|
|
|
| 426 |
</div>
|
| 427 |
</div>
|
| 428 |
+
</section>
|
| 429 |
|
| 430 |
+
<!-- ===== Tab 3 ===== -->
|
| 431 |
+
<section class="tab" id="tab-trade">
|
| 432 |
+
<div class="trade-grid">
|
| 433 |
+
<div class="panel plot">
|
| 434 |
+
<h3>
|
| 435 |
+
<span>Range Sensitivity · Max vs Required Power · Dwell</span>
|
| 436 |
+
<span class="rightnote">Interactive</span>
|
| 437 |
+
</h3>
|
| 438 |
+
<canvas id="tradeCanvas" width="1100" height="420" class="full-size"></canvas>
|
| 439 |
+
</div>
|
| 440 |
|
| 441 |
+
<div class="panel">
|
| 442 |
+
<h3>
|
| 443 |
+
<span>Trade Controls</span>
|
| 444 |
+
<span class="rightnote">What-if</span>
|
| 445 |
+
</h3>
|
| 446 |
+
<div class="hint">This plot is computed from your current HEL and atmosphere knobs. It uses the selected
|
| 447 |
+
target’s baseline requirements (from Tab 1) as a reference curve.</div>
|
| 448 |
|
| 449 |
+
<div class="mt-md">
|
| 450 |
+
<label>Selected target for curve</label>
|
| 451 |
+
<select id="tradeTarget"></select>
|
| 452 |
+
</div>
|
| 453 |
+
|
| 454 |
+
<div class="grid2 mt-sm">
|
| 455 |
+
<div>
|
| 456 |
+
<label>Range sweep min (m)</label>
|
| 457 |
+
<input id="rMin" type="number" value="200" min="50" max="10000" step="50" />
|
| 458 |
+
</div>
|
| 459 |
+
<div>
|
| 460 |
+
<label>Range sweep max (m)</label>
|
| 461 |
+
<input id="rMax" type="number" value="6000" min="100" max="20000" step="50" />
|
| 462 |
+
</div>
|
| 463 |
+
</div>
|
| 464 |
+
|
| 465 |
+
<div class="row mt-md">
|
| 466 |
+
<label>Show P(kill)</label>
|
| 467 |
+
<select id="showPk">
|
| 468 |
+
<option value="on">On</option>
|
| 469 |
+
<option value="off">Off</option>
|
| 470 |
+
</select>
|
| 471 |
+
</div>
|
| 472 |
+
|
| 473 |
+
<div class="btnrow">
|
| 474 |
+
<button class="btn secondary" id="btnReplot">Replot</button>
|
| 475 |
+
<button class="btn secondary" id="btnSnap">Snapshot (log)</button>
|
| 476 |
+
</div>
|
| 477 |
+
|
| 478 |
+
<div class="hint">This tab is designed to look like a weapon trade-space console: propagation, lethality
|
| 479 |
+
margin, and dwell inflation with range and atmosphere.</div>
|
| 480 |
+
</div>
|
| 481 |
+
</div>
|
| 482 |
+
</section>
|
| 483 |
+
</main>
|
| 484 |
+
</div>
|
| 485 |
|
| 486 |
+
<footer>
|
| 487 |
+
<div>Demo mode · Unclassified visuals · Integrate your APIs where marked</div>
|
| 488 |
+
<div class="mono" id="telemetry">HEL=60kW · VIS=16km · Cn²=5/10 · AO=7/10 · DET=6Hz</div>
|
| 489 |
+
</footer>
|
| 490 |
|
| 491 |
+
<!-- Hidden video used only for first-frame capture -->
|
| 492 |
+
<video id="videoHidden" playsinline muted style="display:none"></video>
|
| 493 |
</div>
|
| 494 |
|
| 495 |
<script>
|
LaserPerception/LaserPerception.js
CHANGED
|
@@ -151,15 +151,7 @@
|
|
| 151 |
const trackCount = $("#trackCount");
|
| 152 |
const frameTrackList = $("#frameTrackList");
|
| 153 |
// Removed old summary references
|
| 154 |
-
|
| 155 |
-
const mMaxP = $("#mMaxP");
|
| 156 |
-
const mReqP = $("#mReqP");
|
| 157 |
-
const mMargin = $("#mMargin");
|
| 158 |
-
const mPlan = $("#mPlan");
|
| 159 |
-
const mMaxPSub = $("#mMaxPSub");
|
| 160 |
-
const mReqPSub = $("#mReqPSub");
|
| 161 |
-
const mMarginSub = $("#mMarginSub");
|
| 162 |
-
const mPlanSub = $("#mPlanSub");
|
| 163 |
|
| 164 |
const videoHidden = $("#videoHidden");
|
| 165 |
|
|
@@ -398,7 +390,11 @@
|
|
| 398 |
$$(".tab").forEach(t => t.classList.remove("active"));
|
| 399 |
$(`#tab-${tab}`).classList.add("active");
|
| 400 |
if (tab === "trade") renderTrade();
|
| 401 |
-
if (tab === "engage")
|
|
|
|
|
|
|
|
|
|
|
|
|
| 402 |
});
|
| 403 |
});
|
| 404 |
|
|
@@ -486,8 +482,8 @@
|
|
| 486 |
clearCanvas(engageOverlay);
|
| 487 |
renderRadar();
|
| 488 |
|
| 489 |
-
|
| 490 |
-
renderSummary();
|
| 491 |
renderFeatures(null);
|
| 492 |
renderTrade();
|
| 493 |
|
|
@@ -1948,7 +1944,7 @@
|
|
| 1948 |
moveCursorToRect(btnReason.getBoundingClientRect());
|
| 1949 |
setTimeout(() => moveCursorToRect(frameCanvas.getBoundingClientRect()), 260);
|
| 1950 |
setTimeout(() => moveCursorToRect(objList.getBoundingClientRect()), 560);
|
| 1951 |
-
setTimeout(() => moveCursorToRect(summaryTable.getBoundingClientRect()), 880);
|
| 1952 |
}
|
| 1953 |
|
| 1954 |
try {
|
|
@@ -2068,7 +2064,7 @@
|
|
| 2068 |
btnRecompute.addEventListener("click", () => {
|
| 2069 |
if (!state.hasReasoned) return;
|
| 2070 |
recomputeHEL();
|
| 2071 |
-
renderSummary();
|
| 2072 |
renderFrameOverlay();
|
| 2073 |
renderTrade();
|
| 2074 |
log("Recomputed HEL metrics using current knobs (no new detection).", "t");
|
|
@@ -2083,9 +2079,9 @@
|
|
| 2083 |
btnReason.style.opacity = "1";
|
| 2084 |
btnReason.style.cursor = "pointer";
|
| 2085 |
btnCancelReason.style.display = "none"; // Hide Cancel button
|
| 2086 |
-
|
| 2087 |
renderFrameOverlay();
|
| 2088 |
-
renderSummary();
|
| 2089 |
renderFeatures(null);
|
| 2090 |
renderTrade();
|
| 2091 |
log("Cleared Tab 1 outputs.", "w");
|
|
@@ -2156,7 +2152,7 @@
|
|
| 2156 |
}
|
| 2157 |
|
| 2158 |
summaryStamp.textContent = new Date().toLocaleTimeString();
|
| 2159 |
-
renderSummary();
|
| 2160 |
refreshTradeTargets();
|
| 2161 |
}
|
| 2162 |
|
|
@@ -2276,39 +2272,7 @@
|
|
| 2276 |
}
|
| 2277 |
}
|
| 2278 |
|
| 2279 |
-
|
| 2280 |
-
const tbody = summaryTable.querySelector("tbody");
|
| 2281 |
-
tbody.innerHTML = "";
|
| 2282 |
-
if (!state.detections.length) {
|
| 2283 |
-
tbody.innerHTML = `<tr><td class="k">—</td><td colspan="7" class="mini">No outputs yet. Click <b>Reason</b>.</td></tr>`;
|
| 2284 |
-
mMaxP.textContent = "—";
|
| 2285 |
-
mReqP.textContent = "—";
|
| 2286 |
-
mMargin.textContent = "—";
|
| 2287 |
-
mPlan.textContent = "—";
|
| 2288 |
-
return;
|
| 2289 |
-
}
|
| 2290 |
-
|
| 2291 |
-
state.detections.forEach(d => {
|
| 2292 |
-
const tr = document.createElement("tr");
|
| 2293 |
-
const range = d.baseRange_m ?? 0;
|
| 2294 |
-
const reqP = d.reqP_kW ?? 0;
|
| 2295 |
-
const maxP = d.maxP_kW ?? 0;
|
| 2296 |
-
const dwell = d.baseDwell_s ?? 0;
|
| 2297 |
-
const p = d.pkill ?? 0;
|
| 2298 |
-
|
| 2299 |
-
tr.innerHTML = `
|
| 2300 |
-
<td class="k">${d.id}</td>
|
| 2301 |
-
<td>${escapeHtml(d.label)}</td>
|
| 2302 |
-
<td class="k">${Math.round(range)}</td>
|
| 2303 |
-
<td class="k">${escapeHtml(d.aim?.label || "center")}</td>
|
| 2304 |
-
<td class="k">${reqP.toFixed(1)} kW</td>
|
| 2305 |
-
<td class="k">${maxP.toFixed(1)} kW</td>
|
| 2306 |
-
<td class="k">${dwell.toFixed(1)} s</td>
|
| 2307 |
-
<td class="k">${Math.round(p * 100)}%</td>
|
| 2308 |
-
`;
|
| 2309 |
-
tbody.appendChild(tr);
|
| 2310 |
-
});
|
| 2311 |
-
}
|
| 2312 |
|
| 2313 |
function escapeHtml(s) {
|
| 2314 |
return s.replace(/[&<>"']/g, m => ({ "&": "&", "<": "<", ">": ">", '"': """, "'": "'" }[m]));
|
|
@@ -2373,10 +2337,8 @@
|
|
| 2373 |
.sort((a, b) => (a.d.bbox.w * a.d.bbox.h) - (b.d.bbox.w * b.d.bbox.h))[0];
|
| 2374 |
|
| 2375 |
if (hit) {
|
| 2376 |
-
|
| 2377 |
-
renderObjectList();
|
| 2378 |
renderFeatures(hit.d);
|
| 2379 |
-
renderFrameOverlay();
|
| 2380 |
renderTrade();
|
| 2381 |
}
|
| 2382 |
};
|
|
|
|
| 151 |
const trackCount = $("#trackCount");
|
| 152 |
const frameTrackList = $("#frameTrackList");
|
| 153 |
// Removed old summary references
|
| 154 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 155 |
|
| 156 |
const videoHidden = $("#videoHidden");
|
| 157 |
|
|
|
|
| 390 |
$$(".tab").forEach(t => t.classList.remove("active"));
|
| 391 |
$(`#tab-${tab}`).classList.add("active");
|
| 392 |
if (tab === "trade") renderTrade();
|
| 393 |
+
if (tab === "engage") {
|
| 394 |
+
resizeOverlays();
|
| 395 |
+
renderRadar();
|
| 396 |
+
renderTrackCards();
|
| 397 |
+
}
|
| 398 |
});
|
| 399 |
});
|
| 400 |
|
|
|
|
| 482 |
clearCanvas(engageOverlay);
|
| 483 |
renderRadar();
|
| 484 |
|
| 485 |
+
renderFrameTrackList();
|
| 486 |
+
// renderSummary();
|
| 487 |
renderFeatures(null);
|
| 488 |
renderTrade();
|
| 489 |
|
|
|
|
| 1944 |
moveCursorToRect(btnReason.getBoundingClientRect());
|
| 1945 |
setTimeout(() => moveCursorToRect(frameCanvas.getBoundingClientRect()), 260);
|
| 1946 |
setTimeout(() => moveCursorToRect(objList.getBoundingClientRect()), 560);
|
| 1947 |
+
// setTimeout(() => moveCursorToRect(summaryTable.getBoundingClientRect()), 880);
|
| 1948 |
}
|
| 1949 |
|
| 1950 |
try {
|
|
|
|
| 2064 |
btnRecompute.addEventListener("click", () => {
|
| 2065 |
if (!state.hasReasoned) return;
|
| 2066 |
recomputeHEL();
|
| 2067 |
+
// renderSummary();
|
| 2068 |
renderFrameOverlay();
|
| 2069 |
renderTrade();
|
| 2070 |
log("Recomputed HEL metrics using current knobs (no new detection).", "t");
|
|
|
|
| 2079 |
btnReason.style.opacity = "1";
|
| 2080 |
btnReason.style.cursor = "pointer";
|
| 2081 |
btnCancelReason.style.display = "none"; // Hide Cancel button
|
| 2082 |
+
renderFrameTrackList();
|
| 2083 |
renderFrameOverlay();
|
| 2084 |
+
// renderSummary();
|
| 2085 |
renderFeatures(null);
|
| 2086 |
renderTrade();
|
| 2087 |
log("Cleared Tab 1 outputs.", "w");
|
|
|
|
| 2152 |
}
|
| 2153 |
|
| 2154 |
summaryStamp.textContent = new Date().toLocaleTimeString();
|
| 2155 |
+
// renderSummary();
|
| 2156 |
refreshTradeTargets();
|
| 2157 |
}
|
| 2158 |
|
|
|
|
| 2272 |
}
|
| 2273 |
}
|
| 2274 |
|
| 2275 |
+
// renderSummary removed
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2276 |
|
| 2277 |
function escapeHtml(s) {
|
| 2278 |
return s.replace(/[&<>"']/g, m => ({ "&": "&", "<": "<", ">": ">", '"': """, "'": "'" }[m]));
|
|
|
|
| 2337 |
.sort((a, b) => (a.d.bbox.w * a.d.bbox.h) - (b.d.bbox.w * b.d.bbox.h))[0];
|
| 2338 |
|
| 2339 |
if (hit) {
|
| 2340 |
+
selectObject(hit.d.id);
|
|
|
|
| 2341 |
renderFeatures(hit.d);
|
|
|
|
| 2342 |
renderTrade();
|
| 2343 |
}
|
| 2344 |
};
|