Post / result extraction¶
/post/TABLE (ch18-23) extracts pre-process summaries, analysis results,
story tables, and design forces. Every table type shares one HTTP endpoint —
a TABLE_TYPE string selects which table comes back — and one response
shape ({FORCE, DIST, HEAD, DATA}), so post/base.py provides the shared
plumbing once rather than a class per table.
See ROADMAP.md for the full list of table types.
Shared plumbing¶
midas_nx.post.base
¶
Shared plumbing for /post/TABLE — extracts pre-process, analysis-result,
and story summary tables. Source: docs/manual/18_POST_PreProcess.md through
21_POST_StoryTables.md.
Every /post/TABLE call shares one endpoint and one POST-only wrapper
("Argument", not ID-keyed "Assign" like /db/*) — a TABLE_TYPE
string selects which table is extracted, so this is one generic function
rather than a DbResource-per-table-type. The response shape
({FORCE, DIST, HEAD, DATA}) is identical across every table type; HEAD's
column names vary per table and are only knowable from TABLE_TYPE, so the
response is returned as a plain dict rather than typed further.
NodeElemsSelector
¶
Bases: TypedDict
Target-scope selector accepted by a handful of table types (e.g. Element Weight) — set exactly one of KEYS/TO/STRUCTURE_GROUP_NAME; omitting NODE_ELEMS entirely selects all nodes/elements.
TableUnit
¶
Bases: TypedDict
Response unit override, accepted by the Story-series table types.
TableStyles
¶
Bases: TypedDict
Response number-format override, accepted by the Story-series table types.
get_table(table_type, table_name='', *, export_path=None, node_elems=None, unit=None, styles=None, components=None, load_case_names=None, opt_cs=None, stage_step=None, parts=None, story_names=None, modes=None, additional=None, set_calculation_method=None, client=None)
¶
POST /post/TABLE — extract one result table.
table_type: the table's TABLE_TYPE value (see pre_process.py/result_1.py/
story.py/design.py for the documented constants).
table_name: response table title. The manual documents it as also becoming
the response's top-level key, e.g.
{table_name: {"FORCE": ..., "DIST": ..., "HEAD": [...], "DATA": [...]}} —
but live sessions have returned other keys for the same call ("Result
Table", "empty"), so don't index the response by name. Use
:func:unwrap_table below, which finds the table by shape instead.
node_elems/unit/styles/components: only meaningful for the specific table
types documented as supporting them — see each caller's docstring.
load_case_names: analysis-result tables (ch19-21) — load/combination
names with a type suffix, e.g. "DL(ST)", "COMB1(CB)", "CS1(CS)". Also
accepted by ch18's Story Load Summary Table as of the 2026-08-06 manual
update, whose own example spells the suffix with a leading space
("DL (ST)") rather than ch19-21's "DL(ST)" — a manual-source
inconsistency, not a call-site-specific requirement to enforce here.
opt_cs/stage_step: analysis-result tables only (ch19-21) — enable and
select construction-stage steps, e.g. ["CS1:001(first)", "CS1:002(last)"].
parts: design-force tables (ch23) only — member end/location or top/bot
part selection, e.g. ["PartI", "PartJ"]. Not Wall Force (ch20) — MIDASIT
confirmed 2026-07-30 that table type never supported
PARTS or SECT_POSITION; both were removed from the official article, and
this SDK's own get_wall_force_table() no longer accepts either.
story_names: Story-series (ch21) and Wall Force (ch20) tables — restrict
to specific story names; omitting it selects all stories. Also accepted
by Wall Design Forces (ch23) as of the 2026-08-06 manual update
(MAPI-1671); that endpoint's own Specifications table numbers it as
param 9, alongside the existing member-scope/unit/style/component
params.
modes: Story Mode Shape (ch21) only — mode filter, e.g. ["Mode1", "Mode2"];
omitting it returns all modes.
additional: Story-series tables (ch21) only — the table-type-specific
"ADDITIONAL" object (angle/Beta/node-selection/... settings); see each
story.py caller's docstring and TypedDict for its shape.
set_calculation_method: Weight Irregularity Check (ch21) only — unlike
every other story table, the manual places this field directly under
"Argument" rather than nesting it in "ADDITIONAL".
unwrap_table(response)
¶
Pull the {FORCE, DIST, HEAD, DATA} table out of a get_table()
response, whatever its top-level key happens to be.
The DbResource-side counterpart is DbResource.items(). Matching on
shape rather than on the key name is deliberate: the same call has been
seen returning "Result Table" and "empty" as its top-level key
across sessions, in addition to the TABLE_NAME the manual documents,
so response[table_name] is not safe. Returns {} when the response
carries no table (e.g. a zero-row {"message": ""}).
Example::
raw = get_reaction_table(load_case_names=["DL(ST)"])
table = unwrap_table(raw)
for row in table.get("DATA", []):
...
Example table getters¶
midas_nx.post.result_1
¶
Source: docs/manual/19_POST_AnalysisResult_1.md, items 1-13, and docs/manual/20_POST_AnalysisResult_2.md, items 1-39.
All functions POST to the shared /post/TABLE endpoint — see post/base.py.
get_reaction_table(table_type=TABLE_TYPE_REACTION_GLOBAL, table_name='', *, node_elems=None, unit=None, styles=None, components=None, load_case_names=None, opt_cs=None, stage_step=None, client=None)
¶
docs/manual/19_POST_AnalysisResult_1.md #1 — Reaction.
table_type: TABLE_TYPE_REACTION_GLOBAL (default), _LOCAL, or _LOCAL_SURFACE_SPRING. opt_cs/stage_step are not supported for the Local Surface Spring variant per the manual.
get_displacement_table(table_type=TABLE_TYPE_DISPLACEMENT_GLOBAL, table_name='', *, node_elems=None, unit=None, styles=None, components=None, load_case_names=None, opt_cs=None, stage_step=None, client=None)
¶
docs/manual/19_POST_AnalysisResult_1.md #2 — Displacements.
table_type: TABLE_TYPE_DISPLACEMENT_GLOBAL (default) or _LOCAL.
midas_nx.post.pre_process
¶
Source: docs/manual/18_POST_PreProcess.md, items 1-10.
All functions POST to the shared /post/TABLE endpoint — see post/base.py.
get_element_weight_table(table_name='', *, node_elems=None, client=None)
¶
docs/manual/18_POST_PreProcess.md #1 — Element Weight Table.
node_elems: target scope (exactly one of KEYS/TO/STRUCTURE_GROUP_NAME); omit for all elements.
midas_nx.post.story
¶
Source: docs/manual/21_POST_StoryTables.md, items 1-17.
All functions POST to the shared /post/TABLE endpoint — see post/base.py.
The manual declares one common Argument parameter table that applies uniformly to all 17 story tables (TABLE_NAME, TABLE_TYPE, EXPORT_PATH, UNIT, STYLES, COMPONENTS, NODE_ELEMS, LOAD_CASE_NAMES, OPT_CS, STAGE_STEP) rather than documenting a per-table subset like ch18 did, so every wrapper below exposes the full common kwarg set (mirroring get_table's own signature).
2026-07-24: the manual additionally documented per-table STORY_NAMES/MODES fields and table-specific "ADDITIONAL" objects (angle/Beta/node-selection/ calculation-method settings) for 10 of the 17 tables — each affected wrapper below exposes its own typed additional/story_names/modes/ set_calculation_method kwarg; see the TypedDicts declared after the TABLE_TYPE_* constants for each table's exact shape.
⚠️ Live-tested: on a real analyzed model with valid load_case_names,
these story tables can still return {"error": {"message": "[empty]
Cannot generate table data as there is no analysis result."}} even
though post/result_1.py's node/element-level tables (reaction,
displacement, beam force, ...) work fine against the same analysis. The
fix was calling ope.calculate_story(...) (/ope/STOR) before
doc.analyze() — story-level aggregates (weight/stiffness centers,
eccentricity, overturning moment, etc.) appear to need that explicit
calculation step baked into the analysis run, not just derivable
after-the-fact from raw nodal results. See
docs/live_verification_notes.md for the full reproduction.
get_story_drift_table(table_type=TABLE_TYPE_STORY_DRIFT_COMB, table_name='', *, unit=None, styles=None, components=None, node_elems=None, load_case_names=None, opt_cs=None, stage_step=None, additional=None, client=None)
¶
docs/manual/21_POST_StoryTables.md #1 — Story Drift.
table_type: TABLE_TYPE_STORY_DRIFT_X/_Y (single-direction) or TABLE_TYPE_STORY_DRIFT_COMB (combined, adds shear-weighted/selected-node detail columns). additional: drift-ratio judgment method/parameters, plus (COMB only) which drift-basis columns to include — see StoryDriftAdditional.