同步五轴仿真文档和验证证据
493
qa/web-rtcp-5axis-site-test/capture-button-control-evidence.mjs
Normal 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, "&")
|
||||||
|
.replace(/</g, "<")
|
||||||
|
.replace(/>/g, ">")
|
||||||
|
.replace(/"/g, """)
|
||||||
|
.replace(/'/g, "'");
|
||||||
|
}
|
||||||
|
|
||||||
|
function wait(ms) {
|
||||||
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
||||||
|
}
|
||||||
@@ -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");
|
||||||
|
}
|
||||||
|
After Width: | Height: | Size: 218 KiB |
|
After Width: | Height: | Size: 272 KiB |
BIN
qa/web-rtcp-5axis-site-test/output/cloud-run-debug/01-loaded.png
Normal file
|
After Width: | Height: | Size: 198 KiB |
|
After Width: | Height: | Size: 198 KiB |
|
After Width: | Height: | Size: 198 KiB |
|
After Width: | Height: | Size: 198 KiB |
|
After Width: | Height: | Size: 198 KiB |
|
After Width: | Height: | Size: 198 KiB |
|
After Width: | Height: | Size: 199 KiB |
@@ -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": []
|
||||||
|
}
|
||||||
285
qa/web-rtcp-5axis-site-test/output/cloud-run-ready-after.json
Normal 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)"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
BIN
qa/web-rtcp-5axis-site-test/output/cloud-run-ready-after.png
Normal file
|
After Width: | Height: | Size: 180 KiB |
|
After Width: | Height: | Size: 76 KiB |
@@ -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."
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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.
|
||||||
|
After Width: | Height: | Size: 201 KiB |
|
After Width: | Height: | Size: 190 KiB |
|
After Width: | Height: | Size: 190 KiB |
|
After Width: | Height: | Size: 191 KiB |
|
After Width: | Height: | Size: 191 KiB |
|
After Width: | Height: | Size: 194 KiB |
|
After Width: | Height: | Size: 195 KiB |
|
After Width: | Height: | Size: 195 KiB |
|
After Width: | Height: | Size: 195 KiB |
|
After Width: | Height: | Size: 195 KiB |
|
After Width: | Height: | Size: 195 KiB |
|
After Width: | Height: | Size: 196 KiB |
|
After Width: | Height: | Size: 196 KiB |
|
After Width: | Height: | Size: 196 KiB |
|
After Width: | Height: | Size: 200 KiB |
|
After Width: | Height: | Size: 190 KiB |
|
After Width: | Height: | Size: 190 KiB |
|
After Width: | Height: | Size: 191 KiB |
|
After Width: | Height: | Size: 191 KiB |
|
After Width: | Height: | Size: 194 KiB |
|
After Width: | Height: | Size: 194 KiB |
|
After Width: | Height: | Size: 194 KiB |
|
After Width: | Height: | Size: 194 KiB |
|
After Width: | Height: | Size: 196 KiB |
|
After Width: | Height: | Size: 195 KiB |
|
After Width: | Height: | Size: 196 KiB |
|
After Width: | Height: | Size: 196 KiB |
|
After Width: | Height: | Size: 196 KiB |
@@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
After Width: | Height: | Size: 89 KiB |
|
After Width: | Height: | Size: 35 KiB |
|
After Width: | Height: | Size: 198 KiB |
@@ -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
|
||||||
|
}
|
||||||
|
After Width: | Height: | Size: 110 KiB |
|
After Width: | Height: | Size: 34 KiB |
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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("")}
|
||||||
`;
|
`;
|
||||||
|
|||||||
@@ -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 ||
|
||||||
|
|||||||
@@ -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");
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
112
work/working1/01-功能内容.md
Normal 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 对照报告中明确记录。
|
||||||
279
work/working1/02-程序开发步骤.md
Normal 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 返回真实阻塞原因。
|
||||||
|
|
||||||
|
## 阶段 3:Web 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 状态回退。
|
||||||
|
|
||||||
|
## 阶段 4:WASM 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。
|
||||||
|
|
||||||
|
## 阶段 5:WASM 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
|
||||||
|
```
|
||||||
|
|
||||||
|
## 阶段 10:LinuxCNC 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 状态转换日志已生成。
|
||||||
85
work/working1/03-推进台账.md
Normal 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 race:task/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 对照报告中。
|
||||||
50
work/working1/04-任务矩阵.md
Normal 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 为 stopped,motion aborted 为 true | `verify_linuxcnc_task_hal_runtime.mjs` |
|
||||||
|
| BTN-005 | Pause 功能 | Done | 点击 Pause 后 task/HAL interpState 为 paused,motion 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 状态转换日志 |
|
||||||
280
work/working1/05-验收证据.md
Normal 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 状态驱动的控制流程。
|
||||||
187
work/working1/06-决策记录.md
Normal 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-003:Step 必须发送 `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-004:Resume 后是否重启 status loop 由返回状态决定
|
||||||
|
|
||||||
|
决策:Resume command 完成后,用 `shouldContinueTaskHalStatusLoop(state, status)` 判断是否恢复轮询。
|
||||||
|
|
||||||
|
原因:
|
||||||
|
|
||||||
|
- 旧逻辑只看旧 state,可能在已经完成、停止或状态不应继续时重启 loop。
|
||||||
|
- LinuxCNC task/HAL status 是更可信的数据来源。
|
||||||
|
|
||||||
|
影响:
|
||||||
|
|
||||||
|
- 减少旧 status loop 覆盖新命令状态的风险。
|
||||||
|
- Pause/Resume 更接近 LinuxCNC task 状态。
|
||||||
|
|
||||||
|
## DR-005:Home 在 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-012:BTN-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 仍不提升为完成状态。
|
||||||
1287
work/working3/gmoccapy_XYZAB_execution_analysis.md
Normal file
9
work/working3/gmoccapy_button_icons/README.md
Normal 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` 命名。
|
||||||
212
work/working3/gmoccapy_button_icons/button_icon_inventory.csv
Normal 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,
|
||||||
|
247
work/working3/gmoccapy_button_icons/button_icon_inventory.md
Normal 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 |
|
||||||
|
After Width: | Height: | Size: 5.3 KiB |
|
After Width: | Height: | Size: 5.3 KiB |
@@ -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 |
@@ -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 |
|
After Width: | Height: | Size: 3.0 KiB |
|
After Width: | Height: | Size: 264 B |
|
After Width: | Height: | Size: 1.8 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 2.7 KiB |
@@ -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>></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 |
@@ -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>></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 |
|
After Width: | Height: | Size: 1.5 KiB |
|
After Width: | Height: | Size: 1.6 KiB |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 11 KiB |
@@ -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 |
|
After Width: | Height: | Size: 4.2 KiB |
|
After Width: | Height: | Size: 4.2 KiB |
@@ -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 |
|
After Width: | Height: | Size: 4.2 KiB |
|
After Width: | Height: | Size: 4.0 KiB |
|
After Width: | Height: | Size: 4.3 KiB |
|
After Width: | Height: | Size: 2.5 KiB |
|
After Width: | Height: | Size: 3.4 KiB |