What’s new in Axomek 0.2.5
Released
Changes in detail
Results that change when a saved project is solved again:
Feature statistics and usability replays now keep where they came from, at city level: the functions derive the country and city from the request's network address with an offline database (DB-IP's City Lite, CC BY 4.0) and store only that (
location: { countryCode, country, city }), never the address. The console's replay list shows each replay's place with its flag and filters by country (adminListRecordingscountry: a code, orunknown; a new index); analytics has a world map of sessions, installs or events per country, a table of them and the top cities, and filters by a clicked country (adminAnalyticscountry;countries,unknownandcitiesin its answer). Batches and replays sent before have no location. The deploys fetch the database first (backend/scripts/fetch-geo-db.mjs); the privacy policy says so. A deploy whose download fails goes on without locations, with a warning.The privacy choices (the web app's banner, the desktop app's prompt, Settings and "What's included?") now say that the country and city are kept, and that they come from the network address, which is not. Their version is 2 (
consent.version,consentVersion): a choice made under version 1 is asked again, and batches and replays still sent under version 1 (apps before 0.2.5) are taken without a location, their address not looked up.The feedback inbox and the audit log no longer start again from the first page when the item a page ended with is deleted meanwhile: their
nextcursors are now<time>.<id>(createdAt,at), as the replay list's; a bare id is still accepted.The administrator console's replay list no longer ends early under a filter (errors, platform, length). The backend reads at most 2000 replays a page and filters what it reads; a page that found no match in that stretch used to say "No replays match" although older matches existed. It now says how far back it searched and offers "Search older replays", and paging goes on from where the scan stopped (also when the replay it stopped at has been deleted or has expired meanwhile).
adminListRecordingsreturnsscannedTo(the start time of the last replay it looked at, when it stopped there) and itsnextcursor is now<startedAt>.<id>; a bare id is still accepted.The console's feedback item and replay pages always show, and act on, the item of the address: moving to another item while one loads no longer shows the earlier one's late answer, its error or its buttons. Deleting asks about the item by its date (and, for feedback, its reply address); if the page shows another item by the time it is confirmed, nothing is deleted and the console says so. A status change or deletion that finishes after moving on no longer reloads or leaves the item now shown. The replay, feedback, audit, analytics and assistant screens likewise drop a late answer for a filter or period no longer selected.
Save as in the desktop app writes edits made while the new file is being written to that file as well, and the project counts as saved only once the file it is now linked to has every edit. A late save of the file left behind no longer marks the project saved.
Opening a file or a cloud project that takes a while (a file picker left open, a slow download) no longer replaces work done meanwhile without asking: if the open project changed since you agreed to leave it, Axomek asks "Save changes?" again, and a project opened meanwhile keeps its place. Closing Cloud projects (or pressing Escape) while a project downloads cancels opening it.
Back to project from an example in the desktop app rereads the project's file. A change another program (an agent through
axm) made to it while the example was open now shows up, as any change on disk does, instead of being overwritten by the next edit. If the project had unsaved changes too, both are kept: the file stays as it is, your version stays in the app unsaved (no longer written to that file), and a message says so.In the bearing module, a selected rolling element is let go when the bearing's element count changes; the detail views (pressure along the roller, contact pressure maps, subsurface stresses, 3D slice) show the most loaded element then. Lowering the count with a high element selected used to leave those views broken.
The app's keyboard shortcuts (Delete and Backspace, undo and redo, Open, Save, Print, the command palette) wait while a dialog such as Cloud projects, Settings or Examples is open: pressing Delete on a button there no longer removes the item selected behind it.
A PDF report printed over an existing one replaces it only when the printer (the desktop app's WebView2 or a headless browser) finished without an error and wrote a whole PDF. A browser that crashed or stopped halfway used to leave a partial file in place of the complete report; now the report stays as it was and the error is shown.
When another program (an agent through
axm) removes the bearing, gear pair, bolted joint, fit or key shown in its module, the module shows the next one in its list instead of an empty page, as it does after removing it in the app.Whole-number fields such as tooth counts (
gears.G1.pinionTeeth) and accuracy grades can be changed byaxm set, swept byaxm sweepand varied byaxm optimize --vary(and the same calls behind MCP and the app); they used to be refused even for 21 ("expected u32"). A fraction, a number outside the field's range, a sweep whose steps fall between whole numbers, or a fractional bound or step for the optimiser is refused with errorinvalidnaming the path. Without a step the optimiser steps such a field by 1.axm housing import --seat x,y,z,diameter,widthtakes exactly five finite numbers and names a value that is not one ("--seat value 2 (y) 'typo' is not a number"), before the model is read; a value that was not a number used to be dropped silently, so0,typo,0,0,20,10saved a seat at y = 0 of Ø20 × 10.axm optimize --requirelikewise refuses a bound of NaN or infinity, which made the requirement one that never failed.axm optimize --apply(andapplyof the MCP tool) saves the best design only into the project file as the search read it. A file saved meanwhile (by the app, another command or an agent) is refused with errorfileChanged(exit 1) and left as it is; the design used to be saved into the changed project, with the results the search had for the old one.axm cloud list(and the desktop app's native cloud listing) shows every cloud project: the storage lists a folder a page at a time, and only the first page used to be read, so projects on later pages were missing.axm bearing import(a catalogue CSV) refuses a cell that is not a number, naming its line, column and text, also in the optional columns (C0,contactAngle,elementDiameter,elementCount,pitchDiameter,rollerLength); such a cell used to be read as empty, so a typo imported the bearing with estimated values. Infinite or NaN values and anelementCountthat is not a whole number of 1 or more (it was truncated) are refused too. Cells are split by the header's separator, so a decimal comma in a;-separated file is refused instead of splitting the row.A bearing linked to a shaft support whose bore does not match the shaft under its whole width (on another diameter, across a diameter step or past the shaft's end) now fails the check
supports.<id>.bearingSeatand gives a warning atsupports.<id>.positionwith the places it fits; the results are still computed. Saved projects with such a seat show a failing check. The Gearbox intermediate shaft template had one (an NU 207, bore 35 mm, on its Ø30 journal) and now has an NU 206; its saved copies show the failing check.Shafts with gravity along their axis (vertical or inclined,
settings.gravitywith a direction that has an x part): the axial force of the shaft's own weight is now given at each end of each element, falling linearly along it, N(x) = N(0) − ρ·A·gₓ·x. Before, both ends of an element showed the force at its middle, so the stations'axialForceandaxialStress, the largest von Mises stress and the strength check's axial stresses missed half an element's weight at the ends (a Ø20 × 1000 mm shaft hanging from one bearing in one element: 0.0385 MPa instead of ρ·g·L = 0.0770 MPa). The reactions were already right.Strength check (DIN 743 and FKM) with gravity on: a notch or plain section between two nodes now takes the moment of the shaft's own weight there, the parabola M(s) = M(0) + V(0)·s + q·s²/2 the summary already used, instead of a straight line between the nodes; and the automatic plain section is also looked for inside an element, where the weight bends it most. The safeties no longer depend on the mesh: a Ø20 × 10 m shaft on end supports meshed as one element (
maxElementLength- had DIN 743 fatigue safety 3.9e15 (pass) instead of 0.755 (fail), the midspan being no node. On the usual 150-element mesh the change is small.
Strength check (DIN 743 and FKM): the automatic plain section is no longer the place of highest von Mises stress but the plain section of lowest fatigue safety and, separately, the one of lowest static safety, every element end (and, under gravity, inside the elements) assessed. They are reported as one point "Plain section", or as "Plain section (fatigue)" and "Plain section (static)" where they differ; the point "Max stress (plain)" is gone. A steady torque raises the von Mises stress far more than it lowers a rotating shaft's fatigue safety, so the old point could sit where fatigue was harmless: a Ø20 × 1000 mm shaft with 1000 N at midspan and 300 N·m between 0 and 100 mm was assessed at 100 mm, fatigue safety 1.44 (pass) by DIN 743 and 3.73 by FKM, while midspan, with 318 MPa reversed bending, has 0.913 and 0.929 (fail).
minFatigueSafetyandminStaticSafetyfall where a plain section governs; the starter templates' and the saved test files' results do not change (their weakest points are notches). With a duty cycle, FKM damage accumulation still sums a plain section only where it is the same point in every load case.Strength check (DIN 743 and FKM): the automatic plain section is left out only where a notch or an explicit plain section assesses the same place, section and forces. Before, any assessment within 1 mm took its place, so one beside a concentrated moment, on the low side of the jump, hid the governing section: a Ø20 × 1000 mm shaft with 100 N and +300 N·m at 500 mm and −300 N·m at 750 mm has fatigue safety 0.794 by DIN 743 and 0.808 by FKM (fail) at the high side at 750 mm, but plain sections added at 499.5 and 750.5 mm made it 9.14 and 9.30 (pass). Projects with an assessment near, but not at, the weakest plain section can now show that section as well, and a lower
minFatigueSafetyorminStaticSafety; the templates and the saved test files do not change.Checks against a minimum or a maximum now pass or fail by comparing the value with the limit, signed, instead of by their ratio. A ball screw's contact ellipses running over the groove edge (a negative
grooveEdgemargin against its minimum of 0°) used to pass: the starter screw withgeometry.grooveDepth0.1 mm has −16.94° and now fails (0.15 mm: −8.70°). A limit you set to 0 or below is compared the same way (amaxDeflectionof 0 passes a shaft that does not deflect, a negative one fails any shaft; a minimum of 0 fails a negative value). Against such a limit theutilisationis 1 at the limit, within 0–2, and the message gives no percentage. A maximum whose value could not be computed has utilisationinfinstead ofnull. Positive limits keep their ratios.A load case of the duty cycle that a shaft cannot be solved for is now reported whether or not bearings are linked to the shaft: in the shaft's
caseErrorsand inincompleteasloadCases[<index>], soaxm solveexits 3, sweep rows fail and the optimiser counts the design as unsolved; the shaft'sminFatigueSafetyandminStaticSafetychecks are left out. Before, only linked bearings noticed: a shaft without bearings whose case had a net axial load of 1000 N and no locating support kept complete, passing results (strength.casesempty, the strength checks from the loads as entered).settings.maxElementLengthfiner than the shaft's length over 100 000 elements is an error on that path, with the shortest length to use; the solver also refuses (errortooManyElements) a mesh that its supports' and loads' nodes would push past 100 000 elements. Before, a tiny value (1e-300 mm) passed validation and the solve tried to allocate a mesh of about 1e302 elements; a value of 0 or less, ignored before (the default mesh), is now an error too.