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:

  1. 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.

  2. A linear reaction (a wall) transfers only to polygons of the same family (tags starting with the same letter, so WLL0.0 → W0.1 but not WLL0.0 → CT0.2) and to beams.

  3. 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.