Video thumbnail

Assembly-aware design of masonry shell structures: a computational approach

Abstract This paper proposes a workflow for Assembly-Aware Design (AAD) of masonry shell structures and introduces an interactive tool in a CAD environment to assist the design process while simulating the step-by-step assembly of masonry blocks. Thus designers can explore the design space of masonry shell structures and be aware of structural performance before the assembly phase, at the early design stage. Masonry shell structures are an old construction technique, which has recently received a lot of attention due to new computational methods. Even though the form of such a structure is optimised for structural performance, its incomplete form during construction often requires the support of falseworks, which can be extensive, costly and time-consuming. To tackle this unsolved problem, we developed an assembly strategy that significantly reduces the falsework usage while still maintaining the equilibrium of the incomplete shell at each assembly step. The key idea is to compute a disassembly strategy inspired by the Jenga game and then reverse it to obtain the actual assembly sequence of the masonry blocks. Rather than using discrete element methods to predict the structural behaviour of the masonry blocks, we employed the GPU-based rigid-body dynamic solver from the engine NVIDIA PhysX, this allows very fast computation speeds while still offering sufficient accuracy for our purposes. Finally, we verified our method using small-scale 3D printed models. ...

October 3, 2017 · 2 min · Gene Ting-Chun Kao
Leopard GH plugin

Leopard

Leopard - A new way to process mesh in Grasshopper, a cool GH plugin. We are pleased to announce our new plugin for Grasshopper: “Leopard” http://www.grasshopper3d.com/group/leopard Leopard is an open source mesh processing solution for grasshopper that allows users to interact with rhino geometry and create customised mesh shapes. By selecting Mesh vertices, edges and faces, users have more freedom to edit meshes intuitively and use different subdivision schemes to selectively choose multiple areas to fix. ...

February 21, 2017 · 1 min · Gene Ting-Chun Kao
Rhino.Python Swarm Bridge

Rhino.Python

These are my Rhino.Python practice while I studied at Stuttgart University. Rhino.Python - 1D 2D 3D Rhino.Python - Swarm bridge Rhino.Python - tessellation and subdivision Rhino.Python - Boy Surface and subdivision Rhino.Python - 1D 2D 3D """ #################################################################### Computational Design Assignment 02 Kao, Ting-Chun Assignment to use for loop #################################################################### """ from scriptcontext import doc, escape_test import rhinoscriptsyntax as rs import Rhino.Geometry as rg import Rhino.DocObjects as rd import Rhino import time import System.Guid as guid import System.Drawing as sd import math import random dimension = rs.GetInteger("give me one to three dimension: ", 2, 1, 3) print(dimension) # some functions def PtMat(x, y, z): pt = rg.Point3d(x, y, z) materialIndex = doc.Materials.Add() material = doc.Materials[materialIndex] if dimension == 2: if x > 0 and y>0 and z>0: material.DiffuseColor = sd.Color.FromArgb(y/5*255*0.5, y/5*255*0.5, y/5*255) else: material.DiffuseColor = sd.Color.FromArgb( 255, abs(math.sin(x))*255, 255) material.CommitChanges() attr = Rhino.DocObjects.ObjectAttributes() attr = rd.ObjectAttributes() attr.MaterialSource = Rhino.DocObjects.ObjectMaterialSource.MaterialFromObject attr.MaterialIndex = materialIndex if dimension == 2: sphere = rg.Sphere(pt, (y+5)/5) elif dimension == 3: sphere = rg.Sphere(pt, 0.2) else: sphere = rg.Sphere(pt, 2) if doc.Objects.AddPoint(pt, attr) != guid.Empty: doc.Objects.AddSphere(sphere, attr) return pt def noneLoopPt(): pt = PtMat(i*math.sin(5*i), i*math.cos(5*i), i) return pt def oneLoopCrv(): pts = [] for x in range(50): y = math.sin(x) * math.sin(i) pts.append(PtMat(5*x, 5*y, 5*i)) crv = rs.AddCurve(pts) return crv def twoLoopCrv(): pts = [] crvs = [] for x in range(30): for y in range(40): a = ( i + math.cos(x/2)*math.sin(y) - math.sin(x/2)*math.sin(2*y) ) * math.cos(x) b = ( i + math.cos(x/2)*math.sin(y) - math.sin(x/2)*math.sin(2*y) ) * math.sin(x) c = 10*math.sin(x/2)*math.sin(y) - math.cos(x/2)*math.sin(2*y) pts.append(PtMat(a, b, c)) crv = rs.AddCurve(pts) crvs.append(crv) return crvs def threeLoopSrf(): # haven't getten any idea to having a good one. return 0 def drawTime(): FPS = 30 last_time = time.time() # setup variables global i i = 3 curves = [] pts = [] # whatever the loop is... while True: # draw animation if dimension == 3: i += 3 else: i += 1 # pause so that the animation runs at 30 fps new_time = time.time() # see how many milliseconds we have to sleep for # then divide by 1000.0 since time.sleep() uses seconds sleep_time = ((1000.0 / FPS) - (new_time - last_time)) / 1000.0 if sleep_time > 0: time.sleep(sleep_time) last_time = new_time if dimension == 2: crv = oneLoopCrv() curves.append(crv) if i > 20: rs.AddLoftSrf(curves) break elif dimension == 3: curves = twoLoopCrv() escape_test() else: pt = noneLoopPt() pts.append(pt) if i > 80: #rs.AddLoftSrf(curves) rs.AddCurve(pts) break escape_test() def main(): drawTime() if __name__ == "__main__": main() Rhino.Python - Swarm Bridge Swarm Behavior + Attractor : Agent methods: 1. Align : Move in the same direction as your neighbours. 2. Cohesion : Remain close to your neighbours. 3. Seperation : Avoid collisions with your neighbours. Attractor methods: (Controlling the shape) From starting points move to target points to create bridge. Using swarm simulation in Grasshopper is in this post: Swarm Python GH Component ...

November 30, 2014 · 11 min · Gene Ting-Chun Kao