中国,SOHO办公兼老人居住(参数化设计)/卢晓亮+王韶宁

本站于2009年6月在论坛上贴出该参数化设计的程序代码: http://www.archgo.com/bbs/viewtopic.php?f=1&t=12

本设计的出发点是对城市历史的思考。一个历经了时间和事件的城市应当像一个饱经风霜的人,从他脸上的皱纹能看出岁月的痕迹。然而城市建筑的高速更新,使得一个存在了百年的城市面貌和新建的城市一样单薄。

设计的任务是在基地新建一座办公楼。通过调研发现原有基地是一片以老年人居住为主的老居住区,原有的建筑有其特有的风格。因此,希望能引入新的建筑功能和使用人群的同时,保留一部分原有的建筑和使用人群,使得当地的历史得到一定程度的保留和体现。

根据老年人和年轻人对空间使用要求的特点,用Rhino Scripting参照云形成的逻辑来生成许多混合的可能性,并根据形态的要求从中进行选择,最后落实成为最终建筑。

建筑设计:卢晓亮

程序:王韶宁(wang.sn#gmail.com)


http://www.archgo.com/bbs/viewtopic.php?f=1&t=12

2009-06-14

Option Explicit

'Script written by

'Script copyrighted by

'Script version 2009年6月13日 20:06:32

Call Main()

Sub Main()

Const site_width = 12

Const site_longth = 18

Const site_height = 15

Call rhino.enableRedraw(False)

'青年公寓的数量

Dim howManyYoungUnits : howManyYoungUnits = 750

'老年公寓的数量

Dim howManyOldUnits : howManyOldUnits = 375

'leader的位置

Dim howManyLeaders : howManyLeaders = 20

'首先,地块的三维数组

Dim arrSiteUnitStatus( 12, 18, 15)

Dim arrSiteSpaceStatus( 12, 18, 15)

Dim arrSiteUnitObjectID( 12, 18, 15)

'初始化随机数

Randomize

'每一层都随机分布

Dim i,j,k,l

'array使用前要初始化

For i =0 To site_width Step 1

For j = 0 To site_longth Step 1

For k = 0 To site_height Step 1

arrSiteUnitStatus(i,j,k)=0

arrSiteUnitObjectID(i,j,k)=0

arrSiteSpaceStatus(i,j,k)=0

Next

Next

Next

'初始化青年公寓,赋予随机的位置和固定的颜色

i = howManyYoungUnits

Do While i>0

j= Int((12 * Rnd))

k= Int((18 * Rnd))

l = Int((15 * Rnd))

If arrSiteUnitStatus(j,k,l)= 0 Then

arrSiteUnitObjectID(j,k,l) = 1

arrSiteUnitObjectID(j,k,l) = drawCube(j,k ,l)

i = i-1

End If

Loop

'初始化青年公寓,赋予随机的位置和固定的颜色

i = howManyOldUnits

Do While i>0

j= Int((12 * Rnd))

k= Int((18 * Rnd))

l = Int((15 * Rnd))

If arrSiteUnitStatus(j,k,l)= 0 Then

arrSiteUnitObjectID(j,k,l) = 2

arrSiteUnitObjectID(j,k,l) = drawCube(j,k ,l)

i = i-1

End If

Loop

'初始化“空间形态矩阵”产生leader

i = howManyLeaders

Do While i>0

j= Int((12 * Rnd))

k= Int((18 * Rnd))

l = Int((15 * Rnd))

If arrSiteSpaceStatus(j,k,l)= 0 Then

arrSiteSpaceStatus(j,k,l) = 1

i = i-1

End If

Loop

'检查空间的横向和纵向,是不是leader已经积聚,如果积聚,把空间的标记为可停留的、不可停留的

'检查行

'Const site_width = 12

'Const site_longth = 18

'Const site_height = 15

For i =0 To site_longth Step 1

l =0

Dim downLeftX, downLeftY, upRightX,upRightY

For j = 0 To site_width Step 1

For k = 0 To site_height Step 1

If arrSiteSpaceStatus(j,i,k)= 1 Then

'如果是第一个点,把所有的值都给它

If l =1 Then

downLeftX = j

downLeftY = k

upRightX = j

upRightY = k

End If

'记录" 左上"和“右下”的位置

If j

downLeftX =j

End If

If k

downLeftY =k

End If

If j>upRightX Then

upRightX =j

End If

If k>upRightY Then

upRightY =k

End If

'累加

l = l + 1

End If

Next

Next

'如果leader超过了3个,把这个区域变成固定区域

If l>2 Then

'该区域标记为固定区域

For j = 0 To site_width Step 1

For k = 0 To site_height Step 1

Next

Next

End If

Next

'绘图单元,遍历三维矩阵,绘制出每一个

Dim arrCenter

For i =0 To site_width Step 1

For j = 0 To site_longth Step 1

For k = 0 To site_height Step 1

'arrCenter = array(i*3,j*3,k*3)

'Rhino.AddSphere arrCenter, 3

'Call drawCube(i,j,k)

Next

Next

Next

Call rhino.enableRedraw(True)

End Sub

' 绘图单元,遍历三维矩阵,绘制出每一个

Function drawCube(x,y ,z)

Dim arr1,arr2,arr3 ,arr4,arr5,arr6,arr7,arr8,arrCorners

arr1 = array(x*7,y*7 ,z*3)

arr2 = array(x*7+7,y*7 ,z*3)

arr3 = array(x*7+7,y*7+7 ,z*3)

arr4 = array(x*7,y*7+7 ,z*3)

arr5 = array(x*7,y*7 ,z*3+3)

arr6 = array(x*7+7,y*7 ,z*3+3)

arr7 = array(x*7+7,y*7+7 ,z*3+3)

arr8 = array(x*7,y*7+7 ,z*3+3)

arrCorners=array(arr1,arr2,arr3 ,arr4,arr5,arr6,arr7,arr8)

Rhino.AddBox (arrCorners)

End Function