Moriyama House Info


The Moriyama House is a series of connected apartments located in Toyko, Japan designed by Ryue Nishizawa of SANAA. These buildings are placed on a lot with each mass containing a different part of the overall program. Together all of the masses combine to equal an entire home, but each piece varies in size and shape based on program housed inside. Some are as small as space for a single shower, and others are multi-stored and feature spaces for a kitchen, living spaces, and a bedroom.

 

In my program, I sought to capture the iconic image of this project; the simple white volumes arranged on a site with irregularly spaced fenestration. This was achieved by researching some of the drawings and design process of SANAA in order to create the most accurate means of recreating the site.

Exercise 5 – Making Dimensions Parametric and Windows Spatially Relevant


This assignment is the capstone for the course and focused in large part on resolving some of the issues of the previous iterations. The first step for refining my program to make it closer to the actual Moriyama House design was to divide the building masses into figurative ‘floors’ to allow for the creation of windows on both ‘floors’. This not only refined the dimensions of windows but also make the buildings seems more human scaled and architecturally believable. The next step was to make the windows proportional to the surface they are being placed on. Through this step they went from being generated from a fixed range of dimensions to one directly derived from the placement surface. This is continued as the window is shifted by an amount relating directly to the dimension of the placement surface. Ultimately these changes have resulted in a significantly more believable building.

 


import rhinoscriptsyntax as rs
import math as m
import random as r

rs.DeleteObjects(rs.AllObjects())

lotSizeX = 240
lotSizeY = 120

zoneSizeX = 60
zoneSizeY = 60

nrZonesX = lotSizeX // zoneSizeX
nrZonesY = lotSizeY // zoneSizeY

#add frame
plane = rs.WorldXYPlane()
frame = rs.AddRectangle(plane, lotSizeX, lotSizeY);
wallSurfaces = []

#definine the make windows tool by locating the origin of the rame, then the centerpoint
#then moving the plane by a random amount for variation, and generating a rectange of a randomized height and width
def makeBuilding (frame):
origin = rs.CurveStartPoint(frame)
midPoint = [origin[0] + zoneSizeX / 2, origin[1] + zoneSizeY / 2, 0]
center = rs.AddPoint(midPoint)
planeTwo = rs.MovePlane( plane, midPoint)
windowNew = rs.AddRectangle(planeTwo,r.uniform(20,50),r.uniform(20,50))
rs.MoveObject(windowNew,[r.uniform(-20,0),r.uniform(-20,0),0])
buildingHeight = (r.uniform(20,50))
topPoint = [origin[0] + zoneSizeX / 2, origin[1] + zoneSizeY / 2, buildingHeight]
walls = (rs.ExtrudeCurveStraight( windowNew , midPoint , topPoint))
rs.CapPlanarHoles (walls)
wallFaces = rs.ExplodePolysurfaces(walls, True)
wallSurfaces.extend(wallFaces)
cuttingCurve = rs.CopyObject(windowNew, [0,0,buildingHeight/2])
cuttingSurface = rs.AddPlanarSrf(cuttingCurve)
newWalls = []
for wall in wallFaces:
twoWalls = rs.SplitBrep(wall, cuttingSurface, True)
if twoWalls is not None:
newWalls.extend(twoWalls)
wallFaces = newWalls
rs.DeleteObject(cuttingCurve)

def makeWindow(building):
plane2 = rs.SurfaceFrame(building, [0,0])
lengthWall = rs.SurfaceDomain(building, 0)
widthWall = rs.SurfaceDomain(building,1)
centerWall = rs.SurfaceAreaCentroid(building)[0]
plane3 = rs.MovePlane(plane2, centerWall)
print (plane3)
wallBorder = rs.DuplicateSurfaceBorder(building)
wallBorders = rs.ExplodeCurves(wallBorder, True)
widthX = rs.CurveLength(wallBorders[0])
widthY = rs.CurveLength(wallBorders[1])
windowWidth = widthX*(r.uniform(0.1,0.5))
windowHeight = widthY*(r.uniform(0.5,0.8))
windowBox = rs.AddRectangle(plane3, windowWidth, windowHeight)
rs.MoveObject(windowBox, rs.VectorScale(plane3[1],-windowWidth/2))
rs.MoveObject(windowBox, rs.VectorScale(plane3[2],-windowHeight/2))
rs.MoveObject(windowBox, rs.VectorScale(plane3[1],(r.uniform(-1,1)*windowWidth)))
windowBack = rs.CopyObject(windowBox, -plane3.ZAxis)
windowShell = rs.AddLoftSrf([windowBox, windowBack], closed=False)
window = rs.CapPlanarHoles(windowShell)

#the make window command is applied for all of the 'zones' created in the project, based off of the lot and then sone sizes
for j in range (0, nrZonesY):
for i in range(0, nrZonesX):
newPlane = rs.MovePlane(plane, [i*zoneSizeX,j*zoneSizeY,0])
rs.MovePlane( plane, [r.uniform(0,30),r.uniform(0,30),0])
zone = rs.AddRectangle(newPlane, zoneSizeX, zoneSizeY)
buildingUnit = makeBuilding (zone)

windowFace = rs.GetObject("Please select face to add windows to:")
while windowFace:
makeWindow (windowFace)
windowFace = rs.GetObject("Please select face to add windows to:")

Exercise 4 – Adding Dimension and Recording Information


The fourth assignment focused on the addition of dimension to the extant building surfaces and refining the window placement program. The windows that were previously placed in the center and generated directionally from that point are now placed on the surface in the center and shifted from this location. Additionally the windows are now extruded and placed into the wall surfaces.

import rhinoscriptsyntax as rs
import math as m
import random as r

rs.DeleteObjects(rs.AllObjects())

lotSizeX = 240
lotSizeY = 120

zoneSizeX = 60
zoneSizeY = 60

nrZonesX = lotSizeX // zoneSizeX
nrZonesY = lotSizeY // zoneSizeY

#add frame
plane = rs.WorldXYPlane()
frame = rs.AddRectangle(plane, lotSizeX, lotSizeY);
wallSurfaces = []

#definine the make windows tool by llocating the origin of the rame, then the centerpoint
#then moving the plane by a random amount for variation, and generating a rectange of a randomized height and width
def makeBuilding (frame):
    origin = rs.CurveStartPoint(frame)
    midPoint = [origin[0] + zoneSizeX / 2, origin[1] + zoneSizeY / 2, 0]
    center = rs.AddPoint(midPoint)
    planeTwo = rs.MovePlane( plane,  midPoint)
    windowNew = rs.AddRectangle(planeTwo,r.uniform(20,50),r.uniform(20,50))
    rs.MoveObject(windowNew,[r.uniform(-20,0),r.uniform(-20,0),0])
    topPoint = [origin[0] + zoneSizeX / 2, origin[1] + zoneSizeY / 2, r.uniform(20,50)]
    walls = (rs.ExtrudeCurveStraight( windowNew , midPoint , topPoint))
    rs.CapPlanarHoles (walls)
    wallFaces = rs.ExplodePolysurfaces(walls, True)
    wallSurfaces.extend(wallFaces)

def makeWindow(building):
    plane2 = rs.SurfaceFrame(building, [0,0])
    lengthWall = rs.SurfaceDomain(building, 0)
    widthWall = rs.SurfaceDomain(building,1)
    centerWall = rs.SurfaceAreaCentroid(building)[0]
    plane3 = rs.MovePlane(plane2, centerWall)
    print (plane3)
    windowWidth = r.uniform(5,15)
    windowHeight = r.uniform(5,15)
    windowBox = rs.AddRectangle(plane3, windowWidth, windowHeight)
    rs.MoveObject(windowBox, rs.VectorScale(plane3[1],-windowWidth/2))
    windowBack = rs.CopyObject(windowBox, -plane3.ZAxis)
    windowShell = rs.AddLoftSrf([windowBox, windowBack], closed=False)
    window = rs.CapPlanarHoles(windowShell)
    #rs.CurveBooleanDifference(buildingUnit, window)

#the make window command is applied for all of the 'zones' created in the project, based off of the lot and then sone sizes
for j in range (0, nrZonesY):
    for i in range(0, nrZonesX):
        newPlane = rs.MovePlane(plane, [i*zoneSizeX,j*zoneSizeY,0])
        rs.MovePlane( plane,  [r.uniform(0,30),r.uniform(0,30),0])
        zone = rs.AddRectangle(newPlane, zoneSizeX, zoneSizeY)
        buildingUnit = makeBuilding (zone)

