Nodes do not snap when using ce.move() in the CityEngine PyDev window.
Last Published: August 16, 2017ArcGIS CityEngine
Bug ID Number
BUG-000106176
Submitted
June 28, 2017
Last Modified
June 5, 2024
Applies to
ArcGIS CityEngine
Version found
2016.1
Status
Non-Reproducible
This issue was not reproducible when tested by the development team. Issues may be given this status when they cannot be reproduced or are no longer relevant in a development version of the software, but a specific fix was not installed to address the issue. The issue's Additional Information section may contain further explanation.
Additional Information
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):