Building Construction.cga

 

/**
 * File:    Building Construction.cga
 * Authoer: Esri
 */ 

version "2017.1"


import Facade_Construction : "Support/Building Facades.cga" #(Display_Textures = Display_Textures, Display_Thematics = Display_Thematics, Solid_Color = Solid_Color, Transparency = Transparency, Upper_Floor_Height = Upper_Floor_Height, Ground_Floor_Height = Ground_Floor_Height, DisableMassDisplay = DisableMassDisplay)
import Green_Space : "Support/Greenspace Attributes.cga" #(Display_Textures = Display_Textures, Display_Thematics = Display_Thematics, Solid_Color = Solid_Color, Transparency = Transparency)
import Zoning : "Support/Zoning.cga" #(Foundation_Height = Foundation_Height, Foundation_Adjustment = Foundation_Adjustment)
import envReports : "Support/Environment Reporting.cga"
import Building_Performance : "Support/Building Performance.cga"


################################################
# DISPLAY OPTIONS

@Group("DISPLAY OPTIONS",0) @Order(1)
attr Display_Textures = true

@Group("DISPLAY OPTIONS") @Order(2)
@Enum("Thematics Off", "Solid Color", "Usage", "Peak Runoff/Permeability")
attr Display_Thematics = "Thematics Off" 

@Group("DISPLAY OPTIONS") @Order(3) @Color
attr Solid_Color = "#FFFFFF"

@Group("DISPLAY OPTIONS") @Order(4) @Range(min=0, max=1)
attr Transparency = 1

@Group("DISPLAY OPTIONS") @Order(10)
attr Story_Edge_Display = false

@Group("DISPLAY OPTIONS") @Order(11) @Distance
attr Story_Edge_Size = 0.15

@Group("DISPLAY OPTIONS") @Order(12) @Color
attr Story_Edge_Color = "#ffffff"


texturingOn = Display_Textures 	# Shorthand.
thematicsOn = Display_Thematics != "Thematics Off"
coloringOn = !thematicsOn	# Shorthand.

thematicColor = 
    case Display_Thematics == "Peak Runoff/Permeability":
        # Specific materials will be colored down the road, but everything else will use white.
        "#FFFFFF"
    case Display_Thematics == "Solid Color":
        Solid_Color
    case Display_Thematics == "Usage":
        Zoning.usageColor(Zoning.Zone_1_Usage)
    else:
        "#FFFFFF"

@Hidden
attr DisableMassDisplay = Zoning.Zoning_Display == "Building & Envelope"



################################################################


Lot --> 
Parcel

################################################################
## ATTRIBUTES
##

## Building Height ################################


@Group("BUILDING HEIGHT",1) @Order(1) @Range(min=2, max=20, restricted=false)
attr Floor_Count_Min = Zoning.Floor_Count_Min	

@Group("BUILDING HEIGHT") @Order(2) @Range(min=2, max=20, restricted=false)
attr Floor_Count_Max = Zoning.Floor_Count_Max

@Group("BUILDING HEIGHT") @Order(3) @Enum("None","Increasing","Decreasing","Alternating","Random")
attr Variation_Mode = "None"

@Group("BUILDING HEIGHT") @Order(4) @Range(min=3, max=5, restricted=false) @Distance @Description("Floor-to-floor height (residential buildings are normally constructed with a floor-to-floor height of about 3m, office buildings up to 4m)")
attr Upper_Floor_Height = Zoning.Upper_Floor_Height

@Group("BUILDING HEIGHT") @Order(5) @Range(min=3, max=7, restricted=false) @Distance
attr Ground_Floor_Height = Zoning.Ground_Floor_Height

@Description("Adjust to place front door at exact elevation.")
@Group("BUILDING HEIGHT",1) @Order(6) @Range(min=-4.1, max=4.1, restricted=false) @Distance
attr Foundation_Adjustment = 0

@Description("Applied to entire parcel to match sidewalk. If rule is applied to static shape, then adjust this to zero.")
@Group("BUILDING HEIGHT",1) @Order(7) @Range(min=0, max=0.2, restricted=false) @Distance
attr Sidewalk_Height_Match = 0

## Building Setbacks ################################
 
@Group("BUILDING SETBACKS",2) @Order(1) @Range(min=0, max=20, restricted=false) @Distance
attr Street_Setback = Zoning.Street_Setback

@Group("BUILDING SETBACKS") @Order(2) @Range(min=0, max=10, restricted=false) @Distance
attr Side_Setback = Zoning.Side_Setback
 
@Group("BUILDING SETBACKS") @Order(2) @Range(min=0, max=10, restricted=false) @Distance
attr Back_Setback = Zoning.Back_Setback

@Group("BUILDING SETBACKS") @Order(3) @Enum("None","2 Stepbacks","2nd Floor","Top Floor","Increasing","Decreasing","Alternating","Random")
attr Street_Setback_Mode = "None"

@Group("BUILDING SETBACKS") @Order(4) @Range(min=0, max=10, restricted=false) @Distance
attr Street_Setback_Distance = 2

## Footprint Layout ################################

@Group("FOOTPRINT LAYOUT",3) @Order(1) @Enum("Along Street","Along Front","L-Shape Left","L-Shape Right","U-Shape","Total Area")
attr Layout_Shape = "Along Street" 

@Group("FOOTPRINT LAYOUT") @Order(2) @Enum("Open To Back","Open To Front")
attr Layout_Orientation = "Open To Back"

@Group("FOOTPRINT LAYOUT") @Order(3) @Range(min=7, max=20, restricted=false) @Distance
attr Wing_Width = 13

## Footprint Partition ################################

@Group("FOOTPRINT PARTITION",4) @Order(1) @Range(min=10, max=50, restricted=false) @Distance
attr Unit_Width = 15

@Group("FOOTPRINT PARTITION") @Order(2) @Enum("None","Increasing","Decreasing","Alternating","Random")
attr Offset_Mode = "None"

@Group("FOOTPRINT PARTITION") @Order(3) @Range(min=0, max=10, restricted=false) @Distance
attr Offset_Distance = 5

## CUT/FILL ################################

@Description("These are used for internal calculations - they must be set to 'Source=Object'")
@Group("LINK TO OBJECT ATTRIBUTES",99) @Order(1)
attr cutVolume = 0

@Description("These are used for internal calculations - they must be set to 'Source=Object'")
@Group("LINK TO OBJECT ATTRIBUTES",99) @Order(2)
attr fillVolume = 0
    



## Hidden Attributes used for Reporting ########################

@Hidden
attr Lot_Area = geometry.area
@Hidden
attr Elevation = scope.elevation
@Hidden
attr Foundation_Height = 0


################################################################
## FUNCTIONS
##

offsetDistance = case Offset_Mode == "None": 0 else: Offset_Distance
mainWingWidth = 
    case Street_Setback_Mode == "None": Wing_Width + offsetDistance
    else:     Wing_Width + Street_Setback_Distance + offsetDistance
    
getHeight(idx,n) = Ground_Floor_Height + (nFloors(idx,n)-1)*Upper_Floor_Height
nFloors(idx,n) = 	
    case Variation_Mode == "None" || n < 2 : Floor_Count_Max
    case Variation_Mode == "Increasing"    : Floor_Count_Min + rint((Floor_Count_Max-Floor_Count_Min)*idx/(n-1))
    case Variation_Mode == "Decreasing"    : Floor_Count_Min + rint((Floor_Count_Max-Floor_Count_Min)*(1-idx/(n-1)))
    case Variation_Mode == "Alternating"   : Floor_Count_Min + rint((Floor_Count_Max-Floor_Count_Min)*(idx%2))
    else                                   : rint(rand(Floor_Count_Min-0.49,Floor_Count_Max+0.49))

getFloorHeight(idx) = case idx == 0: Ground_Floor_Height else: Upper_Floor_Height


################################################################
## RULES
##


## Parcel to Footprint ################################


@StartRule
Parcel -->
    set(material.opacity, Transparency)
    alignScopeToAxes(y)
    t(0,Sidewalk_Height_Match,0)
    set(Lot_Area, geometry.area) # save the original settings.
    set(Elevation,scope.elevation)	# save the original settings.
    set(Foundation_Height, scope.sy)
    report("Construction, Cut/Fill, Cost", envReports.calculateCutAndFillCost(cutVolume, fillVolume))
    report("Construction, Cut/Fill, Cut Volume (m3)", cutVolume)
    report("Construction, Cut/Fill, Fill Volume (m3)", fillVolume)
    report("Parcel, Area (m2)", Lot_Area)
    report("Site Conditions, Slope (%)", geometry.angle(maxSlope)/90) # FIX: Need way to get average slope, not max. Probably insignificant difference though.
    # XX 2014.0 fix:  (this is duplicated from the parcel rule. update both if need be) (example of bad coding by Chris)
    set(Facade_Construction.Display_Textures, Display_Textures)
    set(Facade_Construction.Display_Thematics, Display_Thematics)  
    set(Facade_Construction.Solid_Color, Solid_Color)  
    set(Facade_Construction.Transparency, Transparency)  
    set(Facade_Construction.Display_Textures, Display_Textures)  
    set(Facade_Construction.Upper_Floor_Height, Upper_Floor_Height)  
    set(Facade_Construction.Ground_Floor_Height, Ground_Floor_Height)  
    set(Facade_Construction.DisableMassDisplay, DisableMassDisplay)  
    # 
    set(Green_Space.Display_Textures, Display_Textures)  
    set(Green_Space.Display_Thematics, Display_Thematics)  
    set(Green_Space.Solid_Color, Solid_Color)  
    set(Green_Space.Transparency, Transparency)
    #
    set(Zoning.Foundation_Height, Foundation_Height)  
    set(Zoning.Foundation_Adjustment, Foundation_Adjustment)
    #
    set(Facade_Construction.Photovoltaic_Roof.Display_Textures, Display_Textures)
    set(Facade_Construction.Photovoltaic_Roof.Display_Thematics, Display_Thematics)
    set(Facade_Construction.Photovoltaic_Roof.Solid_Color, Solid_Color)
    set(Facade_Construction.Photovoltaic_Roof.Transparency, Transparency) 
    set(Facade_Construction.Photovoltaic_Roof.Level_of_Detail, Facade_Construction.Level_of_Detail)  
    #
    ParcelStep1


