How load paths are built#
Elements#
Every recognised markup becomes an Element:
one 2D geometry plus its connections.
Intersections connect elements on the same plane, e.g. a joist crossing the beam that supports it.
Correspondents connect polygons on adjacent planes, e.g. a column on level 2 sitting on the column below it.
Load flows from lower rank to higher rank across intersections, and downward across correspondents.
The geometry graph#
GeometryGraph is a
networkx.DiGraph whose nodes are element tags. An edge A → B means
B supports A. From this graph papermodels identifies:
- collector elements
Rank-0 elements with nothing above them. They collect area load directly.
- transfer elements
Elements that receive load from other elements.
- orphaned elements
Lines with fewer than two supports, or polygons with none. These are reported as warnings because they usually point to a markup that does not quite touch its support.
Plot the graph with plot_connectivity().
Transfer rules for polygons#
Walls and columns that transfer load out (rank 0) follow these rules:
A point reaction (a column) transfers to exactly one element on the plane: the frame element with the largest overlap, or, failing that, the polygon with the largest overlapping area.
A linear reaction (a wall) transfers only to polygons of the same family (tags starting with the same letter, so
WLL0.0→W0.1but notWLL0.0→CT0.2) and to beams.A polygon corresponds with at most one polygon of the same family on the plane below.
Collector behaviour#
Collectors start as single prototype elements. Calling
assign_collector_behaviour()
with a collector model, typically
JoistArrayModel, expands each
prototype into its joists and trib areas:
from papermodels.datatypes.joist_models import JoistArrayModel
from papermodels.datatypes.element import create_element_filter
graph.assign_collector_behaviour(JoistArrayModel, spacing=0.4)
Pass a filter_function (see
create_element_filter()) to apply
different models or spacings to different collectors.
Joists that would land where a support is missing are moved to the nearest valid station, or dropped with a warning. The trib areas tile the array region with no gaps or overlaps.
Loaded elements#
create_loaded_elements()
walks the graph from top to bottom and returns a
LoadedElement for every element. Each
one combines:
its supports (reaction locations),
the point and distributed loads delivered by the elements it supports, and
the area loads that fall on its trib area.