windowFace = rs.GetObject("Please select face to add windows to:")
while windowFace:
    makeWindow (windowFace)
    windowFace = rs.GetObject("Please select face to add windows to:")

Exercise 3 – Defining the 3D Form of Buildings on the Site


The third code of the project featured the consideration of the form in three dimensions. Each building footprint established in the first in extruded by a generated amount and then capped into a solid object. From this point a function is evoked that generates windows on surfaces as selected by the user. Once a surface is selected, the rectangle is placed in the center of the surface and shifted by a generated amount. This process continues until the user indicates there are no more windows to be placed.

import rhinoscriptsyntax as rs
import math as m
import random as r

rs.DeleteObjects(rs.AllObjects())

lotSizeX = 240
lotSizeY = 120

zoneSizeX = 60
zoneSizeY = 60

nrZonesX = lotSizeX // zoneSizeX
nrZonesY = lotSizeY // zoneSizeY

#add frame
plane = rs.WorldXYPlane()
frame = rs.AddRectangle(plane, lotSizeX, lotSizeY);
wallSurfaces = []

#definine the make windows tool by llocating the origin of the rame, then the centerpoint
#then moving the plane by a random amount for variation, and generating a rectange of a randomized height and width
def makeBuilding (frame):
    origin = rs.CurveStartPoint(frame)
    midPoint = [origin[0] + zoneSizeX / 2, origin[1] + zoneSizeY / 2, 0]
    center = rs.AddPoint(midPoint)
    planeTwo = rs.MovePlane( plane,  midPoint)
    windowNew = rs.AddRectangle(planeTwo,r.uniform(20,50),r.uniform(20,50))
    rs.MoveObject(windowNew,[r.uniform(-20,0),r.uniform(-20,0),0])
    topPoint = [origin[0] + zoneSizeX / 2, origin[1] + zoneSizeY / 2, r.uniform(20,50)]
    walls = (rs.ExtrudeCurveStraight( windowNew , midPoint , topPoint))
    rs.CapPlanarHoles (walls)
    wallFaces = rs.ExplodePolysurfaces(walls, True)
    wallSurfaces.extend(wallFaces)

def makeWindow(building):
    plane2 = rs.SurfaceFrame(building, [0,0])
    lengthWall = rs.SurfaceDomain(building, 0)
    widthWall = rs.SurfaceDomain(building,1)
    centerWall = rs.SurfaceAreaCentroid(building)[0]
    plane3 = rs.MovePlane(plane2, centerWall)
    windowBox = rs.AddRectangle(plane3, r.uniform(-15,15), r.uniform(-15,15))

#the make window command is applied for all of the 'zones' created in the project, based off of the lot and then sone sizes
for j in range (0, nrZonesY):
    for i in range(0, nrZonesX):
        newPlane = rs.MovePlane(plane, [i*zoneSizeX,j*zoneSizeY,0])
        rs.MovePlane( plane,  [r.uniform(0,30),r.uniform(0,30),0])
        zone = rs.AddRectangle(newPlane, zoneSizeX, zoneSizeY)
        buildingPlanes = makeBuilding (zone)

windowFace = rs.GetObject("Please select face to add windows to:")
while windowFace:
    makeWindow (windowFace)
    windowFace = rs.GetObject("Please select face to add windows to:")

Exercise 2 – 2 Dimensional Development of Plots and Building Footprint


This assignment began my selected topic of generating a program that produced iterations that emulate the massing of the Moriyama House as designed by SANAA. For the second exercise this involved analyzing the rules that governed the arrangement of the buildings on the plot. The first realization was that the buildings fit nearly into a grid that is overlaid onto the site. From this point a centroid of each plot could be shifted and from that centerpoint, a building footprint could be generated in two dimensions.

import rhinoscriptsyntax as rs
import math as m
import random as r

rs.DeleteObjects(rs.AllObjects())

lotSizeX = 240
lotSizeY = 120

zoneSizeX = 60
zoneSizeY = 60

nrZonesX = lotSizeX // zoneSizeX
nrZonesY = lotSizeY // zoneSizeY

#add frame
plane = rs.WorldXYPlane()
frame = rs.AddRectangle(plane, lotSizeX, lotSizeY);

