@@ -380,12 +528,12 @@
artNC
@@ -615,6 +763,7 @@
artNC
requestAnimationFrame(() => {
resizeSim("gen");
resizeSim("text");
+ resizeSim("dxf");
});
};
});
@@ -642,11 +791,43 @@ artNC
return json;
}
+ function applyTransport(fd) {
+ fd.set("transport", qs("transport").value);
+ fd.set("host", qs("host").value.trim());
+ fd.set("port", qs("port").value.trim());
+ fd.set("serial_port", qs("serial_port").value.trim());
+ fd.set("serial_baud", qs("serial_baud").value.trim());
+ }
+
+ function updateTransportUI() {
+ const isSerial = qs("transport").value === "serial";
+ document.querySelectorAll(".serial-only").forEach(el => el.style.display = isSerial ? "" : "none");
+ document.querySelectorAll(".tcp-only").forEach(el => el.style.display = isSerial ? "none" : "");
+ }
+
+ async function refreshSerialPorts(showError = false) {
+ const errEl = qs("serial_err");
+ if (errEl) errEl.textContent = "";
+ try {
+ const out = await getJson("/api/serial_ports");
+ const dl = qs("serial_ports");
+ if (!dl) return;
+ dl.innerHTML = "";
+ out.ports.forEach(p => {
+ const opt = document.createElement("option");
+ opt.value = p.device;
+ opt.textContent = p.description || p.device;
+ dl.appendChild(opt);
+ });
+ } catch (e) {
+ if (showError && errEl) errEl.textContent = e.message || "błąd wykrywania portów";
+ }
+ }
+
// Sender
async function loadAcode() {
const fd = new FormData();
- fd.set("host", qs("host").value.trim());
- fd.set("port", qs("port").value.trim());
+ applyTransport(fd);
fd.set("acode", qs("acode").value);
const out = await post("/api/load", fd);
@@ -692,8 +873,7 @@ artNC
async function jog(dir) {
qs("jogerr").textContent = "";
const fd = new FormData();
- fd.set("host", qs("host").value.trim());
- fd.set("port", qs("port").value.trim());
+ applyTransport(fd);
fd.set("dir", dir);
fd.set("jog_mm", qs("jog_mm").value.trim());
fd.set("steps_per_mm", qs("steps_per_mm").value.trim());
@@ -710,8 +890,7 @@ artNC
qs("pen_up").onclick = () => {
qs("jogerr").textContent = "";
const fd = new FormData();
- fd.set("host", qs("host").value.trim());
- fd.set("port", qs("port").value.trim());
+ applyTransport(fd);
fd.set("mode", "up");
post("/api/pen", fd).catch(e => qs("jogerr").textContent = e.message);
};
@@ -719,8 +898,7 @@ artNC
qs("pen_down").onclick = () => {
qs("jogerr").textContent = "";
const fd = new FormData();
- fd.set("host", qs("host").value.trim());
- fd.set("port", qs("port").value.trim());
+ applyTransport(fd);
fd.set("mode", "down");
post("/api/pen", fd).catch(e => qs("jogerr").textContent = e.message);
};
@@ -728,8 +906,7 @@ artNC
qs("step_enable").onclick = () => {
qs("jogerr").textContent = "";
const fd = new FormData();
- fd.set("host", qs("host").value.trim());
- fd.set("port", qs("port").value.trim());
+ applyTransport(fd);
fd.set("cmd", qs("step_en_cmd").value.trim());
post("/api/steppers", fd).catch(e => qs("jogerr").textContent = e.message);
};
@@ -737,8 +914,7 @@ artNC
qs("step_disable").onclick = () => {
qs("jogerr").textContent = "";
const fd = new FormData();
- fd.set("host", qs("host").value.trim());
- fd.set("port", qs("port").value.trim());
+ applyTransport(fd);
fd.set("cmd", qs("step_dis_cmd").value.trim());
post("/api/steppers", fd).catch(e => qs("jogerr").textContent = e.message);
};
@@ -1066,9 +1242,19 @@ artNC
"simSpriteScaleText", "simSpriteScaleValText"
);
+ const simDxf = makeSim(
+ "dxf",
+ "d_previmg", "simCanvasDxf",
+ "simWheelbaseDxf", "simPosDxf", "simScrubDxf",
+ "simPlayDxf", "simPauseDxf", "simResetDxf",
+ "simSpeedDxf", "simSpeedValDxf",
+ "simSpriteScaleDxf", "simSpriteScaleValDxf"
+ );
+
function resizeSim(which) {
if (which === "gen") simGen.resize();
if (which === "text") simText.resize();
+ if (which === "dxf") simDxf.resize();
}
// ----------------------------
@@ -1131,8 +1317,7 @@ artNC
qs("generr").textContent = "";
if (!lastGenId) throw new Error("generate first");
const fd = new FormData();
- fd.set("host", qs("host").value.trim());
- fd.set("port", qs("port").value.trim());
+ applyTransport(fd);
const out = await post("/api/push_to_sender", fd);
qs("acode").value = "loaded from generator (" + out.lines + " lines)\n";
@@ -1242,8 +1427,7 @@ artNC
syncTextVizDefaults();
if (!lastTextId) throw new Error("generate first");
const fd = new FormData();
- fd.set("host", qs("host").value.trim());
- fd.set("port", qs("port").value.trim());
+ applyTransport(fd);
const out = await post("/api/push_to_sender", fd);
qs("acode").value = "loaded from text outline (" + out.lines + " lines)\n";
@@ -1262,6 +1446,71 @@ artNC
};
loadFonts();
+
+ // ----------------------------
+ // DXF -> ACODE
+ // ----------------------------
+ let lastDxfId = "";
+
+ async function convertDxf() {
+ qs("dxf_err").textContent = "";
+ const file = qs("dxf").files[0];
+ if (!file) throw new Error("select a DXF first");
+
+ const fd = new FormData();
+ fd.set("dxf", file);
+ fd.set("feed_lin", formVal("d_feed_lin"));
+ fd.set("feed_turn", formVal("d_feed_turn"));
+ fd.set("feed_arc", formVal("d_feed_arc"));
+ fd.set("flat_step", formVal("d_flat_step"));
+ fd.set("epsilon", formVal("d_epsilon"));
+ fd.set("arc_seg_mm", formVal("d_arc_seg_mm"));
+ fd.set("arc_seg_deg", formVal("d_arc_seg_deg"));
+
+ fd.set("viz_dpi", formVal("d_viz_dpi"));
+ fd.set("viz_arc_step_mm", formVal("d_viz_arc_step_mm"));
+ fd.set("viz_arc_step_deg", formVal("d_viz_arc_step_deg"));
+ if (qs("d_viz_equal").checked) fd.set("viz_equal", "1");
+ if (qs("d_viz_invert_y").checked) fd.set("viz_invert_y", "1");
+ if (qs("d_viz_home_resets_pose").checked) fd.set("viz_home_resets_pose", "1");
+
+ const out = await post("/api/dxf_to_acode", fd);
+ lastDxfId = out.gen_id;
+
+ qs("dxf_info").textContent = "gen_id: " + out.gen_id + " lines: " + out.acode_lines;
+ qs("d_previmg").src = "/preview/" + out.gen_id + ".png?ts=" + Date.now();
+ await simDxf.loadData(out.gen_id);
+ }
+
+ qs("dxf_gen").onclick = () => convertDxf().catch(e => qs("dxf_err").textContent = e.message);
+
+ qs("dxf_push").onclick = async () => {
+ qs("dxf_err").textContent = "";
+ if (!lastDxfId) throw new Error("generate first");
+ const fd = new FormData();
+ applyTransport(fd);
+ const out = await post("/api/push_to_sender", fd);
+
+ qs("acode").value = "loaded from dxf (" + out.lines + " lines)\n";
+ qs("loaded").textContent = "loaded lines: " + out.lines;
+
+ document.querySelector('.tab[data-tab="sender"]').click();
+ };
+
+ qs("dxf_download").onclick = () => {
+ qs("dxf_err").textContent = "";
+ if (!lastDxfId) {
+ qs("dxf_err").textContent = "generate first";
+ return;
+ }
+ window.location.href = "/download/" + lastDxfId + ".acode";
+ };
+
+ // Transport UI wiring
+ qs("transport").onchange = () => updateTransportUI();
+ qs("serial_refresh").onclick = () => refreshSerialPorts(true);
+ updateTransportUI();
+ refreshSerialPorts(false);