Thanks Thomas, your code was really helpful to understand various ways to use functions.
I tried this code and works perfectly, but since my plots are getting divided base on the plot dimension say, 30*40, so I am not able to figure out how to incorporate this code.
Basically I split my parcels in grids using split function and generate give 30% probability to cover 30% ground cover for buildings and then randomize heights between max floors and min floors.
Since I am working with FAR concepts now I have total number of floors fixed. I hope we can incorporate your code in mine.
getHeight(row_ind, nRows, col_ind, nCols) = GfHeight + nFloors(row_ind, nRows, col_ind, nCols)*UfHeight
nFloors(row_ind, nRows, col_ind, nCols) =
case Variation_Mode == "None" || (nRows*nCols) < 2 : Floor_Max
case Variation_Mode == "Increasing" : Floor_Min + (rint((Floor_Max-Floor_Min)*((row_ind*nCols+col_ind)/((nRows*nCols)-1))))
case Variation_Mode == "Decreasing" : Floor_Min + rint((Floor_Max-Floor_Min)*(1-(row_ind*nCols+col_ind)/((nRows*nCols)-1)))
case Variation_Mode == "Alternating" : Floor_Min + rint((Floor_Max-Floor_Min)*((row_ind*nCols+col_ind)%2))
case Variation_Mode == "Plot_Increasing" : Floor_Min + (rint((Floor_Max-Floor_Min)*(col_ind/(nCols-1))))
# case Variation_Mode == "Plot_Decreasing" : Floor_Min + (rint((Floor_Max-Floor_Min)*((1-(col_ind))/(nCols-1)))) ///// Not Working
case Variation_Mode == "Plot_Alternative" : Floor_Min + (rint((Floor_Max-Floor_Min)*(col_ind%2)))
else : rint(rand(Floor_Min-0.49,Floor_Max+0.49))
@StartRule
Lot -->
set(Plot_Area, geometry.area)
report("Plot Area", Plot_Area)
Lot2
Lot2 -->
split(x) { Width: Col(split.index, split.total)}*
Col(col_ind, nCols) -->
split(z) { Length: Cell(split.index, split.total, col_ind, nCols)}*
Cell(row_ind, nRows, col_ind, nCols) -->
print("total cels " + (nRows*nCols))
print("row_ind " + (row_ind*nCols+col_ind))
DevelopLot(row_ind, nRows, col_ind, nCols)
DevelopLot(row_ind, nRows, col_ind, nCols) -->
case p(BuildPer/100) : ExtrudeBuild(row_ind, nRows, col_ind, nCols)
case p(OpenSpacePer/100) : Openspace
case p(GreenspacePer/100) : Greenspace
else : Greenspace
ExtrudeBuild(row_ind, nRows, col_ind, nCols) -->
extrude(world.y, getHeight(row_ind, nRows, col_ind, nCols))
split(y){GfHeight : Done. | ~1 : UpperFloors}
UpperFloors -->
split (y){~UfHeight : Done.}*