Ejemplo n.º 1
0
"""

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({
Ejemplo n.º 2
0
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()
Ejemplo n.º 3
0
        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})
Ejemplo n.º 6
0
        ----------
        .. [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()
Ejemplo n.º 7
0
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)
Ejemplo n.º 8
0
    [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]
Ejemplo n.º 9
0
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()
Ejemplo n.º 10
0
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
Ejemplo n.º 11
0
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