xx-->
    set(material.opacity,0.5)
    translate(rel, world, 0,0.1,0)
    color(1,0,0)

ParcelStep1 -->
    case thematicsOn && Display_Thematics != "Usage":
        color(thematicColor)
        ParcelStep2
    else:
        ParcelStep2


ParcelStep2 -->
    case Zoning.Zoning_Display == "Building":
        BuildingAndYards
    case Zoning.Zoning_Display == "Envelope":
        Zoning.ZoningEnvelope
    else:
        BuildingAndYards
        Zoning.ZoningEnvelope


BuildingAndYards -->
    #t(0,Foundation_Height,0) # FIX: Disabled due to bug. Come back to this later.
    SetbackStreet

SetbackStreet -->
    setback(Street_Setback) {street.front: GreenSpace("frontyard") | remainder : SetbackBack}

SetbackBack --> 
    setback(Back_Setback) {street.back: GreenSpace("border") | remainder : SetbackLeft } 

SetbackLeft -->
    setback(Side_Setback) {street.left: GreenSpace("border") | remainder : SetbackRight }

SetbackRight -->
    setback(Side_Setback) {street.right: GreenSpace("border") | remainder : ConstructionArea }

#ConstructionArea2 --> color(0,1,1) X.

/*  
Yards -->
    # Do not squash this one as we did Building.
    setback(Street_Setback) {streetSide: GreenSpace("frontyard") 
        | remainder : 
        setback(Back_Setback) {street.back: GreenSpace("border")
        | remainder : 
        setback(Side_Setback) {street.side: GreenSpace("border") | remainder : NIL }}}
*/




ConstructionArea -->
    s('1,0,'1)
    ConstructionAreaDispatch 

ConstructionAreaDispatch -->
    case Layout_Shape == "Along Street":
        case Layout_Orientation == "Open To Back":
            setback(mainWingWidth) { street.front : Layout | remainder : GreenSpace}
        else:
            setback(mainWingWidth) { noStreetSide : Layout | remainder : GreenSpace } 
    case Layout_Shape == "Along Front":
        case Layout_Orientation == "Open To Back":
            setback(mainWingWidth) { front : Layout | remainder : GreenSpace }
        else:
            setback(mainWingWidth) { back : Layout | remainder : GreenSpace }
    case Layout_Shape == "L-Shape Left":
        case Layout_Orientation == "Open To Back":
            shapeO(mainWingWidth,0,0,Wing_Width) { shape : Layout | remainder : GreenSpace } 
        else:
            shapeO(0,0,mainWingWidth,Wing_Width) { shape : Layout | remainder : GreenSpace } 
    case Layout_Shape == "L-Shape Right":
        case Layout_Orientation == "Open To Back":
            shapeO(mainWingWidth,Wing_Width,0,0) { shape : Layout | remainder : GreenSpace } 
        else:
            shapeO(0,Wing_Width,mainWingWidth,0) { shape : Layout | remainder : GreenSpace } 
    case Layout_Shape == "U-Shape":
        case Layout_Orientation == "Open To Back":
            shapeO(mainWingWidth,Wing_Width,0,Wing_Width) { shape : Layout | remainder : GreenSpace } 
        else:
            shapeO(0,Wing_Width,mainWingWidth,Wing_Width) { shape : Layout | remainder : GreenSpace } 
    else:
        Layout

Layout -->
    case offsetDistance > 0 || (Variation_Mode != "None" && Floor_Count_Max != Floor_Count_Min ):
        split(x){ ~Unit_Width: Unit(split.index,split.total) }* 
    else:
        FootprintCheck(0,1)
    
Unit(idx,n) -->
    case n < 2 || offsetDistance <= 0:
        FootprintCheck(idx,n)
    case Offset_Mode == "Increasing":
        split(z){ offsetDistance*(1-idx/(n-1)) : GreenSpace("building") | ~1: FootprintCheck(idx,n) | offsetDistance*idx/(n-1) : GreenSpace("building") }
    case Offset_Mode == "Decreasing":
        split(z){ offsetDistance*idx/(n-1) : GreenSpace("building") | ~1: FootprintCheck(idx,n) | offsetDistance*(1-idx/(n-1)) : GreenSpace("building") }
    case Offset_Mode == "Alternating":
        split(z){ offsetDistance*(idx%2) : GreenSpace("building") | ~1: FootprintCheck(idx,n) | offsetDistance*((idx+1)%2) : GreenSpace("building") }
    case Offset_Mode == "Random":
        40% : split(z){                                            ~1: FootprintCheck(idx,n) | offsetDistance  : GreenSpace("building") }
        10% : split(z){ offsetDistance/2: GreenSpace("building") | ~1: FootprintCheck(idx,n) | offsetDistance/2: GreenSpace("building") }
        40% : split(z){ offsetDistance  : GreenSpace("building") | ~1: FootprintCheck(idx,n) }
        else: FootprintCheck(idx,n)
    else:
        FootprintCheck(idx,n)


FootprintCheck(idx,n) -->
    case geometry.isConcave:
        convexify(3) FootprintSizeCheck(idx,n) 
    else:
        FootprintSizeCheck(idx,n)


FootprintSizeCheck(idx,n) -->
    case geometry.nFaces > 1:
        comp(f){all: alignScopeToAxes(y) FootprintSizeCheck(idx,n) }
    case scope.sx < 4 || scope.sz < 4:
        GreenSpace
    else:
        Footprint(idx,n)


## Footprint to Mass ################################

@StartRule
Footprint -->
    case thematicsOn:
        color(thematicColor)
        Footprint2014Fix(0,1) # default case
    else:
        Footprint2014Fix(0,1) # default case

Footprint2014Fix(idx,n) -->
    # XX 2014.0 fix:  (this is duplicated from the parcel rule. update both if need be) (example of bad coding by Chris)
    set(Facade_Construction.Display_Textures, Display_Textures)
    set(Facade_Construction.Display_Thematics, Display_Thematics)  
    set(Facade_Construction.Solid_Color, Solid_Color)  
    set(Facade_Construction.Transparency, Transparency)  
    set(Facade_Construction.Display_Textures, Display_Textures)  
    set(Facade_Construction.Upper_Floor_Height, Upper_Floor_Height)  
    set(Facade_Construction.Ground_Floor_Height, Ground_Floor_Height)  
    set(Facade_Construction.DisableMassDisplay, DisableMassDisplay)  
    # 
    set(Green_Space.Display_Textures, Display_Textures)  
    set(Green_Space.Display_Thematics, Display_Thematics)  
    set(Green_Space.Solid_Color, Solid_Color)  
    set(Green_Space.Transparency, Transparency)
    #
    set(Zoning.Foundation_Height, Foundation_Height)  
    set(Zoning.Foundation_Adjustment, Foundation_Adjustment)
    #
    set(Facade_Construction.Photovoltaic_Roof.Display_Textures, Display_Textures)
    set(Facade_Construction.Photovoltaic_Roof.Display_Thematics, Display_Thematics)
    set(Facade_Construction.Photovoltaic_Roof.Solid_Color, Solid_Color)
    set(Facade_Construction.Photovoltaic_Roof.Transparency, Transparency) 
    set(Facade_Construction.Photovoltaic_Roof.Level_of_Detail, Facade_Construction.Level_of_Detail)  
    #
    Footprint(idx,n)



# This extrudes the footprint shape (for each unit if multiple units) up to the height of the full mass.
# Incoming parameters idx and n refer to the separate units (rather than floors as seen later in the rule). 
Footprint(idx,n) -->
    alignScopeToAxes(y) s('1,0,'1) t(0,Elevation-scope.elevation,0)
    Foundation
    t(0, foundationHeightAdjusted, 0)
    report("Building, Footprint Area (m2)", geometry.area)
    report("Parcel, Coverage (%)", geometry.area/Lot_Area*100)
    extrude(getHeight(idx,n)) 
    Envelope 


    

 
foundationHeightAdjusted = Foundation_Height + Foundation_Adjustment
Foundation -->
    case thematicsOn && Display_Thematics == "Usage":
        color(Zoning.usageColor(Zoning.usagePerFloor(0)))
        FoundationStep2
    else:
        FoundationStep2
        
FoundationStep2 -->
    extrude(foundationHeightAdjusted)
    comp(f){side : Facade_Construction.Wall}



# This takes the mass and splits into floor volumes.
Envelope -->
    split(y){   ~Ground_Floor_Height: FloorEnvelope(split.index,split.total) 
            | { ~Upper_Floor_Height: FloorEnvelope(split.index,split.total) }* }

