Skip to content

Updated Website - #82

Open
alexanderoster wants to merge 280 commits into
Autodesk:developfrom
alexanderoster:develop
Open

alexanderoster wants to merge 280 commits into
Autodesk:developfrom
alexanderoster:develop

Conversation

@alexanderoster

Copy link
Copy Markdown
Contributor

No description provided.

alexanderoster and others added 30 commits October 31, 2025 11:36
…ing (#47)

- Updated the SMC job recording configuration to use
  `slsc_RecordSet_HeadAPosition` instead of the previous
  `slsc_RecordSet_SetPositions` for record set A.
- Ensures that the recorded data includes set and actual scanner head A
  position information during job execution.

Signed-off-by: Yury Rodzikau <y.rodzikau@c1-technologies.com>
…ent (#46)

This fixes error: "invalid execution delay error".
This could occur after NTP clock adjustments causing system clock to jump backwards.
* Signalslot unittest: Use valid UUIDs to make tests pass

* AccessControl unittests: fix invalid permission identifiers, e.g perm_read, not perm.read
)

The executionlist component now works like the buildlist component
Allowing config.xml to define upload controls with attribute "acceptedtypes".

Example:
<upload class="image" caption="Select png file to upload" acceptedtypes=".png" successevent="onfileuploadfinished"/>
alexanderoster and others added 30 commits October 3, 2026 01:37
ModuleExecutionList and ModuleBuildList rendered every entry. With
10,000 executions, Build History created 10,003 rows (130,189 DOM
elements) and froze the browser. Both lists now show one page of
module.entriesperpage rows, with a first/previous/next/last pager.

The Build History scroll area capped its root height but not its
viewport, so rows past about 500 px were clipped and could not be
scrolled to. The cap now applies to the viewport.

Adds an npm test script that runs the paging tests with node --test.
GCC 15's libstdc++ no longer pulls <cstdint> in transitively via <memory>,
<string> and friends, so every header that names uint32_t/uint64_t without
including it fails to compile. 76 headers under Implementation/ and ten driver
headers (ADS, A3200, BuR journal group/value, CifX, Euler, Marlin serial
controller, Pylon, Rasterizer algorithm, RayLase) relied on that transitive
include; each now includes <cstdint> directly.

Separately, GCC 15 defaults to C23, where "bool" is a keyword, which rejects the
vendored libzip's "typedef ... bool" in zipint.h. Pin CMAKE_C_STANDARD to 17.
ModuleImage.svelte read module.imageresourceuuid, but the core
AMCModule_Image sets imageresource, so no <image> content rendered in
the Svelte client. Read imageresource, and skip the null-UUID default
so an image without a resource renders nothing instead of a broken
image (same guard as the build/part/execution list thumbnails).
)

Previously this would fail:

./amc_server --set main.system.myparam=1

The initalization would exit with:
Fatal initialization error: Error: INVALIDVARIABLETYPE: variable main.system.myparam is not a string variable (312)
Failed (e.g. aborted) executions also have an end time stamp, but the
execution list only read it for finished ones, so the client showed the
end time as a formatted Unix time stamp 0 (Jan 1, 1970).
The Svelte ExecutionList put the execution UUID under buttonvalueuuid
only, so the plugin's selecteduuid was the null UUID and Build History
"Reprint job" and "Details" failed with BUILDJOBEXECUTIONNOTFOUND. The
server maps buttonvalueuuid to buttonuuid/buttonname, so it must carry
the button UUID; BuildList sent the build UUID there too.

Both modules now use core's triggerSelectEvent/triggerButtonEvent, as
vue2 does: selection value = row UUID, button value = button UUID.
Upstream made every top-level module of a page as high as the page, so on
a page with several contents only the first was usable and the rest could
not be scrolled to.
A page with one top-level module (a grid) still fills the page; several
now stack at their natural height and the page scrolls.
Table cells default to whitespace-nowrap, so long job_info descriptions
made the Parameter column ~1370px wide. The table outgrew the
vertical-only ScrollArea, and the table container's horizontal
scrollbar sat at the bottom of the full table height, off screen: only
the Parameter column was visible.

Body cells of auto-sized columns now wrap. Columns with a configured or
drag-resized width keep the single-line ellipsis.
config.xml names icons by MDI name ("mdi-library"), and vue2 ships the
whole @mdi/font, so any MDI name works there. The Svelte client maps
names to lucide icons through a short table and drew an empty circle
for everything else. The example configs hit the same gap.

Names missing from the table now render from @mdi/font, the same font
vue2 uses. The lucide table stays, so mapped icons look as before. The
glyph is sized from the caller's h-*/w-* box (font-size 100cqh in a
size container), so call sites are unchanged. Names that are not
"mdi-[a-z0-9-]+" still get the circle, which keeps config values out
of the class list.

The lockfile carries only the @mdi/font entries; npm would also have
rewritten unrelated "dev" flags.
Detect ccache in CMakeLists.txt and use it as the C/C++ compiler
launcher when available. No effect if ccache is not installed.
Commits b0c3b07 and 945d402 updated the lib3mf headers in
Libraries/lib3mf/ and the lib3mf_win64.dll artifact, but not the
linux64 and rpi shared libraries. The headers load 837 lib3mf_*
functions. The old .so files (built from 5c58ceb2) export only 810 of
them and lack the 27 new toolpath functions such as
lib3mf_model_getbuildtoolpath and lib3mf_toolpath_gettoolpathtype. On
Linux, amc_server therefore failed at startup in
CToolpathHandler::setLibraryPath with COULDNOTFINDLIBRARYEXPORT,
whichever plugin was configured.

