| c layout data nodes edges | c := RSCanvas new. data := NeoJSONReader fromString: (ZnEasy get: 'https://cytoscape.org/cytoscape.js-euler/example-graphs/planar-chain.json') contents. nodes := data select: [ :obj | (obj at: #group) =#nodes ]. edges := data select: [ :obj | (obj at: #group) =#edges ]. edges := edges collect: [ :ed | | d | d := ed at: #data. (d at: #source) -> (d at: #target) ]. c addAll: (nodes collect: [ :obj | | pos d | pos := obj at: #position. d := obj at: #data. pos := (pos at: #x) @ (pos at: #y). RSEllipse new draggable; model: (d at: #id); color: Color green darker; popup; position: pos; size: 10; yourself. ]). RSEdgeBuilder line canvas: c; shapes: c nodes; color: (Color purple alpha: 0.2); useAssociations: edges. "layout := RSForceBasedLayout new initialLayout: RSNoLayout new; nodes: c nodes; edges: c edges; start; yourself. c newAnimation repeat onStepDo: [ :t | layout step. c zoomToFit ]." RSForceBasedLayout on: c nodes. c zoomToFit. c