# This receives individual floors 
FloorEnvelope(idx,n) -->
    s('1,0.02,'1) t(0,'-1,0) comp(f){top: FloorArea(idx,n) }

FloorArea(idx,n) -->
    case Street_Setback_Mode == "None":
        Floor(idx,n)
    case Street_Setback_Mode == "2nd Floor" && idx > 1:
        setback(Street_Setback_Distance){ object.front: NIL | remainder: Floor(idx,n) }		
    case Street_Setback_Mode == "Top Floor" && idx == n-1:
        setback(Street_Setback_Distance){ object.front: NIL | remainder: Floor(idx,n) }		
    case Street_Setback_Mode == "2 Stepbacks" && idx > n*0.8:
        setback(Street_Setback_Distance){ object.front: NIL | remainder: Floor(idx,n) }		
    case Street_Setback_Mode == "2 Stepbacks" && idx > n*0.5:
        setback(Street_Setback_Distance/2){ object.front: NIL | remainder: Floor(idx,n) }		
    case Street_Setback_Mode == "Increasing":
        setback(Street_Setback_Distance*idx/(n-1)){ object.front: NIL | remainder: Floor(idx,n) }		
    case Street_Setback_Mode == "Decreasing":
        setback(Street_Setback_Distance*(1-idx/(n-1))){ object.front: NIL | remainder: Floor(idx,n) }		
    case Street_Setback_Mode == "Alternating" && idx%2 == 1:
        setback(Street_Setback_Distance){ object.front: NIL | remainder: Floor(idx,n) }		
    case Street_Setback_Mode == "Random":
        30% : setback(Street_Setback_Distance){ object.front: NIL | remainder: Floor(idx,n) }
        30% : setback(Street_Setback_Distance){ object.back: NIL | remainder: Floor(idx,n) }
        else: Floor(idx,n)
    else:
        Floor(idx,n)
        
Floor(idx,n) -->
    Floor(idx,n,Zoning.usagePerFloor(idx))
    
Floor(idx,n,usage) -->
    case Display_Thematics == "Usage":
        color(Zoning.usageColor(usage))
        FloorStep2(idx,n,usage)
    else:
        FloorStep2(idx,n,usage)

FloorStep2(idx,n,usage) -->
    # Report all things based on floor area here. This is called for each floor.
    report("Building, Gross Floor Area (m2)", geometry.area)
    report("Parcel, Floor Area Ratio (Density)", geometry.area/Lot_Area)
    # FIX: We might want to base this on usage per floor?
    report("Construction, Building Cost", geometry.area * Building_Performance.Cost_Per_M2)

    report("Construction, Waste (kg)", 
        geometry.area * Zoning.constructionWastePerUsage(usage) * (1-Building_Performance.Percent_Reduction_Construction_Waste))
        
    report("Building Performance Target, Waste, Domestic (kg/yr)", 
        geometry.area * Zoning.domesticWastePerUsage(usage) * (1-Building_Performance.Percent_Reduction_Domestic_Waste))
    report("Building Performance Target, Energy, Heating Consumption (kWh/yr)", 
        geometry.area * Zoning.heatingConsumptionPerUsage(usage) * (1-Building_Performance.Percent_Reduction_Heating_Energy_Consumption))
    report("Building Performance Target, Energy, Electrical Consumption (kWh/yr)", 
        geometry.area * Zoning.electricConsumptionPerUsage(usage) * (1-Building_Performance.Percent_Reduction_Electric_Energy_Consumption))
    # Water:
    # Note: Percent greywater recycled is a weird calculation, because it would reduce overall consumption, but it comes from that amount. Like a circular reference kind of. Not sure about this.
    report("Building Performance Target, Water, Consumption (l/yr)", 
        geometry.area * waterConsumption(usage) * (1-Building_Performance.Percent_Reduction_Water_Consumption))
    report("Building Performance Target, Water, Produced Greywater (l/yr)", 
        geometry.area * waterConsumption(usage) * (1-Building_Performance.Percent_Reduction_Water_Consumption) * Zoning.percentGreywaterProducedPerUsage(usage))
    report("Building Performance Target, Water, Produced Blackwater (l/yr)", 
        geometry.area * waterConsumption(usage) * (1-Building_Performance.Percent_Reduction_Water_Consumption) * (1 - Zoning.percentGreywaterProducedPerUsage(usage)))
    report("Building Performance Target, Water, Recycled Greywater (l/yr)", 
        geometry.area * waterConsumption(usage) * (1-Building_Performance.Percent_Reduction_Water_Consumption) * Zoning.percentGreywaterProducedPerUsage(usage) * Building_Performance.Percent_Greywater_Recycled)

    report("Building Performance Baseline, Waste, Domestic (kg/yr)", 
        geometry.area * Zoning.domesticWastePerUsage(usage))
    report("Building Performance Baseline, Energy, Heating Consumption (kWh/yr)", 
        geometry.area * Zoning.heatingConsumptionPerUsage(usage))
    report("Building Performance Baseline, Energy, Electrical Consumption (kWh/yr)", 
        geometry.area * Zoning.electricConsumptionPerUsage(usage))
    report("Building Performance Baseline, Water, Consumption (l/yr)", 
        geometry.area * waterConsumption(usage))
    report("Building Performance Baseline, Water, Produced Greywater (l/yr)", 
        geometry.area * waterConsumption(usage) * Zoning.percentGreywaterProducedPerUsage(usage))
    report("Building Performance Baseline, Water, Produced Blackwater (l/yr)", 
        geometry.area * waterConsumption(usage) * (1 - Zoning.percentGreywaterProducedPerUsage(usage)))

    StoryEdgeDisplay
    extrude(getFloorHeight(idx))
    FloorMassFacades(idx,n)

waterConsumption(usage) = Zoning.waterConsumptionPerUsage(usage) * (1-Building_Performance.Percent_Reduction_Water_Consumption)

StoryEdgeDisplay -->
    case Story_Edge_Display :
        case coloringOn:
            color(Story_Edge_Color) 
            offset(Story_Edge_Size, border)
            extrude(-Story_Edge_Size) X.
        else:
            offset(Story_Edge_Size, border)
            extrude(-Story_Edge_Size) X.
    else: NIL

    

## Subpart Generation ################################

FloorMassFacades(idx,n) -->
    Facade_Construction.FloorMass(idx,n)
    



GreenSpace -->
    GreenSpace("main")


GreenSpace(id) -->
    report("Parcel, Green Space Area (m2)",geometry.area)
    Green_Space.GreenSpace(id, thematicColor)


## PRE-CONFIGURED STYLES ################################

style LShaped
attr Floor_Count_Min = 7.0
attr Floor_Count_Max = 9.0
attr Variation_Mode = "Increasing"
attr Street_Setback = 2.0
attr Street_Setback_Distance = 3.0
attr Layout_Shape = "L-Shape Left"
attr Wing_Width = 20.0
attr Unit_Width = 30.0
attr Offset_Mode = "Decreasing"
attr Offset_Distance = 3.0

style Shifted
attr Floor_Count_Min = 7.0
attr Street_Setback = 2.0
attr Street_Setback_Mode = "Top Floor"
attr Street_Setback_Distance = 3.0
attr Wing_Width = 20.0
attr Unit_Width = 20.0
attr Offset_Mode = "Increasing"
attr Offset_Distance = 9.0

style Terrasse
attr Layout_Shape = "L-Shape Left"			
attr Wing_Width = 25
attr Unit_Width = 30
attr Offset_Mode = "Random"
attr Offset_Distance = 5
attr Street_Setback_Mode = "Increasing"
attr Street_Setback_Distance = 10

style Lego
attr Floor_Count_Min = 5.0
attr Floor_Count_Max = 7.0
attr Variation_Mode = "Random"
attr Street_Setback = 2.0
attr Street_Setback_Mode = "Random"
attr Street_Setback_Distance = 3.0
attr Layout_Shape = "Along Front"
attr Wing_Width = 20.0
attr Offset_Mode = "Random"
attr Offset_Distance = 3.0

style HighRise
attr Floor_Count_Min = 9.0
attr Floor_Count_Max = 41.0
attr Variation_Mode = "Decreasing"
attr Street_Setback = 2.0
attr Street_Setback_Mode = "2 Stepbacks"
attr Street_Setback_Distance = 6.0
attr Layout_Shape = "L-Shape Left"
attr Wing_Width = 16.0
attr Unit_Width = 23.0
attr Offset_Mode = "Random"
attr Offset_Distance = 3.0

 

Building_Facades.cga

 

/**
 * File:    Building_Facades.cga
 * Created: 30 Apr 2013 02:42:18 GMT
 * Author:  Esri
 */

version "2019.1"

const assetDirectory = "Buildings_Advanced_Building/"

import Photovoltaic_Roof : "Photovoltaic Roof.cga" #(Display_Textures = Display_Textures, Display_Thematics = Display_Thematics, Solid_Color = Solid_Color, Transparency = Transparency, Level_of_Detail = Level_of_Detail) 
import envReports : "Environment Reporting.cga"

@Hidden
attr Display_Textures = true
@Hidden
attr Display_Thematics = "Thematics Off" 
@Hidden
attr Solid_Color = ""
@Hidden
attr Transparency = 1

@Hidden
attr DisableMassDisplay = false

texturingOn = Display_Textures 	# Shorthand.
thematicsOn = Display_Thematics != "Thematics Off"
coloringOn = !thematicsOn && texturingOn	# Shorthand.

peakRunoffDisplayOn = Display_Thematics == "Peak Runoff/Permeability"  


################################################################
## ATTRIBUTES
##




@Hidden 
attr Upper_Floor_Height = 0

@Hidden 
attr Ground_Floor_Height = 0

## Model Options	

@Group("MODEL OPTIONS",0) @Order(0) 
attr Generate_Facade = false

@Group("MODEL OPTIONS") @Order(1) @Enum("High","Medium","Low")
attr Level_of_Detail = "Medium" 



@Group("MASS COLOR OPTIONS",1) @Order(2)
@Enum("Solid","Random","Gradient-Up", "Gradient-Down") 
attr Mass_Display = "Gradient-Up"

@Group("MASS COLOR OPTIONS") @Order(3) 
@Color
attr Mass_Color_1 = "#57ABFF"

@Group("MASS COLOR OPTIONS") @Order(4) 
@Color
attr Mass_Color_2 = "#FFFFFF"



## Facade Design	

@Group("FACADE DESIGN",2) @Order(2) 
@Enum("[WO]*W","o[WO]*Wo","O[Wo]*WO","wo[WO]*Wow","Wo[WO]*WoW","WO[Wo]*WOW","Rhythm1")
@Description("Name of floor pattern for uneven floors ('W' stands for Wall, 'O' for Opening, 'w' and 'o' for smaller versions thereof)") 
attr Main_Pattern_A = "[WO]*W"	

@Group("FACADE DESIGN") @Order(3) 
@Enum("[WO]*W","o[WO]*Wo","O[Wo]*WO","wo[WO]*Wow","Wo[WO]*WoW","WO[Wo]*WOW","Rhythm1")
@Description("Name of floor pattern for uneven floors ('W' stands for Wall, 'O' for Opening, 'w' and 'o' for smaller versions thereof)") 
attr Main_Pattern_B = "[WO]*W"

@Group("FACADE DESIGN") @Order(4) 
@Enum("Same as Main","WOW","WoW","wOWOw","woWow","woW","wOwoW","w[oW]*w")
@Description("Floor Pattern for sides ('W' stands for floating Wall, 'O' for Opening, 'w' and 'o' for smaller versions thereof)") 
attr Side_Pattern = "Same as Main"

@Group("FACADE DESIGN") @Order(5) 
@Enum("None","On Front","On Rear")
attr Balconies = "None"

@Group("FACADE DESIGN") @Order(6) 
@Enum("[WB]*W","b[WB]*Wb","Alternating")
attr Balcony_Pattern = "[WB]*W"

@Group("FACADE DESIGN") @Order(7) 
attr Ground_Floor_Shopfront = true

## Main Parameters

@Group("FACADE PARAMETERS",3) @Order(1) @Range(min=5, max=15, restricted=false) @Distance
attr Win_Width = 4

@Group("FACADE PARAMETERS") @Order(2) @Range(min=1, max=4, restricted=false) @Distance
attr Win_Height = Upper_Floor_Height - Cill_Height - Slab_Thickness 		# per default, the windows go up to the ceiling height

@Group("FACADE PARAMETERS") @Order(3) @Range(min=0, max=2, restricted=false) @Distance
attr Cill_Height = 0.3

@Group("FACADE PARAMETERS") @Order(4) @Range(min=0, max=5, restricted=false) @Distance
attr Wall_Width = 1.5

@Group("FACADE PARAMETERS") @Order(5) @Range(min=5, max=20, restricted=false) @Distance
attr Balcony_Width = 6

@Group("FACADE PARAMETERS") @Order(6) @Range(min=0, max=5, restricted=false) @Distance
attr Balcony_Depth = 2

@Group("FACADE PARAMETERS") @Order(7) @Range(min=0.7, max=1.1, restricted=false) @Distance
attr Railing_Height = 1


## Windows

@Group("WINDOWS",4) @Order(0) @Enum("Wall Center","Inside Flush", "Outside Flush")
attr Win_Position = "Wall Center"

@Group("WINDOWS") @Order(1) @Range(min=0.7, max=2, restricted=false) @Distance
attr Panel_Width = 1

@Group("WINDOWS") @Order(2) @Range(min=0, max=0.3, restricted=false) @Distance
attr Frame_Width = 0.1

@Group("WINDOWS") @Order(3) @Range(min=0, max=0.3, restricted=false) @Distance
attr Frame_Depth = Frame_Width*2

@Group("WINDOWS") @Order(4) @Color
attr Frame_Color = "#999999"

@Group("WINDOWS") @Order(5) @Enum("iRay Glass", "CE Blue","CE Dark Blue","CE Green","CE Brown","CE Black")
attr Glass_Material = "iRay Glass"

## Walls

@Group("WALLS",5) @Order(1) 
@Enum("Stucco Redlands Red", "Stucco Redlands Brown", "Stucco Redlands White", "Brick Brown No Mortar Rough Running Bond", "Brick Brown No Mortar Running Bond", "Brick Brown Running Bond", "Brick Grey Running Bond", "Brick Red High Contrast Running Bond", "Brick Red No Mortar Running Bond", "Brick Red Running Bond", "Brick Varied Brown Running Bond", "Brick White Dirty Running Bond", "Brick White Painted Running Bond", "Cement Block Dark Grey Running Bond", "Cement Block Grey Running Bond", "Cement Block Grey Specks Running Bond", "Cement Block Light Running Bond")
attr Wall_Texture = "Stucco Redlands White"

@Group("WALLS") @Order(1)
@Description("Adjustment allows scaling of wall texture.") 
@Range(min=0.2, max=5, restricted=false)
attr Wall_Texture_Scaler = 1

@Group("WALLS") @Order(2) 
@Color
attr Wall_Color ="#ffffff"

@Group("WALLS") @Order(3) @Range(min=0.2, max=0.7, restricted=false) @Distance
attr Wall_Thickness = 0.4

@Group("WALLS") @Order(4) @Range(min=0.2, max=1, restricted=false) @Distance
attr Slab_Thickness = 0.7

@Group("WALLS") @Order(5) @Range(min=0, max=1, restricted=false) @Distance
attr Parapet_Height = 0.4

## Balconies




const Show_Awnings_Ground = Awning_Type_Ground != "None" 
const Show_Awnings_Upper = Awning_Type_Upper != "None" 

@Group("AWNINGS", 7) @Order(1)
@Enum("None","Shed","Box","Esri-Q")
attr Awning_Type_Ground = "None"

@Group("AWNINGS") @Order(2)
@Range(min=0.2, max=3, restricted=false) @Distance
attr Awning_Extension_Ground = 1

@Group("AWNINGS") @Order(3)
@Distance
attr Awning_Height_Ground = 1


@Group("AWNINGS") @Order(4)
@Enum("None","Shed","Box","Esri-Q")
attr Awning_Type_Upper = "None"

@Group("AWNINGS") @Order(5)
@Range(min=0.2, max=3, restricted=false) @Distance
attr Awning_Extension_Upper = 1.35

@Group("AWNINGS") @Order(6)
@Distance
attr Awning_Height_Upper = 1

@Group("AWNINGS") @Order(7)
@Color
attr Awning_Color = "#FFFFFF"
 

@Group("ROOFS",8) @Order(1)
@Enum("Flat", "Gable", "HipFlat") 
attr Roof_Type = "Flat" 


@Group("ROOFS") @Order(3)
@Enum("Green Roof", "Gravel", "Flat Metal 1", "Flat Metal 2", "Flat Metal 3", "Flat Metal 4", "Flat Metal 5", "Flat Metal 6", "Flat Metal 7", "Flat Metal 8", "Flat Metal 9", "Flat Metal 10","Flat Metal 11", "Flat Metal 12", "Flat Metal 13", "Flat Metal 14", "Flat Metal 15","Flat Metal 16", "Flat Metal 17", "Flat Metal 18", "Flat Metal 19", "Flat Metal 20", "Flat Standard 1", "Flat Standard 2", "Flat Standard 3", "Flat Standard 4", "Flat Standard 5", "Flat Standard 6", "Flat Standard 7", "Flat Standard 8", "Flat Standard 9", "Flat Standard 10")
attr Flat_Roof_Texture = "Flat Metal 1" 

@Group("ROOFS") @Order(4)
@Enum("Shingle Black", "GAF Elk WeatherMax Charcoal", "Barrel Tile Brown", "Barrel Tile Red Mixed", "Camelot Shingle", "Mesa Shingle Brown", "Standard Dura Shingle", "Standard Shingle", "Terracotta Tile Dark Brown", "Terracotta Tile Red", "Weathered Shingle") @Order(2)
attr Sloped_Roof_Texture = "Shingle Black"	

@Group("ROOFS") @Order(5)
@Range(min=0.1, max=5.0, restricted=false)
attr Roof_Texture_Scale = 2	

@Group("ROOFS")
@Angle
attr Sloped_Roof_Angle = 15
@Group("ROOFS") @Range(min=0, max=1, restricted=false) @Distance
attr Roof_Overhang = .1 

@Group("ROOFS")
@Distance
attr Hip_Roof_Height = 1.5



@Group("ARCGIS/3D ANALYST",9) @Order(1) @Enum("None","On Sides", "All") @Description("Turn on to split the whole model into rectangular panels (usable e.g. for analysis)")
attr Panels_Generate = "None"

@Group("ARCGIS/3D ANALYST") @Order(2) @Range(min=1, max=20, restricted=false) @Distance @Description("Note that panel size is adjusted/rounded to the geometry's dimensions on the side")
attr Panel_Size = 5

@Group("ARCGIS/3D ANALYST") @Order(3) @Range(min=0, max=3, restricted=false) @Distance @Description("Distance of the sampling point in front of the panel's center.")
attr Panel_Sampling_Point_Distance = 0.1




## Hidden Attributes used for Reporting ########################

@Hidden
attr floorIdx = -1
@Hidden
attr nFloors = -1
@Hidden
attr tileIdx = -1
@Hidden
attr nTiles = -1



################################################################
## CONSTANTS
##

const frameDepth = case highLOD: Frame_Depth else: 0
const winSetback = 
    case lowLOD							: 0
    case Win_Position == "Outside Flush": 0
    case Win_Position == "Inside Flush"	: Wall_Thickness-frameDepth-0.02
    else 								: Wall_Thickness/2-frameDepth/2		# Wall Center

# just for short notations
const walW = Wall_Width
const winW = Win_Width
const panW = Panel_Width
const balW = Balcony_Width
const lowLOD 	= Level_of_Detail == "Low" 
const midLOD 	= Level_of_Detail == "Medium"
const highLOD 	= Level_of_Detail == "High"

################################################################
## FUNCTIONS
##






# pattern switching
isConstant = Main_Pattern_A=="o[WO]*Wo" || Main_Pattern_B=="o[WO]*Wo" || Main_Pattern_A=="O[Wo]*WO" || Main_Pattern_B=="O[Wo]*WO" # patterns which need to go all around
mainPattern = 
    case front || rear || isConstant : 
        case even(floorIdx): Main_Pattern_A 
        else: Main_Pattern_B  # in case of an even floor, we take pattern A, otherwise pattern B
    else : 
        case even(floorIdx): Main_Pattern_B 
        else: Main_Pattern_A  # on the left and right we alternate the two patterns different
        
balconyPattern = 
    case Balcony_Pattern=="Alternating": case even(floorIdx): "[WB]*W" else: "b[WB]*Wb"
    else                               : Balcony_Pattern	
    
# utils
even(val) 	= val % 2 == 0
uneven(val) = val % 2 == 1
rear  = geometry.isOriented(object.back)
left  = geometry.isOriented(object.left)
right = geometry.isOriented(object.right)
front = geometry.isOriented(object.front)

# for adjacency checks & handling.
adjacentToBalconiesOnRight = left&&Balconies=="On Front"  || right && Balconies=="On Rear" 
    || left && Ground_Floor_Shopfront && floorIdx == 0
adjacentToBalconiesOnLeft  = right && Balconies=="On Front" || left && Balconies=="On Rear"
    || right && Ground_Floor_Shopfront && floorIdx == 0
windowsOnCorners = case mainPattern == "o[WO]*Wo" || mainPattern == "O[Wo]*WO": 1 else: 0
balconyOnCorners = case balconyPattern == "b[WB]*Wb": 1 else: 0

# for balcony tile
glassBalconyLeft  = case tileIdx == 0       : 0 else: (1+floorIdx%2)*panW
glassBalconyRight = case tileIdx == nTiles-1: 0 else: (1+floorIdx%2)*panW

# for panels
getWorldDir = 
    case geometry.isOriented(world.north)	: "north"
    case geometry.isOriented(world.south)	: "south"
    case geometry.isOriented(world.west)	: "west"
    case geometry.isOriented(world.east)	: "east"
    case geometry.isOriented(world.up)		: "up"
    else									: "down"
getLocalDir = 
    case geometry.isOriented(object.front)	: "front"
    case geometry.isOriented(object.back)	: "rear"
    case geometry.isOriented(object.left)	: "left"
    case geometry.isOriented(object.right)	: "right"
    case geometry.isOriented(object.top)	: "top"
    else									: "bottom"	



################################################################
## RULES
##
            
# Startshape is a floor volume here ################################
FloorMass(idx,n) -->
    case !Generate_Facade:
        case coloringOn && !DisableMassDisplay:
            case Mass_Display == "Random" :
                ColorRamp(putWithinRange(thisBuildingWater + thisFloorsVariation))	
            case Mass_Display == "Gradient-Up" :
                ColorRamp(idx / n)
            case Mass_Display == "Gradient-Down" :
                ColorRamp(1- (idx / n))
            else:
                color(Mass_Color_1) X.
        else:
            X.
    else:
        set(floorIdx,idx) set(nFloors,n)
        #Debug
        comp(f){ side: FloorSide }
        Slab
        Roof
        
Debug -->
    print("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%")
    print("Display_Textures = " + Display_Textures)  
    print("Display_Thematics = " + Display_Thematics)
    print("Solid_Color = " + Solid_Color)
    print("Transparency = " + Transparency)
    print("Upper_Floor_Height = " + Upper_Floor_Height)
    print("Ground_Floor_Height = " + Ground_Floor_Height)
    print("DisableMassDisplay = " + DisableMassDisplay)
    NIL
    
Roof -->
    # First check if this is the last floor.
    case floorIdx == nFloors - 1:
        case Roof_Type != "Flat":
            comp(f) {world.up : RoofNonFlat}
        case Roof_Type == "Flat" && Photovoltaic_Roof.Solar_Panels_On:
            comp(f) {world.up : Photovoltaic_Roof.PVElements }
            # Note: Currently roof must be flat for Solar Panels.
            # FIX: Add solar panels to other roof types, next version. 
        else: NIL
    else: NIL
     

RoofNonFlat -->
    case Roof_Type == "HipFlat" && floorIdx == nFloors - 1 :
        roofHip(Sloped_Roof_Angle, Roof_Overhang, true)
        split(y) {Hip_Roof_Height :
            comp(f) {world.up : HipFlatRoof   
            | world.down : NIL 
            | aslant: HipFlatRoof}
        | ~1 : NIL}
    case Roof_Type == "Gable" && floorIdx == nFloors - 1 :
        roofGable(Sloped_Roof_Angle, Roof_Overhang, Roof_Overhang, true)
        comp(f) {aslant: RoofTextureSloped | vertical: WallSide	}
    else : NIL





HipFlatRoof -->
    case geometry.angle(maxSlope) > 10 && geometry.angle(maxSlope) < 88:
        RoofTextureSloped
    else:
        offset(-0.2) 
        comp(f) {
            border : X.
            | inside :
                extrude(-0.5)
                comp(f) {world.up : NIL
                | side: AddDirtMap
                | world.down: RoofTexture
            }
        }
    
RoofTextureSloped -->
    case texturingOn:
        alignScopeToGeometry(yUp, any, world.lowest)
        setupProjection(0,scope.xz, ~roofTextureSize/Roof_Texture_Scale, ~roofTextureSize/Roof_Texture_Scale)
        projectUV(0)
        texture(assetDirectory + "SlopedRoof/" + Sloped_Roof_Texture + ".jpg")
        RoofTextureRainfall	
    else: 
        RoofTextureRainfall

RoofTextureRainfall -->
    envReports.ReportPeakDischarge(envReports.materialPavementAndRooftops)
    RoofTextureRainfallStep2
    
RoofTextureRainfallStep2 -->
    case peakRunoffDisplayOn:
        color(envReports.colorByPerviousMaterial(envReports.materialPavementAndRooftops))
    else: X. 
    



const roofTextureSize = rand(4,12)

# FIX, this was for demonstration of story-based thematic display.
# As it was a quick solution for demo, it was hooked to random data.
# Code is left here since it is part of "random" color code in mass coloring.
# Clean this up later.

# Temp water consumption coloration.
const thisBuildingWater = rand(0.1, 0.9)
thisFloorsVariation = rand(-0.3,0.3)
putWithinRange(number) =
    case number < 0 : 0
    case number > 1 : 1
    else : number







## Floor ################################

getWallBottom 		= case floorIdx > 0: Cill_Height else: 0
getWinHeight		= case floorIdx > 0: Win_Height  else: Win_Height + Cill_Height + Ground_Floor_Height - Upper_Floor_Height
adjustWallHeight 	= 
    case Roof_Type == "Flat":
        case floorIdx==nFloors-1: scope.sy+Parapet_Height else: scope.sy
    else: scope.sy

#print(
#Win_Height + Cill_Height + Ground_Floor_Height - Upper_Floor_Height

FloorSide -->
    setupProjection(0, scope.xy, ~4, ~4, 0, 0, 1)
    # Adjust wall height to add parapet height to wall height of top floor.
    s('1,adjustWallHeight,'1)
    # Split wall into WallBottom, FloorPattern, and TopWall
    /*  
    print("============================")
    print("Upper_Floor_Height = " + Upper_Floor_Height)
    print("Ground_Floor_Height = " + Ground_Floor_Height)
    print("----------------------------")
        
    print("Win_Height = " + Win_Height)
    print("Cill_Height = " + Cill_Height)
    print("Ground_Floor_Height = " + Ground_Floor_Height)
    print("Upper_Floor_Height = " + Upper_Floor_Height)
    print("floorIdx = " + floorIdx)
    print("nFloors = " + nFloors)
    print("getWallBottom = " + getWallBottom)
    print("getWinHeight = " + getWinHeight)
    */
    split(y){ getWallBottom: Wall | getWinHeight: FloorPattern | ~1: Wall }

FloorPattern --> 
    case front && Ground_Floor_Shopfront && floorIdx == 0:
        BalconyPattern 		 
    case front && Balconies=="On Front" || rear && Balconies=="On Rear":
        BalconyPattern 		 
    case Side_Pattern != "Same as Main":
        case left || right: SidePattern else: MainPattern
    else: 
        MainPattern

## Main Pattern --------------------

MainPattern --> 
    case adjacentToBalconiesOnRight:
        split(x){ ~1: MainPatternDispatcher | windowsOnCorners*walW: Wall | balconyOnCorners*(balW+walW)/2: Balcony }
    case adjacentToBalconiesOnLeft:
        split(x){ balconyOnCorners*(balW+walW)/2: Balcony | windowsOnCorners*walW: Wall | ~1: MainPatternDispatcher }
    else:
        MainPatternDispatcher
        
MainPatternDispatcher -->
    case mainPattern == "[WO]*W": 
        split(x){ { ~walW: Wall | winW: Tile }* | ~walW: Wall }
    case mainPattern == "o[WO]*Wo":
        split(x){ winW/2+walW/2: Tile | { ~walW: Wall | winW: Tile }* | ~walW: Wall | winW/2+walW/2: Tile }
    case mainPattern == "O[Wo]*WO": #hmm
        split(x){ winW+walW/2: Tile | { ~walW: Wall | panW: Tile }* | ~walW: Wall | winW+walW/2: Tile }
    case mainPattern == "wo[WO]*Wow":
        split(x){ ~walW/2: Wall | panW: Tile | { ~walW: Wall | winW: Tile }* | ~walW: Wall | panW: Tile | ~walW/2: Wall }
    case mainPattern == "Wo[WO]*WoW":
        split(x){ ~walW: Wall | panW: Tile | { ~walW: Wall | winW: Tile }* | ~walW: Wall | panW: Tile | ~walW: Wall }
    case mainPattern == "WO[Wo]*WOW":
        split(x){ ~walW: Wall | winW-walW/2: Tile | { ~walW: Wall | panW: Tile }* | ~walW: Wall | winW-walW/2: Tile | ~walW: Wall }
    case mainPattern == "Rhythm1":
        split(x){ ~walW/2: Wall | { winW+walW: Tile }* | ~walW/2: Wall }
    else:
        Wall

## Side Pattern --------------------

SidePattern -->
    case adjacentToBalconiesOnRight:
        case scope.sx < winW+walW:
            case balconyPattern == "b[WB]*Wb": Balcony else: Wall
        else:
            split(x){ windowsOnCorners*(winW+walW)/2: Tile | ~1: SidePatternDispatcher | balconyOnCorners*(balW+walW)/2: Balcony }
    case adjacentToBalconiesOnLeft:
        case scope.sx < winW+walW:
            case balconyPattern == "b[WB]*Wb": Balcony else: Wall
        else:
            split(x){ balconyOnCorners*(balW+walW)/2: Balcony | ~1: SidePatternDispatcher | windowsOnCorners*(winW+walW)/2: Tile }
    else:
        split(x){ windowsOnCorners*(winW+walW)/2: Tile | ~1: SidePatternDispatcher | windowsOnCorners*(winW+walW)/2: Tile }


SidePatternDispatcher -->
    case Side_Pattern == "WOW":
        split(x){ ~1: Wall | winW: Win | ~1: Wall }
    case Side_Pattern == "WoW":
        split(x){ ~1: Wall | panW: Win | ~1: Wall }
    case Side_Pattern == "wOWOw":
        split(x){ walW: Wall | winW: Win | ~1: Wall | winW: Win | walW: Wall }
    case Side_Pattern == "woWow":
        split(x){ walW: Wall | panW: Win | ~1: Wall | panW: Win | walW: Wall }
    case Side_Pattern == "woW":
        case right: split(x){ walW: Wall | panW: Win | ~1: Wall }
        else      : split(x){ ~1: Wall | panW: Win | walW: Wall }
    case Side_Pattern == "wOwoW":
        case right: split(x){ walW: Wall | winW: Win | walW: Wall | panW: Win | ~1: Wall }
        else      : split(x){ ~1: Wall | panW: Win | walW: Wall | winW: Win | walW: Wall }
    case Side_Pattern == "w[oW]*w":
        case right&&even(floorIdx) || left&&uneven(floorIdx): split(x){ walW: Wall | { panW: Win | ~walW*4: Wall }* }
        else                                                : split(x){ { ~walW*4: Wall | panW: Win }* | walW: Wall }
    else:
        Wall
        
## Balcony Pattern --------------------

BalconyPattern -->
    case balconyPattern == "[WB]*W":
        case scope.sx < winW+walW:
            Wall 
        else:
            split(x){ { walW: Wall | ~balW: Balcony }* | walW: Wall }
    case balconyPattern == "b[WB]*Wb":
        case scope.sx < winW+walW:
            Balcony 
        else:
            split(x){ ~(balW+walW)/2: Balcony | { walW: Wall | ~balW: Balcony }* | walW: Wall | ~(balW+walW)/2: Balcony }
    else:
        Balcony


## Tile ################################

Tile -->
    set(tileIdx,split.index) set(nTiles,split.total)
    TileDispatcher
    
TileDispatcher -->
    case mainPattern == "Rhythm1":
        case even(floorIdx+tileIdx)	: split(x){ walW/2: Wall | ~winW/2: Win }* 
        else						: split(x){ ~winW/2: Win | walW/2: Wall }*
    else:
        Win
    //Rail 


## Balcony ################################


Balcony -->
    case scope.sx < winW+walW: Balcony(0,0) else:
        set(tileIdx,split.index) set(nTiles,split.total)
        Balcony(glassBalconyLeft,glassBalconyRight)

Balcony(winWidthLeft,winWidthRight) -->
    case lowLOD:
        split(x){ winWidthLeft : Win(0) 
                | ~1 : Rail s(scope.sx-winSetback,'1,-Balcony_Depth+Wall_Thickness) t(winSetback/2,0,0) i("builtin:cube") comp(f){ front: NIL | side: Win(0) }
                | winWidthRight: Win(0) }
    else:
        Rail 
        Awning
        t(0,0,-winSetback)
        split(x){ winWidthLeft : WinOmitAwning 
                | ~1 : s(scope.sx-winSetback,'1,-Balcony_Depth+Wall_Thickness) t(winSetback/2,0,0) i("builtin:cube") comp(f){ front: NIL | side: WinOmitAwning }
                | winWidthRight: WinOmitAwning }

WinOmitAwning -->
    set(awningAlreadyDone, true)
    Win(0)

## Windows ################################

@Hidden
attr awningAlreadyDone = false
    
Win -->
    case lowLOD:
        Win(0)
    else:	
        Win(winSetback)	
    
Win(dz) -->
    case lowLOD || Frame_Width <= 0: 
        t(0,0,-dz) trim 
        Glass
    else:
        # Send window shape to Awning, before framing and glass.
        Awning
        t(0,0,-dz) trim
        split(y){ Frame_Width : Frame 
                | ~1: split(x){ Frame_Width: Frame | { ~panW: t(0,0,-frameDepth/2) Glass | Frame_Width: Frame }* }
                | Frame_Width : Frame }


#############################################
# Redlands, Awnings

Awning -->
    case awningAlreadyDone : NIL
    else:
        case Show_Awnings_Ground && floorIdx == 0 && front :
            AwningDispatchGround 
        case Show_Awnings_Upper && floorIdx > 0 : 
            AwningDispatchUpper
        else : NIL


awningExtension = 
    case floorIdx == 0 : Awning_Extension_Ground 
    else : Awning_Extension_Upper

awningHeight = 
    case floorIdx == 0 : Awning_Height_Ground 
    else : Awning_Height_Upper

AwningDispatchGround -->
    case Awning_Type_Ground == "Canvas" : AwningCanvas
    case Awning_Type_Ground == "Box" : AwningBox
    case Awning_Type_Ground == "Esri-Q" : AwningEsriQ
    else : AwningCanvas # Default.

AwningDispatchUpper -->
    case Awning_Type_Upper == "Canvas" : AwningCanvas
    case Awning_Type_Upper == "Box" : AwningBox
    case Awning_Type_Upper == "Esri-Q" : AwningEsriQ
    else : AwningCanvas # Default.


const canvasEdgeHeight = 0.2
AwningCanvas -->
    extrude(awningExtension)
    comp(f) {world.up :
    roofShed(45, 2)
    s('1,awningHeight, '1)
    translate(rel, world, 0, -scope.sy, 0)
    comp(f) {world.down : AwningCanvasEdge | front: NIL | all: AwningCanvasTexture}
    }

AwningCanvasEdge -->
    extrude(canvasEdgeHeight) 
    comp(f) {horizontal: NIL | front: NIL | all: AwningCanvasTexture}


AwningCanvasTexture -->
        color(case coloringOn: Awning_Color else: "") 
        AddDirtMap

AwningBox -->
    case coloringOn: 
        color(Awning_Color)
        AwningBoxStep2
    else:
        AwningBoxStep2
        
AwningBoxStep2 -->
    split(y) {~1 : NIL | awningHeight : 
        extrude(awningExtension)
        comp(f) {world.up: 
                offset(-0.05) comp(f) {border: 
                AwningBoxEdge.
                | inside:
                translate(rel, world, 0, -awningHeight/2, 0)
                AddDirtMap }
                | world.down: NIL
                | all:
                AwningBoxTexture
        }
    }
    
AwningBoxTexture -->
    case texturingOn: 
        AddDirtMap
    else:
        AddDirtMap


bothFramesHeight = 0.5588
shadeFrameHeight = 0.1524
shadeFrameExtension = 1.524
shadeFrameThickness = 0.02
shadeBladeThickness = 0.02 
shadeBladeCount = 5

AwningEsriQ -->
    split(y) {~1 : NIL | shadeFrameHeight : ShadeFrameLower | bothFramesHeight - (2*shadeFrameHeight) : NIL
        |  shadeFrameHeight : ShadeFrameUpper }

ShadeFrameLower -->
    extrude(awningExtension)
    comp(f) {left: 	ShadeFrameThickness | right: ShadeFrameThickness | top: ShadeBlades(1,shadeBladeCount) }
    
ShadeBlades(index, n) -->
    case index <= n :
        ShadeBlade(index)
        ShadeBlades(index + 1, n)
    else: NIL
        
ShadeBlade(index) -->
    t(0,0, -((shadeFrameHeight/2) + (shadeFrameHeight * index)))
    r(scopeCenter,-45,0,0)
    ShadeBladeLOD

ShadeBladeLOD -->
    case highLOD :
        extrude(shadeBladeThickness)	
        ShadeFrameTexture
    else :
        ShadeFrameTexture
        
ShadeFrameUpper -->
    extrude(awningExtension - (bothFramesHeight - shadeFrameHeight))
    comp(f) {left: 	ShadeFrameThickness | right: ShadeFrameThickness | top: ShadeBlades(1,shadeBladeCount) }

ShadeFrameThickness -->
    case highLOD :
        extrude(shadeFrameThickness)
        ShadeFrameTexture
    else :
        ShadeFrameTexture

ShadeFrameTexture -->
    case coloringOn:
        color(0.15,0.15,0.15)
    else: X.




###########################################################
# Original Code

Frame --> 
    case frameDepth > 0:
        extrude(-frameDepth) trim
        FrameStep2
    else:
        FrameStep2

FrameStep2 -->
    case coloringOn:
        color(Frame_Color)
    else:
        X.

        
        
Glass -->
    case coloringOn:
        case Glass_Material == "CE Blue":
            color(0.7,0.75,1)
            set(material.ambient.r,0) set(material.ambient.g,0) set(material.ambient.b,1)
            set(material.specular.r,0.8) set(material.specular.g,0.8) set(material.specular.b,0.8)
            set(material.reflectivity,0.8) set(material.shininess,50) set(material.opacity,0.6)	GlassPanels
        case Glass_Material == "CE Dark Blue":
            color(0.2,0.2,0.25)
            set(material.ambient.r,0) set(material.ambient.g,0) set(material.ambient.b,0.1)
            set(material.specular.r,0.8) set(material.specular.g,0.8) set(material.specular.b,0.8)
            set(material.reflectivity,0.6) set(material.shininess,50) set(material.opacity,0.8)	GlassPanels
        case Glass_Material == "CE Green":
            color(0.4,0.5,0.4)
            set(material.ambient.r,0) set(material.ambient.g,0.2) set(material.ambient.b,0.05)
            set(material.specular.r,0.8) set(material.specular.g,0.8) set(material.specular.b,0.8)
            set(material.reflectivity,0.8) set(material.shininess,50) set(material.opacity,0.6)	GlassPanels
        case Glass_Material == "CE Brown":
            color(0.3,0.25,0.2)
            set(material.ambient.r,0.2) set(material.ambient.g,0.1) set(material.ambient.b,0)
            set(material.specular.r,0.8) set(material.specular.g,0.8) set(material.specular.b,0.8)
            set(material.reflectivity,0.8) set(material.shininess,50) set(material.opacity,0.6)	GlassPanels
        case Glass_Material == "CE Black":
            color(0.1,0.1,0.1)
            set(material.specular.r,0.8) set(material.specular.g,0.8) set(material.specular.b,0.8)
            set(material.reflectivity,0.7) set(material.shininess,50) set(material.opacity,0.8)	GlassPanels
        case Glass_Material == "iRay Glass":
            color(0.35,0.37,0.5)
     		set(material.specular.r,0.8) set(material.specular.g,0.8) set(material.specular.b,0.8)
      		set(material.reflectivity,0.8) set(material.shininess,128) set(material.opacity,0.8) GlassPanels
        else:
            color(1,1,1)
            set(material.opacity,0.8) GlassPanels
    else: X.

GlassPanels -->
    case Panels_Generate == "None":
        Glass.
    else:
        Panels("Glass")
        

## Wall ################################

Wall -->
    case lowLOD: 
        WallSide
    else:
        Wall(Wall_Thickness)

Wall(thickness) -->
    s('1,'1,thickness) t(0,0,'-1) 
    i("builtin:cube") 
    comp(f){ side = WallSide | all = WallSideProj}

WallSideProj -->
    setupProjection(0, scope.xy, defaultWallTexSize * Wall_Texture_Scaler, defaultWallTexSize * Wall_Texture_Scaler)
    WallSide

WallSide -->
    case texturingOn:
        setupProjection(0, scope.xy, defaultWallTexSize * Wall_Texture_Scaler, defaultWallTexSize * Wall_Texture_Scaler)
        projectUV(0) 
        texture(assetDirectory + "WallTextures/" + Wall_Texture + ".jpg")
        WallSidePart2
    else: WallSidePart2
    
defaultWallTexSize = 4


WallSidePart2 -->
    case coloringOn:
        color(Wall_Color)  
        WallPanels
    else:
        WallPanels


WallPanels -->
    case Panels_Generate == "None":
        Wall.
    else:
        Panels("Wall")


## Railing ################################
        
Rail --> 
    case floorIdx == 0 || scope.sx < panW*1.5:
        NIL
    else:
        t(0,0,-winSetback*0.5) split(y){ Railing_Height: trim RailLoop(20) } NIL	
        
RailLoop(n) -->
    case n > 0: RailLoop(n-1) else: Glass # just a gimmick for CE: draw the railing at last (so that the alpha looks good)


## Slab ################################



Slab -->
    case lowLOD:
        comp(f){ top: 
        RoofTexture #FIX. This is wrong. Was a temp fix.
        }
    else:
        split(y){ 0.05: NIL | ~1: comp(f){ bottom: Flooring | top: Ceiling } | Slab_Thickness: NIL }	


RoofTexture -->
    case texturingOn:
        setupProjection(0, scope.xy, scope.sx, scope.sy) projectUV(0)
        texture(assetDirectory + "FlatRoof/" + Flat_Roof_Texture + ".jpg")	
        RoofTextureStep2
    else:
        RoofTextureStep2


RoofTextureStep2 -->
    # FIX: I'm using the highest permeability surface here for Green Roof, until we have collection systems.
    case flatRoofIsPermeable:
        envReports.ReportPeakDischarge(envReports.materialUnderTrees)
        RoofTextureStep3
    else: 
        envReports.ReportPeakDischarge(envReports.materialPavementAndRooftops)
        RoofTextureStep3

# FIX: This should also take into account possibilities for higher rainwater absorbtions for collection systems.
const flatRoofIsPermeable = Flat_Roof_Texture == "Green Roof"


RoofTextureStep3 -->
    case peakRunoffDisplayOn:
        # FIX: I'm using the highest permeability surface here for Green Roof, until we have collection systems.
        case flatRoofIsPermeable:
            color(envReports.colorByPerviousMaterial(envReports.materialUnderTrees)) X.
        else:
            color(envReports.colorByPerviousMaterial(envReports.materialPavementAndRooftops)) X.
    else: X. 
         



Ceiling -->
    offset(-Wall_Thickness,inside) extrude(Slab_Thickness-0.05)
    comp(f){ top:
    RoofTexture
    | all = Ceiling. }

Flooring -->
    offset(-Wall_Thickness,inside) extrude(0.05)
    comp(f){ top: WallSideProj | all = FlooringTexture }

FlooringTexture -->
    case coloringOn:
        color("#333339")
    else: NIL


RoofPanels --> 
    case Panels_Generate != "All":
        Roof.
    else:
        Panels("Roof")


## Panels ################################

Panels(type) -->	
    split(x,noAdjust){ ~Panel_Size: split(y){ ~Panel_Size: Panel(type) }* }*			# THE split

Panel(type) -->
    case geometry.area() < 0.02:
        NIL
    else:
        alignScopeToGeometry(zUp,0,world.lowest)
        texture("")
        #report("ID",uid) 																		# switching off texture
        #report("Type",type) report("Area",geometry.area)
        #report("Local Orientation",getLocalDir) report("World Orientation",getWorldDir) 
        Panel.
        #[ s(0,0,0) center(xyz) t(0,0,Panel_Sampling_Point_Distance) 
        # comp(v){ 0: report("Z",scope.elevation) SamplingPoint. } ]


##########################################

dirtmapTexture = fileRandom("/ESRI.lib/assets/General/Dirtmap/dirtmap_*.jpg")

AddDirtMap -->
    case texturingOn:
        alignScopeToGeometry(yUp, any, world.lowest)
        setupProjection(2,scope.xz,'1,'1)
        projectUV(2)
        rotateScope(2,rand(360),0)
        set(material.dirtmap, dirtmapTexture)
    else: X.

##########################################
# Modification of ColorRamp.CGA:

Color1 = Mass_Color_1
Color2 = Mass_Color_2

convertHexToR(hex) = convertHexToDecimal(substring(hex,1,3)) / 255 
convertHexToG(hex) = convertHexToDecimal(substring(hex,3,5)) / 255
convertHexToB(hex) = convertHexToDecimal(substring(hex,5,7)) / 255
convertHexToDecimal(hex) = (digitValue(substring(hex,0,1)) * 16) +  digitValue(substring(hex,1,2))
digitValue(hex) = 
    case hex == "0" : 0	
    case hex == "1" : 1
    case hex == "2" : 2
    case hex == "3" : 3
    case hex == "4" : 4
    case hex == "5" : 5
    case hex == "6" : 6
    case hex == "7" : 7
    case hex == "8" : 8
    case hex == "9" : 9
    case hex == "A" : 10
    case hex == "B" : 11
    case hex == "C" : 12
    case hex == "D" : 13
    case hex == "E" : 14
    else : 15 # "F"


R1 = convertHexToR(Color1)
G1 = convertHexToG(Color1) 
B1 = convertHexToB(Color1)
R2 = convertHexToR(Color2)
G2 = convertHexToG(Color2)
B2 = convertHexToB(Color2)

cR(Ramp_Control) = R1 + ((R2 - R1) * Ramp_Control)
cG(Ramp_Control) = G1 + ((G2 - G1) * Ramp_Control)
cB(Ramp_Control) = B1 + ((B2 - B1) * Ramp_Control)

ColorRamp(c) --> color(cR(c),cG(c),cB(c))


DisableCGAWarnings -->
    # This is rule exists only to stop the CGA warnings from showing; it has no use, otherwise.
    # The below lines are just calling all of the "unused rules" so they do not flag as unused.
    FloorMass(0,1)	


################################################################
## STYLES
##



style Redlands_Mixed_Use_1
attr Generate_Facade = true
attr Win_Width = 3.0
attr Wall_Width = 0.67
attr Panel_Width = 1.2
attr Wall_Texture = "Stucco Redlands Red"
attr Wall_Thickness = 0.7
attr Awning_Type_Upper = "None"
attr Awning_Color = "#408080"


style Redlands_Mixed_Use_Green_Building_1
attr Generate_Facade = true
attr Level_of_Detail = "Medium"
attr Mass_Display = "Gradient-Up"
attr Main_Pattern_A = "[WO]*W"
attr Main_Pattern_B = "Rhythm1"
attr Win_Width = 3.0
attr Win_Position = "Wall Center"
attr Frame_Color = "#FFFFFF"
attr Glass_Material = "iRay Glass"
attr Wall_Texture = "Brick Brown No Mortar Running Bond"
attr Awning_Type_Ground = "Shed"
attr Awning_Type_Upper = "Esri-Q"
attr Awning_Color = "#FF8080"
attr Roof_Type = "Flat"
attr Sloped_Roof_Texture = "Shingle Black"
attr Flat_Roof_Texture = "Green Roof"
attr Roof_Texture_Scale = 0.1



style Redlands_Mixed_Use_2
attr Generate_Facade = true
attr Level_of_Detail = "Medium"
attr Mass_Display = "Gradient-Up"
attr Main_Pattern_A = "[WO]*W"
attr Main_Pattern_B = "[WO]*W"
attr Side_Pattern = "Same as Main"
attr Balconies = "On Rear"
attr Balcony_Pattern = "[WB]*W"
attr Win_Width = 5.0
attr Wall_Width = 1.0
attr Panel_Width = 1.5
attr Frame_Width = 0.17
attr Frame_Color = "#FFFFFF"
attr Glass_Material = "iRay Glass"
attr Wall_Texture = "Brick Red Running Bond"
attr Wall_Color = "#C0C0C0"
attr Awning_Type_Ground = "Shed"
attr Awning_Color = "#8080C0"
attr Roof_Type = "Gable"
attr Sloped_Roof_Texture = "Shingle Black"
attr Flat_Roof_Texture = "Green Roof"
attr Roof_Texture_Scale = 2.07
attr Hip_Roof_Height = 1.86
attr Roof_Overhang = 0.01
attr Sloped_Roof_Angle = 13.43



style Redlands_Mixed_Use_3
attr Generate_Facade = true
attr Win_Width = 3.0
attr Wall_Width = 0.67
attr Panel_Width = 1.2
attr Wall_Texture = "Brick Red No Mortar Running Bond"
attr Wall_Texture_Scaler = 0.5
attr Wall_Thickness = 0.7
attr Awning_Type_Upper = "None"
attr Awning_Color = "#0080C0"
attr Sloped_Roof_Texture = "Standard Shingle"
attr Flat_Roof_Texture = "Flat Metal 1"
attr Roof_Texture_Scale = 4.0
attr Sloped_Roof_Angle = 20.0



style Redlands_Mixed_Use_Eco_2
attr Generate_Facade = true
attr Level_of_Detail = "Medium"
attr Mass_Display = "Gradient-Up"
attr Balconies = "On Rear"
attr Wall_Texture = "Brick Varied Brown Running Bond"
attr Awning_Color = "#FFFFC8"
attr Sloped_Roof_Texture = "GAF Elk WeatherMax Charcoal"
attr Roof_Overhang = 0.5




style Redlands_Residential_1
attr Generate_Facade = true
attr Level_of_Detail = "Medium"
attr Mass_Display = "Gradient-Up"
attr Balconies = "On Front"
attr Ground_Floor_Shopfront = true
attr Win_Width = 3.0
attr Wall_Width = 1.3
attr Balcony_Width = 5.0
attr Glass_Material = "iRay Glass"
attr Wall_Texture = "Brick Brown No Mortar Running Bond"
attr Wall_Color = "#C1C1C1"
attr Awning_Type_Ground = "Shed"
attr Awning_Type_Upper = "Esri-Q"
attr Awning_Color = "#C0C0C0"
attr Sloped_Roof_Texture = "Standard Shingle"
attr Flat_Roof_Texture = "Green Roof"



style Redlands_Residential_2
attr Generate_Facade = true
attr Level_of_Detail = "Medium"
attr Mass_Display = "Gradient-Up"
attr Main_Pattern_B = "[WO]*W"
attr Balconies = "None"
attr Win_Width = 3.0
attr Wall_Width = 1.0
attr Win_Position = "Inside Flush"
attr Panel_Width = 1.5
attr Frame_Width = 0.17
attr Frame_Color = "#C0C0C0"
attr Glass_Material = "iRay Glass"
attr Wall_Texture = "Brick Brown No Mortar Rough Running Bond"
attr Wall_Color = "#C0C0C0"
attr Awning_Type_Ground = "Shed"
attr Awning_Color = "#408080"
attr Roof_Type = "Gable"
attr Sloped_Roof_Texture = "Shingle Black"
attr Roof_Texture_Scale = 2.07
attr Roof_Overhang = 0.01
attr Sloped_Roof_Angle = 17.16



style Redlands_Office_Eco_1
attr Generate_Facade = true
attr Level_of_Detail = "Medium"
attr Mass_Display = "Gradient-Up"
attr Main_Pattern_A = "[WO]*W"
attr Balconies = "On Front"
attr Win_Width = 3.0
attr Balcony_Width = 5.0
attr Win_Position = "Inside Flush"
attr Frame_Color = "#FFFFFF"
attr Glass_Material = "iRay Glass"
attr Wall_Texture = "Stucco Redlands Brown"
attr Wall_Texture_Scaler = 2.0
attr Awning_Type_Ground = "Shed"
attr Awning_Type_Upper = "Esri-Q"
attr Awning_Color = "#808080"
attr Roof_Type = "Flat"
attr Sloped_Roof_Texture = "Standard Dura Shingle"
attr Flat_Roof_Texture = "Green Roof"
attr Roof_Texture_Scale = 0.1
attr Roof_Overhang = 1.0



style Redlands_Office_1
attr Generate_Facade = true
attr Level_of_Detail = "Medium"
attr Mass_Display = "Gradient-Up"
attr Main_Pattern_A = "[WO]*W"
attr Balconies = "On Front"
attr Win_Width = 3.0
attr Balcony_Width = 5.0
attr Win_Position = "Inside Flush"
attr Frame_Color = "#FFFFFF"
attr Glass_Material = "iRay Glass"
attr Wall_Texture = "Stucco Redlands Brown"
attr Wall_Texture_Scaler = 2.0
attr Awning_Type_Ground = "Shed"
attr Awning_Type_Upper = "Esri-Q"
attr Awning_Color = "#808080"
attr Roof_Type = "Gable"
attr Sloped_Roof_Texture = "Standard Dura Shingle"
attr Flat_Roof_Texture = "Green Roof"
attr Roof_Texture_Scale = 0.1
attr Roof_Overhang = 0.1
attr Sloped_Roof_Angle = 20.0



style Redlands_Mixed_Use_Green_Building
attr Generate_Facade = true
attr Level_of_Detail = "Medium"
attr Mass_Display = "Gradient-Up"
attr Main_Pattern_A = "[WO]*W"
attr Main_Pattern_B = "[WO]*W"
attr Win_Width = 3.0
attr Win_Position = "Wall Center"
attr Frame_Color = "#FFFFFF"
attr Glass_Material = "iRay Glass"
attr Wall_Texture = "Brick Brown No Mortar Running Bond"
attr Parapet_Height = 0.0
attr Awning_Type_Ground = "Shed"
attr Awning_Type_Upper = "Esri-Q"
attr Awning_Color = "#FF8080"
attr Roof_Type = "Flat"
attr Sloped_Roof_Texture = "Shingle Black"
attr Flat_Roof_Texture = "Green Roof"
attr Roof_Texture_Scale = 0.1


style Redlands_Residential_3
attr Generate_Facade = true
attr Level_of_Detail = "Medium"
attr Mass_Display = "Gradient-Up"
attr Balconies = "On Front"
attr Win_Width = 3.0
attr Balcony_Width = 5.0
attr Panel_Width = 1.0
attr Frame_Color = "#FFFFFF"
attr Glass_Material = "iRay Glass"
attr Wall_Texture = "Brick Red No Mortar Running Bond"
attr Wall_Texture_Scaler = 0.5
attr Awning_Type_Ground = "Shed"
attr Awning_Type_Upper = "Esri-Q"
attr Awning_Extension_Upper = 0.57
attr Awning_Color = "#804040"
attr Roof_Type = "Gable"
attr Sloped_Roof_Texture = "Shingle Black"
attr Roof_Overhang = 0.01


style Redlands_Residential_4
attr Generate_Facade = true
attr Level_of_Detail = "Medium"
attr Mass_Display = "Gradient-Up"
attr Balconies = "None"
attr Frame_Color = "#FFFFFF"
attr Glass_Material = "iRay Glass"
attr Wall_Texture = "Brick Brown Running Bond"
attr Wall_Texture_Scaler = 0.5
attr Awning_Type_Ground = "Shed"
attr Awning_Extension_Upper = 0.8
attr Awning_Color = "#B871FF"


style Redlands_Office_2
attr Generate_Facade = true
attr Level_of_Detail = "Medium"
attr Mass_Display = "Gradient-Up"
attr Main_Pattern_A = "[WO]*W"
attr Balconies = "On Front"
attr Win_Width = 3.0
attr Cill_Height = 0.53
attr Wall_Width = 1.0
attr Balcony_Width = 5.0
attr Win_Position = "Inside Flush"
attr Frame_Color = "#FFFFFF"
attr Glass_Material = "iRay Glass"
attr Wall_Texture = "Stucco Redlands White"
attr Wall_Texture_Scaler = 0.55
attr Awning_Type_Ground = "Shed"
attr Awning_Type_Upper = "Esri-Q"
attr Awning_Color = "#808080"
attr Roof_Type = "Gable"
attr Sloped_Roof_Texture = "Standard Dura Shingle"
attr Flat_Roof_Texture = "Green Roof"
attr Roof_Texture_Scale = 2.03
attr Roof_Overhang = 0.1
attr Sloped_Roof_Angle = 20.0


style Redlands_Residential_5
attr Generate_Facade = true
attr Level_of_Detail = "Medium"
attr Mass_Display = "Gradient-Up"
attr Balconies = "None"
attr Ground_Floor_Shopfront = false
attr Win_Width = 2.0
attr Frame_Color = "#FFFFFF"
attr Glass_Material = "iRay Glass"
attr Wall_Texture = "Brick Varied Brown Running Bond"
attr Wall_Texture_Scaler = 0.5
attr Awning_Type_Ground = "None"
attr Awning_Type_Upper = "None"
attr Awning_Extension_Upper = 0.8
attr Awning_Color = "#B871FF"

 

Building Performance.cga

 

/**
 * File:    Building Performance.cga
 * Created: 10 May 2013 20:02:51 GMT
 * Author:  Esri
 */

version "2017.1"


@Group ("TARGET ECO-CRITERIA",1) @Order(1) @Range(min=0, max=1)
attr Percent_Reduction_Water_Consumption = 0

@Group ("TARGET ECO-CRITERIA") @Order(4) @Range(min=0, max=1)
attr Percent_Reduction_Electric_Energy_Consumption = 0

@Group ("TARGET ECO-CRITERIA") @Order(5) @Range(min=0, max=1)
attr Percent_Reduction_Heating_Energy_Consumption = 0

@Group ("TARGET ECO-CRITERIA") @Order(7) @Range(min=0, max=1)
attr Percent_Reduction_Domestic_Waste = 0

@Group ("TARGET ECO-CRITERIA") @Order(8) @Range(min=0, max=1)
attr Percent_Reduction_Construction_Waste = 0

@Group ("TARGET ECO-CRITERIA") @Order(10) @Range(min=0, max=1)
attr Percent_Greywater_Recycled = 0


@Group("BUILDING COST ESTIMATION",2) @Order(0)
attr Cost_Per_M2 = 1400



style LEED_Certified
attr Percent_Reduction_Water_Consumption = 0.3
attr Percent_Reduction_Electric_Energy_Consumption = 0.3
attr Percent_Reduction_Heating_Energy_Consumption = 0.3
attr Percent_Reduction_Domestic_Waste = 0.3
attr Percent_Reduction_Construction_Waste = 0.3
attr Percent_Greywater_Recycled = 0.3
attr Cost_Per_M2 = 1600.0


style LEED_Silver
attr Percent_Reduction_Water_Consumption = 0.4
attr Percent_Reduction_Electric_Energy_Consumption = 0.4
attr Percent_Reduction_Heating_Energy_Consumption = 0.4
attr Percent_Reduction_Domestic_Waste = 0.4
attr Percent_Reduction_Construction_Waste = 0.4
attr Percent_Greywater_Recycled = 0.4
attr Cost_Per_M2 = 1800.0


style LEED_Gold
attr Percent_Reduction_Water_Consumption = 0.5
attr Percent_Reduction_Electric_Energy_Consumption = 0.5
attr Percent_Reduction_Heating_Energy_Consumption = 0.5
attr Percent_Reduction_Domestic_Waste = 0.5
attr Percent_Reduction_Construction_Waste = 0.5
attr Percent_Greywater_Recycled = 0.5
attr Cost_Per_M2 = 2000.0


style LEED_Platinum
attr Percent_Reduction_Water_Consumption = 0.7
attr Percent_Reduction_Electric_Energy_Consumption = 0.7
attr Percent_Reduction_Heating_Energy_Consumption = 0.7
attr Percent_Reduction_Domestic_Waste = 0.7
attr Percent_Reduction_Construction_Waste = 0.7
attr Percent_Greywater_Recycled = 0.7
attr Cost_Per_M2 = 2500.0

 

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。