#definitne the make windows tool by llocating the origin of the rame, then the centerpoint
#then moving the plane by a random amount for variation, and generating a rectange of a randomized height and width
def makeWindow (frame):
    origin = rs.CurveStartPoint(frame)
    midPoint = [origin[0] + zoneSizeX / 2, origin[1] + zoneSizeY / 2, 0]
    center = rs.AddPoint(midPoint)
    planeTwo = rs.MovePlane( plane,  midPoint)
    windowNew = rs.AddRectangle(planeTwo,r.uniform(20,50),r.uniform(20,50))
    rs.MoveObject(windowNew,[r.uniform(-20,0),r.uniform(-20,0),0])

#the make window command is applied for all of the 'zones' created in the project, based off of the lot and then sone sizes
for j in range (0, nrZonesY):
    
    for i in range(0, nrZonesX):
        newPlane = rs.MovePlane(plane, [i*zoneSizeX,j*zoneSizeY,0])
        rs.MovePlane( plane,  [r.uniform(0,30),r.uniform(0,30),0])
        zone = rs.AddRectangle(newPlane, zoneSizeX, zoneSizeY)
        makeWindow (zone)
.

Exercise 1 – Exploring Abilities of Python for Rhino


The focus of this assignment was to explore the constraints and rules relating to the basic operating of Python in conjunction to Rhino.  The outcome was a fixed product drawing mostly on the in-program commands from Rhino evoked by name in Python. In this exercise these skills were used to generate a two dimensional image of a character from a cartoon.

#Clearing leftover objects
rs.DeleteObjects (rs.AllObjects())

#Drawing body and screen and text box
rs.AddRectangle( [0,0,0], 15, 25 )
rs.AddRectangle( [1,14,0], 13, 10 )
rs.AddRectangle( [16,16,0], 15, 5)

#Fillet shapes for body, screen, and text box
rs.Command("SelAll")
rs.Command("FilletCorners 1")
rs.Command("DeselectAll")

#Drawing Eyes
rs.AddCircle ( [4,20,0], .25)
rs.AddCircle ( [11,20,0], .25)

#Drawing mouth
rs.AddArc3Pt ( [5,18,0], [10,18,0], [7.5,15.5,0] )
rs.AddLine ( [5,18,0], [10,18,0] )

#Drawing arc for tongue
rs.AddArc3Pt ( [6,16,0], [9,16,0], [7.5,16.5,0] )

#Drawing plus outline (1/4 of total shape)
rs.AddPolyline ( ([4,7,0],[5,7,0],[5,8,0],[4,8,0]) )

#Selecting and arraying the plus pieces
rs.SelectObjects( rs.WindowPick ( [6,6,0],[3,9,0], view="Top") )
rs.Command("ArrayPolar 3.5,7.5 4 360 Enter")
rs.UnselectAllObjects ()

#Adding buttons, circular and triangular
rs.AddCircle([12,12,0,], .5)
rs.AddCircle([13.5,6,0], .5)
rs.AddCircle([12,3,0], 1.5)
rs.AddPolyline(([11,6,0], [8,6,0], [9.5,8.5,0], [11,6,0]))

#Adding oval buttons on bottom
rs.Command("Rectangle Rounded 1,2,0 3.5,3,0 0.5")
rs.Command("Rectangle Rounded 4,2,0 6.5,3,0 0.5")

#Oval button at top
rs.Command("Rectangle Rounded 3,12,0 9,13,0 0.5")

#Hi Finn and Jake
rs.AddText ("Hi Finn and Jake!", [18,18,0])
rs.AddPolyline (([18,16,0], [18,15,0], [20,16,0]))

#Drawing Feet
rs.Command("Rectangle Rounded 3,-4,0 5,-3,0 0.5")
rs.AddLine([5,-3.5,0], [5,0,0])
rs.AddLine([4,-3,0], [4,0,0])
rs.Command("Rectangle Rounded 10,-4,0 12,-3,0 0.5")
rs.AddLine([10,-3.5,0], [10,0,0])
rs.AddLine([11,-3,0], [11,0,0])

#Adding arms
rs.AddArc3Pt([0,11,0],[-4,15,0],[-3.47,13,0])
rs.AddArc3Pt([0,10,0],[-5,15,0],[-3,11,0])
rs.AddArc([-4.5,15,0],.5,180)
rs.AddArc([15,6,0],4,90)
rs.AddArc([15,6,0],5,90)
rs.AddArc([19.5,6,0],.5,-180)

#View Work
rs.ZoomExtents("Top")
Skip to toolbar