This is duplicate post of a discussion I started on ESRI’s CityEngine support forum
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?