""" 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('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_anchor([5]) # set the magnitude of the applied load #form.set_edge_force_by_index(0, -10.0) e1 = { 'v': list(form.vertices_where({
from compas_ags.diagrams import FormGraph from compas_ags.diagrams import FormDiagram from compas_ags.diagrams import ForceDiagram from compas_ags.rhino import Scene graphstatics = Proxy('compas_ags.ags.graphstatics') HERE = os.path.dirname(__file__) DATA = os.path.join(HERE, '../data') FILE = os.path.join(DATA, 'debugging', 'truss.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) # ============================================================================== # Visualize and Interact # ============================================================================== scene = Scene()
u = embedding.neighbors(node)[0] if u in fixed: continue a = embedding.node_attributes(u, 'xyz') vectors = [] for v in noleaves.neighbors(u): b = embedding.node_attributes(v, 'xyz') vectors.append(normalize_vector(subtract_vectors(b, a))) ab = scale_vector( normalize_vector( scale_vector(sum_vectors(vectors), 1 / len(vectors))), length) embedding.node_attributes(node, 'xyz', subtract_vectors(a, ab)) # ============================================================================== # Construct a form diagram of the embedding # ============================================================================== form = FormDiagram.from_graph(embedding) # ============================================================================== # Visualize the result # ============================================================================== plotter = MeshPlotter(form, figsize=(12, 7.5)) plotter.draw_vertices(text='key', radius=0.3) plotter.draw_edges() plotter.show()
'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) # Identify auto constraints
import os import json from compas_ags.diagrams import FormDiagram from compas_ags.diagrams import ForceDiagram from compas_ags.ags import graphstatics from compas_ags.viewers import Viewer HERE = os.path.dirname(__file__) FILE = os.path.join(HERE, '../data/forms/howe_modified.ags') with open(FILE, 'r') as f: data = json.load(f) form = FormDiagram.from_data(data['data']['form']) force = ForceDiagram.from_data(data['data']['force']) form.dual = force force.dual = form graphstatics.form_update_from_force(form, force, kmax=100) # ============================================================================== # Visualize # ============================================================================== viewer = Viewer(form, force, delay_setup=False, figsize=(12, 7.5)) viewer.draw_form(vertexsize=0.15, vertexcolor={ key: '#000000' for key in form.vertices_where({'is_fixed': True})
---------- .. [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()
from compas_ags.diagrams import ForceDiagram from compas_ags.viewers import Viewer from compas_ags.ags import graphstatics __author__ = [ 'Tom Van Mele', ] __copyright__ = 'Copyright 2016 - Block Research Group, ETH Zurich' __license__ = 'MIT License' __email__ = '*****@*****.**' __all__ = [] form = FormDiagram.from_obj(compas.get('lines.obj')) force = ForceDiagram.from_formdiagram(form) for key, attr in form.vertices_where({'vertex_degree': 1}, True): attr['is_fixed'] = True k, m, ind = graphstatics.form_identify_dof(form) for u, v in ind: form.set_edge_attributes((u, v), ('is_ind', 'q'), (True, random.choice(range(2, 20)))) graphstatics.form_update_q_from_qind(form) graphstatics.force_update_from_form(force, form) viewer = Viewer(form, force, delay_setup=False)
[32.6229720760, 6.81140730234, 0.0], [25.3734227258, 8.54514654776, 0.0], [18.1238733756, 8.54514654776, 0.0], [10.8743240253, 6.81140730234, 0.0], [43.4972961014, 0.0, 0.0], [3.62477467512, 10.2720549081, 0.0], [-3.52953624469, 0.0, 0.0], [39.8725214263, 10.2720549081, 0.0], [32.6229720760, 14.0889890836, 0.0], [25.3734227258, 15.8227283290, 0.0], [18.1238733756, 15.8227283290, 0.0], [10.8743240253, 14.0889890836, 0.0], [47.4502140636, 0.0, 0.0], ] form = FormDiagram.from_vertices_and_edges(vertices, edges) force = ForceDiagram.from_formdiagram(form) edges_ind = [ (2, 11), ] for index in edges_ind: u, v = index form.edge[u][v]['is_ind'] = True form.edge[u][v]['q'] = -1. # set the fixed points left = list(form.vertices_where({'x': 0.0, 'y': 0.0}))[0] right = list(form.vertices_where({'x': 43.4972961014, 'y': 0.0}))[0] fixed = [left, right]
def RunCommand(is_interactive): if 'AGS' not in sc.sticky: compas_rhino.display_message('AGS has not been initialised yet.') return system = sc.sticky['AGS']['system'] scene = sc.sticky['AGS']['scene'] filepath = compas_rhino.select_file(folder=system['session.dirname'], filter=system['session.extension']) if not filepath: return if not os.path.exists(filepath): return if not os.path.isfile(filepath): return if not filepath.endswith(".{}".format(system['session.extension'])): return dirname, basename = os.path.split(filepath) filename, extension = os.path.splitext(basename) system['session.dirname'] = dirname system['session.filename'] = filename with open(filepath, "r") as f: session = json.load(f, cls=DataDecoder) if not session['data']['form']: compas_rhino.display_message('The session file has no form diagram.') scene.clear() formdiagram = FormDiagram.from_data(session['data']['form']) form_id = scene.add(formdiagram, name='Form', layer='AGS::FormDiagram') form = scene.find(form_id) if 'settings' in session['scene']['form']: form.settings.update(session['scene']['form']['settings']) if 'anchor' in session['scene']['form']: form.anchor = session['scene']['form']['anchor'] if 'location' in session['scene']['form']: form.location = session['scene']['form']['location'] if 'scale' in session['scene']['form']: form.scale = session['scene']['form']['scale'] if session['data']['force']: forcediagram = ForceDiagram.from_data(session['data']['force']) forcediagram.dual = formdiagram formdiagram.dual = forcediagram force_id = scene.add(forcediagram, name='Force', layer='AGS::ForceDiagram') force = scene.find(force_id) if 'settings' in session['scene']['force']: force.settings.update(session['scene']['force']['settings']) if 'anchor' in session['scene']['force']: force.anchor = session['scene']['force']['anchor'] if 'location' in session['scene']['force']: force.location = session['scene']['force']['location'] if 'scale' in session['scene']['form']: force.scale = session['scene']['force']['scale'] scene.update() scene.save()
def compute_loadpath_compression_proxy(formdata, forcedata, *args, **kwargs): form = FormDiagram.from_data(formdata) force = ForceDiagram.from_data(forcedata) lp = compute_internal_work_compression(form, force, *args, **kwargs) return lp
def compute_loadpath_proxy(formdata, forcedata, *args, **kwargs): form = FormDiagram.from_data(formdata) force = ForceDiagram.from_data(forcedata) lp = compute_loadpath(form, force, *args, **kwargs) return lp