Skip to content

PRO — 19: final polish, testing and QA of the chain - #243

Draft
Batuis wants to merge 71 commits into
feat/pro-18-specificationsfrom
feat/pro-19-polish
Draft

Batuis wants to merge 71 commits into
feat/pro-18-specificationsfrom
feat/pro-19-polish

Conversation

@Batuis

@Batuis Batuis commented Sep 29, 2026 •

Copy link
Copy Markdown
Collaborator

Part 19, closing the chain. Stacked on #241. Draft until the owner says otherwise.

A review of everything parts 7 to 18 added, run as six parallel audits (the JS analysis layer, persistence and undo, the PRO interface, results/design/sections, examples/translations/guide, and test coverage) and a walkthrough of every PRO panel with and without a solved model. This PR fixes what they found, adds the tests that would have caught it, and polishes the interface where the walkthrough showed it needed it. Each commit says what it fixes and why.

Calculation

  • Solve honours P-Delta per combination. PRO's Solve, live calc and the phone shell take the parallel entry, which skipped analysis.perCombination and solved every combination linear; the optimiser's sync entry honoured it. The parallel entry now dispatches the same way.
  • A solve is finished the same way wherever it ran. The axial part of member loads (16/18) was given back only on the main thread: every worker solve (Solve, live calc, the direct analysis) and every solve with a cable or a multilinear spring read the average axial force of a loaded member. solve-finish.ts now finishes every 3D linear and P-Delta result, and the worker, the wrappers and the cable and soil-spring solves all use it.
  • Advanced and the direct analysis read the project's rules. Both built their model without analysis and groups: self-weight fell back to the older rule (counted twice or lost) and the shear switch was ignored.
  • The self-weight rule follows its cases and members. Deleting a case left its rows; a member listed by id lost its weight when split and passed its id on when deleted.
  • Design follows a member's behaviour on every path (design/behaviour-demands.ts): the optimiser sized tension-only braces for buckling and the other codes failed them. Cables in compression under superposition are listed as sign violations.
  • A design missing combinations says so. A combination without second-order equilibrium publishes no forces; the concrete, steel and other-codes panels now name it and call the design incomplete.
  • τb only on steel (concrete carries f'c in fy and could lose its stiffness), a directional deflection rule reads its own governing set, a section's own dimensions beat its name (a CSV row "IPE 300" 400 mm deep solved as the IPE 300), one bad CSV row loses one row, composite drawn sections weigh Σρᵢ·Aᵢ (−31 %/+43 % before), the optimiser leaves declared and drawn sections alone, extremes are read along the members in the report and the Envelope sheet, repeated case names solve in one multi-case pass.
  • Diagnostics: the engine's solver lines are translated (they showed DIAG.SOURCE.UNDEFINED in English); a clean model reads clean; semi-rigid ends that are solved rigid are reported before a solve.

Persistence

  • Share links from the feedback widget and from Basic carry the model code whenever the compact format would drop something (every PRO addition was lost); "Paste link" opens code links.
  • Office templates keep drawn sections' materials; the time-history panel writes only on edits and follows the project under it; the self-weight migration takes no undo step (it made an undo trap); Basic's self-weight toggle is read in Basic; report figures and the direct analysis are forgotten on project change; arcs are one undo step; older files drop shellFamily; a project with data and no node is autosaved; an autosave restores its self-weight toggle.

Interface

  • Specifications keeps the member selection across sections; foundation springs move to Surfaces (where the pointer picks shells); the shell offset fields show what the shells carry; end conditions (local releases, global joints, semi-rigid) are one section of Members, and the members table's hinge columns show each end and open it; right-click › Specifications on members and supported nodes; the supports table shows type and what it adds and opens Supports; a standard support shows what its type restrains.
  • "Vínculos" becomes "Uniones entre nodos" (en "Node links"), as decided.
  • Gallery in a wide overlay; Design opens on steel for steel models; steel examples declare their grade (the seven code examples at F-24's 240 MPa); the grade stage says each missing input once; generator hints styled; file inputs are buttons in the app's language; a logo too large is said inline; the report links to Project data; new plates default to concrete; stress card no longer contradicts a bars-only map; pick buttons where a panel acts on members or nodes its pointer does not pick; clearing all links asks first; list rows and section tabs work from the keyboard.
  • Every label translated (report advanced choices, Advanced strip, loads, errors, gallery words), about a hundred orphan keys removed.

Second audit

A second pass over every PRO function, with the English and Portuguese of the whole PRO surface. What it found is fixed here.

Modelling and files

  • Splitting at a member's own end no longer makes a zero-length member. Renumbering, merging collinear members and deleting a group carry every id reference with them (self-weight lists, deflection rules, what a view hides, time-history forces); merging keeps the far spring.
  • The compact share link kept six decimals, so a steel section arrived with Iy 1e-6 and J 0: it keeps ten significant figures, and whether a model needs the code link is decided by encoding it and decoding it back.
  • Importers: the PRO Excel import reports what it did, reads header units, flags repeated ids, reads 4-node plate rows as quads and writes diaphragms the way the engine reads them; IFC matches profiles by exact name and reads Spanish and Portuguese materials; the legacy DXF mapper reads decimal commas and splits T-junctions.
  • Generators: truss chords share the bearing node when the end depth is 0; regenerating welds onto free nodes; slab to stair keeps its loads; cones and spheres close on an apex; the mesher refuses a region already meshed.
  • Optimiser proposals belong to the project and model version they were made on.

Advanced analyses (the engine items are recorded outside the repository)

  • Imperfections build notional loads from each node's whole vertical load; creep and shrinkage are solved by the effective modulus, for concrete only; staged construction names load cases, brings the supports in with the first stage and shows its final state; pushover refuses non-steel members and keys Mp by the sections the solve uses; the fibre option, which never ran, is gone; modal mass uses the real area; the section analyzer's J comes from the torsion solve. The panel says these analyses load the unfactored sum of the cases.

Concrete design

  • Columns read the design curve (phi·Pn = Pu, not Pn = Pu, which was up to 50 % unsafe at high axial load) and treat tension as tension. Beam shear follows CIRSOC 201-2025 (section limit, Av,min, row (c)). Development length is Table 25.4.2.3 everywhere. Columns reach the verifier with their slenderness magnifier. Footing one-way shear is checked both ways. Slabs are designed for the envelope of the combinations, with phi. Detailing is not marked done while bars conflict.
  • On the flagship frame 21 columns and 191 beams change and every one stays verified; the per-member fingerprint is re-recorded with the reason, the counts unchanged.

Steel and connections

  • phi_c = 0.85; Cb = 1 at a cantilever's free end; channels get Cw, F.2's c and Sy to the flange tip; Cb applies in the inelastic range; AISC and EC3 check shear across the web against the flanges or side walls; the industrial shed fixture's crane girder and purlins had iy and iz crossed; deflections without a service envelope add the gravity cases; joint bolts are checked for forces that act together; the bolt calculator uses J.3.7; the optimiser leaves aluminium and cold-formed out; angles and tubes name the check's scope.

Report

  • It prints the Design panel's verification instead of re-designing members with the older checker, the CIRSOC 103 story drift the panel shows, sub-sections numbered in order and dates in the app's language.

Translations

  • English: 661 PRO strings, one term per thing and US spelling, following the project's convention; keys the open Basic PR also edits are left to it.
  • Portuguese: about 540 missing keys, strings left in English, the old axis convention and European forms. Full es/en/pt parity is now a test, with a listed exception for the keys the Basic PR brings.
  • Hard-coded strings in the RC panels, constraints, diagnostics and steel grades are translated; gallery examples open with their names in the app's language.

Blog. The CIRSOC 201 post's embedded beam now closes at 0.89 and 0.87, both governed by the anchorage of the bars; its caption said bending and shear under 1.2D+1.6L and is rewritten in the three languages.

Left for later, recorded outside the repository: footing design over every combination, beam ductility at supports and a cover input, the joint coordination behind the flagship frame's bar conflicts, a flat Excel workbook with 3D content, the detailing engine's reasons and the concrete check names, which are written in one language whatever the app's.

Open question: whether the CIRSOC 301 panel shows each member's utilization as an experimental result.

From a first user's model

A scaffold model sent in by someone using Stabileo for the first time showed four things the app could have said or prevented:

  • A disconnected structure says why. Each post was one member and the ledgers ended on nodes sitting on the posts, so the model was twenty loose pieces. The message now counts the nodes that sit on members without cutting them and names Edit › Cut › Split at the nodes on them, and the error toast offers that command over the whole model as one undoable edit.
  • Built section dimensions are typed in millimetres. In metres, a 50.8 × 2.5 mm tube went in as 0.508 × 0.025, a hundred times its area and stiffness.
  • Combinations that add up nothing, or leave the permanent load out, are model warnings. The model had "1.4D" empty and "1.2D + 1.6L" with only the live case.
  • The solver's error sentences are shown in the app's language ("Singular stiffness matrix — structure is a mechanism" reached a Spanish interface as written).

Modelling in PRO: results, selection, drawing

  • Results that could not be selected. One click in empty space with the node tool left a node no member holds; its free degrees of freedom made every solve fail, results were cleared and every diagram button stayed disabled until the node was found and deleted. The solve now leaves out nodes nothing holds, with their supports; a loose node that carries a load still stops the solve by name. Separately, a pixel of jitter while clicking a node moved it onto its own position and cleared the results: the drag now starts on real movement.
  • Selection tools. A click in loads mode selected nothing (3D had no load picking): the load batch records what each load draws and a click takes the nearest, a point load winning a tie at a joint. A drag missed every nodal, point and shell load (the 3D load types fell through to the member branch). A selected load is drawn in the selection colour with the rest dimmed. A click never selected a node (the press pushed an undo state and the release undid it, which also cleared the redo history). Members mode picks members only. All, Invert and Previous reach supports and loads; Previous works after a click on nothing; Loaded in case takes the loads while loads are armed.
  • Drawing bar. Drawing a load or a support showed Basic's options strip above the top bar. A PRO bar under the ribbon now says what the next click does and offers PRO's choices for each tool: plane and level for nodes; frame or truss, material, section and chaining for members; 3 or 4 nodes, material and thickness for plates; the support types; the case, kind and all six components for loads. Escape leaves drawing.
  • Members and plates while drawing. Node I and the picked plate corners are ringed in the model, with a dashed preview to the pointer. The Members panel built members of its own from the selection while the viewport built them too, so a third click joined a stale node to the new one; it no longer does. A plate is made when its last corner is picked and the next one starts; three or four nodes is a visible choice.
  • Draw and Write. Each of Nodes, Members, Shells, Supports and Loads has two twin buttons, "Draw …" and "Write …". Write opens a card with the fields and an "Add …" button (Enter adds and the first field takes the focus again). The support and the plate written in the panel and drawn in the model are the same draft.

Tests and gates

  • CI now runs the typecheck against its baseline and check:gate; the new PRO folders are guarded.
  • pro-analysis-rules and pro-project-workbook are @smoke (CI never ran them); the optimiser e2e asserts proposals and the depth limit.
  • The optimiser e2e, once it asserted a proposal, showed it had never checked anything on the bare portal fixture (no fu): it runs on a gallery example, and gallery steel now carries its grade's fu.
  • New unit tests for each fix above, the self-weight migration's cases, the shear switch at the engine, the Specifications and Cables sheets; each it.fails has its known wrong value bounded beside it; baselines hold a residual to the scale of its loads.
  • Gates after the modelling QA: typecheck at its baseline (466); 10 683 unit tests; build; check:gate; locally every PRO e2e spec plus Basic selection, 233 green, on the final build.
  • Gates after the second audit: typecheck at its baseline, now 466; both test passes (10 661 unit, 23 build); build; check:gate; e2e: CI green on every job. Locally the full e2e ran 1384 green before the last fixes; its failures were wording and figures this PR changed, all green on the final build except the known flaky Basic step, which passes on retry.
  • Gates before it: 10 550 unit, 23 build, CI green on every job. Locally the full e2e ran 1397 green; its failures were the two specs fixed after it started and one known flaky Basic step, all three green run alone on the final build, and the non-blocking visual baseline, which CI does not run.

Not changed

  • The engine. Items that need it are recorded outside the repository (a semi-rigid connector in local axes; the modal mass of composite drawn sections).
  • Left for later, recorded outside the repository: the Basic 2D-in-3D loads' axial share, nodal averaging of shell contours in local axes (pre-existing), missing small EN unequal angles, the workbook's round trip through the importer, persisting direct-analysis settings, the command palette's index, Apply buttons still on member offsets and design lengths.
  • The reference program's name where it already was on main, as decided.

QA

  1. A column with a 1.4 D combination and P-Delta per combination: Solve shows second-order results (B2 in the results) and an unstable combination makes the Design panels say the design is incomplete.
  2. A column under a load along its axis, solved with Solve: the axial diagram goes from the whole load at the foot to zero at the head (it read the average before).
  3. Specifications: pick members, open Surfaces, come back to Members: the members are still picked. A table's Hinge column opens the member's end conditions.
  4. A tension-only brace compressed under superposition: steel design, other codes and the optimiser do not check it in compression.
  5. Load the simple shed and open Design: steel design opens and the members have a grade.
  6. From Basic with a model that visited PRO, send feedback: the attached link reopens the same PRO model.
  7. With the node tool, click once in empty space, then Solve: results show and the diagrams select; the diagnostics name the loose node.
  8. Selection › Loads: click a nodal arrow and a distributed load; each lights alone. Drag right to left over a loaded node: its load is taken.
  9. Draw member: after the first node it is ringed and the bar names it; four clicks make two members. Draw plate with "3 nodes": the third click makes the triangle.
  10. Each panel's "Write …" adds with Enter; Escape leaves any drawing.

PRO's Solve, live calc and the phone shell take the parallel entry, which skipped
analysis.perCombination and solved every combination linear; the sync entry (the optimiser's)
honoured it, so a project gave different combination results by button. The parallel entry now
dispatches as the sync one does, and runs only the linear core on the workers. A test solves the
same column both ways.
The axial part of member loads was given back to its members only by the main-thread wrappers:
every worker solve (PRO's Solve, live calc, the direct analysis) and every solve of a model with a
cable or a multilinear spring read the average axial force of a loaded member, the defect 16/18
fixed on the other path. solve-finish.ts now finishes every 3D linear and P-Delta result (the
stabilised reactions out, the axial part back), and the worker, the wrappers and the cable and
soil-spring solves all call it. The cable densities use the one kg/m³ conversion the dynamic
analyses use.
…rules

Both built their own model without analysis and groups, so self-weight fell back to the older
rule (every dead-load case, or none, by a toggle PRO hides once a rule exists) and the
shear-deformation switch was dropped: P-Delta, buckling, modal, spectral, pushover, time history
and the direct analysis could run on other loads and stiffness than Solve. Advanced now uses the
store's builder, and the direct analysis passes the rules. A test checks the direct analysis
takes a stated self-weight once with the old toggle on or off.
Deleting a load case left its self-weight rows behind: the single solve still loaded them and the
combinations did not, and the panel showed a case that no longer exists. A member listed by id in
a rule lost its weight when split and handed its id to the next member when deleted. The rows now
go with their case, and the member lists follow splits and deletions as groups do.
…ir own name

- The engine's own solver lines (path, conditioning, fallbacks) came without a source and in
  English: the panel printed DIAG.SOURCE.UNDEFINED beside them. They are read into the app's
  shape and translated, numbers kept (engine-diagnostics.ts), in the panel and in the toasts.
- A model with no error at all read 'the model is missing data the analysis needs'; it now reads
  as clean.
- A semi-rigid end on a member whose bending axes are not global ones is solved rigid (its
  connector acts in global axes); the model check now reports those members before a solve.
- 'Vínculos' in Specifications becomes 'Uniones entre nodos' (en 'Node links', pt 'Ligações
  entre nós'): in Argentine usage 'vínculo' reads as a support, beside Supports. The diaphragm
  note points at its new place.
The rule (an inactive member is not designed; a tension-only member or a cable faces no
compression check, a compression-only member no tension one) lived inside the CIRSOC steel check
alone. The optimiser sized tension-only braces for buckling, the other codes failed them, and the
concrete design read inactive members. design/behaviour-demands.ts now holds it and the four paths
read demands through it; result tables and exports still report what the analysis gave. A
superposed combination that leaves a cable in compression is listed as a sign violation, as a
tension-only member is.
- A combination with no second-order equilibrium publishes no forces, and every design path
  reads the combinations that have them: a member could read 'passes' on the rest with only a
  passing toast for trace. The concrete, steel and other-codes panels now name the combinations
  left out and call the design incomplete.
- The direct analysis gave τb to every member whose material has a yield stress, concrete
  included (its fy holds f'c): a heavily loaded column lost its flexural stiffness, to zero past
  f'c·Ag. Pns is built for steel members only, by material family.
…erns along it

The span kept the set with the largest resultant deflection, and a rule along local y or z read
that set's component: a wind set that sways a beam sideways more than gravity bends it passed an
L/n check along z the gravity set fails. Each direction now keeps its own governing set, named
with the deflection.
… loses one row

- A section named like a catalogue profile took that profile's outline whatever dimensions it
  carried: a CSV row 'IPE 300, I, 400, 200, 10, 15' solved as the IPE 300 while storing h =
  0.4 m. The name now looks up dimensions only when the section has none of its own or the same
  ones. A catalogue pick writes the profile's thicknesses, so none from a previous make-up stay.
- A CSV row whose dimensions draw no section threw and the whole file was lost without a word; it
  is refused by line and the rest are imported.
…s weigh

Its 'a' is transformed (Σ n·Aᵢ), right for stiffness and wrong for weight: an HEB 300 filled
with concrete weighed −31 % with steel as the reference, +43 % with concrete. A drawn section of
more than one material now keeps each material's real area, and self-weight (as a load and in
the statics check) and the quantities read one helper, member-weight.ts, that sums ρᵢ·Aᵢ; the
quantities put each material in its own bucket. Its plastic modulus is no longer integrated as
one homogeneous outline at the reference yield stress: it takes the estimate from its
transformed inertia.
A template's materials land under new ids here (or as the project's own of the same name), but a
drawn section's reference material, parts and areas kept the template's ids and pointed at
whatever project material had those numbers: the stiffness changed without a word. They follow
the materials now.
The feedback widget attaches a link to every report, and it used the compact format, which
predates PRO: a PRO model reopened with its cables as frames, tension-only members linear, no
P-Delta per combination and its self-weight migrated again. In PRO the link now carries the model
code, as PRO's own Share does; from Basic, a model that states anything the compact format drops
(behaviours, sections' own properties, supports that lift, the analysis rules, the grid, the
dynamics, project data) is shared the same way. 'Paste link' opens code links too.
… without traps

- The time-history panel stored its default run and pushed an undo step just by opening, kept a
  draft that undo, a tab or a file never refreshed, and could write one project's run into the
  next. It writes on edits only, re-reads its draft when the model is replaced (a new
  modelStore.loadEpoch), and drops a pending write then.
- The self-weight migration made a load case outside any batch: undoing it brought back a model
  the panel migrated again, pushing a new step and clearing redo. It runs without an undo step
  (modelStore.withoutUndo), as its header always said.
- Basic has its own self-weight toggle, and a model that had visited PRO carried a stated rule
  that silenced it. Basic solves read the toggle.
- The report's figures and the direct analysis (settings and run) belonged to the session, not the
  project: they are forgotten when a file, a tab or an example is opened.
- An arc is one undo step; an older file's shellFamily is dropped on load; a project with a grid,
  rules or data and no node yet is autosaved and offered back, and an autosave restores its
  self-weight toggle as a file does.
- The results panel's unused copy of the solve flow is gone.
- Tests for the migration's plan and each of its cases, and for Basic's toggle.
…es left behind gone

- The report's advanced-analysis choices printed raw ids (pdelta, modal); they have labels.
- The gallery's Spanish cards read 'Bowl', 'Shells' and 'shells'; the Advanced strip had 'Time
  History', 'No lineal', 'Modos:', 'Tipo:', 'Corotacional' and 'Max iter' in every language; the
  loads panel said 'selected elements'; the level-names placeholder, a table header, the drawn
  section's accessible name, the mat example's slab group and the one-way solve's errors were
  fixed strings. All are translated in es, en and pt; the stiffness presets print their factor
  with the reader's decimal separator.
- About a hundred keys that nothing reads any more go: the retired contact, multi-case and
  constrained views, the old mesher and example menu, the old report fields, the examples' old
  ids.
…ere its selection is

- Moving between Members and Surfaces emptied the member selection each time: it is set aside
  while shells are picked and given back.
- Foundation springs act on selected shells but sat under Supports, where the pointer picks
  supports: they move to Surfaces.
- The shell offset fields opened at zero whatever the shells carried; they show the selection's
  offset, or say it is mixed. The top and bottom face presets use each shell's own thickness,
  not the first one's for all. The fields have accessible names.
- A time-history record again warns when its peak reads as a unit mistake, when the run's dt
  loses its peak, and when the run is shorter than the record: the warnings were lost when each
  direction got its own row.
- End conditions of a member (local My/Mz/T releases, joints in global axes, semi-rigid ends)
  are one section of Specifications › Members, with the stiffness factors in their own. The
  members table's Hinge i/j columns show each end as fixed, pinned, semi-rigid or partly released
  and open that section on the member; a member not made yet still takes pinned or fixed there.
  In PRO the right-click editor links to it instead of repeating it, and a right-click on a
  member or a supported node offers Specifications….
- The supports table shows each support's type with what it adds (lifts off, springs, curves,
  inclined) and opens Specifications › Supports on it; type and lift-off are edited there.
- A support of a standard type shows what its type restrains, read only, and takes no spring on
  those degrees; its inputs have accessible names.
- Editing one custom stiffness factor wrote the first member's four onto the whole selection; it
  now changes that factor on each member and keeps their own others.
- 'Remove shear areas for all' spared nothing, typed areas included: it removes the ones taken
  from geometry only, and Sections says when the analysis switch leaves shear out.
- Specifications › List names support curves and shell offsets with their values.
- The gallery's steel examples declared no grade, so steel design had nothing to check: the seven
  written as code declare F-24 (at its 240 MPa; they said 235), and the fixture examples are
  given the grade their steel's name states on load.
- The steel grade stage repeated the same paragraph under every member; each missing input is
  said once with how many members it holds back, and the rows name their gaps.
- Design opens on steel design for a mostly steel model.
- The stress map of a model of bars no longer shows a card saying there are no shell results.
- The generators' field hints had no style and printed at body size.
- The CSV import and the report logo are buttons in the app's language, not the browser's file
  control; a logo too large is said beside it, not in an alert; the report links to Project data.
- New plates and gap fills are offered the model's concrete, not its first (steel) material.
- Plates offers Surfaces with the selection and its count, as Members does.
- The gallery opens over the viewport, its cards side by side.
- Advanced's P-Delta says it takes every load together, unfactored, and where the per-combination
  one is; ?proTab=specifications opens the tab.
- Specifications: list rows and section tabs work from the keyboard (arrows between sections),
  and the tabs are larger on a phone.
- Clearing every link or connector asks first.
…e read along the members

- The optimiser matched sections to the catalogue by name, declared and drawn ones included, so
  a declared 'IPE 300' with other properties got the catalogue's verdict; and applying reused any
  section of the chosen name. Both skip declared and drawn sections now.
- The report's summary of extremes and the workbook's Envelope sheet read member ends only, while
  Maxima read stations: a simply supported beam's largest moment was 0 in the report. The summary
  reads 13 stations and says where along the member; the Envelope sheet uses Maxima's stations.
…hat they combine

- The engine's multi-case solve keys cases and combinations by name and refuses a repeat; a
  project with two cases of one name fell back to solving case by case without a word (validation
  model 04 has eight 'CRANE' cases). Each goes to the engine under its id now. Model 04's cases
  are numbered too; its baseline is re-recorded: the names, and at most 7e-13 relative from the
  multi-case path.
- An example's own combination that lost a term to a dropped empty case is named from what it
  adds up (the offshore platform listed an L it no longer had).
- Baselines hold a residual to the scale of its loads, not to its own column of round-off, which
  failed on any change of summation order.
- HE M sections get the default grade their family has; a member's stress bound no longer puts
  the weak inertia where the strong one is missing.
… they should

- CI runs the typecheck against its baseline and check:gate after the build: every PR body named
  them, and they ran on the author's machine only. PRO's Specifications and drawn-section editors
  join the guarded paths (one real error there fixed: a release default the spread overwrote).
- The analysis-rules and project-workbook e2e specs had no tag, so CI never ran them: both are
  @smoke now.
- The optimiser e2e passed on a table of dashes and never checked its depth limit: it requires
  a proposal and every HEB at most 400 mm deep.
- New unit tests: the shear switch reaches the engine (no shear areas, and a short cantilever at
  PL³/3EI), the Specifications and Cables workbook sheets.
- Beside each it.fails, the known wrong value is bounded (the pushover's simultaneous-hinge stop,
  the engine's P-Delta moment without Kg·u, the shells' drilling residual), so another failure
  cannot pass for it; a drawn-section test no longer returns early with nothing checked.
Loads acts on selected nodes or members and Supports on selected nodes, while their pointer picks
loads or supports: 'On the selected members' waited for a selection the panel could not make.
Where such an action has nothing selected, a button switches the pointer to members or nodes, and
says so once it has (loads, supports, floor loads on the selection).
en and es: Specifications with its end conditions in one place, node links under their new name
('Uniones entre nodos'), foundation springs under Surfaces, the members and supports tables as
indicators with a way to their editor, right-click › Specifications, the shear buttons and the
analysis switch, the pick buttons of Loads and Supports, Advanced on the project's rules and what
its P-Delta loads, modal and spectral with node links as they really behave, the mass source, the
time-history record warnings, the report's summary along the members and its session state, where
Design opens and the incomplete-design notice, the gallery overlay, IFC among the imports. Claims
the audit found false are corrected (hinge columns releasing Mz only, trusses only from generators
or Excel, the 90 % option hidden with constraints, 'three parts' of Loads, 'mixto', 'Roller').
Validation model 04's header no longer counts the source's iterations.
A diagram tolerates a result record without its load arrays (synthetic and older records), now
that the report reads members at stations; the report-scale test checks where and under which
set its extreme is. The offshore test checks its own seven combinations, U3 named from what it
adds up.
- Declaring a gallery example's steel grade was not enough: steel design needs the ultimate
  strength too, and the fixtures carry none. The grade's fu (and fy where missing) is written with
  it, the seven code examples state F-24's 370 MPa, and a test checks that steel design gives a
  verdict on the members of two gallery examples (angles aside, outside the member check's scope).
- The optimiser e2e, now that it asserts a proposal, showed that on the bare portal fixture it had
  never checked anything (no fu): it runs on a gallery steel example opened through its card.
- The Advanced modal button has a test id; the dynamics e2e used its old label.
Cutting a member at one of its own ends made a zero-length member. Renumbering left
self-weight lists, deflection rules, hidden members and time-history forces on the old
ids. Merging dropped the far segment's spring and the references to the absorbed
segments. Deleting a group left the self-weight loads and deflection rules scoped to it
covering nothing; they now name its members, and a group whose shells a self-weight load
covers stays, with a message.
The compact link rounded every number to six decimals, so a steel section's Iy of 1.42e-6
arrived as 1e-6 and its J as 0; numbers now keep ten significant figures. Whether a model
needs the code link is decided by encoding it, decoding it back and comparing, instead of a
list of dropped fields that had missed custom supports, curved shells, saved views, grades
and more. The model code reader also sets the soil profile counter.
Proposals outlived opening another project or editing the model, and Apply then wrote the
old picks by section id onto whatever carried that id now. Proposals now show and apply
only on the project and model version they were computed on; applied rows follow the
project too.
Tables cited as 'Tabla', Spanish stage names and clause quotations inside English text,
decimal commas, controls named that do not exist (Calculate, the Shells tab, the Results
tab, Save project), and terms that said the opposite (snap grid to nodes). Internal
tokens no longer print on screen: the axis basis, the cold-formed basis and
GEOMETRY_UNAVAILABLE read as words in every language. The steel results page no longer
lists the Mp <= 1.5 My cap as missing, since the checker applies it, and the Cb
assumption now says Cb is computed from the diagram where F.1.1 allows. The self-weight
badge is translated, and the plates table no longer prints its unit twice.
…ells and profiles

The PRO Excel import now shows the same report as Basic. The Excel reader converts the unit
in each header, reports and drops repeated ids and second supports, reads a 4-node row on
the Plates sheet as a quad, refuses repeated corners, honours dir on distributed loads and
writes constraints in the engine's shape, so the template's diaphragm solves. A flat
X-Z workbook opens upright. The IFC mapper recognises Spanish and Portuguese material
names and matches profiles by exact catalogue name, so IPE 30 no longer becomes IPE 300.
The legacy DXF mapper reads decimal commas and exponents and splits T-junctions. Every
importer message is translated.
…keep their loads

A truss with end depth 0 left its chords on separate nodes at the bearings, so it deflected
several times too much and placing it dropped members; the chords now share the bearing
node. Regenerating in place welds onto free model nodes and skips members that already
exist. Converting a slab to a stair carries its surface and thermal loads onto the flight
and removes the corners nothing uses. Cones and spheres close on an apex instead of
degenerate quads, the mesher refuses a region already meshed, fill leaves an enclosed
outline open, an odd-segment arc through a node no longer orphans it, the stair defaults
to the model's concrete, and generating a tapered shed is one undo step.
…d so

The optimiser ran the CIRSOC 301 hot-rolled checker on aluminium and cold-formed members,
and for a family the checker does not cover (angles) it said none passed. Those members are
now left out with a count on screen, and an uncovered family reads as not checked.
… J.3.2 lists

The auxiliary calculator combined tension and shear with an elliptic formula instead of
J.3.7's reduced tension strength, took the standard hole as d + 2 for every diameter where
Tabla J.3.3 gives d + 3 from M24, and offered a 5.6 grade the table has no row for.
The member check reads a web and flanges, so an angle's rows listed web and flange
thickness as missing data no angle has, and the 148 angles of the simple shed could not be
cleared. They now read as outside the check's scope, with tubes pointed to AISC 360 and
EN 1993 under Other codes.
The P-M check solved Pn(c) = Pu on the nominal curve and took phi·Mn there, which at high
axial load sits at too small a c: a 30x30 with 8Ø16 in H-25 read 71.7 kN·m at 1200 kN
where the design curve gives about 48. It now solves phi(c)·Pn(c) = Pu, with phi from
CIRSOC 201-2025 (tension-controlled from eps_ty + 0.003). The axial force keeps its sign:
a column in tension was checked as if the same force compressed it. Under tension the
biaxial check uses the load contour, since Bresler's method is for compression. On the
flagship frame 21 columns take more steel and stay verified; the counts do not move.
Shear had no section limit, so a 20x40 H-20 beam with Ø12 4 legs c/5 was certified for
700 kN where the section takes about 200; stirrups below Av,min still used row (a), so a
30x60 H-30 with Ø6 c/25 passed. Vc now reads Tabla 22.5.5.1: 0.17·sqrt(f'c) plus Nu/(6 Ag)
with the gross area, row (c) with lambda_s and rho_w below Av,min, and Vs is limited to
0.66·sqrt(f'c)·bw·d (§22.5.1.2). On the flagship frame 191 beams move within ±0.11 and
all stay verified.
The design check, the adapter's detailing limits and the report's detailing table read
the 2005 fy·db/(3.2·sqrt(f'c)), about half of Tabla 25.4.2.3: 0.42 m for a Ø16 in H-25
against 0.64 m. They now read deriveDevelopment, the source the detailing and the drawings
use, on its favourable-spacing row. Four members of the flagship frame move within 0.03;
the row-2 fixture's known missing bar line now leaves its envelope partially exhausted.
Only the strips along B were checked, so a 1.5 x 3.0 m base passed and the same base turned
90 degrees failed at 380 against 158 kN. The L direction is now the same check on the base
turned, and the larger utilisation governs.
The verifier multiplies a column's moments by delta_ns and the capability matrix says it
runs with the value supplied, but the design contexts were built without it, so every
column was checked with delta_ns = 1. The context builder now computes it with the same
checkSlender the report uses (§6.6.4, joint restraint from the model), per combination
from the column's end forces, read about the weaker axis, and keeps the largest.
Slab flexure read the shell moments on screen, which after a solve is the first load case
or whatever case the user was looking at, while the shear check of the same run used the
factored envelope. Each shell now carries its moments in every design combination and
each face is designed for the largest Wood-Armer demand among them; the record says the
demand is the envelope. The slab steel also takes phi = 0.90, which it had left out.
The flagship frame closed the detailing stage with a tick and read 'members detailed and
verified' over 7322 open bar conflicts while its sheet said not constructible. The stage
now stays open while any non-marginal conflict remains, and the notice beside the command
states how many the last run left open.
A member with stiffness modifiers is solved on a scaled section, and the mass matrix read
rho·A from it, so a factor on A for stiffness changed the member's mass as well. The mass
source now names the unscaled area and scales the member's density to it. The moving-load
test follows the US spelling of the cancel message.
Imperfections build their notional loads from each node's whole downward load, member
loads and self-weight included; the engine read nodal loads only, and the seven-storey
building took 78 % less sway force. Creep and shrinkage are solved by the effective
modulus on the ordinary solve, for concrete only and each with its own f'c; the engine
computed phi and then solved with the original modulus. Staged construction names load
cases instead of internal indices (it applied no load by default), brings the supports in
with the first stage, sends its final state to the viewport, refuses curved shells and
connectors, and says that a member added later takes its force from the cumulative
displacement. Pushover refuses non-steel members and keys Mp by the sections the solve
uses. The fibre option, which never ran, is gone. The panel states that these analyses
load the unfactored sum of the cases, and every label and error prefix is translated.
The polygon analyser's J read 7 % high on a solid rectangle and more than double on an I;
the panel now takes J from the Saint-Venant solve on the section's mesh, which agrees with
Roark. The Winkler springs say they act along the member's local axes, and both start
non-zero, since kz = 0 left the member resting on nothing vertically.
The report and the workbook read the result on screen with no Cd, a fixed 0.015 and a
clause that does not state it, so they printed a different check from the panel's. They
now scale each seismic case by Cd/gamma_r and take Tabla 6.4's limit for the project's
group on condition D, keep each storey's worst case, and state the basis; without the
seismic settings there is no drift section.
…s own

The report re-designed every concrete member with the older checker: bars of its own
choosing, a linear P-M interaction, fy 420, 25 mm cover and Ø8 stirrups hard-wired and 2005
clause numbers, so the document described a different design from the panel's, with a bar
schedule that disagreed with the detailing quantities. The report and its workbook now list
each member's own reinforcement as the panel checked it, with the governing check, demand,
capacity and utilisation, and say so when nothing has been designed.
With the lossless check, a steel model's grade, fu, standard and region were found missing
from the compact link and it switched to code form. The compact format now carries them,
so a Basic steel model keeps its short link and arrives with its grade.
The CIRSOC 201 post's shear row reads 0.94 since shear follows the 2025 table; the batten
panel no longer prints its internal state token; the footing status reads MODELED; and the
e2e assertions follow the English wording, the gallery's localized case names and the
Part II and Design stage names.
With development length from Tabla 25.4.2.3 the embedded beam's two rows close at 0.89
and 0.87, both governed by the anchorage of the bars; the caption said bending and shear
under 1.2D+1.6L. The caption, the source note and the e2e follow the result, the preview
test reads its new wording, and the wall check's reason is asserted as the engine writes it.
…t at, and offers the cut

A first model usually falls apart this way: each post drawn as one member and the ledgers
ending on nodes that sit on the posts. The solve said the structure was disconnected and
listed forty node ids. It now adds how many nodes sit on members without cutting them and
names Edit > Cut > Split at the nodes on them, and the error toast offers that command
over the whole model as one undoable edit. The node-on-member search is one pure function
the cut and the check share.
The PRO section builder asked for tube, plate and flange dimensions in metres, so a first
scaffold model entered a 50.8 x 2.5 mm tube as 0.508 x 0.025: ten times each dimension, a
hundred times the area and the stiffness. The fields now read and write millimetres; the
section still stores metres.
…nent load

A combination with no factor on an existing case adds up nothing, and a model where no
combination takes a dead case or the self-weight case leaves the structure's weight out of
every result. A first user's scaffold had both, and nothing said so. Both are now model
warnings, with the fix in their tooltips.
The engine writes its errors in English, and 'Singular stiffness matrix — structure is a
mechanism' reached a Spanish interface as it was written. The known sentences are now
replaced wherever they appear in a solve message or toast; anything else is left as it is.
One click in empty space with the node tool left a node no member, shell,
connector or constraint holds. Its free degrees of freedom made the stiffness
matrix singular, so every solve failed, the results were cleared and every
diagram button stayed disabled until the node was found and deleted.

The solve now runs on solvableModel: the active model without those nodes and
their supports. A loose node that carries a load still stops the solve by
name, since dropping the load would change the answer. The diagnostics keep
reporting the loose node. The statics check keeps reading the model as is.
Loads: a click in loads mode selected nothing, since 3D had no load picking.
The load batch now records the segments each load draws and a click takes
the nearest one; at a joint a load acting at that point wins a near tie. A
drag missed every nodal, point and shell load, because the 3D load types
fell through to the member branch. A selected load is drawn in the selection
colour with the rest dimmed.

Nodes: pressing a node pushed an undo state and the release undid it, so a
click never selected the node, brought the old selection back and cleared
the redo history. The press is now only a drag candidate, the drag starts on
real movement, and a pixel of jitter no longer moves the node and clears the
results. Members mode picks members only, as in 2D.

Panel: All, Invert and Previous reach supports and loads; Previous works
after a click on nothing; Loaded in case takes the loads while loads are
armed.
Drawing a load or a support showed Basic's options strip above the top bar,
in Basic's terms; nodes, members and plates said nothing. A PRO bar under the
ribbon now says what the next click does and offers each tool's choices:
plane and level, member type, material, section and chaining, 3 or 4 plate
nodes with material and thickness, the support types, and the load case,
kind and all six components. Escape leaves drawing.

Node I and the picked plate corners are ringed in the model, with a dashed
preview to the pointer. The Members panel built members of its own from the
selection while the viewport built them too, so a third click joined a stale
node to the new one; one store now holds what is being drawn. A plate is made
on its last corner and the next one starts.

Nodes, Members, Shells, Supports and Loads each have twin buttons, Draw and
Write. Write opens a card with the fields and an Add button; Enter adds and
the first field takes the focus again. The plate and the support written and
drawn are the same draft.

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.

1 participant