In [1]: from anastruct import SystemElements
ss = SystemElements()
Indeterminate Beam:
In [2]: from anastruct import SystemElements
ss = SystemElements()
# ----------------------------
# Create beam with required nodes
# ----------------------------
ss.add_element(location=[[0, 0], [10, 0]]) # Element 1
ss.add_element(location=[[10, 0], [20, 0]]) # Element 2
ss.add_element(location=[[20, 0], [40, 0]]) # Element 3
# ----------------------------
# Supports
# ----------------------------
ss.add_support_fixed(node_id=1) # Fixed support at 0 ft
ss.add_support_roll(node_id=3) # Roller at 20 ft
ss.add_support_roll(node_id=4) # Roller at 40 ft
# ----------------------------
# Loads
# ----------------------------
# Point load: 20 k downward at 10 ft (node 2)
ss.point_load(node_id=2, Fy=-20)
# UDL: 1.5 k/ft from 20 ft to 40 ft (element 3)
ss.q_load(element_id=3, q=-1.5)
# ----------------------------
# Solve
# ----------------------------
[Link]()
# ----------------------------
# Plots
# ----------------------------
ss.show_structure()
ss.show_reaction_force()
ss.show_shear_force()
ss.show_bending_moment()
ss.show_displacement()
Beam With Spring Support:
In [50]: from anastruct import SystemElements
ss = SystemElements(EI=166666.6)
# ----------------------------
# Create beam with required nodes
# ----------------------------
ss.add_element(location=[[0, 0], [10, 0]]) # Element 1
ss.add_element(location=[[10, 0], [20, 0]]) # Element 2
ss.add_element(location=[[20, 0], [40, 0]]) # Element 3
# ----------------------------
# Supports
# ----------------------------
ss.add_support_fixed(node_id=1) # Fixed support at 0 ft
ss.add_support_spring(node_id=3,translation = 2, k = 10) # Roller at 20 ft
ss.add_support_spring(node_id=4, translation = 2, k = 15) # Roller at 40 ft
#translation=1 → horizontal spring
# translation=2 → vertical spring
# translation=3 → rotational spring (moment)
# ----------------------------
# Loads
# ----------------------------
# Point load: 20 k downward at 10 ft (node 2)
ss.point_load(node_id=2, Fy=-20)
# UDL: 1.5 k/ft from 20 ft to 40 ft (element 3)
ss.q_load(element_id=3, q=-1.5)
# ----------------------------
# Solve
# ----------------------------
[Link]()
# ----------------------------
# Plots
# ----------------------------
ss.show_structure()
ss.show_reaction_force()
ss.show_shear_force()
ss.show_bending_moment()
Internal Hinge Beam:
In [56]: from anastruct import SystemElements
ss = SystemElements()
# ----------------------------
# Create beam with required nodes
# ----------------------------
ss.add_element(location=[[0, 0], [15, 0]]) # Element 1
ss.add_element(location=[[15, 0], [30, 0]], release_start=True) # Element 2 with hinge at Node 2
# ----------------------------
# Supports
# ----------------------------
ss.add_support_fixed(node_id=1) # Fixed support at Node 1
ss.add_support_roll(node_id=3) # Roller support at Node 3
# ----------------------------
# Loads
# ----------------------------
ss.q_load(element_id=2, q=-5.403) # UDL on Element 2
# ----------------------------
# Solve
# ----------------------------
[Link]()
# ----------------------------
# Plots
# ----------------------------
ss.show_structure()
ss.show_reaction_force()
ss.show_shear_force()
ss.show_bending_moment()
In [ ]: from anastruct import SystemElements
ss = SystemElements()
# ----------------------------
# Create beam with required nodes
# ----------------------------
ss.add_element(location=[[0, 0], [10, 0]]) # Element 1
ss.add_element(location=[[10, 0], [20, 0]]) # Element 2
ss.add_element(location=[[20, 0], [40, 0]]) # Element 3
# ----------------------------
# Supports
# ----------------------------
ss.add_support_fixed(node_id=1) # Fixed support at 0 ft
ss.add_support_roll(node_id=3) # Roller at 20 ft
ss.add_support_roll(node_id=4) # Roller at 40 ft
# ----------------------------
# Loads
# ----------------------------
# Point load: 20 k downward at 10 ft (node 2)
ss.point_load(node_id=2, Fy=-20)
# UDL: 1.5 k/ft from 20 ft to 40 ft (element 3)
ss.q_load(element_id=3, q=-1.5)
# ----------------------------
# Solve
# ----------------------------
[Link]()
# ----------------------------
# Plots
# ----------------------------
ss.show_structure()
ss.show_reaction_force()
ss.show_shear_force()
ss.show_bending_moment()
Indeterminate Frame:
In [ ]:
In [44]: from anastruct import SystemElements
ss = SystemElements()
# ----------------------------
# Frame geometry
# ----------------------------
ss.add_element(location=[[0, 0], [0, 15]], EI=1) # Element 1: Left column
ss.add_element(location=[[0, 15], [30, 15]], EI = 2) # Element 2: Beam
ss.add_element(location=[[30, 15], [30, 0]], EI = 1) # Element 3: Right column
# ----------------------------
# Supports
# ----------------------------
ss.add_support_fixed(node_id=1) # Fixed base at left column
ss.add_support_hinged(node_id=4) # Roller base at right column
# ----------------------------
# Loads
# ----------------------------
# Horizontal point load at top-left joint (wind load)
ss.point_load(node_id=2, Fx=5)
# Vertical UDL on beam (gravity load)
ss.q_load(element_id=2, q=-2)
# ----------------------------
# Solve FIRST
# ----------------------------
[Link]()
# ----------------------------
# Results
# ----------------------------
ss.show_structure()
ss.show_reaction_force()
ss.show_shear_force()
ss.show_bending_moment()
Internal Hinge Frame:
In [64]: from anastruct import SystemElements
ss = SystemElements()
# ----------------------------
# Frame geometry
# ----------------------------
ss.add_element(location=[[0, 0], [0, 16]], EI=1) # Element 1: Left column
ss.add_element(location=[[0, 16], [40, 16]], EI = 2, release_start=True) # Element 2: Beam
ss.add_element(location=[[40, 16], [40, 0]], EI = 1) # Element 3: Right column
# ----------------------------
# Supports
# ----------------------------
ss.add_support_fixed(node_id=1) # Fixed base at left column
ss.add_support_fixed(node_id=4)
# ----------------------------
# Loads
# ----------------------------
# Vertical UDL on beam (gravity load)
ss.q_load(element_id=2, q=-1.5)
# ----------------------------
# Solve FIRST
# ----------------------------
[Link]()
# ----------------------------
# Results
# ----------------------------
ss.show_structure()
ss.show_reaction_force()
ss.show_shear_force()
ss.show_bending_moment()
Inclined Frame:
In [65]: from anastruct import SystemElements
ss = SystemElements()
# -------------------
# Geometry (ft)
# A(0,0) → B(20,16) → D(40,16)
# -------------------
ss.add_element(location=[[0, 0], [10, 10]], EI=2) # Inclined member (2I)
ss.add_element(location=[[10, 10], [30, 10]], EI=1) # Horizontal member (I)
# -------------------
# Supports
# -------------------
ss.add_support_fixed(node_id=1) # A
ss.add_support_fixed(node_id=3) # D
# -------------------
# Load
# -------------------
ss.q_load(element_id=2, q=-5) # 1.5 kip/ft downward
# -------------------
# Solve
# -------------------
[Link]()
# -------------------
# Results
# -------------------
ss.show_structure()
ss.show_reaction_force()
ss.show_shear_force()
ss.show_bending_moment()
ss.show_axial_force()
In [69]: ss.show_reaction_force(figsize=(12, 6))
Indeterminate Truss With Rotated Support:
In [90]: from anastruct import SystemElements
# ----------------------------
# Truss setup
# ----------------------------
ss = SystemElements(EA=1000, EI=1e-6) # EA = constant, EI very small for pin-jointed truss
# ----------------------------
# Nodes and elements
# ----------------------------
# Node coordinates
nodes = {
'A': [0, 0],
'B': [20, 0],
'C': [0, 15],
'D': [20, 15]
}
# Elements (start_node, end_node)
elements = [
('A', 'B'),
('A', 'C'),
('A', 'D'),
('B', 'D'),
('C', 'D'),
('B', 'C'),
('C', 'B'), # Diagonal (BC) and diagonal (AC)
('C', 'D')
]
# Add elements
element_map = {} # to track element IDs
for i, (start, end) in enumerate(elements, start=1):
element_map[i] = ss.add_element(location=[nodes[start], nodes[end]], EI=1e-6) # EI ~0 for truss
# ----------------------------
# Supports
# ----------------------------
ss.add_support_hinged(node_id=1) # A pinned (fixed in x & y)
ss.add_support_roll(node_id=2) # B roller (vertical restrained)
ss.add_support_roll(node_id=4, direction= 1) # D roller (vertical restrained)
# ----------------------------
# Loads
# ----------------------------
ss.point_load(node_id=3, Fx= 10, Fy=-20) # C: 10k horizontal, 20k vertical
#ss.point_load(node_id=3, Fx=10)
# ----------------------------
# Solve
# ----------------------------
[Link]()
# ----------------------------
# Results
# ----------------------------
ss.show_structure()
ss.show_reaction_force()
Indeterminate Truss:
In [89]: from anastruct import SystemElements
# ----------------------------
# Truss setup
# ----------------------------
ss = SystemElements(EA=1, EI=2) # EA constant, EI very small
# ----------------------------
# Nodes
# ----------------------------
nodes = {
'A': [0, 0],
'B': [40, 0],
'C': [80, 0],
'D': [120, 0],
'F': [40, 30],
'E': [80, 30]
}
# ----------------------------
# Elements (start, end)
# ----------------------------
elements = [
('A', 'B'), ('B', 'C'), ('C', 'D'), # Bottom chord
('F', 'E'), # Top chord
('B', 'F'), ('C', 'E'), # Verticals
('A', 'F'), ('F', 'C'), ('C', 'D'), ('E', 'D') # Diagonals
]
# Add elements
for start, end in elements:
ss.add_element(location=[nodes[start], nodes[end]], EI=1e-6)
# ----------------------------
# Supports
# ----------------------------
ss.add_support_hinged(node_id=1) # A pinned
ss.add_support_roll(node_id=2) # B roller
ss.add_support_roll(node_id=3) # C roller
ss.add_support_roll(node_id=4) # D roller
# ----------------------------
# Loads
# ----------------------------
ss.point_load(node_id=5, Fy=-20) # F downward
ss.point_load(node_id=6, Fy=-20) # E downward
# ----------------------------
# Solve
# ----------------------------
[Link]()
# ----------------------------
# Results
# ----------------------------
ss.show_structure()
ss.show_reaction_force()
How to draw 2D Truss Using Add truss element function:
In [11]: from anastruct import SystemElements
# ----------------------------
# Truss setup
# ----------------------------
ss = SystemElements(EA=1) # EA only (true truss)
# ----------------------------
# Nodes
# ----------------------------
nodes = {
'A': [0, 0],
'B': [40, 0],
'C': [80, 0],
'D': [120, 0],
'F': [40, 30],
'E': [80, 30]
}
# ----------------------------
# Elements (start, end)
# ----------------------------
elements = [
('A', 'B'), ('B', 'C'), ('C', 'D'), # Bottom chord
('F', 'E'), # Top chord
('B', 'F'), ('C', 'E'), # Verticals
('A', 'F'), ('F', 'C'), ('E', 'D') # Diagonals
]
# ----------------------------
# Add TRUSS elements (FORMAT FIXED)
# ----------------------------
for start, end in elements:
ss.add_truss_element(
location=[nodes[start], nodes[end]],
EA=1
)
# ----------------------------
# Supports
# ----------------------------
ss.add_support_hinged(node_id=1) # A pinned
ss.add_support_roll(node_id=2) # B roller
ss.add_support_roll(node_id=3) # C roller
ss.add_support_roll(node_id=4) # D roller
# ----------------------------
# Loads
# ----------------------------
ss.point_load(node_id=5, Fy=-20) # F downward
ss.point_load(node_id=6, Fy=-20) # E downward
# ----------------------------
# Solve
# ----------------------------
[Link]()
# ----------------------------
# Results
# ----------------------------
ss.show_structure()
ss.show_reaction_force()
ss.show_axial_force()
How to Save the Diagrams as an image:
In [14]: import pickle
with open('my_truss.pkl', 'wb') as f:
[Link](ss, f)
print("Truss system saved successfully!")
Truss system saved successfully!
In [16]: with open('my_truss.pkl', 'rb') as f:
ss_loaded = [Link](f)
print("Truss system loaded successfully!")
import [Link] as plt
# Structure
ss_loaded.show_structure(show=False)
[Link]("[Link]", dpi=300, bbox_inches="tight")
[Link]()
# Reactions
ss_loaded.show_reaction_force(show=False)
[Link]("[Link]", dpi=300, bbox_inches="tight")
[Link]()
# Axial forces
ss_loaded.show_axial_force(show=False)
[Link]("axial_forces.png", dpi=300, bbox_inches="tight")
[Link]()
Truss system loaded successfully!
In [10]: from anastruct import SystemElements
ss = SystemElements(EA=2000)
ss.add_truss_element(location=[[0, 0], [2, 0]])
ss.add_truss_element(location=[[2, 0], [4, 0]])
ss.add_truss_element(location=[[0, 0], [2, 2]])
ss.add_truss_element(location=[[2, 2], [4, 0]])
ss.add_support_hinged(node_id=1)
ss.add_support_hinged(node_id=3)
ss.add_support_spring(node_id=4, translation=2, k=0.5)
ss.point_load(Fy=-10, node_id=2)
ss.show_structure()
In [ ]: