public IActionResult DisplayViewAsImage() { var sim = Program.uglyGlobalSimulation; lock (sim) { var filename = "/tmp/tmp.png"; var w = 1600; var h = 1000; var scale = 0.150; // TODO: automatically determine boundaries of view var fontSize = 9; GraphicsOutput.RenderPng(sim.CoordSpace, sim.Network, sim.Units, Program.uglyGlobalTCSS, filename, w, h, scale, fontSize); byte[] filedata = System.IO.File.ReadAllBytes(filename); string contentType = "image/png"; return(File(filedata, contentType)); } }
private static void Subscribe(Simulation sim) { var factory = new ConnectionFactory() { HostName = "localhost" }; var connection = factory.CreateConnection(); var channel = connection.CreateModel(); var simStateQueue = channel.QueueDeclare().QueueName; channel.ExchangeDeclare(exchange: "SimState_full.cbor", type: ExchangeType.Fanout); channel.QueueBind(queue: simStateQueue, exchange: "SimState_full.cbor", routingKey: ""); channel.ExchangeDeclare(exchange: "TSIM.cbor", type: ExchangeType.Fanout); var consumer = new EventingBasicConsumer(channel); consumer.Received += (model, ea) => { // var message = Encoding.UTF8.GetString(ea.Body.ToArray()); // Console.WriteLine("RX " + message); var(unitsSnapshot, controlSnapshot, simInfoSnapshot) = Serialization.UnglueFullSimSnapshot(ea.Body.ToArray()); // var message = Encoding.UTF8.GetString(unitsSnapshot); // Console.WriteLine("RX " + message); // var message = Encoding.UTF8.GetString(controlSnapshot); // Console.WriteLine("RX " + message); var controlStateMap = Serialization.DeserializeTrainControlState(controlSnapshot); uglyGlobalTCSS = controlStateMap; lock (sim) { // Serialization.DeserializeInfoSnapshot(sim, simInfoSnapshot); sim.Units.SnapshotFullRestore(unitsSnapshot); // Render outputs var filename = "/tmp/tmp.png"; var w = 1400; var h = 1000; var scale = 0.150; // TODO: automatically determine boundaries of view var fontSize = 9; GraphicsOutput.RenderPng(sim.CoordSpace, sim.Network, sim.Units, Program.uglyGlobalTCSS, filename, w, h, scale, fontSize); byte[] filedata = System.IO.File.ReadAllBytes(filename); string contentType = "image/png"; // Wrap in CBOR & publish var cbor = CBORObject.NewMap() .Add("objects", CBORObject.NewArray() .Add(CBORObject.NewMap() .Add("name", "main") // deprecated .Add("topic", "main") .Add("displayName", "TSIM View") .Add("mimeType", contentType) .Add("data", filedata) ) .Add(ControlSystemStateMapToCbor(Program.uglyGlobalTCSS)) .Add(SimulationStateMapToCbor(/*sim.SimTimeElapsed*/ simInfoSnapshot)) .Add(UnitsToCbor(sim.Units)) ) .Add("controls", CBORObject.NewArray()) ; channel.BasicPublish(exchange: "TSIM.cbor", routingKey: "", basicProperties: null, body: cbor.EncodeToBytes()); // Console.WriteLine($"Pub now"); } }; channel.BasicConsume(queue: simStateQueue, autoAck: true, consumer: consumer); }