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 |
​ | ​ |
//Vantage PointPeak=Point.ByCoordinates(-552,-77,27.5);​//A list of the xyz coordinates of the points along the site boundaryportX = {-556,-530,-528,-516,-518,-481,-480,-462,-384,-385,-380,-380,-385,-386,-358,-358,-277,-273,-257,-246,-6};portY = {544,546,517,518,546,548,520,500,505,520,520,532,532,549,550,553,557,458,447,464,302};portZ = -10;portVer = Point.ByCoordinates(portX,portY,portZ);portEdg = PolyCurve.ByPoints(portVer,false);
0:0 | 1:0 |
​ | 1:2 |
GridDensity=2;​//Far Port ProfilePortVertices=[Imperative]{//Elevation, considering a level sitee2=-10;//A list of the xyz coordinates of the points along the site boundaryCoordinates={-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};//Creating points from the list of xyz coordinatesPoints={};pi=0;pc=0;while (pc<List.Count(Coordinates)){Points[pi]=Point.ByCoordinates(Coordinates[pc],Coordinates[pc+1],Coordinates[pc+2]);pi=pi+1;pc=pc+3;}return=Points;}//Connecting points with linesPortEdge=PolyCurve.ByPoints(PortVertices,false);​VolumetricMass=[Imperative]{//Elevation, considering a level sitee1=2.1;//A list of the xyz coordinates of the points along the site boundaryCoordinates={-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};//Creating points from the list of xyz coordinatesPoints={};pi=0;pc=0;while (pc<List.Count(Coordinates)){Points[pi]=Point.ByCoordinates(Coordinates[pc],Coordinates[pc+1],Coordinates[pc+2]);pi=pi+1;pc=pc+3;}​//Connecting points with linesSiteBoundary=PolyCurve.ByPoints(Points,true);​//West Deduction Profile//A list of the xyz coordinates of the points along the site boundaryWestDeductionCoordinates={-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};//Creating points from the list of xyz coordinatesWestDeductionPoints={};pi=0;pc=0;while (pc<List.Count(WestDeductionCoordinates)){WestDeductionPoints[pi]=Point.ByCoordinates(WestDeductionCoordinates[pc],WestDeductionCoordinates[pc+1],WestDeductionCoordinates[pc+2]);pi=pi+1;pc=pc+3;}//Connecting points with linesWestDeductionLines=PolyCurve.ByPoints(WestDeductionPoints,true);WestDeduction=WestDeductionLines.ExtrudeAsSolid(Vector.ByCoordinates(0,0,1),5.5);​//East Deduction Profile//A list of the xyz coordinates of the points along the East boundaryEastDeductionCoordinates={-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};//Creating points from the list of xyz coordinatesEastDeductionPoints={};qi=0;qc=0;while (qc<List.Count(EastDeductionCoordinates)){EastDeductionPoints[qi]=Point.ByCoordinates(EastDeductionCoordinates[qc],EastDeductionCoordinates[qc+1],EastDeductionCoordinates[qc+2]);qi=qi+1;qc=qc+3;}//Connecting points with linesEastDeductionLines=PolyCurve.ByPoints(EastDeductionPoints,true);EastDeduction=EastDeductionLines.ExtrudeAsSolid(Vector.ByCoordinates(0,0,1),25);​//Volumetric MassSiteMass=SiteBoundary.ExtrudeAsSolid(-22);Deductions={WestDeduction,EastDeduction};Deduction=Deductions[0].UnionAll(Deductions);SiteMass=SiteMass.Difference(Deduction);return=SiteMass;}​//Sight Lines from Park to Far PortParkSightLines=[Imperative]{Peak=Point.ByCoordinates(-552,-77,27.5);​//Elevation, considering a level sitee2=-15;//A list of the xyz coordinates of the points along the site boundaryCoordinates={-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};//Creating points from the list of xyz coordinatesPoints={};pi=0;pc=0;while (pc<List.Count(Coordinates)){Points[pi]=Point.ByCoordinates(Coordinates[pc],Coordinates[pc+1],Coordinates[pc+2]);pi=pi+1;pc=pc+3;}​//Angles Connecting Peak to Port EdgeAngles={};ai=0;while (ai<List.Count(Points)){Angles[ai]=Math.Atan((Points[ai].X-Peak.X)/(Points[ai].Y-Peak.Y));ai=ai+1;}​//Lines Connecting Peak to Port EdgeEPoints={};li=0;lc=1;EPoints[0]=Points[0];while (li<(List.Count(Points)-1)){if (Angles[li+1]>(Angles[li]+0.5)){EPoints[lc]=Points[li+1];li=li+1;lc=lc+1;}else{li=li+1;}}//PolycurvesPLines={};PExt={};di=0;while (di<(List.Count(EPoints)-1)){PPoints={Peak,EPoints[di],EPoints[di+1]};PLines[di]=PolyCurve.ByPoints(PPoints,true);PExt[di]=PLines[di].ExtrudeAsSolid(Vector.ByCoordinates(0,0,1),25);di=di+1;}CutMass=PExt[0].UnionAll(PExt);CutSurface=Surface.ByPatch(PLines);CutSurface=PolySurface.ByJoinedSurfaces(CutSurface);return={CutMass,CutSurface};}​//BernhardinkatuBernhardinkatuSlope=Vector.ByTwoPoints(Point.ByCoordinates(-609,113,12.8),Point.ByCoordinates(-486,120,(3.5+5.5)));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)};BernhardinkatuLine=PolyCurve.ByPoints(BernhardinkatuPoints,true);BernhardinkatuMass=BernhardinkatuLine.ExtrudeAsSolid(BernhardinkatuSlope,250);​RampSlope=Vector.ByTwoPoints(Point.ByCoordinates(-609,113,18.25),Point.ByCoordinates(-486,120,10));RampCutPoints={Point.ByCoordinates(-610,128,17.25),Point.ByCoordinates(-609,113,17.25),Point.ByCoordinates(-609,113,25),Point.ByCoordinates(-610,128,25)};RampLine=PolyCurve.ByPoints(RampCutPoints,true);RampCuttingMass=RampLine.ExtrudeAsSolid(RampSlope,250);​BuildingMass1=VolumetricMass.Difference(ParkSightLines[0]);BuildingMass=BuildingMass1.Difference(BernhardinkatuMass);BuildingMass=BuildingMass.Difference(RampCuttingMass);​//Entry/Exit TriangleEnTriPnts={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)};EntTriBou=PolyCurve.ByPoints(EnTriPnts,true);EntTriSur=Surface.ByPatch(EntTriBou);EntTriSol1=EntTriSur.Thicken(-15,false);EntTriSol=EntTriSol1.Difference(ParkSightLines[0]);BuildingMassEnt=BuildingMass.Union(EntTriSol);​//Extracting Top SurfaceBuildingPolySurface=PolySurface.BySolid(BuildingMass);BuildingSurfaces=BuildingPolySurface.Surfaces();RampTopSurf=Flatten(BuildingSurfaces<1>.Intersect(RampCuttingMass));RampTopSurf=RemoveIfNot(RampTopSurf,"Surface");RampTopSurf=RampTopSurf[0];//RampTopSurf=RampTopSurf.FlipNormalDirection();TopSurf=BuildingSurfaces<1>.Intersect(ParkSightLines[0]);TopSurf=Flatten(TopSurf);TopSurf=RemoveIfNot(TopSurf,"Surface");TopSurface=Flatten({TopSurf,RampTopSurf});​def remPnt(Li:var[]){LiF=RemoveIfNot(Li,"Line");return=LiF;}​//Function: Creating a Uniform Griddef SurfaceGrid(surf,UnitDivision,Mass){DivisionU=UnitDivision/(surf.PointAtParameter(0,0).DistanceTo(surf.PointAtParameter(1,0)));DivisionV=UnitDivision/(surf.PointAtParameter(0,0).DistanceTo(surf.PointAtParameter(0,1)));SurfPoints=Flatten(surf.PointAtParameter((0..1..~DivisionU)<1>,(0..1..~DivisionV)<2>));SurfNormals=Flatten(surf.NormalAtParameter((0..1..~DivisionU)<1>,(0..1..~DivisionV)<2>));SurfLines=Line.ByStartPointDirectionLength(SurfPoints,SurfNormals,20);SurfInPoints=Flatten(SurfLines.DoesIntersect(surf));SurfInLines=List.FilterByBoolMask(SurfLines,SurfInPoints)["in"];​//BuildingMass IntersectsIntersects=Flatten(Mass.Intersect(SurfInLines));Intersects=remPnt(Intersects);​//Filter by Base LevelBaseLevelFilter1=Intersects.EndPoint.Z==2.1&&Intersects.EndPoint.Z<7.61?true:false;BaseLevel1=Flatten(List.FilterByBoolMask(Intersects,BaseLevelFilter1)["in"]);BaseLevelFilter2=Intersects.EndPoint.Z==7.6?true:false;BaseLevel2=Flatten(List.FilterByBoolMask(Intersects,BaseLevelFilter2)["in"]);​//Returns BasePoint(2.1), RoofPoint(2.1),return={BaseLevel1.EndPoint,BaseLevel1.StartPoint,BaseLevel2.EndPoint,BaseLevel2.StartPoint};}​//Top and Bottom Grid (1-Base Lower Points,2-Top for Lower, 3-Base Upper, 4-Top for Upper​TopBottomGrid=SurfaceGrid(TopSurface,GridDensity,BuildingMass);​//Separate the Grids based on LevelsTopBottomGrid=List.Transpose(TopBottomGrid);//LowerLevelFloorPointsLLFP=TopBottomGrid[0];//LowerLevelRoofPointsLLRP=TopBottomGrid[1];//UpperLevelFloorPointsULFP=TopBottomGrid[2];//UpperLevelRoofPointsULRP=TopBottomGrid[3];​//Height Range1h1={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};//Height Range2h2={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};​def HeightGroup(RoofPoints:var[],FloorPoints:var[],Height1,Height2){R0=(RoofPoints.Z)>(Height1+2.1)&&(RoofPoints.Z)<(Height2+2.1)?true:false;R0FilterIn=List.FilterByBoolMask(RoofPoints<1>,R0<2>)["in"];F0FilterIn=List.FilterByBoolMask(FloorPoints<1>,R0<2>)["in"];return={R0FilterIn,F0FilterIn};}​//Lower Level Points Grouped by HeightLLPH=List.Transpose(HeightGroup(LLRP<1>,LLFP<1>,h1<2>,h2<2>)<2>);​//Upper Level Points Grouped by HeightULPH=List.Transpose(HeightGroup(ULRP<1>,ULFP<1>,h1<2>,h2<2>)<2>);​//Function - Boundary Points in Clusterdef BoundaryPoints(PointsGrid:var[],GroupKey){//Group Points with same XGridX=GroupByKey(PointsGrid<1>,GroupKey)<2>;GridMin=List.FirstItem(GridX<1>);GridMax=List.LastItem(GridX<1>);​SingleItemFilter=GridMin==GridMax?true:false;PeripheryMinX=List.FilterByBoolMask(GridMin<1>,SingleItemFilter<2>)["in"];​PeripheryMaxX=List.Reverse(List.FilterByBoolMask(GridMax<1>,SingleItemFilter<2>)["in"]);​PeripheryPoint=Flatten({PeripheryMinX,PeripheryMaxX});return=PeripheryPoint;}​//Boundary PointsLLBPn=List.Transpose(BoundaryPoints(LLPH,GroupKeyX));ULBPn=List.Transpose(BoundaryPoints(ULPH,GroupKeyX));​//Lower Level Boundary CurvesLLBP=Point.PruneDuplicates(LLBPn<1>,GridDensity+0.05);LLBP[0][1][8]=List.RemoveItemAtIndex(LLBP[0][1][8],18);LLBN=NurbsCurve.ByControlPoints(LLBP<1>,3,1);​//Lower Level ExtrusionsLLBN=List.Transpose(LLBN);LLBN=List.Transpose(LLBN<1>);LLS=Solid.ByLoft(LLBN);LLS=RemoveIfNot(Flatten(LLS),"Solid");​//Upper Level Boundary CurvesULBP=Point.PruneDuplicates(ULBPn<1>,GridDensity+0.05);ULBN=NurbsCurve.ByControlPoints(ULBP<1>,3,1);​//Upper Level ExtrusionsULBN=List.Transpose(ULBN);ULBN=List.Transpose(ULBN<1>);ULS=Solid.ByLoft(ULBN);ULS=RemoveIfNot(Flatten(ULS),"Solid");​//InteriorBlocks=Solid.UnionAll(Flatten({LLS,ULS}));InteriorBlocks=Flatten({LLS,ULS});InteriorBlocks1=List.RemoveItemAtIndex(InteriorBlocks,{40,23,24});ParkSightLines1=ParkSightLines[0].Translate(Vector.ByCoordinates(0,0,-1),0.1);BuildingSkinMass=BuildingMass.Difference(ParkSightLines1);BuildingSkinPunctured=BuildingMassEnt.Difference(InteriorBlocks1[0].UnionAll(InteriorBlocks1));​//BridgeBrMsPts={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)};BrMsBou=PolyCurve.ByPoints(BrMsPts);BrMsSol1=BrMsBou.ExtrudeAsSolid(Vector.ByCoordinates(0,0,1),10);BrMsSol=BrMsSol1.Difference(RampCuttingMass);BrFlInt=BrMsSol.Intersect(RampCuttingMass);BrFlInt=PolyCurve.ByJoinedCurves(BrFlInt);BrFlInt=BrFlInt.Offset(0.5);BrFlSur=Surface.ByPatch(BrFlInt);BrFlSol1=BrFlSur.Thicken(1,false);BrFlSol2=BrFlSur.Thicken(-5.5,false);BrFlSol=BrFlSol1.Union(BrFlSol2);BrFlSol=BrFlSol.Difference(ParkSightLines[0]);BrFlSol=BrFlSol.Difference(RampCuttingMass);BuildingSkinPunctured=BuildingSkinPunctured.Difference(BrFlSol);​//Volumetric Mass Bottom SurfacesVMassSurfaces=PolySurface.BySolid(VolumetricMass);VMassSurfaces=VMassSurfaces.Surfaces();VMassBottomSurfaces=Flatten({VMassSurfaces[26],VMassSurfaces[17]});VMassBottomSurface=PolySurface.ByJoinedSurfaces(VMassBottomSurfaces);​//Interior Blocks Floor Area and Average HeightIntBlksBottomSurface=Flatten(InteriorBlocks.Intersect(VMassBottomSurface));IntBlksBottomFlrArea=IntBlksBottomSurface.Area;IntBlksBottomVol=InteriorBlocks.Volume;IntBlksAvHeight=IntBlksBottomVol/IntBlksBottomFlrArea;​//Interior Blocks SurfacesIntBlkSurfaces1=PolySurface.BySolid(InteriorBlocks);IntBlkSurfaces1=IntBlkSurfaces1.Surfaces();IntBlkSurfaces=List.Transpose(IntBlkSurfaces1);IntBlkFlSurf=IntBlkSurfaces[0];IntBlkRfSurf=IntBlkSurfaces[1];IntBlkWlSurf=IntBlkSurfaces[2];​//Center of Plane RotationIntBlkBotCen=IntBlkFlSurf.PointAtParameter(0.5,0.5);IntBlkU=(IntBlkFlSurf.PointAtParameter(0,0)).DistanceTo(IntBlkFlSurf.PointAtParameter(1,0));IntBlkV=(IntBlkFlSurf.PointAtParameter(0,0)).DistanceTo(IntBlkFlSurf.PointAtParameter(0,1));IntBlkCenShift=IntBlkU/2;IntBlkBotCen=IntBlkBotCen.Translate(Vector.ByCoordinates(0,0,-1),IntBlkCenShift);IntBlkCutPlane=Plane.ByOriginNormal(IntBlkBotCen,Vector.ByCoordinates(0,0,1));​DivAngle=Math.Round(IntBlkU/1.5);RotAngle=0..180..#DivAngle;​def CutPlanes(Pl,ang:var[]){p=Pl<2>.Rotate(Pl.Origin<2>,Pl.YAxis<2>,ang<1>);return=p;}IntBlkCutPlanes=CutPlanes(IntBlkCutPlane<1>,RotAngle<1>);IntBlkCutPlanes=Flatten(IntBlkCutPlanes<1>);​//Center of Plane RotationIntBlkBotCen=IntBlkFlSurf.PointAtParameter(0.5,0.5);IntBlkU=(IntBlkFlSurf.PointAtParameter(0,0)).DistanceTo(IntBlkFlSurf.PointAtParameter(1,0));IntBlkV=(IntBlkFlSurf.PointAtParameter(0,0)).DistanceTo(IntBlkFlSurf.PointAtParameter(0,1));IntBlkCenShift=IntBlkU/2;IntBlkBotCen=IntBlkBotCen.Translate(Vector.ByCoordinates(0,0,-1),IntBlkCenShift);IntBlkCutPlane=Plane.ByOriginNormal(IntBlkBotCen,Vector.ByCoordinates(0,0,1));​DivAngle=Math.Round(IntBlkU/1.5);RotAngle=0..180..#DivAngle;​def CutPlanes(Pl,ang:var[]){p=Pl<2>.Rotate(Pl.Origin<2>,Pl.YAxis<2>,ang<1>);return=p;}IntBlkCutPlanes=CutPlanes(IntBlkCutPlane<1>,RotAngle<1>);IntBlkCutPlanes=Flatten(IntBlkCutPlanes<1>);​​//Function - Create Interior Block Componentsdef IntBlComponents(IntBlks,IntsPlns:var[]){IntBlkDivs=Flatten(IntBlks<1>.Intersect(IntsPlns<2>));​//Filter out Small SurfacesIntBlkDivsAr=IntBlkDivs.Area;IntBlkDivsPr=IntBlkDivs.Perimeter;IntBlkPerArRat=IntBlkDivsPr/IntBlkDivsAr;​IntBlkDivFil=IntBlkPerArRat>3?true:false;IntBlkDivf=List.FilterByBoolMask(IntBlkDivs<0>,IntBlkDivFil<0>)["out"];IntBlkFrmCl1=IntBlkDivf.PerimeterCurves();IntBlkFrmCl=PolyCurve.ByJoinedCurves(IntBlkFrmCl1);​//Interior Blocks FrameIntBlkSurfaces0=PolySurface.BySolid(IntBlks);IntBlkSurfaces1=IntBlkSurfaces0.Surfaces();IntBlkSurfaces=List.Transpose(IntBlkSurfaces1);IntBlkFlSurf=IntBlkSurfaces[0];IntBlkRfSurf=IntBlkSurfaces[1];IntBlkWlSurf=IntBlkSurfaces[2];IntBlkBotCen=IntBlkFlSurf.PointAtParameter(0.5,0.5);IntBlkV=(IntBlkFlSurf.PointAtParameter(0,0)).DistanceTo(IntBlkFlSurf.PointAtParameter(0,1));​//GluLam Span to Depth ratio is 21;IntBlkFrmDep=((IntBlkV/21)/2)<0.6?0.6:((IntBlkV/21)/3);IntBlkFrmThk=IntBlkFrmDep<=0.6?0.25:0.45;IntBlkFrmOuterEdges=IntBlkFrmCl.Offset(IntBlkFrmDep,0);IntBlkFrmInnerEdges=IntBlkFrmCl.Offset(-1*IntBlkFrmDep,0);IntBlkFrmOuterPatch0=Surface.ByPatch(IntBlkFrmOuterEdges);IntBlkFrmOuterPatchFil=IntBlkFrmOuterPatch0==Surface?false:true;IntBlkFrmOuterPatch=RemoveIfNot(IntBlkFrmOuterPatch0,"Surface");IntBlkFrmOuterSol=IntBlkFrmOuterPatch.Thicken(IntBlkFrmThk,true);IntBlkFrmInnerEdges=List.FilterByBoolMask(IntBlkFrmInnerEdges,IntBlkFrmOuterPatchFil)["in"];IntBlkFrmInnerPatch=Surface.ByPatch(IntBlkFrmInnerEdges);IntBlkFrmInnerSol=IntBlkFrmInnerPatch.Thicken(IntBlkFrmThk,true);IntBlkFrmSol1=IntBlkFrmOuterSol.Difference(IntBlkFrmInnerSol);IntBlkFrmSol2=IntBlkFrmInnerSol.Difference(IntBlkFrmOuterSol);IntBlkFrmSol3=IntBlkFrmSol1.Union(IntBlkFrmSol2);IntBlkFrmSol4=RemoveIfNot(IntBlkFrmSol3,"Solid");IntBlkFrmSol=List.Count(IntBlkFrmSol4)>0?IntBlkFrmSol4[0].UnionAll(IntBlkFrmSol4):IntBlkFrmSol4;​//Interior Blocks Walls;IntBlkWlThk=0.1;IntBlkWlSol1=IntBlkWlSurf.Thicken(IntBlkWlThk,1);IntBlkWlSol=IntBlkWlSol1.Difference(IntBlkFrmSol);​//Interior Block FloorsIntBlkFlOfp=1*((IntBlkFrmDep)+0.2);IntBlkFlOfn=-1*((IntBlkFrmDep)+0.2);//IntBlkFlTk=((IntBlkFrmDep)+0.5);IntBlkFlTk=0.15;FlBoun1=IntBlkFlSurf.PerimeterCurves();FlBoun1per=FlBoun1.Length;FlBounP=FlBoun1.Offset(IntBlkFlOfp);FlBounPper=FlBounP.Length;FlBounN=FlBoun1.Offset(IntBlkFlOfn);FlBounNper=FlBounN.Length;FlBoun2=FlBounPper>FlBoun1per?FlBounP:FlBounN;FlBoun3=FlBoun2.DivideEqually(10);FlBoun=PolyCurve.ByJoinedCurves(FlBoun3);IntBlkFlSurfa=Surface.ByPatch(FlBoun);IntBlkFlSol=IntBlkFlSurfa.Thicken(IntBlkFlTk,true);​//Interior Block RoofsSkLtWd=0.5;IntBlkRfOfp=1*((IntBlkWlThk/2)+SkLtWd);IntBlkRfOfn=-1*((IntBlkWlThk/2)+SkLtWd);IntBlkRfTk=((IntBlkFrmDep*2)+0.3);RfBoun1=IntBlkRfSurf.PerimeterCurves();RfBoun1per=RfBoun1.Length;RfBounP=RfBoun1.Offset(IntBlkRfOfp);RfBounPper=RfBounP.Length;RfBounN=RfBoun1.Offset(IntBlkRfOfn);RfBounNper=RfBounN.Length;RfBoun2=RfBounPper<RfBoun1per?RfBounP:RfBounN;//RfBoun3=RfBoun2.DivideEqually(10);//RfBoun=PolyCurve.ByJoinedCurves(RfBoun3);IntBlkRfSurfa=Surface.ByPatch(RfBoun2);IntBlkRfSol=IntBlkRfSurfa.Thicken(IntBlkRfTk,true);​//Interior Block Sky LightsIntBlkSkOf=0.15;IntBlkSkOfp=1*(IntBlkSkOf);IntBlkSkOfn=-1*(IntBlkSkOf);IntBlkSkTk=0.15;SkBounP=RfBoun1.Offset(IntBlkSkOfp);SkBounPper=SkBounP.Length;SkBounN=RfBoun1.Offset(IntBlkSkOfn);SkBounNper=SkBounN.Length;SkBounN=RfBoun1.Offset(IntBlkSkOfn);SkBounNper=SkBounN.Length;SkBoun=SkBounPper>RfBoun1per?SkBounP:SkBounN;IntBlkSkSurfa=Surface.ByPatch(SkBoun);IntBlkSkSol1=IntBlkSkSurfa.Thicken(IntBlkSkTk,true);IntBlkSkSol2=IntBlkSkSol1.Difference(IntBlkRfSol);IntBlkSkSol=IntBlkSkSol2.Difference(IntBlkFrmSol);​return={IntBlkFrmSol,IntBlkWlSol,IntBlkFlSol,IntBlkRfSol,IntBlkSkSol};​}​IntBlkComponents=IntBlComponents(InteriorBlocks,IntBlkCutPlanes);IntBlkComponentsT=List.Transpose(IntBlkComponents);​//Interior Block FramesIntBlkFrs=IntBlkComponentsT[0];IntBlkFrs=RemoveIfNot(IntBlkFrs,"Solid");IntBlkFrs=IntBlkFrs[0].UnionAll(IntBlkFrs);​//Interior Block WallsIntBlkWls=IntBlkComponentsT[1];IntBlkWls=RemoveIfNot(IntBlkWls,"Solid");IntBlkWls=IntBlkWls[0].UnionAll(IntBlkWls);​//Interior Block FloorsIntBlkFls=IntBlkComponentsT[2];IntBlkFls=Flatten(IntBlkFls);IntBlkFls=RemoveIfNot(IntBlkFls,"Solid");IntBlkFls=IntBlkFls[0].UnionAll(IntBlkFls);​//Interior Block RoofsIntBlkRfs=IntBlkComponentsT[3];IntBlkRfs=Flatten(IntBlkRfs);IntBlkRfs=RemoveIfNot(IntBlkRfs,"Solid");IntBlkRfs=IntBlkRfs[0].UnionAll(IntBlkRfs);​//Interior Block SkyLightsIntBlkSks=IntBlkComponentsT[4];IntBlkSks=Flatten(IntBlkSks);IntBlkSks=RemoveIfNot(IntBlkSks,"Solid");IntBlkSks=IntBlkSks[0].UnionAll(IntBlkSks);​//Building Mass PuncturedBuildingSkinPunctured=BuildingSkinPunctured.Difference(IntBlkFrs);​//Interior Block Roof Covering;IntBlkRfs1=IntBlkComponentsT[3];IntBlkRfs1=Flatten(IntBlkRfs1);IntBlkRfs1=RemoveIfNot(IntBlkRfs1,"Solid");​def Roofing(RoofSol){RThkn=0.05;RoofPol=PolySurface.BySolid(RoofSol);RoofSur=RoofPol.Surfaces();RoofTop=RoofSur[0];RoofTopCen=RoofSur[0].PointAtParameter(0.5,0.5);RoofTopSc=RoofSur[0].PointAtParameter(0.5,1);RoofTopSc1=RoofSur[0].PointAtParameter(0.5,1.025);RTConcen1=RoofTop.Scale(RoofTopCen,RoofTopSc,RoofTopSc1);RTConcen1=RTConcen1.Thicken(RThkn*1);RoofTopSc2=RoofSur[0].PointAtParameter(0.5,0.9);RTConcen2=RoofTop.Scale(RoofTopCen,RoofTopSc,RoofTopSc2);RTConcen2=RTConcen2.Thicken(RThkn*2);RoofTopSc3=RoofSur[0].PointAtParameter(0.5,0.8);RTConcen3=RoofTop.Scale(RoofTopCen,RoofTopSc,RoofTopSc3);RTConcen3=RTConcen3.Thicken(RThkn*3);RoofTopSc4=RoofSur[0].PointAtParameter(0.5,0.7);RTConcen4=RoofTop.Scale(RoofTopCen,RoofTopSc,RoofTopSc4);RTConcen4=RTConcen4.Thicken(RThkn*4);RoofTopSc5=RoofSur[0].PointAtParameter(0.5,0.6);RTConcen5=RoofTop.Scale(RoofTopCen,RoofTopSc,RoofTopSc5);RTConcen5=RTConcen5.Thicken(RThkn*5);RTConcen={RTConcen1,RTConcen2,RTConcen3,RTConcen4,RTConcen5};RTpRfng=RTConcen[0].UnionAll(RTConcen);return=RTpRfng;}IntBlkRfCvs=Roofing(IntBlkRfs1);