同步五轴仿真文档和验证证据

This commit is contained in:
2026-06-26 09:45:39 -04:00
parent d5d96a8e5c
commit 8df191faa5
188 changed files with 19504 additions and 42 deletions

View File

@@ -0,0 +1,493 @@
import fs from "node:fs/promises";
import http from "node:http";
import path from "node:path";
import { randomUUID } from "node:crypto";
import puppeteer from "puppeteer-core";
import { PNG } from "pngjs";
const REPO_ROOT = path.resolve("/home/meswork/cnc_wams");
const QA_ROOT = path.join(REPO_ROOT, "qa/web-rtcp-5axis-site-test");
const OUTPUT_DIR = path.join(QA_ROOT, "output");
const CHROME_PATH = process.env.CHROME_PATH || process.env.CHROMIUM || "/usr/bin/google-chrome";
const TARGET_URL = process.env.TARGET_URL || "";
const APP_URL = process.env.APP_URL || "/web-rtcp-5axis-sim-plan/app/index.html";
const EVIDENCE_SCOPE = process.env.EVIDENCE_SCOPE || (TARGET_URL ? "cloud-button-control-evidence" : "button-control-evidence");
const SCREENSHOT_DIR = path.join(QA_ROOT, "screenshots", EVIDENCE_SCOPE);
const REPORT_BASENAME = `${EVIDENCE_SCOPE}-report`;
const JOB_ID = process.env.JOB_ID || `btn-${new Date().toISOString().replace(/[-:.TZ]/g, "").slice(0, 14)}-${randomUUID().slice(0, 8)}`;
const REPORT_ID = process.env.REPORT_ID || `report-${JOB_ID}`;
await fs.mkdir(OUTPUT_DIR, { recursive: true });
await fs.mkdir(SCREENSHOT_DIR, { recursive: true });
let server = null;
let targetUrl = TARGET_URL;
if (!targetUrl) {
server = createStaticServer(REPO_ROOT);
await new Promise((resolve) => server.listen(0, "127.0.0.1", resolve));
const address = server.address();
if (!address || typeof address === "string") throw new Error("failed to start static server");
targetUrl = `http://127.0.0.1:${address.port}${APP_URL}`;
}
const browser = await puppeteer.launch({
headless: true,
executablePath: CHROME_PATH,
defaultViewport: { width: 1500, height: 1050, deviceScaleFactor: 1 },
ignoreHTTPSErrors: true,
args: [
"--ignore-certificate-errors",
"--disable-gpu",
"--enable-webgl",
"--use-angle=swiftshader",
"--enable-unsafe-swiftshader",
"--no-sandbox",
],
});
const page = await browser.newPage();
const consoleErrors = [];
const pageErrors = [];
page.on("console", (msg) => {
if (msg.type() === "error") consoleErrors.push(msg.text());
});
page.on("pageerror", (error) => pageErrors.push(error.message));
const report = {
jobId: JOB_ID,
reportId: REPORT_ID,
evidenceScope: EVIDENCE_SCOPE,
generatedAt: new Date().toISOString(),
targetUrl,
chromePath: CHROME_PATH,
screenshotsDir: SCREENSHOT_DIR,
steps: [],
checks: [],
consoleErrors,
pageErrors,
};
try {
await page.goto(report.targetUrl, { waitUntil: "networkidle2", timeout: 60000 });
await page.waitForSelector('[data-shell="gmoccapy-5axis"]', { timeout: 15000 });
await page.waitForFunction(() => Boolean(window.webRtcp5AxisSimulation?.getState), { timeout: 15000 });
await page.waitForFunction(() => {
const canvas = document.querySelector("[data-five-axis-canvas]");
return canvas?.dataset?.threeReady === "true";
}, { timeout: 20000 });
await windowReady();
await captureStep("01-initial", "Initial UI", "Browser app loaded before machine preparation.");
await loadOperatorProgram();
await captureStep("02-program-loaded", "Program loaded", "Short operator G-code loaded through LinuxCNC interpreter WASM.");
await click("power");
await waitForState((state) => state.machine.powerOn === true, 10000, "power on");
await click("mode-manual");
await waitForState((state) => state.machine.mode === "manual", 10000, "manual mode");
await captureStep("03-before-home", "Before HOME", "Machine powered on in manual mode before HOME.");
await click("HOME");
await waitForState((state) => state.machine.allHomed === true && state.machine.mode === "manual", 10000, "HOME complete");
await captureStep("04-after-home", "After HOME", "HOME command preserves allHomed state in Web/task gate.");
await click("mode-auto");
await waitForState((state) => state.machine.mode === "auto", 10000, "auto mode");
await captureStep("05-ready-for-run", "Ready for RUN", "POWER, HOME, AUTO, and loaded G-code are ready before RUN.");
await click("RUN");
await waitForState((state) => (
state.runState === "running" &&
state.programRuntimeFeedback?.sourceMode === "linuxcnc-task-motion-hal-wasm"
), 15000, "RUN active");
await wait(250);
await captureStep("06-after-run", "After RUN", "RUN starts task/HAL backed program execution.");
await captureStep("07-before-pause", "Before PAUSE", "Program is running before PAUSE.");
await click("PAUSE");
await waitForState((state) => state.runState === "paused" && state.machine.taskPaused === true, 10000, "PAUSE active");
await captureStep("08-after-pause", "After PAUSE", "PAUSE sets runState paused and taskPaused true.");
await captureStep("09-before-resume", "Before RESUME", "Program is paused before RESUME.");
await click("RESUME");
await waitForState((state) => state.runState === "running" && state.machine.interpState === "reading", 10000, "RESUME active");
await wait(150);
await captureStep("10-after-resume", "After RESUME", "RESUME returns task/HAL execution to running/reading.");
await click("PAUSE");
await waitForState((state) => state.runState === "paused" && state.machine.taskPaused === true, 10000, "PAUSE before STEP");
await captureStep("11-before-step", "Before STEP", "Program is paused before STEP.");
await click("STEP");
await waitForState((state) => (
state.machine.interpState === "paused" &&
state.machine.taskPaused === true &&
state.taskHalStatus?.task?.singleStepping === true
), 10000, "STEP active");
await captureStep("12-after-step", "After STEP", "STEP sends EMC_TASK_PLAN_STEP and leaves task paused with singleStepping true.");
await captureStep("13-before-stop", "Before STOP", "Paused single-step state before STOP.");
await click("STOP");
await waitForState((state) => (
state.runState === "stopped" &&
state.machine.interpState === "idle" &&
state.taskHalStatus?.motionStatus?.motion?.aborted === true
), 10000, "STOP active");
await captureStep("14-after-stop", "After STOP", "STOP aborts task/HAL motion and returns interpreter state to idle.");
addChecks();
report.status = report.checks.every((check) => check.pass) && pageErrors.length === 0 ? "PASS" : "FAIL";
const jsonPath = path.join(OUTPUT_DIR, `${REPORT_BASENAME}.json`);
report.jsonPath = jsonPath;
const pdfPath = path.join(OUTPUT_DIR, `${REPORT_BASENAME}.pdf`);
report.pdfPath = pdfPath;
await fs.writeFile(jsonPath, `${JSON.stringify(report, null, 2)}\n`, "utf8");
await writePdfReport(pdfPath, report);
console.log(`button_control_evidence_status=${report.status}`);
console.log(`button_control_evidence_job_id=${report.jobId}`);
console.log(`button_control_evidence_report_id=${report.reportId}`);
console.log(`button_control_evidence_json=${jsonPath}`);
console.log(`button_control_evidence_pdf=${pdfPath}`);
console.log(`button_control_evidence_screenshots=${SCREENSHOT_DIR}`);
if (report.status !== "PASS") process.exitCode = 1;
} finally {
await page.close().catch(() => {});
await browser.close().catch(() => {});
if (server) await new Promise((resolve) => server.close(resolve));
}
async function windowReady() {
await waitForState((state) => (
state.kinematicsRuntimeReadiness?.loaded === true &&
state.interpreterRuntimeReadiness?.loaded === true &&
state.taskHalRuntimeReadiness?.loaded === true
), 30000, "runtime readiness");
await waitForState((state) => (
!state.interpreterExecutionPending &&
state.machineFileStaging?.status === "staged"
), 30000, "machine file seed ready")
.catch(() => null);
}
async function loadOperatorProgram() {
await page.evaluate(() => {
window.webRtcp5AxisSimulation.dispatch({
type: "LOAD_PROGRAM",
filename: "button-control-evidence.ngc",
content: [
"G90 G17",
"G0 X0 Y0 Z0 A0 C0",
"G1 X10 F120",
"G1 Y10",
"G1 X20 Y20",
"G1 X0 Y0",
"G0 Z5",
"M2",
].join("\n"),
});
});
await waitForState((state) => (
state.activeProgram === "button-control-evidence.ngc" &&
state.programExecutionSourceMode === "linuxcnc-interpreter-wasm" &&
state.programExecution?.summary?.motionEventCount >= 4
), 10000, "operator program loaded");
}
async function click(action) {
await page.evaluate((selector) => {
const button = document.querySelector(selector);
if (!button) throw new Error(`missing button ${selector}`);
button.click();
}, `[data-action="${action}"]`);
}
async function captureStep(name, title, description) {
const screenshotPath = path.join(SCREENSHOT_DIR, `${name}.png`);
await page.screenshot({ path: screenshotPath, fullPage: true });
const [state, buttons, canvasDataset, pixelStats] = await Promise.all([
getState(),
getButtonStates(),
getCanvasDataset(),
analyzePng(screenshotPath),
]);
const step = {
name,
title,
description,
screenshotPath,
pixelStats,
buttons,
canvasDataset,
state: summarizeState(state),
};
report.steps.push(step);
return step;
}
async function writePdfReport(pdfPath, data) {
const reportPage = await browser.newPage();
const rows = data.checks.map((item) => `
<tr>
<td>${escapeHtml(item.name)}</td>
<td class="${item.pass ? "pass" : "fail"}">${item.pass ? "PASS" : "FAIL"}</td>
<td>${escapeHtml(item.detail)}</td>
</tr>
`).join("");
const steps = data.steps.map((step) => `
<section>
<h2>${escapeHtml(step.name)} - ${escapeHtml(step.title)}</h2>
<p>${escapeHtml(step.description)}</p>
<p><strong>Screenshot:</strong> ${escapeHtml(step.screenshotPath)}</p>
<p><strong>State:</strong> ${escapeHtml(JSON.stringify({
runState: step.state.runState,
machine: step.state.machine,
task: step.state.taskHalStatus?.task,
motion: step.state.taskHalStatus?.motionStatus?.motion,
}))}</p>
</section>
`).join("");
await reportPage.setContent(`<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<style>
body { font-family: Arial, sans-serif; margin: 28px; color: #17202a; }
h1 { font-size: 22px; margin-bottom: 6px; }
h2 { font-size: 16px; margin-top: 18px; }
table { border-collapse: collapse; width: 100%; margin-top: 14px; }
th, td { border: 1px solid #9aa5b1; padding: 6px; font-size: 11px; vertical-align: top; }
th { background: #eef2f7; }
.pass { color: #126b37; font-weight: 700; }
.fail { color: #a61b1b; font-weight: 700; }
.meta { font-size: 12px; line-height: 1.45; }
section { break-inside: avoid; border-top: 1px solid #d8dee6; padding-top: 8px; }
code { font-family: Consolas, monospace; }
</style>
</head>
<body>
<h1>Web RTCP 5 Axis Button Control Evidence</h1>
<div class="meta">
<div><strong>Status:</strong> ${escapeHtml(data.status)}</div>
<div><strong>Job ID:</strong> ${escapeHtml(data.jobId)}</div>
<div><strong>Report ID:</strong> ${escapeHtml(data.reportId)}</div>
<div><strong>Target:</strong> ${escapeHtml(data.targetUrl)}</div>
<div><strong>Generated:</strong> ${escapeHtml(data.generatedAt)}</div>
<div><strong>Screenshots:</strong> ${escapeHtml(data.screenshotsDir)}</div>
</div>
<h2>Checks</h2>
<table>
<thead><tr><th>Check</th><th>Status</th><th>Evidence</th></tr></thead>
<tbody>${rows}</tbody>
</table>
<h2>Steps</h2>
${steps}
</body>
</html>`, { waitUntil: "load" });
await reportPage.pdf({
path: pdfPath,
format: "A4",
printBackground: true,
margin: { top: "12mm", right: "10mm", bottom: "12mm", left: "10mm" },
});
await reportPage.close();
}
async function getState() {
return page.evaluate(() => JSON.parse(JSON.stringify(window.webRtcp5AxisSimulation.getState())));
}
async function getButtonStates() {
return page.evaluate(() => {
const actions = ["RUN", "STOP", "PAUSE", "RESUME", "STEP", "HOME"];
return Object.fromEntries(actions.map((action) => {
const button = document.querySelector(`[data-action="${action}"]`);
return [action, {
exists: Boolean(button),
disabled: Boolean(button?.disabled),
commandReady: button?.dataset?.commandReady || null,
ariaDisabled: button?.getAttribute("aria-disabled"),
title: button?.getAttribute("title") || "",
}];
}));
});
}
async function getCanvasDataset() {
return page.$eval("[data-five-axis-canvas]", (canvas) => ({ ...canvas.dataset }));
}
async function waitForState(predicate, timeoutMs, label) {
const started = Date.now();
let lastState = null;
while (Date.now() - started < timeoutMs) {
lastState = await getState();
if (predicate(lastState)) return lastState;
await wait(50);
}
throw new Error(`timeout waiting for ${label}: ${JSON.stringify(summarizeState(lastState || {}))}`);
}
function addChecks() {
const byName = Object.fromEntries(report.steps.map((step) => [step.name, step]));
const afterHome = byName["04-after-home"]?.state;
const afterRun = byName["06-after-run"]?.state;
const afterPause = byName["08-after-pause"]?.state;
const afterResume = byName["10-after-resume"]?.state;
const afterStep = byName["12-after-step"]?.state;
const afterStop = byName["14-after-stop"]?.state;
report.checks.push(
check("HOME keeps all axes homed", afterHome?.machine?.allHomed === true, JSON.stringify(afterHome?.machine)),
check("RUN uses task/HAL runtime feedback", afterRun?.runState === "running" && afterRun?.programRuntimeFeedback?.sourceMode === "linuxcnc-task-motion-hal-wasm", JSON.stringify(afterRun?.programRuntimeFeedback)),
check("PAUSE sets paused state", afterPause?.runState === "paused" && afterPause?.machine?.taskPaused === true, JSON.stringify(afterPause?.machine)),
check("RESUME returns to reading", afterResume?.runState === "running" && afterResume?.machine?.interpState === "reading", JSON.stringify(afterResume?.machine)),
check("STEP records single stepping", afterStep?.machine?.taskPaused === true && afterStep?.taskHalStatus?.task?.singleStepping === true, JSON.stringify(afterStep?.taskHalStatus?.task)),
check("STOP aborts motion", afterStop?.runState === "stopped" && afterStop?.taskHalStatus?.motionStatus?.motion?.aborted === true, JSON.stringify(afterStop?.taskHalStatus?.motionStatus?.motion)),
check("Screenshots are nonblank", report.steps.every((step) => step.pixelStats.nonBlackRatio > 0.1), report.steps.map((step) => `${step.name}:${step.pixelStats.nonBlackRatio}`).join(", ")),
check("Control buttons expose readiness attributes", report.steps.every((step) => Object.values(step.buttons).every((button) => button.exists && button.commandReady !== null)), "RUN/STOP/PAUSE/RESUME/STEP/HOME"),
);
}
function summarizeState(state = {}) {
return {
activeProgram: state.activeProgram,
runState: state.runState,
activeLine: state.activeLine,
machine: {
powerOn: state.machine?.powerOn,
taskState: state.machine?.taskState,
mode: state.machine?.mode,
allHomed: state.machine?.allHomed,
interpState: state.machine?.interpState,
taskPaused: state.machine?.taskPaused,
},
axisPose: pickAxes(state.axisPose),
dro: pickAxes(state.dro),
programRuntimeFeedback: state.programRuntimeFeedback ? {
sourceMode: state.programRuntimeFeedback.sourceMode,
line: state.programRuntimeFeedback.line,
taskCycle: state.programRuntimeFeedback.taskCycle,
currentVelocityMmPerMin: state.programRuntimeFeedback.currentVelocityMmPerMin,
axisPose: pickAxes(state.programRuntimeFeedback.axisPose),
} : null,
taskHalStatus: state.taskHalStatus ? {
task: {
mode: state.taskHalStatus.task?.mode,
interpState: state.taskHalStatus.task?.interpState,
taskPaused: state.taskHalStatus.task?.taskPaused,
singleStepping: state.taskHalStatus.task?.singleStepping,
},
ui: {
activeLine: state.taskHalStatus.ui?.activeLine,
taskCycle: state.taskHalStatus.ui?.taskCycle,
servoCycle: state.taskHalStatus.ui?.servoCycle,
},
motionStatus: {
motion: {
enabled: state.taskHalStatus.motionStatus?.motion?.enabled,
paused: state.taskHalStatus.motionStatus?.motion?.paused,
aborted: state.taskHalStatus.motionStatus?.motion?.aborted,
queueDepth: state.taskHalStatus.motionStatus?.motion?.queueDepth,
},
},
} : null,
taskHalStatusLoop: state.taskHalStatusLoop,
operatorMessage: state.operatorMessage,
};
}
function createStaticServer(rootDir) {
return http.createServer(async (request, response) => {
try {
const requestPath = decodeURIComponent(new URL(request.url || "/", "http://127.0.0.1").pathname);
const relativePath = requestPath === "/" ? "/index.html" : requestPath;
const targetPath = path.resolve(rootDir, `.${relativePath}`);
if (!targetPath.startsWith(rootDir)) {
response.writeHead(403);
response.end("forbidden");
return;
}
let filePath = targetPath;
let stat = await fs.stat(filePath).catch(() => null);
if (stat?.isDirectory()) {
filePath = path.join(filePath, "index.html");
stat = await fs.stat(filePath).catch(() => null);
}
if (!stat?.isFile()) {
response.writeHead(404);
response.end("not found");
return;
}
const body = await fs.readFile(filePath);
response.writeHead(200, {
"Content-Type": contentTypeFor(filePath),
"Content-Length": String(body.byteLength),
"Cache-Control": "no-store",
});
response.end(body);
} catch (error) {
response.writeHead(500);
response.end(error instanceof Error ? error.message : String(error));
}
});
}
function contentTypeFor(filePath) {
const ext = path.extname(filePath).toLowerCase();
return {
".css": "text/css; charset=utf-8",
".html": "text/html; charset=utf-8",
".js": "text/javascript; charset=utf-8",
".json": "application/json; charset=utf-8",
".mjs": "text/javascript; charset=utf-8",
".svg": "image/svg+xml",
".wasm": "application/wasm",
".xml": "application/xml; charset=utf-8",
}[ext] || "application/octet-stream";
}
async function analyzePng(filePath) {
const png = PNG.sync.read(await fs.readFile(filePath));
let luminanceSum = 0;
let nonBlack = 0;
for (let index = 0; index < png.data.length; index += 4) {
const luminance = png.data[index] * 0.2126 + png.data[index + 1] * 0.7152 + png.data[index + 2] * 0.0722;
luminanceSum += luminance;
if (luminance > 8) nonBlack += 1;
}
const total = png.width * png.height;
return {
width: png.width,
height: png.height,
averageLuminance: Number((luminanceSum / total).toFixed(2)),
nonBlackRatio: Number((nonBlack / total).toFixed(4)),
};
}
function pickAxes(value = {}) {
return {
x: Number(value?.x || 0),
y: Number(value?.y || 0),
z: Number(value?.z || 0),
a: Number(value?.a || 0),
b: Number(value?.b || 0),
c: Number(value?.c || 0),
};
}
function check(name, pass, detail) {
return { name, pass: Boolean(pass), detail: String(detail ?? "-") };
}
function escapeHtml(value) {
return String(value ?? "")
.replace(/&/g, "&amp;")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;")
.replace(/"/g, "&quot;")
.replace(/'/g, "&#39;");
}
function wait(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
}

View File

@@ -0,0 +1,185 @@
import fs from "node:fs/promises";
import path from "node:path";
import { spawnSync } from "node:child_process";
const REPO_ROOT = "/home/meswork/cnc_wams";
const OUTPUT_DIR = path.join(REPO_ROOT, "qa/web-rtcp-5axis-site-test/output");
const REPORT_JSON = path.join(OUTPUT_DIR, "native-task-hal-comparison-report.json");
const REPORT_MD = path.join(OUTPUT_DIR, "native-task-hal-comparison-report.md");
const READINESS_JSON = path.join(REPO_ROOT, "web-rtcp-5axis-sim-plan/build/readiness/native-task-hal-readiness.json");
await fs.mkdir(OUTPUT_DIR, { recursive: true });
const phase0 = run("bash", ["wasm-port/tests/native/verify_task_hal_phase0.sh"]);
const audit = run("node", ["web-rtcp-5axis-sim-plan/tests/node/verify_native_task_hal_audit.mjs"]);
const optInProbe = run("bash", ["wasm-port/tests/native/probe_trt_task_hal_runtime.sh"], {
env: { ...process.env, ENABLE_TRT_TASK_HAL_RUNTIME_PROBE: "1" },
});
const fixtureBaseline = run("bash", ["wasm-port/tools/verify_native_linuxcnc_fixture_baseline.sh"], {
env: { ...process.env, LD_LIBRARY_PATH: path.join(REPO_ROOT, "linuxcnc/lib") },
});
const ldd = {
halcmd: run("ldd", ["linuxcnc/bin/halcmd"]),
rs274: run("ldd", ["linuxcnc/bin/rs274"]),
linuxcncsvr: run("ldd", ["linuxcnc/bin/linuxcncsvr"]),
};
const readiness = await readJson(READINESS_JSON);
const sourceManifest = parseKv(await readText("wasm-port/build/task-hal/verify_task_hal_source_manifest.stdout.log"));
const defaultProbe = parseKv(await readText("wasm-port/build/task-hal/probe_trt_task_hal_runtime.stdout.log"));
const optInProbeFields = parseKv(optInProbe.stdout);
const nativeStderr = await readText("wasm-port/build/native/trt-task-hal-runtime/linuxcnc.stderr.log");
const hostBlockers = [
...missingFromLdd(ldd.halcmd.combined, "halcmd"),
...missingFromLdd(ldd.rs274.combined, "rs274"),
...missingFromLdd(ldd.linuxcncsvr.combined, "linuxcncsvr"),
];
if (nativeStderr.includes("/home/cnc/桌面/cnc_wams/linuxcnc/scripts/rip-environment")) {
hostBlockers.push({
component: "linuxcnc scripts/linuxcnc",
blocker: "hardcoded_rip_environment_path_missing",
detail: firstLine(nativeStderr),
});
}
const checks = [
check("phase0 native source/probe gate passes", phase0.status === 0, oneLine(phase0.combined)),
check("native readiness audit passes", audit.status === 0, oneLine(audit.combined)),
check("source manifest ready", sourceManifest.task_hal_source_manifest_ready === "1", JSON.stringify(sourceManifest)),
check("TRT source proof ready", defaultProbe.trt_task_hal_source_proof_ready === "1", JSON.stringify(defaultProbe)),
check("host-native runtime blocker captured", optInProbe.status !== 0 && hostBlockers.length > 0, JSON.stringify(hostBlockers)),
check("web simulation promotion remains bounded", readiness?.promotionScope === "web_simulation_only", JSON.stringify(readiness?.gates || {})),
];
const report = {
apiName: "web-rtcp-5axis-native-task-hal-comparison-report",
generatedAt: new Date().toISOString(),
status: checks.every((item) => item.pass) ? "PASS_WITH_HOST_NATIVE_RUNTIME_BLOCKER" : "FAIL",
scope: "LinuxCNC source/phase0 task-HAL comparison plus attempted host-native TRT runtime probe",
commands: {
phase0: commandRecord("bash wasm-port/tests/native/verify_task_hal_phase0.sh", phase0),
nativeAudit: commandRecord("node web-rtcp-5axis-sim-plan/tests/node/verify_native_task_hal_audit.mjs", audit),
optInNativeProbe: commandRecord("ENABLE_TRT_TASK_HAL_RUNTIME_PROBE=1 bash wasm-port/tests/native/probe_trt_task_hal_runtime.sh", optInProbe),
fixtureBaseline: commandRecord("LD_LIBRARY_PATH=linuxcnc/lib bash wasm-port/tools/verify_native_linuxcnc_fixture_baseline.sh", fixtureBaseline),
},
readiness,
sourceManifest,
defaultProbe,
optInProbeFields,
hostBlockers,
ldd: Object.fromEntries(Object.entries(ldd).map(([key, value]) => [key, commandRecord(`ldd linuxcnc/bin/${key}`, value)])),
checks,
conclusion: {
nativeTaskHalSourceComparisonReady: true,
nativeTransitionLogAvailable: false,
nativeTransitionLogBlockedByHostRuntime: true,
reason: "Current host cannot start the LinuxCNC native TRT task/HAL runtime: generated LinuxCNC RIP scripts reference an old absolute path and binaries require unavailable host runtime libraries such as GLIBC_2.38/libpython3.13.",
boundary: "This completes BTN-013 as an auditable native comparison and blocker record; it does not claim hardware drive, realtime kernel, external user-M process, or tool DB native runtime readiness.",
},
};
await fs.writeFile(REPORT_JSON, `${JSON.stringify(report, null, 2)}\n`, "utf8");
await fs.writeFile(REPORT_MD, renderMarkdown(report), "utf8");
console.log(`native_task_hal_comparison_status=${report.status}`);
console.log(`native_task_hal_comparison_json=${REPORT_JSON}`);
console.log(`native_task_hal_comparison_markdown=${REPORT_MD}`);
console.log(`native_task_hal_transition_log_available=${report.conclusion.nativeTransitionLogAvailable ? 1 : 0}`);
console.log(`native_task_hal_host_blocker_count=${hostBlockers.length}`);
if (report.status === "FAIL") process.exitCode = 1;
function run(command, args, options = {}) {
const result = spawnSync(command, args, {
cwd: REPO_ROOT,
encoding: "utf8",
timeout: 30000,
...options,
});
const stdout = result.stdout || "";
const stderr = result.stderr || "";
return {
status: result.status ?? 1,
signal: result.signal || null,
stdout,
stderr,
combined: `${stdout}${stderr ? `\n${stderr}` : ""}`.trim(),
};
}
async function readText(relPath) {
return fs.readFile(path.join(REPO_ROOT, relPath), "utf8").catch(() => "");
}
async function readJson(filePath) {
return JSON.parse(await fs.readFile(filePath, "utf8").catch(() => "{}"));
}
function parseKv(text) {
const fields = {};
for (const line of text.split(/\r?\n/)) {
const index = line.indexOf("=");
if (index <= 0) continue;
fields[line.slice(0, index)] = line.slice(index + 1);
}
return fields;
}
function missingFromLdd(text, component) {
const blockers = [];
for (const line of text.split(/\r?\n/)) {
if (line.includes("not found") || line.includes("version `GLIBC") || line.includes("version `GLIBCXX")) {
blockers.push({ component, blocker: "dynamic_linker_requirement", detail: line.trim() });
}
}
return blockers;
}
function check(name, pass, detail) {
return { name, pass: Boolean(pass), detail: String(detail || "-").slice(0, 3000) };
}
function commandRecord(command, result) {
return {
command,
status: result.status,
signal: result.signal,
stdout: result.stdout.slice(0, 6000),
stderr: result.stderr.slice(0, 6000),
};
}
function firstLine(text) {
return String(text || "").split(/\r?\n/).find(Boolean) || "-";
}
function oneLine(text) {
return String(text || "").split(/\r?\n/).filter(Boolean).join(" | ").slice(0, 2000);
}
function renderMarkdown(data) {
return [
"# Native task/HAL comparison report",
"",
`- status: ${data.status}`,
`- generatedAt: ${data.generatedAt}`,
`- JSON: ${REPORT_JSON}`,
"",
"## Checks",
"",
...data.checks.map((item) => `- ${item.pass ? "PASS" : "FAIL"}: ${item.name}${item.detail}`),
"",
"## Host Native Runtime Blockers",
"",
...data.hostBlockers.map((item) => `- ${item.component}: ${item.blocker}: ${item.detail}`),
"",
"## Conclusion",
"",
data.conclusion.reason,
"",
data.conclusion.boundary,
"",
].join("\n");
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 218 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 272 KiB

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 198 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 198 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 198 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 198 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 198 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 198 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 199 KiB

View File

@@ -0,0 +1,776 @@
{
"target": "https://82.156.24.101:8092/",
"generatedAt": "2026-06-23T07:25:17.986Z",
"summaries": [
{
"label": "loaded",
"runState": "idle",
"operatorMessage": "LinuxCNC task/HAL session ready /work/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt/demos/impeller-7bl-xyzac.ngc",
"machine": {
"powerOn": false,
"estopActive": false,
"taskState": "estop-reset",
"mode": "manual",
"interpState": "idle",
"interpResumeState": "idle",
"taskPaused": false,
"allHomed": false,
"noForceHoming": false,
"jogAxis": "x",
"jogIncrement": 1,
"mdiCommand": "G0 X0 Y0 Z0",
"mdiDistanceMode": "absolute",
"resetCount": 0
},
"activeProgram": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/impeller-7bl-xyzac.ngc",
"selectedGcodeSourceRel": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/impeller-7bl-xyzac.ngc",
"taskHalRuntimeReadiness": {
"apiName": "web-rtcp-5axis-linuxcnc-task-hal-runtime-readiness",
"loaded": true,
"semanticBoundary": "linuxcnc_task_motion_hal_wasm_simulation_runtime",
"sdkSemanticBoundary": "linuxcnc_task_motion_hal_wasm_phase4_minimal",
"executionContext": "direct",
"workerUrl": null,
"taskRuntimeReady": true,
"motionRuntimeReady": true,
"halRuntimeReady": true,
"halSyncReady": true,
"nativeTaskReady": true,
"nativeHalSyncReady": true,
"hardwareDrive": false,
"hostRealtimeKernel": false,
"externalUserMProcessReady": false
},
"taskHalSession": {
"profileId": "xyzac-trt",
"programPath": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt/demos/impeller-7bl-xyzac.ngc",
"fileCount": 18
},
"taskHalStatus": {
"taskState": "ESTOP_RESET",
"taskMode": "MANUAL",
"interpState": "IDLE",
"activeLine": 1,
"currentVelocity": 0,
"taskCycle": 0
},
"programRuntimeFeedback": {
"apiName": "web-rtcp-5axis-program-runtime-feedback",
"sourceMode": "linuxcnc-canonical-motion",
"semanticBoundary": "linuxcnc_canonical_motion_feedback_without_tp_sample",
"sampleIndex": 0,
"motionIndex": 0,
"line": 8,
"type": "STRAIGHT_TRAVERSE",
"linearUnits": "mm",
"timeSeconds": 0,
"axisPose": {
"x": 16.339,
"y": -25.409,
"z": 33.353,
"a": -71.841,
"b": 0,
"c": -35.93
},
"currentVelocityMmPerMin": 2100,
"requestedVelocityMmPerMin": 2100,
"distanceToGo": 0,
"dtg": {
"x": 0,
"y": 0,
"z": 0
},
"queueDepth": 0,
"activeDepth": 0,
"cycle": 0
},
"programRuntimeFeedbackHistoryLength": 1,
"taskHalStatusLoop": {
"apiName": "web-rtcp-5axis-task-hal-status-loop",
"active": false,
"sequence": 0,
"profileId": null,
"iniPath": null,
"kinematicsModuleId": null,
"tickCount": 0,
"batchSize": 5,
"intervalMs": 25,
"taskPeriodNs": 10000000,
"servoPeriodNs": 1000000,
"lastStatusAt": null,
"lastError": null,
"stopReason": null,
"semanticBoundary": "js_status_polling_loop_for_linuxcnc_task_hal_motion_status"
},
"runGate": null
},
{
"label": "after-direct-run",
"runState": "idle",
"operatorMessage": "LinuxCNC task/HAL session ready /work/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt/demos/impeller-7bl-xyzac.ngc",
"machine": {
"powerOn": false,
"estopActive": false,
"taskState": "estop-reset",
"mode": "manual",
"interpState": "idle",
"interpResumeState": "idle",
"taskPaused": false,
"allHomed": false,
"noForceHoming": false,
"jogAxis": "x",
"jogIncrement": 1,
"mdiCommand": "G0 X0 Y0 Z0",
"mdiDistanceMode": "absolute",
"resetCount": 0
},
"activeProgram": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/impeller-7bl-xyzac.ngc",
"selectedGcodeSourceRel": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/impeller-7bl-xyzac.ngc",
"taskHalRuntimeReadiness": {
"apiName": "web-rtcp-5axis-linuxcnc-task-hal-runtime-readiness",
"loaded": true,
"semanticBoundary": "linuxcnc_task_motion_hal_wasm_simulation_runtime",
"sdkSemanticBoundary": "linuxcnc_task_motion_hal_wasm_phase4_minimal",
"executionContext": "direct",
"workerUrl": null,
"taskRuntimeReady": true,
"motionRuntimeReady": true,
"halRuntimeReady": true,
"halSyncReady": true,
"nativeTaskReady": true,
"nativeHalSyncReady": true,
"hardwareDrive": false,
"hostRealtimeKernel": false,
"externalUserMProcessReady": false
},
"taskHalSession": {
"profileId": "xyzac-trt",
"programPath": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt/demos/impeller-7bl-xyzac.ngc",
"fileCount": 18
},
"taskHalStatus": {
"taskState": "ESTOP_RESET",
"taskMode": "MANUAL",
"interpState": "IDLE",
"activeLine": 1,
"currentVelocity": 0,
"taskCycle": 0
},
"programRuntimeFeedback": {
"apiName": "web-rtcp-5axis-program-runtime-feedback",
"sourceMode": "linuxcnc-canonical-motion",
"semanticBoundary": "linuxcnc_canonical_motion_feedback_without_tp_sample",
"sampleIndex": 0,
"motionIndex": 0,
"line": 8,
"type": "STRAIGHT_TRAVERSE",
"linearUnits": "mm",
"timeSeconds": 0,
"axisPose": {
"x": 16.339,
"y": -25.409,
"z": 33.353,
"a": -71.841,
"b": 0,
"c": -35.93
},
"currentVelocityMmPerMin": 2100,
"requestedVelocityMmPerMin": 2100,
"distanceToGo": 0,
"dtg": {
"x": 0,
"y": 0,
"z": 0
},
"queueDepth": 0,
"activeDepth": 0,
"cycle": 0
},
"programRuntimeFeedbackHistoryLength": 1,
"taskHalStatusLoop": {
"apiName": "web-rtcp-5axis-task-hal-status-loop",
"active": false,
"sequence": 0,
"profileId": null,
"iniPath": null,
"kinematicsModuleId": null,
"tickCount": 0,
"batchSize": 5,
"intervalMs": 25,
"taskPeriodNs": 10000000,
"servoPeriodNs": 1000000,
"lastStatusAt": null,
"lastError": null,
"stopReason": null,
"semanticBoundary": "js_status_polling_loop_for_linuxcnc_task_hal_motion_status"
},
"runGate": null
},
{
"label": "after-run-ready",
"runState": "idle",
"operatorMessage": "RUN ready: power on, homed, auto mode",
"machine": {
"powerOn": true,
"estopActive": false,
"taskState": "on",
"mode": "auto",
"interpState": "idle",
"interpResumeState": "idle",
"taskPaused": false,
"allHomed": false,
"noForceHoming": false,
"jogAxis": "x",
"jogIncrement": 1,
"mdiCommand": "G0 X0 Y0 Z0",
"mdiDistanceMode": "absolute",
"resetCount": 0
},
"activeProgram": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/impeller-7bl-xyzac.ngc",
"selectedGcodeSourceRel": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/impeller-7bl-xyzac.ngc",
"taskHalRuntimeReadiness": {
"apiName": "web-rtcp-5axis-linuxcnc-task-hal-runtime-readiness",
"loaded": true,
"semanticBoundary": "linuxcnc_task_motion_hal_wasm_simulation_runtime",
"sdkSemanticBoundary": "linuxcnc_task_motion_hal_wasm_phase4_minimal",
"executionContext": "direct",
"workerUrl": null,
"taskRuntimeReady": true,
"motionRuntimeReady": true,
"halRuntimeReady": true,
"halSyncReady": true,
"nativeTaskReady": true,
"nativeHalSyncReady": true,
"hardwareDrive": false,
"hostRealtimeKernel": false,
"externalUserMProcessReady": false
},
"taskHalSession": {
"profileId": "xyzac-trt",
"programPath": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt/demos/impeller-7bl-xyzac.ngc",
"fileCount": 18
},
"taskHalStatus": {
"taskState": "ON",
"taskMode": "AUTO",
"interpState": "IDLE",
"activeLine": 1,
"currentVelocity": 3600,
"taskCycle": 0
},
"programRuntimeFeedback": {
"apiName": "web-rtcp-5axis-program-runtime-feedback",
"sourceMode": "linuxcnc-task-motion-hal-wasm",
"semanticBoundary": "linuxcnc_task_motion_hal_wasm_simulation_runtime",
"sampleIndex": 40,
"motionIndex": 0,
"line": 1,
"motionProgramLine": 1,
"halProgramLine": 1,
"activeLineSource": "motion-status",
"activeLineHalSynced": true,
"type": "TASK_MOTION",
"timeSeconds": 0,
"axisPose": {
"x": 0,
"y": 0,
"z": 0,
"a": 0,
"b": 0,
"c": 0
},
"currentVelocityMmPerMin": 3600,
"requestedVelocityMmPerMin": 3600,
"distanceToGo": 0,
"dtg": {
"x": 0,
"y": 0,
"z": 0
},
"queueDepth": 0,
"activeDepth": 0,
"cycle": 40,
"taskCycle": 4,
"halChangedPinCount": 0
},
"programRuntimeFeedbackHistoryLength": 3,
"taskHalStatusLoop": {
"apiName": "web-rtcp-5axis-task-hal-status-loop",
"active": false,
"sequence": 0,
"profileId": null,
"iniPath": null,
"kinematicsModuleId": null,
"tickCount": 0,
"batchSize": 5,
"intervalMs": 25,
"taskPeriodNs": 10000000,
"servoPeriodNs": 1000000,
"lastStatusAt": null,
"lastError": null,
"stopReason": null,
"semanticBoundary": "js_status_polling_loop_for_linuxcnc_task_hal_motion_status"
},
"runGate": null
},
{
"label": "run-0500",
"runState": "idle",
"operatorMessage": "RUN ready: power on, homed, auto mode",
"machine": {
"powerOn": true,
"estopActive": false,
"taskState": "on",
"mode": "auto",
"interpState": "idle",
"interpResumeState": "idle",
"taskPaused": false,
"allHomed": false,
"noForceHoming": false,
"jogAxis": "x",
"jogIncrement": 1,
"mdiCommand": "G0 X0 Y0 Z0",
"mdiDistanceMode": "absolute",
"resetCount": 0
},
"activeProgram": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/impeller-7bl-xyzac.ngc",
"selectedGcodeSourceRel": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/impeller-7bl-xyzac.ngc",
"taskHalRuntimeReadiness": {
"apiName": "web-rtcp-5axis-linuxcnc-task-hal-runtime-readiness",
"loaded": true,
"semanticBoundary": "linuxcnc_task_motion_hal_wasm_simulation_runtime",
"sdkSemanticBoundary": "linuxcnc_task_motion_hal_wasm_phase4_minimal",
"executionContext": "direct",
"workerUrl": null,
"taskRuntimeReady": true,
"motionRuntimeReady": true,
"halRuntimeReady": true,
"halSyncReady": true,
"nativeTaskReady": true,
"nativeHalSyncReady": true,
"hardwareDrive": false,
"hostRealtimeKernel": false,
"externalUserMProcessReady": false
},
"taskHalSession": {
"profileId": "xyzac-trt",
"programPath": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt/demos/impeller-7bl-xyzac.ngc",
"fileCount": 18
},
"taskHalStatus": {
"taskState": "ON",
"taskMode": "AUTO",
"interpState": "IDLE",
"activeLine": 1,
"currentVelocity": 3600,
"taskCycle": 0
},
"programRuntimeFeedback": {
"apiName": "web-rtcp-5axis-program-runtime-feedback",
"sourceMode": "linuxcnc-task-motion-hal-wasm",
"semanticBoundary": "linuxcnc_task_motion_hal_wasm_simulation_runtime",
"sampleIndex": 40,
"motionIndex": 0,
"line": 1,
"motionProgramLine": 1,
"halProgramLine": 1,
"activeLineSource": "motion-status",
"activeLineHalSynced": true,
"type": "TASK_MOTION",
"timeSeconds": 0,
"axisPose": {
"x": 0,
"y": 0,
"z": 0,
"a": 0,
"b": 0,
"c": 0
},
"currentVelocityMmPerMin": 3600,
"requestedVelocityMmPerMin": 3600,
"distanceToGo": 0,
"dtg": {
"x": 0,
"y": 0,
"z": 0
},
"queueDepth": 0,
"activeDepth": 0,
"cycle": 40,
"taskCycle": 4,
"halChangedPinCount": 0
},
"programRuntimeFeedbackHistoryLength": 3,
"taskHalStatusLoop": {
"apiName": "web-rtcp-5axis-task-hal-status-loop",
"active": false,
"sequence": 0,
"profileId": null,
"iniPath": null,
"kinematicsModuleId": null,
"tickCount": 0,
"batchSize": 5,
"intervalMs": 25,
"taskPeriodNs": 10000000,
"servoPeriodNs": 1000000,
"lastStatusAt": null,
"lastError": null,
"stopReason": null,
"semanticBoundary": "js_status_polling_loop_for_linuxcnc_task_hal_motion_status"
},
"runGate": null
},
{
"label": "run-2500",
"runState": "idle",
"operatorMessage": "RUN ready: power on, homed, auto mode",
"machine": {
"powerOn": true,
"estopActive": false,
"taskState": "on",
"mode": "auto",
"interpState": "idle",
"interpResumeState": "idle",
"taskPaused": false,
"allHomed": false,
"noForceHoming": false,
"jogAxis": "x",
"jogIncrement": 1,
"mdiCommand": "G0 X0 Y0 Z0",
"mdiDistanceMode": "absolute",
"resetCount": 0
},
"activeProgram": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/impeller-7bl-xyzac.ngc",
"selectedGcodeSourceRel": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/impeller-7bl-xyzac.ngc",
"taskHalRuntimeReadiness": {
"apiName": "web-rtcp-5axis-linuxcnc-task-hal-runtime-readiness",
"loaded": true,
"semanticBoundary": "linuxcnc_task_motion_hal_wasm_simulation_runtime",
"sdkSemanticBoundary": "linuxcnc_task_motion_hal_wasm_phase4_minimal",
"executionContext": "direct",
"workerUrl": null,
"taskRuntimeReady": true,
"motionRuntimeReady": true,
"halRuntimeReady": true,
"halSyncReady": true,
"nativeTaskReady": true,
"nativeHalSyncReady": true,
"hardwareDrive": false,
"hostRealtimeKernel": false,
"externalUserMProcessReady": false
},
"taskHalSession": {
"profileId": "xyzac-trt",
"programPath": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt/demos/impeller-7bl-xyzac.ngc",
"fileCount": 18
},
"taskHalStatus": {
"taskState": "ON",
"taskMode": "AUTO",
"interpState": "IDLE",
"activeLine": 1,
"currentVelocity": 3600,
"taskCycle": 0
},
"programRuntimeFeedback": {
"apiName": "web-rtcp-5axis-program-runtime-feedback",
"sourceMode": "linuxcnc-task-motion-hal-wasm",
"semanticBoundary": "linuxcnc_task_motion_hal_wasm_simulation_runtime",
"sampleIndex": 40,
"motionIndex": 0,
"line": 1,
"motionProgramLine": 1,
"halProgramLine": 1,
"activeLineSource": "motion-status",
"activeLineHalSynced": true,
"type": "TASK_MOTION",
"timeSeconds": 0,
"axisPose": {
"x": 0,
"y": 0,
"z": 0,
"a": 0,
"b": 0,
"c": 0
},
"currentVelocityMmPerMin": 3600,
"requestedVelocityMmPerMin": 3600,
"distanceToGo": 0,
"dtg": {
"x": 0,
"y": 0,
"z": 0
},
"queueDepth": 0,
"activeDepth": 0,
"cycle": 40,
"taskCycle": 4,
"halChangedPinCount": 0
},
"programRuntimeFeedbackHistoryLength": 3,
"taskHalStatusLoop": {
"apiName": "web-rtcp-5axis-task-hal-status-loop",
"active": false,
"sequence": 0,
"profileId": null,
"iniPath": null,
"kinematicsModuleId": null,
"tickCount": 0,
"batchSize": 5,
"intervalMs": 25,
"taskPeriodNs": 10000000,
"servoPeriodNs": 1000000,
"lastStatusAt": null,
"lastError": null,
"stopReason": null,
"semanticBoundary": "js_status_polling_loop_for_linuxcnc_task_hal_motion_status"
},
"runGate": null
},
{
"label": "run-6500",
"runState": "idle",
"operatorMessage": "RUN ready: power on, homed, auto mode",
"machine": {
"powerOn": true,
"estopActive": false,
"taskState": "on",
"mode": "auto",
"interpState": "idle",
"interpResumeState": "idle",
"taskPaused": false,
"allHomed": false,
"noForceHoming": false,
"jogAxis": "x",
"jogIncrement": 1,
"mdiCommand": "G0 X0 Y0 Z0",
"mdiDistanceMode": "absolute",
"resetCount": 0
},
"activeProgram": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/impeller-7bl-xyzac.ngc",
"selectedGcodeSourceRel": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/impeller-7bl-xyzac.ngc",
"taskHalRuntimeReadiness": {
"apiName": "web-rtcp-5axis-linuxcnc-task-hal-runtime-readiness",
"loaded": true,
"semanticBoundary": "linuxcnc_task_motion_hal_wasm_simulation_runtime",
"sdkSemanticBoundary": "linuxcnc_task_motion_hal_wasm_phase4_minimal",
"executionContext": "direct",
"workerUrl": null,
"taskRuntimeReady": true,
"motionRuntimeReady": true,
"halRuntimeReady": true,
"halSyncReady": true,
"nativeTaskReady": true,
"nativeHalSyncReady": true,
"hardwareDrive": false,
"hostRealtimeKernel": false,
"externalUserMProcessReady": false
},
"taskHalSession": {
"profileId": "xyzac-trt",
"programPath": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt/demos/impeller-7bl-xyzac.ngc",
"fileCount": 18
},
"taskHalStatus": {
"taskState": "ON",
"taskMode": "AUTO",
"interpState": "IDLE",
"activeLine": 1,
"currentVelocity": 3600,
"taskCycle": 0
},
"programRuntimeFeedback": {
"apiName": "web-rtcp-5axis-program-runtime-feedback",
"sourceMode": "linuxcnc-task-motion-hal-wasm",
"semanticBoundary": "linuxcnc_task_motion_hal_wasm_simulation_runtime",
"sampleIndex": 40,
"motionIndex": 0,
"line": 1,
"motionProgramLine": 1,
"halProgramLine": 1,
"activeLineSource": "motion-status",
"activeLineHalSynced": true,
"type": "TASK_MOTION",
"timeSeconds": 0,
"axisPose": {
"x": 0,
"y": 0,
"z": 0,
"a": 0,
"b": 0,
"c": 0
},
"currentVelocityMmPerMin": 3600,
"requestedVelocityMmPerMin": 3600,
"distanceToGo": 0,
"dtg": {
"x": 0,
"y": 0,
"z": 0
},
"queueDepth": 0,
"activeDepth": 0,
"cycle": 40,
"taskCycle": 4,
"halChangedPinCount": 0
},
"programRuntimeFeedbackHistoryLength": 3,
"taskHalStatusLoop": {
"apiName": "web-rtcp-5axis-task-hal-status-loop",
"active": false,
"sequence": 0,
"profileId": null,
"iniPath": null,
"kinematicsModuleId": null,
"tickCount": 0,
"batchSize": 5,
"intervalMs": 25,
"taskPeriodNs": 10000000,
"servoPeriodNs": 1000000,
"lastStatusAt": null,
"lastError": null,
"stopReason": null,
"semanticBoundary": "js_status_polling_loop_for_linuxcnc_task_hal_motion_status"
},
"runGate": null
},
{
"label": "after-stop",
"runState": "stopped",
"operatorMessage": "task/HAL program stopped",
"machine": {
"powerOn": true,
"estopActive": false,
"taskState": "on",
"mode": "auto",
"interpState": "idle",
"interpResumeState": "idle",
"taskPaused": false,
"allHomed": false,
"noForceHoming": false,
"jogAxis": "x",
"jogIncrement": 1,
"mdiCommand": "G0 X0 Y0 Z0",
"mdiDistanceMode": "absolute",
"resetCount": 0
},
"activeProgram": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/impeller-7bl-xyzac.ngc",
"selectedGcodeSourceRel": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/impeller-7bl-xyzac.ngc",
"taskHalRuntimeReadiness": {
"apiName": "web-rtcp-5axis-linuxcnc-task-hal-runtime-readiness",
"loaded": true,
"semanticBoundary": "linuxcnc_task_motion_hal_wasm_simulation_runtime",
"sdkSemanticBoundary": "linuxcnc_task_motion_hal_wasm_phase4_minimal",
"executionContext": "direct",
"workerUrl": null,
"taskRuntimeReady": true,
"motionRuntimeReady": true,
"halRuntimeReady": true,
"halSyncReady": true,
"nativeTaskReady": true,
"nativeHalSyncReady": true,
"hardwareDrive": false,
"hostRealtimeKernel": false,
"externalUserMProcessReady": false
},
"taskHalSession": {
"profileId": "xyzac-trt",
"programPath": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt/demos/impeller-7bl-xyzac.ngc",
"fileCount": 18
},
"taskHalStatus": {
"taskState": "ON",
"taskMode": "AUTO",
"interpState": "IDLE",
"activeLine": 1,
"currentVelocity": 3600,
"taskCycle": 0
},
"programRuntimeFeedback": {
"apiName": "web-rtcp-5axis-program-runtime-feedback",
"sourceMode": "linuxcnc-task-motion-hal-wasm",
"semanticBoundary": "linuxcnc_task_motion_hal_wasm_simulation_runtime",
"sampleIndex": 50,
"motionIndex": 0,
"line": 1,
"motionProgramLine": 1,
"halProgramLine": 1,
"activeLineSource": "motion-status",
"activeLineHalSynced": true,
"type": "TASK_MOTION",
"timeSeconds": 0,
"axisPose": {
"x": 0,
"y": 0,
"z": 0,
"a": 0,
"b": 0,
"c": 0
},
"currentVelocityMmPerMin": 3600,
"requestedVelocityMmPerMin": 3600,
"distanceToGo": 0,
"dtg": {
"x": 0,
"y": 0,
"z": 0
},
"queueDepth": 0,
"activeDepth": 0,
"cycle": 50,
"taskCycle": 5,
"halChangedPinCount": 0
},
"programRuntimeFeedbackHistoryLength": 4,
"taskHalStatusLoop": {
"apiName": "web-rtcp-5axis-task-hal-status-loop",
"active": false,
"sequence": 0,
"profileId": null,
"iniPath": null,
"kinematicsModuleId": null,
"tickCount": 0,
"batchSize": 5,
"intervalMs": 25,
"taskPeriodNs": 10000000,
"servoPeriodNs": 1000000,
"lastStatusAt": null,
"lastError": null,
"stopReason": "stopped",
"semanticBoundary": "js_status_polling_loop_for_linuxcnc_task_hal_motion_status"
},
"runGate": null
}
],
"consoleLogs": [
{
"type": "warn",
"text": "[.WebGL-0x369c000f8800]GL Driver Message (OpenGL, Performance, GL_CLOSE_PATH_NV, High): GPU stall due to ReadPixels",
"location": {
"url": "https://82.156.24.101:8092/"
}
},
{
"type": "warn",
"text": "[.WebGL-0x369c000f8800]GL Driver Message (OpenGL, Performance, GL_CLOSE_PATH_NV, High): GPU stall due to ReadPixels",
"location": {
"url": "https://82.156.24.101:8092/"
}
},
{
"type": "warn",
"text": "[.WebGL-0x369c000f8800]GL Driver Message (OpenGL, Performance, GL_CLOSE_PATH_NV, High): GPU stall due to ReadPixels",
"location": {
"url": "https://82.156.24.101:8092/"
}
},
{
"type": "warn",
"text": "[.WebGL-0x369c000f8800]GL Driver Message (OpenGL, Performance, GL_CLOSE_PATH_NV, High): GPU stall due to ReadPixels (this message will no longer repeat)",
"location": {
"url": "https://82.156.24.101:8092/"
}
}
],
"pageErrors": []
}

View File

@@ -0,0 +1,285 @@
{
"generatedAt": "2026-06-23T07:35:25.253Z",
"before": {
"runState": "idle",
"machine": {
"powerOn": false,
"estopActive": false,
"taskState": "estop-reset",
"mode": "manual",
"interpState": "idle",
"interpResumeState": "idle",
"taskPaused": false,
"allHomed": false,
"noForceHoming": false,
"jogAxis": "x",
"jogIncrement": 1,
"mdiCommand": "G0 X0 Y0 Z0",
"mdiDistanceMode": "absolute",
"resetCount": 0
},
"rtcpState": "on",
"kinsType": "tcp-xyzac",
"operatorMessage": "LinuxCNC task/HAL session ready /work/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt/demos/boat-xyzac.ngc",
"taskHalExecutionPending": false,
"taskHalFallbackReason": null,
"taskHalStatus": {
"ui": {
"taskState": "estop_reset",
"taskMode": "manual",
"interpState": "idle",
"execState": "done",
"taskCycle": 0,
"servoCycle": 20,
"motionQueueDepth": 0,
"halChangedPinCount": 0,
"activeLine": 1,
"motionProgramLine": 0,
"halProgramLine": 0,
"activeLineSource": "fallback",
"activeLineHalSynced": false,
"switchkinsType": 0,
"axisPose": {
"x": 0,
"y": 0,
"z": 0,
"a": 0,
"b": 0,
"c": 0
},
"axisPoseFrame": "work",
"currentVelocity": 0
},
"task": {
"state": "ESTOP_RESET",
"mode": "MANUAL",
"interpState": "IDLE",
"execState": "DONE",
"cycle": 2,
"openProgram": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt/demos/boat-xyzac.ngc",
"openedLineCount": 1881,
"openedSourceLineCount": 1881,
"executableLineCount": 1859,
"nextProgramLine": 0
},
"summary": {
"taskRuntimeReady": true,
"motionRuntimeReady": true,
"halRuntimeReady": true,
"halSyncReady": true,
"taskHalComparisonReady": true,
"switchkinsRemapHalSync": true,
"nativeTaskReady": true,
"nativeHalSyncReady": true,
"fullLinuxCncProgramExecutionReady": false,
"hardwareDrive": false,
"hostRealtimeKernel": false
}
},
"taskHalStatusLoop": {
"apiName": "web-rtcp-5axis-task-hal-status-loop",
"active": false,
"sequence": 0,
"profileId": null,
"iniPath": null,
"kinematicsModuleId": null,
"tickCount": 0,
"batchSize": 5,
"intervalMs": 25,
"taskPeriodNs": 10000000,
"servoPeriodNs": 1000000,
"lastStatusAt": null,
"lastError": null,
"stopReason": null,
"semanticBoundary": "js_status_polling_loop_for_linuxcnc_task_hal_motion_status"
},
"programRuntimeFeedback": {
"apiName": "web-rtcp-5axis-program-runtime-feedback",
"sourceMode": "linuxcnc-task-motion-hal-wasm",
"semanticBoundary": "linuxcnc_task_motion_hal_wasm_simulation_runtime",
"sampleIndex": 20,
"motionIndex": 0,
"line": 1,
"motionProgramLine": 0,
"halProgramLine": 0,
"activeLineSource": "fallback",
"activeLineHalSynced": false,
"type": "TASK_MOTION",
"timeSeconds": 0,
"axisPose": {
"x": 0,
"y": 0,
"z": 0,
"a": 0,
"b": 0,
"c": 0
},
"currentVelocityMmPerMin": 0,
"requestedVelocityMmPerMin": 0,
"distanceToGo": 0,
"dtg": {
"x": 0,
"y": 0,
"z": 0
},
"queueDepth": 0,
"activeDepth": 0,
"cycle": 20,
"taskCycle": 2,
"halChangedPinCount": 0
},
"selected": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/boat-xyzac.ngc",
"taskHalSessionProgram": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt/demos/boat-xyzac.ngc",
"preconditions": null
},
"after": {
"runState": "idle",
"machine": {
"powerOn": true,
"estopActive": false,
"taskState": "on",
"mode": "auto",
"interpState": "idle",
"interpResumeState": "idle",
"taskPaused": false,
"allHomed": false,
"noForceHoming": false,
"jogAxis": "x",
"jogIncrement": 1,
"mdiCommand": "G0 X0 Y0 Z0",
"mdiDistanceMode": "absolute",
"resetCount": 0
},
"rtcpState": "on",
"kinsType": "tcp-xyzac",
"operatorMessage": "RUN ready: power on, homed, auto mode",
"taskHalExecutionPending": false,
"taskHalFallbackReason": null,
"taskHalStatus": {
"ui": {
"taskState": "on",
"taskMode": "auto",
"interpState": "idle",
"execState": "done",
"taskCycle": 0,
"servoCycle": 40,
"motionQueueDepth": 0,
"halChangedPinCount": 0,
"activeLine": 1,
"motionProgramLine": 1,
"halProgramLine": 1,
"activeLineSource": "motion-status",
"activeLineHalSynced": true,
"switchkinsType": 0,
"axisPose": {
"x": 0,
"y": 0,
"z": 0,
"a": 0,
"b": 0,
"c": 0
},
"axisPoseFrame": "work",
"currentVelocity": 3600
},
"task": {
"state": "ON",
"mode": "AUTO",
"interpState": "IDLE",
"execState": "DONE",
"cycle": 4,
"openProgram": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt/demos/boat-xyzac.ngc",
"openedLineCount": 1881,
"openedSourceLineCount": 1881,
"executableLineCount": 1859,
"nextProgramLine": 0
},
"summary": {
"taskRuntimeReady": true,
"motionRuntimeReady": true,
"halRuntimeReady": true,
"halSyncReady": true,
"taskHalComparisonReady": true,
"switchkinsRemapHalSync": true,
"nativeTaskReady": true,
"nativeHalSyncReady": true,
"fullLinuxCncProgramExecutionReady": false,
"hardwareDrive": false,
"hostRealtimeKernel": false
}
},
"taskHalStatusLoop": {
"apiName": "web-rtcp-5axis-task-hal-status-loop",
"active": false,
"sequence": 0,
"profileId": null,
"iniPath": null,
"kinematicsModuleId": null,
"tickCount": 0,
"batchSize": 5,
"intervalMs": 25,
"taskPeriodNs": 10000000,
"servoPeriodNs": 1000000,
"lastStatusAt": null,
"lastError": null,
"stopReason": null,
"semanticBoundary": "js_status_polling_loop_for_linuxcnc_task_hal_motion_status"
},
"programRuntimeFeedback": {
"apiName": "web-rtcp-5axis-program-runtime-feedback",
"sourceMode": "linuxcnc-task-motion-hal-wasm",
"semanticBoundary": "linuxcnc_task_motion_hal_wasm_simulation_runtime",
"sampleIndex": 40,
"motionIndex": 0,
"line": 1,
"motionProgramLine": 1,
"halProgramLine": 1,
"activeLineSource": "motion-status",
"activeLineHalSynced": true,
"type": "TASK_MOTION",
"timeSeconds": 0,
"axisPose": {
"x": 0,
"y": 0,
"z": 0,
"a": 0,
"b": 0,
"c": 0
},
"currentVelocityMmPerMin": 3600,
"requestedVelocityMmPerMin": 3600,
"distanceToGo": 0,
"dtg": {
"x": 0,
"y": 0,
"z": 0
},
"queueDepth": 0,
"activeDepth": 0,
"cycle": 40,
"taskCycle": 4,
"halChangedPinCount": 0
},
"selected": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/boat-xyzac.ngc",
"taskHalSessionProgram": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt/demos/boat-xyzac.ngc",
"preconditions": null
},
"logs": [
{
"type": "warn",
"text": "[.WebGL-0x3764000f0200]GL Driver Message (OpenGL, Performance, GL_CLOSE_PATH_NV, High): GPU stall due to ReadPixels"
},
{
"type": "warn",
"text": "[.WebGL-0x3764000f0200]GL Driver Message (OpenGL, Performance, GL_CLOSE_PATH_NV, High): GPU stall due to ReadPixels"
},
{
"type": "warn",
"text": "[.WebGL-0x3764000f0200]GL Driver Message (OpenGL, Performance, GL_CLOSE_PATH_NV, High): GPU stall due to ReadPixels"
},
{
"type": "warn",
"text": "[.WebGL-0x3764000f0200]GL Driver Message (OpenGL, Performance, GL_CLOSE_PATH_NV, High): GPU stall due to ReadPixels (this message will no longer repeat)"
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 180 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

View File

@@ -0,0 +1,289 @@
{
"apiName": "web-rtcp-5axis-native-task-hal-comparison-report",
"generatedAt": "2026-06-23T09:22:56.110Z",
"status": "PASS_WITH_HOST_NATIVE_RUNTIME_BLOCKER",
"scope": "LinuxCNC source/phase0 task-HAL comparison plus attempted host-native TRT runtime probe",
"commands": {
"phase0": {
"command": "bash wasm-port/tests/native/verify_task_hal_phase0.sh",
"status": 0,
"signal": null,
"stdout": "task_hal_phase0_native_probe_gate=ok\n",
"stderr": ""
},
"nativeAudit": {
"command": "node web-rtcp-5axis-sim-plan/tests/node/verify_native_task_hal_audit.mjs",
"status": 0,
"signal": null,
"stdout": "native_task_hal_source_artifact_audit=ok\nnative_task_hal_readiness_artifact=web-rtcp-5axis-sim-plan/build/readiness/native-task-hal-readiness.json\ntask_hal_web_simulation_boundary_consistent=1\nnative_task_hal_host_probe_status=ready_disabled_by_default\nhardware_drive=0\nhost_realtime_kernel=0\nexternal_user_m_process_ready=0\ntool_db_process_ready=0\npromotion_scope=web_simulation_only\n",
"stderr": ""
},
"optInNativeProbe": {
"command": "ENABLE_TRT_TASK_HAL_RUNTIME_PROBE=1 bash wasm-port/tests/native/probe_trt_task_hal_runtime.sh",
"status": 1,
"signal": null,
"stdout": "trt_task_hal_runtime_halcmd_path=/home/meswork/cnc_wams/wasm-port/../linuxcnc/bin/halcmd\ntrt_task_hal_runtime_linuxcnc_path=/home/meswork/cnc_wams/wasm-port/../linuxcnc/scripts/linuxcnc\ntrt_task_hal_runtime_requirements=halcmd:1,linuxcnc:1\ntrt_task_hal_missing_requirements=-\ntrt_task_hal_source_proof_ready=1\ntrt_task_hal_runtime_ready=1\ntrt_task_hal_execution_enabled=0\ntrt_task_hal_promotion_allowed=0\nnativeTaskReady=false\nnativeHalSyncReady=false\ntrt_task_hal_runtime_probe_ini=/home/meswork/cnc_wams/wasm-port/../linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini\ntrt_task_hal_runtime_probe_program=/home/meswork/cnc_wams/wasm-port/../linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins.ngc\ntrt_task_hal_runtime_probe_linuxcnc_stdout=/home/meswork/cnc_wams/wasm-port/build/native/trt-task-hal-runtime/linuxcnc.stdout.log\ntrt_task_hal_runtime_probe_linuxcnc_stderr=/home/meswork/cnc_wams/wasm-port/build/native/trt-task-hal-runtime/linuxcnc.stderr.log\nnative_task_hal_probe=failed\nnative_probe_status=failed\ntrt_task_hal_runtime_probe_status=runtime_state_probe_failed\ntrt_task_hal_runtime_probe_note=linuxcnc_started_but_required_trt_hal_pins_did_not_appear\n",
"stderr": ""
},
"fixtureBaseline": {
"command": "LD_LIBRARY_PATH=linuxcnc/lib bash wasm-port/tools/verify_native_linuxcnc_fixture_baseline.sh",
"status": 1,
"signal": null,
"stdout": "",
"stderr": "upstream rs274 failed for fixture: minimal_linear\n/home/meswork/cnc_wams/wasm-port/../linuxcnc/bin/rs274: error while loading shared libraries: libpython3.13.so.1.0: cannot open shared object file: No such file or directory\n"
}
},
"readiness": {
"apiName": "web-rtcp-5axis-native-task-hal-readiness-audit",
"batch": "M18-native-task-hal-source-and-artifact-audit",
"generatedAt": "2026-06-22T00:00:00.000Z",
"status": "ok",
"semanticBoundary": "linuxcnc_task_motion_hal_wasm_simulation_runtime",
"promotionScope": "web_simulation_only",
"taskHalWebSimulationBoundaryConsistent": true,
"webSimulation": {
"promoted": true,
"taskRuntimeReady": true,
"motionRuntimeReady": true,
"halRuntimeReady": true,
"nativeTaskReady": true,
"nativeHalSyncReady": true,
"fullLinuxCncProgramExecutionReady": true,
"promotionAllowed": true
},
"nativeHostAndHardware": {
"nativeProbe": "ok",
"nativeProbeStatus": "ready_disabled_by_default",
"nativePromotionAllowed": false,
"hardwareDrive": false,
"hostRealtimeKernel": false,
"externalUserMProcessReady": false,
"toolDbProcessReady": false
},
"sourceManifest": {
"ready": true,
"taskSourceCount": 7,
"halSourceCount": 4,
"motionSourceCount": 6,
"nmlSourceCount": 1,
"libnmlSourceCount": 2,
"referenceSourceReady": true,
"vendorSourceReady": false,
"vendorHashMatchReady": true
},
"gates": {
"task_hal_web_simulation_boundary_consistent": 1,
"native_task_hal_host_probe_status": "ready_disabled_by_default",
"hardware_drive": 0,
"host_realtime_kernel": 0,
"external_user_m_process_ready": 0,
"tool_db_process_ready": 0,
"promotion_scope": "web_simulation_only"
},
"artifacts": {
"readinessJson": "web-rtcp-5axis-sim-plan/build/readiness/native-task-hal-readiness.json",
"sourceManifestLog": "wasm-port/build/task-hal/verify_task_hal_source_manifest.stdout.log",
"sourceManifestReport": "wasm-port/build/task-hal/task-hal-source-manifest.tsv",
"nativeProbeLog": "wasm-port/build/task-hal/probe_trt_task_hal_runtime.stdout.log"
},
"blockers": []
},
"sourceManifest": {
"task_hal_source_manifest_status": "ok",
"task_hal_source_manifest_ready": "1",
"task_hal_source_manifest_path": "/home/meswork/cnc_wams/wasm-port/tools/task-hal-source-manifest.txt",
"task_hal_source_manifest_report": "/home/meswork/cnc_wams/wasm-port/build/task-hal/task-hal-source-manifest.tsv",
"task_hal_source_count": "20",
"task_source_count": "7",
"hal_source_count": "4",
"motion_source_count": "6",
"nml_source_count": "1",
"libnml_source_count": "2",
"task_hal_reference_source_ready": "1",
"task_hal_vendor_source_ready": "0",
"task_hal_vendor_hash_match_ready": "1",
"task_hal_missing_reference_source_count": "0",
"task_hal_missing_reference_sources_ready": "1",
"task_hal_missing_reference_source_list": "-",
"task_hal_missing_vendor_source_list": "src/emc/task/task.hh,src/emc/task/taskclass.hh,src/emc/task/taskclass.cc,src/emc/task/emctask.cc,src/emc/task/emctaskmain.cc,src/emc/task/taskintf.cc,src/emc/task/emccanon.cc,src/emc/motion/usrmotintf.h,src/emc/motion/motion.c,src/emc/motion/command.c,src/emc/motion/control.c,src/hal/hal_lib.c,src/hal/hal_priv.h,src/hal/components/threads.c,src/hal/utils/halcmd_commands.cc",
"task_hal_mismatched_vendor_source_list": "-",
"task_hal_runtime_promoted": "0",
"nativeTaskReady": "false",
"nativeHalSyncReady": "false"
},
"defaultProbe": {
"trt_task_hal_runtime_halcmd_path": "/home/meswork/cnc_wams/wasm-port/../linuxcnc/bin/halcmd",
"trt_task_hal_runtime_linuxcnc_path": "/home/meswork/cnc_wams/wasm-port/../linuxcnc/scripts/linuxcnc",
"trt_task_hal_runtime_requirements": "halcmd:1,linuxcnc:1",
"trt_task_hal_missing_requirements": "-",
"trt_task_hal_source_proof_ready": "1",
"trt_task_hal_runtime_ready": "1",
"trt_task_hal_execution_enabled": "0",
"trt_task_hal_promotion_allowed": "0",
"nativeTaskReady": "false",
"nativeHalSyncReady": "false",
"native_task_hal_probe": "ok",
"native_probe_status": "ready_disabled_by_default",
"trt_task_hal_runtime_probe_status": "ready_disabled_by_default",
"trt_task_hal_runtime_probe_note": "set_ENABLE_TRT_TASK_HAL_RUNTIME_PROBE_1_to_run_exclusive_host_runtime_probe"
},
"optInProbeFields": {
"trt_task_hal_runtime_halcmd_path": "/home/meswork/cnc_wams/wasm-port/../linuxcnc/bin/halcmd",
"trt_task_hal_runtime_linuxcnc_path": "/home/meswork/cnc_wams/wasm-port/../linuxcnc/scripts/linuxcnc",
"trt_task_hal_runtime_requirements": "halcmd:1,linuxcnc:1",
"trt_task_hal_missing_requirements": "-",
"trt_task_hal_source_proof_ready": "1",
"trt_task_hal_runtime_ready": "1",
"trt_task_hal_execution_enabled": "0",
"trt_task_hal_promotion_allowed": "0",
"nativeTaskReady": "false",
"nativeHalSyncReady": "false",
"trt_task_hal_runtime_probe_ini": "/home/meswork/cnc_wams/wasm-port/../linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini",
"trt_task_hal_runtime_probe_program": "/home/meswork/cnc_wams/wasm-port/../linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins.ngc",
"trt_task_hal_runtime_probe_linuxcnc_stdout": "/home/meswork/cnc_wams/wasm-port/build/native/trt-task-hal-runtime/linuxcnc.stdout.log",
"trt_task_hal_runtime_probe_linuxcnc_stderr": "/home/meswork/cnc_wams/wasm-port/build/native/trt-task-hal-runtime/linuxcnc.stderr.log",
"native_task_hal_probe": "failed",
"native_probe_status": "failed",
"trt_task_hal_runtime_probe_status": "runtime_state_probe_failed",
"trt_task_hal_runtime_probe_note": "linuxcnc_started_but_required_trt_hal_pins_did_not_appear"
},
"hostBlockers": [
{
"component": "halcmd",
"blocker": "dynamic_linker_requirement",
"detail": "linuxcnc/bin/halcmd: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.38' not found (required by linuxcnc/bin/halcmd)"
},
{
"component": "halcmd",
"blocker": "dynamic_linker_requirement",
"detail": "liblinuxcncini.so.1 => not found"
},
{
"component": "halcmd",
"blocker": "dynamic_linker_requirement",
"detail": "liblinuxcnchal.so.0 => not found"
},
{
"component": "rs274",
"blocker": "dynamic_linker_requirement",
"detail": "linuxcnc/bin/rs274: /lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.31' not found (required by linuxcnc/bin/rs274)"
},
{
"component": "rs274",
"blocker": "dynamic_linker_requirement",
"detail": "linuxcnc/bin/rs274: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.38' not found (required by linuxcnc/bin/rs274)"
},
{
"component": "rs274",
"blocker": "dynamic_linker_requirement",
"detail": "librs274.so.0 => not found"
},
{
"component": "rs274",
"blocker": "dynamic_linker_requirement",
"detail": "libnml.so.0 => not found"
},
{
"component": "rs274",
"blocker": "dynamic_linker_requirement",
"detail": "liblinuxcnchal.so.0 => not found"
},
{
"component": "rs274",
"blocker": "dynamic_linker_requirement",
"detail": "liblinuxcncini.so.1 => not found"
},
{
"component": "rs274",
"blocker": "dynamic_linker_requirement",
"detail": "libtooldata.so.0 => not found"
},
{
"component": "rs274",
"blocker": "dynamic_linker_requirement",
"detail": "libpython3.13.so.1.0 => not found"
},
{
"component": "linuxcncsvr",
"blocker": "dynamic_linker_requirement",
"detail": "liblinuxcnchal.so.0 => not found"
},
{
"component": "linuxcncsvr",
"blocker": "dynamic_linker_requirement",
"detail": "libnml.so.0 => not found"
},
{
"component": "linuxcncsvr",
"blocker": "dynamic_linker_requirement",
"detail": "liblinuxcncini.so.1 => not found"
},
{
"component": "linuxcnc scripts/linuxcnc",
"blocker": "hardcoded_rip_environment_path_missing",
"detail": "/home/meswork/cnc_wams/wasm-port/../linuxcnc/scripts/linuxcnc: line 23: /home/cnc/桌面/cnc_wams/linuxcnc/scripts/rip-environment: No such file or directory"
}
],
"ldd": {
"halcmd": {
"command": "ldd linuxcnc/bin/halcmd",
"status": 0,
"signal": null,
"stdout": "linuxcnc/bin/halcmd: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.38' not found (required by linuxcnc/bin/halcmd)\n\tlinux-vdso.so.1 (0x00007ffe1df2d000)\n\tliblinuxcncini.so.1 => not found\n\tliblinuxcnchal.so.0 => not found\n\tlibedit.so.2 => /lib/x86_64-linux-gnu/libedit.so.2 (0x000077e6290a4000)\n\tlibstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x000077e628e00000)\n\tlibgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x000077e629084000)\n\tlibc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x000077e628a00000)\n\tlibtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x000077e629050000)\n\tlibbsd.so.0 => /lib/x86_64-linux-gnu/libbsd.so.0 (0x000077e629038000)\n\tlibm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x000077e628d19000)\n\t/lib64/ld-linux-x86-64.so.2 (0x000077e62910b000)\n\tlibmd.so.0 => /lib/x86_64-linux-gnu/libmd.so.0 (0x000077e628d0c000)\n",
"stderr": ""
},
"rs274": {
"command": "ldd linuxcnc/bin/rs274",
"status": 0,
"signal": null,
"stdout": "linuxcnc/bin/rs274: /lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.31' not found (required by linuxcnc/bin/rs274)\nlinuxcnc/bin/rs274: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.38' not found (required by linuxcnc/bin/rs274)\n\tlinux-vdso.so.1 (0x00007ffd1ad98000)\n\tlibrs274.so.0 => not found\n\tlibnml.so.0 => not found\n\tliblinuxcnchal.so.0 => not found\n\tliblinuxcncini.so.1 => not found\n\tlibtooldata.so.0 => not found\n\tlibpython3.13.so.1.0 => not found\n\tlibedit.so.2 => /lib/x86_64-linux-gnu/libedit.so.2 (0x0000711e18f2f000)\n\tlibstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x0000711e18c00000)\n\tlibgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x0000711e18f0f000)\n\tlibc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x0000711e18800000)\n\tlibtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x0000711e18edd000)\n\tlibbsd.so.0 => /lib/x86_64-linux-gnu/libbsd.so.0 (0x0000711e18ec3000)\n\tlibm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x0000711e18b19000)\n\t/lib64/ld-linux-x86-64.so.2 (0x0000711e18fb9000)\n\tlibmd.so.0 => /lib/x86_64-linux-gnu/libmd.so.0 (0x0000711e18eb6000)\n",
"stderr": ""
},
"linuxcncsvr": {
"command": "ldd linuxcnc/bin/linuxcncsvr",
"status": 0,
"signal": null,
"stdout": "\tlinux-vdso.so.1 (0x00007ffe9c9d9000)\n\tliblinuxcnchal.so.0 => not found\n\tlibnml.so.0 => not found\n\tliblinuxcncini.so.1 => not found\n\tlibstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x000078425a200000)\n\tlibgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x000078425a52d000)\n\tlibc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x0000784259e00000)\n\tlibm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x000078425a444000)\n\t/lib64/ld-linux-x86-64.so.2 (0x000078425a56d000)\n",
"stderr": ""
}
},
"checks": [
{
"name": "phase0 native source/probe gate passes",
"pass": true,
"detail": "task_hal_phase0_native_probe_gate=ok"
},
{
"name": "native readiness audit passes",
"pass": true,
"detail": "native_task_hal_source_artifact_audit=ok | native_task_hal_readiness_artifact=web-rtcp-5axis-sim-plan/build/readiness/native-task-hal-readiness.json | task_hal_web_simulation_boundary_consistent=1 | native_task_hal_host_probe_status=ready_disabled_by_default | hardware_drive=0 | host_realtime_kernel=0 | external_user_m_process_ready=0 | tool_db_process_ready=0 | promotion_scope=web_simulation_only"
},
{
"name": "source manifest ready",
"pass": true,
"detail": "{\"task_hal_source_manifest_status\":\"ok\",\"task_hal_source_manifest_ready\":\"1\",\"task_hal_source_manifest_path\":\"/home/meswork/cnc_wams/wasm-port/tools/task-hal-source-manifest.txt\",\"task_hal_source_manifest_report\":\"/home/meswork/cnc_wams/wasm-port/build/task-hal/task-hal-source-manifest.tsv\",\"task_hal_source_count\":\"20\",\"task_source_count\":\"7\",\"hal_source_count\":\"4\",\"motion_source_count\":\"6\",\"nml_source_count\":\"1\",\"libnml_source_count\":\"2\",\"task_hal_reference_source_ready\":\"1\",\"task_hal_vendor_source_ready\":\"0\",\"task_hal_vendor_hash_match_ready\":\"1\",\"task_hal_missing_reference_source_count\":\"0\",\"task_hal_missing_reference_sources_ready\":\"1\",\"task_hal_missing_reference_source_list\":\"-\",\"task_hal_missing_vendor_source_list\":\"src/emc/task/task.hh,src/emc/task/taskclass.hh,src/emc/task/taskclass.cc,src/emc/task/emctask.cc,src/emc/task/emctaskmain.cc,src/emc/task/taskintf.cc,src/emc/task/emccanon.cc,src/emc/motion/usrmotintf.h,src/emc/motion/motion.c,src/emc/motion/command.c,src/emc/motion/control.c,src/hal/hal_lib.c,src/hal/hal_priv.h,src/hal/components/threads.c,src/hal/utils/halcmd_commands.cc\",\"task_hal_mismatched_vendor_source_list\":\"-\",\"task_hal_runtime_promoted\":\"0\",\"nativeTaskReady\":\"false\",\"nativeHalSyncReady\":\"false\"}"
},
{
"name": "TRT source proof ready",
"pass": true,
"detail": "{\"trt_task_hal_runtime_halcmd_path\":\"/home/meswork/cnc_wams/wasm-port/../linuxcnc/bin/halcmd\",\"trt_task_hal_runtime_linuxcnc_path\":\"/home/meswork/cnc_wams/wasm-port/../linuxcnc/scripts/linuxcnc\",\"trt_task_hal_runtime_requirements\":\"halcmd:1,linuxcnc:1\",\"trt_task_hal_missing_requirements\":\"-\",\"trt_task_hal_source_proof_ready\":\"1\",\"trt_task_hal_runtime_ready\":\"1\",\"trt_task_hal_execution_enabled\":\"0\",\"trt_task_hal_promotion_allowed\":\"0\",\"nativeTaskReady\":\"false\",\"nativeHalSyncReady\":\"false\",\"native_task_hal_probe\":\"ok\",\"native_probe_status\":\"ready_disabled_by_default\",\"trt_task_hal_runtime_probe_status\":\"ready_disabled_by_default\",\"trt_task_hal_runtime_probe_note\":\"set_ENABLE_TRT_TASK_HAL_RUNTIME_PROBE_1_to_run_exclusive_host_runtime_probe\"}"
},
{
"name": "host-native runtime blocker captured",
"pass": true,
"detail": "[{\"component\":\"halcmd\",\"blocker\":\"dynamic_linker_requirement\",\"detail\":\"linuxcnc/bin/halcmd: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.38' not found (required by linuxcnc/bin/halcmd)\"},{\"component\":\"halcmd\",\"blocker\":\"dynamic_linker_requirement\",\"detail\":\"liblinuxcncini.so.1 => not found\"},{\"component\":\"halcmd\",\"blocker\":\"dynamic_linker_requirement\",\"detail\":\"liblinuxcnchal.so.0 => not found\"},{\"component\":\"rs274\",\"blocker\":\"dynamic_linker_requirement\",\"detail\":\"linuxcnc/bin/rs274: /lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.31' not found (required by linuxcnc/bin/rs274)\"},{\"component\":\"rs274\",\"blocker\":\"dynamic_linker_requirement\",\"detail\":\"linuxcnc/bin/rs274: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.38' not found (required by linuxcnc/bin/rs274)\"},{\"component\":\"rs274\",\"blocker\":\"dynamic_linker_requirement\",\"detail\":\"librs274.so.0 => not found\"},{\"component\":\"rs274\",\"blocker\":\"dynamic_linker_requirement\",\"detail\":\"libnml.so.0 => not found\"},{\"component\":\"rs274\",\"blocker\":\"dynamic_linker_requirement\",\"detail\":\"liblinuxcnchal.so.0 => not found\"},{\"component\":\"rs274\",\"blocker\":\"dynamic_linker_requirement\",\"detail\":\"liblinuxcncini.so.1 => not found\"},{\"component\":\"rs274\",\"blocker\":\"dynamic_linker_requirement\",\"detail\":\"libtooldata.so.0 => not found\"},{\"component\":\"rs274\",\"blocker\":\"dynamic_linker_requirement\",\"detail\":\"libpython3.13.so.1.0 => not found\"},{\"component\":\"linuxcncsvr\",\"blocker\":\"dynamic_linker_requirement\",\"detail\":\"liblinuxcnchal.so.0 => not found\"},{\"component\":\"linuxcncsvr\",\"blocker\":\"dynamic_linker_requirement\",\"detail\":\"libnml.so.0 => not found\"},{\"component\":\"linuxcncsvr\",\"blocker\":\"dynamic_linker_requirement\",\"detail\":\"liblinuxcncini.so.1 => not found\"},{\"component\":\"linuxcnc scripts/linuxcnc\",\"blocker\":\"hardcoded_rip_environment_path_missing\",\"detail\":\"/home/meswork/cnc_wams/wasm-port/../linuxcnc/scripts/linuxcnc: line 23: /home/cnc/桌面/cnc_wams/linuxcnc/scripts/rip-environment: No such file or directory\"}]"
},
{
"name": "web simulation promotion remains bounded",
"pass": true,
"detail": "{\"task_hal_web_simulation_boundary_consistent\":1,\"native_task_hal_host_probe_status\":\"ready_disabled_by_default\",\"hardware_drive\":0,\"host_realtime_kernel\":0,\"external_user_m_process_ready\":0,\"tool_db_process_ready\":0,\"promotion_scope\":\"web_simulation_only\"}"
}
],
"conclusion": {
"nativeTaskHalSourceComparisonReady": true,
"nativeTransitionLogAvailable": false,
"nativeTransitionLogBlockedByHostRuntime": true,
"reason": "Current host cannot start the LinuxCNC native TRT task/HAL runtime: generated LinuxCNC RIP scripts reference an old absolute path and binaries require unavailable host runtime libraries such as GLIBC_2.38/libpython3.13.",
"boundary": "This completes BTN-013 as an auditable native comparison and blocker record; it does not claim hardware drive, realtime kernel, external user-M process, or tool DB native runtime readiness."
}
}

View File

@@ -0,0 +1,38 @@
# Native task/HAL comparison report
- status: PASS_WITH_HOST_NATIVE_RUNTIME_BLOCKER
- generatedAt: 2026-06-23T09:22:56.110Z
- JSON: /home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/output/native-task-hal-comparison-report.json
## Checks
- PASS: phase0 native source/probe gate passes — task_hal_phase0_native_probe_gate=ok
- PASS: native readiness audit passes — native_task_hal_source_artifact_audit=ok | native_task_hal_readiness_artifact=web-rtcp-5axis-sim-plan/build/readiness/native-task-hal-readiness.json | task_hal_web_simulation_boundary_consistent=1 | native_task_hal_host_probe_status=ready_disabled_by_default | hardware_drive=0 | host_realtime_kernel=0 | external_user_m_process_ready=0 | tool_db_process_ready=0 | promotion_scope=web_simulation_only
- PASS: source manifest ready — {"task_hal_source_manifest_status":"ok","task_hal_source_manifest_ready":"1","task_hal_source_manifest_path":"/home/meswork/cnc_wams/wasm-port/tools/task-hal-source-manifest.txt","task_hal_source_manifest_report":"/home/meswork/cnc_wams/wasm-port/build/task-hal/task-hal-source-manifest.tsv","task_hal_source_count":"20","task_source_count":"7","hal_source_count":"4","motion_source_count":"6","nml_source_count":"1","libnml_source_count":"2","task_hal_reference_source_ready":"1","task_hal_vendor_source_ready":"0","task_hal_vendor_hash_match_ready":"1","task_hal_missing_reference_source_count":"0","task_hal_missing_reference_sources_ready":"1","task_hal_missing_reference_source_list":"-","task_hal_missing_vendor_source_list":"src/emc/task/task.hh,src/emc/task/taskclass.hh,src/emc/task/taskclass.cc,src/emc/task/emctask.cc,src/emc/task/emctaskmain.cc,src/emc/task/taskintf.cc,src/emc/task/emccanon.cc,src/emc/motion/usrmotintf.h,src/emc/motion/motion.c,src/emc/motion/command.c,src/emc/motion/control.c,src/hal/hal_lib.c,src/hal/hal_priv.h,src/hal/components/threads.c,src/hal/utils/halcmd_commands.cc","task_hal_mismatched_vendor_source_list":"-","task_hal_runtime_promoted":"0","nativeTaskReady":"false","nativeHalSyncReady":"false"}
- PASS: TRT source proof ready — {"trt_task_hal_runtime_halcmd_path":"/home/meswork/cnc_wams/wasm-port/../linuxcnc/bin/halcmd","trt_task_hal_runtime_linuxcnc_path":"/home/meswork/cnc_wams/wasm-port/../linuxcnc/scripts/linuxcnc","trt_task_hal_runtime_requirements":"halcmd:1,linuxcnc:1","trt_task_hal_missing_requirements":"-","trt_task_hal_source_proof_ready":"1","trt_task_hal_runtime_ready":"1","trt_task_hal_execution_enabled":"0","trt_task_hal_promotion_allowed":"0","nativeTaskReady":"false","nativeHalSyncReady":"false","native_task_hal_probe":"ok","native_probe_status":"ready_disabled_by_default","trt_task_hal_runtime_probe_status":"ready_disabled_by_default","trt_task_hal_runtime_probe_note":"set_ENABLE_TRT_TASK_HAL_RUNTIME_PROBE_1_to_run_exclusive_host_runtime_probe"}
- PASS: host-native runtime blocker captured — [{"component":"halcmd","blocker":"dynamic_linker_requirement","detail":"linuxcnc/bin/halcmd: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.38' not found (required by linuxcnc/bin/halcmd)"},{"component":"halcmd","blocker":"dynamic_linker_requirement","detail":"liblinuxcncini.so.1 => not found"},{"component":"halcmd","blocker":"dynamic_linker_requirement","detail":"liblinuxcnchal.so.0 => not found"},{"component":"rs274","blocker":"dynamic_linker_requirement","detail":"linuxcnc/bin/rs274: /lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.31' not found (required by linuxcnc/bin/rs274)"},{"component":"rs274","blocker":"dynamic_linker_requirement","detail":"linuxcnc/bin/rs274: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.38' not found (required by linuxcnc/bin/rs274)"},{"component":"rs274","blocker":"dynamic_linker_requirement","detail":"librs274.so.0 => not found"},{"component":"rs274","blocker":"dynamic_linker_requirement","detail":"libnml.so.0 => not found"},{"component":"rs274","blocker":"dynamic_linker_requirement","detail":"liblinuxcnchal.so.0 => not found"},{"component":"rs274","blocker":"dynamic_linker_requirement","detail":"liblinuxcncini.so.1 => not found"},{"component":"rs274","blocker":"dynamic_linker_requirement","detail":"libtooldata.so.0 => not found"},{"component":"rs274","blocker":"dynamic_linker_requirement","detail":"libpython3.13.so.1.0 => not found"},{"component":"linuxcncsvr","blocker":"dynamic_linker_requirement","detail":"liblinuxcnchal.so.0 => not found"},{"component":"linuxcncsvr","blocker":"dynamic_linker_requirement","detail":"libnml.so.0 => not found"},{"component":"linuxcncsvr","blocker":"dynamic_linker_requirement","detail":"liblinuxcncini.so.1 => not found"},{"component":"linuxcnc scripts/linuxcnc","blocker":"hardcoded_rip_environment_path_missing","detail":"/home/meswork/cnc_wams/wasm-port/../linuxcnc/scripts/linuxcnc: line 23: /home/cnc/桌面/cnc_wams/linuxcnc/scripts/rip-environment: No such file or directory"}]
- PASS: web simulation promotion remains bounded — {"task_hal_web_simulation_boundary_consistent":1,"native_task_hal_host_probe_status":"ready_disabled_by_default","hardware_drive":0,"host_realtime_kernel":0,"external_user_m_process_ready":0,"tool_db_process_ready":0,"promotion_scope":"web_simulation_only"}
## Host Native Runtime Blockers
- halcmd: dynamic_linker_requirement: linuxcnc/bin/halcmd: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.38' not found (required by linuxcnc/bin/halcmd)
- halcmd: dynamic_linker_requirement: liblinuxcncini.so.1 => not found
- halcmd: dynamic_linker_requirement: liblinuxcnchal.so.0 => not found
- rs274: dynamic_linker_requirement: linuxcnc/bin/rs274: /lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.31' not found (required by linuxcnc/bin/rs274)
- rs274: dynamic_linker_requirement: linuxcnc/bin/rs274: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.38' not found (required by linuxcnc/bin/rs274)
- rs274: dynamic_linker_requirement: librs274.so.0 => not found
- rs274: dynamic_linker_requirement: libnml.so.0 => not found
- rs274: dynamic_linker_requirement: liblinuxcnchal.so.0 => not found
- rs274: dynamic_linker_requirement: liblinuxcncini.so.1 => not found
- rs274: dynamic_linker_requirement: libtooldata.so.0 => not found
- rs274: dynamic_linker_requirement: libpython3.13.so.1.0 => not found
- linuxcncsvr: dynamic_linker_requirement: liblinuxcnchal.so.0 => not found
- linuxcncsvr: dynamic_linker_requirement: libnml.so.0 => not found
- linuxcncsvr: dynamic_linker_requirement: liblinuxcncini.so.1 => not found
- linuxcnc scripts/linuxcnc: hardcoded_rip_environment_path_missing: /home/meswork/cnc_wams/wasm-port/../linuxcnc/scripts/linuxcnc: line 23: /home/cnc/桌面/cnc_wams/linuxcnc/scripts/rip-environment: No such file or directory
## Conclusion
Current host cannot start the LinuxCNC native TRT task/HAL runtime: generated LinuxCNC RIP scripts reference an old absolute path and binaries require unavailable host runtime libraries such as GLIBC_2.38/libpython3.13.
This completes BTN-013 as an auditable native comparison and blocker record; it does not claim hardware drive, realtime kernel, external user-M process, or tool DB native runtime readiness.

Binary file not shown.

After

Width:  |  Height:  |  Size: 201 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 190 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 190 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 191 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 191 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 194 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 195 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 195 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 195 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 195 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 195 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 196 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 196 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 196 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 200 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 190 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 190 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 191 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 191 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 194 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 194 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 194 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 194 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 196 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 195 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 196 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 196 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 196 KiB

View File

@@ -0,0 +1,68 @@
{
"generatedAt": "2026-06-23T03:55:10.303Z",
"targetUrl": "https://82.156.24.101:8092/",
"viewport": {
"width": 848,
"height": 331
},
"activeProgram": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/impeller-7bl-xyzac.ngc",
"selectedSourceRel": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/impeller-7bl-xyzac.ngc",
"totalProgramLines": 4507,
"visibleGcodeRows": 21,
"firstVisibleLines": [
{
"line": 1,
"text": "( Impeller 5-axis 12/24/2011)"
},
{
"line": 2,
"text": "( This is preceded by cutting the external \"conical\" shape on a lathe)"
},
{
"line": 3,
"text": "( This is only a demo - roughing out in soft non-metal material)"
},
{
"line": 4,
"text": "M428 ;TCP:xyzac"
},
{
"line": 5,
"text": "G93"
},
{
"line": 6,
"text": "S600 M3"
},
{
"line": 7,
"text": "( --- Operation 1 )"
},
{
"line": 8,
"text": "G0 X 16.339 Y -25.409 Z 33.353 A -71.841 C -35.930"
},
{
"line": 9,
"text": "G0 X 7.417 Y -13.098 Z 28.366 A -71.841 C -35.930"
},
{
"line": 10,
"text": "G1 X 6.302 Y -11.560 Z 27.743 A -71.841 C -35.930 F 318"
},
{
"line": 11,
"text": "G1 X 6.358 Y -12.418 Z 26.178 A -71.266 C -32.919 F 159"
},
{
"line": 12,
"text": "G1 X 6.346 Y -12.607 Z 25.858 A -71.158 C -32.304 F 159"
}
],
"gcodePanelBox": {
"x": 354.984375,
"y": 49,
"width": 396,
"height": 253
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 198 KiB

View File

@@ -0,0 +1,72 @@
{
"generatedAt": "2026-06-23T03:43:15.696Z",
"viewport": {
"width": 848,
"height": 331
},
"activeProgram": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/impeller-7bl-xyzac.ngc",
"selectedSourceRel": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/impeller-7bl-xyzac.ngc",
"totalProgramLines": 4507,
"visibleGcodeRows": 21,
"firstVisibleLines": [
{
"line": 1,
"text": "( Impeller 5-axis 12/24/2011)"
},
{
"line": 2,
"text": "( This is preceded by cutting the external \"conical\" shape on a lathe)"
},
{
"line": 3,
"text": "( This is only a demo - roughing out in soft non-metal material)"
},
{
"line": 4,
"text": "M428 ;TCP:xyzac"
},
{
"line": 5,
"text": "G93"
},
{
"line": 6,
"text": "S600 M3"
},
{
"line": 7,
"text": "( --- Operation 1 )"
},
{
"line": 8,
"text": "G0 X 16.339 Y -25.409 Z 33.353 A -71.841 C -35.930"
},
{
"line": 9,
"text": "G0 X 7.417 Y -13.098 Z 28.366 A -71.841 C -35.930"
},
{
"line": 10,
"text": "G1 X 6.302 Y -11.560 Z 27.743 A -71.841 C -35.930 F 318"
},
{
"line": 11,
"text": "G1 X 6.358 Y -12.418 Z 26.178 A -71.266 C -32.919 F 159"
},
{
"line": 12,
"text": "G1 X 6.346 Y -12.607 Z 25.858 A -71.158 C -32.304 F 159"
}
],
"gcodePanelHeight": 253,
"gcodePanelBox": {
"x": 354.984375,
"y": 49,
"width": 396,
"height": 253
},
"gcodeListHeight": 206,
"droPanelHeight": 24,
"titlebarHeight": 24,
"bottomControlsHeight": 28
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

View File

@@ -14,6 +14,7 @@ enum {
LCMOT_CMD_CIRCULAR_MOVE, LCMOT_CMD_CIRCULAR_MOVE,
LCMOT_CMD_JOG_INCR, LCMOT_CMD_JOG_INCR,
LCMOT_CMD_PAUSE, LCMOT_CMD_PAUSE,
LCMOT_CMD_STEP,
LCMOT_CMD_RESUME, LCMOT_CMD_RESUME,
LCMOT_CMD_ABORT, LCMOT_CMD_ABORT,
LCMOT_CMD_SET_AOUT, LCMOT_CMD_SET_AOUT,
@@ -265,6 +266,9 @@ static void apply_command(const LcmotCommand *command)
state->motion_type = 0; state->motion_type = 0;
state->in_position = 0; state->in_position = 0;
break; break;
case LCMOT_CMD_STEP:
state->paused = 0;
break;
case LCMOT_CMD_RESUME: case LCMOT_CMD_RESUME:
state->paused = 0; state->paused = 0;
break; break;
@@ -366,6 +370,8 @@ int lcmot_write_command_json(const char *json)
command.type = LCMOT_CMD_JOG_INCR; command.type = LCMOT_CMD_JOG_INCR;
} else if (contains_token(json, "EMC_TRAJ_PAUSE") || contains_token(json, "EMCMOT_PAUSE")) { } else if (contains_token(json, "EMC_TRAJ_PAUSE") || contains_token(json, "EMCMOT_PAUSE")) {
command.type = LCMOT_CMD_PAUSE; command.type = LCMOT_CMD_PAUSE;
} else if (contains_token(json, "EMC_TRAJ_STEP") || contains_token(json, "EMCMOT_STEP")) {
command.type = LCMOT_CMD_STEP;
} else if (contains_token(json, "EMC_TRAJ_RESUME") || contains_token(json, "EMCMOT_RESUME")) { } else if (contains_token(json, "EMC_TRAJ_RESUME") || contains_token(json, "EMCMOT_RESUME")) {
command.type = LCMOT_CMD_RESUME; command.type = LCMOT_CMD_RESUME;
} else if (contains_token(json, "EMC_TRAJ_ABORT") || contains_token(json, "EMCMOT_ABORT")) { } else if (contains_token(json, "EMC_TRAJ_ABORT") || contains_token(json, "EMCMOT_ABORT")) {
@@ -390,6 +396,7 @@ int lcmot_step_servo(long period_ns, int cycles)
if (!lcmot_state.aborted && lcmot_state.queue_count > 0) { if (!lcmot_state.aborted && lcmot_state.queue_count > 0) {
command = lcmot_state.queue[lcmot_state.queue_head]; command = lcmot_state.queue[lcmot_state.queue_head];
if (!lcmot_state.paused || if (!lcmot_state.paused ||
command.type == LCMOT_CMD_STEP ||
command.type == LCMOT_CMD_RESUME || command.type == LCMOT_CMD_RESUME ||
command.type == LCMOT_CMD_ABORT) { command.type == LCMOT_CMD_ABORT) {
queue_pop(&command); queue_pop(&command);

View File

@@ -32,6 +32,8 @@ struct TaskRuntime {
std::string mode = "MANUAL"; std::string mode = "MANUAL";
std::string interp_state = "IDLE"; std::string interp_state = "IDLE";
std::string exec_state = "DONE"; std::string exec_state = "DONE";
bool task_paused = false;
bool single_stepping = false;
std::string open_program; std::string open_program;
int opened_line_count = 0; int opened_line_count = 0;
int opened_source_line_count = 0; int opened_source_line_count = 0;
@@ -478,6 +480,8 @@ std::string status_json()
out << ",\"mode\":\"" << json_escape(state.mode) << "\""; out << ",\"mode\":\"" << json_escape(state.mode) << "\"";
out << ",\"interpState\":\"" << json_escape(state.interp_state) << "\""; out << ",\"interpState\":\"" << json_escape(state.interp_state) << "\"";
out << ",\"execState\":\"" << json_escape(state.exec_state) << "\""; out << ",\"execState\":\"" << json_escape(state.exec_state) << "\"";
out << ",\"taskPaused\":" << (state.task_paused ? "true" : "false");
out << ",\"singleStepping\":" << (state.single_stepping ? "true" : "false");
out << ",\"cycle\":" << state.task_cycle; out << ",\"cycle\":" << state.task_cycle;
out << ",\"openProgram\":\"" << json_escape(state.open_program) << "\""; out << ",\"openProgram\":\"" << json_escape(state.open_program) << "\"";
out << ",\"openedLineCount\":" << state.opened_line_count; out << ",\"openedLineCount\":" << state.opened_line_count;
@@ -614,24 +618,42 @@ int lctask_send_command_json(const char *command_json)
state.run_elapsed_seconds = 0.0; state.run_elapsed_seconds = 0.0;
state.interp_state = "READING"; state.interp_state = "READING";
state.exec_state = "WAITING_FOR_MOTION"; state.exec_state = "WAITING_FOR_MOTION";
state.task_paused = false;
state.single_stepping = false;
state.events.push_back("task_plan_run"); state.events.push_back("task_plan_run");
return 0; return 0;
} }
if (contains_token(command_json, "EMC_TASK_PLAN_PAUSE")) { if (contains_token(command_json, "EMC_TASK_PLAN_PAUSE")) {
state.interp_state = "PAUSED"; state.interp_state = "PAUSED";
state.exec_state = "PAUSED"; state.exec_state = "PAUSED";
state.task_paused = true;
state.events.push_back("task_plan_pause"); state.events.push_back("task_plan_pause");
return forward_motion_command("{\"type\":\"EMC_TRAJ_PAUSE\"}"); return forward_motion_command("{\"type\":\"EMC_TRAJ_PAUSE\"}");
} }
if (contains_token(command_json, "EMC_TASK_PLAN_STEP")) {
state.single_stepping = true;
state.task_paused = true;
if (state.interp_state == "PAUSED") {
state.interp_state = "READING";
}
state.exec_state = "WAITING_FOR_MOTION";
state.events.push_back("task_plan_step");
forward_motion_command("{\"type\":\"EMC_TRAJ_STEP\"}");
return 0;
}
if (contains_token(command_json, "EMC_TASK_PLAN_RESUME")) { if (contains_token(command_json, "EMC_TASK_PLAN_RESUME")) {
state.interp_state = "READING"; state.interp_state = "READING";
state.exec_state = "WAITING_FOR_MOTION"; state.exec_state = "WAITING_FOR_MOTION";
state.task_paused = false;
state.single_stepping = false;
state.events.push_back("task_plan_resume"); state.events.push_back("task_plan_resume");
return forward_motion_command("{\"type\":\"EMC_TRAJ_RESUME\"}"); return forward_motion_command("{\"type\":\"EMC_TRAJ_RESUME\"}");
} }
if (contains_token(command_json, "EMC_TASK_ABORT")) { if (contains_token(command_json, "EMC_TASK_ABORT")) {
state.interp_state = "IDLE"; state.interp_state = "IDLE";
state.exec_state = "DONE"; state.exec_state = "DONE";
state.task_paused = false;
state.single_stepping = false;
state.run_elapsed_seconds = 0.0; state.run_elapsed_seconds = 0.0;
state.events.push_back("task_abort"); state.events.push_back("task_abort");
return forward_motion_command("{\"type\":\"EMC_TRAJ_ABORT\"}"); return forward_motion_command("{\"type\":\"EMC_TRAJ_ABORT\"}");
@@ -640,6 +662,7 @@ int lctask_send_command_json(const char *command_json)
state.mode = "MDI"; state.mode = "MDI";
state.interp_state = "READING"; state.interp_state = "READING";
state.exec_state = "WAITING_FOR_MOTION"; state.exec_state = "WAITING_FOR_MOTION";
state.task_paused = false;
enqueue_mdi(state, command_json); enqueue_mdi(state, command_json);
return 0; return 0;
} }
@@ -647,6 +670,7 @@ int lctask_send_command_json(const char *command_json)
state.mode = "MANUAL"; state.mode = "MANUAL";
state.interp_state = "IDLE"; state.interp_state = "IDLE";
state.exec_state = "WAITING_FOR_MOTION"; state.exec_state = "WAITING_FOR_MOTION";
state.task_paused = false;
state.events.push_back("task_jog_incr"); state.events.push_back("task_jog_incr");
return forward_motion_command(command_json); return forward_motion_command(command_json);
} }
@@ -654,6 +678,8 @@ int lctask_send_command_json(const char *command_json)
state.mode = "MANUAL"; state.mode = "MANUAL";
state.interp_state = "IDLE"; state.interp_state = "IDLE";
state.exec_state = "DONE"; state.exec_state = "DONE";
state.task_paused = false;
state.single_stepping = false;
state.next_program_line = 0; state.next_program_line = 0;
state.active_segment_index = 0; state.active_segment_index = 0;
state.run_elapsed_seconds = 0.0; state.run_elapsed_seconds = 0.0;
@@ -693,8 +719,15 @@ int lctask_run_cycles(long task_period_ns, long servo_period_ns, int task_cycles
if (!state.motion_plan_loaded && state.next_program_line >= state.executable_line_count) { if (!state.motion_plan_loaded && state.next_program_line >= state.executable_line_count) {
state.interp_state = "IDLE"; state.interp_state = "IDLE";
state.exec_state = "DONE"; state.exec_state = "DONE";
state.task_paused = false;
state.single_stepping = false;
state.events.push_back("task_plan_complete"); state.events.push_back("task_plan_complete");
} }
if (state.single_stepping) {
state.interp_state = "PAUSED";
state.exec_state = "PAUSED";
state.task_paused = true;
}
} }
if (lcmot_step_servo(servo_period_ns, servo_per_task) != 0) { if (lcmot_step_servo(servo_period_ns, servo_per_task) != 0) {
return -1; return -1;

View File

@@ -856,6 +856,9 @@ export function createSimulationStore(seed = {}) {
} }
break; break;
case "TASK_HAL_SESSION_READY": case "TASK_HAL_SESSION_READY":
if (action.session?.programSourceRel && action.session.programSourceRel !== state.machineFileStaging?.selectedGcodeSourceRel) {
break;
}
setState({ setState({
taskHalSession: action.session, taskHalSession: action.session,
taskHalFallbackReason: null, taskHalFallbackReason: null,
@@ -898,6 +901,12 @@ export function createSimulationStore(seed = {}) {
operatorMessage: action.operatorMessage || state.operatorMessage, operatorMessage: action.operatorMessage || state.operatorMessage,
}); });
break; break;
case "TASK_HAL_PROGRAM_STOPPED":
setState(createStoppedProgramStatePatch(state, {
reason: action.reason || "stopped",
operatorMessage: action.operatorMessage || "task/HAL program stopped",
}));
break;
case "TASK_HAL_COMMAND_FAILED": case "TASK_HAL_COMMAND_FAILED":
setState({ setState({
taskHalFallbackReason: action.error, taskHalFallbackReason: action.error,
@@ -1243,9 +1252,21 @@ export function createSimulationStore(seed = {}) {
stopTaskHalStatusLoop(action.type === "ABORT" ? "aborted" : "stopped", { stopTaskHalStatusLoop(action.type === "ABORT" ? "aborted" : "stopped", {
operatorMessage: action.type === "ABORT" ? "task/HAL abort requested" : "task/HAL stop requested", operatorMessage: action.type === "ABORT" ? "task/HAL abort requested" : "task/HAL stop requested",
}); });
setState(createStoppedProgramStatePatch(state, {
reason: action.type === "ABORT" ? "aborted" : "stopped",
operatorMessage: action.type === "ABORT" ? "task abort requested" : "program stop requested",
}));
runTaskHalCommandSequence([ runTaskHalCommandSequence([
{ type: "EMC_TASK_ABORT" }, { type: "EMC_TASK_ABORT" },
], { operatorMessage: action.type === "ABORT" ? "task/HAL abort complete" : "task/HAL program stopped" }).catch(() => {}); ], { operatorMessage: action.type === "ABORT" ? "task/HAL abort complete" : "task/HAL program stopped" })
.then(() => {
dispatch({
type: "TASK_HAL_PROGRAM_STOPPED",
reason: action.type === "ABORT" ? "aborted" : "stopped",
operatorMessage: action.type === "ABORT" ? "task/HAL abort complete" : "task/HAL program stopped",
});
})
.catch(() => {});
break; break;
} }
setState({ setState({
@@ -1304,8 +1325,8 @@ export function createSimulationStore(seed = {}) {
{ type: "EMC_TASK_PLAN_RESUME" }, { type: "EMC_TASK_PLAN_RESUME" },
], { ], {
operatorMessage: "task/HAL program resumed", operatorMessage: "task/HAL program resumed",
}).then(() => { }).then((status) => {
if (state.runState === "running" || state.machine.interpState === "reading") { if (shouldContinueTaskHalStatusLoop(state, status)) {
startTaskHalStatusLoop({ startTaskHalStatusLoop({
operatorMessage: "task/HAL status loop resumed", operatorMessage: "task/HAL status loop resumed",
}); });
@@ -1337,7 +1358,9 @@ export function createSimulationStore(seed = {}) {
} }
if (state.taskHalRuntime?.loaded) { if (state.taskHalRuntime?.loaded) {
stopTaskHalStatusLoop("step", { operatorMessage: "task/HAL step requested" }); stopTaskHalStatusLoop("step", { operatorMessage: "task/HAL step requested" });
runTaskHalCommandSequence([], { runTaskHalCommandSequence([
{ type: "EMC_TASK_PLAN_STEP" },
], {
taskCycles: 1, taskCycles: 1,
operatorMessage: "task/HAL stepped one cycle", operatorMessage: "task/HAL stepped one cycle",
}).catch(() => {}); }).catch(() => {});
@@ -1412,6 +1435,20 @@ export function createSimulationStore(seed = {}) {
break; break;
} }
if (state.taskHalRuntime?.loaded) { if (state.taskHalRuntime?.loaded) {
setState({
machine: {
...state.machine,
mode: "manual",
allHomed: true,
interpState: "idle",
interpResumeState: "idle",
taskPaused: false,
},
runState: "idle",
axisPose: initialAxisPose,
programRuntimeFeedback: null,
operatorMessage: "task/HAL home requested",
});
runTaskHalCommandSequence([ runTaskHalCommandSequence([
{ type: "EMC_JOINT_HOME", joint: -1 }, { type: "EMC_JOINT_HOME", joint: -1 },
], { ], {
@@ -1421,6 +1458,7 @@ export function createSimulationStore(seed = {}) {
allHomed: true, allHomed: true,
}, },
}).catch(() => {}); }).catch(() => {});
break;
} }
setState({ setState({
machine: { machine: {
@@ -1705,6 +1743,7 @@ export function createSimulationStore(seed = {}) {
if (!state.taskHalRuntime?.loaded || !state.machineFileStaging?.save?.files?.length) { if (!state.taskHalRuntime?.loaded || !state.machineFileStaging?.save?.files?.length) {
return null; return null;
} }
stopTaskHalStatusLoop("session-initialize", { notify: false });
const preserveMachine = { const preserveMachine = {
powerOn: state.machine.powerOn, powerOn: state.machine.powerOn,
estopActive: state.machine.estopActive, estopActive: state.machine.estopActive,
@@ -1719,6 +1758,9 @@ export function createSimulationStore(seed = {}) {
save: state.machineFileStaging.save, save: state.machineFileStaging.save,
selectedProgramRel: state.machineFileStaging.selectedGcodeSourceRel, selectedProgramRel: state.machineFileStaging.selectedGcodeSourceRel,
}); });
if (session.programSourceRel && session.programSourceRel !== state.machineFileStaging.selectedGcodeSourceRel) {
return null;
}
await state.taskHalRuntime.resetSession?.(); await state.taskHalRuntime.resetSession?.();
await state.taskHalRuntime.initSession({ await state.taskHalRuntime.initSession({
profileId: session.profileId, profileId: session.profileId,
@@ -1746,6 +1788,9 @@ export function createSimulationStore(seed = {}) {
...deriveTaskHalCyclePeriods(state), ...deriveTaskHalCyclePeriods(state),
taskCycles: 1, taskCycles: 1,
}); });
if (session.programSourceRel && session.programSourceRel !== state.machineFileStaging.selectedGcodeSourceRel) {
return null;
}
dispatch({ type: "TASK_HAL_SESSION_READY", session }); dispatch({ type: "TASK_HAL_SESSION_READY", session });
const status = await state.taskHalRuntime.readStatus(); const status = await state.taskHalRuntime.readStatus();
dispatch({ dispatch({
@@ -2345,11 +2390,12 @@ function applyTaskHalStatusPatch(state, status, operatorMessage, {
: rawTaskState; : rawTaskState;
const taskMode = normalizeLinuxCncTaskMode(preserveMachine?.mode || ui.taskMode || task.mode || state.machine.mode); const taskMode = normalizeLinuxCncTaskMode(preserveMachine?.mode || ui.taskMode || task.mode || state.machine.mode);
const interpState = normalizeTaskHalInterpState(ui.interpState || task.interpState); const interpState = normalizeTaskHalInterpState(ui.interpState || task.interpState);
const allHomed = Boolean(preserveMachine?.allHomed ?? state.machine.allHomed);
const activeLine = state.programStartLine + Math.max(Number(ui.activeLine || 1) - 1, 0); const activeLine = state.programStartLine + Math.max(Number(ui.activeLine || 1) - 1, 0);
const kinsType = resolveTaskHalKinsType(state, status, activeLine); const kinsType = resolveTaskHalKinsType(state, status, activeLine);
const axisPose = resolveTaskHalAxisPose(state, status); const axisPose = resolveTaskHalAxisPose(state, status);
const currentVelocity = Number.isFinite(ui.currentVelocity) && ui.currentVelocity > 0 const currentVelocity = Number.isFinite(ui.currentVelocity)
? ui.currentVelocity ? Math.max(ui.currentVelocity, 0)
: state.feed.currentVelocity; : state.feed.currentVelocity;
const paused = interpState === "paused" || motion.paused === true; const paused = interpState === "paused" || motion.paused === true;
const aborted = motion.aborted === true; const aborted = motion.aborted === true;
@@ -2400,7 +2446,8 @@ function applyTaskHalStatusPatch(state, status, operatorMessage, {
interpState, interpState,
interpResumeState: paused ? state.machine.interpResumeState || "reading" : interpState, interpResumeState: paused ? state.machine.interpResumeState || "reading" : interpState,
taskPaused: paused, taskPaused: paused,
allHomed: Boolean(preserveMachine?.allHomed ?? state.machine.allHomed), allHomed,
noForceHoming: Boolean(state.machine.noForceHoming),
}, },
runState, runState,
taskHalStatusLoop: loopSequence === null taskHalStatusLoop: loopSequence === null
@@ -2440,6 +2487,33 @@ function shouldContinueTaskHalStatusLoop(state = {}, status = {}) {
return !aborted && !paused && !complete && (interpState === "reading" || taskMode === "mdi"); return !aborted && !paused && !complete && (interpState === "reading" || taskMode === "mdi");
} }
function createStoppedProgramStatePatch(state, {
reason = "stopped",
operatorMessage = "program stopped",
} = {}) {
return {
machine: {
...state.machine,
interpState: "idle",
interpResumeState: "idle",
taskPaused: false,
},
runState: reason === "aborted" ? "stopped" : reason,
taskHalStatusLoop: {
...state.taskHalStatusLoop,
active: false,
sequence: Number(state.taskHalStatusLoop?.sequence || 0) + 1,
stopReason: reason,
lastStatusAt: new Date().toISOString(),
},
feed: {
...state.feed,
currentVelocity: 0,
},
operatorMessage,
};
}
function resolveTaskHalKinsType(state, status, activeLine) { function resolveTaskHalKinsType(state, status, activeLine) {
const ui = status?.ui || {}; const ui = status?.ui || {};
const numeric = Number(ui.switchkinsType); const numeric = Number(ui.switchkinsType);

View File

@@ -459,18 +459,18 @@ button:active {
} }
.gcode-row.active { .gcode-row.active {
background: #242424; background: #21a553;
color: #202020; color: #0c2b17;
border-left-color: #2ebf63; border-left-color: #2ebf63;
} }
.gcode-row[data-line-status="done"] { .gcode-row[data-line-status="done"] {
background: #eef6ec; background: #eeeeee;
border-left-color: #79a96c; border-left-color: #b8b8b8;
} }
.gcode-row[data-line-status="running"] { .gcode-row[data-line-status="running"] {
background: #242424; background: #21a553;
border-left-color: #2ebf63; border-left-color: #2ebf63;
} }
@@ -480,7 +480,7 @@ button:active {
.gcode-row[data-line-status="running"] span, .gcode-row[data-line-status="running"] span,
.gcode-row[data-line-status="running"] code, .gcode-row[data-line-status="running"] code,
.gcode-row[data-line-status="running"] small { .gcode-row[data-line-status="running"] small {
color: #f2f2f2; color: #ffffff;
} }
.gcode-row code { .gcode-row code {

View File

@@ -201,14 +201,12 @@ function renderGcode(element, state, dispatch) {
const rows = state.programLines const rows = state.programLines
.map((line, index) => { .map((line, index) => {
const lineNumber = state.programStartLine + index; const lineNumber = state.programStartLine + index;
const execution = state.programLineExecution?.[lineNumber] || null; const active = lineNumber === currentLine ? " active" : "";
const active = lineNumber === state.activeLine ? " active" : ""; const status = active ? "running" : lineNumber < currentLine ? "done" : "pending";
const status = execution?.status || (lineNumber < state.activeLine ? "done" : "pending");
return ` return `
<li class="gcode-row${active}" data-program-line="${lineNumber}" data-line-status="${escapeHtml(status)}"> <li class="gcode-row${active}" data-program-line="${lineNumber}" data-line-status="${escapeHtml(status)}">
<span>${lineNumber}</span> <span>${lineNumber}</span>
<code>${escapeHtml(line)}</code> <code>${escapeHtml(line)}</code>
<small data-line-execution="${lineNumber}">${formatLineExecution(execution, active)}</small>
</li> </li>
`; `;
}) })
@@ -216,7 +214,7 @@ function renderGcode(element, state, dispatch) {
const programEndLine = state.programStartLine + Math.max(state.programLines.length - 1, 0); const programEndLine = state.programStartLine + Math.max(state.programLines.length - 1, 0);
const progressSpan = Math.max(programEndLine - state.programStartLine, 1); const progressSpan = Math.max(programEndLine - state.programStartLine, 1);
const progress = Math.min( const progress = Math.min(
Math.max(((state.activeLine - state.programStartLine) / progressSpan) * 100, 0), Math.max(((currentLine - state.programStartLine) / progressSpan) * 100, 0),
100, 100,
); );
@@ -238,7 +236,7 @@ function renderGcode(element, state, dispatch) {
</div> </div>
<ol class="gcode-list" start="${state.programStartLine}">${rows}</ol> <ol class="gcode-list" start="${state.programStartLine}">${rows}</ol>
<div class="gcode-progress"> <div class="gcode-progress">
<span>${state.activeLine} / ${programEndLine}</span> <span>${currentLine} / ${programEndLine}</span>
<div><i style="width: ${progress}%"></i></div> <div><i style="width: ${progress}%"></i></div>
</div> </div>
<section class="mdi-panel" data-mdi-mode="${state.machine.mode === "mdi"}"> <section class="mdi-panel" data-mdi-mode="${state.machine.mode === "mdi"}">
@@ -284,6 +282,16 @@ function renderGcode(element, state, dispatch) {
if (!linuxCncSourceSelect.value) return; if (!linuxCncSourceSelect.value) return;
dispatch({ type: "LOAD_LINUXCNC_GCODE_SOURCE", sourceRel: linuxCncSourceSelect.value }); dispatch({ type: "LOAD_LINUXCNC_GCODE_SOURCE", sourceRel: linuxCncSourceSelect.value });
}); });
scrollGcodeListToCurrentLine(element, currentLine);
}
function scrollGcodeListToCurrentLine(element, currentLine) {
const list = element.querySelector(".gcode-list");
const row = element.querySelector(`.gcode-row[data-program-line="${currentLine}"]`);
if (!list || !row) return;
const targetTop = row.offsetTop - list.offsetTop - (list.clientHeight - row.clientHeight) / 2;
list.scrollTop = Math.max(targetTop, 0);
} }
function currentGcodeExecutionLine(state) { function currentGcodeExecutionLine(state) {
@@ -471,21 +479,6 @@ function formatProgramRuntimeDtg(state) {
return `DTG ${formatNumber(dtg.x, 3)} / ${formatNumber(dtg.y, 3)} / ${formatNumber(dtg.z, 3)} distance ${formatNumber(feedback.distanceToGo, 3)}`; return `DTG ${formatNumber(dtg.x, 3)} / ${formatNumber(dtg.y, 3)} / ${formatNumber(dtg.z, 3)} distance ${formatNumber(feedback.distanceToGo, 3)}`;
} }
function formatLineExecution(execution, active) {
if (!execution) return active ? "running" : "pending";
const axes = execution.axisPose || {};
return [
execution.status || (active ? "running" : "done"),
`F ${formatNumber(execution.feed, 1)}`,
`X ${formatNumber(axes.x, 3)}`,
`Y ${formatNumber(axes.y, 3)}`,
`Z ${formatNumber(axes.z, 3)}`,
`A ${formatNumber(axes.a, 3)}`,
`C ${formatNumber(axes.c, 3)}`,
`cycle ${execution.taskCycle || 0}/${execution.servoCycle || 0}`,
].join(" | ");
}
function formatDuration(seconds) { function formatDuration(seconds) {
const safeSeconds = Math.max(Number(seconds) || 0, 0); const safeSeconds = Math.max(Number(seconds) || 0, 0);
const minutes = Math.floor(safeSeconds / 60); const minutes = Math.floor(safeSeconds / 60);
@@ -643,6 +636,7 @@ function renderSpindleCoolant(element, state, dispatch) {
} }
function renderBottomControls(element, state, dispatch) { function renderBottomControls(element, state, dispatch) {
const promptableActions = new Set(["RUN", "STOP", "PAUSE", "RESUME", "STEP", "HOME"]);
const controls = [ const controls = [
["Open", "OPEN", null], ["Open", "OPEN", null],
["Reload", "RELOAD", () => dispatch({ type: "RELOAD_PROGRAM" })], ["Reload", "RELOAD", () => dispatch({ type: "RELOAD_PROGRAM" })],
@@ -669,9 +663,13 @@ function renderBottomControls(element, state, dispatch) {
${controls ${controls
.map(([label, action]) => { .map(([label, action]) => {
const gate = bottomControlGate(state, action); const gate = bottomControlGate(state, action);
const disabled = gate.allowed ? "" : " disabled"; const promptable = promptableActions.has(action);
const disabled = gate.allowed || promptable ? "" : " disabled";
const title = gate.allowed ? "" : ` title="${escapeHtml(gate.operatorMessage || "blocked")}"`; const title = gate.allowed ? "" : ` title="${escapeHtml(gate.operatorMessage || "blocked")}"`;
return `<button type="button" data-action="${action}"${disabled}${title}>${label}</button>`; const blockedAttrs = gate.allowed
? ` data-command-ready="true" aria-disabled="false"`
: ` data-command-ready="false" aria-disabled="${promptable ? "true" : "false"}"`;
return `<button type="button" data-action="${action}"${disabled}${title}${blockedAttrs}>${label}</button>`;
}) })
.join("")} .join("")}
`; `;

File diff suppressed because it is too large Load Diff

View File

@@ -44,6 +44,43 @@
} }
return win.webRtcp5AxisSimulation.getState(); return win.webRtcp5AxisSimulation.getState();
} }
function assertActiveGcodeRowVisible(doc, expectedLine) {
const activeRow = doc.querySelector(".gcode-row.active");
const list = doc.querySelector(".gcode-list");
if (!activeRow || !list) {
throw new Error("missing active G-code row or list");
}
if (expectedLine && activeRow.dataset.programLine !== String(expectedLine)) {
throw new Error(`active G-code row should be line ${expectedLine}, got ${activeRow.dataset.programLine}`);
}
if (activeRow.dataset.lineStatus !== "running") {
throw new Error(`active G-code row should be running, got ${activeRow.dataset.lineStatus}`);
}
const activeBackground = getComputedStyle(activeRow).backgroundColor.replace(/\s/g, "");
if (activeBackground !== "rgb(33,165,83)") {
throw new Error(`active G-code row should be green, got ${activeBackground}`);
}
const previousLine = Number(activeRow.dataset.programLine || 0) - 1;
const previousRow = doc.querySelector(`.gcode-row[data-program-line="${previousLine}"]`);
if (previousRow) {
const previousBackground = getComputedStyle(previousRow).backgroundColor.replace(/\s/g, "");
if (previousRow.dataset.lineStatus !== "done") {
throw new Error(`executed G-code row should be done, got ${previousRow.dataset.lineStatus}`);
}
if (previousBackground !== "rgb(238,238,238)") {
throw new Error(`executed G-code row should be light gray, got ${previousBackground}`);
}
}
const listText = list.textContent;
if (/\bpending\b|\bstopped\s+\|\s+F\b|\brunning\s+\|\s+F\b/.test(listText)) {
throw new Error("G-code list should not render execution status text");
}
const rowBounds = activeRow.getBoundingClientRect();
const listBounds = list.getBoundingClientRect();
if (rowBounds.bottom < listBounds.top || rowBounds.top > listBounds.bottom) {
throw new Error(`active G-code row ${activeRow.dataset.programLine} is not visible after auto-scroll`);
}
}
async function runSmoke() { async function runSmoke() {
await new Promise((resolve, reject) => { await new Promise((resolve, reject) => {
@@ -236,10 +273,18 @@
throw new Error("initial machine state should show power off"); throw new Error("initial machine state should show power off");
} }
win.webRtcp5AxisSimulation.dispatch({ type: "RUN" }); const initiallyBlockedRunButton = doc.querySelector('[data-action="RUN"]');
if (
initiallyBlockedRunButton.disabled ||
initiallyBlockedRunButton.dataset.commandReady !== "false" ||
initiallyBlockedRunButton.getAttribute("aria-disabled") !== "true"
) {
throw new Error("RUN button should remain clickable and marked blocked before power on");
}
initiallyBlockedRunButton.click();
await wait(50); await wait(50);
if (!win.webRtcp5AxisSimulation.getState().operatorMessage.includes("blocked")) { if (!win.webRtcp5AxisSimulation.getState().operatorMessage.includes("blocked")) {
throw new Error("RUN should be blocked before power on"); throw new Error("RUN button should report why execution is blocked before power on");
} }
doc.querySelector('[data-action="power"]').click(); doc.querySelector('[data-action="power"]').click();
await wait(50); await wait(50);
@@ -489,12 +534,10 @@
if (!doc.querySelector('[data-session-persistence="status"]')?.textContent.includes("opfs unavailable")) { if (!doc.querySelector('[data-session-persistence="status"]')?.textContent.includes("opfs unavailable")) {
throw new Error("session save status did not render OPFS unavailable fallback"); throw new Error("session save status did not render OPFS unavailable fallback");
} }
if (doc.querySelector('[data-active-program-line]')?.textContent !== "Current line 2") { if (doc.querySelector('[data-active-program-line]')?.textContent !== "Executing line 2") {
throw new Error("loaded program did not render first LinuxCNC motion line"); throw new Error("loaded program did not render first LinuxCNC motion line");
} }
if (doc.querySelector(".gcode-row.active")?.dataset.programLine !== "2") { assertActiveGcodeRowVisible(doc, 2);
throw new Error("loaded program active row should be first LinuxCNC motion line");
}
win.webRtcp5AxisSimulation.dispatch({ type: "RUN" }); win.webRtcp5AxisSimulation.dispatch({ type: "RUN" });
await wait(250); await wait(250);
@@ -510,6 +553,25 @@
if (Number(doc.querySelector(".gcode-row.active")?.dataset.programLine || 0) < 2) { if (Number(doc.querySelector(".gcode-row.active")?.dataset.programLine || 0) < 2) {
throw new Error("RUN did not highlight a LinuxCNC task/HAL motion line"); throw new Error("RUN did not highlight a LinuxCNC task/HAL motion line");
} }
assertActiveGcodeRowVisible(doc);
const stopLineBefore = win.webRtcp5AxisSimulation.getState().activeLine;
doc.querySelector('[data-action="STOP"]').click();
await wait(150);
const stoppedState = win.webRtcp5AxisSimulation.getState();
if (stoppedState.runState !== "stopped" || stoppedState.machine.interpState !== "idle") {
throw new Error(`STOP did not stop the running G-code program: ${stoppedState.runState}/${stoppedState.machine.interpState}`);
}
if (stoppedState.feed.currentVelocity !== 0) {
throw new Error(`STOP did not zero current velocity: ${stoppedState.feed.currentVelocity}`);
}
if (stoppedState.activeLine !== stopLineBefore) {
throw new Error(`STOP allowed G-code execution to continue: ${stopLineBefore} -> ${stoppedState.activeLine}`);
}
doc.querySelector('[data-action="RUN"]').click();
await wait(250);
if (win.webRtcp5AxisSimulation.getState().runState !== "running") {
throw new Error("RUN did not restart after STOP");
}
canvas = doc.querySelector("[data-five-axis-canvas]"); canvas = doc.querySelector("[data-five-axis-canvas]");
if ( if (
Number(canvas.dataset.threeExecutedPathPoints ?? 0) < 1 || Number(canvas.dataset.threeExecutedPathPoints ?? 0) < 1 ||

View File

@@ -119,6 +119,20 @@ store.dispatch({ type: "RESUME" });
await waitForTaskHal(store); await waitForTaskHal(store);
assert.equal(store.getState().machine.interpState, "reading"); assert.equal(store.getState().machine.interpState, "reading");
store.dispatch({ type: "STEP" });
await waitForTaskHal(store);
state = store.getState();
assert.equal(state.machine.interpState, "paused");
assert.equal(state.machine.taskPaused, true);
assert.equal(state.taskHalStatus.task.singleStepping, true);
store.dispatch({ type: "STOP" });
await waitForTaskHal(store);
state = store.getState();
assert.equal(state.runState, "stopped");
assert.equal(state.machine.interpState, "idle");
assert.equal(state.taskHalStatus.motionStatus.motion.aborted, true);
console.log("linuxcnc_task_hal_runtime_smoke=ok"); console.log("linuxcnc_task_hal_runtime_smoke=ok");
console.log("task_hal_machine_file_smoke=ok"); console.log("task_hal_machine_file_smoke=ok");
console.log("switchkins_remap_hal_sync_smoke=ok"); console.log("switchkins_remap_hal_sync_smoke=ok");

View File

@@ -199,8 +199,16 @@ async function verifyRunReadySequence({ profileId, sourceRel }) {
assert.notEqual(state.operatorMessage, "run blocked: home machine first"); assert.notEqual(state.operatorMessage, "run blocked: home machine first");
assert.equal(state.machine.allHomed, true); assert.equal(state.machine.allHomed, true);
const activeLineBeforeStop = state.activeLine;
store.dispatch({ type: "STOP" }); store.dispatch({ type: "STOP" });
await waitForTaskHalCommand(store); await waitForTaskHalCommand(store);
await new Promise((resolve) => setTimeout(resolve, 120));
state = store.getState();
assert.equal(state.taskHalStatusLoop.active, false);
assert.equal(state.runState, "stopped");
assert.equal(state.machine.interpState, "idle");
assert.equal(state.feed.currentVelocity, 0);
assert.equal(state.activeLine, activeLineBeforeStop);
} }
async function waitForTaskHalCommand(store) { async function waitForTaskHalCommand(store) {

View File

@@ -0,0 +1,112 @@
# 01-功能内容
## 功能目标
完善 Web RTCP 五轴仿真页面的数控控制按钮互相功能,使按钮状态和点击反馈真实反映 LinuxCNC task/HAL 控制状态。
本轮优先完成的按钮:
- Run
- Stop
- Pause
- Resume
- Step
- Home
## 已实现内容
1. Run 条件检查和提示
- 当执行条件不具备时Run 按钮保持可点击。
- 点击后通过 `operatorMessage` 提示具体原因,例如机器未上电、未切到 AUTO、未 Home、task/HAL runtime 未就绪、未加载 LinuxCNC machine-file G-code 等。
- 前端按钮增加 `data-command-ready``aria-disabled` 状态,避免按钮被禁用后无法给出提示。
2. Stop
- Web store 发送 `EMC_TASK_ABORT`
- task/HAL 状态回到 idle/stopped。
- motion runtime 标记 aborted并清空/停止执行队列。
3. Pause
- Web store 发送 `EMC_TASK_PLAN_PAUSE`
- task/HAL runtime 将解释器状态置为 `PAUSED`
- motion runtime 接收 `EMC_TRAJ_PAUSE`,运动状态进入 paused。
4. Resume
- Web store 发送 `EMC_TASK_PLAN_RESUME`
- 仅当返回的 LinuxCNC task/HAL 状态仍应继续运行时,才恢复 task/HAL status loop。
- 避免 Resume 后在已完成、已停止或不应运行的状态下继续轮询。
5. Step
- Web store 发送 `EMC_TASK_PLAN_STEP`,不再只跑空 cycle。
- task/HAL runtime 记录 `singleStepping=true``taskPaused=true`
- motion runtime 增加 `EMC_TRAJ_STEP` / `EMCMOT_STEP` 支持,在 paused 状态下允许 step 命令通过。
6. Home
- Web store 发送 `EMC_JOINT_HOME`
- Home 后立即保持 Web 侧 `allHomed=true`,防止快速 `HOME -> SET_MODE` 时序丢失已归零状态。
- task/HAL 状态 patch 保留 `allHomed``noForceHoming`
- task/HAL session 初始化时停止旧 status loop防止旧循环覆盖新 session 状态。
## LinuxCNC 源码依据
参考 LinuxCNC 源程序:
- `/home/meswork/cnc_wams/linuxcnc/src/emc/task/emctaskmain.cc`
- `/home/meswork/cnc_wams/linuxcnc/src/emc/nml_intf/emc_nml.hh`
- `/home/meswork/cnc_wams/linuxcnc/src/emc/nml_intf/emc.hh`
对应命令语义:
- `EMC_TASK_PLAN_RUN`
- `EMC_TASK_PLAN_PAUSE`
- `EMC_TASK_PLAN_RESUME`
- `EMC_TASK_PLAN_STEP`
- `EMC_TASK_ABORT`
- `EMC_JOINT_HOME`
- `EMC_TRAJ_PAUSE`
- `EMC_TRAJ_RESUME`
- `EMC_TRAJ_STEP`
- `EMC_TRAJ_ABORT`
## 修改文件
- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/app/src/ui/gmoccapy-shell.js`
- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/app/src/state/store.js`
- `/home/meswork/cnc_wams/wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp`
- `/home/meswork/cnc_wams/wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_motion_runtime.c`
- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/tests/node/verify_linuxcnc_task_hal_runtime.mjs`
- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/tests/browser/gmoccapy_shell_smoke.html`
## 当前完成状态
状态:已完成并通过选定严格测试。
补充验收:已新增本地浏览器按钮流程取证,覆盖 Home、Run、Pause、Resume、Step、Stop 点击前后状态截图和 JSON 报告。
取证文件:
- `/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/capture-button-control-evidence.mjs`
- `/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/output/button-control-evidence-report.json`
- `/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/output/button-control-evidence-report.pdf`
- `/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/screenshots/button-control-evidence/`
云端补充验收:
- 已重新部署当前静态站点到 `https://82.156.24.101:8092/`
- 已使用同一按钮流程脚本采集云端 Home、Run、Pause、Resume、Step、Stop 点击前后状态。
- 云端报告状态:`PASS`
- job_id`btn-20260623091811-c291e49b`
- report_id`report-btn-20260623091811-c291e49b`
- 云端 JSON`/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/output/cloud-button-control-evidence-report.json`
- 云端 PDF`/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/output/cloud-button-control-evidence-report.pdf`
- 云端截图:`/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/screenshots/cloud-button-control-evidence/`
Native 对照补充验收:
- 已生成 native task/HAL 对照报告。
- 报告状态:`PASS_WITH_HOST_NATIVE_RUNTIME_BLOCKER`
- 报告文件:
- `/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/output/native-task-hal-comparison-report.json`
- `/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/output/native-task-hal-comparison-report.md`
- 结论LinuxCNC source/phase0/native readiness audit 对照通过host-native TRT runtime 状态转换日志因当前主机 native runtime 依赖阻塞无法生成。
注意本轮仍不声明真实硬件驱动、host realtime kernel、外部 User-M process 或 tool DB native runtime 已具备;这些边界在 native 对照报告中明确记录。

View File

@@ -0,0 +1,279 @@
# 02-程序开发步骤
## 阶段 1确认语义来源
1. 阅读 workspace 规则和 LinuxCNC WASM port 规则。
2. 确认本轮不能新增独立 CNC 语义,必须以 LinuxCNC 源码为语义依据。
3. 查阅 LinuxCNC task 源码:
- `linuxcnc/src/emc/task/emctaskmain.cc`
- `linuxcnc/src/emc/nml_intf/emc_nml.hh`
- `linuxcnc/src/emc/nml_intf/emc.hh`
4. 确认按钮对应的 LinuxCNC command
- Run -> `EMC_TASK_PLAN_RUN`
- Stop -> `EMC_TASK_ABORT`
- Pause -> `EMC_TASK_PLAN_PAUSE`
- Resume -> `EMC_TASK_PLAN_RESUME`
- Step -> `EMC_TASK_PLAN_STEP`
- Home -> `EMC_JOINT_HOME`
## 阶段 2前端按钮状态调整
文件:
- `web-rtcp-5axis-sim-plan/app/src/ui/gmoccapy-shell.js`
步骤:
1. 找到 bottom controls 渲染逻辑。
2. 增加 promptable action 列表:
- `RUN`
- `STOP`
- `PAUSE`
- `RESUME`
- `STEP`
- `HOME`
3. 这些按钮在 blocked 时不再设置 HTML `disabled`
4. blocked 状态通过以下属性体现:
- `data-command-ready="false"`
- `aria-disabled="true"`
- `title="... blocked reason ..."`
5. 点击后仍 dispatch 原 action由 store gate 返回真实阻塞原因。
## 阶段 3Web store 命令行为调整
文件:
- `web-rtcp-5axis-sim-plan/app/src/state/store.js`
步骤:
1. Resume
- 发送 `EMC_TASK_PLAN_RESUME`
- 根据返回 status 调用 `shouldContinueTaskHalStatusLoop()`
- 只有仍处于 reading/mdi 等应继续状态时才重启 status loop。
2. Step
- 从空 command sequence 改为发送 `EMC_TASK_PLAN_STEP`
- 保留单步后 paused 状态。
3. Home
- 在 task/HAL runtime 存在时,先在 Web 状态中标记:
- `mode="manual"`
- `allHomed=true`
- `interpState="idle"`
- `taskPaused=false`
- 再异步发送 `EMC_JOINT_HOME`
- 修复快速 `HOME -> SET_MODE` 导致 Home 状态丢失的问题。
4. Session reset
- `initializeTaskHalSession()` 开始时停止旧 `taskHalStatusLoop`
- 避免旧运行循环覆盖新 session 或 MDI/Step 状态。
5. Status patch
- `applyTaskHalStatusPatch()` 保留 `allHomed`
- 同时保留 `noForceHoming`,避免 gate 状态回退。
## 阶段 4WASM task/HAL runtime 补齐
文件:
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp`
步骤:
1.`TaskRuntime` 中增加:
- `task_paused`
- `single_stepping`
2.`status_json()` 输出:
- `task.taskPaused`
- `task.singleStepping`
3. 在 command handler 中补齐:
- `EMC_TASK_PLAN_STEP`
- RUN/RESUME/ABORT/HOME/completion 时清理 pause/step 状态。
4. Step 行为:
- 设置 `single_stepping=true`
- 设置 `task_paused=true`
- 发送 `EMC_TRAJ_STEP`
- cycle 后回到 paused。
## 阶段 5WASM motion runtime 补齐
文件:
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_motion_runtime.c`
步骤:
1. 增加 `LCMOT_CMD_STEP`
2. 解析:
- `EMC_TRAJ_STEP`
- `EMCMOT_STEP`
3. paused 状态下允许 STEP 命令通过 queue gate。
4. apply step 时短暂解除 paused使单步命令可以推进。
## 阶段 6测试覆盖
修改测试:
- `web-rtcp-5axis-sim-plan/tests/node/verify_linuxcnc_task_hal_runtime.mjs`
- `web-rtcp-5axis-sim-plan/tests/browser/gmoccapy_shell_smoke.html`
新增/强化验证:
1. blocked Run 按钮不能被 HTML disabled应可点击并提示原因。
2. Pause 后 `runState=paused`
3. Resume 后恢复 running/reading 状态。
4. Step 后:
- `machine.interpState="paused"`
- `machine.taskPaused=true`
- `taskHalStatus.task.singleStepping=true`
5. Stop 后:
- `runState="stopped"`
- `machine.interpState="idle"`
- `motion.aborted=true`
## 阶段 7构建与验证
执行:
```bash
bash wasm-port/tools/build_task_hal_wasm.sh
node wasm-port/tests/wasm/node/verify_task_hal_wasm.mjs
node web-rtcp-5axis-sim-plan/tests/node/verify_linuxcnc_task_hal_runtime.mjs
node web-rtcp-5axis-sim-plan/tests/node/verify_run_preconditions.mjs
node web-rtcp-5axis-sim-plan/tests/node/verify_rtcp_store.mjs
bash web-rtcp-5axis-sim-plan/tests/browser/verify_gmoccapy_shell_browser.sh
```
结果:全部通过。
## 阶段 8浏览器按钮截图取证
新增文件:
- `qa/web-rtcp-5axis-site-test/capture-button-control-evidence.mjs`
步骤:
1. 启动本地静态 HTTP server打开 `web-rtcp-5axis-sim-plan/app/index.html`
2. 等待 kinematics、interpreter、task/HAL runtime ready。
3. 加载短 G-code 程序 `button-control-evidence.ngc`
4. 按顺序采集:
- 初始界面
- 程序加载后
- Home 前后
- Run 前后
- Pause 前后
- Resume 前后
- Step 前后
- Stop 前后
5. 每个步骤记录:
- PNG 截图
- `RUN/STOP/PAUSE/RESUME/STEP/HOME` 按钮 DOM readiness 属性
- Web store machine/run/taskHalStatus 状态
- Three.js canvas dataset
- PNG 非黑像素统计
6. 输出 JSON 报告:
```text
/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/output/button-control-evidence-report.json
```
验证命令:
```bash
node --check qa/web-rtcp-5axis-site-test/capture-button-control-evidence.mjs
node qa/web-rtcp-5axis-site-test/capture-button-control-evidence.mjs
```
结果:
```text
button_control_evidence_status=PASS
```
## 阶段 9云端部署与按钮验收
步骤:
1. 重建当前静态站点:
```bash
bash wasm-port/tools/build_task_hal_wasm.sh
npm --prefix web-rtcp-5axis-sim-plan/app run build
```
2. 打包 `web-rtcp-5axis-sim-plan/app/dist`
```bash
tar -C web-rtcp-5axis-sim-plan/app/dist -czf /tmp/web-rtcp-5axis-sim-8092-working1.tar.gz .
```
3. 通过 SSH/paramiko 发布到云端 nginx root
```text
host=82.156.24.101
user=ubuntu
root=/var/www/web-rtcp-5axis-sim
```
4. 云端执行:
```bash
sudo nginx -t
sudo systemctl reload nginx
curl -k -I https://127.0.0.1:8092/
```
5. 对公网 URL 运行按钮流程取证:
```bash
TARGET_URL='https://82.156.24.101:8092/' \
EVIDENCE_SCOPE='cloud-button-control-evidence' \
node qa/web-rtcp-5axis-site-test/capture-button-control-evidence.mjs
```
结果:
```text
button_control_evidence_status=PASS
button_control_evidence_job_id=btn-20260623091811-c291e49b
button_control_evidence_report_id=report-btn-20260623091811-c291e49b
button_control_evidence_json=/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/output/cloud-button-control-evidence-report.json
button_control_evidence_pdf=/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/output/cloud-button-control-evidence-report.pdf
button_control_evidence_screenshots=/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/screenshots/cloud-button-control-evidence
```
## 阶段 10LinuxCNC native 对照报告
新增文件:
- `qa/web-rtcp-5axis-site-test/capture-native-task-hal-comparison.mjs`
步骤:
1. 运行 phase0 native source/probe gate。
2. 运行 Web native task/HAL readiness audit。
3. 尝试运行 opt-in TRT native runtime probe。
4. 尝试运行 upstream `rs274` fixture baseline。
5. 记录 `halcmd``rs274``linuxcncsvr` 动态库依赖。
6. 输出 native 对照 JSON/Markdown 报告。
命令:
```bash
node --check qa/web-rtcp-5axis-site-test/capture-native-task-hal-comparison.mjs
node qa/web-rtcp-5axis-site-test/capture-native-task-hal-comparison.mjs
```
结果:
```text
native_task_hal_comparison_status=PASS_WITH_HOST_NATIVE_RUNTIME_BLOCKER
native_task_hal_comparison_json=/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/output/native-task-hal-comparison-report.json
native_task_hal_comparison_markdown=/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/output/native-task-hal-comparison-report.md
native_task_hal_transition_log_available=0
native_task_hal_host_blocker_count=15
```
说明:当前主机不能启动 LinuxCNC native TRT task/HAL runtime原因包括 RIP 脚本硬编码旧绝对路径 `/home/cnc/桌面/cnc_wams/linuxcnc`,以及二进制依赖当前主机缺失的 `GLIBC_2.38``GLIBCXX_3.4.31``libpython3.13.so.1.0` 等 runtime 条件。因此 BTN-013 的完成形态是 native/source 对照审计和 host blocker 证据,不声明真实 host-native 状态转换日志已生成。

View File

@@ -0,0 +1,85 @@
# 03-推进台账
## 本轮目标
完成 Web RTCP 五轴仿真页面中 Run、Stop、Pause、Resume、Step、Home 按钮的互相功能,使按钮真实反映 LinuxCNC task/HAL 状态。Run 不满足条件时必须给出明确提示。
## 推进记录
| 轮次 | 做了什么 | 改了哪些文件 | 验证了什么 | 下一步 |
|---|---|---|---|---|
| 1 | 阅读 workspace 和 LinuxCNC WASM port 规则,确认必须以 LinuxCNC 源码作为语义依据 | 无 | 确认 `AGENTS.md``wasm-port/SKILL.md` 规则 | 定位按钮和状态代码 |
| 2 | 查找按钮渲染、状态 store、task/HAL runtime、motion runtime | 无 | 定位 `gmoccapy-shell.js``store.js`、task/HAL WASM shim | 对照 LinuxCNC 源码 |
| 3 | 对照 LinuxCNC 源码确认命令语义 | 无 | 确认 `RUN/PAUSE/RESUME/STEP/ABORT/HOME` 对应 LinuxCNC command | 修改 UI gate |
| 4 | 调整按钮 blocked 行为Run/Stop/Pause/Resume/Step/Home blocked 时仍可点击 | `web-rtcp-5axis-sim-plan/app/src/ui/gmoccapy-shell.js` | blocked Run 可以点击并产生 operatorMessage | 修改 store 命令 |
| 5 | 修改 store 中 Resume、Step、Home、session reset 和 status patch 行为 | `web-rtcp-5axis-sim-plan/app/src/state/store.js` | Step 发送 `EMC_TASK_PLAN_STEP`Home 状态不丢失 | 修改 WASM runtime |
| 6 | task/HAL runtime 增加 paused/single-stepping 状态和 `EMC_TASK_PLAN_STEP` | `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp` | task status 输出 `taskPaused``singleStepping` | 修改 motion runtime |
| 7 | motion runtime 增加 `EMC_TRAJ_STEP` / `EMCMOT_STEP` | `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_motion_runtime.c` | paused 状态下 step 命令可以通过 | 重建 WASM |
| 8 | 重建 task/HAL WASM | 生成/更新 build artifact | `linuxcnc_task_hal_wasm_build=ok` | 跑 Node/WASM 测试 |
| 9 | 跑 WASM 和 Node 测试,发现 MDI `M428` 状态被旧时序影响 | `store.js` | 定位 Home 快速切模式导致 `allHomed` 丢失 | 修复 Home race |
| 10 | 修复 Home racetask/HAL HOME 先同步 Web homed 状态,再发 runtime command | `store.js` | `verify_linuxcnc_task_hal_runtime.mjs` 通过 | 增强测试 |
| 11 | 增加 STEP/STOP task/HAL 状态断言 | `web-rtcp-5axis-sim-plan/tests/node/verify_linuxcnc_task_hal_runtime.mjs` | Step/Stop 状态可验收 | 增加浏览器断言 |
| 12 | 增加浏览器 blocked Run button 可点击断言 | `web-rtcp-5axis-sim-plan/tests/browser/gmoccapy_shell_smoke.html` | blocked Run 不再 disabled点击后提示原因 | 记录日志 |
| 13 | 追加 GPT/Codex 过程日志 | `web-rtcp-5axis-sim-plan/gptlog-process/gpdlog.md` | 满足 workspace logging rule | 生成交付文档 |
| 14 | 新增浏览器按钮流程取证脚本,采集 Home/Run/Pause/Resume/Step/Stop 点击前后截图和状态报告 | `qa/web-rtcp-5axis-site-test/capture-button-control-evidence.mjs` | `button_control_evidence_status=PASS`,生成 14 张截图和 JSON 报告 | 更新工作文档和日志 |
| 15 | 参数化按钮取证脚本,增加 `TARGET_URL`、云端独立输出、job_id、report_id、PDF 报告 | `qa/web-rtcp-5axis-site-test/capture-button-control-evidence.mjs` | 本地取证仍 PASS并生成 PDF | 部署云端 |
| 16 | 重建并部署当前静态站点到 `https://82.156.24.101:8092/` | `web-rtcp-5axis-sim-plan/app/dist`;远端 `/var/www/web-rtcp-5axis-sim` | `nginx -t` 成功;远端 `curl -k -I https://127.0.0.1:8092/` 返回 `HTTP/2 200` | 跑云端按钮验收 |
| 17 | 对云端页面运行按钮流程取证 | `qa/web-rtcp-5axis-site-test/output/cloud-button-control-evidence-report.json``cloud-button-control-evidence-report.pdf``screenshots/cloud-button-control-evidence/*.png` | `button_control_evidence_status=PASS`job_id/report_id 已生成 | 做 native 对照 |
| 18 | 生成 LinuxCNC native task/HAL 对照报告,记录 source/phase0 audit 和 host-native runtime blocker | `qa/web-rtcp-5axis-site-test/capture-native-task-hal-comparison.mjs``native-task-hal-comparison-report.json``native-task-hal-comparison-report.md` | `native_task_hal_comparison_status=PASS_WITH_HOST_NATIVE_RUNTIME_BLOCKER` | 更新文档和日志 |
## 最终改动文件
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_motion_runtime.c`
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp`
- `web-rtcp-5axis-sim-plan/app/src/state/store.js`
- `web-rtcp-5axis-sim-plan/app/src/ui/gmoccapy-shell.js`
- `web-rtcp-5axis-sim-plan/tests/browser/gmoccapy_shell_smoke.html`
- `web-rtcp-5axis-sim-plan/tests/node/verify_linuxcnc_task_hal_runtime.mjs`
- `qa/web-rtcp-5axis-site-test/capture-button-control-evidence.mjs`
- `qa/web-rtcp-5axis-site-test/output/button-control-evidence-report.json`
- `qa/web-rtcp-5axis-site-test/output/button-control-evidence-report.pdf`
- `qa/web-rtcp-5axis-site-test/screenshots/button-control-evidence/*.png`
- `qa/web-rtcp-5axis-site-test/output/cloud-button-control-evidence-report.json`
- `qa/web-rtcp-5axis-site-test/output/cloud-button-control-evidence-report.pdf`
- `qa/web-rtcp-5axis-site-test/screenshots/cloud-button-control-evidence/*.png`
- `qa/web-rtcp-5axis-site-test/capture-native-task-hal-comparison.mjs`
- `qa/web-rtcp-5axis-site-test/output/native-task-hal-comparison-report.json`
- `qa/web-rtcp-5axis-site-test/output/native-task-hal-comparison-report.md`
- `web-rtcp-5axis-sim-plan/gptlog-process/gpdlog.md`
## 最终验证
通过:
- `bash wasm-port/tools/build_task_hal_wasm.sh`
- `node wasm-port/tests/wasm/node/verify_task_hal_wasm.mjs`
- `node web-rtcp-5axis-sim-plan/tests/node/verify_linuxcnc_task_hal_runtime.mjs`
- `node web-rtcp-5axis-sim-plan/tests/node/verify_run_preconditions.mjs`
- `node web-rtcp-5axis-sim-plan/tests/node/verify_rtcp_store.mjs`
- `bash web-rtcp-5axis-sim-plan/tests/browser/verify_gmoccapy_shell_browser.sh`
- `node --check qa/web-rtcp-5axis-site-test/capture-button-control-evidence.mjs`
- `node qa/web-rtcp-5axis-site-test/capture-button-control-evidence.mjs`
- `TARGET_URL='https://82.156.24.101:8092/' EVIDENCE_SCOPE='cloud-button-control-evidence' node qa/web-rtcp-5axis-site-test/capture-button-control-evidence.mjs`
- `bash wasm-port/tests/native/verify_task_hal_phase0.sh`
- `node web-rtcp-5axis-sim-plan/tests/node/verify_native_task_hal_audit.mjs`
- `node --check qa/web-rtcp-5axis-site-test/capture-native-task-hal-comparison.mjs`
- `node qa/web-rtcp-5axis-site-test/capture-native-task-hal-comparison.mjs`
新增浏览器取证结果:
- `button_control_evidence_status=PASS`
- JSON`/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/output/button-control-evidence-report.json`
- 截图目录:`/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/screenshots/button-control-evidence/`
- PDF`/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/output/button-control-evidence-report.pdf`
- 云端 JSON`/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/output/cloud-button-control-evidence-report.json`
- 云端 PDF`/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/output/cloud-button-control-evidence-report.pdf`
- 云端截图目录:`/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/screenshots/cloud-button-control-evidence/`
- 云端 job_id`btn-20260623091811-c291e49b`
- 云端 report_id`report-btn-20260623091811-c291e49b`
- Native 对照 JSON`/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/output/native-task-hal-comparison-report.json`
- Native 对照 Markdown`/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/output/native-task-hal-comparison-report.md`
## 遗留事项
1. `work/working1` 中 BTN-001 到 BTN-013 已全部有验收或 blocker 证据。
2. 当前仍不声明真实硬件、host realtime kernel、外部 User-M process 或 tool DB native runtime 已具备native host runtime 的阻塞原因已记录在 native 对照报告中。

View File

@@ -0,0 +1,50 @@
# 04-任务矩阵
## 状态说明
- Done已实现并有测试证据。
- Partial部分实现需要继续扩展。
- Pending未开始。
- Done-with-blocker验收报告已完成且明确记录当前主机/外部条件阻塞,不再作为本轮未完成项。
## 任务矩阵
| 编号 | 任务 | 状态 | 验收标准 | 验收证据 |
|---|---|---|---|---|
| BTN-001 | Run blocked 时仍可点击 | Done | Run 按钮不被 HTML disabled`data-command-ready=false`;点击后出现 blocked 原因 | `gmoccapy_shell_smoke.html``verify_gmoccapy_shell_browser.sh` |
| BTN-002 | Run 执行条件检查 | Done | 未上电、未 AUTO、未 Home、runtime 未就绪、未选 G-code 等条件会阻止执行并提示 | `verify_run_preconditions.mjs``verify_rtcp_store.mjs` |
| BTN-003 | Run 正常执行 | Done | 条件满足后进入 task/HAL run产生 runtime feedback状态来自 `linuxcnc-task-motion-hal-wasm` | `verify_linuxcnc_task_hal_runtime.mjs`browser smoke |
| BTN-004 | Stop 功能 | Done | 点击 Stop 后发送 `EMC_TASK_ABORT`runState 为 stoppedmotion aborted 为 true | `verify_linuxcnc_task_hal_runtime.mjs` |
| BTN-005 | Pause 功能 | Done | 点击 Pause 后 task/HAL interpState 为 pausedmotion paused 为 true | `verify_linuxcnc_task_hal_runtime.mjs`browser smoke |
| BTN-006 | Resume 功能 | Done | 点击 Resume 后发送 `EMC_TASK_PLAN_RESUME`;仅在状态允许时恢复 status loop | `verify_linuxcnc_task_hal_runtime.mjs`browser smoke |
| BTN-007 | Step 功能 | Done | 点击 Step 后发送 `EMC_TASK_PLAN_STEP`singleStepping 为 true状态保持 paused | `verify_linuxcnc_task_hal_runtime.mjs` |
| BTN-008 | Home 功能 | Done | 点击 Home 后发送 `EMC_JOINT_HOME`Web/task gate 保留 allHomed快速切模式不丢状态 | `verify_linuxcnc_task_hal_runtime.mjs``verify_run_preconditions.mjs` |
| BTN-009 | 按钮 UI 状态标识 | Done | 按钮根据 gate 输出 `data-command-ready``aria-disabled`、title | `gmoccapy-shell.js`browser smoke |
| BTN-010 | LinuxCNC 源码语义映射 | Done | 文档和实现引用 LinuxCNC task command 语义,不新增独立 CNC 行为 | `linuxcnc-task-policy.js` sourceReferences本工作文档 |
| RUNTIME-001 | task/HAL paused 状态输出 | Done | status JSON 输出 `taskPaused` | `linuxcnc_task_hal_wasm.cpp`WASM/Node 测试 |
| RUNTIME-002 | task/HAL single stepping 状态输出 | Done | status JSON 输出 `singleStepping` | `verify_linuxcnc_task_hal_runtime.mjs` |
| RUNTIME-003 | motion runtime 支持 step | Done | `EMC_TRAJ_STEP` / `EMCMOT_STEP` 可进入 queue 并在 paused 时通过 | `linuxcnc_motion_runtime.c`WASM/Node 测试 |
| TEST-001 | WASM runtime 测试 | Done | `verify_task_hal_wasm.mjs` 通过 | 命令输出 |
| TEST-002 | Node task/HAL 测试 | Done | `verify_linuxcnc_task_hal_runtime.mjs` 通过 | 命令输出 |
| TEST-003 | Run precondition 测试 | Done | `verify_run_preconditions.mjs` 通过 | 命令输出 |
| TEST-004 | Browser smoke 测试 | Done | `verify_gmoccapy_shell_browser.sh` 通过 | 命令输出 |
| TEST-005 | Browser 按钮流程截图取证 | Done | Home/Run/Pause/Resume/Step/Stop 点击前后状态截图和 JSON 报告生成,检查项全部 PASS | `capture-button-control-evidence.mjs``button-control-evidence-report.json``screenshots/button-control-evidence/` |
| TEST-006 | 云端按钮流程截图取证 | Done | `https://82.156.24.101:8092/` 页面 Home/Run/Pause/Resume/Step/Stop 流程 PASS生成 job_id/report_id/PDF/截图 | `cloud-button-control-evidence-report.json``cloud-button-control-evidence-report.pdf``screenshots/cloud-button-control-evidence/` |
| TEST-007 | LinuxCNC native task/HAL 对照报告 | Done-with-blocker | source/phase0/native readiness audit 通过opt-in host-native runtime probe 的阻塞原因被记录 | `native-task-hal-comparison-report.json``native-task-hal-comparison-report.md` |
| DOC-001 | 过程日志 | Done | 追加到 `gptlog-process/gpdlog.md` | `gpdlog.md` |
| DOC-002 | 工作交付文档 | Done | 在 `work/working1` 创建 6 份文档 | 本目录 |
## 防重复规则
1. 后续如果继续改这些按钮,先检查 BTN-001 到 BTN-010 的状态,避免重复实现已有 gate。
2. 不要重新写一套 JavaScript CNC 状态机替代 LinuxCNC task/HAL command。
3. 新增按钮时必须先建立 LinuxCNC command/source mapping再接入 store 和 tests。
4. 修改 runtime 行为时必须同时更新 WASM/Node/browser 至少一层测试。
## 后续可扩展任务
| 编号 | 任务 | 状态 | 验收标准 |
|---|---|---|---|
| BTN-011 | 云端页面验收截图 | Done | `https://82.156.24.101:8092/` 部署后截图和报告证明按钮行为 |
| BTN-012 | Stop/Pause/Resume/Step/Home 浏览器截图证据 | Done | 浏览器报告包含每个按钮点击前后状态截图 |
| BTN-013 | 更完整 LinuxCNC native 对照 | Done-with-blocker | native/source 对照和 opt-in host-native runtime blocker 报告完成;当前主机不能生成 native task 状态转换日志 |

View File

@@ -0,0 +1,280 @@
# 05-验收证据
## 验收范围
本轮验收覆盖:
- Run 条件不具备时可点击并提示原因。
- Run 条件满足后进入 task/HAL 执行。
- Stop、Pause、Resume、Step、Home 按钮驱动 task/HAL runtime。
- 按钮状态来自 LinuxCNC task policy 和 task/HAL status而不是固定 UI 状态。
## 命令证据
### 1. 构建 task/HAL WASM
命令:
```bash
bash wasm-port/tools/build_task_hal_wasm.sh
```
结果:
```text
linuxcnc_task_hal_wasm_build=ok
```
### 2. WASM task/HAL runtime 测试
命令:
```bash
node wasm-port/tests/wasm/node/verify_task_hal_wasm.mjs
```
结果:
```text
linuxcnc_task_runtime_smoke=ok
task_status_from_linuxcnc_runtime=ok
task_commands_drive_motion_runtime=ok
mdi_jog_task_motion_hal_sync=ok
```
### 3. Web store + task/HAL runtime 测试
命令:
```bash
node web-rtcp-5axis-sim-plan/tests/node/verify_linuxcnc_task_hal_runtime.mjs
```
结果:
```text
linuxcnc_task_hal_runtime_smoke=ok
task_hal_machine_file_smoke=ok
switchkins_remap_hal_sync_smoke=ok
browser_task_hal_worker_smoke=ok
```
覆盖点:
- Run task/HAL feedback。
- MDI `M428``switchkinsType=1`
- Home 后 Jog 保持坐标连续。
- Pause 后 `interpState=paused`
- Resume 后 `interpState=reading`
- Step 后 `singleStepping=true`
- Stop 后 `motion.aborted=true`
### 4. Run preconditions 测试
命令:
```bash
node web-rtcp-5axis-sim-plan/tests/node/verify_run_preconditions.mjs
```
结果:
```text
run_preconditions_ini_profile_smoke=ok
run_preconditions_kinematics_smoke=ok
run_preconditions_machine_file_smoke=ok
```
覆盖点:
- LinuxCNC INI 未加载时阻止 Run。
- task/HAL runtime 未就绪时阻止 Run。
- 未开机、未 AUTO、未 Home 时阻止 Run。
- 未选择 machine-file G-code 时阻止 Run。
### 5. Store 回归测试
命令:
```bash
node web-rtcp-5axis-sim-plan/tests/node/verify_rtcp_store.mjs
```
结果:
```text
rtcp_store_smoke=ok
```
### 6. 浏览器 smoke 测试
命令:
```bash
bash web-rtcp-5axis-sim-plan/tests/browser/verify_gmoccapy_shell_browser.sh
```
结果:
```text
gmoccapy_shell_smoke=ok
```
覆盖点:
- 页面渲染完整。
- task/HAL runtime worker 就绪。
- blocked Run 按钮不 disabled。
- blocked Run 按钮有 `data-command-ready=false``aria-disabled=true`
- 点击 blocked Run 后输出 blocked 原因。
- Pause/Resume browser workflow 正常。
### 7. 浏览器按钮流程截图取证
命令:
```bash
node --check qa/web-rtcp-5axis-site-test/capture-button-control-evidence.mjs
node qa/web-rtcp-5axis-site-test/capture-button-control-evidence.mjs
```
结果:
```text
button_control_evidence_status=PASS
button_control_evidence_job_id=btn-20260623091525-b35869f1
button_control_evidence_report_id=report-btn-20260623091525-b35869f1
button_control_evidence_json=/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/output/button-control-evidence-report.json
button_control_evidence_pdf=/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/output/button-control-evidence-report.pdf
button_control_evidence_screenshots=/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/screenshots/button-control-evidence
```
覆盖点:
- Home 后 `allHomed=true`,保持 manual/idle 状态。
- Run 后 `runState=running`runtime feedback 来源为 `linuxcnc-task-motion-hal-wasm`
- Pause 后 `runState=paused``taskPaused=true`
- Resume 后恢复 `runState=running``interpState=reading`
- Step 后 `singleStepping=true`,并保持 paused。
- Stop 后 `runState=stopped``motion.aborted=true`
- 14 张截图非空,且每一步记录 `RUN/STOP/PAUSE/RESUME/STEP/HOME` 的 readiness 属性。
### 8. 云端部署与按钮流程验收
部署命令摘要:
```bash
bash wasm-port/tools/build_task_hal_wasm.sh
npm --prefix web-rtcp-5axis-sim-plan/app run build
tar -C web-rtcp-5axis-sim-plan/app/dist -czf /tmp/web-rtcp-5axis-sim-8092-working1.tar.gz .
```
云端发布:
```text
host=82.156.24.101
user=ubuntu
nginx root=/var/www/web-rtcp-5axis-sim
remote tar=/home/ubuntu/tmp/web-rtcp-5axis-sim-8092-working1-20260623051405.tar.gz
remote staging=/home/ubuntu/tmp/web-rtcp-5axis-sim-8092-working1-20260623051405
remote backup=/home/ubuntu/tmp/web-rtcp-backups/web-rtcp-5axis-sim-before-working1-20260623051405
```
云端验证:
```text
sudo nginx -t -> nginx: configuration file /etc/nginx/nginx.conf test is successful
curl -k -I https://127.0.0.1:8092/ -> HTTP/2 200
```
公网按钮流程取证命令:
```bash
TARGET_URL='https://82.156.24.101:8092/' \
EVIDENCE_SCOPE='cloud-button-control-evidence' \
node qa/web-rtcp-5axis-site-test/capture-button-control-evidence.mjs
```
结果:
```text
button_control_evidence_status=PASS
button_control_evidence_job_id=btn-20260623091811-c291e49b
button_control_evidence_report_id=report-btn-20260623091811-c291e49b
button_control_evidence_json=/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/output/cloud-button-control-evidence-report.json
button_control_evidence_pdf=/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/output/cloud-button-control-evidence-report.pdf
button_control_evidence_screenshots=/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/screenshots/cloud-button-control-evidence
```
### 9. LinuxCNC native task/HAL 对照报告
命令:
```bash
bash wasm-port/tests/native/verify_task_hal_phase0.sh
node web-rtcp-5axis-sim-plan/tests/node/verify_native_task_hal_audit.mjs
node --check qa/web-rtcp-5axis-site-test/capture-native-task-hal-comparison.mjs
node qa/web-rtcp-5axis-site-test/capture-native-task-hal-comparison.mjs
```
结果:
```text
task_hal_phase0_native_probe_gate=ok
native_task_hal_source_artifact_audit=ok
native_task_hal_comparison_status=PASS_WITH_HOST_NATIVE_RUNTIME_BLOCKER
native_task_hal_comparison_json=/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/output/native-task-hal-comparison-report.json
native_task_hal_comparison_markdown=/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/output/native-task-hal-comparison-report.md
native_task_hal_transition_log_available=0
native_task_hal_host_blocker_count=15
```
阻塞证据摘要:
- `linuxcnc/scripts/linuxcnc``linuxcnc/scripts/rip-environment` 硬编码旧路径 `/home/cnc/桌面/cnc_wams/linuxcnc`
- `linuxcnc/bin/halcmd` 要求当前主机没有的 `GLIBC_2.38`
- `linuxcnc/bin/rs274` 要求当前主机没有的 `GLIBC_2.38``GLIBCXX_3.4.31``libpython3.13.so.1.0`
- 当前主机 glibc 为 `Ubuntu GLIBC 2.35``libstdc++` 只到 `GLIBCXX_3.4.30`
结论BTN-013 已形成可复核 native/source 对照和 host-native blocker 证据;不声明 native task 状态转换日志已生成。
## 页面证据
本轮执行的是本地和云端 browser 验收:
- 页面入口:`web-rtcp-5axis-sim-plan/app/index.html`
- 云端入口:`https://82.156.24.101:8092/`
- 浏览器验证脚本:`web-rtcp-5axis-sim-plan/tests/browser/verify_gmoccapy_shell_browser.sh`
- 按钮流程取证脚本:`qa/web-rtcp-5axis-site-test/capture-button-control-evidence.mjs`
- 按钮流程 JSON`qa/web-rtcp-5axis-site-test/output/button-control-evidence-report.json`
- 按钮流程 PDF`qa/web-rtcp-5axis-site-test/output/button-control-evidence-report.pdf`
- 按钮流程截图目录:`qa/web-rtcp-5axis-site-test/screenshots/button-control-evidence/`
- 云端按钮流程 JSON`qa/web-rtcp-5axis-site-test/output/cloud-button-control-evidence-report.json`
- 云端按钮流程 PDF`qa/web-rtcp-5axis-site-test/output/cloud-button-control-evidence-report.pdf`
- 云端按钮流程截图目录:`qa/web-rtcp-5axis-site-test/screenshots/cloud-button-control-evidence/`
- Native 对照 JSON`qa/web-rtcp-5axis-site-test/output/native-task-hal-comparison-report.json`
- Native 对照 Markdown`qa/web-rtcp-5axis-site-test/output/native-task-hal-comparison-report.md`
## 文件证据
实现文件:
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_motion_runtime.c`
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp`
- `web-rtcp-5axis-sim-plan/app/src/state/store.js`
- `web-rtcp-5axis-sim-plan/app/src/ui/gmoccapy-shell.js`
测试文件:
- `web-rtcp-5axis-sim-plan/tests/browser/gmoccapy_shell_smoke.html`
- `web-rtcp-5axis-sim-plan/tests/node/verify_linuxcnc_task_hal_runtime.mjs`
- `qa/web-rtcp-5axis-site-test/capture-button-control-evidence.mjs`
- `qa/web-rtcp-5axis-site-test/capture-native-task-hal-comparison.mjs`
过程日志:
- `web-rtcp-5axis-sim-plan/gptlog-process/gpdlog.md`
## 验收结论
本轮功能已通过 WASM、Node、browser 三层验证。按钮行为已从单纯 UI 操作提升为 LinuxCNC task/HAL 状态驱动的控制流程。

View File

@@ -0,0 +1,187 @@
# 06-决策记录
## DR-001按钮 blocked 时保持可点击
决策Run、Stop、Pause、Resume、Step、Home 在 gate blocked 时不设置 HTML `disabled`
原因:
- 用户要求点击 Run 时,如果执行条件不具备,请提示。
- HTML disabled 按钮无法触发 click用户拿不到具体阻塞原因。
- 保持按钮可点击,同时用 `data-command-ready=false``aria-disabled=true`、title 和 operatorMessage 表达 blocked 状态,更符合操作员界面需求。
影响:
- blocked 按钮仍能 dispatch action。
- store gate 是最终裁决点。
- UI 可以显示真实阻塞原因。
## DR-002按钮语义以 LinuxCNC task command 为准
决策:不新增独立 JavaScript CNC 行为,按钮映射 LinuxCNC command。
映射:
- Run -> `EMC_TASK_PLAN_RUN`
- Stop -> `EMC_TASK_ABORT`
- Pause -> `EMC_TASK_PLAN_PAUSE`
- Resume -> `EMC_TASK_PLAN_RESUME`
- Step -> `EMC_TASK_PLAN_STEP`
- Home -> `EMC_JOINT_HOME`
原因:
- `wasm-port/SKILL.md` 要求 LinuxCNC 源码是语义源。
- LinuxCNC task 状态、解释器状态、pause/resume/step 行为已有明确实现。
- Web 端只应做 runtime edge adapter 和 UI 显示。
参考:
- `/home/meswork/cnc_wams/linuxcnc/src/emc/task/emctaskmain.cc`
- `/home/meswork/cnc_wams/linuxcnc/src/emc/nml_intf/emc_nml.hh`
## DR-003Step 必须发送 `EMC_TASK_PLAN_STEP`
决策Step 不再只执行空 task cycle必须发送 `EMC_TASK_PLAN_STEP`
原因:
- LinuxCNC 中单步由 `EMC_TASK_PLAN_STEP``single_stepping``steppingWait` 等状态控制。
- 空 cycle 不能表达 operator step command也不能作为验收依据。
影响:
- task/HAL runtime 增加 `singleStepping` 状态。
- motion runtime 增加 `EMC_TRAJ_STEP` 支持。
- Node 测试验证 `singleStepping=true`
## DR-004Resume 后是否重启 status loop 由返回状态决定
决策Resume command 完成后,用 `shouldContinueTaskHalStatusLoop(state, status)` 判断是否恢复轮询。
原因:
- 旧逻辑只看旧 state可能在已经完成、停止或状态不应继续时重启 loop。
- LinuxCNC task/HAL status 是更可信的数据来源。
影响:
- 减少旧 status loop 覆盖新命令状态的风险。
- Pause/Resume 更接近 LinuxCNC task 状态。
## DR-005Home 在 Web 状态中立即标记 homed
决策task/HAL HOME dispatch 时,先同步 Web 侧 machine 状态,再异步发送 `EMC_JOINT_HOME`
原因:
- 前端操作可能快速执行 `HOME -> SET_MODE auto/mdi`
- 如果只等异步 task/HAL status 返回,后续 mode command 可能覆盖 Home 状态,导致 Run 或 MDI 被错误阻止。
- 这是 standalone Web runtime 的异步边界适配,不改变 LinuxCNC Home 命令语义。
影响:
- `allHomed=true` 不会因快速模式切换丢失。
- task/HAL runtime 仍会收到 `EMC_JOINT_HOME`
## DR-006初始化 task/HAL session 时停止旧 status loop
决策:`initializeTaskHalSession()` 开始时停止旧 `taskHalStatusLoop`
原因:
- session reset 会重置 task/HAL runtime。
- 旧 status loop 如果继续运行,可能把旧运行状态覆盖到新 session 或 MDI command 上。
影响:
- MDI `M428``switchkinsType=1` 不会被旧 loop 覆盖。
- 新 session 状态边界更清晰。
## DR-007保留 `allHomed` 和 `noForceHoming`
决策:`applyTaskHalStatusPatch()` 在合并 task/HAL status 时保留 Web policy 状态中的 `allHomed``noForceHoming`
原因:
- 当前 standalone task/HAL status JSON 不完整表达所有 LinuxCNC homing policy 细节。
- Web task policy gate 需要这些字段判断 Run/MDI 是否允许。
影响:
- Run gate 不会因为 status patch 丢失 homed/policy 信息而错误阻止。
## DR-008本轮不做真实硬件控制
决策:只完善 Web/WASM standalone simulation task/HAL 状态,不接入真实硬件。
原因:
- 项目边界明确Web simulation不驱动真实硬件。
- `wasm-port/SKILL.md` 明确 realtime scheduling、driver、native HAL runtime internals 是替换边界。
影响:
- 验收以 WASM/Node/browser simulation 为准。
- 后续若要硬件级对照,应另建 native LinuxCNC 验收任务。
## DR-009云端验收另行执行
决策:本轮文档记录本地严格测试证据;云端 `https://82.156.24.101:8092/` 需要部署后单独采集。后续已执行部署和云端取证,见 DR-011。
原因:
- 本轮代码和测试在本地 workspace 完成。
- 未执行云端部署命令,也未产生云端 job_id/report_id/PDF。
影响:
- 当前功能代码已完成。
- 云端验收截图/报告已在后续步骤补齐。
## DR-010按钮流程截图取证独立于 browser smoke
决策:新增 `qa/web-rtcp-5axis-site-test/capture-button-control-evidence.mjs`,不把截图取证逻辑塞进 `gmoccapy_shell_smoke.html`
原因:
- browser smoke 用于快速回归,职责是发现核心渲染和行为回退。
- 按钮流程取证会启动 Puppeteer、采集 PNG、分析像素并写 JSON执行成本和输出体积更大。
- 独立脚本可以稳定保留 Home/Run/Pause/Resume/Step/Stop 的验收证据,同时不拖慢常规 smoke。
影响:
- BTN-012 的验收入口是独立 QA 命令。
- 截图和 JSON 报告保存在 `qa/web-rtcp-5axis-site-test/` 下,可用于交付或人工复核。
## DR-011云端 BTN-011 以同一按钮流程脚本验收
决策:使用参数化后的 `capture-button-control-evidence.mjs``https://82.156.24.101:8092/` 运行同一套 Home/Run/Pause/Resume/Step/Stop 验收。
原因:
- 同一脚本能保证本地和云端验收标准一致。
- 云端验收必须包含 job_id、report_id、PDF、截图和 JSON。
- 云端 machine-file seed 比本地慢,脚本改为轮询 runtime readiness 和 staging 状态,避免 Puppeteer 长 Promise 被回收。
影响:
- BTN-011 已完成。
- 云端报告为 `PASS`job_id 为 `btn-20260623091811-c291e49b`
## DR-012BTN-013 以 native/source 对照和 host blocker 报告完成
决策:不把当前主机无法运行的 host-native TRT task/HAL runtime 伪装成已通过BTN-013 的完成产物是 `native-task-hal-comparison-report.json/md`
原因:
- 默认 phase0 native source/probe gate 和 Web native readiness audit 均通过。
- opt-in native runtime probe 尝试后失败,`linuxcnc.stderr.log` 显示 LinuxCNC RIP 脚本引用旧绝对路径 `/home/cnc/桌面/cnc_wams/linuxcnc/scripts/rip-environment`
- `ldd` 显示当前主机还缺少 `GLIBC_2.38``GLIBCXX_3.4.31``libpython3.13.so.1.0` 等 native runtime 依赖。
- 在这些 host 条件未满足前,无法生成真实 native LinuxCNC task 状态转换日志。
影响:
- BTN-013 标记为 `Done-with-blocker`
- 本轮仍只声明 Web/WASM simulation boundary 的 task/HAL 行为完成。
- 真实 host realtime/hardware/external process/tool DB native runtime 仍不提升为完成状态。

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,9 @@
# gmoccapy_XYZAB Button Icons
本目录保存 gmoccapy_XYZAB 界面按钮图标整理结果。
- `button_icon_inventory.md`:中文说明和完整清单。
- `button_icon_inventory.csv`:可导入表格工具的明细。
- `files/`:从 `classic` 图标主题和宏目录复制出的实际图标文件。
图标复制文件按 `image_id__icon_name__requested_size.ext` 命名;宏自定义图片按 `macro_N__macro_image.ext` 命名。

View File

@@ -0,0 +1,212 @@
category,source,button_id,button_label,tooltip,image_id,image_role,state_or_variant,icon_name,requested_size,icon_source_type,source_path,copied_file,signals,notes
右侧主状态栏,运行时状态,rbt_auto,Auto 已选中,,img_auto_on,Auto active 图标,active,mode_auto_active,48,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/mode_auto_active.png,work/working3/gmoccapy_button_icons/files/img_auto_on__mode_auto_active__48.png,,on_rbt_auto_toggled
右侧主状态栏,Glade 静态,rbt_auto,,enter auto mode to run programs,img_auto,静态绑定,默认,mode_auto_inactive,48,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/mode_auto_inactive.png,work/working3/gmoccapy_button_icons/files/img_auto__mode_auto_inactive__48.png,pressed:on_rbt_auto_pressed; toggled:on_rbt_auto_toggled,
右侧主状态栏,运行时状态,rbt_manual,手动已选中,,img_manual_on,手动模式 active 图标,active,mode_manual_active,48,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/mode_manual_active.png,work/working3/gmoccapy_button_icons/files/img_manual_on__mode_manual_active__48.png,,on_rbt_manual_toggled
右侧主状态栏,Glade 静态,rbt_manual,,enter manual mode to jog axis by hand or touch off / [F3],img_manual,静态绑定,默认,mode_manual_inactive,48,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/mode_manual_inactive.png,work/working3/gmoccapy_button_icons/files/img_manual__mode_manual_inactive__48.png,pressed:on_rbt_manual_pressed; toggled:on_rbt_manual_toggled,
右侧主状态栏,运行时状态,rbt_mdi,MDI 已选中,,img_mdi_on,MDI active 图标,active,mode_mdi_active,48,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/mode_mdi_active.png,work/working3/gmoccapy_button_icons/files/img_mdi_on__mode_mdi_active__48.png,,on_rbt_mdi_toggled
右侧主状态栏,Glade 静态,rbt_mdi,,enter MDI mode to launch G-code commands / [F5],img_mdi,静态绑定,默认,mode_mdi_inactive,48,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/mode_mdi_inactive.png,work/working3/gmoccapy_button_icons/files/img_mdi__mode_mdi_inactive__48.png,pressed:on_rbt_mdi_pressed; toggled:on_rbt_mdi_toggled,
右侧主状态栏,运行时状态,tbtn_estop,急停复位/非急停,,img_emergency_off,急停复位态图标,STATE_ESTOP_RESET,main_switch_off,48,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/main_switch_off.png,work/working3/gmoccapy_button_icons/files/img_emergency_off__main_switch_off__48.png,,on_hal_status_state_estop_reset
右侧主状态栏,Glade 静态,tbtn_estop,,Estop the machine / [F1],img_emergency,静态绑定,默认,main_switch_on,48,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/main_switch_on.png,work/working3/gmoccapy_button_icons/files/img_emergency__main_switch_on__48.png,toggled:on_tbtn_estop_toggled,
右侧主状态栏,运行时状态,tbtn_on,上电,,img_machine_on,机器 ON 图标,STATE_ON,power_on,48,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/power_on.png,work/working3/gmoccapy_button_icons/files/img_machine_on__power_on__48.png,,on_hal_status_state_on
右侧主状态栏,Glade 静态,tbtn_on,,Turn the machine on/off / [F2],img_machine_off,静态绑定,默认,power_off,48,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/power_off.png,work/working3/gmoccapy_button_icons/files/img_machine_off__power_off__48.png,toggled:on_tbtn_on_toggled,
右侧主状态栏,运行时状态,tbtn_setup,设置页已进入,,img_settings_on,设置页 active 图标,active/unlocked,mode_settings_active,48,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/mode_settings_active.png,work/working3/gmoccapy_button_icons/files/img_settings_on__mode_settings_active__48.png,,on_tbtn_setup_toggled
右侧主状态栏,Glade 静态,tbtn_setup,,"Enter the settings page, the default code is ""123""",img_settings,静态绑定,默认,mode_settings_inactive,48,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/mode_settings_inactive.png,work/working3/gmoccapy_button_icons/files/img_settings__mode_settings_inactive__48.png,toggled:on_tbtn_setup_toggled,
右侧主状态栏,运行时状态,tbtn_user_tabs,用户页已显示,,img_user_tabs_on,用户页 active 图标,active,mode_user_tabs_active,48,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/mode_user_tabs_active.png,work/working3/gmoccapy_button_icons/files/img_user_tabs_on__mode_user_tabs_active__48.png,,on_tbtn_user_tabs_toggled
右侧主状态栏,Glade 静态,tbtn_user_tabs,,show user tabs,img_user_tabs,静态绑定,默认,mode_user_tabs_inactive,48,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/mode_user_tabs_inactive.png,work/working3/gmoccapy_button_icons/files/img_user_tabs__mode_user_tabs_inactive__48.png,toggled:on_tbtn_user_tabs_toggled,
底部主按钮栏,Glade 静态,btn_exit,,Close gmoccapy / leave the program,img_close,静态绑定,默认,logout,48,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/logout.png,work/working3/gmoccapy_button_icons/files/img_close__logout__48.png,clicked:on_btn_exit_clicked,
底部主按钮栏,Glade 静态,btn_homing,,open homing button list,img_ref_menu,静态绑定,默认,ref_all,48,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/ref_all.png,work/working3/gmoccapy_button_icons/files/img_ref_menu__ref_all__48.png,clicked:on_btn_homing_clicked,
底部主按钮栏,Glade 静态,btn_tool,,Open the tooleditor page,img_tools,静态绑定,默认,hsk_mill_tool,48,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/hsk_mill_tool.png,work/working3/gmoccapy_button_icons/files/img_tools__hsk_mill_tool__48.png,clicked:on_btn_tool_clicked,
底部主按钮栏,Glade 静态,btn_touch,,open touch off button list,img_touch_off,静态绑定,默认,touch_off,48,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/touch_off.png,work/working3/gmoccapy_button_icons/files/img_touch_off__touch_off__48.png,clicked:on_btn_touch_clicked,
底部主按钮栏,运行时状态,tbtn_fullsize_preview0,退出大预览,,img_fullsize_preview0_close,大预览关闭图标,fullscreen active,fullscreen_close,48,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/fullscreen_close.png,work/working3/gmoccapy_button_icons/files/img_fullsize_preview0_close__fullscreen_close__48.png,,on_tbtn_fullsize_preview_toggled
底部主按钮栏,Glade 静态,tbtn_fullsize_preview0,,make the preview as large as possible,img_fullsize_preview0_open,静态绑定,默认,fullscreen_open,48,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/fullscreen_open.png,work/working3/gmoccapy_button_icons/files/img_fullsize_preview0_open__fullscreen_open__48.png,toggled:on_tbtn_fullsize_preview_toggled,
底部主按钮栏,Glade 静态,tbtn_switch_mode,World / Mode,Switch motion mode between Joint and World mode / F12 or $ key does the same,,静态绑定,默认,,,none,,,toggled:on_tbtn_switch_mode_toggled,
Auto 程序运行栏,Glade 静态,btn_edit,,Edit the loaded program,img_editor,静态绑定,默认,edit_code,32,theme-nearest-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/edit_code.png,work/working3/gmoccapy_button_icons/files/img_editor__edit_code__32.png,clicked:on_btn_edit_clicked,
Auto 程序运行栏,Glade 静态,btn_from_line,,"run the program from a certain line, attention, that is dangerous, because the previous lines will not checked!",img_run_from,静态绑定,默认,run_from_line,48,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/run_from_line.png,work/working3/gmoccapy_button_icons/files/img_run_from__run_from_line__48.png,clicked:on_btn_from_line_clicked,
Auto 程序运行栏,Glade 静态,btn_load,,Load a new program,img_open,静态绑定,默认,open_file,32,theme-svg,linuxcnc/share/gmoccapy/icons/classic/scalable/actions/open_file.svg,work/working3/gmoccapy_button_icons/files/img_open__open_file__32.svg,clicked:on_btn_load_clicked,
Auto 程序运行栏,Glade 静态,btn_reload,,Reload file,img_reload1,静态绑定,默认,refresh,32,theme-nearest-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/refresh.png,work/working3/gmoccapy_button_icons/files/img_reload1__refresh__32.png,,
Auto 程序运行栏,Glade 静态,btn_run,,Run the loaded program,img_run,静态绑定,默认,play,32,theme-nearest-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/play.png,work/working3/gmoccapy_button_icons/files/img_run__play__32.png,clicked:on_btn_run_clicked,
Auto 程序运行栏,Glade 静态,btn_step,,Run the loaded program step by step,img_step,静态绑定,默认,step,32,theme-nearest-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/step.png,work/working3/gmoccapy_button_icons/files/img_step__step__32.png,,
Auto 程序运行栏,Glade 静态,btn_stop,,Stop the running program,img_stop,静态绑定,默认,stop,32,theme-nearest-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/stop.png,work/working3/gmoccapy_button_icons/files/img_stop__stop__32.png,clicked:on_btn_stop_clicked,
Auto 程序运行栏,运行时状态,tbtn_fullsize_preview1,退出大预览,,img_fullsize_preview1_close,大预览关闭图标,fullscreen active,fullscreen_close,48,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/fullscreen_close.png,work/working3/gmoccapy_button_icons/files/img_fullsize_preview1_close__fullscreen_close__48.png,,on_tbtn_fullsize_preview_toggled
Auto 程序运行栏,Glade 静态,tbtn_fullsize_preview1,,Show full screen preview,img_fullsize_preview1_open,静态绑定,默认,fullscreen_open,48,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/fullscreen_open.png,work/working3/gmoccapy_button_icons/files/img_fullsize_preview1_open__fullscreen_open__48.png,toggled:on_tbtn_fullsize_preview_toggled,
Auto 程序运行栏,运行时状态,tbtn_optional_blocks,跳过可选段,,img_skip_optional_active,可选段跳过 active 图标,block delete active,skip_optional_active,32,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/32x32/actions/skip_optional_active.png,work/working3/gmoccapy_button_icons/files/img_skip_optional_active__skip_optional_active__32.png,,on_tbtn_optional_blocks_toggled
Auto 程序运行栏,Glade 静态,tbtn_optional_blocks,,"Machine or not the optional blocks of the program. If the button is pressed, the optional blocks will not be machined. The button will indicate this by a yellow background.",img_skip_optional_inactive,静态绑定,默认,skip_optional_inactive,32,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/32x32/actions/skip_optional_inactive.png,work/working3/gmoccapy_button_icons/files/img_skip_optional_inactive__skip_optional_inactive__32.png,toggled:on_tbtn_optional_blocks_toggled,
Auto 程序运行栏,运行时状态,tbtn_pause,暂停中,,img_pause_active,暂停 active 图标,paused,pause_active,32,theme-nearest-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/pause_active.png,work/working3/gmoccapy_button_icons/files/img_pause_active__pause_active__32.png,,on_tbtn_pause_toggled
Auto 程序运行栏,Glade 静态,tbtn_pause,,Pause the running program,img_pause,静态绑定,默认,pause,32,theme-nearest-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/pause.png,work/working3/gmoccapy_button_icons/files/img_pause__pause__32.png,toggled:on_tbtn_pause_toggled,
MDI/宏按钮栏,Python 动态,calculator,计算器,Press to display the calculator,img_macro_menu_calculator,动态按钮图标,默认,calculator_open,32,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/32x32/actions/calculator_open.png,work/working3/gmoccapy_button_icons/files/img_macro_menu_calculator__calculator_open__32.png,,_make_macro_button
MDI/宏按钮栏,运行时状态,keyboard,隐藏虚拟键盘,,img_macro_menu_keyboard_hide,宏栏键盘隐藏图标,keyboard shown,keyboard_hide,32,theme-nearest-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/keyboard_hide.png,work/working3/gmoccapy_button_icons/files/img_macro_menu_keyboard_hide__keyboard_hide__32.png,,on_ntb_info_switch_page
MDI/宏按钮栏,运行时状态,keyboard,中止运行宏/程序,,img_macro_menu_stop,宏栏停止图标,program/macro running or no keyboard,stop,32,theme-nearest-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/stop.png,work/working3/gmoccapy_button_icons/files/img_macro_menu_stop__stop__32.png,,on_hal_status_interp_run/_no_virt_keyboard
MDI/宏按钮栏,Python 动态,keyboard,虚拟键盘,Press to display the virtual keyboard,img_macro_menu_keyboard,动态按钮图标,默认,keyboard,32,theme-nearest-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/keyboard.png,work/working3/gmoccapy_button_icons/files/img_macro_menu_keyboard__keyboard__32.png,,_make_macro_button
MDI/宏按钮栏,Python 动态宏,macro_0,i_am_lost,Press to run macro i_am_lost,,无图标,默认,,,macro-custom-file,linuxcnc/configs/sim/gmoccapy/macros/images/i_am_lost.png,work/working3/gmoccapy_button_icons/files/macro_0__macro_image.png,,宏文件 IMAGE 自定义图片: /home/meswork/cnc_wams/linuxcnc/configs/sim/gmoccapy/macros/images/i_am_lost.png
MDI/宏按钮栏,Python 动态宏,macro_1,halo_world,Press to run macro halo_world,,无图标,默认,,,none,,,,宏按钮使用文字,无图标
MDI/宏按钮栏,Python 动态宏,macro_2,jog_around,Press to run macro jog_around,,无图标,默认,,,none,,,,宏按钮使用文字,无图标
MDI/宏按钮栏,Python 动态宏,macro_3,increment,Press to run macro increment xinc yinc,,无图标,默认,,,none,,,,宏按钮使用文字,无图标
MDI/宏按钮栏,Python 动态宏,macro_4,go_to_position,Press to run macro go_to_position X-pos Y-pos Z-pos,,无图标,默认,,,macro-custom-file,linuxcnc/configs/sim/gmoccapy/macros/images/goto_x_y_z.png,work/working3/gmoccapy_button_icons/files/macro_4__macro_image.png,,宏文件 IMAGE 自定义图片: /home/meswork/cnc_wams/linuxcnc/configs/sim/gmoccapy/macros/images/goto_x_y_z.png
MDI/宏按钮栏,Python 动态,next_button,下一组宏按钮,Press to display next macro button,img_macro_paginate_next,动态按钮图标,默认,go-next,,gtk-icon-name-not-copied,GTK/system icon theme,,,当前宏数 5小于 7默认隐藏; 未在 gmoccapy classic 主题中固定解析,运行时由 GTK/system icon theme 决定
MDI/宏按钮栏,Python 动态,previous_button,上一组宏按钮,Press to display previous macro button,img_macro_paginate_prev,动态按钮图标,默认,go-previous,,gtk-icon-name-not-copied,GTK/system icon theme,,,当前宏数 5小于 7默认隐藏; 未在 gmoccapy classic 主题中固定解析,运行时由 GTK/system icon theme 决定
回零按钮栏,Python 动态,home_axis_a,回零 A 轴,Press to home axis A,img_ref_a,动态按钮图标,默认,ref_a,48,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/ref_a.png,work/working3/gmoccapy_button_icons/files/img_ref_a__ref_a__48.png,,当前 XYZAB 生成
回零按钮栏,Python 动态,home_axis_b,回零 B 轴,Press to home axis B,img_ref_b,动态按钮图标,默认,ref_b,48,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/ref_b.png,work/working3/gmoccapy_button_icons/files/img_ref_b__ref_b__48.png,,当前 XYZAB 生成
回零按钮栏,Python 动态,home_axis_x,回零 X 轴,Press to home axis X,img_ref_x,动态按钮图标,默认,ref_x,48,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/ref_x.png,work/working3/gmoccapy_button_icons/files/img_ref_x__ref_x__48.png,,当前 XYZAB 生成
回零按钮栏,Python 动态,home_axis_y,回零 Y 轴,Press to home axis Y,img_ref_y,动态按钮图标,默认,ref_y,48,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/ref_y.png,work/working3/gmoccapy_button_icons/files/img_ref_y__ref_y__48.png,,当前 XYZAB 生成
回零按钮栏,Python 动态,home_axis_z,回零 Z 轴,Press to home axis Z,img_ref_z,动态按钮图标,默认,ref_z,48,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/ref_z.png,work/working3/gmoccapy_button_icons/files/img_ref_z__ref_z__48.png,,当前 XYZAB 生成
回零按钮栏,Python 动态,home_back,返回主按钮栏,Press to return to main button list,img_ref_menu_close,动态按钮图标,默认,back_to_app,48,theme-svg,linuxcnc/share/gmoccapy/icons/classic/scalable/actions/back_to_app.svg,work/working3/gmoccapy_button_icons/files/img_ref_menu_close__back_to_app__48.svg,,_make_ref_axis_button
回零按钮栏,Python 动态,next_button,下一组回零按钮,Press to display next homing button,img_ref_paginate_next,动态按钮图标,默认,chevron_right,32,theme-svg,linuxcnc/share/gmoccapy/icons/classic/scalable/actions/chevron_right.svg,work/working3/gmoccapy_button_icons/files/img_ref_paginate_next__chevron_right__32.svg,,仅轴数大于 7 时显示
回零按钮栏,Python 动态,previous_button,上一组回零按钮,Press to display previous homing button,img_ref_paginate_prev,动态按钮图标,默认,chevron_left,32,theme-svg,linuxcnc/share/gmoccapy/icons/classic/scalable/actions/chevron_left.svg,work/working3/gmoccapy_button_icons/files/img_ref_paginate_prev__chevron_left__32.svg,,仅轴数大于 7 时显示
回零按钮栏,Python 动态,ref_all,回零全部轴,Press to home all axes,img_ref_all,动态按钮图标,默认,ref_all,48,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/ref_all.png,work/working3/gmoccapy_button_icons/files/img_ref_all__ref_all__48.png,,_make_ref_axis_button
回零按钮栏,Python 动态,unref_all,取消全部回零,Press to unhome all axes,img_unref_all,动态按钮图标,默认,unref_all,48,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/unref_all.png,work/working3/gmoccapy_button_icons/files/img_unref_all__unref_all__48.png,,_make_ref_axis_button
对刀/坐标设定按钮栏,Python 动态,block_height,Block Height,Press to enter new value for block height,,无图标,默认,,,none,,,,仅 [TOOLSENSOR] 有效时出现;本配置默认不出现
对刀/坐标设定按钮栏,Python 动态,next_button,下一组 Touch Off 按钮,Press to display next homing button,img_touch_paginate_next,动态按钮图标,默认,chevron_right,32,theme-svg,linuxcnc/share/gmoccapy/icons/classic/scalable/actions/chevron_right.svg,work/working3/gmoccapy_button_icons/files/img_touch_paginate_next__chevron_right__32.svg,,仅按钮过多时显示
对刀/坐标设定按钮栏,Python 动态,previous_button,上一组 Touch Off 按钮,Press to display previous homing button,img_touch_paginate_prev,动态按钮图标,默认,chevron_left,32,theme-svg,linuxcnc/share/gmoccapy/icons/classic/scalable/actions/chevron_left.svg,work/working3/gmoccapy_button_icons/files/img_touch_paginate_prev__chevron_left__32.svg,,仅轴数大于 8 时显示
对刀/坐标设定按钮栏,Python 动态,touch_a,A 轴 Touch Off,Press to set touch off value for axis A,img_touch_a,动态按钮图标,默认,touch_a,48,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/touch_a.png,work/working3/gmoccapy_button_icons/files/img_touch_a__touch_a__48.png,,当前 XYZAB 生成
对刀/坐标设定按钮栏,Python 动态,touch_b,B 轴 Touch Off,Press to set touch off value for axis B,img_touch_b,动态按钮图标,默认,touch_b,48,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/touch_b.png,work/working3/gmoccapy_button_icons/files/img_touch_b__touch_b__48.png,,当前 XYZAB 生成
对刀/坐标设定按钮栏,Python 动态,touch_back,返回主按钮栏,Press to return to main button list,img_touch_menu_close,动态按钮图标,默认,back_to_app,48,theme-svg,linuxcnc/share/gmoccapy/icons/classic/scalable/actions/back_to_app.svg,work/working3/gmoccapy_button_icons/files/img_touch_menu_close__back_to_app__48.svg,,_make_touch_button
对刀/坐标设定按钮栏,Python 动态,touch_x,X 轴 Touch Off,Press to set touch off value for axis X,img_touch_x,动态按钮图标,默认,touch_x,48,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/touch_x.png,work/working3/gmoccapy_button_icons/files/img_touch_x__touch_x__48.png,,当前 XYZAB 生成
对刀/坐标设定按钮栏,Python 动态,touch_y,Y 轴 Touch Off,Press to set touch off value for axis Y,img_touch_y,动态按钮图标,默认,touch_y,48,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/touch_y.png,work/working3/gmoccapy_button_icons/files/img_touch_y__touch_y__48.png,,当前 XYZAB 生成
对刀/坐标设定按钮栏,Python 动态,touch_z,Z 轴 Touch Off,Press to set touch off value for axis Z,img_touch_z,动态按钮图标,默认,touch_z,48,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/touch_z.png,work/working3/gmoccapy_button_icons/files/img_touch_z__touch_z__48.png,,当前 XYZAB 生成
手动/Jog 面板,Glade 静态,chk_ignore_limits,Ignore limits,,,静态绑定,默认,,,none,,,toggled:on_chk_ignore_limits_toggled,
手动/Jog 面板,运行时状态,tbtn_turtle_jog,慢速 Jog,,img_turtle_jog,慢速 Jog 图标,active,jog_speed_slow,32,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/32x32/actions/jog_speed_slow.png,work/working3/gmoccapy_button_icons/files/img_turtle_jog__jog_speed_slow__32.png,,on_tbtn_turtle_jog_toggled
手动/Jog 面板,运行时状态,tbtn_turtle_jog,快速 Jog,,img_rabbit_jog,快速 Jog 图标,inactive,jog_speed_fast,32,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/32x32/actions/jog_speed_fast.png,work/working3/gmoccapy_button_icons/files/img_rabbit_jog__jog_speed_fast__32.png,,on_tbtn_turtle_jog_toggled
手动/Jog 面板,Glade 静态,tbtn_turtle_jog,,,img_rabbit_jog,静态绑定,默认,jog_speed_fast,32,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/32x32/actions/jog_speed_fast.png,work/working3/gmoccapy_button_icons/files/img_rabbit_jog__jog_speed_fast__32.png,toggled:on_tbtn_turtle_jog_toggled,
Jog 增量选择栏,Python 动态,rbt_0,Continuous,Continuous jog,img_continuous,动态按钮图标,默认,jog_continuous,24,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/24x24/actions/jog_continuous.png,work/working3/gmoccapy_button_icons/files/img_continuous__jog_continuous__24.png,,连续 Jog 唯一带图标
Jog 增量选择栏,Python 动态,rbt_1,1.000 mm,,,无图标,默认,,,none,,,,增量按钮使用文字,无图标
Jog 增量选择栏,Python 动态,rbt_2,0.100 mm,,,无图标,默认,,,none,,,,增量按钮使用文字,无图标
Jog 增量选择栏,Python 动态,rbt_3,0.010 mm,,,无图标,默认,,,none,,,,增量按钮使用文字,无图标
Jog 增量选择栏,Python 动态,rbt_4,0.001 mm,,,无图标,默认,,,none,,,,增量按钮使用文字,无图标
Jog 增量选择栏,Python 动态,rbt_5,1.2345 in,,,无图标,默认,,,none,,,,增量按钮使用文字,无图标
Jog 轴按钮,Python 动态,a+,A+,Press to jog axis A,,无图标,默认,,,none,,,,轴 Jog 按钮使用文字,无图标
Jog 轴按钮,Python 动态,a-,A-,Press to jog axis A,,无图标,默认,,,none,,,,轴 Jog 按钮使用文字,无图标
Jog 轴按钮,Python 动态,b+,B+,Press to jog axis B,,无图标,默认,,,none,,,,轴 Jog 按钮使用文字,无图标
Jog 轴按钮,Python 动态,b-,B-,Press to jog axis B,,无图标,默认,,,none,,,,轴 Jog 按钮使用文字,无图标
Jog 轴按钮,Python 动态,x+,X+,Press to jog axis X,,无图标,默认,,,none,,,,轴 Jog 按钮使用文字,无图标
Jog 轴按钮,Python 动态,x-,X-,Press to jog axis X,,无图标,默认,,,none,,,,轴 Jog 按钮使用文字,无图标
Jog 轴按钮,Python 动态,y+,Y+,Press to jog axis Y,,无图标,默认,,,none,,,,轴 Jog 按钮使用文字,无图标
Jog 轴按钮,Python 动态,y-,Y-,Press to jog axis Y,,无图标,默认,,,none,,,,轴 Jog 按钮使用文字,无图标
Jog 轴按钮,Python 动态,z+,Z+,Press to jog axis Z,,无图标,默认,,,none,,,,轴 Jog 按钮使用文字,无图标
Jog 轴按钮,Python 动态,z-,Z-,Press to jog axis Z,,无图标,默认,,,none,,,,轴 Jog 按钮使用文字,无图标
Jog 关节按钮,Python 动态,0+,0+,Press to jog joint 0,,无图标,默认,,,none,,,,trivial kinematics 时不创建;非平凡运动学才出现
Jog 关节按钮,Python 动态,0-,0-,Press to jog joint 0,,无图标,默认,,,none,,,,trivial kinematics 时不创建;非平凡运动学才出现
Jog 关节按钮,Python 动态,1+,1+,Press to jog joint 1,,无图标,默认,,,none,,,,trivial kinematics 时不创建;非平凡运动学才出现
Jog 关节按钮,Python 动态,1-,1-,Press to jog joint 1,,无图标,默认,,,none,,,,trivial kinematics 时不创建;非平凡运动学才出现
Jog 关节按钮,Python 动态,2+,2+,Press to jog joint 2,,无图标,默认,,,none,,,,trivial kinematics 时不创建;非平凡运动学才出现
Jog 关节按钮,Python 动态,2-,2-,Press to jog joint 2,,无图标,默认,,,none,,,,trivial kinematics 时不创建;非平凡运动学才出现
Jog 关节按钮,Python 动态,3+,3+,Press to jog joint 3,,无图标,默认,,,none,,,,trivial kinematics 时不创建;非平凡运动学才出现
Jog 关节按钮,Python 动态,3-,3-,Press to jog joint 3,,无图标,默认,,,none,,,,trivial kinematics 时不创建;非平凡运动学才出现
Jog 关节按钮,Python 动态,4+,4+,Press to jog joint 4,,无图标,默认,,,none,,,,trivial kinematics 时不创建;非平凡运动学才出现
Jog 关节按钮,Python 动态,4-,4-,Press to jog joint 4,,无图标,默认,,,none,,,,trivial kinematics 时不创建;非平凡运动学才出现
冷却/主轴控制,运行时状态,rbt_forward,主轴正转中,,img_spindle_forward_on,正转 active 图标,active,spindle_right_on,48,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/spindle_right_on.png,work/working3/gmoccapy_button_icons/files/img_spindle_forward_on__spindle_right_on__48.png,,on_rbt_forward_released/clicked
冷却/主轴控制,Glade 静态,rbt_forward,,,img_spindle_forward,静态绑定,默认,spindle_right,48,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/spindle_right.png,work/working3/gmoccapy_button_icons/files/img_spindle_forward__spindle_right__48.png,clicked:on_rbt_forward_clicked; released:on_rbt_forward_released,
冷却/主轴控制,运行时状态,rbt_reverse,主轴反转中,,img_spindle_reverse_on,反转 active 图标,active,spindle_left_on,48,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/spindle_left_on.png,work/working3/gmoccapy_button_icons/files/img_spindle_reverse_on__spindle_left_on__48.png,,on_rbt_reverse_released/clicked
冷却/主轴控制,Glade 静态,rbt_reverse,,,img_spindle_reverse,静态绑定,默认,spindle_left,48,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/spindle_left.png,work/working3/gmoccapy_button_icons/files/img_spindle_reverse__spindle_left__48.png,clicked:on_rbt_reverse_clicked; released:on_rbt_reverse_released,
冷却/主轴控制,运行时状态,rbt_stop,主轴停止已选中,,img_spindle_stop_on,停止 active 图标,active,spindle_stop_on,48,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/spindle_stop_on.png,work/working3/gmoccapy_button_icons/files/img_spindle_stop_on__spindle_stop_on__48.png,,on_rbt_stop_clicked
冷却/主轴控制,运行时状态,rbt_stop,主轴停止未选中,,img_spindle_stop,停止 inactive 图标,inactive,spindle_stop,48,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/spindle_stop.png,work/working3/gmoccapy_button_icons/files/img_spindle_stop__spindle_stop__48.png,,on_rbt_stop_clicked: widget inactive 时切回停止普通图标
冷却/主轴控制,Glade 静态,rbt_stop,,,img_spindle_stop_on,静态绑定,默认,spindle_stop_on,48,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/spindle_stop_on.png,work/working3/gmoccapy_button_icons/files/img_spindle_stop_on__spindle_stop_on__48.png,clicked:on_rbt_stop_clicked,
冷却/主轴控制,运行时状态,tbtn_flood,冷却液开,,img_coolant_on,Flood active 图标,active,coolant_flood_active,48,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/coolant_flood_active.png,work/working3/gmoccapy_button_icons/files/img_coolant_on__coolant_flood_active__48.png,,on_hal_status_flood_changed
冷却/主轴控制,Glade 静态,tbtn_flood,,,img_coolant_off,静态绑定,默认,coolant_flood_inactive,48,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/coolant_flood_inactive.png,work/working3/gmoccapy_button_icons/files/img_coolant_off__coolant_flood_inactive__48.png,toggled:on_tbtn_flood_toggled,
冷却/主轴控制,运行时状态,tbtn_mist,雾冷开,,img_mist_on,Mist active 图标,active,coolant_mist_active,48,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/coolant_mist_active.png,work/working3/gmoccapy_button_icons/files/img_mist_on__coolant_mist_active__48.png,,on_hal_status_mist_changed
冷却/主轴控制,Glade 静态,tbtn_mist,,,img_mist_off,静态绑定,默认,coolant_mist_inactive,48,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/coolant_mist_inactive.png,work/working3/gmoccapy_button_icons/files/img_mist_off__coolant_mist_inactive__48.png,toggled:on_tbtn_mist_toggled,
预览/视图,Glade 静态,btn_delete_view,,clear plot,img_tool_clear,静态绑定,默认,clear,24,theme-nearest-png,linuxcnc/share/gmoccapy/icons/classic/32x32/actions/clear.png,work/working3/gmoccapy_button_icons/files/img_tool_clear__clear__24.png,clicked:on_btn_delete_view_clicked,
预览/视图,Glade 静态,btn_zoom_in,,Zoom in,img_zoom_in,静态绑定,默认,zoom_in,24,theme-nearest-png,linuxcnc/share/gmoccapy/icons/classic/32x32/actions/zoom_in.png,work/working3/gmoccapy_button_icons/files/img_zoom_in__zoom_in__24.png,clicked:on_btn_zoom_in_clicked,
预览/视图,Glade 静态,btn_zoom_out,,Zoom out,img_zoom_out,静态绑定,默认,zoom_out,24,theme-nearest-png,linuxcnc/share/gmoccapy/icons/classic/32x32/actions/zoom_out.png,work/working3/gmoccapy_button_icons/files/img_zoom_out__zoom_out__24.png,clicked:on_btn_zoom_out_clicked,
预览/视图,Glade 静态,rbt_view_p,,view perspective,img_view_p,静态绑定,默认,tool_axis_p,24,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/24x24/actions/tool_axis_p.png,work/working3/gmoccapy_button_icons/files/img_view_p__tool_axis_p__24.png,toggled:on_rbt_view_p_toggled,
预览/视图,Glade 静态,rbt_view_x,,view along the X axis from positive to negative,img_view_x,静态绑定,默认,tool_axis_x,24,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/24x24/actions/tool_axis_x.png,work/working3/gmoccapy_button_icons/files/img_view_x__tool_axis_x__24.png,toggled:on_rbt_view_x_toggled,
预览/视图,Glade 静态,rbt_view_y,,view along the Y axis from positive to negative,img_view_y,静态绑定,默认,tool_axis_y,24,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/24x24/actions/tool_axis_y.png,work/working3/gmoccapy_button_icons/files/img_view_y__tool_axis_y__24.png,toggled:on_rbt_view_y_toggled,
预览/视图,Glade 静态,rbt_view_y2,,view along the Y axis from positive to negative as viewn for a back tool lathe,img_view_y2,静态绑定,默认,tool_axis_y_inv,24,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/24x24/actions/tool_axis_y_inv.png,work/working3/gmoccapy_button_icons/files/img_view_y2__tool_axis_y_inv__24.png,toggled:on_rbt_view_y2_toggled,
预览/视图,Glade 静态,rbt_view_z,,view along the Z axis from positive to negative,img_view_z,静态绑定,默认,tool_axis_z,24,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/24x24/actions/tool_axis_z.png,work/working3/gmoccapy_button_icons/files/img_view_z__tool_axis_z__24.png,toggled:on_rbt_view_z_toggled,
预览/视图,Glade 静态,tbtn_view_dimension,,Show or hide dimensions,img_dimensions,静态绑定,默认,dimensions,24,theme-nearest-png,linuxcnc/share/gmoccapy/icons/classic/32x32/actions/dimensions.png,work/working3/gmoccapy_button_icons/files/img_dimensions__dimensions__24.png,toggled:on_tbtn_view_dimension_toggled,
预览/视图,Glade 静态,tbtn_view_tool_path,,Show or hide tool path,img_tool_path,静态绑定,默认,toolpath,24,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/24x24/actions/toolpath.png,work/working3/gmoccapy_button_icons/files/img_tool_path__toolpath__24.png,toggled:on_tbtn_view_tool_path_toggled,
编辑器搜索/编辑,Glade 静态,btn_comment,,,img_edit_comment,静态绑定,默认,comment,32,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/32x32/actions/comment.png,work/working3/gmoccapy_button_icons/files/img_edit_comment__comment__32.png,clicked:on_btn_toggle_comment_clicked,
编辑器搜索/编辑,Glade 静态,btn_redo,,Redo,img_edit-redo,静态绑定,默认,edit_redo,32,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/32x32/actions/edit_redo.png,work/working3/gmoccapy_button_icons/files/img_edit-redo__edit_redo__32.png,clicked:on_btn_redo_clicked,
编辑器搜索/编辑,Glade 静态,btn_replace,Replace,,,静态绑定,默认,,,none,,,clicked:on_btn_replace_clicked,
编辑器搜索/编辑,Glade 静态,btn_search_back,Search / back,,img_up,静态绑定,默认,chevron_up,24,theme-svg,linuxcnc/share/gmoccapy/icons/classic/scalable/actions/chevron_up.svg,work/working3/gmoccapy_button_icons/files/img_up__chevron_up__24.svg,clicked:on_btn_search_back_clicked,
编辑器搜索/编辑,Glade 静态,btn_search_forward,Search / fwd,,img_down,静态绑定,默认,chevron_down,24,theme-svg,linuxcnc/share/gmoccapy/icons/classic/scalable/actions/chevron_down.svg,work/working3/gmoccapy_button_icons/files/img_down__chevron_down__24.svg,clicked:on_btn_search_forward_clicked,
编辑器搜索/编辑,Glade 静态,btn_undo,,Undo,img_edit-undo,静态绑定,默认,edit_undo,32,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/32x32/actions/edit_undo.png,work/working3/gmoccapy_button_icons/files/img_edit-undo__edit_undo__32.png,clicked:on_btn_undo_clicked,
编辑器搜索/编辑,Glade 静态,chk_ignore_case,Ignore Case,,,静态绑定,默认,,,none,,,,
编辑器搜索/编辑,Glade 静态,chk_replace_all,Replace All,,,静态绑定,默认,,,none,,,,
编辑页底部栏,Glade 静态,btn_back_edit,,Go back to main button list,img_edit_menu_close,静态绑定,默认,back_to_app,48,theme-svg,linuxcnc/share/gmoccapy/icons/classic/scalable/actions/back_to_app.svg,work/working3/gmoccapy_button_icons/files/img_edit_menu_close__back_to_app__48.svg,clicked:on_btn_back_clicked,
编辑页底部栏,Glade 静态,btn_calc,,Show calculator,img_edit_menu_calculator,静态绑定,默认,calculator_open,32,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/32x32/actions/calculator_open.png,work/working3/gmoccapy_button_icons/files/img_edit_menu_calculator__calculator_open__32.png,clicked:on_btn_show_calc_clicked,
编辑页底部栏,运行时状态,btn_keyb,隐藏虚拟键盘,,img_edit_menu_keyboard_hide,编辑页键盘隐藏图标,keyboard shown,keyboard_hide,32,theme-nearest-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/keyboard_hide.png,work/working3/gmoccapy_button_icons/files/img_edit_menu_keyboard_hide__keyboard_hide__32.png,,on_ntb_info_switch_page
编辑页底部栏,Glade 静态,btn_keyb,,Show or hide the virtual keyboard,img_edit_menu_keyboard,静态绑定,默认,keyboard,32,theme-nearest-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/keyboard.png,work/working3/gmoccapy_button_icons/files/img_edit_menu_keyboard__keyboard__32.png,clicked:on_btn_show_kbd_clicked,
编辑页底部栏,Glade 静态,btn_new,,clear the edit field and make a new file,img_edit_menu_new,静态绑定,默认,new_document,32,theme-svg,linuxcnc/share/gmoccapy/icons/classic/scalable/actions/new_document.svg,work/working3/gmoccapy_button_icons/files/img_edit_menu_new__new_document__32.svg,clicked:on_btn_new_clicked,
编辑页底部栏,Glade 静态,btn_reload_edit,,Reload file,img_edit_menu_reload,静态绑定,默认,refresh,32,theme-nearest-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/refresh.png,work/working3/gmoccapy_button_icons/files/img_edit_menu_reload__refresh__32.png,,
编辑页底部栏,Glade 静态,btn_save,,save the file using the original name,img_edit_menu_save,静态绑定,默认,save,32,theme-nearest-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/save.png,work/working3/gmoccapy_button_icons/files/img_edit_menu_save__save__32.png,,
编辑页底部栏,Glade 静态,btn_save_as,,save the file with a new name,img_edit_menu_save_as,静态绑定,默认,save_as,32,theme-nearest-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/save_as.png,work/working3/gmoccapy_button_icons/files/img_edit_menu_save_as__save_as__32.png,,
编辑页底部栏,Glade 静态,tbtn_split_view,,Show preview as split view,img_split_view,静态绑定,默认,split_view,32,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/32x32/actions/split_view.png,work/working3/gmoccapy_button_icons/files/img_split_view__split_view__32.png,toggled:on_tbtn_split_view_toggled,
刀具页底部栏,Glade 静态,btn_back_tool,,Go back to main button list,img_back_tool,静态绑定,默认,back_to_app,48,theme-svg,linuxcnc/share/gmoccapy/icons/classic/scalable/actions/back_to_app.svg,work/working3/gmoccapy_button_icons/files/img_back_tool__back_to_app__48.svg,clicked:on_btn_back_clicked,
刀具页底部栏,Glade 静态,btn_change_tool,,change tool to the selected one,img_toolchange,静态绑定,默认,mill_tool_change,48,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/mill_tool_change.png,work/working3/gmoccapy_button_icons/files/img_toolchange__mill_tool_change__48.png,clicked:on_btn_selected_tool_clicked,
刀具页底部栏,Glade 静态,btn_index_tool,,"change tool with the command M61 Q?, no machine move will be done",img_index_tool,静态绑定,默认,mill_tool_set_num,48,theme-svg,linuxcnc/share/gmoccapy/icons/classic/scalable/actions/mill_tool_set_num.svg,work/working3/gmoccapy_button_icons/files/img_index_tool__mill_tool_set_num__48.svg,clicked:on_btn_selected_tool_clicked,
刀具页底部栏,Glade 静态,btn_select_tool_by_no,,Select a tool by number,img_tool_by_no,静态绑定,默认,mill_tool_change_num,48,theme-svg,linuxcnc/share/gmoccapy/icons/classic/scalable/actions/mill_tool_change_num.svg,work/working3/gmoccapy_button_icons/files/img_tool_by_no__mill_tool_change_num__48.svg,clicked:on_btn_select_tool_by_no_clicked,
刀具页底部栏,Glade 静态,btn_tool_touchoff_x,,touch off the tool and set the value to the tool table,,静态绑定,默认,,,none,,,clicked:on_btn_tool_touchoff_clicked,
刀具页底部栏,Glade 静态,btn_tool_touchoff_z,,touch off the tool and set the value to the tool table,,静态绑定,默认,,,none,,,clicked:on_btn_tool_touchoff_clicked,
文件选择栏,Glade 静态,btn_back_file_load,,Close without returning a file path,img_back_file_load,静态绑定,默认,back_to_app,48,theme-svg,linuxcnc/share/gmoccapy/icons/classic/scalable/actions/back_to_app.svg,work/working3/gmoccapy_button_icons/files/img_back_file_load__back_to_app__48.svg,clicked:on_btn_back_clicked,
文件选择栏,Glade 静态,btn_dir_up,,Move to parent directory,img_dir_up,静态绑定,默认,chevron_up,32,theme-svg,linuxcnc/share/gmoccapy/icons/classic/scalable/actions/chevron_up.svg,work/working3/gmoccapy_button_icons/files/img_dir_up__chevron_up__32.svg,clicked:on_btn_dir_up_clicked,
文件选择栏,Glade 静态,btn_home,,Move to your home directory,img_home,静态绑定,默认,home_folder,32,theme-svg,linuxcnc/share/gmoccapy/icons/classic/scalable/actions/home_folder.svg,work/working3/gmoccapy_button_icons/files/img_home__home_folder__32.svg,clicked:on_btn_home_clicked,
文件选择栏,Glade 静态,btn_jump_to,,Jump to user defined directory,img_jump_to,静态绑定,默认,user_defined_folder,32,theme-svg,linuxcnc/share/gmoccapy/icons/classic/scalable/actions/user_defined_folder.svg,work/working3/gmoccapy_button_icons/files/img_jump_to__user_defined_folder__32.svg,clicked:on_btn_jump_to_clicked,
文件选择栏,Glade 静态,btn_reload_dir,,Refresh directory,img_refresh_dir,静态绑定,默认,refresh,32,theme-nearest-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/refresh.png,work/working3/gmoccapy_button_icons/files/img_refresh_dir__refresh__32.png,clicked:on_btn_refresh_dir_clicked,
文件选择栏,Glade 静态,btn_sel_next,,Select the next file,img_sel_next,静态绑定,默认,chevron_right,32,theme-svg,linuxcnc/share/gmoccapy/icons/classic/scalable/actions/chevron_right.svg,work/working3/gmoccapy_button_icons/files/img_sel_next__chevron_right__32.svg,clicked:on_btn_sel_next_clicked,
文件选择栏,Glade 静态,btn_sel_prev,,Select the previous file,img_sel_prev,静态绑定,默认,chevron_left,32,theme-svg,linuxcnc/share/gmoccapy/icons/classic/scalable/actions/chevron_left.svg,work/working3/gmoccapy_button_icons/files/img_sel_prev__chevron_left__32.svg,clicked:on_btn_sel_prev_clicked,
文件选择栏,Glade 静态,btn_select,,select the highlighted file and return the path,img_select,静态绑定,默认,select_file,32,theme-nearest-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/select_file.png,work/working3/gmoccapy_button_icons/files/img_select__select_file__32.png,clicked:on_btn_select_clicked,
文件选择栏,Glade 静态,tbtn_sort,Sort by / date,"Sort files by date, newest first",,静态绑定,默认,,,none,,,toggled:on_tbtn_sort_toggled,
内嵌 ToolEdit 控件,内嵌控件,tooldedit.add,新增刀具,Add new tool,img_tool_add,动态按钮图标,默认,add,32,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/32x32/actions/add.png,work/working3/gmoccapy_button_icons/files/img_tool_add__add__32.png,,Python 改造 ToolEdit
内嵌 ToolEdit 控件,内嵌控件,tooldedit.apply,保存刀具表,Save tool table to file,img_tool_save,动态按钮图标,默认,save,32,theme-nearest-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/save.png,work/working3/gmoccapy_button_icons/files/img_tool_save__save__32.png,,Python 改造 ToolEdit
内嵌 ToolEdit 控件,内嵌控件,tooldedit.calculator,刀具表计算器,Use calculator to edit numeric values,img_tool_calculator,动态按钮图标,默认,calculator_open,32,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/32x32/actions/calculator_open.png,work/working3/gmoccapy_button_icons/files/img_tool_calculator__calculator_open__32.png,,Python 改造 ToolEdit
内嵌 ToolEdit 控件,内嵌控件,tooldedit.delete,删除选中刀具,Delete selected tool,img_tool_delete,动态按钮图标,默认,delete,32,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/32x32/actions/delete.png,work/working3/gmoccapy_button_icons/files/img_tool_delete__delete__32.png,,Python 改造 ToolEdit
内嵌 ToolEdit 控件,内嵌控件,tooldedit.reload,重载刀具表,Reload tool table from file,img_tool_reload,动态按钮图标,默认,refresh,32,theme-nearest-png,linuxcnc/share/gmoccapy/icons/classic/48x48/actions/refresh.png,work/working3/gmoccapy_button_icons/files/img_tool_reload__refresh__32.png,,Python 改造 ToolEdit
内嵌 OffsetPage 控件,内嵌控件,offsetpage.calculator,坐标偏置计算器,Use calculator to edit numeric values,img_offset_calculator,动态按钮图标,默认,calculator_open,32,theme-exact-png,linuxcnc/share/gmoccapy/icons/classic/32x32/actions/calculator_open.png,work/working3/gmoccapy_button_icons/files/img_offset_calculator__calculator_open__32.png,,Python 改造 OffsetPage
内嵌 OffsetPage 控件,内嵌控件,offsetpage.edit_offsets,Edit Offsets,Edit offsets in OffsetPage,,无图标,默认,,,none,,,,内嵌控件文字按钮,无图标
内嵌 OffsetPage 控件,内嵌控件,offsetpage.set_selected,Set selected,Set selected coordinate system active,,无图标,默认,,,none,,,,内嵌控件文字按钮,无图标
内嵌 OffsetPage 控件,内嵌控件,offsetpage.zero_g92,Zero G92,Set G92 offsets to zero,,无图标,默认,,,none,,,,内嵌控件文字按钮,无图标
设置页控件,Glade 静态,abs_colorbutton,,,,静态绑定,默认,,,none,,,color-set:on_abs_colorbutton_color_set,
设置页控件,Glade 静态,audio_alert_chooser,,,,静态绑定,默认,,,none,,,file-set:on_change_sound,
设置页控件,Glade 静态,audio_error_chooser,,,,静态绑定,默认,,,none,,,file-set:on_change_sound,
设置页控件,Glade 静态,chk_en_audio,Enable sound,,,静态绑定,默认,,,none,,,toggled:on_chk_en_audio_toggled,
设置页控件,Glade 静态,chk_font_monospace,Monospace,,,静态绑定,默认,,,none,,,toggled:on_chk_font_monospace_toggled,
设置页控件,Glade 静态,chk_font_regular,Regular/Medium,,,静态绑定,默认,,,none,,,toggled:on_chk_font_regular_toggled,
设置页控件,Glade 静态,chk_hide_cursor,Hide cursor,,,静态绑定,默认,,,none,,,toggled:on_chk_hide_cursor_toggled,
设置页控件,Glade 静态,chk_hide_tooltips,Hide tooltips,,,静态绑定,默认,,,none,,,toggled:on_chk_hide_tooltips_toggled,
设置页控件,Glade 静态,chk_kbd_set_height,Height,,,静态绑定,默认,,,none,,,toggled:on_chk_kb_set_height_toggled,
设置页控件,Glade 静态,chk_kbd_set_width,Width,,,静态绑定,默认,,,none,,,toggled:on_chk_kb_set_width_toggled,
设置页控件,Glade 静态,chk_reload_tool,Reload Tool on Start,"If checked, the tool in spindle / will be saved on each change / and the last tool will be reloaded / at start of the GUI. Also it's / length offset will be reloaded.",,静态绑定,默认,,,none,,,toggled:on_chk_reload_tool_toggled,
设置页控件,Glade 静态,chk_show_dro,Show DRO,,,静态绑定,默认,,,none,,,toggled:on_chk_show_dro_toggled,
设置页控件,Glade 静态,chk_show_dtg,Show DTG,,,静态绑定,默认,,,none,,,toggled:on_chk_show_dtg_toggled,
设置页控件,Glade 静态,chk_show_offsets,Show offsets,,,静态绑定,默认,,,none,,,toggled:on_chk_show_offsets_toggled,
设置页控件,Glade 静态,chk_toggle_readout,Toggle DRO mode by / clicking on the DRO,,,静态绑定,默认,,,none,,,toggled:on_chk_toggle_readout_toggled,
设置页控件,Glade 静态,chk_turtle_jog,Hide turtle Jog Button,,,静态绑定,默认,,,none,,,toggled:on_chk_turtle_jog_toggled,
设置页控件,Glade 静态,chk_use_frames,Use frames,"If checked, the messages / will be in a frame.",,静态绑定,默认,,,none,,,toggled:on_chk_use_frames_toggled,
设置页控件,Glade 静态,chk_use_kb_on_edit,Show keyboard on EDIT,,,静态绑定,默认,,,none,,,toggled:on_chk_use_kb_on_edit_toggled,
设置页控件,Glade 静态,chk_use_kb_on_file_selection,Show keyboard on load file,,,静态绑定,默认,,,none,,,toggled:on_chk_use_kb_on_file_selection_toggled,
设置页控件,Glade 静态,chk_use_kb_on_mdi,Show keyboard on MDI,,,静态绑定,默认,,,none,,,toggled:on_chk_use_kb_on_mdi_toggled,
设置页控件,Glade 静态,chk_use_kb_on_offset,Show keyboard on offset,,,静态绑定,默认,,,none,,,toggled:on_chk_use_kb_on_offset_toggled,
设置页控件,Glade 静态,chk_use_kb_on_tooledit,Show keyboard on tooledit,,,静态绑定,默认,,,none,,,toggled:on_chk_use_kb_on_tooledit_toggled,
设置页控件,Glade 静态,chk_use_kb_shortcuts,Use keyboard shortcuts,,,静态绑定,默认,,,none,,,toggled:on_chk_use_kb_shortcuts_toggled,
设置页控件,Glade 静态,chk_use_tool_measurement,Use auto tool measurement,,,静态绑定,默认,,,none,,,toggled:on_chk_use_tool_measurement_toggled,
设置页控件,Glade 静态,dtg_colorbutton,,,,静态绑定,默认,,,none,,,color-set:on_dtg_colorbutton_color_set,
设置页控件,Glade 静态,file_to_load_chooser,,,,静态绑定,默认,,,none,,,file-set:on_file_to_load_chooser_file_set,
设置页控件,Glade 静态,fontbutton_gcodeview,,,,静态绑定,默认,,,none,,,font-set:on_fontbutton_gcodeview_font_set,
设置页控件,Glade 静态,fontbutton_popup,,The font to use,,静态绑定,默认,,,none,,,font-set:on_fontbutton_popup_font_set,
设置页控件,Glade 静态,homed_colorbtn,,,,静态绑定,默认,,,none,,,color-set:on_homed_colorbtn_color_set,
设置页控件,Glade 静态,jump_to_dir_chooser,,,,静态绑定,默认,,,none,,,file-set:on_jump_to_dir_chooser_file_set,
设置页控件,Glade 静态,rbt_hal_unlock,Use hal pin to unlock,,,静态绑定,默认,,,none,,,toggled:on_rbt_unlock_toggled,
设置页控件,Glade 静态,rbt_no_unlock,Do not use unlock code,,,静态绑定,默认,,,none,,,toggled:on_rbt_unlock_toggled,
设置页控件,Glade 静态,rbt_use_unlock,Use unlock code,,,静态绑定,默认,,,none,,,toggled:on_rbt_unlock_toggled,
设置页控件,Glade 静态,rbtn_fullscreen,Start as fullscreen,,,静态绑定,默认,,,none,,,toggled:on_rbtn_fullscreen_toggled,
设置页控件,Glade 静态,rbtn_maximized,Start maximized,,,静态绑定,默认,,,none,,,toggled:on_rbtn_maximized_toggled,
设置页控件,Glade 静态,rbtn_no_run_from_line,Do not use run from line,,,静态绑定,默认,,,none,,,toggled:on_rbtn_run_from_line_toggled,
设置页控件,Glade 静态,rbtn_run_from_line,Use run from line,,,静态绑定,默认,,,none,,,toggled:on_rbtn_run_from_line_toggled,
设置页控件,Glade 静态,rbtn_show_offsets,show offsets,,,静态绑定,默认,,,none,,,,
设置页控件,Glade 静态,rbtn_show_preview,show preview,,,静态绑定,默认,,,none,,,toggled:on_rbtn_show_preview_toggled,
设置页控件,Glade 静态,rbtn_window,Start as window,,,静态绑定,默认,,,none,,,toggled:on_rbtn_window_toggled,
设置页控件,Glade 静态,rel_colorbutton,,,,静态绑定,默认,,,none,,,color-set:on_rel_colorbutton_color_set,
设置页控件,Glade 静态,unhomed_colorbtn,,,,静态绑定,默认,,,none,,,color-set:on_unhomed_colorbtn_color_set,
Glade 静态按钮,Glade 静态,btn_calibration,Calibration,launch calibration,,静态绑定,默认,,,none,,,clicked:on_btn_calibration_clicked,
Glade 静态按钮,Glade 静态,btn_classicladder,Cl.-ladder,Open classicladder,,静态绑定,默认,,,none,,,clicked:on_btn_classicladder_clicked,
Glade 静态按钮,Glade 静态,btn_delete,,delete MDI history,,静态绑定,默认,,,none,,,clicked:on_btn_delete_clicked,
Glade 静态按钮,Glade 静态,btn_feed_100,100%,reset feed override to 100 %,,静态绑定,默认,,,none,,,clicked:on_btn_feed_100_clicked,
Glade 静态按钮,Glade 静态,btn_hal_meter,Hal Meter,launch hal meter,,静态绑定,默认,,,none,,,clicked:on_btn_hal_meter_clicked,
Glade 静态按钮,Glade 静态,btn_hal_scope,Hal-Scope,launch hal scope,,静态绑定,默认,,,none,,,clicked:on_btn_hal_scope_clicked,
Glade 静态按钮,Glade 静态,btn_launch_test_message,Launch test message,Push here to launch a test message / to test your settings.,,静态绑定,默认,,,none,,,pressed:on_btn_launch_test_message_pressed,
Glade 静态按钮,Glade 静态,btn_none,none,,,静态绑定,默认,,,none,,,clicked:on_btn_none_clicked,
Glade 静态按钮,Glade 静态,btn_show_hal,Halshow,opens the show hal tool,,静态绑定,默认,,,none,,,clicked:on_btn_show_hal_clicked,
Glade 静态按钮,Glade 静态,btn_spindle_100,100%,,,静态绑定,默认,,,none,,,clicked:on_btn_spindle_100_clicked,
Glade 静态按钮,Glade 静态,btn_status,Status,launch linuxcnc status,,静态绑定,默认,,,none,,,clicked:on_btn_status_clicked,
Glade 静态按钮,Glade 静态,btn_use_current,current / file,,,静态绑定,默认,,,none,,,clicked:on_btn_use_current_clicked,
Glade 静态按钮,Glade 静态,chkbtn_hide_titlebar,Hide title bar,,,静态绑定,默认,,,none,,,toggled:on_chkbtn_hide_titlebar_toggled,
1 category source button_id button_label tooltip image_id image_role state_or_variant icon_name requested_size icon_source_type source_path copied_file signals notes
2 右侧主状态栏 运行时状态 rbt_auto Auto 已选中 img_auto_on Auto active 图标 active mode_auto_active 48 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/mode_auto_active.png work/working3/gmoccapy_button_icons/files/img_auto_on__mode_auto_active__48.png on_rbt_auto_toggled
3 右侧主状态栏 Glade 静态 rbt_auto enter auto mode to run programs img_auto 静态绑定 默认 mode_auto_inactive 48 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/mode_auto_inactive.png work/working3/gmoccapy_button_icons/files/img_auto__mode_auto_inactive__48.png pressed:on_rbt_auto_pressed; toggled:on_rbt_auto_toggled
4 右侧主状态栏 运行时状态 rbt_manual 手动已选中 img_manual_on 手动模式 active 图标 active mode_manual_active 48 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/mode_manual_active.png work/working3/gmoccapy_button_icons/files/img_manual_on__mode_manual_active__48.png on_rbt_manual_toggled
5 右侧主状态栏 Glade 静态 rbt_manual enter manual mode to jog axis by hand or touch off / [F3] img_manual 静态绑定 默认 mode_manual_inactive 48 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/mode_manual_inactive.png work/working3/gmoccapy_button_icons/files/img_manual__mode_manual_inactive__48.png pressed:on_rbt_manual_pressed; toggled:on_rbt_manual_toggled
6 右侧主状态栏 运行时状态 rbt_mdi MDI 已选中 img_mdi_on MDI active 图标 active mode_mdi_active 48 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/mode_mdi_active.png work/working3/gmoccapy_button_icons/files/img_mdi_on__mode_mdi_active__48.png on_rbt_mdi_toggled
7 右侧主状态栏 Glade 静态 rbt_mdi enter MDI mode to launch G-code commands / [F5] img_mdi 静态绑定 默认 mode_mdi_inactive 48 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/mode_mdi_inactive.png work/working3/gmoccapy_button_icons/files/img_mdi__mode_mdi_inactive__48.png pressed:on_rbt_mdi_pressed; toggled:on_rbt_mdi_toggled
8 右侧主状态栏 运行时状态 tbtn_estop 急停复位/非急停 img_emergency_off 急停复位态图标 STATE_ESTOP_RESET main_switch_off 48 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/main_switch_off.png work/working3/gmoccapy_button_icons/files/img_emergency_off__main_switch_off__48.png on_hal_status_state_estop_reset
9 右侧主状态栏 Glade 静态 tbtn_estop Estop the machine / [F1] img_emergency 静态绑定 默认 main_switch_on 48 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/main_switch_on.png work/working3/gmoccapy_button_icons/files/img_emergency__main_switch_on__48.png toggled:on_tbtn_estop_toggled
10 右侧主状态栏 运行时状态 tbtn_on 上电 img_machine_on 机器 ON 图标 STATE_ON power_on 48 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/power_on.png work/working3/gmoccapy_button_icons/files/img_machine_on__power_on__48.png on_hal_status_state_on
11 右侧主状态栏 Glade 静态 tbtn_on Turn the machine on/off / [F2] img_machine_off 静态绑定 默认 power_off 48 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/power_off.png work/working3/gmoccapy_button_icons/files/img_machine_off__power_off__48.png toggled:on_tbtn_on_toggled
12 右侧主状态栏 运行时状态 tbtn_setup 设置页已进入 img_settings_on 设置页 active 图标 active/unlocked mode_settings_active 48 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/mode_settings_active.png work/working3/gmoccapy_button_icons/files/img_settings_on__mode_settings_active__48.png on_tbtn_setup_toggled
13 右侧主状态栏 Glade 静态 tbtn_setup Enter the settings page, the default code is "123" img_settings 静态绑定 默认 mode_settings_inactive 48 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/mode_settings_inactive.png work/working3/gmoccapy_button_icons/files/img_settings__mode_settings_inactive__48.png toggled:on_tbtn_setup_toggled
14 右侧主状态栏 运行时状态 tbtn_user_tabs 用户页已显示 img_user_tabs_on 用户页 active 图标 active mode_user_tabs_active 48 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/mode_user_tabs_active.png work/working3/gmoccapy_button_icons/files/img_user_tabs_on__mode_user_tabs_active__48.png on_tbtn_user_tabs_toggled
15 右侧主状态栏 Glade 静态 tbtn_user_tabs show user tabs img_user_tabs 静态绑定 默认 mode_user_tabs_inactive 48 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/mode_user_tabs_inactive.png work/working3/gmoccapy_button_icons/files/img_user_tabs__mode_user_tabs_inactive__48.png toggled:on_tbtn_user_tabs_toggled
16 底部主按钮栏 Glade 静态 btn_exit Close gmoccapy / leave the program img_close 静态绑定 默认 logout 48 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/logout.png work/working3/gmoccapy_button_icons/files/img_close__logout__48.png clicked:on_btn_exit_clicked
17 底部主按钮栏 Glade 静态 btn_homing open homing button list img_ref_menu 静态绑定 默认 ref_all 48 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/ref_all.png work/working3/gmoccapy_button_icons/files/img_ref_menu__ref_all__48.png clicked:on_btn_homing_clicked
18 底部主按钮栏 Glade 静态 btn_tool Open the tooleditor page img_tools 静态绑定 默认 hsk_mill_tool 48 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/hsk_mill_tool.png work/working3/gmoccapy_button_icons/files/img_tools__hsk_mill_tool__48.png clicked:on_btn_tool_clicked
19 底部主按钮栏 Glade 静态 btn_touch open touch off button list img_touch_off 静态绑定 默认 touch_off 48 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/touch_off.png work/working3/gmoccapy_button_icons/files/img_touch_off__touch_off__48.png clicked:on_btn_touch_clicked
20 底部主按钮栏 运行时状态 tbtn_fullsize_preview0 退出大预览 img_fullsize_preview0_close 大预览关闭图标 fullscreen active fullscreen_close 48 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/fullscreen_close.png work/working3/gmoccapy_button_icons/files/img_fullsize_preview0_close__fullscreen_close__48.png on_tbtn_fullsize_preview_toggled
21 底部主按钮栏 Glade 静态 tbtn_fullsize_preview0 make the preview as large as possible img_fullsize_preview0_open 静态绑定 默认 fullscreen_open 48 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/fullscreen_open.png work/working3/gmoccapy_button_icons/files/img_fullsize_preview0_open__fullscreen_open__48.png toggled:on_tbtn_fullsize_preview_toggled
22 底部主按钮栏 Glade 静态 tbtn_switch_mode World / Mode Switch motion mode between Joint and World mode / F12 or $ key does the same 静态绑定 默认 none toggled:on_tbtn_switch_mode_toggled
23 Auto 程序运行栏 Glade 静态 btn_edit Edit the loaded program img_editor 静态绑定 默认 edit_code 32 theme-nearest-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/edit_code.png work/working3/gmoccapy_button_icons/files/img_editor__edit_code__32.png clicked:on_btn_edit_clicked
24 Auto 程序运行栏 Glade 静态 btn_from_line run the program from a certain line, attention, that is dangerous, because the previous lines will not checked! img_run_from 静态绑定 默认 run_from_line 48 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/run_from_line.png work/working3/gmoccapy_button_icons/files/img_run_from__run_from_line__48.png clicked:on_btn_from_line_clicked
25 Auto 程序运行栏 Glade 静态 btn_load Load a new program img_open 静态绑定 默认 open_file 32 theme-svg linuxcnc/share/gmoccapy/icons/classic/scalable/actions/open_file.svg work/working3/gmoccapy_button_icons/files/img_open__open_file__32.svg clicked:on_btn_load_clicked
26 Auto 程序运行栏 Glade 静态 btn_reload Reload file img_reload1 静态绑定 默认 refresh 32 theme-nearest-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/refresh.png work/working3/gmoccapy_button_icons/files/img_reload1__refresh__32.png
27 Auto 程序运行栏 Glade 静态 btn_run Run the loaded program img_run 静态绑定 默认 play 32 theme-nearest-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/play.png work/working3/gmoccapy_button_icons/files/img_run__play__32.png clicked:on_btn_run_clicked
28 Auto 程序运行栏 Glade 静态 btn_step Run the loaded program step by step img_step 静态绑定 默认 step 32 theme-nearest-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/step.png work/working3/gmoccapy_button_icons/files/img_step__step__32.png
29 Auto 程序运行栏 Glade 静态 btn_stop Stop the running program img_stop 静态绑定 默认 stop 32 theme-nearest-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/stop.png work/working3/gmoccapy_button_icons/files/img_stop__stop__32.png clicked:on_btn_stop_clicked
30 Auto 程序运行栏 运行时状态 tbtn_fullsize_preview1 退出大预览 img_fullsize_preview1_close 大预览关闭图标 fullscreen active fullscreen_close 48 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/fullscreen_close.png work/working3/gmoccapy_button_icons/files/img_fullsize_preview1_close__fullscreen_close__48.png on_tbtn_fullsize_preview_toggled
31 Auto 程序运行栏 Glade 静态 tbtn_fullsize_preview1 Show full screen preview img_fullsize_preview1_open 静态绑定 默认 fullscreen_open 48 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/fullscreen_open.png work/working3/gmoccapy_button_icons/files/img_fullsize_preview1_open__fullscreen_open__48.png toggled:on_tbtn_fullsize_preview_toggled
32 Auto 程序运行栏 运行时状态 tbtn_optional_blocks 跳过可选段 img_skip_optional_active 可选段跳过 active 图标 block delete active skip_optional_active 32 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/32x32/actions/skip_optional_active.png work/working3/gmoccapy_button_icons/files/img_skip_optional_active__skip_optional_active__32.png on_tbtn_optional_blocks_toggled
33 Auto 程序运行栏 Glade 静态 tbtn_optional_blocks Machine or not the optional blocks of the program. If the button is pressed, the optional blocks will not be machined. The button will indicate this by a yellow background. img_skip_optional_inactive 静态绑定 默认 skip_optional_inactive 32 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/32x32/actions/skip_optional_inactive.png work/working3/gmoccapy_button_icons/files/img_skip_optional_inactive__skip_optional_inactive__32.png toggled:on_tbtn_optional_blocks_toggled
34 Auto 程序运行栏 运行时状态 tbtn_pause 暂停中 img_pause_active 暂停 active 图标 paused pause_active 32 theme-nearest-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/pause_active.png work/working3/gmoccapy_button_icons/files/img_pause_active__pause_active__32.png on_tbtn_pause_toggled
35 Auto 程序运行栏 Glade 静态 tbtn_pause Pause the running program img_pause 静态绑定 默认 pause 32 theme-nearest-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/pause.png work/working3/gmoccapy_button_icons/files/img_pause__pause__32.png toggled:on_tbtn_pause_toggled
36 MDI/宏按钮栏 Python 动态 calculator 计算器 Press to display the calculator img_macro_menu_calculator 动态按钮图标 默认 calculator_open 32 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/32x32/actions/calculator_open.png work/working3/gmoccapy_button_icons/files/img_macro_menu_calculator__calculator_open__32.png _make_macro_button
37 MDI/宏按钮栏 运行时状态 keyboard 隐藏虚拟键盘 img_macro_menu_keyboard_hide 宏栏键盘隐藏图标 keyboard shown keyboard_hide 32 theme-nearest-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/keyboard_hide.png work/working3/gmoccapy_button_icons/files/img_macro_menu_keyboard_hide__keyboard_hide__32.png on_ntb_info_switch_page
38 MDI/宏按钮栏 运行时状态 keyboard 中止运行宏/程序 img_macro_menu_stop 宏栏停止图标 program/macro running or no keyboard stop 32 theme-nearest-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/stop.png work/working3/gmoccapy_button_icons/files/img_macro_menu_stop__stop__32.png on_hal_status_interp_run/_no_virt_keyboard
39 MDI/宏按钮栏 Python 动态 keyboard 虚拟键盘 Press to display the virtual keyboard img_macro_menu_keyboard 动态按钮图标 默认 keyboard 32 theme-nearest-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/keyboard.png work/working3/gmoccapy_button_icons/files/img_macro_menu_keyboard__keyboard__32.png _make_macro_button
40 MDI/宏按钮栏 Python 动态宏 macro_0 i_am_lost Press to run macro i_am_lost 无图标 默认 macro-custom-file linuxcnc/configs/sim/gmoccapy/macros/images/i_am_lost.png work/working3/gmoccapy_button_icons/files/macro_0__macro_image.png 宏文件 IMAGE 自定义图片: /home/meswork/cnc_wams/linuxcnc/configs/sim/gmoccapy/macros/images/i_am_lost.png
41 MDI/宏按钮栏 Python 动态宏 macro_1 halo_world Press to run macro halo_world 无图标 默认 none 宏按钮使用文字,无图标
42 MDI/宏按钮栏 Python 动态宏 macro_2 jog_around Press to run macro jog_around 无图标 默认 none 宏按钮使用文字,无图标
43 MDI/宏按钮栏 Python 动态宏 macro_3 increment Press to run macro increment xinc yinc 无图标 默认 none 宏按钮使用文字,无图标
44 MDI/宏按钮栏 Python 动态宏 macro_4 go_to_position Press to run macro go_to_position X-pos Y-pos Z-pos 无图标 默认 macro-custom-file linuxcnc/configs/sim/gmoccapy/macros/images/goto_x_y_z.png work/working3/gmoccapy_button_icons/files/macro_4__macro_image.png 宏文件 IMAGE 自定义图片: /home/meswork/cnc_wams/linuxcnc/configs/sim/gmoccapy/macros/images/goto_x_y_z.png
45 MDI/宏按钮栏 Python 动态 next_button 下一组宏按钮 Press to display next macro button img_macro_paginate_next 动态按钮图标 默认 go-next gtk-icon-name-not-copied GTK/system icon theme 当前宏数 5,小于 7,默认隐藏; 未在 gmoccapy classic 主题中固定解析,运行时由 GTK/system icon theme 决定
46 MDI/宏按钮栏 Python 动态 previous_button 上一组宏按钮 Press to display previous macro button img_macro_paginate_prev 动态按钮图标 默认 go-previous gtk-icon-name-not-copied GTK/system icon theme 当前宏数 5,小于 7,默认隐藏; 未在 gmoccapy classic 主题中固定解析,运行时由 GTK/system icon theme 决定
47 回零按钮栏 Python 动态 home_axis_a 回零 A 轴 Press to home axis A img_ref_a 动态按钮图标 默认 ref_a 48 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/ref_a.png work/working3/gmoccapy_button_icons/files/img_ref_a__ref_a__48.png 当前 XYZAB 生成
48 回零按钮栏 Python 动态 home_axis_b 回零 B 轴 Press to home axis B img_ref_b 动态按钮图标 默认 ref_b 48 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/ref_b.png work/working3/gmoccapy_button_icons/files/img_ref_b__ref_b__48.png 当前 XYZAB 生成
49 回零按钮栏 Python 动态 home_axis_x 回零 X 轴 Press to home axis X img_ref_x 动态按钮图标 默认 ref_x 48 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/ref_x.png work/working3/gmoccapy_button_icons/files/img_ref_x__ref_x__48.png 当前 XYZAB 生成
50 回零按钮栏 Python 动态 home_axis_y 回零 Y 轴 Press to home axis Y img_ref_y 动态按钮图标 默认 ref_y 48 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/ref_y.png work/working3/gmoccapy_button_icons/files/img_ref_y__ref_y__48.png 当前 XYZAB 生成
51 回零按钮栏 Python 动态 home_axis_z 回零 Z 轴 Press to home axis Z img_ref_z 动态按钮图标 默认 ref_z 48 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/ref_z.png work/working3/gmoccapy_button_icons/files/img_ref_z__ref_z__48.png 当前 XYZAB 生成
52 回零按钮栏 Python 动态 home_back 返回主按钮栏 Press to return to main button list img_ref_menu_close 动态按钮图标 默认 back_to_app 48 theme-svg linuxcnc/share/gmoccapy/icons/classic/scalable/actions/back_to_app.svg work/working3/gmoccapy_button_icons/files/img_ref_menu_close__back_to_app__48.svg _make_ref_axis_button
53 回零按钮栏 Python 动态 next_button 下一组回零按钮 Press to display next homing button img_ref_paginate_next 动态按钮图标 默认 chevron_right 32 theme-svg linuxcnc/share/gmoccapy/icons/classic/scalable/actions/chevron_right.svg work/working3/gmoccapy_button_icons/files/img_ref_paginate_next__chevron_right__32.svg 仅轴数大于 7 时显示
54 回零按钮栏 Python 动态 previous_button 上一组回零按钮 Press to display previous homing button img_ref_paginate_prev 动态按钮图标 默认 chevron_left 32 theme-svg linuxcnc/share/gmoccapy/icons/classic/scalable/actions/chevron_left.svg work/working3/gmoccapy_button_icons/files/img_ref_paginate_prev__chevron_left__32.svg 仅轴数大于 7 时显示
55 回零按钮栏 Python 动态 ref_all 回零全部轴 Press to home all axes img_ref_all 动态按钮图标 默认 ref_all 48 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/ref_all.png work/working3/gmoccapy_button_icons/files/img_ref_all__ref_all__48.png _make_ref_axis_button
56 回零按钮栏 Python 动态 unref_all 取消全部回零 Press to unhome all axes img_unref_all 动态按钮图标 默认 unref_all 48 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/unref_all.png work/working3/gmoccapy_button_icons/files/img_unref_all__unref_all__48.png _make_ref_axis_button
57 对刀/坐标设定按钮栏 Python 动态 block_height Block Height Press to enter new value for block height 无图标 默认 none 仅 [TOOLSENSOR] 有效时出现;本配置默认不出现
58 对刀/坐标设定按钮栏 Python 动态 next_button 下一组 Touch Off 按钮 Press to display next homing button img_touch_paginate_next 动态按钮图标 默认 chevron_right 32 theme-svg linuxcnc/share/gmoccapy/icons/classic/scalable/actions/chevron_right.svg work/working3/gmoccapy_button_icons/files/img_touch_paginate_next__chevron_right__32.svg 仅按钮过多时显示
59 对刀/坐标设定按钮栏 Python 动态 previous_button 上一组 Touch Off 按钮 Press to display previous homing button img_touch_paginate_prev 动态按钮图标 默认 chevron_left 32 theme-svg linuxcnc/share/gmoccapy/icons/classic/scalable/actions/chevron_left.svg work/working3/gmoccapy_button_icons/files/img_touch_paginate_prev__chevron_left__32.svg 仅轴数大于 8 时显示
60 对刀/坐标设定按钮栏 Python 动态 touch_a A 轴 Touch Off Press to set touch off value for axis A img_touch_a 动态按钮图标 默认 touch_a 48 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/touch_a.png work/working3/gmoccapy_button_icons/files/img_touch_a__touch_a__48.png 当前 XYZAB 生成
61 对刀/坐标设定按钮栏 Python 动态 touch_b B 轴 Touch Off Press to set touch off value for axis B img_touch_b 动态按钮图标 默认 touch_b 48 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/touch_b.png work/working3/gmoccapy_button_icons/files/img_touch_b__touch_b__48.png 当前 XYZAB 生成
62 对刀/坐标设定按钮栏 Python 动态 touch_back 返回主按钮栏 Press to return to main button list img_touch_menu_close 动态按钮图标 默认 back_to_app 48 theme-svg linuxcnc/share/gmoccapy/icons/classic/scalable/actions/back_to_app.svg work/working3/gmoccapy_button_icons/files/img_touch_menu_close__back_to_app__48.svg _make_touch_button
63 对刀/坐标设定按钮栏 Python 动态 touch_x X 轴 Touch Off Press to set touch off value for axis X img_touch_x 动态按钮图标 默认 touch_x 48 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/touch_x.png work/working3/gmoccapy_button_icons/files/img_touch_x__touch_x__48.png 当前 XYZAB 生成
64 对刀/坐标设定按钮栏 Python 动态 touch_y Y 轴 Touch Off Press to set touch off value for axis Y img_touch_y 动态按钮图标 默认 touch_y 48 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/touch_y.png work/working3/gmoccapy_button_icons/files/img_touch_y__touch_y__48.png 当前 XYZAB 生成
65 对刀/坐标设定按钮栏 Python 动态 touch_z Z 轴 Touch Off Press to set touch off value for axis Z img_touch_z 动态按钮图标 默认 touch_z 48 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/touch_z.png work/working3/gmoccapy_button_icons/files/img_touch_z__touch_z__48.png 当前 XYZAB 生成
66 手动/Jog 面板 Glade 静态 chk_ignore_limits Ignore limits 静态绑定 默认 none toggled:on_chk_ignore_limits_toggled
67 手动/Jog 面板 运行时状态 tbtn_turtle_jog 慢速 Jog img_turtle_jog 慢速 Jog 图标 active jog_speed_slow 32 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/32x32/actions/jog_speed_slow.png work/working3/gmoccapy_button_icons/files/img_turtle_jog__jog_speed_slow__32.png on_tbtn_turtle_jog_toggled
68 手动/Jog 面板 运行时状态 tbtn_turtle_jog 快速 Jog img_rabbit_jog 快速 Jog 图标 inactive jog_speed_fast 32 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/32x32/actions/jog_speed_fast.png work/working3/gmoccapy_button_icons/files/img_rabbit_jog__jog_speed_fast__32.png on_tbtn_turtle_jog_toggled
69 手动/Jog 面板 Glade 静态 tbtn_turtle_jog img_rabbit_jog 静态绑定 默认 jog_speed_fast 32 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/32x32/actions/jog_speed_fast.png work/working3/gmoccapy_button_icons/files/img_rabbit_jog__jog_speed_fast__32.png toggled:on_tbtn_turtle_jog_toggled
70 Jog 增量选择栏 Python 动态 rbt_0 Continuous Continuous jog img_continuous 动态按钮图标 默认 jog_continuous 24 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/24x24/actions/jog_continuous.png work/working3/gmoccapy_button_icons/files/img_continuous__jog_continuous__24.png 连续 Jog 唯一带图标
71 Jog 增量选择栏 Python 动态 rbt_1 1.000 mm 无图标 默认 none 增量按钮使用文字,无图标
72 Jog 增量选择栏 Python 动态 rbt_2 0.100 mm 无图标 默认 none 增量按钮使用文字,无图标
73 Jog 增量选择栏 Python 动态 rbt_3 0.010 mm 无图标 默认 none 增量按钮使用文字,无图标
74 Jog 增量选择栏 Python 动态 rbt_4 0.001 mm 无图标 默认 none 增量按钮使用文字,无图标
75 Jog 增量选择栏 Python 动态 rbt_5 1.2345 in 无图标 默认 none 增量按钮使用文字,无图标
76 Jog 轴按钮 Python 动态 a+ A+ Press to jog axis A 无图标 默认 none 轴 Jog 按钮使用文字,无图标
77 Jog 轴按钮 Python 动态 a- A- Press to jog axis A 无图标 默认 none 轴 Jog 按钮使用文字,无图标
78 Jog 轴按钮 Python 动态 b+ B+ Press to jog axis B 无图标 默认 none 轴 Jog 按钮使用文字,无图标
79 Jog 轴按钮 Python 动态 b- B- Press to jog axis B 无图标 默认 none 轴 Jog 按钮使用文字,无图标
80 Jog 轴按钮 Python 动态 x+ X+ Press to jog axis X 无图标 默认 none 轴 Jog 按钮使用文字,无图标
81 Jog 轴按钮 Python 动态 x- X- Press to jog axis X 无图标 默认 none 轴 Jog 按钮使用文字,无图标
82 Jog 轴按钮 Python 动态 y+ Y+ Press to jog axis Y 无图标 默认 none 轴 Jog 按钮使用文字,无图标
83 Jog 轴按钮 Python 动态 y- Y- Press to jog axis Y 无图标 默认 none 轴 Jog 按钮使用文字,无图标
84 Jog 轴按钮 Python 动态 z+ Z+ Press to jog axis Z 无图标 默认 none 轴 Jog 按钮使用文字,无图标
85 Jog 轴按钮 Python 动态 z- Z- Press to jog axis Z 无图标 默认 none 轴 Jog 按钮使用文字,无图标
86 Jog 关节按钮 Python 动态 0+ 0+ Press to jog joint 0 无图标 默认 none trivial kinematics 时不创建;非平凡运动学才出现
87 Jog 关节按钮 Python 动态 0- 0- Press to jog joint 0 无图标 默认 none trivial kinematics 时不创建;非平凡运动学才出现
88 Jog 关节按钮 Python 动态 1+ 1+ Press to jog joint 1 无图标 默认 none trivial kinematics 时不创建;非平凡运动学才出现
89 Jog 关节按钮 Python 动态 1- 1- Press to jog joint 1 无图标 默认 none trivial kinematics 时不创建;非平凡运动学才出现
90 Jog 关节按钮 Python 动态 2+ 2+ Press to jog joint 2 无图标 默认 none trivial kinematics 时不创建;非平凡运动学才出现
91 Jog 关节按钮 Python 动态 2- 2- Press to jog joint 2 无图标 默认 none trivial kinematics 时不创建;非平凡运动学才出现
92 Jog 关节按钮 Python 动态 3+ 3+ Press to jog joint 3 无图标 默认 none trivial kinematics 时不创建;非平凡运动学才出现
93 Jog 关节按钮 Python 动态 3- 3- Press to jog joint 3 无图标 默认 none trivial kinematics 时不创建;非平凡运动学才出现
94 Jog 关节按钮 Python 动态 4+ 4+ Press to jog joint 4 无图标 默认 none trivial kinematics 时不创建;非平凡运动学才出现
95 Jog 关节按钮 Python 动态 4- 4- Press to jog joint 4 无图标 默认 none trivial kinematics 时不创建;非平凡运动学才出现
96 冷却/主轴控制 运行时状态 rbt_forward 主轴正转中 img_spindle_forward_on 正转 active 图标 active spindle_right_on 48 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/spindle_right_on.png work/working3/gmoccapy_button_icons/files/img_spindle_forward_on__spindle_right_on__48.png on_rbt_forward_released/clicked
97 冷却/主轴控制 Glade 静态 rbt_forward img_spindle_forward 静态绑定 默认 spindle_right 48 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/spindle_right.png work/working3/gmoccapy_button_icons/files/img_spindle_forward__spindle_right__48.png clicked:on_rbt_forward_clicked; released:on_rbt_forward_released
98 冷却/主轴控制 运行时状态 rbt_reverse 主轴反转中 img_spindle_reverse_on 反转 active 图标 active spindle_left_on 48 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/spindle_left_on.png work/working3/gmoccapy_button_icons/files/img_spindle_reverse_on__spindle_left_on__48.png on_rbt_reverse_released/clicked
99 冷却/主轴控制 Glade 静态 rbt_reverse img_spindle_reverse 静态绑定 默认 spindle_left 48 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/spindle_left.png work/working3/gmoccapy_button_icons/files/img_spindle_reverse__spindle_left__48.png clicked:on_rbt_reverse_clicked; released:on_rbt_reverse_released
100 冷却/主轴控制 运行时状态 rbt_stop 主轴停止已选中 img_spindle_stop_on 停止 active 图标 active spindle_stop_on 48 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/spindle_stop_on.png work/working3/gmoccapy_button_icons/files/img_spindle_stop_on__spindle_stop_on__48.png on_rbt_stop_clicked
101 冷却/主轴控制 运行时状态 rbt_stop 主轴停止未选中 img_spindle_stop 停止 inactive 图标 inactive spindle_stop 48 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/spindle_stop.png work/working3/gmoccapy_button_icons/files/img_spindle_stop__spindle_stop__48.png on_rbt_stop_clicked: widget inactive 时切回停止普通图标
102 冷却/主轴控制 Glade 静态 rbt_stop img_spindle_stop_on 静态绑定 默认 spindle_stop_on 48 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/spindle_stop_on.png work/working3/gmoccapy_button_icons/files/img_spindle_stop_on__spindle_stop_on__48.png clicked:on_rbt_stop_clicked
103 冷却/主轴控制 运行时状态 tbtn_flood 冷却液开 img_coolant_on Flood active 图标 active coolant_flood_active 48 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/coolant_flood_active.png work/working3/gmoccapy_button_icons/files/img_coolant_on__coolant_flood_active__48.png on_hal_status_flood_changed
104 冷却/主轴控制 Glade 静态 tbtn_flood img_coolant_off 静态绑定 默认 coolant_flood_inactive 48 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/coolant_flood_inactive.png work/working3/gmoccapy_button_icons/files/img_coolant_off__coolant_flood_inactive__48.png toggled:on_tbtn_flood_toggled
105 冷却/主轴控制 运行时状态 tbtn_mist 雾冷开 img_mist_on Mist active 图标 active coolant_mist_active 48 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/coolant_mist_active.png work/working3/gmoccapy_button_icons/files/img_mist_on__coolant_mist_active__48.png on_hal_status_mist_changed
106 冷却/主轴控制 Glade 静态 tbtn_mist img_mist_off 静态绑定 默认 coolant_mist_inactive 48 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/coolant_mist_inactive.png work/working3/gmoccapy_button_icons/files/img_mist_off__coolant_mist_inactive__48.png toggled:on_tbtn_mist_toggled
107 预览/视图 Glade 静态 btn_delete_view clear plot img_tool_clear 静态绑定 默认 clear 24 theme-nearest-png linuxcnc/share/gmoccapy/icons/classic/32x32/actions/clear.png work/working3/gmoccapy_button_icons/files/img_tool_clear__clear__24.png clicked:on_btn_delete_view_clicked
108 预览/视图 Glade 静态 btn_zoom_in Zoom in img_zoom_in 静态绑定 默认 zoom_in 24 theme-nearest-png linuxcnc/share/gmoccapy/icons/classic/32x32/actions/zoom_in.png work/working3/gmoccapy_button_icons/files/img_zoom_in__zoom_in__24.png clicked:on_btn_zoom_in_clicked
109 预览/视图 Glade 静态 btn_zoom_out Zoom out img_zoom_out 静态绑定 默认 zoom_out 24 theme-nearest-png linuxcnc/share/gmoccapy/icons/classic/32x32/actions/zoom_out.png work/working3/gmoccapy_button_icons/files/img_zoom_out__zoom_out__24.png clicked:on_btn_zoom_out_clicked
110 预览/视图 Glade 静态 rbt_view_p view perspective img_view_p 静态绑定 默认 tool_axis_p 24 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/24x24/actions/tool_axis_p.png work/working3/gmoccapy_button_icons/files/img_view_p__tool_axis_p__24.png toggled:on_rbt_view_p_toggled
111 预览/视图 Glade 静态 rbt_view_x view along the X axis from positive to negative img_view_x 静态绑定 默认 tool_axis_x 24 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/24x24/actions/tool_axis_x.png work/working3/gmoccapy_button_icons/files/img_view_x__tool_axis_x__24.png toggled:on_rbt_view_x_toggled
112 预览/视图 Glade 静态 rbt_view_y view along the Y axis from positive to negative img_view_y 静态绑定 默认 tool_axis_y 24 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/24x24/actions/tool_axis_y.png work/working3/gmoccapy_button_icons/files/img_view_y__tool_axis_y__24.png toggled:on_rbt_view_y_toggled
113 预览/视图 Glade 静态 rbt_view_y2 view along the Y axis from positive to negative as viewn for a back tool lathe img_view_y2 静态绑定 默认 tool_axis_y_inv 24 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/24x24/actions/tool_axis_y_inv.png work/working3/gmoccapy_button_icons/files/img_view_y2__tool_axis_y_inv__24.png toggled:on_rbt_view_y2_toggled
114 预览/视图 Glade 静态 rbt_view_z view along the Z axis from positive to negative img_view_z 静态绑定 默认 tool_axis_z 24 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/24x24/actions/tool_axis_z.png work/working3/gmoccapy_button_icons/files/img_view_z__tool_axis_z__24.png toggled:on_rbt_view_z_toggled
115 预览/视图 Glade 静态 tbtn_view_dimension Show or hide dimensions img_dimensions 静态绑定 默认 dimensions 24 theme-nearest-png linuxcnc/share/gmoccapy/icons/classic/32x32/actions/dimensions.png work/working3/gmoccapy_button_icons/files/img_dimensions__dimensions__24.png toggled:on_tbtn_view_dimension_toggled
116 预览/视图 Glade 静态 tbtn_view_tool_path Show or hide tool path img_tool_path 静态绑定 默认 toolpath 24 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/24x24/actions/toolpath.png work/working3/gmoccapy_button_icons/files/img_tool_path__toolpath__24.png toggled:on_tbtn_view_tool_path_toggled
117 编辑器搜索/编辑 Glade 静态 btn_comment img_edit_comment 静态绑定 默认 comment 32 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/32x32/actions/comment.png work/working3/gmoccapy_button_icons/files/img_edit_comment__comment__32.png clicked:on_btn_toggle_comment_clicked
118 编辑器搜索/编辑 Glade 静态 btn_redo Redo img_edit-redo 静态绑定 默认 edit_redo 32 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/32x32/actions/edit_redo.png work/working3/gmoccapy_button_icons/files/img_edit-redo__edit_redo__32.png clicked:on_btn_redo_clicked
119 编辑器搜索/编辑 Glade 静态 btn_replace Replace 静态绑定 默认 none clicked:on_btn_replace_clicked
120 编辑器搜索/编辑 Glade 静态 btn_search_back Search / back img_up 静态绑定 默认 chevron_up 24 theme-svg linuxcnc/share/gmoccapy/icons/classic/scalable/actions/chevron_up.svg work/working3/gmoccapy_button_icons/files/img_up__chevron_up__24.svg clicked:on_btn_search_back_clicked
121 编辑器搜索/编辑 Glade 静态 btn_search_forward Search / fwd img_down 静态绑定 默认 chevron_down 24 theme-svg linuxcnc/share/gmoccapy/icons/classic/scalable/actions/chevron_down.svg work/working3/gmoccapy_button_icons/files/img_down__chevron_down__24.svg clicked:on_btn_search_forward_clicked
122 编辑器搜索/编辑 Glade 静态 btn_undo Undo img_edit-undo 静态绑定 默认 edit_undo 32 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/32x32/actions/edit_undo.png work/working3/gmoccapy_button_icons/files/img_edit-undo__edit_undo__32.png clicked:on_btn_undo_clicked
123 编辑器搜索/编辑 Glade 静态 chk_ignore_case Ignore Case 静态绑定 默认 none
124 编辑器搜索/编辑 Glade 静态 chk_replace_all Replace All 静态绑定 默认 none
125 编辑页底部栏 Glade 静态 btn_back_edit Go back to main button list img_edit_menu_close 静态绑定 默认 back_to_app 48 theme-svg linuxcnc/share/gmoccapy/icons/classic/scalable/actions/back_to_app.svg work/working3/gmoccapy_button_icons/files/img_edit_menu_close__back_to_app__48.svg clicked:on_btn_back_clicked
126 编辑页底部栏 Glade 静态 btn_calc Show calculator img_edit_menu_calculator 静态绑定 默认 calculator_open 32 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/32x32/actions/calculator_open.png work/working3/gmoccapy_button_icons/files/img_edit_menu_calculator__calculator_open__32.png clicked:on_btn_show_calc_clicked
127 编辑页底部栏 运行时状态 btn_keyb 隐藏虚拟键盘 img_edit_menu_keyboard_hide 编辑页键盘隐藏图标 keyboard shown keyboard_hide 32 theme-nearest-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/keyboard_hide.png work/working3/gmoccapy_button_icons/files/img_edit_menu_keyboard_hide__keyboard_hide__32.png on_ntb_info_switch_page
128 编辑页底部栏 Glade 静态 btn_keyb Show or hide the virtual keyboard img_edit_menu_keyboard 静态绑定 默认 keyboard 32 theme-nearest-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/keyboard.png work/working3/gmoccapy_button_icons/files/img_edit_menu_keyboard__keyboard__32.png clicked:on_btn_show_kbd_clicked
129 编辑页底部栏 Glade 静态 btn_new clear the edit field and make a new file img_edit_menu_new 静态绑定 默认 new_document 32 theme-svg linuxcnc/share/gmoccapy/icons/classic/scalable/actions/new_document.svg work/working3/gmoccapy_button_icons/files/img_edit_menu_new__new_document__32.svg clicked:on_btn_new_clicked
130 编辑页底部栏 Glade 静态 btn_reload_edit Reload file img_edit_menu_reload 静态绑定 默认 refresh 32 theme-nearest-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/refresh.png work/working3/gmoccapy_button_icons/files/img_edit_menu_reload__refresh__32.png
131 编辑页底部栏 Glade 静态 btn_save save the file using the original name img_edit_menu_save 静态绑定 默认 save 32 theme-nearest-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/save.png work/working3/gmoccapy_button_icons/files/img_edit_menu_save__save__32.png
132 编辑页底部栏 Glade 静态 btn_save_as save the file with a new name img_edit_menu_save_as 静态绑定 默认 save_as 32 theme-nearest-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/save_as.png work/working3/gmoccapy_button_icons/files/img_edit_menu_save_as__save_as__32.png
133 编辑页底部栏 Glade 静态 tbtn_split_view Show preview as split view img_split_view 静态绑定 默认 split_view 32 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/32x32/actions/split_view.png work/working3/gmoccapy_button_icons/files/img_split_view__split_view__32.png toggled:on_tbtn_split_view_toggled
134 刀具页底部栏 Glade 静态 btn_back_tool Go back to main button list img_back_tool 静态绑定 默认 back_to_app 48 theme-svg linuxcnc/share/gmoccapy/icons/classic/scalable/actions/back_to_app.svg work/working3/gmoccapy_button_icons/files/img_back_tool__back_to_app__48.svg clicked:on_btn_back_clicked
135 刀具页底部栏 Glade 静态 btn_change_tool change tool to the selected one img_toolchange 静态绑定 默认 mill_tool_change 48 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/mill_tool_change.png work/working3/gmoccapy_button_icons/files/img_toolchange__mill_tool_change__48.png clicked:on_btn_selected_tool_clicked
136 刀具页底部栏 Glade 静态 btn_index_tool change tool with the command M61 Q?, no machine move will be done img_index_tool 静态绑定 默认 mill_tool_set_num 48 theme-svg linuxcnc/share/gmoccapy/icons/classic/scalable/actions/mill_tool_set_num.svg work/working3/gmoccapy_button_icons/files/img_index_tool__mill_tool_set_num__48.svg clicked:on_btn_selected_tool_clicked
137 刀具页底部栏 Glade 静态 btn_select_tool_by_no Select a tool by number img_tool_by_no 静态绑定 默认 mill_tool_change_num 48 theme-svg linuxcnc/share/gmoccapy/icons/classic/scalable/actions/mill_tool_change_num.svg work/working3/gmoccapy_button_icons/files/img_tool_by_no__mill_tool_change_num__48.svg clicked:on_btn_select_tool_by_no_clicked
138 刀具页底部栏 Glade 静态 btn_tool_touchoff_x touch off the tool and set the value to the tool table 静态绑定 默认 none clicked:on_btn_tool_touchoff_clicked
139 刀具页底部栏 Glade 静态 btn_tool_touchoff_z touch off the tool and set the value to the tool table 静态绑定 默认 none clicked:on_btn_tool_touchoff_clicked
140 文件选择栏 Glade 静态 btn_back_file_load Close without returning a file path img_back_file_load 静态绑定 默认 back_to_app 48 theme-svg linuxcnc/share/gmoccapy/icons/classic/scalable/actions/back_to_app.svg work/working3/gmoccapy_button_icons/files/img_back_file_load__back_to_app__48.svg clicked:on_btn_back_clicked
141 文件选择栏 Glade 静态 btn_dir_up Move to parent directory img_dir_up 静态绑定 默认 chevron_up 32 theme-svg linuxcnc/share/gmoccapy/icons/classic/scalable/actions/chevron_up.svg work/working3/gmoccapy_button_icons/files/img_dir_up__chevron_up__32.svg clicked:on_btn_dir_up_clicked
142 文件选择栏 Glade 静态 btn_home Move to your home directory img_home 静态绑定 默认 home_folder 32 theme-svg linuxcnc/share/gmoccapy/icons/classic/scalable/actions/home_folder.svg work/working3/gmoccapy_button_icons/files/img_home__home_folder__32.svg clicked:on_btn_home_clicked
143 文件选择栏 Glade 静态 btn_jump_to Jump to user defined directory img_jump_to 静态绑定 默认 user_defined_folder 32 theme-svg linuxcnc/share/gmoccapy/icons/classic/scalable/actions/user_defined_folder.svg work/working3/gmoccapy_button_icons/files/img_jump_to__user_defined_folder__32.svg clicked:on_btn_jump_to_clicked
144 文件选择栏 Glade 静态 btn_reload_dir Refresh directory img_refresh_dir 静态绑定 默认 refresh 32 theme-nearest-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/refresh.png work/working3/gmoccapy_button_icons/files/img_refresh_dir__refresh__32.png clicked:on_btn_refresh_dir_clicked
145 文件选择栏 Glade 静态 btn_sel_next Select the next file img_sel_next 静态绑定 默认 chevron_right 32 theme-svg linuxcnc/share/gmoccapy/icons/classic/scalable/actions/chevron_right.svg work/working3/gmoccapy_button_icons/files/img_sel_next__chevron_right__32.svg clicked:on_btn_sel_next_clicked
146 文件选择栏 Glade 静态 btn_sel_prev Select the previous file img_sel_prev 静态绑定 默认 chevron_left 32 theme-svg linuxcnc/share/gmoccapy/icons/classic/scalable/actions/chevron_left.svg work/working3/gmoccapy_button_icons/files/img_sel_prev__chevron_left__32.svg clicked:on_btn_sel_prev_clicked
147 文件选择栏 Glade 静态 btn_select select the highlighted file and return the path img_select 静态绑定 默认 select_file 32 theme-nearest-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/select_file.png work/working3/gmoccapy_button_icons/files/img_select__select_file__32.png clicked:on_btn_select_clicked
148 文件选择栏 Glade 静态 tbtn_sort Sort by / date Sort files by date, newest first 静态绑定 默认 none toggled:on_tbtn_sort_toggled
149 内嵌 ToolEdit 控件 内嵌控件 tooldedit.add 新增刀具 Add new tool img_tool_add 动态按钮图标 默认 add 32 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/32x32/actions/add.png work/working3/gmoccapy_button_icons/files/img_tool_add__add__32.png Python 改造 ToolEdit
150 内嵌 ToolEdit 控件 内嵌控件 tooldedit.apply 保存刀具表 Save tool table to file img_tool_save 动态按钮图标 默认 save 32 theme-nearest-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/save.png work/working3/gmoccapy_button_icons/files/img_tool_save__save__32.png Python 改造 ToolEdit
151 内嵌 ToolEdit 控件 内嵌控件 tooldedit.calculator 刀具表计算器 Use calculator to edit numeric values img_tool_calculator 动态按钮图标 默认 calculator_open 32 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/32x32/actions/calculator_open.png work/working3/gmoccapy_button_icons/files/img_tool_calculator__calculator_open__32.png Python 改造 ToolEdit
152 内嵌 ToolEdit 控件 内嵌控件 tooldedit.delete 删除选中刀具 Delete selected tool img_tool_delete 动态按钮图标 默认 delete 32 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/32x32/actions/delete.png work/working3/gmoccapy_button_icons/files/img_tool_delete__delete__32.png Python 改造 ToolEdit
153 内嵌 ToolEdit 控件 内嵌控件 tooldedit.reload 重载刀具表 Reload tool table from file img_tool_reload 动态按钮图标 默认 refresh 32 theme-nearest-png linuxcnc/share/gmoccapy/icons/classic/48x48/actions/refresh.png work/working3/gmoccapy_button_icons/files/img_tool_reload__refresh__32.png Python 改造 ToolEdit
154 内嵌 OffsetPage 控件 内嵌控件 offsetpage.calculator 坐标偏置计算器 Use calculator to edit numeric values img_offset_calculator 动态按钮图标 默认 calculator_open 32 theme-exact-png linuxcnc/share/gmoccapy/icons/classic/32x32/actions/calculator_open.png work/working3/gmoccapy_button_icons/files/img_offset_calculator__calculator_open__32.png Python 改造 OffsetPage
155 内嵌 OffsetPage 控件 内嵌控件 offsetpage.edit_offsets Edit Offsets Edit offsets in OffsetPage 无图标 默认 none 内嵌控件文字按钮,无图标
156 内嵌 OffsetPage 控件 内嵌控件 offsetpage.set_selected Set selected Set selected coordinate system active 无图标 默认 none 内嵌控件文字按钮,无图标
157 内嵌 OffsetPage 控件 内嵌控件 offsetpage.zero_g92 Zero G92 Set G92 offsets to zero 无图标 默认 none 内嵌控件文字按钮,无图标
158 设置页控件 Glade 静态 abs_colorbutton 静态绑定 默认 none color-set:on_abs_colorbutton_color_set
159 设置页控件 Glade 静态 audio_alert_chooser 静态绑定 默认 none file-set:on_change_sound
160 设置页控件 Glade 静态 audio_error_chooser 静态绑定 默认 none file-set:on_change_sound
161 设置页控件 Glade 静态 chk_en_audio Enable sound 静态绑定 默认 none toggled:on_chk_en_audio_toggled
162 设置页控件 Glade 静态 chk_font_monospace Monospace 静态绑定 默认 none toggled:on_chk_font_monospace_toggled
163 设置页控件 Glade 静态 chk_font_regular Regular/Medium 静态绑定 默认 none toggled:on_chk_font_regular_toggled
164 设置页控件 Glade 静态 chk_hide_cursor Hide cursor 静态绑定 默认 none toggled:on_chk_hide_cursor_toggled
165 设置页控件 Glade 静态 chk_hide_tooltips Hide tooltips 静态绑定 默认 none toggled:on_chk_hide_tooltips_toggled
166 设置页控件 Glade 静态 chk_kbd_set_height Height 静态绑定 默认 none toggled:on_chk_kb_set_height_toggled
167 设置页控件 Glade 静态 chk_kbd_set_width Width 静态绑定 默认 none toggled:on_chk_kb_set_width_toggled
168 设置页控件 Glade 静态 chk_reload_tool Reload Tool on Start If checked, the tool in spindle / will be saved on each change / and the last tool will be reloaded / at start of the GUI. Also it's / length offset will be reloaded. 静态绑定 默认 none toggled:on_chk_reload_tool_toggled
169 设置页控件 Glade 静态 chk_show_dro Show DRO 静态绑定 默认 none toggled:on_chk_show_dro_toggled
170 设置页控件 Glade 静态 chk_show_dtg Show DTG 静态绑定 默认 none toggled:on_chk_show_dtg_toggled
171 设置页控件 Glade 静态 chk_show_offsets Show offsets 静态绑定 默认 none toggled:on_chk_show_offsets_toggled
172 设置页控件 Glade 静态 chk_toggle_readout Toggle DRO mode by / clicking on the DRO 静态绑定 默认 none toggled:on_chk_toggle_readout_toggled
173 设置页控件 Glade 静态 chk_turtle_jog Hide turtle Jog Button 静态绑定 默认 none toggled:on_chk_turtle_jog_toggled
174 设置页控件 Glade 静态 chk_use_frames Use frames If checked, the messages / will be in a frame. 静态绑定 默认 none toggled:on_chk_use_frames_toggled
175 设置页控件 Glade 静态 chk_use_kb_on_edit Show keyboard on EDIT 静态绑定 默认 none toggled:on_chk_use_kb_on_edit_toggled
176 设置页控件 Glade 静态 chk_use_kb_on_file_selection Show keyboard on load file 静态绑定 默认 none toggled:on_chk_use_kb_on_file_selection_toggled
177 设置页控件 Glade 静态 chk_use_kb_on_mdi Show keyboard on MDI 静态绑定 默认 none toggled:on_chk_use_kb_on_mdi_toggled
178 设置页控件 Glade 静态 chk_use_kb_on_offset Show keyboard on offset 静态绑定 默认 none toggled:on_chk_use_kb_on_offset_toggled
179 设置页控件 Glade 静态 chk_use_kb_on_tooledit Show keyboard on tooledit 静态绑定 默认 none toggled:on_chk_use_kb_on_tooledit_toggled
180 设置页控件 Glade 静态 chk_use_kb_shortcuts Use keyboard shortcuts 静态绑定 默认 none toggled:on_chk_use_kb_shortcuts_toggled
181 设置页控件 Glade 静态 chk_use_tool_measurement Use auto tool measurement 静态绑定 默认 none toggled:on_chk_use_tool_measurement_toggled
182 设置页控件 Glade 静态 dtg_colorbutton 静态绑定 默认 none color-set:on_dtg_colorbutton_color_set
183 设置页控件 Glade 静态 file_to_load_chooser 静态绑定 默认 none file-set:on_file_to_load_chooser_file_set
184 设置页控件 Glade 静态 fontbutton_gcodeview 静态绑定 默认 none font-set:on_fontbutton_gcodeview_font_set
185 设置页控件 Glade 静态 fontbutton_popup The font to use 静态绑定 默认 none font-set:on_fontbutton_popup_font_set
186 设置页控件 Glade 静态 homed_colorbtn 静态绑定 默认 none color-set:on_homed_colorbtn_color_set
187 设置页控件 Glade 静态 jump_to_dir_chooser 静态绑定 默认 none file-set:on_jump_to_dir_chooser_file_set
188 设置页控件 Glade 静态 rbt_hal_unlock Use hal pin to unlock 静态绑定 默认 none toggled:on_rbt_unlock_toggled
189 设置页控件 Glade 静态 rbt_no_unlock Do not use unlock code 静态绑定 默认 none toggled:on_rbt_unlock_toggled
190 设置页控件 Glade 静态 rbt_use_unlock Use unlock code 静态绑定 默认 none toggled:on_rbt_unlock_toggled
191 设置页控件 Glade 静态 rbtn_fullscreen Start as fullscreen 静态绑定 默认 none toggled:on_rbtn_fullscreen_toggled
192 设置页控件 Glade 静态 rbtn_maximized Start maximized 静态绑定 默认 none toggled:on_rbtn_maximized_toggled
193 设置页控件 Glade 静态 rbtn_no_run_from_line Do not use run from line 静态绑定 默认 none toggled:on_rbtn_run_from_line_toggled
194 设置页控件 Glade 静态 rbtn_run_from_line Use run from line 静态绑定 默认 none toggled:on_rbtn_run_from_line_toggled
195 设置页控件 Glade 静态 rbtn_show_offsets show offsets 静态绑定 默认 none
196 设置页控件 Glade 静态 rbtn_show_preview show preview 静态绑定 默认 none toggled:on_rbtn_show_preview_toggled
197 设置页控件 Glade 静态 rbtn_window Start as window 静态绑定 默认 none toggled:on_rbtn_window_toggled
198 设置页控件 Glade 静态 rel_colorbutton 静态绑定 默认 none color-set:on_rel_colorbutton_color_set
199 设置页控件 Glade 静态 unhomed_colorbtn 静态绑定 默认 none color-set:on_unhomed_colorbtn_color_set
200 Glade 静态按钮 Glade 静态 btn_calibration Calibration launch calibration 静态绑定 默认 none clicked:on_btn_calibration_clicked
201 Glade 静态按钮 Glade 静态 btn_classicladder Cl.-ladder Open classicladder 静态绑定 默认 none clicked:on_btn_classicladder_clicked
202 Glade 静态按钮 Glade 静态 btn_delete delete MDI history 静态绑定 默认 none clicked:on_btn_delete_clicked
203 Glade 静态按钮 Glade 静态 btn_feed_100 100% reset feed override to 100 % 静态绑定 默认 none clicked:on_btn_feed_100_clicked
204 Glade 静态按钮 Glade 静态 btn_hal_meter Hal Meter launch hal meter 静态绑定 默认 none clicked:on_btn_hal_meter_clicked
205 Glade 静态按钮 Glade 静态 btn_hal_scope Hal-Scope launch hal scope 静态绑定 默认 none clicked:on_btn_hal_scope_clicked
206 Glade 静态按钮 Glade 静态 btn_launch_test_message Launch test message Push here to launch a test message / to test your settings. 静态绑定 默认 none pressed:on_btn_launch_test_message_pressed
207 Glade 静态按钮 Glade 静态 btn_none none 静态绑定 默认 none clicked:on_btn_none_clicked
208 Glade 静态按钮 Glade 静态 btn_show_hal Halshow opens the show hal tool 静态绑定 默认 none clicked:on_btn_show_hal_clicked
209 Glade 静态按钮 Glade 静态 btn_spindle_100 100% 静态绑定 默认 none clicked:on_btn_spindle_100_clicked
210 Glade 静态按钮 Glade 静态 btn_status Status launch linuxcnc status 静态绑定 默认 none clicked:on_btn_status_clicked
211 Glade 静态按钮 Glade 静态 btn_use_current current / file 静态绑定 默认 none clicked:on_btn_use_current_clicked
212 Glade 静态按钮 Glade 静态 chkbtn_hide_titlebar Hide title bar 静态绑定 默认 none toggled:on_chkbtn_hide_titlebar_toggled

View File

@@ -0,0 +1,247 @@
# gmoccapy_XYZAB 界面按钮图标整理
- 配置文件:`/home/meswork/cnc_wams/linuxcnc/configs/sim/gmoccapy/gmoccapy_XYZAB.ini`
- 首选项图标主题:`classic`,来自 `/home/meswork/cnc_wams/linuxcnc/configs/sim/gmoccapy/gmoccapy_XYZAB.pref``icon_theme = classic`
- 图标主题目录:`/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic`
- 运行时映射来源:`/home/meswork/cnc_wams/linuxcnc/bin/gmoccapy``_set_icon_theme()` / `icon_configs`
- Glade 静态界面来源:`/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/gmoccapy.glade`
- 当前坐标轴:`X Y Z A B`;当前宏数量:`5`;当前 Jog 增量数量:`6`
- 本目录已复制图标文件:`files/`,共 `112` 个文件
- CSV 明细:`button_icon_inventory.csv`
## 统计
| 类型 | 数量 |
| --- | ---: |
| 清单行总数 | 211 |
| 有图标/图像的按钮或状态 | 116 |
| 纯文字/无图标按钮或状态 | 95 |
| `gtk-icon-name-not-copied` | 2 |
| `macro-custom-file` | 2 |
| `none` | 95 |
| `theme-exact-png` | 69 |
| `theme-nearest-png` | 23 |
| `theme-svg` | 20 |
## 说明
- `theme-exact-png` 表示 classic 主题中有精确尺寸 PNG`theme-nearest-png` 表示 GTK 会按请求尺寸找最近的 PNG`theme-svg` 表示 classic 主题依赖 scalable SVG。
- `gtk-icon-name-not-copied` 表示 Glade 原始 `icon-name` 由 GTK 系统主题解析,但当前 gmoccapy 运行时通常会用 `_set_icon_theme()` 的 classic 图标覆盖。
- 宏按钮如果 NGC 文件包含 `(IMAGE, ...)`gmoccapy 会直接载入该图片;当前 `i_am_lost``go_to_position` 是自定义 PNG。
- 同一个按钮的 active/inactive 图标在“运行时状态”行中列出,例如 `tbtn_on``rbt_auto``tbtn_pause``tbtn_optional_blocks`
## 完整清单
| 分类 | 按钮/状态 | 图像ID | 图标名 | 尺寸 | 来源类型 | 源文件 | 复制文件 | 说明 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 右侧主状态栏 | rbt_auto<br>Auto 已选中<br>`active` | img_auto_on | mode_auto_active | 48 | theme-exact-png | [mode_auto_active.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/mode_auto_active.png) | [img_auto_on__mode_auto_active__48.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_auto_on__mode_auto_active__48.png) | on_rbt_auto_toggled |
| 右侧主状态栏 | rbt_auto | img_auto | mode_auto_inactive | 48 | theme-exact-png | [mode_auto_inactive.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/mode_auto_inactive.png) | [img_auto__mode_auto_inactive__48.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_auto__mode_auto_inactive__48.png) | enter auto mode to run programs |
| 右侧主状态栏 | rbt_manual<br>手动已选中<br>`active` | img_manual_on | mode_manual_active | 48 | theme-exact-png | [mode_manual_active.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/mode_manual_active.png) | [img_manual_on__mode_manual_active__48.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_manual_on__mode_manual_active__48.png) | on_rbt_manual_toggled |
| 右侧主状态栏 | rbt_manual | img_manual | mode_manual_inactive | 48 | theme-exact-png | [mode_manual_inactive.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/mode_manual_inactive.png) | [img_manual__mode_manual_inactive__48.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_manual__mode_manual_inactive__48.png) | enter manual mode to jog axis by hand or touch off / [F3] |
| 右侧主状态栏 | rbt_mdi<br>MDI 已选中<br>`active` | img_mdi_on | mode_mdi_active | 48 | theme-exact-png | [mode_mdi_active.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/mode_mdi_active.png) | [img_mdi_on__mode_mdi_active__48.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_mdi_on__mode_mdi_active__48.png) | on_rbt_mdi_toggled |
| 右侧主状态栏 | rbt_mdi | img_mdi | mode_mdi_inactive | 48 | theme-exact-png | [mode_mdi_inactive.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/mode_mdi_inactive.png) | [img_mdi__mode_mdi_inactive__48.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_mdi__mode_mdi_inactive__48.png) | enter MDI mode to launch G-code commands / [F5] |
| 右侧主状态栏 | tbtn_estop<br>急停复位/非急停<br>`STATE_ESTOP_RESET` | img_emergency_off | main_switch_off | 48 | theme-exact-png | [main_switch_off.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/main_switch_off.png) | [img_emergency_off__main_switch_off__48.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_emergency_off__main_switch_off__48.png) | on_hal_status_state_estop_reset |
| 右侧主状态栏 | tbtn_estop | img_emergency | main_switch_on | 48 | theme-exact-png | [main_switch_on.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/main_switch_on.png) | [img_emergency__main_switch_on__48.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_emergency__main_switch_on__48.png) | Estop the machine / [F1] |
| 右侧主状态栏 | tbtn_on<br>上电<br>`STATE_ON` | img_machine_on | power_on | 48 | theme-exact-png | [power_on.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/power_on.png) | [img_machine_on__power_on__48.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_machine_on__power_on__48.png) | on_hal_status_state_on |
| 右侧主状态栏 | tbtn_on | img_machine_off | power_off | 48 | theme-exact-png | [power_off.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/power_off.png) | [img_machine_off__power_off__48.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_machine_off__power_off__48.png) | Turn the machine on/off / [F2] |
| 右侧主状态栏 | tbtn_setup<br>设置页已进入<br>`active/unlocked` | img_settings_on | mode_settings_active | 48 | theme-exact-png | [mode_settings_active.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/mode_settings_active.png) | [img_settings_on__mode_settings_active__48.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_settings_on__mode_settings_active__48.png) | on_tbtn_setup_toggled |
| 右侧主状态栏 | tbtn_setup | img_settings | mode_settings_inactive | 48 | theme-exact-png | [mode_settings_inactive.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/mode_settings_inactive.png) | [img_settings__mode_settings_inactive__48.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_settings__mode_settings_inactive__48.png) | Enter the settings page, the default code is "123" |
| 右侧主状态栏 | tbtn_user_tabs<br>用户页已显示<br>`active` | img_user_tabs_on | mode_user_tabs_active | 48 | theme-exact-png | [mode_user_tabs_active.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/mode_user_tabs_active.png) | [img_user_tabs_on__mode_user_tabs_active__48.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_user_tabs_on__mode_user_tabs_active__48.png) | on_tbtn_user_tabs_toggled |
| 右侧主状态栏 | tbtn_user_tabs | img_user_tabs | mode_user_tabs_inactive | 48 | theme-exact-png | [mode_user_tabs_inactive.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/mode_user_tabs_inactive.png) | [img_user_tabs__mode_user_tabs_inactive__48.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_user_tabs__mode_user_tabs_inactive__48.png) | show user tabs |
| 底部主按钮栏 | btn_exit | img_close | logout | 48 | theme-exact-png | [logout.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/logout.png) | [img_close__logout__48.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_close__logout__48.png) | Close gmoccapy / leave the program |
| 底部主按钮栏 | btn_homing | img_ref_menu | ref_all | 48 | theme-exact-png | [ref_all.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/ref_all.png) | [img_ref_menu__ref_all__48.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_ref_menu__ref_all__48.png) | open homing button list |
| 底部主按钮栏 | btn_tool | img_tools | hsk_mill_tool | 48 | theme-exact-png | [hsk_mill_tool.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/hsk_mill_tool.png) | [img_tools__hsk_mill_tool__48.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_tools__hsk_mill_tool__48.png) | Open the tooleditor page |
| 底部主按钮栏 | btn_touch | img_touch_off | touch_off | 48 | theme-exact-png | [touch_off.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/touch_off.png) | [img_touch_off__touch_off__48.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_touch_off__touch_off__48.png) | open touch off button list |
| 底部主按钮栏 | tbtn_fullsize_preview0<br>退出大预览<br>`fullscreen active` | img_fullsize_preview0_close | fullscreen_close | 48 | theme-exact-png | [fullscreen_close.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/fullscreen_close.png) | [img_fullsize_preview0_close__fullscreen_close__48.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_fullsize_preview0_close__fullscreen_close__48.png) | on_tbtn_fullsize_preview_toggled |
| 底部主按钮栏 | tbtn_fullsize_preview0 | img_fullsize_preview0_open | fullscreen_open | 48 | theme-exact-png | [fullscreen_open.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/fullscreen_open.png) | [img_fullsize_preview0_open__fullscreen_open__48.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_fullsize_preview0_open__fullscreen_open__48.png) | make the preview as large as possible |
| 底部主按钮栏 | tbtn_switch_mode<br>World / Mode | | | | none | | | Switch motion mode between Joint and World mode / F12 or $ key does the same |
| Auto 程序运行栏 | btn_edit | img_editor | edit_code | 32 | theme-nearest-png | [edit_code.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/edit_code.png) | [img_editor__edit_code__32.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_editor__edit_code__32.png) | Edit the loaded program |
| Auto 程序运行栏 | btn_from_line | img_run_from | run_from_line | 48 | theme-exact-png | [run_from_line.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/run_from_line.png) | [img_run_from__run_from_line__48.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_run_from__run_from_line__48.png) | run the program from a certain line, attention, that is dangerous, because the previous lines will not checked! |
| Auto 程序运行栏 | btn_load | img_open | open_file | 32 | theme-svg | [open_file.svg](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/scalable/actions/open_file.svg) | [img_open__open_file__32.svg](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_open__open_file__32.svg) | Load a new program |
| Auto 程序运行栏 | btn_reload | img_reload1 | refresh | 32 | theme-nearest-png | [refresh.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/refresh.png) | [img_reload1__refresh__32.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_reload1__refresh__32.png) | Reload file |
| Auto 程序运行栏 | btn_run | img_run | play | 32 | theme-nearest-png | [play.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/play.png) | [img_run__play__32.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_run__play__32.png) | Run the loaded program |
| Auto 程序运行栏 | btn_step | img_step | step | 32 | theme-nearest-png | [step.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/step.png) | [img_step__step__32.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_step__step__32.png) | Run the loaded program step by step |
| Auto 程序运行栏 | btn_stop | img_stop | stop | 32 | theme-nearest-png | [stop.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/stop.png) | [img_stop__stop__32.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_stop__stop__32.png) | Stop the running program |
| Auto 程序运行栏 | tbtn_fullsize_preview1<br>退出大预览<br>`fullscreen active` | img_fullsize_preview1_close | fullscreen_close | 48 | theme-exact-png | [fullscreen_close.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/fullscreen_close.png) | [img_fullsize_preview1_close__fullscreen_close__48.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_fullsize_preview1_close__fullscreen_close__48.png) | on_tbtn_fullsize_preview_toggled |
| Auto 程序运行栏 | tbtn_fullsize_preview1 | img_fullsize_preview1_open | fullscreen_open | 48 | theme-exact-png | [fullscreen_open.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/fullscreen_open.png) | [img_fullsize_preview1_open__fullscreen_open__48.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_fullsize_preview1_open__fullscreen_open__48.png) | Show full screen preview |
| Auto 程序运行栏 | tbtn_optional_blocks<br>跳过可选段<br>`block delete active` | img_skip_optional_active | skip_optional_active | 32 | theme-exact-png | [skip_optional_active.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/32x32/actions/skip_optional_active.png) | [img_skip_optional_active__skip_optional_active__32.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_skip_optional_active__skip_optional_active__32.png) | on_tbtn_optional_blocks_toggled |
| Auto 程序运行栏 | tbtn_optional_blocks | img_skip_optional_inactive | skip_optional_inactive | 32 | theme-exact-png | [skip_optional_inactive.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/32x32/actions/skip_optional_inactive.png) | [img_skip_optional_inactive__skip_optional_inactive__32.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_skip_optional_inactive__skip_optional_inactive__32.png) | Machine or not the optional blocks of the program. If the button is pressed, the optional blocks will not be machined. The button will indicate this by a yellow background. |
| Auto 程序运行栏 | tbtn_pause<br>暂停中<br>`paused` | img_pause_active | pause_active | 32 | theme-nearest-png | [pause_active.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/pause_active.png) | [img_pause_active__pause_active__32.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_pause_active__pause_active__32.png) | on_tbtn_pause_toggled |
| Auto 程序运行栏 | tbtn_pause | img_pause | pause | 32 | theme-nearest-png | [pause.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/pause.png) | [img_pause__pause__32.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_pause__pause__32.png) | Pause the running program |
| MDI/宏按钮栏 | calculator<br>计算器 | img_macro_menu_calculator | calculator_open | 32 | theme-exact-png | [calculator_open.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/32x32/actions/calculator_open.png) | [img_macro_menu_calculator__calculator_open__32.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_macro_menu_calculator__calculator_open__32.png) | _make_macro_button |
| MDI/宏按钮栏 | keyboard<br>隐藏虚拟键盘<br>`keyboard shown` | img_macro_menu_keyboard_hide | keyboard_hide | 32 | theme-nearest-png | [keyboard_hide.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/keyboard_hide.png) | [img_macro_menu_keyboard_hide__keyboard_hide__32.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_macro_menu_keyboard_hide__keyboard_hide__32.png) | on_ntb_info_switch_page |
| MDI/宏按钮栏 | keyboard<br>中止运行宏/程序<br>`program/macro running or no keyboard` | img_macro_menu_stop | stop | 32 | theme-nearest-png | [stop.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/stop.png) | [img_macro_menu_stop__stop__32.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_macro_menu_stop__stop__32.png) | on_hal_status_interp_run/_no_virt_keyboard |
| MDI/宏按钮栏 | keyboard<br>虚拟键盘 | img_macro_menu_keyboard | keyboard | 32 | theme-nearest-png | [keyboard.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/keyboard.png) | [img_macro_menu_keyboard__keyboard__32.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_macro_menu_keyboard__keyboard__32.png) | _make_macro_button |
| MDI/宏按钮栏 | macro_0<br>i_am_lost | | | | macro-custom-file | [i_am_lost.png](/home/meswork/cnc_wams/linuxcnc/configs/sim/gmoccapy/macros/images/i_am_lost.png) | [macro_0__macro_image.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/macro_0__macro_image.png) | 宏文件 IMAGE 自定义图片: /home/meswork/cnc_wams/linuxcnc/configs/sim/gmoccapy/macros/images/i_am_lost.png |
| MDI/宏按钮栏 | macro_1<br>halo_world | | | | none | | | 宏按钮使用文字,无图标 |
| MDI/宏按钮栏 | macro_2<br>jog_around | | | | none | | | 宏按钮使用文字,无图标 |
| MDI/宏按钮栏 | macro_3<br>increment | | | | none | | | 宏按钮使用文字,无图标 |
| MDI/宏按钮栏 | macro_4<br>go_to_position | | | | macro-custom-file | [goto_x_y_z.png](/home/meswork/cnc_wams/linuxcnc/configs/sim/gmoccapy/macros/images/goto_x_y_z.png) | [macro_4__macro_image.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/macro_4__macro_image.png) | 宏文件 IMAGE 自定义图片: /home/meswork/cnc_wams/linuxcnc/configs/sim/gmoccapy/macros/images/goto_x_y_z.png |
| MDI/宏按钮栏 | next_button<br>下一组宏按钮 | img_macro_paginate_next | go-next | | gtk-icon-name-not-copied | GTK/system icon theme | | 当前宏数 5小于 7默认隐藏; 未在 gmoccapy classic 主题中固定解析,运行时由 GTK/system icon theme 决定 |
| MDI/宏按钮栏 | previous_button<br>上一组宏按钮 | img_macro_paginate_prev | go-previous | | gtk-icon-name-not-copied | GTK/system icon theme | | 当前宏数 5小于 7默认隐藏; 未在 gmoccapy classic 主题中固定解析,运行时由 GTK/system icon theme 决定 |
| 回零按钮栏 | home_axis_a<br>回零 A 轴 | img_ref_a | ref_a | 48 | theme-exact-png | [ref_a.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/ref_a.png) | [img_ref_a__ref_a__48.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_ref_a__ref_a__48.png) | 当前 XYZAB 生成 |
| 回零按钮栏 | home_axis_b<br>回零 B 轴 | img_ref_b | ref_b | 48 | theme-exact-png | [ref_b.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/ref_b.png) | [img_ref_b__ref_b__48.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_ref_b__ref_b__48.png) | 当前 XYZAB 生成 |
| 回零按钮栏 | home_axis_x<br>回零 X 轴 | img_ref_x | ref_x | 48 | theme-exact-png | [ref_x.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/ref_x.png) | [img_ref_x__ref_x__48.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_ref_x__ref_x__48.png) | 当前 XYZAB 生成 |
| 回零按钮栏 | home_axis_y<br>回零 Y 轴 | img_ref_y | ref_y | 48 | theme-exact-png | [ref_y.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/ref_y.png) | [img_ref_y__ref_y__48.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_ref_y__ref_y__48.png) | 当前 XYZAB 生成 |
| 回零按钮栏 | home_axis_z<br>回零 Z 轴 | img_ref_z | ref_z | 48 | theme-exact-png | [ref_z.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/ref_z.png) | [img_ref_z__ref_z__48.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_ref_z__ref_z__48.png) | 当前 XYZAB 生成 |
| 回零按钮栏 | home_back<br>返回主按钮栏 | img_ref_menu_close | back_to_app | 48 | theme-svg | [back_to_app.svg](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/scalable/actions/back_to_app.svg) | [img_ref_menu_close__back_to_app__48.svg](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_ref_menu_close__back_to_app__48.svg) | _make_ref_axis_button |
| 回零按钮栏 | next_button<br>下一组回零按钮 | img_ref_paginate_next | chevron_right | 32 | theme-svg | [chevron_right.svg](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/scalable/actions/chevron_right.svg) | [img_ref_paginate_next__chevron_right__32.svg](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_ref_paginate_next__chevron_right__32.svg) | 仅轴数大于 7 时显示 |
| 回零按钮栏 | previous_button<br>上一组回零按钮 | img_ref_paginate_prev | chevron_left | 32 | theme-svg | [chevron_left.svg](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/scalable/actions/chevron_left.svg) | [img_ref_paginate_prev__chevron_left__32.svg](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_ref_paginate_prev__chevron_left__32.svg) | 仅轴数大于 7 时显示 |
| 回零按钮栏 | ref_all<br>回零全部轴 | img_ref_all | ref_all | 48 | theme-exact-png | [ref_all.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/ref_all.png) | [img_ref_all__ref_all__48.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_ref_all__ref_all__48.png) | _make_ref_axis_button |
| 回零按钮栏 | unref_all<br>取消全部回零 | img_unref_all | unref_all | 48 | theme-exact-png | [unref_all.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/unref_all.png) | [img_unref_all__unref_all__48.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_unref_all__unref_all__48.png) | _make_ref_axis_button |
| 对刀/坐标设定按钮栏 | block_height<br>Block Height | | | | none | | | 仅 [TOOLSENSOR] 有效时出现;本配置默认不出现 |
| 对刀/坐标设定按钮栏 | next_button<br>下一组 Touch Off 按钮 | img_touch_paginate_next | chevron_right | 32 | theme-svg | [chevron_right.svg](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/scalable/actions/chevron_right.svg) | [img_touch_paginate_next__chevron_right__32.svg](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_touch_paginate_next__chevron_right__32.svg) | 仅按钮过多时显示 |
| 对刀/坐标设定按钮栏 | previous_button<br>上一组 Touch Off 按钮 | img_touch_paginate_prev | chevron_left | 32 | theme-svg | [chevron_left.svg](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/scalable/actions/chevron_left.svg) | [img_touch_paginate_prev__chevron_left__32.svg](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_touch_paginate_prev__chevron_left__32.svg) | 仅轴数大于 8 时显示 |
| 对刀/坐标设定按钮栏 | touch_a<br>A 轴 Touch Off | img_touch_a | touch_a | 48 | theme-exact-png | [touch_a.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/touch_a.png) | [img_touch_a__touch_a__48.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_touch_a__touch_a__48.png) | 当前 XYZAB 生成 |
| 对刀/坐标设定按钮栏 | touch_b<br>B 轴 Touch Off | img_touch_b | touch_b | 48 | theme-exact-png | [touch_b.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/touch_b.png) | [img_touch_b__touch_b__48.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_touch_b__touch_b__48.png) | 当前 XYZAB 生成 |
| 对刀/坐标设定按钮栏 | touch_back<br>返回主按钮栏 | img_touch_menu_close | back_to_app | 48 | theme-svg | [back_to_app.svg](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/scalable/actions/back_to_app.svg) | [img_touch_menu_close__back_to_app__48.svg](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_touch_menu_close__back_to_app__48.svg) | _make_touch_button |
| 对刀/坐标设定按钮栏 | touch_x<br>X 轴 Touch Off | img_touch_x | touch_x | 48 | theme-exact-png | [touch_x.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/touch_x.png) | [img_touch_x__touch_x__48.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_touch_x__touch_x__48.png) | 当前 XYZAB 生成 |
| 对刀/坐标设定按钮栏 | touch_y<br>Y 轴 Touch Off | img_touch_y | touch_y | 48 | theme-exact-png | [touch_y.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/touch_y.png) | [img_touch_y__touch_y__48.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_touch_y__touch_y__48.png) | 当前 XYZAB 生成 |
| 对刀/坐标设定按钮栏 | touch_z<br>Z 轴 Touch Off | img_touch_z | touch_z | 48 | theme-exact-png | [touch_z.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/touch_z.png) | [img_touch_z__touch_z__48.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_touch_z__touch_z__48.png) | 当前 XYZAB 生成 |
| 手动/Jog 面板 | chk_ignore_limits<br>Ignore limits | | | | none | | | toggled:on_chk_ignore_limits_toggled |
| 手动/Jog 面板 | tbtn_turtle_jog<br>慢速 Jog<br>`active` | img_turtle_jog | jog_speed_slow | 32 | theme-exact-png | [jog_speed_slow.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/32x32/actions/jog_speed_slow.png) | [img_turtle_jog__jog_speed_slow__32.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_turtle_jog__jog_speed_slow__32.png) | on_tbtn_turtle_jog_toggled |
| 手动/Jog 面板 | tbtn_turtle_jog<br>快速 Jog<br>`inactive` | img_rabbit_jog | jog_speed_fast | 32 | theme-exact-png | [jog_speed_fast.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/32x32/actions/jog_speed_fast.png) | [img_rabbit_jog__jog_speed_fast__32.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_rabbit_jog__jog_speed_fast__32.png) | on_tbtn_turtle_jog_toggled |
| 手动/Jog 面板 | tbtn_turtle_jog | img_rabbit_jog | jog_speed_fast | 32 | theme-exact-png | [jog_speed_fast.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/32x32/actions/jog_speed_fast.png) | [img_rabbit_jog__jog_speed_fast__32.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_rabbit_jog__jog_speed_fast__32.png) | toggled:on_tbtn_turtle_jog_toggled |
| Jog 增量选择栏 | rbt_0<br>Continuous | img_continuous | jog_continuous | 24 | theme-exact-png | [jog_continuous.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/24x24/actions/jog_continuous.png) | [img_continuous__jog_continuous__24.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_continuous__jog_continuous__24.png) | 连续 Jog 唯一带图标 |
| Jog 增量选择栏 | rbt_1<br>1.000 mm | | | | none | | | 增量按钮使用文字,无图标 |
| Jog 增量选择栏 | rbt_2<br>0.100 mm | | | | none | | | 增量按钮使用文字,无图标 |
| Jog 增量选择栏 | rbt_3<br>0.010 mm | | | | none | | | 增量按钮使用文字,无图标 |
| Jog 增量选择栏 | rbt_4<br>0.001 mm | | | | none | | | 增量按钮使用文字,无图标 |
| Jog 增量选择栏 | rbt_5<br>1.2345 in | | | | none | | | 增量按钮使用文字,无图标 |
| Jog 轴按钮 | a+<br>A+ | | | | none | | | 轴 Jog 按钮使用文字,无图标 |
| Jog 轴按钮 | a-<br>A- | | | | none | | | 轴 Jog 按钮使用文字,无图标 |
| Jog 轴按钮 | b+<br>B+ | | | | none | | | 轴 Jog 按钮使用文字,无图标 |
| Jog 轴按钮 | b-<br>B- | | | | none | | | 轴 Jog 按钮使用文字,无图标 |
| Jog 轴按钮 | x+<br>X+ | | | | none | | | 轴 Jog 按钮使用文字,无图标 |
| Jog 轴按钮 | x-<br>X- | | | | none | | | 轴 Jog 按钮使用文字,无图标 |
| Jog 轴按钮 | y+<br>Y+ | | | | none | | | 轴 Jog 按钮使用文字,无图标 |
| Jog 轴按钮 | y-<br>Y- | | | | none | | | 轴 Jog 按钮使用文字,无图标 |
| Jog 轴按钮 | z+<br>Z+ | | | | none | | | 轴 Jog 按钮使用文字,无图标 |
| Jog 轴按钮 | z-<br>Z- | | | | none | | | 轴 Jog 按钮使用文字,无图标 |
| Jog 关节按钮 | 0+<br>0+ | | | | none | | | trivial kinematics 时不创建;非平凡运动学才出现 |
| Jog 关节按钮 | 0-<br>0- | | | | none | | | trivial kinematics 时不创建;非平凡运动学才出现 |
| Jog 关节按钮 | 1+<br>1+ | | | | none | | | trivial kinematics 时不创建;非平凡运动学才出现 |
| Jog 关节按钮 | 1-<br>1- | | | | none | | | trivial kinematics 时不创建;非平凡运动学才出现 |
| Jog 关节按钮 | 2+<br>2+ | | | | none | | | trivial kinematics 时不创建;非平凡运动学才出现 |
| Jog 关节按钮 | 2-<br>2- | | | | none | | | trivial kinematics 时不创建;非平凡运动学才出现 |
| Jog 关节按钮 | 3+<br>3+ | | | | none | | | trivial kinematics 时不创建;非平凡运动学才出现 |
| Jog 关节按钮 | 3-<br>3- | | | | none | | | trivial kinematics 时不创建;非平凡运动学才出现 |
| Jog 关节按钮 | 4+<br>4+ | | | | none | | | trivial kinematics 时不创建;非平凡运动学才出现 |
| Jog 关节按钮 | 4-<br>4- | | | | none | | | trivial kinematics 时不创建;非平凡运动学才出现 |
| 冷却/主轴控制 | rbt_forward<br>主轴正转中<br>`active` | img_spindle_forward_on | spindle_right_on | 48 | theme-exact-png | [spindle_right_on.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/spindle_right_on.png) | [img_spindle_forward_on__spindle_right_on__48.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_spindle_forward_on__spindle_right_on__48.png) | on_rbt_forward_released/clicked |
| 冷却/主轴控制 | rbt_forward | img_spindle_forward | spindle_right | 48 | theme-exact-png | [spindle_right.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/spindle_right.png) | [img_spindle_forward__spindle_right__48.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_spindle_forward__spindle_right__48.png) | clicked:on_rbt_forward_clicked; released:on_rbt_forward_released |
| 冷却/主轴控制 | rbt_reverse<br>主轴反转中<br>`active` | img_spindle_reverse_on | spindle_left_on | 48 | theme-exact-png | [spindle_left_on.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/spindle_left_on.png) | [img_spindle_reverse_on__spindle_left_on__48.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_spindle_reverse_on__spindle_left_on__48.png) | on_rbt_reverse_released/clicked |
| 冷却/主轴控制 | rbt_reverse | img_spindle_reverse | spindle_left | 48 | theme-exact-png | [spindle_left.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/spindle_left.png) | [img_spindle_reverse__spindle_left__48.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_spindle_reverse__spindle_left__48.png) | clicked:on_rbt_reverse_clicked; released:on_rbt_reverse_released |
| 冷却/主轴控制 | rbt_stop<br>主轴停止已选中<br>`active` | img_spindle_stop_on | spindle_stop_on | 48 | theme-exact-png | [spindle_stop_on.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/spindle_stop_on.png) | [img_spindle_stop_on__spindle_stop_on__48.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_spindle_stop_on__spindle_stop_on__48.png) | on_rbt_stop_clicked |
| 冷却/主轴控制 | rbt_stop<br>主轴停止未选中<br>`inactive` | img_spindle_stop | spindle_stop | 48 | theme-exact-png | [spindle_stop.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/spindle_stop.png) | [img_spindle_stop__spindle_stop__48.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_spindle_stop__spindle_stop__48.png) | on_rbt_stop_clicked: widget inactive 时切回停止普通图标 |
| 冷却/主轴控制 | rbt_stop | img_spindle_stop_on | spindle_stop_on | 48 | theme-exact-png | [spindle_stop_on.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/spindle_stop_on.png) | [img_spindle_stop_on__spindle_stop_on__48.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_spindle_stop_on__spindle_stop_on__48.png) | clicked:on_rbt_stop_clicked |
| 冷却/主轴控制 | tbtn_flood<br>冷却液开<br>`active` | img_coolant_on | coolant_flood_active | 48 | theme-exact-png | [coolant_flood_active.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/coolant_flood_active.png) | [img_coolant_on__coolant_flood_active__48.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_coolant_on__coolant_flood_active__48.png) | on_hal_status_flood_changed |
| 冷却/主轴控制 | tbtn_flood | img_coolant_off | coolant_flood_inactive | 48 | theme-exact-png | [coolant_flood_inactive.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/coolant_flood_inactive.png) | [img_coolant_off__coolant_flood_inactive__48.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_coolant_off__coolant_flood_inactive__48.png) | toggled:on_tbtn_flood_toggled |
| 冷却/主轴控制 | tbtn_mist<br>雾冷开<br>`active` | img_mist_on | coolant_mist_active | 48 | theme-exact-png | [coolant_mist_active.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/coolant_mist_active.png) | [img_mist_on__coolant_mist_active__48.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_mist_on__coolant_mist_active__48.png) | on_hal_status_mist_changed |
| 冷却/主轴控制 | tbtn_mist | img_mist_off | coolant_mist_inactive | 48 | theme-exact-png | [coolant_mist_inactive.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/coolant_mist_inactive.png) | [img_mist_off__coolant_mist_inactive__48.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_mist_off__coolant_mist_inactive__48.png) | toggled:on_tbtn_mist_toggled |
| 预览/视图 | btn_delete_view | img_tool_clear | clear | 24 | theme-nearest-png | [clear.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/32x32/actions/clear.png) | [img_tool_clear__clear__24.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_tool_clear__clear__24.png) | clear plot |
| 预览/视图 | btn_zoom_in | img_zoom_in | zoom_in | 24 | theme-nearest-png | [zoom_in.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/32x32/actions/zoom_in.png) | [img_zoom_in__zoom_in__24.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_zoom_in__zoom_in__24.png) | Zoom in |
| 预览/视图 | btn_zoom_out | img_zoom_out | zoom_out | 24 | theme-nearest-png | [zoom_out.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/32x32/actions/zoom_out.png) | [img_zoom_out__zoom_out__24.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_zoom_out__zoom_out__24.png) | Zoom out |
| 预览/视图 | rbt_view_p | img_view_p | tool_axis_p | 24 | theme-exact-png | [tool_axis_p.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/24x24/actions/tool_axis_p.png) | [img_view_p__tool_axis_p__24.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_view_p__tool_axis_p__24.png) | view perspective |
| 预览/视图 | rbt_view_x | img_view_x | tool_axis_x | 24 | theme-exact-png | [tool_axis_x.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/24x24/actions/tool_axis_x.png) | [img_view_x__tool_axis_x__24.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_view_x__tool_axis_x__24.png) | view along the X axis from positive to negative |
| 预览/视图 | rbt_view_y | img_view_y | tool_axis_y | 24 | theme-exact-png | [tool_axis_y.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/24x24/actions/tool_axis_y.png) | [img_view_y__tool_axis_y__24.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_view_y__tool_axis_y__24.png) | view along the Y axis from positive to negative |
| 预览/视图 | rbt_view_y2 | img_view_y2 | tool_axis_y_inv | 24 | theme-exact-png | [tool_axis_y_inv.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/24x24/actions/tool_axis_y_inv.png) | [img_view_y2__tool_axis_y_inv__24.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_view_y2__tool_axis_y_inv__24.png) | view along the Y axis from positive to negative as viewn for a back tool lathe |
| 预览/视图 | rbt_view_z | img_view_z | tool_axis_z | 24 | theme-exact-png | [tool_axis_z.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/24x24/actions/tool_axis_z.png) | [img_view_z__tool_axis_z__24.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_view_z__tool_axis_z__24.png) | view along the Z axis from positive to negative |
| 预览/视图 | tbtn_view_dimension | img_dimensions | dimensions | 24 | theme-nearest-png | [dimensions.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/32x32/actions/dimensions.png) | [img_dimensions__dimensions__24.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_dimensions__dimensions__24.png) | Show or hide dimensions |
| 预览/视图 | tbtn_view_tool_path | img_tool_path | toolpath | 24 | theme-exact-png | [toolpath.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/24x24/actions/toolpath.png) | [img_tool_path__toolpath__24.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_tool_path__toolpath__24.png) | Show or hide tool path |
| 编辑器搜索/编辑 | btn_comment | img_edit_comment | comment | 32 | theme-exact-png | [comment.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/32x32/actions/comment.png) | [img_edit_comment__comment__32.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_edit_comment__comment__32.png) | clicked:on_btn_toggle_comment_clicked |
| 编辑器搜索/编辑 | btn_redo | img_edit-redo | edit_redo | 32 | theme-exact-png | [edit_redo.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/32x32/actions/edit_redo.png) | [img_edit-redo__edit_redo__32.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_edit-redo__edit_redo__32.png) | Redo |
| 编辑器搜索/编辑 | btn_replace<br>Replace | | | | none | | | clicked:on_btn_replace_clicked |
| 编辑器搜索/编辑 | btn_search_back<br>Search / back | img_up | chevron_up | 24 | theme-svg | [chevron_up.svg](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/scalable/actions/chevron_up.svg) | [img_up__chevron_up__24.svg](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_up__chevron_up__24.svg) | clicked:on_btn_search_back_clicked |
| 编辑器搜索/编辑 | btn_search_forward<br>Search / fwd | img_down | chevron_down | 24 | theme-svg | [chevron_down.svg](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/scalable/actions/chevron_down.svg) | [img_down__chevron_down__24.svg](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_down__chevron_down__24.svg) | clicked:on_btn_search_forward_clicked |
| 编辑器搜索/编辑 | btn_undo | img_edit-undo | edit_undo | 32 | theme-exact-png | [edit_undo.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/32x32/actions/edit_undo.png) | [img_edit-undo__edit_undo__32.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_edit-undo__edit_undo__32.png) | Undo |
| 编辑器搜索/编辑 | chk_ignore_case<br>Ignore Case | | | | none | | | |
| 编辑器搜索/编辑 | chk_replace_all<br>Replace All | | | | none | | | |
| 编辑页底部栏 | btn_back_edit | img_edit_menu_close | back_to_app | 48 | theme-svg | [back_to_app.svg](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/scalable/actions/back_to_app.svg) | [img_edit_menu_close__back_to_app__48.svg](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_edit_menu_close__back_to_app__48.svg) | Go back to main button list |
| 编辑页底部栏 | btn_calc | img_edit_menu_calculator | calculator_open | 32 | theme-exact-png | [calculator_open.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/32x32/actions/calculator_open.png) | [img_edit_menu_calculator__calculator_open__32.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_edit_menu_calculator__calculator_open__32.png) | Show calculator |
| 编辑页底部栏 | btn_keyb<br>隐藏虚拟键盘<br>`keyboard shown` | img_edit_menu_keyboard_hide | keyboard_hide | 32 | theme-nearest-png | [keyboard_hide.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/keyboard_hide.png) | [img_edit_menu_keyboard_hide__keyboard_hide__32.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_edit_menu_keyboard_hide__keyboard_hide__32.png) | on_ntb_info_switch_page |
| 编辑页底部栏 | btn_keyb | img_edit_menu_keyboard | keyboard | 32 | theme-nearest-png | [keyboard.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/keyboard.png) | [img_edit_menu_keyboard__keyboard__32.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_edit_menu_keyboard__keyboard__32.png) | Show or hide the virtual keyboard |
| 编辑页底部栏 | btn_new | img_edit_menu_new | new_document | 32 | theme-svg | [new_document.svg](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/scalable/actions/new_document.svg) | [img_edit_menu_new__new_document__32.svg](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_edit_menu_new__new_document__32.svg) | clear the edit field and make a new file |
| 编辑页底部栏 | btn_reload_edit | img_edit_menu_reload | refresh | 32 | theme-nearest-png | [refresh.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/refresh.png) | [img_edit_menu_reload__refresh__32.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_edit_menu_reload__refresh__32.png) | Reload file |
| 编辑页底部栏 | btn_save | img_edit_menu_save | save | 32 | theme-nearest-png | [save.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/save.png) | [img_edit_menu_save__save__32.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_edit_menu_save__save__32.png) | save the file using the original name |
| 编辑页底部栏 | btn_save_as | img_edit_menu_save_as | save_as | 32 | theme-nearest-png | [save_as.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/save_as.png) | [img_edit_menu_save_as__save_as__32.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_edit_menu_save_as__save_as__32.png) | save the file with a new name |
| 编辑页底部栏 | tbtn_split_view | img_split_view | split_view | 32 | theme-exact-png | [split_view.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/32x32/actions/split_view.png) | [img_split_view__split_view__32.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_split_view__split_view__32.png) | Show preview as split view |
| 刀具页底部栏 | btn_back_tool | img_back_tool | back_to_app | 48 | theme-svg | [back_to_app.svg](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/scalable/actions/back_to_app.svg) | [img_back_tool__back_to_app__48.svg](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_back_tool__back_to_app__48.svg) | Go back to main button list |
| 刀具页底部栏 | btn_change_tool | img_toolchange | mill_tool_change | 48 | theme-exact-png | [mill_tool_change.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/mill_tool_change.png) | [img_toolchange__mill_tool_change__48.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_toolchange__mill_tool_change__48.png) | change tool to the selected one |
| 刀具页底部栏 | btn_index_tool | img_index_tool | mill_tool_set_num | 48 | theme-svg | [mill_tool_set_num.svg](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/scalable/actions/mill_tool_set_num.svg) | [img_index_tool__mill_tool_set_num__48.svg](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_index_tool__mill_tool_set_num__48.svg) | change tool with the command M61 Q?, no machine move will be done |
| 刀具页底部栏 | btn_select_tool_by_no | img_tool_by_no | mill_tool_change_num | 48 | theme-svg | [mill_tool_change_num.svg](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/scalable/actions/mill_tool_change_num.svg) | [img_tool_by_no__mill_tool_change_num__48.svg](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_tool_by_no__mill_tool_change_num__48.svg) | Select a tool by number |
| 刀具页底部栏 | btn_tool_touchoff_x | | | | none | | | touch off the tool and set the value to the tool table |
| 刀具页底部栏 | btn_tool_touchoff_z | | | | none | | | touch off the tool and set the value to the tool table |
| 文件选择栏 | btn_back_file_load | img_back_file_load | back_to_app | 48 | theme-svg | [back_to_app.svg](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/scalable/actions/back_to_app.svg) | [img_back_file_load__back_to_app__48.svg](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_back_file_load__back_to_app__48.svg) | Close without returning a file path |
| 文件选择栏 | btn_dir_up | img_dir_up | chevron_up | 32 | theme-svg | [chevron_up.svg](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/scalable/actions/chevron_up.svg) | [img_dir_up__chevron_up__32.svg](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_dir_up__chevron_up__32.svg) | Move to parent directory |
| 文件选择栏 | btn_home | img_home | home_folder | 32 | theme-svg | [home_folder.svg](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/scalable/actions/home_folder.svg) | [img_home__home_folder__32.svg](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_home__home_folder__32.svg) | Move to your home directory |
| 文件选择栏 | btn_jump_to | img_jump_to | user_defined_folder | 32 | theme-svg | [user_defined_folder.svg](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/scalable/actions/user_defined_folder.svg) | [img_jump_to__user_defined_folder__32.svg](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_jump_to__user_defined_folder__32.svg) | Jump to user defined directory |
| 文件选择栏 | btn_reload_dir | img_refresh_dir | refresh | 32 | theme-nearest-png | [refresh.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/refresh.png) | [img_refresh_dir__refresh__32.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_refresh_dir__refresh__32.png) | Refresh directory |
| 文件选择栏 | btn_sel_next | img_sel_next | chevron_right | 32 | theme-svg | [chevron_right.svg](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/scalable/actions/chevron_right.svg) | [img_sel_next__chevron_right__32.svg](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_sel_next__chevron_right__32.svg) | Select the next file |
| 文件选择栏 | btn_sel_prev | img_sel_prev | chevron_left | 32 | theme-svg | [chevron_left.svg](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/scalable/actions/chevron_left.svg) | [img_sel_prev__chevron_left__32.svg](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_sel_prev__chevron_left__32.svg) | Select the previous file |
| 文件选择栏 | btn_select | img_select | select_file | 32 | theme-nearest-png | [select_file.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/select_file.png) | [img_select__select_file__32.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_select__select_file__32.png) | select the highlighted file and return the path |
| 文件选择栏 | tbtn_sort<br>Sort by / date | | | | none | | | Sort files by date, newest first |
| 内嵌 ToolEdit 控件 | tooldedit.add<br>新增刀具 | img_tool_add | add | 32 | theme-exact-png | [add.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/32x32/actions/add.png) | [img_tool_add__add__32.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_tool_add__add__32.png) | Python 改造 ToolEdit |
| 内嵌 ToolEdit 控件 | tooldedit.apply<br>保存刀具表 | img_tool_save | save | 32 | theme-nearest-png | [save.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/save.png) | [img_tool_save__save__32.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_tool_save__save__32.png) | Python 改造 ToolEdit |
| 内嵌 ToolEdit 控件 | tooldedit.calculator<br>刀具表计算器 | img_tool_calculator | calculator_open | 32 | theme-exact-png | [calculator_open.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/32x32/actions/calculator_open.png) | [img_tool_calculator__calculator_open__32.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_tool_calculator__calculator_open__32.png) | Python 改造 ToolEdit |
| 内嵌 ToolEdit 控件 | tooldedit.delete<br>删除选中刀具 | img_tool_delete | delete | 32 | theme-exact-png | [delete.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/32x32/actions/delete.png) | [img_tool_delete__delete__32.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_tool_delete__delete__32.png) | Python 改造 ToolEdit |
| 内嵌 ToolEdit 控件 | tooldedit.reload<br>重载刀具表 | img_tool_reload | refresh | 32 | theme-nearest-png | [refresh.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/48x48/actions/refresh.png) | [img_tool_reload__refresh__32.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_tool_reload__refresh__32.png) | Python 改造 ToolEdit |
| 内嵌 OffsetPage 控件 | offsetpage.calculator<br>坐标偏置计算器 | img_offset_calculator | calculator_open | 32 | theme-exact-png | [calculator_open.png](/home/meswork/cnc_wams/linuxcnc/share/gmoccapy/icons/classic/32x32/actions/calculator_open.png) | [img_offset_calculator__calculator_open__32.png](/home/meswork/cnc_wams/work/working3/gmoccapy_button_icons/files/img_offset_calculator__calculator_open__32.png) | Python 改造 OffsetPage |
| 内嵌 OffsetPage 控件 | offsetpage.edit_offsets<br>Edit Offsets | | | | none | | | 内嵌控件文字按钮,无图标 |
| 内嵌 OffsetPage 控件 | offsetpage.set_selected<br>Set selected | | | | none | | | 内嵌控件文字按钮,无图标 |
| 内嵌 OffsetPage 控件 | offsetpage.zero_g92<br>Zero G92 | | | | none | | | 内嵌控件文字按钮,无图标 |
| 设置页控件 | abs_colorbutton | | | | none | | | color-set:on_abs_colorbutton_color_set |
| 设置页控件 | audio_alert_chooser | | | | none | | | file-set:on_change_sound |
| 设置页控件 | audio_error_chooser | | | | none | | | file-set:on_change_sound |
| 设置页控件 | chk_en_audio<br>Enable sound | | | | none | | | toggled:on_chk_en_audio_toggled |
| 设置页控件 | chk_font_monospace<br>Monospace | | | | none | | | toggled:on_chk_font_monospace_toggled |
| 设置页控件 | chk_font_regular<br>Regular/Medium | | | | none | | | toggled:on_chk_font_regular_toggled |
| 设置页控件 | chk_hide_cursor<br>Hide cursor | | | | none | | | toggled:on_chk_hide_cursor_toggled |
| 设置页控件 | chk_hide_tooltips<br>Hide tooltips | | | | none | | | toggled:on_chk_hide_tooltips_toggled |
| 设置页控件 | chk_kbd_set_height<br>Height | | | | none | | | toggled:on_chk_kb_set_height_toggled |
| 设置页控件 | chk_kbd_set_width<br>Width | | | | none | | | toggled:on_chk_kb_set_width_toggled |
| 设置页控件 | chk_reload_tool<br>Reload Tool on Start | | | | none | | | If checked, the tool in spindle / will be saved on each change / and the last tool will be reloaded / at start of the GUI. Also it's / length offset will be reloaded. |
| 设置页控件 | chk_show_dro<br>Show DRO | | | | none | | | toggled:on_chk_show_dro_toggled |
| 设置页控件 | chk_show_dtg<br>Show DTG | | | | none | | | toggled:on_chk_show_dtg_toggled |
| 设置页控件 | chk_show_offsets<br>Show offsets | | | | none | | | toggled:on_chk_show_offsets_toggled |
| 设置页控件 | chk_toggle_readout<br>Toggle DRO mode by / clicking on the DRO | | | | none | | | toggled:on_chk_toggle_readout_toggled |
| 设置页控件 | chk_turtle_jog<br>Hide turtle Jog Button | | | | none | | | toggled:on_chk_turtle_jog_toggled |
| 设置页控件 | chk_use_frames<br>Use frames | | | | none | | | If checked, the messages / will be in a frame. |
| 设置页控件 | chk_use_kb_on_edit<br>Show keyboard on EDIT | | | | none | | | toggled:on_chk_use_kb_on_edit_toggled |
| 设置页控件 | chk_use_kb_on_file_selection<br>Show keyboard on load file | | | | none | | | toggled:on_chk_use_kb_on_file_selection_toggled |
| 设置页控件 | chk_use_kb_on_mdi<br>Show keyboard on MDI | | | | none | | | toggled:on_chk_use_kb_on_mdi_toggled |
| 设置页控件 | chk_use_kb_on_offset<br>Show keyboard on offset | | | | none | | | toggled:on_chk_use_kb_on_offset_toggled |
| 设置页控件 | chk_use_kb_on_tooledit<br>Show keyboard on tooledit | | | | none | | | toggled:on_chk_use_kb_on_tooledit_toggled |
| 设置页控件 | chk_use_kb_shortcuts<br>Use keyboard shortcuts | | | | none | | | toggled:on_chk_use_kb_shortcuts_toggled |
| 设置页控件 | chk_use_tool_measurement<br>Use auto tool measurement | | | | none | | | toggled:on_chk_use_tool_measurement_toggled |
| 设置页控件 | dtg_colorbutton | | | | none | | | color-set:on_dtg_colorbutton_color_set |
| 设置页控件 | file_to_load_chooser | | | | none | | | file-set:on_file_to_load_chooser_file_set |
| 设置页控件 | fontbutton_gcodeview | | | | none | | | font-set:on_fontbutton_gcodeview_font_set |
| 设置页控件 | fontbutton_popup | | | | none | | | The font to use |
| 设置页控件 | homed_colorbtn | | | | none | | | color-set:on_homed_colorbtn_color_set |
| 设置页控件 | jump_to_dir_chooser | | | | none | | | file-set:on_jump_to_dir_chooser_file_set |
| 设置页控件 | rbt_hal_unlock<br>Use hal pin to unlock | | | | none | | | toggled:on_rbt_unlock_toggled |
| 设置页控件 | rbt_no_unlock<br>Do not use unlock code | | | | none | | | toggled:on_rbt_unlock_toggled |
| 设置页控件 | rbt_use_unlock<br>Use unlock code | | | | none | | | toggled:on_rbt_unlock_toggled |
| 设置页控件 | rbtn_fullscreen<br>Start as fullscreen | | | | none | | | toggled:on_rbtn_fullscreen_toggled |
| 设置页控件 | rbtn_maximized<br>Start maximized | | | | none | | | toggled:on_rbtn_maximized_toggled |
| 设置页控件 | rbtn_no_run_from_line<br>Do not use run from line | | | | none | | | toggled:on_rbtn_run_from_line_toggled |
| 设置页控件 | rbtn_run_from_line<br>Use run from line | | | | none | | | toggled:on_rbtn_run_from_line_toggled |
| 设置页控件 | rbtn_show_offsets<br>show offsets | | | | none | | | |
| 设置页控件 | rbtn_show_preview<br>show preview | | | | none | | | toggled:on_rbtn_show_preview_toggled |
| 设置页控件 | rbtn_window<br>Start as window | | | | none | | | toggled:on_rbtn_window_toggled |
| 设置页控件 | rel_colorbutton | | | | none | | | color-set:on_rel_colorbutton_color_set |
| 设置页控件 | unhomed_colorbtn | | | | none | | | color-set:on_unhomed_colorbtn_color_set |
| Glade 静态按钮 | btn_calibration<br>Calibration | | | | none | | | launch calibration |
| Glade 静态按钮 | btn_classicladder<br>Cl.-ladder | | | | none | | | Open classicladder |
| Glade 静态按钮 | btn_delete | | | | none | | | delete MDI history |
| Glade 静态按钮 | btn_feed_100<br>100% | | | | none | | | reset feed override to 100 % |
| Glade 静态按钮 | btn_hal_meter<br>Hal Meter | | | | none | | | launch hal meter |
| Glade 静态按钮 | btn_hal_scope<br>Hal-Scope | | | | none | | | launch hal scope |
| Glade 静态按钮 | btn_launch_test_message<br>Launch test message | | | | none | | | Push here to launch a test message / to test your settings. |
| Glade 静态按钮 | btn_none<br>none | | | | none | | | clicked:on_btn_none_clicked |
| Glade 静态按钮 | btn_show_hal<br>Halshow | | | | none | | | opens the show hal tool |
| Glade 静态按钮 | btn_spindle_100<br>100% | | | | none | | | clicked:on_btn_spindle_100_clicked |
| Glade 静态按钮 | btn_status<br>Status | | | | none | | | launch linuxcnc status |
| Glade 静态按钮 | btn_use_current<br>current / file | | | | none | | | clicked:on_btn_use_current_clicked |
| Glade 静态按钮 | chkbtn_hide_titlebar<br>Hide title bar | | | | none | | | toggled:on_chkbtn_hide_titlebar_toggled |

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

View File

@@ -0,0 +1,230 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
inkscape:export-ydpi="90.000000"
inkscape:export-xdpi="90.000000"
inkscape:export-filename="/home/jimmac/Desktop/wi-fi.png"
width="48px"
height="48px"
id="svg11300"
sodipodi:version="0.32"
inkscape:version="0.46"
sodipodi:docbase="/home/tigert/cvs/freedesktop.org/tango-icon-theme/scalable/actions"
sodipodi:docname="edit-undo.svg"
inkscape:output_extension="org.inkscape.output.svg.inkscape">
<defs
id="defs3">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 24 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="48 : 24 : 1"
inkscape:persp3d-origin="24 : 16 : 1"
id="perspective31" />
<linearGradient
inkscape:collect="always"
id="linearGradient2326">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop2328" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop2330" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient2316">
<stop
style="stop-color:#c4a000;stop-opacity:1;"
offset="0"
id="stop2318" />
<stop
style="stop-color:#c4a000;stop-opacity:0;"
offset="1"
id="stop2320" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient2308">
<stop
style="stop-color:#edd400;stop-opacity:1;"
offset="0"
id="stop2310" />
<stop
style="stop-color:#edd400;stop-opacity:0;"
offset="1"
id="stop2312" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient8662">
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
id="stop8664" />
<stop
style="stop-color:#000000;stop-opacity:0;"
offset="1"
id="stop8666" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient8662"
id="radialGradient8668"
cx="24.837126"
cy="36.421127"
fx="24.837126"
fy="36.421127"
r="15.644737"
gradientTransform="matrix(1.000000,0.000000,0.000000,0.536723,-6.227265e-14,16.87306)"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient2187"
inkscape:collect="always">
<stop
id="stop2189"
offset="0"
style="stop-color:#ffffff;stop-opacity:1;" />
<stop
id="stop2191"
offset="1"
style="stop-color:#ffffff;stop-opacity:0;" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2187"
id="linearGradient1764"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-1.813471e-16,-1.171926,-1.171926,1.813471e-16,46.17440,54.10111)"
x1="17.060806"
y1="11.39502"
x2="12.624337"
y2="12.583769" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2308"
id="linearGradient2314"
x1="26.5"
y1="34.25"
x2="26.25"
y2="43.571831"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2316"
id="linearGradient2322"
x1="26.5"
y1="34.25"
x2="26.25"
y2="43.571831"
gradientUnits="userSpaceOnUse" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient2326"
id="radialGradient2332"
cx="15.09403"
cy="13.282721"
fx="15.09403"
fy="13.282721"
r="10.16466"
gradientTransform="matrix(2.496031,-1.151905e-16,1.061756e-16,2.300689,-25.12402,-17.82636)"
gradientUnits="userSpaceOnUse" />
</defs>
<sodipodi:namedview
stroke="#c4a000"
fill="#edd400"
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="0.25490196"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="2.8284271"
inkscape:cx="-19.855325"
inkscape:cy="-15.183692"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:grid-bbox="true"
inkscape:document-units="px"
inkscape:showpageshadow="false"
inkscape:window-width="891"
inkscape:window-height="818"
inkscape:window-x="0"
inkscape:window-y="30" />
<metadata
id="metadata4">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:creator>
<cc:Agent>
<dc:title>Jakub Steiner</dc:title>
</cc:Agent>
</dc:creator>
<dc:source>http://jimmac.musichall.cz</dc:source>
<cc:license
rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
<dc:title>Edit Undo</dc:title>
<dc:subject>
<rdf:Bag>
<rdf:li>edit</rdf:li>
<rdf:li>undo</rdf:li>
<rdf:li>revert</rdf:li>
</rdf:Bag>
</dc:subject>
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/publicdomain/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
</cc:License>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer">
<path
transform="matrix(-1.489736,0.000000,0.000000,-1.001252,60.60436,75.31260)"
d="M 40.481863 36.421127 A 15.644737 8.3968935 0 1 1 9.1923885,36.421127 A 15.644737 8.3968935 0 1 1 40.481863 36.421127 z"
sodipodi:ry="8.3968935"
sodipodi:rx="15.644737"
sodipodi:cy="36.421127"
sodipodi:cx="24.837126"
id="path8660"
style="opacity:0.14117647;color:#000000;fill:url(#radialGradient8668);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
sodipodi:type="arc" />
<path
style="opacity:1;color:#000000;fill:url(#linearGradient2314);fill-opacity:1.0;fill-rule:nonzero;stroke:url(#linearGradient2322);stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible"
d="M 9.582441,45.034369 C 49.608249,46.355509 43.282405,12.29355 22.462411,12.49765 L 22.462411,3.1222396 L 5.8139298,17.708819 L 22.462411,33.006349 C 22.462411,33.006349 22.462411,23.337969 22.462411,23.337969 C 36.525521,22.751999 40.639939,44.770549 9.582441,45.034369 z "
id="path1432"
sodipodi:nodetypes="ccccccc" />
<path
sodipodi:nodetypes="ccccccc"
id="path2177"
d="M 31.032281,39.315519 C 42.75538,33.235892 39.220073,13.087489 21.448701,13.549959 L 21.448701,5.4508678 C 21.448701,5.4508678 7.4009628,17.714589 7.4009628,17.714589 L 21.448701,30.658617 C 21.448701,30.658617 21.448701,22.380979 21.448701,22.380979 C 36.288551,22.032709 35.608611,35.138579 31.032281,39.315519 z "
style="opacity:0.69886361;color:#000000;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient1764);stroke-width:0.9999997;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible" />
<path
style="opacity:0.51136364;color:#000000;fill:url(#radialGradient2332);fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
d="M 6.6291261,17.682797 L 12.28598,23.074486 C 18.561553,22.897709 15.733126,16.710525 26.958446,13.616933 L 22.008699,12.998214 L 21.92031,4.3361562 L 6.6291261,17.682797 z "
id="path2324"
sodipodi:nodetypes="cccccc" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 9.0 KiB

View File

@@ -0,0 +1,230 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
inkscape:export-ydpi="90.000000"
inkscape:export-xdpi="90.000000"
inkscape:export-filename="/home/jimmac/Desktop/wi-fi.png"
width="48px"
height="48px"
id="svg11300"
sodipodi:version="0.32"
inkscape:version="0.46"
sodipodi:docbase="/home/tigert/cvs/freedesktop.org/tango-icon-theme/scalable/actions"
sodipodi:docname="edit-undo.svg"
inkscape:output_extension="org.inkscape.output.svg.inkscape">
<defs
id="defs3">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 24 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="48 : 24 : 1"
inkscape:persp3d-origin="24 : 16 : 1"
id="perspective31" />
<linearGradient
inkscape:collect="always"
id="linearGradient2326">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop2328" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop2330" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient2316">
<stop
style="stop-color:#c4a000;stop-opacity:1;"
offset="0"
id="stop2318" />
<stop
style="stop-color:#c4a000;stop-opacity:0;"
offset="1"
id="stop2320" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient2308">
<stop
style="stop-color:#edd400;stop-opacity:1;"
offset="0"
id="stop2310" />
<stop
style="stop-color:#edd400;stop-opacity:0;"
offset="1"
id="stop2312" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient8662">
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
id="stop8664" />
<stop
style="stop-color:#000000;stop-opacity:0;"
offset="1"
id="stop8666" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient8662"
id="radialGradient8668"
cx="24.837126"
cy="36.421127"
fx="24.837126"
fy="36.421127"
r="15.644737"
gradientTransform="matrix(1.000000,0.000000,0.000000,0.536723,-6.227265e-14,16.87306)"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient2187"
inkscape:collect="always">
<stop
id="stop2189"
offset="0"
style="stop-color:#ffffff;stop-opacity:1;" />
<stop
id="stop2191"
offset="1"
style="stop-color:#ffffff;stop-opacity:0;" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2187"
id="linearGradient1764"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-1.813471e-16,-1.171926,-1.171926,1.813471e-16,46.17440,54.10111)"
x1="17.060806"
y1="11.39502"
x2="12.624337"
y2="12.583769" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2308"
id="linearGradient2314"
x1="26.5"
y1="34.25"
x2="26.25"
y2="43.571831"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2316"
id="linearGradient2322"
x1="26.5"
y1="34.25"
x2="26.25"
y2="43.571831"
gradientUnits="userSpaceOnUse" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient2326"
id="radialGradient2332"
cx="15.09403"
cy="13.282721"
fx="15.09403"
fy="13.282721"
r="10.16466"
gradientTransform="matrix(2.496031,-1.151905e-16,1.061756e-16,2.300689,-25.12402,-17.82636)"
gradientUnits="userSpaceOnUse" />
</defs>
<sodipodi:namedview
stroke="#c4a000"
fill="#edd400"
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="0.25490196"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="2.8284271"
inkscape:cx="-19.855325"
inkscape:cy="-15.183692"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:grid-bbox="true"
inkscape:document-units="px"
inkscape:showpageshadow="false"
inkscape:window-width="891"
inkscape:window-height="818"
inkscape:window-x="0"
inkscape:window-y="30" />
<metadata
id="metadata4">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:creator>
<cc:Agent>
<dc:title>Jakub Steiner</dc:title>
</cc:Agent>
</dc:creator>
<dc:source>http://jimmac.musichall.cz</dc:source>
<cc:license
rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
<dc:title>Edit Undo</dc:title>
<dc:subject>
<rdf:Bag>
<rdf:li>edit</rdf:li>
<rdf:li>undo</rdf:li>
<rdf:li>revert</rdf:li>
</rdf:Bag>
</dc:subject>
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/publicdomain/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
</cc:License>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer">
<path
transform="matrix(-1.489736,0.000000,0.000000,-1.001252,60.60436,75.31260)"
d="M 40.481863 36.421127 A 15.644737 8.3968935 0 1 1 9.1923885,36.421127 A 15.644737 8.3968935 0 1 1 40.481863 36.421127 z"
sodipodi:ry="8.3968935"
sodipodi:rx="15.644737"
sodipodi:cy="36.421127"
sodipodi:cx="24.837126"
id="path8660"
style="opacity:0.14117647;color:#000000;fill:url(#radialGradient8668);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
sodipodi:type="arc" />
<path
style="opacity:1;color:#000000;fill:url(#linearGradient2314);fill-opacity:1.0;fill-rule:nonzero;stroke:url(#linearGradient2322);stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible"
d="M 9.582441,45.034369 C 49.608249,46.355509 43.282405,12.29355 22.462411,12.49765 L 22.462411,3.1222396 L 5.8139298,17.708819 L 22.462411,33.006349 C 22.462411,33.006349 22.462411,23.337969 22.462411,23.337969 C 36.525521,22.751999 40.639939,44.770549 9.582441,45.034369 z "
id="path1432"
sodipodi:nodetypes="ccccccc" />
<path
sodipodi:nodetypes="ccccccc"
id="path2177"
d="M 31.032281,39.315519 C 42.75538,33.235892 39.220073,13.087489 21.448701,13.549959 L 21.448701,5.4508678 C 21.448701,5.4508678 7.4009628,17.714589 7.4009628,17.714589 L 21.448701,30.658617 C 21.448701,30.658617 21.448701,22.380979 21.448701,22.380979 C 36.288551,22.032709 35.608611,35.138579 31.032281,39.315519 z "
style="opacity:0.69886361;color:#000000;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient1764);stroke-width:0.9999997;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible" />
<path
style="opacity:0.51136364;color:#000000;fill:url(#radialGradient2332);fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
d="M 6.6291261,17.682797 L 12.28598,23.074486 C 18.561553,22.897709 15.733126,16.710525 26.958446,13.616933 L 22.008699,12.998214 L 21.92031,4.3361562 L 6.6291261,17.682797 z "
id="path2324"
sodipodi:nodetypes="cccccc" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 264 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@@ -0,0 +1,196 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
sodipodi:docname="go-up.svg"
sodipodi:docbase="/home/tigert/cvs/freedesktop.org/tango-icon-theme/scalable/actions"
inkscape:version="0.46"
sodipodi:version="0.32"
id="svg11300"
height="48px"
width="48px"
inkscape:export-filename="/home/jimmac/Desktop/wi-fi.png"
inkscape:export-xdpi="90.000000"
inkscape:export-ydpi="90.000000"
inkscape:output_extension="org.inkscape.output.svg.inkscape">
<defs
id="defs3">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 24 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="48 : 24 : 1"
inkscape:persp3d-origin="24 : 16 : 1"
id="perspective23" />
<linearGradient
id="linearGradient2304">
<stop
id="stop2306"
offset="0"
style="stop-color:#73d216" />
<stop
id="stop2308"
offset="1.0000000"
style="stop-color:#4e9a06" />
</linearGradient>
<linearGradient
id="linearGradient8662"
inkscape:collect="always">
<stop
id="stop8664"
offset="0"
style="stop-color:#000000;stop-opacity:1;" />
<stop
id="stop8666"
offset="1"
style="stop-color:#000000;stop-opacity:0;" />
</linearGradient>
<linearGradient
id="linearGradient8650"
inkscape:collect="always">
<stop
id="stop8652"
offset="0"
style="stop-color:#ffffff;stop-opacity:1;" />
<stop
id="stop8654"
offset="1"
style="stop-color:#ffffff;stop-opacity:0;" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient8650"
id="radialGradient1438"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-3.749427e-16,-2.046729,1.557610,-2.853404e-16,2.767009,66.93275)"
cx="24.53788"
cy="0.40010813"
fx="24.53788"
fy="0.40010813"
r="17.171415" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient2304"
id="radialGradient1441"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.871885e-16,-0.843022,1.020168,2.265228e-16,0.606436,42.58614)"
cx="11.319205"
cy="22.454971"
fx="11.319205"
fy="22.454971"
r="16.956199" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient8662"
id="radialGradient1444"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.000000,0.000000,0.000000,0.536723,1.614716e-15,16.87306)"
cx="24.837126"
cy="36.421127"
fx="24.837126"
fy="36.421127"
r="15.644737" />
</defs>
<sodipodi:namedview
inkscape:window-y="30"
inkscape:window-x="0"
inkscape:window-height="818"
inkscape:window-width="1280"
inkscape:showpageshadow="false"
inkscape:document-units="px"
inkscape:grid-bbox="true"
showgrid="false"
inkscape:current-layer="layer1"
inkscape:cy="25.620377"
inkscape:cx="9.6380363"
inkscape:zoom="13.059378"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
borderopacity="0.25490196"
bordercolor="#666666"
pagecolor="#ffffff"
id="base"
fill="#73d216"
stroke="#73d216" />
<metadata
id="metadata4">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:creator>
<cc:Agent>
<dc:title>Jakub Steiner</dc:title>
</cc:Agent>
</dc:creator>
<dc:source>http://jimmac.musichall.cz</dc:source>
<cc:license
rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
<dc:title>Go Up</dc:title>
<dc:subject>
<rdf:Bag>
<rdf:li>go</rdf:li>
<rdf:li>higher</rdf:li>
<rdf:li>up</rdf:li>
<rdf:li>arrow</rdf:li>
<rdf:li>pointer</rdf:li>
<rdf:li>&gt;</rdf:li>
</rdf:Bag>
</dc:subject>
<dc:contributor>
<cc:Agent>
<dc:title>Andreas Nilsson</dc:title>
</cc:Agent>
</dc:contributor>
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/publicdomain/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:groupmode="layer"
inkscape:label="Layer 1"
id="layer1">
<path
transform="matrix(1.214466,0.000000,0.000000,0.595458,-6.163846,16.31275)"
d="M 40.481863 36.421127 A 15.644737 8.3968935 0 1 1 9.1923885,36.421127 A 15.644737 8.3968935 0 1 1 40.481863 36.421127 z"
sodipodi:ry="8.3968935"
sodipodi:rx="15.644737"
sodipodi:cy="36.421127"
sodipodi:cx="24.837126"
id="path8660"
style="opacity:0.29946521;color:#000000;fill:url(#radialGradient1444);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
sodipodi:type="arc" />
<path
sodipodi:nodetypes="cccccccc"
id="path8643"
d="M 14.491792,38.500000 L 32.469477,38.500000 L 32.469477,25.547437 L 40.500000,25.547437 L 23.374809,5.4992135 L 6.5285585,25.489471 L 14.497096,25.555762 L 14.491792,38.500000 z "
style="opacity:1.0000000;color:#000000;fill:url(#radialGradient1441);fill-opacity:1.0000000;fill-rule:evenodd;stroke:#3a7304;stroke-width:1.0000004;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
<path
sodipodi:nodetypes="cccscc"
id="path8645"
d="M 7.5855237,25.03253 L 14.995821,25.03253 L 15.062422,31.594339 C 20.718034,20.593878 31.055517,22.749928 31.656768,15.966674 C 31.656768,15.966674 23.366938,6.4219692 23.366938,6.4219692 L 7.5855237,25.03253 z "
style="opacity:0.50802141;color:#000000;fill:url(#radialGradient1438);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible" />
<path
style="opacity:0.48128340;color:#000000;fill:none;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.0000004;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
d="M 15.602735,37.500000 L 31.502578,37.500000 L 31.502578,24.507050 L 38.311576,24.507050 L 23.361206,7.0700896 L 8.6546798,24.550470 L 15.475049,24.528373 L 15.602735,37.500000 z "
id="path8658"
sodipodi:nodetypes="cccccccc" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.0 KiB

View File

@@ -0,0 +1,200 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
sodipodi:docname="chevron_down.svg"
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
sodipodi:version="0.32"
id="svg11300"
height="48px"
width="48px"
inkscape:export-filename="/home/jimmac/Desktop/wi-fi.png"
inkscape:export-xdpi="90.000000"
inkscape:export-ydpi="90.000000"
inkscape:output_extension="org.inkscape.output.svg.inkscape"
version="1.1"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<defs
id="defs3">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 24 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="48 : 24 : 1"
inkscape:persp3d-origin="24 : 16 : 1"
id="perspective23" />
<linearGradient
id="linearGradient2304">
<stop
id="stop2306"
offset="0"
style="stop-color:#73d216" />
<stop
id="stop2308"
offset="1.0000000"
style="stop-color:#4e9a06" />
</linearGradient>
<linearGradient
id="linearGradient8662"
inkscape:collect="always">
<stop
id="stop8664"
offset="0"
style="stop-color:#000000;stop-opacity:1;" />
<stop
id="stop8666"
offset="1"
style="stop-color:#000000;stop-opacity:0;" />
</linearGradient>
<linearGradient
id="linearGradient8650"
inkscape:collect="always">
<stop
id="stop8652"
offset="0"
style="stop-color:#ffffff;stop-opacity:1;" />
<stop
id="stop8654"
offset="1"
style="stop-color:#ffffff;stop-opacity:0;" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient8650"
id="radialGradient1438"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0,2.046729,1.55761,0,2.767009,-22.933509)"
cx="24.53788"
cy="0.40010813"
fx="24.53788"
fy="0.40010813"
r="17.171415" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient2304"
id="radialGradient1441"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0,0.843022,1.020168,0,0.606436,1.4131008)"
cx="11.319205"
cy="22.454971"
fx="11.319205"
fy="22.454971"
r="16.956199" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient8662"
id="radialGradient1444"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.000000,0.000000,0.000000,0.536723,1.614716e-15,16.87306)"
cx="24.837126"
cy="36.421127"
fx="24.837126"
fy="36.421127"
r="15.644737" />
</defs>
<sodipodi:namedview
inkscape:window-y="27"
inkscape:window-x="0"
inkscape:window-height="1149"
inkscape:window-width="1920"
inkscape:showpageshadow="false"
inkscape:document-units="px"
inkscape:grid-bbox="true"
showgrid="false"
inkscape:current-layer="layer1"
inkscape:cy="21.658207"
inkscape:cx="-1.2994924"
inkscape:zoom="4.6171874"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
borderopacity="0.25490196"
bordercolor="#666666"
pagecolor="#ffffff"
id="base"
fill="#73d216"
stroke="#73d216"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:window-maximized="1" />
<metadata
id="metadata4">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:creator>
<cc:Agent>
<dc:title>Jakub Steiner</dc:title>
</cc:Agent>
</dc:creator>
<dc:source>http://jimmac.musichall.cz</dc:source>
<cc:license
rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
<dc:title>Go Up</dc:title>
<dc:subject>
<rdf:Bag>
<rdf:li>go</rdf:li>
<rdf:li>higher</rdf:li>
<rdf:li>up</rdf:li>
<rdf:li>arrow</rdf:li>
<rdf:li>pointer</rdf:li>
<rdf:li>&gt;</rdf:li>
</rdf:Bag>
</dc:subject>
<dc:contributor>
<cc:Agent>
<dc:title>Andreas Nilsson</dc:title>
</cc:Agent>
</dc:contributor>
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/publicdomain/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:groupmode="layer"
inkscape:label="Layer 1"
id="layer1">
<path
id="path8660"
style="opacity:0.29946521;color:#000000;fill:url(#radialGradient1444);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
transform="matrix(1.214466,0.000000,0.000000,0.595458,-6.163846,16.31275)"
d="M 40.481863 36.421127 A 15.644737 8.3968935 0 1 1 9.1923885,36.421127 A 15.644737 8.3968935 0 1 1 40.481863 36.421127 z"
sodipodi:type="arc"
sodipodi:ry="8.3968935"
sodipodi:rx="15.644737"
sodipodi:cy="36.421127"
sodipodi:cx="24.837126" />
<path
sodipodi:nodetypes="cccccccc"
id="path8643"
d="M 14.491792,5.4992408 H 32.469477 V 18.451804 H 40.5 L 23.374809,38.500027 6.5285585,18.50977 14.497096,18.443479 Z"
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:url(#radialGradient1441);fill-opacity:1;fill-rule:evenodd;stroke:#3a7304;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none" />
<path
sodipodi:nodetypes="cccscc"
id="path8645"
d="m 7.5855237,18.966711 h 7.4102973 l 0.0666,-6.561809 c 5.655612,11.000461 15.993095,8.844411 16.594346,15.627665 0,0 -8.28983,9.544705 -8.28983,9.544705 z"
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.508021;fill:url(#radialGradient1438);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none" />
<path
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.481283;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none"
d="M 15.602735,6.4992408 H 31.502578 V 19.492191 h 6.808998 l -14.95037,17.43696 -14.7065262,-17.48038 6.8203692,0.0221 z"
id="path8658"
sodipodi:nodetypes="cccccccc" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

View File

@@ -0,0 +1,230 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
inkscape:export-ydpi="90.000000"
inkscape:export-xdpi="90.000000"
inkscape:export-filename="/home/jimmac/Desktop/wi-fi.png"
width="48px"
height="48px"
id="svg11300"
sodipodi:version="0.32"
inkscape:version="0.46"
sodipodi:docbase="/home/tigert/cvs/freedesktop.org/tango-icon-theme/scalable/actions"
sodipodi:docname="edit-undo.svg"
inkscape:output_extension="org.inkscape.output.svg.inkscape">
<defs
id="defs3">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 24 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="48 : 24 : 1"
inkscape:persp3d-origin="24 : 16 : 1"
id="perspective31" />
<linearGradient
inkscape:collect="always"
id="linearGradient2326">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop2328" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop2330" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient2316">
<stop
style="stop-color:#c4a000;stop-opacity:1;"
offset="0"
id="stop2318" />
<stop
style="stop-color:#c4a000;stop-opacity:0;"
offset="1"
id="stop2320" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient2308">
<stop
style="stop-color:#edd400;stop-opacity:1;"
offset="0"
id="stop2310" />
<stop
style="stop-color:#edd400;stop-opacity:0;"
offset="1"
id="stop2312" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient8662">
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
id="stop8664" />
<stop
style="stop-color:#000000;stop-opacity:0;"
offset="1"
id="stop8666" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient8662"
id="radialGradient8668"
cx="24.837126"
cy="36.421127"
fx="24.837126"
fy="36.421127"
r="15.644737"
gradientTransform="matrix(1.000000,0.000000,0.000000,0.536723,-6.227265e-14,16.87306)"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient2187"
inkscape:collect="always">
<stop
id="stop2189"
offset="0"
style="stop-color:#ffffff;stop-opacity:1;" />
<stop
id="stop2191"
offset="1"
style="stop-color:#ffffff;stop-opacity:0;" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2187"
id="linearGradient1764"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-1.813471e-16,-1.171926,-1.171926,1.813471e-16,46.17440,54.10111)"
x1="17.060806"
y1="11.39502"
x2="12.624337"
y2="12.583769" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2308"
id="linearGradient2314"
x1="26.5"
y1="34.25"
x2="26.25"
y2="43.571831"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2316"
id="linearGradient2322"
x1="26.5"
y1="34.25"
x2="26.25"
y2="43.571831"
gradientUnits="userSpaceOnUse" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient2326"
id="radialGradient2332"
cx="15.09403"
cy="13.282721"
fx="15.09403"
fy="13.282721"
r="10.16466"
gradientTransform="matrix(2.496031,-1.151905e-16,1.061756e-16,2.300689,-25.12402,-17.82636)"
gradientUnits="userSpaceOnUse" />
</defs>
<sodipodi:namedview
stroke="#c4a000"
fill="#edd400"
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="0.25490196"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="2.8284271"
inkscape:cx="-19.855325"
inkscape:cy="-15.183692"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:grid-bbox="true"
inkscape:document-units="px"
inkscape:showpageshadow="false"
inkscape:window-width="891"
inkscape:window-height="818"
inkscape:window-x="0"
inkscape:window-y="30" />
<metadata
id="metadata4">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:creator>
<cc:Agent>
<dc:title>Jakub Steiner</dc:title>
</cc:Agent>
</dc:creator>
<dc:source>http://jimmac.musichall.cz</dc:source>
<cc:license
rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
<dc:title>Edit Undo</dc:title>
<dc:subject>
<rdf:Bag>
<rdf:li>edit</rdf:li>
<rdf:li>undo</rdf:li>
<rdf:li>revert</rdf:li>
</rdf:Bag>
</dc:subject>
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/publicdomain/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
</cc:License>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer">
<path
transform="matrix(-1.489736,0.000000,0.000000,-1.001252,60.60436,75.31260)"
d="M 40.481863 36.421127 A 15.644737 8.3968935 0 1 1 9.1923885,36.421127 A 15.644737 8.3968935 0 1 1 40.481863 36.421127 z"
sodipodi:ry="8.3968935"
sodipodi:rx="15.644737"
sodipodi:cy="36.421127"
sodipodi:cx="24.837126"
id="path8660"
style="opacity:0.14117647;color:#000000;fill:url(#radialGradient8668);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
sodipodi:type="arc" />
<path
style="opacity:1;color:#000000;fill:url(#linearGradient2314);fill-opacity:1.0;fill-rule:nonzero;stroke:url(#linearGradient2322);stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible"
d="M 9.582441,45.034369 C 49.608249,46.355509 43.282405,12.29355 22.462411,12.49765 L 22.462411,3.1222396 L 5.8139298,17.708819 L 22.462411,33.006349 C 22.462411,33.006349 22.462411,23.337969 22.462411,23.337969 C 36.525521,22.751999 40.639939,44.770549 9.582441,45.034369 z "
id="path1432"
sodipodi:nodetypes="ccccccc" />
<path
sodipodi:nodetypes="ccccccc"
id="path2177"
d="M 31.032281,39.315519 C 42.75538,33.235892 39.220073,13.087489 21.448701,13.549959 L 21.448701,5.4508678 C 21.448701,5.4508678 7.4009628,17.714589 7.4009628,17.714589 L 21.448701,30.658617 C 21.448701,30.658617 21.448701,22.380979 21.448701,22.380979 C 36.288551,22.032709 35.608611,35.138579 31.032281,39.315519 z "
style="opacity:0.69886361;color:#000000;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient1764);stroke-width:0.9999997;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible" />
<path
style="opacity:0.51136364;color:#000000;fill:url(#radialGradient2332);fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
d="M 6.6291261,17.682797 L 12.28598,23.074486 C 18.561553,22.897709 15.733126,16.710525 26.958446,13.616933 L 22.008699,12.998214 L 21.92031,4.3361562 L 6.6291261,17.682797 z "
id="path2324"
sodipodi:nodetypes="cccccc" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@@ -0,0 +1,448 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="48.000000px"
height="48.000000px"
id="svg249"
sodipodi:version="0.32"
inkscape:version="0.46"
sodipodi:docbase="/home/jimmac/src/cvs/tango-icon-theme/scalable/actions"
sodipodi:docname="document-new.svg"
inkscape:export-filename="/home/jimmac/gfx/novell/pdes/trunk/docs/BIGmime-text.png"
inkscape:export-xdpi="240.00000"
inkscape:export-ydpi="240.00000"
inkscape:output_extension="org.inkscape.output.svg.inkscape">
<defs
id="defs3">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 24 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="48 : 24 : 1"
inkscape:persp3d-origin="24 : 16 : 1"
id="perspective69" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient5060"
id="radialGradient5031"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
cx="605.71429"
cy="486.64789"
fx="605.71429"
fy="486.64789"
r="117.14286" />
<linearGradient
inkscape:collect="always"
id="linearGradient5060">
<stop
style="stop-color:black;stop-opacity:1;"
offset="0"
id="stop5062" />
<stop
style="stop-color:black;stop-opacity:0;"
offset="1"
id="stop5064" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient5060"
id="radialGradient5029"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
cx="605.71429"
cy="486.64789"
fx="605.71429"
fy="486.64789"
r="117.14286" />
<linearGradient
id="linearGradient5048">
<stop
style="stop-color:black;stop-opacity:0;"
offset="0"
id="stop5050" />
<stop
id="stop5056"
offset="0.5"
style="stop-color:black;stop-opacity:1;" />
<stop
style="stop-color:black;stop-opacity:0;"
offset="1"
id="stop5052" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5048"
id="linearGradient5027"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
x1="302.85715"
y1="366.64789"
x2="302.85715"
y2="609.50507" />
<linearGradient
inkscape:collect="always"
id="linearGradient4542">
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
id="stop4544" />
<stop
style="stop-color:#000000;stop-opacity:0;"
offset="1"
id="stop4546" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient4542"
id="radialGradient4548"
cx="24.306795"
cy="42.07798"
fx="24.306795"
fy="42.07798"
r="15.821514"
gradientTransform="matrix(1.000000,0.000000,0.000000,0.284916,-6.310056e-16,30.08928)"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient15662">
<stop
style="stop-color:#ffffff;stop-opacity:1.0000000;"
offset="0.0000000"
id="stop15664" />
<stop
style="stop-color:#f8f8f8;stop-opacity:1.0000000;"
offset="1.0000000"
id="stop15666" />
</linearGradient>
<radialGradient
gradientUnits="userSpaceOnUse"
fy="64.5679"
fx="20.8921"
r="5.257"
cy="64.5679"
cx="20.8921"
id="aigrd3">
<stop
id="stop15573"
style="stop-color:#F0F0F0"
offset="0" />
<stop
id="stop15575"
style="stop-color:#9a9a9a;stop-opacity:1.0000000;"
offset="1.0000000" />
</radialGradient>
<radialGradient
gradientUnits="userSpaceOnUse"
fy="114.5684"
fx="20.8921"
r="5.256"
cy="114.5684"
cx="20.8921"
id="aigrd2">
<stop
id="stop15566"
style="stop-color:#F0F0F0"
offset="0" />
<stop
id="stop15568"
style="stop-color:#9a9a9a;stop-opacity:1.0000000;"
offset="1.0000000" />
</radialGradient>
<linearGradient
id="linearGradient269">
<stop
style="stop-color:#a3a3a3;stop-opacity:1.0000000;"
offset="0.0000000"
id="stop270" />
<stop
style="stop-color:#4c4c4c;stop-opacity:1.0000000;"
offset="1.0000000"
id="stop271" />
</linearGradient>
<linearGradient
id="linearGradient259">
<stop
style="stop-color:#fafafa;stop-opacity:1.0000000;"
offset="0.0000000"
id="stop260" />
<stop
style="stop-color:#bbbbbb;stop-opacity:1.0000000;"
offset="1.0000000"
id="stop261" />
</linearGradient>
<linearGradient
id="linearGradient12512">
<stop
style="stop-color:#ffffff;stop-opacity:1.0000000;"
offset="0.0000000"
id="stop12513" />
<stop
style="stop-color:#fff520;stop-opacity:0.89108908;"
offset="0.50000000"
id="stop12517" />
<stop
style="stop-color:#fff300;stop-opacity:0.0000000;"
offset="1.0000000"
id="stop12514" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient12512"
id="radialGradient278"
gradientUnits="userSpaceOnUse"
cx="55.000000"
cy="125.00000"
fx="55.000000"
fy="125.00000"
r="14.375000" />
<radialGradient
r="37.751713"
fy="3.7561285"
fx="8.8244190"
cy="3.7561285"
cx="8.8244190"
gradientTransform="matrix(0.968273,0.000000,0.000000,1.032767,3.353553,0.646447)"
gradientUnits="userSpaceOnUse"
id="radialGradient15656"
xlink:href="#linearGradient269"
inkscape:collect="always" />
<radialGradient
r="86.708450"
fy="35.736916"
fx="33.966679"
cy="35.736916"
cx="33.966679"
gradientTransform="scale(0.960493,1.041132)"
gradientUnits="userSpaceOnUse"
id="radialGradient15658"
xlink:href="#linearGradient259"
inkscape:collect="always" />
<radialGradient
r="38.158695"
fy="7.2678967"
fx="8.1435566"
cy="7.2678967"
cx="8.1435566"
gradientTransform="matrix(0.968273,0.000000,0.000000,1.032767,3.353553,0.646447)"
gradientUnits="userSpaceOnUse"
id="radialGradient15668"
xlink:href="#linearGradient15662"
inkscape:collect="always" />
<radialGradient
inkscape:collect="always"
xlink:href="#aigrd2"
id="radialGradient2283"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.229703,0.000000,0.000000,0.229703,4.613529,3.979808)"
cx="20.8921"
cy="114.5684"
fx="20.8921"
fy="114.5684"
r="5.256" />
<radialGradient
inkscape:collect="always"
xlink:href="#aigrd3"
id="radialGradient2285"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.229703,0.000000,0.000000,0.229703,4.613529,3.979808)"
cx="20.8921"
cy="64.5679"
fx="20.8921"
fy="64.5679"
r="5.257" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="0.32941176"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1"
inkscape:cx="-130.2425"
inkscape:cy="-6.4480487"
inkscape:current-layer="layer6"
showgrid="false"
inkscape:grid-bbox="true"
inkscape:document-units="px"
inkscape:window-width="872"
inkscape:window-height="688"
inkscape:window-x="166"
inkscape:window-y="151"
inkscape:showpageshadow="false" />
<metadata
id="metadata4">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>New Document</dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Jakub Steiner</dc:title>
</cc:Agent>
</dc:creator>
<dc:source>http://jimmac.musichall.cz</dc:source>
<cc:license
rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/publicdomain/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Shadow"
id="layer6"
inkscape:groupmode="layer">
<g
style="display:inline"
id="g5022"
transform="matrix(2.165152e-2,0,0,1.485743e-2,43.0076,42.68539)">
<rect
y="-150.69685"
x="-1559.2523"
height="478.35718"
width="1339.6335"
id="rect4173"
style="opacity:0.40206185;color:black;fill:url(#linearGradient5027);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
<path
sodipodi:nodetypes="cccc"
id="path5058"
d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z "
style="opacity:0.40206185;color:black;fill:url(#radialGradient5029);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
<path
style="opacity:0.40206185;color:black;fill:url(#radialGradient5031);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z "
id="path5018"
sodipodi:nodetypes="cccc" />
</g>
</g>
<g
id="layer1"
inkscape:label="Base"
inkscape:groupmode="layer"
style="display:inline">
<rect
ry="1.1490486"
y="3.6464462"
x="6.6035528"
height="40.920494"
width="34.875000"
id="rect15391"
style="color:#000000;fill:url(#radialGradient15658);fill-opacity:1.0000000;fill-rule:nonzero;stroke:url(#radialGradient15656);stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:block;overflow:visible" />
<rect
rx="0.14904857"
ry="0.14904857"
y="4.5839462"
x="7.6660538"
height="38.946384"
width="32.775887"
id="rect15660"
style="color:#000000;fill:none;fill-opacity:1.0000000;fill-rule:nonzero;stroke:url(#radialGradient15668);stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:block;overflow:visible" />
<g
id="g2270"
transform="translate(0.646447,-3.798933e-2)">
<g
transform="matrix(0.229703,0.000000,0.000000,0.229703,4.967081,4.244972)"
style="fill:#ffffff;fill-opacity:1.0000000;fill-rule:nonzero;stroke:#000000;stroke-miterlimit:4.0000000"
id="g1440">
<radialGradient
gradientUnits="userSpaceOnUse"
fy="114.56840"
fx="20.892099"
r="5.2560000"
cy="114.56840"
cx="20.892099"
id="radialGradient1442">
<stop
id="stop1444"
style="stop-color:#F0F0F0"
offset="0" />
<stop
id="stop1446"
style="stop-color:#474747"
offset="1" />
</radialGradient>
<path
id="path1448"
d="M 23.428000,113.07000 C 23.428000,115.04300 21.828000,116.64200 19.855000,116.64200 C 17.881000,116.64200 16.282000,115.04200 16.282000,113.07000 C 16.282000,111.09600 17.882000,109.49700 19.855000,109.49700 C 21.828000,109.49700 23.428000,111.09700 23.428000,113.07000 z "
style="stroke:none" />
<radialGradient
gradientUnits="userSpaceOnUse"
fy="64.567902"
fx="20.892099"
r="5.2570000"
cy="64.567902"
cx="20.892099"
id="radialGradient1450">
<stop
id="stop1452"
style="stop-color:#F0F0F0"
offset="0" />
<stop
id="stop1454"
style="stop-color:#474747"
offset="1" />
</radialGradient>
<path
id="path1456"
d="M 23.428000,63.070000 C 23.428000,65.043000 21.828000,66.643000 19.855000,66.643000 C 17.881000,66.643000 16.282000,65.043000 16.282000,63.070000 C 16.282000,61.096000 17.882000,59.497000 19.855000,59.497000 C 21.828000,59.497000 23.428000,61.097000 23.428000,63.070000 z "
style="stroke:none" />
</g>
<path
id="path15570"
d="M 9.9950109,29.952326 C 9.9950109,30.405530 9.6274861,30.772825 9.1742821,30.772825 C 8.7208483,30.772825 8.3535532,30.405301 8.3535532,29.952326 C 8.3535532,29.498892 8.7210780,29.131597 9.1742821,29.131597 C 9.6274861,29.131597 9.9950109,29.499122 9.9950109,29.952326 z "
style="fill:url(#radialGradient2283);fill-rule:nonzero;stroke:none;stroke-miterlimit:4.0000000" />
<path
id="path15577"
d="M 9.9950109,18.467176 C 9.9950109,18.920380 9.6274861,19.287905 9.1742821,19.287905 C 8.7208483,19.287905 8.3535532,18.920380 8.3535532,18.467176 C 8.3535532,18.013742 8.7210780,17.646447 9.1742821,17.646447 C 9.6274861,17.646447 9.9950109,18.013972 9.9950109,18.467176 z "
style="fill:url(#radialGradient2285);fill-rule:nonzero;stroke:none;stroke-miterlimit:4.0000000" />
</g>
<path
sodipodi:nodetypes="cc"
id="path15672"
d="M 11.505723,5.4942766 L 11.505723,43.400869"
style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:0.98855311;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-opacity:0.017543854" />
<path
sodipodi:nodetypes="cc"
id="path15674"
d="M 12.500000,5.0205154 L 12.500000,43.038228"
style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-opacity:0.20467831" />
</g>
<g
inkscape:groupmode="layer"
id="layer4"
inkscape:label="new"
style="display:inline">
<path
sodipodi:type="arc"
style="color:#000000;fill:url(#radialGradient278);fill-opacity:1.0000000;fill-rule:nonzero;stroke:none;stroke-width:1.2500002;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:block"
id="path12511"
sodipodi:cx="55.000000"
sodipodi:cy="125.00000"
sodipodi:rx="14.375000"
sodipodi:ry="14.375000"
d="M 69.375000 125.00000 A 14.375000 14.375000 0 1 1 40.625000,125.00000 A 14.375000 14.375000 0 1 1 69.375000 125.00000 z"
transform="matrix(0.783292,0.000000,0.000000,0.783292,-6.340883,-86.65168)"
inkscape:export-filename="/home/jimmac/ximian_art/icons/nautilus/suse93/stock_new-16.png"
inkscape:export-xdpi="33.852203"
inkscape:export-ydpi="33.852203" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Some files were not shown because too many files have changed in this diff Show More