DataCommercialBuildings
商业建筑单体数据版(CE-UE)
程序用途:
商业建筑单体生成工具
程序功能:
DataCommercialBuildings-Max1.1-CityEngine2021(中文)
- 不依赖数据可以调节建筑大小
- 可控制楼体样式、楼层样式、窗户样式以及阳台样式的位置
- 模型分为三个精度等级
DataCommercialBuildings-Max1.0-CityEngine2021(英文)
- 不依赖数据可以调节建筑大小
- 可控制楼体样式、楼层样式、窗户样式以及阳台样式的位置
- 模型分为三个精度等级
程序源码
购买后即可同时查看核心源码
version "2021.1" @Group("CreateUrban",0) attr Website = "https://cga.createurban.cn" attr Version = "DataCommercialBuildings-Max1.0-CityEngine2021" ################# ##### 属性参数 ################# ## Model Options @Group("Model Lod",0) @Order(1) attr ShowModel = false @Group("Model Lod",0) @Order(2) @Enum("High","Medium","Low") attr ModelLevel = "Low" @Group("Model Lod",0) @Order(3) @Hidden attr Transparent = false ## Facade Design @Group("FacadeStyle",5) @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 Odd_floor_type = "[WO]*W" #奇数楼层类型 @Group("FacadeStyle",5) @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 Even_floor_type = "[WO]*W" #偶数楼层类型 @Group("FacadeStyle",5) @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 SideType = "Same as Main" #建筑侧面类型 @Group("FacadeStyle",5) @Order(5) @Enum("None","On Front","On Rear") attr BalconiesWindows = "None" #窗户与阳台控制 @Group("FacadeStyle",5) @Order(6) @Enum("[WB]*W","b[WB]*Wb","Alternating") //@Hidden attr BalconyType = "[WB]*W" #阳台类型 ## Main Parameters @Group("Main Parameters",2) @Order(1) @Range(min=5, max=15, restricted=false) @Distance @Hidden attr Win_Width = 4 @Group("Main Parameters") @Order(2) @Range(min=1, max=4, restricted=false) @Distance @Hidden attr Win_Height = Standard_Floor_Height - Cill_Height - Slab_Thickness # per default, the windows go up to the ceiling height @Group("Main Parameters") @Order(3) @Range(min=0, max=2, restricted=false) @Distance @Hidden attr Cill_Height = 0.3 @Group("Main Parameters") @Order(4) @Range(min=0, max=5, restricted=false) @Distance @Hidden attr Wall_Width = 2 @Group("Main Parameters") @Order(5) @Range(min=5, max=20, restricted=false) @Distance @Hidden attr Balcony_Width = 8 ## Windows @Group("Windows") @Order(0) @Enum("Wall Center","Inside Flush", "Outside Flush") @Hidden attr Win_Position = "Wall Center" @Group("Windows",3) @Order(1) @Range(min=0.7, max=2, restricted=false) @Distance @Hidden attr Panel_Width = 1 @Group("Windows") @Order(2) @Range(min=0, max=0.3, restricted=false) @Distance @Hidden attr Frame_Width = 0.1 @Group("Windows") @Order(3) @Range(min=0, max=0.6, restricted=false) @Distance @Hidden attr Frame_Depth = Frame_Width*2 @Group("Windows") @Order(4) @Color @Hidden attr Frame_Color = "#999999" @Group("Windows") @Order(5) @Enum("CE Blue","CE Dark Blue","CE Green","CE Brown","CE Black","iRay Glass") @Hidden attr Glass_Material = "CE Dark Blue" ## Walls @Group("Walls",4) @Order(1) @File @Hidden attr Wall_Texture = fileRandom("wall_textures/concrete/wall_concrete_*.jpg") @Group("Walls") @Order(2) @Color @Hidden attr Wall_Color ="#ffffff" @Group("Walls") @Order(3) @Range(min=0.2, max=0.7, restricted=false) @Distance @Hidden attr Wall_Thickness = 0.4 @Group("Walls") @Order(4) @Range(min=0.2, max=1, restricted=false) @Distance @Hidden attr Slab_Thickness = 0.7 @Group("Walls") @Order(5) @Range(min=0, max=1, restricted=false) @Distance @Hidden attr Parapet_Height = 0.4 ## Balconies @Group("Balconies",5) @Order(2) @Range(min=0, max=5, restricted=false) @Distance @Hidden attr Balcony_Depth = 2 @Group("Balconies") @Order(4) @Range(min=0.7, max=1.1, restricted=false) @Distance @Hidden attr Railing_Height = 1 ## Panels @Group("Panels",6) @Order(1) @Enum("None","On Sides", "All") @Description("Turn on to split the whole model into rectangular panels (usable e.g. for analysis)") @Hidden attr Panels_Generate = "None" @Group("Panels") @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") @Hidden attr Panel_Size = 5 @Group("Panels") @Order(3) @Range(min=0, max=3, restricted=false) @Distance @Description("Distance of the sampling point in front of the panel's center.") @Hidden 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 ## Hidden Attributes driven by Master Rule ######################## @Hidden attr Ground_Floor_Height = 5 @Hidden attr Standard_Floor_Height = 4 ################################################################ ## 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 = ModelLevel == "Low" const midLOD = ModelLevel == "Medium" const highLOD = ModelLevel == "High" ################################################################ ## FUNCTIONS ## getWallBottom = case floorIdx > 0: Cill_Height else: 0 getWinHeight = case floorIdx > 0: Win_Height else: Win_Height + Cill_Height + Ground_Floor_Height - Standard_Floor_Height adjustWallHeight = case floorIdx==nFloors-1: scope.sy+Parapet_Height else: scope.sy # pattern switching isConstant = Odd_floor_type=="o[WO]*Wo" || Even_floor_type=="o[WO]*Wo" || Odd_floor_type=="O[Wo]*WO" || Even_floor_type=="O[Wo]*WO" # patterns which need to go all around mainPattern = case front || rear || isConstant: case even(floorIdx): Odd_floor_type else: Even_floor_type # in case of an even floor, we take pattern A, otherwise pattern B else : case even(floorIdx): Even_floor_type else: Odd_floor_type # on the left and right we alternate the two patterns different balconyPattern = case BalconyType=="Alternating": case even(floorIdx): "[WB]*W" else: "b[WB]*Wb" else : BalconyType # 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&&BalconiesWindows=="On Front" || right&&BalconiesWindows=="On Rear" adjacentToBalconiesOnLeft = right&&BalconiesWindows=="On Front" || left&&BalconiesWindows=="On Rear" 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" ##1 Building Height ################################ @Group("Building Height",1) @Order(1) @Range(min=2, max=80, stepsize=1, restricted=false) //@Handle(shape=Envelope) attr FloorNumbles = 7 ##2 FloorStyle ################################ @Group("FloorStyle",2) @Order(3) @Enum("None","2 Stepbacks","2nd Floor","Top Floor","Increasing","Decreasing","Alternating","Random") attr SelectType = "None" @Order(4) @Range(min=0, max=10, restricted=false) @Distance //@Hidden attr OffsetDistance = 2 @Hidden attr Lot_Area = geometry.area @Hidden attr Elevation = scope.elevation getHeight(nFloors) = Ground_Floor_Height + (nFloors-1)*Standard_Floor_Height getFloorHeight(idx) = case idx == 0: Ground_Floor_Height else: Standard_Floor_Height const avgAptSize = 76.6 const spacePerEmployee_office = 23.2 const spacePerEmployee_retail = 46.5 ################################################################ ################################################################ ## #################RULES 执行规则 ############################### ################################################################ ################################################################ @StartRule @InPolygon Footprint --> Footprint(0,1) # default case Footprint(idx,n) --> alignScopeToAxes(y) s('1,0,'1) t(0,Elevation-scope.elevation,0) report("Footprint Area (m2)",geometry.area) report("Lot Coverage (%)",geometry.area/Lot_Area*100) extrude(getHeight(FloorNumbles)) Envelope Envelope --> split(y){ ~Ground_Floor_Height: FloorEnvelope(split.index,split.total) | { ~Standard_Floor_Height: FloorEnvelope(split.index,split.total) }* } FloorEnvelope(idx,n) --> s('1,0.02,'1) t(0,'-1,0) comp(f){top: FloorArea(idx,n) } FloorArea(idx,n) --> case SelectType == "None": Floor(idx,n) case SelectType == "2nd Floor" && idx > 1: setback(OffsetDistance){ object.front: NIL | remainder: Floor(idx,n) } case SelectType == "Top Floor" && idx == n-1: setback(OffsetDistance){ object.front: NIL | remainder: Floor(idx,n) } case SelectType == "2 Stepbacks" && idx > n*0.8: setback(OffsetDistance){ object.front: NIL | remainder: Floor(idx,n) } case SelectType == "2 Stepbacks" && idx > n*0.5: setback(OffsetDistance/2){ object.front: NIL | remainder: Floor(idx,n) } case SelectType == "Increasing": setback(OffsetDistance*idx/(n-1)){ object.front: NIL | remainder: Floor(idx,n) } case SelectType == "Decreasing": setback(OffsetDistance*(1-idx/(n-1))){ object.front: NIL | remainder: Floor(idx,n) } case SelectType == "Alternating" && idx%2 == 1: setback(OffsetDistance){ object.front: NIL | remainder: Floor(idx,n) } case SelectType == "Random": 30% : setback(OffsetDistance){ object.front: NIL | remainder: Floor(idx,n) } 30% : setback(OffsetDistance){ object.back: NIL | remainder: Floor(idx,n) } else: Floor(idx,n) else: Floor(idx,n) Floor(idx,n) --> case idx < 2: extrude(getFloorHeight(idx)) FloorMass(idx,n) else: extrude(getFloorHeight(idx)) FloorMass(idx,n) FloorMass(idx,n) --> case !ShowModel: case Transparent: set(material.opacity,0.5) set(ShowModel, true) Mass. Reports_FloorMass else: set(ShowModel, true) Mass. Reports_FloorMass else: set(ShowModel, true) set(floorIdx,idx) set(nFloors,n) comp(f){ side: FloorSide } Slab Reports_FloorMass ## Floor ################################ Reports_FloorMass --> comp(f) { top: NIL | bottom: NIL | world.south: report("FacadeOrientation.South", geometry.area) | world.east: report("FacadeOrientation.East", geometry.area) | world.west: report("FacadeOrientation.West", geometry.area) | world.north: report("FacadeOrientation.North", geometry.area) } FloorSide --> setupProjection(0, scope.xy, ~4, ~4, 0, 0, 1) s('1,adjustWallHeight,'1) split(y){ getWallBottom: Wall | getWinHeight: FloorPattern | ~1: Wall } FloorPattern --> case front && BalconiesWindows=="On Front" || rear && BalconiesWindows=="On Rear": BalconyPattern case SideType != "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 | winW/2: Tile }* | ~walW: Wall | winW+walW/2: Tile } 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 | winW/2: Tile | { ~walW: Wall | winW: Tile }* | ~walW: Wall | winW/2: Tile | ~walW/2: Wall } 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 | winW/2-walW/2: Tile | { ~walW: Wall | winW: Tile }* | ~walW: Wall | winW/2-walW/2: Tile | ~walW: Wall } 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 | winW/2: Tile }* | ~walW: Wall | winW-walW/2: Tile | ~walW: Wall } 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 SideType == "WOW": split(x){ ~1: Wall | winW: Win | ~1: Wall } case SideType == "WoW": split(x){ ~1: Wall | panW: Win | ~1: Wall } case SideType == "wOWOw": split(x){ walW: Wall | winW: Win | ~1: Wall | winW: Win | walW: Wall } case SideType == "woWow": split(x){ walW: Wall | panW: Win | ~1: Wall | panW: Win | walW: Wall } case SideType == "woW": case right: split(x){ walW: Wall | panW: Win | ~1: Wall } else : split(x){ ~1: Wall | panW: Win | walW: Wall } case SideType == "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 SideType == "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) primitiveCube() comp(f){ front: NIL | side: Win(0) } | winWidthRight: Win(0) } else: Rail t(0,0,-winSetback) split(x){ winWidthLeft : Win(0) | ~1 : s(scope.sx-winSetback,'1,-Balcony_Depth+Wall_Thickness) t(winSetback/2,0,0) primitiveCube() comp(f){ front: NIL | side: Win(0) } | winWidthRight: Win(0) } ## Windows ################################ Win --> case lowLOD: Win(0) else: Win(winSetback) Win(dz) --> case lowLOD || Frame_Width <= 0: t(0,0,-dz) trim Glass else: 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 } Frame --> case frameDepth > 0: report("Facade.Frame", geometry.area(front)) extrude(-frameDepth) trim color(Frame_Color) else: report("Facade.Frame", geometry.area(front)) color(Frame_Color) Glass --> GlassMaterial Reports_Glass GlassMaterial --> 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 GlassPanels --> case Panels_Generate == "None": Glass. else: Panels("Glass") Reports_Glass --> report("Facade.Glass", geometry.area(front)) NIL ## Wall ################################ Wall --> case lowLOD: WallSide else: Wall(Wall_Thickness) Wall(thickness) --> case midLOD: s('1,'1,thickness) t(0,0,'-1) primitiveCube() WallSide else: s('1,'1,thickness) t(0,0,'-1) primitiveCube() comp(f){ side = WallSide | all = WallSideProj} WallSideProj --> setupProjection(0, scope.xy, ~4, 4) WallSide WallSide --> projectUV(0) texture(Wall_Texture) color(Wall_Color) set(material.ambient.r,0.2) set(material.ambient.g,0.2) set(material.ambient.b,0.2) report("Facade.Wall", geometry.area(front)) 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: GravelRoof } else: split(y){ 0.05: NIL | ~1: comp(f){ bottom: Flooring | top: Ceiling } | Slab_Thickness: NIL } Ceiling --> offset(-Wall_Thickness,inside) extrude(Slab_Thickness-0.05) comp(f){ top: GravelRoof | all = color("#ffffff") Ceiling. } Flooring --> offset(-Wall_Thickness,inside) extrude(0.05) comp(f){ top: WallSideProj | all = color("#333339") Flooring. } GravelRoof --> color("#ffffff") setupProjection(0,scope.xy,10,10) projectUV(0) //texture("streets/textures/Gravel.jpg") texture("wall_textures/concrete/wall_concrete_4.jpg") RoofPanels 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",seedian) # 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. } ] ################################################################ ## ADDITIONAL/OVERWRITE RULES ## style Residential_3 ## Floor Left ################################ //FloorPatternLeftOCCL --> MainPatternDispatcher --> case even(floorIdx): case touches(intra): Wall else: split(x){ panW: Wall | { ~winW*2/3: TilePatternSide. }* | 2*panW: Win | panW+Balcony_Depth+winSetback: Wall } else : case inside(intra): split(x){ ~1: Wall(Wall_Thickness) | Wall_Thickness: NIL } split(x){ ~1: s('1,'1,Balcony_Depth*2) t(0,0,'-1) primitiveCube() comp(f){ right: Windows. } | Balcony_Depth+winSetback: NIL } case touches(intra): split(x){ '0.5: WallCheck | '0.5: set(trim.vertical,false) WallCheck }* split(x){ ~1: s('1,'1,Balcony_Depth*2) t(0,0,'-1) primitiveCube() comp(f){ right: Windows. } | Balcony_Depth+winSetback: NIL } else: split(x){ { ~winW: TilePatternSide. }* | 2*panW+Balcony_Depth+winSetback: Balcony } WallCheck --> case inside(intra): NIL else: Wall(Wall_Thickness*2) ## Floor Right ################################ FloorPatternRightOCCL --> case even(floorIdx): case touches(intra): Wall else: split(x){ panW+Balcony_Depth+winSetback: Wall | 2*panW: Tile | { winW*2/3: TilePatternSide. }* | panW: Wall } else : case inside(intra): split(x){ Wall_Thickness: NIL | ~1: Wall(Wall_Thickness) } split(x){ Balcony_Depth+winSetback: NIL | ~1: s('1,'1,Balcony_Depth*2) t(0,0,'-1) primitiveCube() comp(f){ left: Windows. } } case touches(intra): split(x){ '0.5: set(trim.vertical,false) WallCheck | '0.5: WallCheck }* split(x){ Balcony_Depth+winSetback: NIL | ~1: s('1,'1,Balcony_Depth*2) t(0,0,'-1) primitiveCube() comp(f){ left: Windows. } } else: split(x){ 2*panW+Balcony_Depth+winSetback: Balcony | { winW: TilePatternSide. }* } ## Floor Balconies ################################
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。