コード例 #1
0
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.)
コード例 #2
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('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({
コード例 #3
0
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)
コード例 #4
0
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),
]
コード例 #5
0
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
コード例 #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()
コード例 #7
0
            '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:
コード例 #8
0
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)
コード例 #9
0
ファイル: formdiagram.py プロジェクト: jf---/compas_ags
                    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())}
コード例 #10
0
            '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)
コード例 #11
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."

# ==============================================================================
コード例 #12
0
                    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:
コード例 #13
0
    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: