When moving a node in python it is not expected, that it snaps to a neighboring node.
When snapping is desired, please use the following commands:
graphlayer = ce.getObjectsFrom(ce.scene(),ce.withName("Streetnetwork"),ce.isLayer)[0]
cleanupSettings = CleanupGraphSettings()
cleanupSettings.setSnapNodesToSegments(True)
cleanupSettings.setSnappingDist(20)
ce.cleanupGraph(graphlayer,cleanupSettings)
Known limitation: This is applied to the whole Streetnetwork.
To overcome this, I once made as script, that only merges nodes in a selectionfrom scripting import *
# get a CityEngine instance
ce = CE()
def getAdjacentSegments(nodes):
segments = []
for n in nodes:
seg = ce.getObjectsFrom(n, ce.isGraphSegment)
for s in seg:
if (s not in segments):
segments.append(s)
return segments
def getCleanupGraphSettings(default = True, dist = 10):
cleanupSettings = CleanupGraphSettings()
cleanupSettings.setIntersectSegments(default)
cleanupSettings.setMergeNodes(default)
cleanupSettings.setMergingDist(dist)
cleanupSettings.setSnapNodesToSegments(default)
cleanupSettings.setSnappingDist(10)
cleanupSettings.setResolveConflictShapes(default)
return cleanupSettings
def mergeNodes(segments):
# get graph layer and create tmp layer
graphLayer = ce.getLayer(segments[0])
graphLayerTmp = ce.addGraphLayer('tmp_streets')
# do merging of segments in tmp layer
ce.copy ( ce.getObjectsFrom(ce.selection), True, graphLayerTmp )
cleanupSettings = getCleanupGraphSettings(False)
cleanupSettings.setMergeNodes(True)
ce.cleanupGraph(graphLayerTmp, cleanupSettings)
result = ce.copy (ce.getObjectsFrom(graphLayerTmp), True, graphLayer)
# integrate merged segments back into graph
cleanupSettings = getCleanupGraphSettings(False)
cleanupSettings.setSnapNodesToSegments(True)
cleanupSettings.setSnappingDist(0)
ce.cleanupGraph(graphLayer, cleanupSettings)
# cleanup
ce.delete(graphLayerTmp)
if __name__ == '__main__':
nodes = ce.getObjectsFrom(ce.selection, ce.isGraphNode)
segments = getAdjacentSegments(nodes)
mergeNodes(segments):