C2.7 Internal Supports

Introduce a centre supporting arch and more crease cables to create corrugations. (by Lotte)

Objective

Since the geometry with the single crease doesn't appear very articulated yet and still leaves wide patches with low geometric stiffness, we want to create a proper corrugation by introducing a centre supporting arch and more crease cables.

Procedure

The file is exactly the same as in C2.4 External Loads with the following modifications:

a. Internal Supports

The edge loop that was selected as the continuous cable for the crease in C2.6 Variable Force Densities will now instead be supported. However, to set the anchors we need a list of vertices and not of edges. Thus we use a python set and the compas flatten function for conversion. We add this list to the list of external boundaries when setting the anchors

# ==============================================================================
# Add centre vertices to anchors > NEW
# ==============================================================================

# external boundary
boundary = mesh.vertices_on_boundaries()[0]

# find center continuous edges to create internal boundary
center_start = (24, 33)
center_boundary = mesh.edge_loop(center_start)
centre_vertices = list(set(flatten(center_boundary)))

mesh.vertices_attribute('is_anchor', True, keys=boundary+centre_vertices)

For now, the edges all have constant force densities again.

b. Side cables

Introduce articulated creases in between the supports to create a corrugation. Do so by increasing the force densities in the continuous cables.

# ==============================================================================
# b. Side Cables through Variable Force Densities > NEW
# ==============================================================================

# find left and right cable to create crease
left_start = (37, 48)
left_cable = mesh.edge_loop(left_start)

right_start = (38, 74)
right_cable = mesh.edge_loop(right_start)

# increase force densities to crease creases
mesh.edges_attribute('q', 10, keys=left_cable+right_cable)

Scale the forces by half (before 0.1) so that it remains nicely visible:

# ==============================================================================
# Visualize
# ==============================================================================
...
draw_forces(mesh, baselayer=baselayer, scale=0.05)

c. Refined Boundary Geometry

Now the design is corrugated, however, it is very flat towards the end supports and the internal boundary arch not funicular yet. Thus, we will import a refined geometry with zig-zag at end supports and internal funicular boundary from Rhino.

You can import this geometry into a compas mesh datastructure and serialise it to a json file as in C2.1 Geometry Import. Or just take it directly from the data folder as cablenmesh_import_refined.json.

Import the refined cablemesh instead:

# ==============================================================================
# c. Initialise
# ==============================================================================

HERE = os.path.dirname(__file__)
DATA = os.path.abspath(os.path.join(HERE, '../..', 'data'))
FILE_I = os.path.join(DATA, 'cablenmesh_import_refined.json')

If you try to run this script, you will probably get this error:

This is because in your new mesh the vertex identifiers are different, and it cannot find the manually set edge keys!

d. Automate Continuous Cable Selection

So let us instead write a function that automates the selection of the continuous cables in the longitudinal direction, so that if we change our input mesh, we don't have to manually adapt the edge keys.

  • d1. Longer Boundary

    First, we have to understand which one is in the longer direction. We check it on two boundaries starting from a corner vertex:

  • d2. Parallel Starting Edges

    Now we want all edges parallel to the starting edge for the new starting edges:

  • d3. Parallel Continuous Cables

    Now from each of the parallel starts, we want all continuous cables:

def longitudinal_cables(mesh):
    """Find all cables in the longitudinal direction.
    """

    # d1. Longer Boundary
    #     select starting corner
    corners = list(mesh.vertices_where({'vertex_degree': 2}))
    corner = corners[0]

    #     check in which direction the edge is shorter
    corner_edges = mesh.vertex_neighbors(corner)

    edgeA = (corner, corner_edges[0])
    edgeB = (corner, corner_edges[1])

    loopA = mesh.edge_loop(edgeA)
    loopB = mesh.edge_loop(edgeB)

    if len(loopA) >= len(loopB):
        start = edgeA
    else:
        start = edgeB

    # d2. get all edges parallel to the start edge
    starts = mesh.edge_strip(start)

    # d3. get all cables for all parallel starts
    cables = []
    for start in starts:
        cable = mesh.edge_loop(start)
        cables.append(cable)

    return cables

The result shows a satisfying corrugation throughout the structure:

Last updated