Testing Waters
Search…
Guggenheim Helsinki
The building should be designed so as to fit into its surroundings. In cityscape and landscape impact, the design should be located so as to not obscure views from Tahitornin vuori park past and over the building
Aeriel View
Site View
​
​
​
​
1
//Vantage Point
2
Peak=Point.ByCoordinates(-552,-77,27.5);
3
​
4
//A list of the xyz coordinates of the points along the site boundary
5
portX = {-556,-530,-528,-516,-518,-481,-480,-462,-384,-385,-380,
6
-380,-385,-386,-358,-358,-277,-273,-257,-246,-6};
7
portY = {544,546,517,518,546,548,520,500,505,520,520,532,532,549,
8
550,553,557,458,447,464,302};
9
portZ = -10;
10
portVer = Point.ByCoordinates(portX,portY,portZ);
11
portEdg = PolyCurve.ByPoints(portVer,false);
Copied!
0:0
1:0
​
​
1:2
20160627-1.zip
2KB
Binary
1
GridDensity=2;
2
​
3
//Far Port Profile
4
PortVertices=[Imperative]
5
{
6
//Elevation, considering a level site
7
e2=-10;
8
//A list of the xyz coordinates of the points along the site boundary
9
Coordinates={-556,544,e2,-530,546,e2,-528,517,e2,-516,518,e2,-518,546,e2,-481,548,e2,-480,520,e2,-462,500,e2,-384,505,e2,-385,520,e2,-380,520,e2,-380,532,e2,-385,532,e2,-386,549,e2,-358,550,e2,-358,553,e2,-277,557,e2,-273,458,e2,-257,447,e2,-246,464,e2,-6,302,e2};
10
//Creating points from the list of xyz coordinates
11
Points={};
12
pi=0;
13
pc=0;
14
while (pc<List.Count(Coordinates))
15
{
16
Points[pi]=Point.ByCoordinates(Coordinates[pc],Coordinates[pc+1],Coordinates[pc+2]);
17
pi=pi+1;
18
pc=pc+3;
19
}
20
return=Points;
21
}
22
//Connecting points with lines
23
PortEdge=PolyCurve.ByPoints(PortVertices,false);
24
​
25
VolumetricMass=[Imperative]
26
{
27
//Elevation, considering a level site
28
e1=2.1;
29
//A list of the xyz coordinates of the points along the site boundary
30
Coordinates={-535,270,e1,-471,274,e1,-470,253,e1,-442,219,e1,-428,202,e1,-418,189,e1,-366,126,e1,-439,65,e1,-470,107,e1,-476,115,e1,-484,125,e1,-490,134,e1,-493,138,e1,-497,143,e1,-504,154,e1,-511,166,e1,-517,177,e1,-521,187,e1,-525,199,e1,-529,211,e1,-532,224,e1,-534,239,e1,-535,244,e1,-536,250,e1};
31
//Creating points from the list of xyz coordinates
32
Points={};
33
pi=0;
34
pc=0;
35
while (pc<List.Count(Coordinates))
36
{
37
Points[pi]=Point.ByCoordinates(Coordinates[pc],Coordinates[pc+1],Coordinates[pc+2]);
38
pi=pi+1;
39
pc=pc+3;
40
}
41
​
42
//Connecting points with lines
43
SiteBoundary=PolyCurve.ByPoints(Points,true);
44
​
45
//West Deduction Profile
46
//A list of the xyz coordinates of the points along the site boundary
47
WestDeductionCoordinates={-535,270,e1,-525,271,e1,-526,250,e1,-525,245,e1,-525,240,e1,-522,226,e1,-519,214,e1,-516,202,e1,-511,191,e1,-507,181,e1,-502,170,e1,-495,159,e1,-489,149,e1,-485,144,e1,-481,139,e1,-476,131,e1,-468,121,e1,-462,113,e1,-452,99,e1,-432,72,e1,-431,71,e1,-439,64,e1,-439,65,e1,-470,107,e1,-476,115,e1,-484,125,e1,-490,134,e1,-493,138,e1,-497,143,e1,-504,154,e1,-511,166,e1,-517,177,e1,-521,187,e1,-525,199,e1,-529,211,e1,-532,224,e1,-534,239,e1,-535,244,e1,-536,250,e1};
48
//Creating points from the list of xyz coordinates
49
WestDeductionPoints={};
50
pi=0;
51
pc=0;
52
while (pc<List.Count(WestDeductionCoordinates))
53
{
54
WestDeductionPoints[pi]=Point.ByCoordinates(WestDeductionCoordinates[pc],WestDeductionCoordinates[pc+1],WestDeductionCoordinates[pc+2]);
55
pi=pi+1;
56
pc=pc+3;
57
}
58
//Connecting points with lines
59
WestDeductionLines=PolyCurve.ByPoints(WestDeductionPoints,true);
60
WestDeduction=WestDeductionLines.ExtrudeAsSolid(Vector.ByCoordinates(0,0,1),5.5);
61
​
62
//East Deduction Profile
63
//A list of the xyz coordinates of the points along the East boundary
64
EastDeductionCoordinates={-485,274,e1,-470,274,e1,-469,253,e1,-441,219,e1,-433,209,e1,-427,202,e1,-417,189,e1,-377,141,e1,-397,140,e1,-429,180,e1,-440,192,e1,-446,200,e1,-454,209,e1,-485,247,e1};
65
//Creating points from the list of xyz coordinates
66
EastDeductionPoints={};
67
qi=0;
68
qc=0;
69
while (qc<List.Count(EastDeductionCoordinates))
70
{
71
EastDeductionPoints[qi]=Point.ByCoordinates(EastDeductionCoordinates[qc],EastDeductionCoordinates[qc+1],EastDeductionCoordinates[qc+2]);
72
qi=qi+1;
73
qc=qc+3;
74
}
75
//Connecting points with lines
76
EastDeductionLines=PolyCurve.ByPoints(EastDeductionPoints,true);
77
EastDeduction=EastDeductionLines.ExtrudeAsSolid(Vector.ByCoordinates(0,0,1),25);
78
​
79
//Volumetric Mass
80
SiteMass=SiteBoundary.ExtrudeAsSolid(-22);
81
Deductions={WestDeduction,EastDeduction};
82
Deduction=Deductions[0].UnionAll(Deductions);
83
SiteMass=SiteMass.Difference(Deduction);
84
return=SiteMass;
85
}
86
​
87
//Sight Lines from Park to Far Port
88
ParkSightLines=[Imperative]
89
{
90
Peak=Point.ByCoordinates(-552,-77,27.5);
91
​
92
//Elevation, considering a level site
93
e2=-15;
94
//A list of the xyz coordinates of the points along the site boundary
95
Coordinates={-556,544,e2,-530,546,e2,-528,517,e2,-516,518,e2,-518,546,e2,-481,548,e2,-480,520,e2,-462,500,e2,-384,505,e2,-385,520,e2,-380,520,e2,-380,532,e2,-385,532,e2,-386,549,e2,-358,550,e2,-358,553,e2,-277,557,e2,-273,458,e2,-257,447,e2,-246,464,e2,-6,302,e2};
96
//Creating points from the list of xyz coordinates
97
Points={};
98
pi=0;
99
pc=0;
100
while (pc<List.Count(Coordinates))
101
{
102
Points[pi]=Point.ByCoordinates(Coordinates[pc],Coordinates[pc+1],Coordinates[pc+2]);
103
pi=pi+1;
104
pc=pc+3;
105
}
106
​
107
//Angles Connecting Peak to Port Edge
108
Angles={};
109
ai=0;
110
while (ai<List.Count(Points))
111
{
112
Angles[ai]=Math.Atan((Points[ai].X-Peak.X)/(Points[ai].Y-Peak.Y));
113
ai=ai+1;
114
}
115
​
116
//Lines Connecting Peak to Port Edge
117
EPoints={};
118
li=0;
119
lc=1;
120
EPoints[0]=Points[0];
121
while (li<(List.Count(Points)-1))
122
{
123
if (Angles[li+1]>(Angles[li]+0.5))
124
{
125
EPoints[lc]=Points[li+1];
126
li=li+1;
127
lc=lc+1;
128
}
129
else
130
{
131
li=li+1;
132
}
133
}
134
//Polycurves
135
PLines={};
136
PExt={};
137
di=0;
138
while (di<(List.Count(EPoints)-1))
139
{
140
PPoints={Peak,EPoints[di],EPoints[di+1]};
141
PLines[di]=PolyCurve.ByPoints(PPoints,true);
142
PExt[di]=PLines[di].ExtrudeAsSolid(Vector.ByCoordinates(0,0,1),25);
143
di=di+1;
144
}
145
CutMass=PExt[0].UnionAll(PExt);
146
CutSurface=Surface.ByPatch(PLines);
147
CutSurface=PolySurface.ByJoinedSurfaces(CutSurface);
148
return={CutMass,CutSurface};
149
}
150
​
151
//Bernhardinkatu
152
BernhardinkatuSlope=Vector.ByTwoPoints(Point.ByCoordinates(-609,113,12.8),Point.ByCoordinates(-486,120,(3.5+5.5)));
153
BernhardinkatuPoints={Point.ByCoordinates(-610,128,12.25),Point.ByCoordinates(-609,113,12.25),Point.ByCoordinates(-609,113,22.5),Point.ByCoordinates(-610,128,22.5)};
154
BernhardinkatuLine=PolyCurve.ByPoints(BernhardinkatuPoints,true);
155
BernhardinkatuMass=BernhardinkatuLine.ExtrudeAsSolid(BernhardinkatuSlope,250);
156
​
157
RampSlope=Vector.ByTwoPoints(Point.ByCoordinates(-609,113,18.25),Point.ByCoordinates(-486,120,10));
158
RampCutPoints={Point.ByCoordinates(-610,128,17.25),Point.ByCoordinates(-609,113,17.25),Point.ByCoordinates(-609,113,25),Point.ByCoordinates(-610,128,25)};
159
RampLine=PolyCurve.ByPoints(RampCutPoints,true);
160
RampCuttingMass=RampLine.ExtrudeAsSolid(RampSlope,250);
161
​
162
BuildingMass1=VolumetricMass.Difference(ParkSightLines[0]);
163
BuildingMass=BuildingMass1.Difference(BernhardinkatuMass);
164
BuildingMass=BuildingMass.Difference(RampCuttingMass);
165
​
166
//Entry/Exit Triangle
167
EnTriPnts={Point.ByCoordinates(-465.411644,222.985474,2.1),Point.ByCoordinates(-462.375319,233.504172,2.1),Point.ByCoordinates(-422.323500,171.657816,2.1),Point.ByCoordinates(-430.082047,156.780317,2.1)};
168
EntTriBou=PolyCurve.ByPoints(EnTriPnts,true);
169
EntTriSur=Surface.ByPatch(EntTriBou);
170
EntTriSol1=EntTriSur.Thicken(-15,false);
171
EntTriSol=EntTriSol1.Difference(ParkSightLines[0]);
172
BuildingMassEnt=BuildingMass.Union(EntTriSol);
173
​
174
//Extracting Top Surface
175
BuildingPolySurface=PolySurface.BySolid(BuildingMass);
176
BuildingSurfaces=BuildingPolySurface.Surfaces();
177
RampTopSurf=Flatten(BuildingSurfaces<1>.Intersect(RampCuttingMass));
178
RampTopSurf=RemoveIfNot(RampTopSurf,"Surface");
179
RampTopSurf=RampTopSurf[0];
180
//RampTopSurf=RampTopSurf.FlipNormalDirection();
181
TopSurf=BuildingSurfaces<1>.Intersect(ParkSightLines[0]);
182
TopSurf=Flatten(TopSurf);
183
TopSurf=RemoveIfNot(TopSurf,"Surface");
184
TopSurface=Flatten({TopSurf,RampTopSurf});
185
​
186
def remPnt(Li:var[])
187
{
188
LiF=RemoveIfNot(Li,"Line");
189
return=LiF;
190
}
191
​
192
//Function: Creating a Uniform Grid
193
def SurfaceGrid(surf,UnitDivision,Mass)
194
{
195
DivisionU=UnitDivision/(surf.PointAtParameter(0,0).DistanceTo(surf.PointAtParameter(1,0)));
196
DivisionV=UnitDivision/(surf.PointAtParameter(0,0).DistanceTo(surf.PointAtParameter(0,1)));
197
SurfPoints=Flatten(surf.PointAtParameter((0..1..~DivisionU)<1>,(0..1..~DivisionV)<2>));
198
SurfNormals=Flatten(surf.NormalAtParameter((0..1..~DivisionU)<1>,(0..1..~DivisionV)<2>));
199
SurfLines=Line.ByStartPointDirectionLength(SurfPoints,SurfNormals,20);
200
SurfInPoints=Flatten(SurfLines.DoesIntersect(surf));
201
SurfInLines=List.FilterByBoolMask(SurfLines,SurfInPoints)["in"];
202
​
203
//BuildingMass Intersects
204
Intersects=Flatten(Mass.Intersect(SurfInLines));
205
Intersects=remPnt(Intersects);
206
​
207
//Filter by Base Level
208
BaseLevelFilter1=Intersects.EndPoint.Z==2.1&&Intersects.EndPoint.Z<7.61?true:false;
209
BaseLevel1=Flatten(List.FilterByBoolMask(Intersects,BaseLevelFilter1)["in"]);
210
BaseLevelFilter2=Intersects.EndPoint.Z==7.6?true:false;
211
BaseLevel2=Flatten(List.FilterByBoolMask(Intersects,BaseLevelFilter2)["in"]);
212
​
213
//Returns BasePoint(2.1), RoofPoint(2.1),
214
return={BaseLevel1.EndPoint,BaseLevel1.StartPoint,BaseLevel2.EndPoint,BaseLevel2.StartPoint};
215
}
216
​
217
//Top and Bottom Grid (1-Base Lower Points,2-Top for Lower, 3-Base Upper, 4-Top for Upper
218
​
219
TopBottomGrid=SurfaceGrid(TopSurface,GridDensity,BuildingMass);
220
​
221
//Separate the Grids based on Levels
222
TopBottomGrid=List.Transpose(TopBottomGrid);
223
//LowerLevelFloorPoints
224
LLFP=TopBottomGrid[0];
225
//LowerLevelRoofPoints
226
LLRP=TopBottomGrid[1];
227
//UpperLevelFloorPoints
228
ULFP=TopBottomGrid[2];
229
//UpperLevelRoofPoints
230
ULRP=TopBottomGrid[3];
231
​
232
//Height Range1
233
h1={0,1.5,2.45,3.15,4.05,5.05,6.75,8.35,9.5,11.45,12.05,13.6,14.05,15.7,16.05,17.75,18};
234
//Height Range2
235
h2={1.45,2.4,3.1,4,5.00,6.7,8.15,9.5,11.45,12,13.55,14,15.65,16,17.75,18,20};
236
​
237
def HeightGroup(RoofPoints:var[],FloorPoints:var[],Height1,Height2)
238
{
239
R0=(RoofPoints.Z)>(Height1+2.1)&&(RoofPoints.Z)<(Height2+2.1)?true:false;
240
R0FilterIn=List.FilterByBoolMask(RoofPoints<1>,R0<2>)["in"];
241
F0FilterIn=List.FilterByBoolMask(FloorPoints<1>,R0<2>)["in"];
242
return={R0FilterIn,F0FilterIn};
243
}
244
​
245
//Lower Level Points Grouped by Height
246
LLPH=List.Transpose(HeightGroup(LLRP<1>,LLFP<1>,h1<2>,h2<2>)<2>);
247
​
248
//Upper Level Points Grouped by Height
249
ULPH=List.Transpose(HeightGroup(ULRP<1>,ULFP<1>,h1<2>,h2<2>)<2>);
250
​
251
//Function - Boundary Points in Cluster
252
def BoundaryPoints(PointsGrid:var[],GroupKey)
253
{
254
//Group Points with same X
255
GridX=GroupByKey(PointsGrid<1>,GroupKey)<2>;
256
GridMin=List.FirstItem(GridX<1>);
257
GridMax=List.LastItem(GridX<1>);
258
​
259
SingleItemFilter=GridMin==GridMax?true:false;
260
PeripheryMinX=List.FilterByBoolMask(GridMin<1>,SingleItemFilter<2>)["in"];
261
​
262
PeripheryMaxX=List.Reverse(List.FilterByBoolMask(GridMax<1>,SingleItemFilter<2>)["in"]);
263
​
264
PeripheryPoint=Flatten({PeripheryMinX,
265
PeripheryMaxX});
266
return=PeripheryPoint;
267
}
268
​
269
//Boundary Points
270
LLBPn=List.Transpose(BoundaryPoints(LLPH,GroupKeyX));
271
ULBPn=List.Transpose(BoundaryPoints(ULPH,GroupKeyX));
272
​
273
//Lower Level Boundary Curves
274
LLBP=Point.PruneDuplicates(LLBPn<1>,GridDensity+0.05);
275
LLBP[0][1][8]=List.RemoveItemAtIndex(LLBP[0][1][8],18);
276
LLBN=NurbsCurve.ByControlPoints(LLBP<1>,3,1);
277
​
278
//Lower Level Extrusions
279
LLBN=List.Transpose(LLBN);
280
LLBN=List.Transpose(LLBN<1>);
281
LLS=Solid.ByLoft(LLBN);
282
LLS=RemoveIfNot(Flatten(LLS),"Solid");
283
​
284
//Upper Level Boundary Curves
285
ULBP=Point.PruneDuplicates(ULBPn<1>,GridDensity+0.05);
286
ULBN=NurbsCurve.ByControlPoints(ULBP<1>,3,1);
287
​
288
//Upper Level Extrusions
289
ULBN=List.Transpose(ULBN);
290
ULBN=List.Transpose(ULBN<1>);
291
ULS=Solid.ByLoft(ULBN);
292
ULS=RemoveIfNot(Flatten(ULS),"Solid");
293
​
294
//InteriorBlocks=Solid.UnionAll(Flatten({LLS,ULS}));
295
InteriorBlocks=Flatten({LLS,ULS});
296
InteriorBlocks1=List.RemoveItemAtIndex(InteriorBlocks,{40,23,24});
297
ParkSightLines1=ParkSightLines[0].Translate(Vector.ByCoordinates(0,0,-1),0.1);
298
BuildingSkinMass=BuildingMass.Difference(ParkSightLines1);
299
BuildingSkinPunctured=BuildingMassEnt.Difference(InteriorBlocks1[0].UnionAll(InteriorBlocks1));
300
​
301
//Bridge
302
BrMsPts={Point.ByCoordinates(-471.821220,135.860936,2.1),Point.ByCoordinates(-470.797753,120.865169,2.1),Point.ByCoordinates(-533.930443,117.272251,2.1),Point.ByCoordinates(-544.177164,131.746015,2.1)};
303
BrMsBou=PolyCurve.ByPoints(BrMsPts);
304
BrMsSol1=BrMsBou.ExtrudeAsSolid(Vector.ByCoordinates(0,0,1),10);
305
BrMsSol=BrMsSol1.Difference(RampCuttingMass);
306
BrFlInt=BrMsSol.Intersect(RampCuttingMass);
307
BrFlInt=PolyCurve.ByJoinedCurves(BrFlInt);
308
BrFlInt=BrFlInt.Offset(0.5);
309
BrFlSur=Surface.ByPatch(BrFlInt);
310
BrFlSol1=BrFlSur.Thicken(1,false);
311
BrFlSol2=BrFlSur.Thicken(-5.5,false);
312
BrFlSol=BrFlSol1.Union(BrFlSol2);
313
BrFlSol=BrFlSol.Difference(ParkSightLines[0]);
314
BrFlSol=BrFlSol.Difference(RampCuttingMass);
315
BuildingSkinPunctured=BuildingSkinPunctured.Difference(BrFlSol);
316
​
317
//Volumetric Mass Bottom Surfaces
318
VMassSurfaces=PolySurface.BySolid(VolumetricMass);
319
VMassSurfaces=VMassSurfaces.Surfaces();
320
VMassBottomSurfaces=Flatten({VMassSurfaces[26],VMassSurfaces[17]});
321
VMassBottomSurface=PolySurface.ByJoinedSurfaces(VMassBottomSurfaces);
322
​
323
//Interior Blocks Floor Area and Average Height
324
IntBlksBottomSurface=Flatten(InteriorBlocks.Intersect(VMassBottomSurface));
325
IntBlksBottomFlrArea=IntBlksBottomSurface.Area;
326
IntBlksBottomVol=InteriorBlocks.Volume;
327
IntBlksAvHeight=IntBlksBottomVol/IntBlksBottomFlrArea;
328
​
329
//Interior Blocks Surfaces
330
IntBlkSurfaces1=PolySurface.BySolid(InteriorBlocks);
331
IntBlkSurfaces1=IntBlkSurfaces1.Surfaces();
332
IntBlkSurfaces=List.Transpose(IntBlkSurfaces1);
333
IntBlkFlSurf=IntBlkSurfaces[0];
334
IntBlkRfSurf=IntBlkSurfaces[1];
335
IntBlkWlSurf=IntBlkSurfaces[2];
336
​
337
//Center of Plane Rotation
338
IntBlkBotCen=IntBlkFlSurf.PointAtParameter(0.5,0.5);
339
IntBlkU=(IntBlkFlSurf.PointAtParameter(0,0)).DistanceTo(IntBlkFlSurf.PointAtParameter(1,0));
340
IntBlkV=(IntBlkFlSurf.PointAtParameter(0,0)).DistanceTo(IntBlkFlSurf.PointAtParameter(0,1));
341
IntBlkCenShift=IntBlkU/2;
342
IntBlkBotCen=IntBlkBotCen.Translate(Vector.ByCoordinates(0,0,-1),IntBlkCenShift);
343
IntBlkCutPlane=Plane.ByOriginNormal(IntBlkBotCen,Vector.ByCoordinates(0,0,1));
344
​
345
DivAngle=Math.Round(IntBlkU/1.5);
346
RotAngle=0..180..#DivAngle;
347
​
348
def CutPlanes(Pl,ang:var[])
349
{
350
p=Pl<2>.Rotate(Pl.Origin<2>,Pl.YAxis<2>,ang<1>);
351
return=p;
352
}
353
IntBlkCutPlanes=CutPlanes(IntBlkCutPlane<1>,RotAngle<1>);
354
IntBlkCutPlanes=Flatten(IntBlkCutPlanes<1>);
355
​
356
//Center of Plane Rotation
357
IntBlkBotCen=IntBlkFlSurf.PointAtParameter(0.5,0.5);
358
IntBlkU=(IntBlkFlSurf.PointAtParameter(0,0)).DistanceTo(IntBlkFlSurf.PointAtParameter(1,0));
359
IntBlkV=(IntBlkFlSurf.PointAtParameter(0,0)).DistanceTo(IntBlkFlSurf.PointAtParameter(0,1));
360
IntBlkCenShift=IntBlkU/2;
361
IntBlkBotCen=IntBlkBotCen.Translate(Vector.ByCoordinates(0,0,-1),IntBlkCenShift);
362
IntBlkCutPlane=Plane.ByOriginNormal(IntBlkBotCen,Vector.ByCoordinates(0,0,1));
363
​
364
DivAngle=Math.Round(IntBlkU/1.5);
365
RotAngle=0..180..#DivAngle;
366
​
367
def CutPlanes(Pl,ang:var[])
368
{
369
p=Pl<2>.Rotate(Pl.Origin<2>,Pl.YAxis<2>,ang<1>);
370
return=p;
371
}
372
IntBlkCutPlanes=CutPlanes(IntBlkCutPlane<1>,RotAngle<1>);
373
IntBlkCutPlanes=Flatten(IntBlkCutPlanes<1>);
374
​
375
​
376
//Function - Create Interior Block Components
377
def IntBlComponents(IntBlks,IntsPlns:var[])
378
{
379
IntBlkDivs=Flatten(IntBlks<1>.Intersect(IntsPlns<2>));
380
​
381
//Filter out Small Surfaces
382
IntBlkDivsAr=IntBlkDivs.Area;
383
IntBlkDivsPr=IntBlkDivs.Perimeter;
384
IntBlkPerArRat=IntBlkDivsPr/IntBlkDivsAr;
385
​
386
IntBlkDivFil=IntBlkPerArRat>3?true:false;
387
IntBlkDivf=List.FilterByBoolMask(IntBlkDivs<0>,IntBlkDivFil<0>)["out"];
388
IntBlkFrmCl1=IntBlkDivf.PerimeterCurves();
389
IntBlkFrmCl=PolyCurve.ByJoinedCurves(IntBlkFrmCl1);
390
​
391
//Interior Blocks Frame
392
IntBlkSurfaces0=PolySurface.BySolid(IntBlks);
393
IntBlkSurfaces1=IntBlkSurfaces0.Surfaces();
394
IntBlkSurfaces=List.Transpose(IntBlkSurfaces1);
395
IntBlkFlSurf=IntBlkSurfaces[0];
396
IntBlkRfSurf=IntBlkSurfaces[1];
397
IntBlkWlSurf=IntBlkSurfaces[2];
398
IntBlkBotCen=IntBlkFlSurf.PointAtParameter(0.5,0.5);
399
IntBlkV=(IntBlkFlSurf.PointAtParameter(0,0)).DistanceTo(IntBlkFlSurf.PointAtParameter(0,1));
400
​
401
//GluLam Span to Depth ratio is 21;
402
IntBlkFrmDep=((IntBlkV/21)/2)<0.6?0.6:((IntBlkV/21)/3);
403
IntBlkFrmThk=IntBlkFrmDep<=0.6?0.25:0.45;
404
IntBlkFrmOuterEdges=IntBlkFrmCl.Offset(IntBlkFrmDep,0);
405
IntBlkFrmInnerEdges=IntBlkFrmCl.Offset(-1*IntBlkFrmDep,0);
406
IntBlkFrmOuterPatch0=Surface.ByPatch(IntBlkFrmOuterEdges);
407
IntBlkFrmOuterPatchFil=IntBlkFrmOuterPatch0==Surface?false:true;
408
IntBlkFrmOuterPatch=RemoveIfNot(IntBlkFrmOuterPatch0,"Surface");
409
IntBlkFrmOuterSol=IntBlkFrmOuterPatch.Thicken(IntBlkFrmThk,true);
410
IntBlkFrmInnerEdges=List.FilterByBoolMask(IntBlkFrmInnerEdges,IntBlkFrmOuterPatchFil)["in"];
411
IntBlkFrmInnerPatch=Surface.ByPatch(IntBlkFrmInnerEdges);
412
IntBlkFrmInnerSol=IntBlkFrmInnerPatch.Thicken(IntBlkFrmThk,true);
413
IntBlkFrmSol1=IntBlkFrmOuterSol.Difference(IntBlkFrmInnerSol);
414
IntBlkFrmSol2=IntBlkFrmInnerSol.Difference(IntBlkFrmOuterSol);
415
IntBlkFrmSol3=IntBlkFrmSol1.Union(IntBlkFrmSol2);
416
IntBlkFrmSol4=RemoveIfNot(IntBlkFrmSol3,"Solid");
417
IntBlkFrmSol=List.Count(IntBlkFrmSol4)>0?IntBlkFrmSol4[0].UnionAll(IntBlkFrmSol4):IntBlkFrmSol4;
418
​
419
//Interior Blocks Walls;
420
IntBlkWlThk=0.1;
421
IntBlkWlSol1=IntBlkWlSurf.Thicken(IntBlkWlThk,1);
422
IntBlkWlSol=IntBlkWlSol1.Difference(IntBlkFrmSol);
423
​
424
//Interior Block Floors
425
IntBlkFlOfp=1*((IntBlkFrmDep)+0.2);
426
IntBlkFlOfn=-1*((IntBlkFrmDep)+0.2);
427
//IntBlkFlTk=((IntBlkFrmDep)+0.5);
428
IntBlkFlTk=0.15;
429
FlBoun1=IntBlkFlSurf.PerimeterCurves();
430
FlBoun1per=FlBoun1.Length;
431
FlBounP=FlBoun1.Offset(IntBlkFlOfp);
432
FlBounPper=FlBounP.Length;
433
FlBounN=FlBoun1.Offset(IntBlkFlOfn);
434
FlBounNper=FlBounN.Length;
435
FlBoun2=FlBounPper>FlBoun1per?FlBounP:FlBounN;
436
FlBoun3=FlBoun2.DivideEqually(10);
437
FlBoun=PolyCurve.ByJoinedCurves(FlBoun3);
438
IntBlkFlSurfa=Surface.ByPatch(FlBoun);
439
IntBlkFlSol=IntBlkFlSurfa.Thicken(IntBlkFlTk,true);
440
​
441
//Interior Block Roofs
442
SkLtWd=0.5;
443
IntBlkRfOfp=1*((IntBlkWlThk/2)+SkLtWd);
444
IntBlkRfOfn=-1*((IntBlkWlThk/2)+SkLtWd);
445
IntBlkRfTk=((IntBlkFrmDep*2)+0.3);
446
RfBoun1=IntBlkRfSurf.PerimeterCurves();
447
RfBoun1per=RfBoun1.Length;
448
RfBounP=RfBoun1.Offset(IntBlkRfOfp);
449
RfBounPper=RfBounP.Length;
450
RfBounN=RfBoun1.Offset(IntBlkRfOfn);
451
RfBounNper=RfBounN.Length;
452
RfBoun2=RfBounPper<RfBoun1per?RfBounP:RfBounN;
453
//RfBoun3=RfBoun2.DivideEqually(10);
454
//RfBoun=PolyCurve.ByJoinedCurves(RfBoun3);
455
IntBlkRfSurfa=Surface.ByPatch(RfBoun2);
456
IntBlkRfSol=IntBlkRfSurfa.Thicken(IntBlkRfTk,true);
457
​
458
//Interior Block Sky Lights
459
IntBlkSkOf=0.15;
460
IntBlkSkOfp=1*(IntBlkSkOf);
461
IntBlkSkOfn=-1*(IntBlkSkOf);
462
IntBlkSkTk=0.15;
463
SkBounP=RfBoun1.Offset(IntBlkSkOfp);
464
SkBounPper=SkBounP.Length;
465
SkBounN=RfBoun1.Offset(IntBlkSkOfn);
466
SkBounNper=SkBounN.Length;
467
SkBounN=RfBoun1.Offset(IntBlkSkOfn);
468
SkBounNper=SkBounN.Length;
469
SkBoun=SkBounPper>RfBoun1per?SkBounP:SkBounN;
470
IntBlkSkSurfa=Surface.ByPatch(SkBoun);
471
IntBlkSkSol1=IntBlkSkSurfa.Thicken(IntBlkSkTk,true);
472
IntBlkSkSol2=IntBlkSkSol1.Difference(IntBlkRfSol);
473
IntBlkSkSol=IntBlkSkSol2.Difference(IntBlkFrmSol);
474
​
475
return={IntBlkFrmSol,IntBlkWlSol,IntBlkFlSol,IntBlkRfSol,IntBlkSkSol};
476
​
477
}
478
​
479
IntBlkComponents=IntBlComponents(InteriorBlocks,IntBlkCutPlanes);
480
IntBlkComponentsT=List.Transpose(IntBlkComponents);
481
​
482
//Interior Block Frames
483
IntBlkFrs=IntBlkComponentsT[0];
484
IntBlkFrs=RemoveIfNot(IntBlkFrs,"Solid");
485
IntBlkFrs=IntBlkFrs[0].UnionAll(IntBlkFrs);
486
​
487
//Interior Block Walls
488
IntBlkWls=IntBlkComponentsT[1];
489
IntBlkWls=RemoveIfNot(IntBlkWls,"Solid");
490
IntBlkWls=IntBlkWls[0].UnionAll(IntBlkWls);
491
​
492
//Interior Block Floors
493
IntBlkFls=IntBlkComponentsT[2];
494
IntBlkFls=Flatten(IntBlkFls);
495
IntBlkFls=RemoveIfNot(IntBlkFls,"Solid");
496
IntBlkFls=IntBlkFls[0].UnionAll(IntBlkFls);
497
​
498
//Interior Block Roofs
499
IntBlkRfs=IntBlkComponentsT[3];
500
IntBlkRfs=Flatten(IntBlkRfs);
501
IntBlkRfs=RemoveIfNot(IntBlkRfs,"Solid");
502
IntBlkRfs=IntBlkRfs[0].UnionAll(IntBlkRfs);
503
​
504
//Interior Block SkyLights
505
IntBlkSks=IntBlkComponentsT[4];
506
IntBlkSks=Flatten(IntBlkSks);
507
IntBlkSks=RemoveIfNot(IntBlkSks,"Solid");
508
IntBlkSks=IntBlkSks[0].UnionAll(IntBlkSks);
509
​
510
//Building Mass Punctured
511
BuildingSkinPunctured=BuildingSkinPunctured.Difference(IntBlkFrs);
512
​
513
//Interior Block Roof Covering;
514
IntBlkRfs1=IntBlkComponentsT[3];
515
IntBlkRfs1=Flatten(IntBlkRfs1);
516
IntBlkRfs1=RemoveIfNot(IntBlkRfs1,"Solid");
517
​
518
def Roofing(RoofSol)
519
{
520
RThkn=0.05;
521
RoofPol=PolySurface.BySolid(RoofSol);
522
RoofSur=RoofPol.Surfaces();
523
RoofTop=RoofSur[0];
524
RoofTopCen=RoofSur[0].PointAtParameter(0.5,0.5);
525
RoofTopSc=RoofSur[0].PointAtParameter(0.5,1);
526
RoofTopSc1=RoofSur[0].PointAtParameter(0.5,1.025);
527
RTConcen1=RoofTop.Scale(RoofTopCen,RoofTopSc,RoofTopSc1);
528
RTConcen1=RTConcen1.Thicken(RThkn*1);
529
RoofTopSc2=RoofSur[0].PointAtParameter(0.5,0.9);
530
RTConcen2=RoofTop.Scale(RoofTopCen,RoofTopSc,RoofTopSc2);
531
RTConcen2=RTConcen2.Thicken(RThkn*2);
532
RoofTopSc3=RoofSur[0].PointAtParameter(0.5,0.8);
533
RTConcen3=RoofTop.Scale(RoofTopCen,RoofTopSc,RoofTopSc3);
534
RTConcen3=RTConcen3.Thicken(RThkn*3);
535
RoofTopSc4=RoofSur[0].PointAtParameter(0.5,0.7);
536
RTConcen4=RoofTop.Scale(RoofTopCen,RoofTopSc,RoofTopSc4);
537
RTConcen4=RTConcen4.Thicken(RThkn*4);
538
RoofTopSc5=RoofSur[0].PointAtParameter(0.5,0.6);
539
RTConcen5=RoofTop.Scale(RoofTopCen,RoofTopSc,RoofTopSc5);
540
RTConcen5=RTConcen5.Thicken(RThkn*5);
541
RTConcen={RTConcen1,RTConcen2,RTConcen3,RTConcen4,RTConcen5};
542
RTpRfng=RTConcen[0].UnionAll(RTConcen);
543
return=RTpRfng;
544
}
545
IntBlkRfCvs=Roofing(IntBlkRfs1);
Copied!
Copy link