The next part of this thread is to start a simple road CGA rule file that can take into account the road classification field. This code is based in part on the tutorial examples given by CityEngine but I've modified them for the purpose of this discussion (with myself). The principles here can be applied for many rule sets not just road networks.This CGA rule will create different looking roads depending on the road classification and place a lamp post at regular intervals on designated streets. I've also added a rule for a covered market street but this is to be added manually in CityEngine.Road classes are taken from the Streetnetwork's "layer attribbutes" with code code like this : attr roadClass = getObjectAttr("ROADCLASS_FIELDNAME_FROM_GIS")
const lamp_asset = "lamppost.obj" // this is under your assets directory you can get a quick model from places like Google 3D Warehouse just be sure you have permission to use them!
attr sidewalkHeight =0.25
attr lampDistance =25 // you could change this or add different attributes for each road class
attr roadClass = "None" // attribute name declared in layer attribute
Street--> // I've coloured these in simple primary colours so you can see what's happening
case roadClass == "Primary" : color ("#ff0000")
case roadClass == "Secondary" : color ("#00ff00")
case roadClass == "Tertiary" : color ("#0000ff") // you can add more classes here
else : color("#535353")
Sidewalk-->
set(trim.vertical,false) set(trim.horizontal,false)
comp(f){ all: SidewalkPart }
SidewalkPart -->
case scope.sx > 5:
SidewalkWithCurbs
alignScopeToAxes(y) t(0,sidewalkHeight,0)
SidewalkLampTest
else:
SidewalkWithCurbs
SidewalkWithCurbs -->
extrude(world.y,sidewalkHeight)
comp(f)
{ top : split(y){ sidewalkHeight : Curbs | ~1 : Pavement }
| front : Curbs }
SidewalkLampTest--> // in this example only my primary and secondary classes of street get lampposts!
case roadClass == "Primary" : SidewalkLamps
case roadClass == "Secondary" : SidewalkLamps
else : nil
SidewalkLamps -->
split(x){ ~lampDistance : NIL
| { 0.1: Lamp | ~lampDistance : NIL }* }
Pavement -->
color("#C0C0C0")
Lamp -->
t(0,0,scope.sz-sidewalkHeight*2)
s(0,5,0)
r(0,90,0)
i(lamp_asset)
Curbs -->
color("#C0C0C0")
Crossing-->
color("#535353")
Junction-->
color("#535353")
JunctionEntry-->
color("#535353")
Island-->
extrude(0.5) color("#008000")
StreetMarketRoof--> // you need to select the shapes start rule manually to enable this but you could do it via road class as well
extrude(10) comp(f) { bottom : marketstreet | top : marketroof }
marketroof--> roofGable(22.5)
marketstreet --> reverseNormals color("#008000") // I seem to need to do this so I can have a coloured street under my marketroof
Has anyone got anything else to add or correct? Can someone provide code for a nice simple bridge?