PortVertices=[Imperative]
//Elevation, considering a level site
//A list of the xyz coordinates of the points along the site boundary
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};
//Creating points from the list of xyz coordinates
while (pc<List.Count(Coordinates))
Points[pi]=Point.ByCoordinates(Coordinates[pc],Coordinates[pc+1],Coordinates[pc+2]);
//Connecting points with lines
PortEdge=PolyCurve.ByPoints(PortVertices,false);
VolumetricMass=[Imperative]
//Elevation, considering a level site
//A list of the xyz coordinates of the points along the site boundary
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};
//Creating points from the list of xyz coordinates
while (pc<List.Count(Coordinates))
Points[pi]=Point.ByCoordinates(Coordinates[pc],Coordinates[pc+1],Coordinates[pc+2]);
//Connecting points with lines
SiteBoundary=PolyCurve.ByPoints(Points,true);
//A list of the xyz coordinates of the points along the site boundary
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};
//Creating points from the list of xyz coordinates
while (pc<List.Count(WestDeductionCoordinates))
WestDeductionPoints[pi]=Point.ByCoordinates(WestDeductionCoordinates[pc],WestDeductionCoordinates[pc+1],WestDeductionCoordinates[pc+2]);
//Connecting points with lines
WestDeductionLines=PolyCurve.ByPoints(WestDeductionPoints,true);
WestDeduction=WestDeductionLines.ExtrudeAsSolid(Vector.ByCoordinates(0,0,1),5.5);
//A list of the xyz coordinates of the points along the East boundary
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};
//Creating points from the list of xyz coordinates
while (qc<List.Count(EastDeductionCoordinates))
EastDeductionPoints[qi]=Point.ByCoordinates(EastDeductionCoordinates[qc],EastDeductionCoordinates[qc+1],EastDeductionCoordinates[qc+2]);
//Connecting points with lines
EastDeductionLines=PolyCurve.ByPoints(EastDeductionPoints,true);
EastDeduction=EastDeductionLines.ExtrudeAsSolid(Vector.ByCoordinates(0,0,1),25);
SiteMass=SiteBoundary.ExtrudeAsSolid(-22);
Deductions={WestDeduction,EastDeduction};
Deduction=Deductions[0].UnionAll(Deductions);
SiteMass=SiteMass.Difference(Deduction);
//Sight Lines from Park to Far Port
ParkSightLines=[Imperative]
Peak=Point.ByCoordinates(-552,-77,27.5);
//Elevation, considering a level site
//A list of the xyz coordinates of the points along the site boundary
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};
//Creating points from the list of xyz coordinates
while (pc<List.Count(Coordinates))
Points[pi]=Point.ByCoordinates(Coordinates[pc],Coordinates[pc+1],Coordinates[pc+2]);
//Angles Connecting Peak to Port Edge
while (ai<List.Count(Points))
Angles[ai]=Math.Atan((Points[ai].X-Peak.X)/(Points[ai].Y-Peak.Y));
//Lines Connecting Peak to Port Edge
while (li<(List.Count(Points)-1))
if (Angles[li+1]>(Angles[li]+0.5))
EPoints[lc]=Points[li+1];
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);
CutMass=PExt[0].UnionAll(PExt);
CutSurface=Surface.ByPatch(PLines);
CutSurface=PolySurface.ByJoinedSurfaces(CutSurface);
return={CutMass,CutSurface};
BernhardinkatuSlope=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);
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)};
EntTriBou=PolyCurve.ByPoints(EnTriPnts,true);
EntTriSur=Surface.ByPatch(EntTriBou);
EntTriSol1=EntTriSur.Thicken(-15,false);
EntTriSol=EntTriSol1.Difference(ParkSightLines[0]);
BuildingMassEnt=BuildingMass.Union(EntTriSol);
BuildingPolySurface=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});
LiF=RemoveIfNot(Li,"Line");
//Function: Creating a Uniform Grid
def 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 Intersects
Intersects=Flatten(Mass.Intersect(SurfInLines));
Intersects=remPnt(Intersects);
BaseLevelFilter1=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 Levels
TopBottomGrid=List.Transpose(TopBottomGrid);
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};
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};
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 Height
LLPH=List.Transpose(HeightGroup(LLRP<1>,LLFP<1>,h1<2>,h2<2>)<2>);
//Upper Level Points Grouped by Height
ULPH=List.Transpose(HeightGroup(ULRP<1>,ULFP<1>,h1<2>,h2<2>)<2>);
//Function - Boundary Points in Cluster
def BoundaryPoints(PointsGrid:var[],GroupKey)
//Group Points with same X
GridX=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,
LLBPn=List.Transpose(BoundaryPoints(LLPH,GroupKeyX));
ULBPn=List.Transpose(BoundaryPoints(ULPH,GroupKeyX));
//Lower Level Boundary Curves
LLBP=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);
LLBN=List.Transpose(LLBN);
LLBN=List.Transpose(LLBN<1>);
LLS=RemoveIfNot(Flatten(LLS),"Solid");
//Upper Level Boundary Curves
ULBP=Point.PruneDuplicates(ULBPn<1>,GridDensity+0.05);
ULBN=NurbsCurve.ByControlPoints(ULBP<1>,3,1);
ULBN=List.Transpose(ULBN);
ULBN=List.Transpose(ULBN<1>);
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));
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)};
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 Surfaces
VMassSurfaces=PolySurface.BySolid(VolumetricMass);
VMassSurfaces=VMassSurfaces.Surfaces();
VMassBottomSurfaces=Flatten({VMassSurfaces[26],VMassSurfaces[17]});
VMassBottomSurface=PolySurface.ByJoinedSurfaces(VMassBottomSurfaces);
//Interior Blocks Floor Area and Average Height
IntBlksBottomSurface=Flatten(InteriorBlocks.Intersect(VMassBottomSurface));
IntBlksBottomFlrArea=IntBlksBottomSurface.Area;
IntBlksBottomVol=InteriorBlocks.Volume;
IntBlksAvHeight=IntBlksBottomVol/IntBlksBottomFlrArea;
//Interior Blocks Surfaces
IntBlkSurfaces1=PolySurface.BySolid(InteriorBlocks);
IntBlkSurfaces1=IntBlkSurfaces1.Surfaces();
IntBlkSurfaces=List.Transpose(IntBlkSurfaces1);
IntBlkFlSurf=IntBlkSurfaces[0];
IntBlkRfSurf=IntBlkSurfaces[1];
IntBlkWlSurf=IntBlkSurfaces[2];
//Center of Plane Rotation
IntBlkBotCen=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>);
IntBlkCutPlanes=CutPlanes(IntBlkCutPlane<1>,RotAngle<1>);
IntBlkCutPlanes=Flatten(IntBlkCutPlanes<1>);
//Center of Plane Rotation
IntBlkBotCen=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>);
IntBlkCutPlanes=CutPlanes(IntBlkCutPlane<1>,RotAngle<1>);
IntBlkCutPlanes=Flatten(IntBlkCutPlanes<1>);
//Function - Create Interior Block Components
def IntBlComponents(IntBlks,IntsPlns:var[])
IntBlkDivs=Flatten(IntBlks<1>.Intersect(IntsPlns<2>));
//Filter out Small Surfaces
IntBlkDivsAr=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);
IntBlkSurfaces0=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;
IntBlkWlSol1=IntBlkWlSurf.Thicken(IntBlkWlThk,1);
IntBlkWlSol=IntBlkWlSol1.Difference(IntBlkFrmSol);
IntBlkFlOfp=1*((IntBlkFrmDep)+0.2);
IntBlkFlOfn=-1*((IntBlkFrmDep)+0.2);
//IntBlkFlTk=((IntBlkFrmDep)+0.5);
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);
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 Lights
IntBlkSkOfp=1*(IntBlkSkOf);
IntBlkSkOfn=-1*(IntBlkSkOf);
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);
IntBlkFrs=IntBlkComponentsT[0];
IntBlkFrs=RemoveIfNot(IntBlkFrs,"Solid");
IntBlkFrs=IntBlkFrs[0].UnionAll(IntBlkFrs);
IntBlkWls=IntBlkComponentsT[1];
IntBlkWls=RemoveIfNot(IntBlkWls,"Solid");
IntBlkWls=IntBlkWls[0].UnionAll(IntBlkWls);
IntBlkFls=IntBlkComponentsT[2];
IntBlkFls=Flatten(IntBlkFls);
IntBlkFls=RemoveIfNot(IntBlkFls,"Solid");
IntBlkFls=IntBlkFls[0].UnionAll(IntBlkFls);
IntBlkRfs=IntBlkComponentsT[3];
IntBlkRfs=Flatten(IntBlkRfs);
IntBlkRfs=RemoveIfNot(IntBlkRfs,"Solid");
IntBlkRfs=IntBlkRfs[0].UnionAll(IntBlkRfs);
//Interior Block SkyLights
IntBlkSks=IntBlkComponentsT[4];
IntBlkSks=Flatten(IntBlkSks);
IntBlkSks=RemoveIfNot(IntBlkSks,"Solid");
IntBlkSks=IntBlkSks[0].UnionAll(IntBlkSks);
//Building Mass Punctured
BuildingSkinPunctured=BuildingSkinPunctured.Difference(IntBlkFrs);
//Interior Block Roof Covering;
IntBlkRfs1=IntBlkComponentsT[3];
IntBlkRfs1=Flatten(IntBlkRfs1);
IntBlkRfs1=RemoveIfNot(IntBlkRfs1,"Solid");
RoofPol=PolySurface.BySolid(RoofSol);
RoofSur=RoofPol.Surfaces();
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);
IntBlkRfCvs=Roofing(IntBlkRfs1);