from compas_cem.diagrams import TopologyDiagram
from compas_cem.elements import Node
from compas_cem.elements import TrailEdge
from compas_cem.elements import DeviationEdge
from compas_cem.loads import NodeLoad
from compas_cem.supports import NodeSupport
from compas_cem.equilibrium import static_equilibrium
from compas_cem.plotters import TopologyPlotter
from compas_cem.plotters import FormPlotter
# ------------------------------------------------------------------------------
# Data
#-------------------------------------------------------------------------------
points = [(0, [0.0, 0.0, 0.0]),
(1, [0.0, 1.0, 0.0]),
(2, [0.0, 2.0, 0.0]),
(3, [1.0, 0.0, 0.0]),
(4, [1.0, 1.0, 0.0]),
(5, [1.0, 2.0, 0.0])]
trail_edges = [(0, 1),
(1, 2),
(3, 4),
(4, 5)]
deviation_edges = [(1, 4),
(2, 5)]
# ------------------------------------------------------------------------------
# Topology Diagram
# ------------------------------------------------------------------------------
topology = TopologyDiagram()
# ------------------------------------------------------------------------------
# Add Nodes
# ------------------------------------------------------------------------------
for key, point in points:
topology.add_node(Node(key, point))
# ------------------------------------------------------------------------------
# Add Trail Edges
# ------------------------------------------------------------------------------
for u, v in trail_edges:
topology.add_edge(TrailEdge(u, v, length=-1.0))
# ------------------------------------------------------------------------------
# Add Deviation Edges
# ------------------------------------------------------------------------------
for u, v in deviation_edges:
topology.add_edge(DeviationEdge(u, v, force=-1.0))
# ------------------------------------------------------------------------------
# Add Indirect Deviation Edges
# ------------------------------------------------------------------------------
topology.add_edge(DeviationEdge(1, 5, force=1.0))
topology.add_edge(DeviationEdge(1, 3, force=1.0))
topology.add_edge(DeviationEdge(2, 4, force=1.0))
# ------------------------------------------------------------------------------
# Set Supports Nodes
# ------------------------------------------------------------------------------
topology.add_support(NodeSupport(0))
topology.add_support(NodeSupport(3))
# ------------------------------------------------------------------------------
# Add Loads
# ------------------------------------------------------------------------------
load = [0.0, -1.0, 0.0]
topology.add_load(NodeLoad(2, load))
topology.add_load(NodeLoad(5, load))
# ------------------------------------------------------------------------------
# Collect Trails and Edge lines
# ------------------------------------------------------------------------------
edge_lines = [topology.edge_coordinates(*edge) for edge in topology.edges()]
# ------------------------------------------------------------------------------
# Equilibrium of forces
# ------------------------------------------------------------------------------
topology.build_trails()
form = static_equilibrium(topology, eta=1e-6, tmax=100, verbose=True)
for node in form.support_nodes():
print(node, form.reaction_force(node))
# ------------------------------------------------------------------------------
# Topology Plotter
# ------------------------------------------------------------------------------
plotter = TopologyPlotter(topology, figsize=(16, 9))
plotter.draw_loads(radius=0.025, draw_arrows=True, scale=0.5, gap=-0.55)
plotter.draw_nodes(radius=0.025)
plotter.draw_edges()
plotter.show()
# ------------------------------------------------------------------------------
# Form Plotter
# ------------------------------------------------------------------------------
plotter = FormPlotter(form, figsize=(16, 9))
plotter.draw_nodes(radius=0.025, text="key")
plotter.draw_edges(text="force")
plotter.draw_loads(scale=0.5, gap=-0.55)
plotter.draw_reactions(scale=0.25)
plotter.draw_segments(edge_lines)
plotter.show()