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