import compas_ags from compas_ags.diagrams import FormGraph from compas_ags.diagrams import FormDiagram from compas_ags.diagrams import ForceDiagram from compas_ags.viewers import Viewer from compas_ags.ags import form_update_from_force from compas_ags.ags import form_update_q_from_qind from compas_ags.ags import force_update_from_form from compas_ags.ags import ConstraintsCollection from compas_ags.ags import form_update_from_force_newton # ------------------------------------------------------------------------------ # 1. create a simple arch from nodes and edges, make form and force diagrams # ------------------------------------------------------------------------------ graph = FormGraph.from_json(compas_ags.get('paper/gs_arch.json')) form = FormDiagram.from_graph(graph) force = ForceDiagram.from_formdiagram(form) # ------------------------------------------------------------------------------ # 2. prescribe edge force density and set fixed vertices # ------------------------------------------------------------------------------ # prescribe force density to edge edges_ind = [ (2, 11), ] for index in edges_ind: u, v = index form.edge_attribute((u, v), 'is_ind', True) form.edge_attribute((u, v), 'q', -1.)
""" from __future__ import print_function from __future__ import absolute_import from __future__ import division import compas_ags from compas_ags.diagrams import FormDiagram from compas_bi_ags.diagrams import ForceDiagram from compas_ags.viewers import Viewer from compas_bi_ags.bi_ags import graphstatics # make form diagram from obj # make force diagram from form form = FormDiagram.from_obj(compas_ags.get('zero_fd.obj')) force = ForceDiagram.from_formdiagram(form) # set the fixed points left = list(form.vertices_where({'x': 0.0, 'y': 0.0}))[0] right = list(form.vertices_where({'x': 12.0, 'y': 0.0}))[0] fixed = [left, right] form.set_fixed(fixed) e1 = { 'v': list(form.vertices_where({ 'x': 0.0, 'y': 6.0 }))[0], 'u': list(form.vertices_where({
import compas_ags from compas_ags.diagrams import FormGraph from compas_ags.diagrams import FormDiagram from compas_ags.diagrams import ForceDiagram from compas_ags.ags import graphstatics from compas_ags.viewers import Viewer # ------------------------------------------------------------------------------ # 1. get lines of a plane triangle frame in equilibrium, its applied loads and reaction forces # make form and force diagrams # ------------------------------------------------------------------------------ graph = FormGraph.from_obj(compas_ags.get('paper/gs_form_force.obj')) form = FormDiagram.from_graph(graph) force = ForceDiagram.from_formdiagram(form) # ------------------------------------------------------------------------------ # 2. set applied load # ------------------------------------------------------------------------------ # choose an independent edge and set the magnitude of the applied load # the system is statically determinate, thus choosing one edge is enough form.edge_force(0, -30.0) # update force densities of form and force diagrams graphstatics.form_update_q_from_qind(form) graphstatics.force_update_from_form(force, form)
import compas_ags from compas_ags.diagrams import FormGraph from compas_ags.diagrams import FormDiagram from compas_ags.diagrams import ForceDiagram from compas_ags.viewers import Viewer from compas_ags.ags import form_update_q_from_qind from compas_ags.ags import force_update_from_form from compas_ags.ags import form_update_from_force from compas_ags.ags import force_update_from_constraints # ------------------------------------------------------------------------------ # 1. Get OBJ file for the geometry # ------------------------------------------------------------------------------ graph = FormGraph.from_obj(compas_ags.get('paper/gs_truss.obj')) # Add horizontal line to graph to make Structure isostatic. lines = graph.to_lines() lines.append(([-2.0, 0.0, 0.0], [0.0, 0.0, 0.0])) graph = FormGraph.from_lines(lines) form = FormDiagram.from_graph(graph) force = ForceDiagram.from_formdiagram(form) # ------------------------------------------------------------------------------ # 2. prescribe edge force density and set fixed vertices # ------------------------------------------------------------------------------ # prescribe force density to edge edges_ind = [ (8, 9), ]
from compas_ags.diagrams import ForceDiagram from compas.geometry import angle_vectors_xy from compas.geometry import subtract_vectors from compas_ags.rhino import Scene import compas_rhino p = Proxy() p.start_server() p.stop_server() graphstatics = Proxy('compas_ags.ags.graphstatics') FILE = compas_ags.get('debugging/zero.obj') FILE = '/Users/mricardo/compas_dev/compas_ags/data/debugging/zero.obj' graph = FormGraph.from_obj(FILE) form = FormDiagram.from_graph(graph) force = ForceDiagram.from_formdiagram(form) form.edge_force((0, 1), +1.0) form.edge_force((2, 3), +1.0) form.edge_force((4, 5), +1.0) form.data = graphstatics.form_update_q_from_qind_proxy(form.data) force.data = graphstatics.force_update_from_form_proxy(force.data, form.data) # Pick one key and move move_key = 2
---------- .. [1] https://matplotlib.org/2.0.2/api/pyplot_api.html#matplotlib.pyplot.savefig """ plt.savefig(filepath, **kwargs) # ============================================================================== # Main # ============================================================================== if __name__ == '__main__': import compas_ags from compas_ags.diagrams import FormDiagram from compas_ags.diagrams import ForceDiagram form = FormDiagram.from_obj(compas_ags.get('paper/grid_irregular.obj')) form.identify_fixed() force = ForceDiagram.from_formdiagram(form) viewer = Viewer(form, force, delay_setup=False) viewer.draw_form(edgelabel={(u, v): '{:.1f}'.format(form.edge_length(u, v)) for u, v in form.edges()}) viewer.draw_force() viewer.show()
'width': 1.0, 'color': '#cccccc', 'style': '--' }) return form_lines, force_lines # ------------------------------------------------------------------------------ # 1. Problem of getting to a funicular shape # - Input a circular arch # - Input "target forces" for the loads applied # - Update form and force diagram # ------------------------------------------------------------------------------ graph = FormGraph.from_obj(compas_ags.get('paper/exA_arch-circular.obj')) form = FormDiagram.from_graph(graph) edge_index = form.edge_index() index_edge = form.index_edge() # create a dual force diagram force = ForceDiagram.from_formdiagram(form) # create label for plots force_edges = force.ordered_edges(form) force_edge_labels = {(u, v): index for index, (u, v) in enumerate(force_edges)} force_edge_labels.update({(v, u): index for index, (u, v) in enumerate(force_edges)}) # set supports supports = [1, 7] for key in supports:
from __future__ import absolute_import from __future__ import division import compas_ags from compas_ags.diagrams import FormDiagram from compas_ags.diagrams import ForceDiagram from compas_ags.viewers import Viewer from compas_ags.ags import graphstatics # make form diagram from obj # make force diagram from form form = FormDiagram.from_obj(compas_ags.get('paper/gs_form_force.obj')) force = ForceDiagram.from_formdiagram(form) # set the fixed points left = list(form.vertices_where({'x': 0.0, 'y': 0.0}))[0] right = list(form.vertices_where({'x': 6.0, 'y': 0.0}))[0] fixed = [left, right] form.set_fixed(fixed) force.set_fixed([2]) # set the magnitude of the applied load form.set_edge_force_by_index(0, -10.0)
key = xy_key[gkey] self.vertex[key]['cx'] = 1.0 self.vertex[key]['cy'] = 1.0 # ============================================================================== # Debugging # ============================================================================== if __name__ == '__main__': import compas_ags from compas_plotters import NetworkPlotter form = FormDiagram.from_obj(compas_ags.get('paper/fink.obj')) lines = [] for u, v in form.edges(): lines.append({ 'start': form.vertex_coordinates(u), 'end': form.vertex_coordinates(v), 'color': '#cccccc', 'width': 0.5, }) form.identify_fixed() vcolor = {key: '#ff0000' for key in form.fixed()} vlabel = {key: key for key in form.vertices()} elabel = {key: str(index) for index, key in enumerate(form.edges())}
'end': force.vertex_coordinates(v, 'xy'), 'width': 1.0, 'color': '#cccccc', 'style': '--' }) return form_lines, force_lines # ------------------------------------------------------------------------------ # 2. Dragging the force diagram and updating form diagram # - Find a deeper form diagram # - Invert compression/tension # ------------------------------------------------------------------------------ input_file = compas_ags.get('paper/exB_arch-output.json') form = FormDiagram.from_json(input_file) force = ForceDiagram.from_formdiagram(form) # create label for plots force_edges = force.ordered_edges(form) force_edge_labels = {(u, v): index for index, (u, v) in enumerate(force_edges)} force_edge_labels.update({(v, u): index for index, (u, v) in enumerate(force_edges)}) # update the diagrams form_update_q_from_qind(form) force_update_from_form(force, form) # visualise initial solution view_form_force(form, force, forcescale=2.0)
from compas.geometry import subtract_vectors from compas.geometry import sum_vectors from compas.geometry import normalize_vector from compas.geometry import scale_vector from compas_ags.diagrams import FormGraph from compas_ags.diagrams import FormDiagram from compas_plotters import MeshPlotter # ============================================================================== # Construct the graph of a Fink truss. # ============================================================================== graph = FormGraph.from_obj(compas_ags.get('paper/fink.obj')) # ============================================================================== # Identify the fixed points of the graph. # ============================================================================== fixed = [6, 9] # ============================================================================== # Assert that the graph is 2D and that it is planar. # ============================================================================== assert graph.is_2d(), "The graph is not 2D." assert graph.is_planar(), "The graph is not planar." # ==============================================================================
edgelabel={uv: str(force.dual_edgelength(uv)) for uv in force.edges()}) viewer.show() # ------------------------------------------------------------------------------ # 5. Dense Constant force truss # - Input a non-triangulated dense truss, compute initial equilibrium # - Constraint top chord to constant force and move bottom chord to a sinusoidal shape # - Constraint the applied loads magnitude # ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------ # 1. Get geometry, apply loads and and compute equilibrium # ------------------------------------------------------------------------------ graph = FormGraph.from_obj(compas_ags.get('paper/exE_truss_dense.obj')) form = FormDiagram.from_graph(graph) force = ForceDiagram.from_formdiagram(form) force_edges = force.ordered_edges(form) force_edge_labels1 = {(u, v): index for index, (u, v) in enumerate(force_edges)} force_edge_labels2 = {(v, u): index for index, (u, v) in enumerate(force_edges)} force_edge_labels = {**force_edge_labels1, **force_edge_labels2} # prescribe force density to edge edges_ind = [ (17, 22), ] load = 1.0 for index in edges_ind:
return form_lines, force_lines # ------------------------------------------------------------------------------ # 4. Constant force truss # - Input a non-triangulated truss, compute initial equilibrium # - Move the form diagram support # - Move one of the internal nodes to a specific position # ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------ # 1. Get geometry, apply loads and and compute equilibrium # ------------------------------------------------------------------------------ input_file = compas_ags.get('paper/exD_truss.obj') graph = FormGraph.from_obj(input_file) form = FormDiagram.from_graph(graph) force = ForceDiagram.from_formdiagram(form) force_edges = force.ordered_edges(form) force_edge_labels1 = {(u, v): index for index, (u, v) in enumerate(force_edges)} force_edge_labels2 = {(v, u): index for index, (u, v) in enumerate(force_edges)} force_edge_labels = {**force_edge_labels1, **force_edge_labels2} # prescribe force density to edge edges_ind = [ (13, 14), ] for index in edges_ind: