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!
Last modified 1yr ago
Copy link