Both libraries are rebuilt from lib3mf f6a9bb3606f91b8e13d4207b3d0d6e9799bfac5c
(branch toolpath_squashed, "Added Profile Value checks", 2026-09-29).
That is a ref whose Autogenerated/Bindings/CppDynamic files match the
vendored headers exactly, and the ref the current win64 dll was built
from: the dll contains a toolpath profile error string first added in
f6a9bb36.

_githash_lib3mf.txt (the win64 dll) said 8a6f9824, the parent of
5c58ceb2, but the dll was built from f6a9bb36 as shown above. All three
_githash_*lib3mf.txt files now name f6a9bb36.

Build: a debian:bookworm-slim container with build-essential, cmake and
crossbuild-essential-arm64 installed. linux64 uses native gcc 12.2.0 and
rpi is cross-compiled with aarch64-linux-gnu-gcc 12.2.0. Commands:

    cmake -DCMAKE_BUILD_TYPE=Release -DLIB3MF_TESTS=OFF <lib3mf source>
    cmake --build . --target lib3mf

For rpi, the first command also gets:

    -DCMAKE_SYSTEM_NAME=Linux -DCMAKE_SYSTEM_PROCESSOR=aarch64
    -DCMAKE_C_COMPILER=aarch64-linux-gnu-gcc
    -DCMAKE_CXX_COMPILER=aarch64-linux-gnu-g++

Everything else uses lib3mf defaults: bundled zlib/libzip, stripped,
and libstdc++ linked dynamically. Both libraries need at most GLIBC
2.36 and GLIBCXX 3.4.29. The previous linux64 build needed GLIBC 2.38,
so the new one also runs on Debian 12. The NEEDED libraries and the
SONAME (lib3mf.so.2) are unchanged.

Verification: nm -D shows 837 of 837 referenced exports in both
libraries, including all 810 old exports. The linux64 build dlopens and
reports version 2.4.0, and amc_server starts with it. The rpi build was
not run, because the build host has no arm64 emulation.
Telemetry recording is unconditional and unbounded: every state machine
state and signal slot records on every cycle, which can reach gigabytes
per day and fill the disk of a long-running machine. Add an optional
telemetry attribute on the <data> node:

  <data directory="data/" database="sqlite" sqlitedb="storage.db" telemetry="off" />

"on" or omitted keeps current behaviour; "off" creates no telemetry_*.data
file and writes no entries; any other value fails at startup with
INVALIDTELEMETRYSETTING.

The flag is passed via new DataModel::SetTelemetryEnabled/GetTelemetryEnabled
methods rather than a new InitialiseDatabase parameter, so a mismatched
libmcdata fails with COULDNOTFINDLIBRARYEXPORT instead of misreading
arguments, and existing InitialiseDatabase callers are unchanged.

Entries are dropped in CTelemetryWriter::writeEntry, not at marker
creation, because the signal slot reaction/finish/acknowledge timing
parameters are computed from the in-memory marker statistics. Channel
registration is also unchanged, so an "off" session stays readable by
TelemetryReader.

Retention of existing telemetry/journal files and the session_metrics
table are out of scope.
* Keep at most one fallback frontend poll in flight

When the event stream is unavailable, the client polls /api/frontend
every 600 ms. Each tick sent a request whether or not the previous one
had returned, so a server slower than the interval got an ever growing
number of overlapping requests: more load on a server that is already
behind. In a browser against a server answering polls after 3 s, five
polls were in flight at once and the queued ones ran into the 10 s
request timeout, because they also took the browser's connections. The
reply serials only dropped out-of-order results; the requests still
went out.

A tick is now skipped while a request sent by retrieveFrontendState is
pending (frontendRequestsInFlight), so a poll tick never adds a second
request and the effective interval stretches to the server's response
time. The counter is released however the request ends; the default
10 s timeout of axiosGetRequest bounds how long a hung request holds
polling back. Navigation refreshes are not held back: the new page's
values are needed at once, and the existing serials keep an older poll
reply from overwriting them. A poll still pending when the stream takes
over is dropped as before but keeps the gate until it settles, also if
the client falls back to polling again in the meantime.

Each tick also calls updateModules, which is what refreshes module data
such as parameter lists and logs while polling. A skipped tick skips
that too, so with a slow /api/frontend those modules are refreshed once
per reply rather than every 600 ms, even if their own endpoints are
fast. A server that slow is likely slow for them as well.

The other periodic client requests (parameter list, logs, configuration
list, part list, execution list deltas) already allow one request at a
time.

The change is in Client/core, so it applies to both the Vue and the
Svelte client.

* Add node:test tests for the fallback frontend poll gate

Client/core is framework-agnostic ES module code, so it can be tested
under plain node without a browser or the client's npm packages.
Client/tests is a small harness for that: support/coreLoader.mjs imports
core modules through loader hooks (support/coreLoaderHooks.mjs) that
load core's .js files as ES modules and replace the third-party imports
(axios, luxon, three) with stubs. There are no dependencies; run
"npm test" in Client/tests, or "node --test 'Client/tests/*.test.mjs'"
from the repository root.

frontendPollGate.test.mjs covers the gate from the previous commit: its
release on reply, error and timeout, a server slower than the interval,
a navigation refresh during a pending poll, and switching to the stream
and back.

Loading AMCApplication.js imports the list modules, which need
Client/core/common/AMCListDeltaSync.js, so the tests require that file.
The wrapper of a lone page module was not a flex container, so the logs
module's flex-1 had no effect and it grew to its full content height.
The page scrolled instead of the log, taking the app bar, log toolbar
and table header with it and breaking scroll-to-latest. The wrapper is
now a flex column, so the log stays within the page and scrolls itself.

The sidebar ScrollArea lacked min-h-0, so on short screens the menu
overflowed; clicking a low item scrolled the overflow-hidden root and
pushed the app bar off screen.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants