Basic support for plotly backend
NOTE: this requires you to clone `plotly`, copy the `plotly_kaleido` folder to be adjacent to this one, and then run `cargo build --release` from within that plotly_kaleido folder.
This commit is contained in:
@@ -18,6 +18,7 @@ lazy_static = "1.4"
|
|||||||
log = "0.4"
|
log = "0.4"
|
||||||
ndarray = { version = "0.13", features = ["rayon"] }
|
ndarray = { version = "0.13", features = ["rayon"] }
|
||||||
piecewise-linear = "0.1"
|
piecewise-linear = "0.1"
|
||||||
|
plotly = { version = "0.6", features = ["kaleido", "plotly_ndarray"] }
|
||||||
y4m = "0.7"
|
y4m = "0.7"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
|
@@ -36,17 +36,18 @@ fn main() {
|
|||||||
//driver.set_steps_per_frame(80);
|
//driver.set_steps_per_frame(80);
|
||||||
driver.set_steps_per_frame(120);
|
driver.set_steps_per_frame(120);
|
||||||
//driver.set_steps_per_frame(200);
|
//driver.set_steps_per_frame(200);
|
||||||
driver.add_y4m_renderer(&*format!("toroid25d.5-flt{}-{}-feat{}um-{:.1e}A-{:.1e}s--radii{}um-{}um-{}um-{}um.y4m",
|
// driver.add_y4m_renderer(&*format!("toroid25d.5-flt{}-{}-feat{}um-{:.1e}A-{:.1e}s--radii{}um-{}um-{}um-{}um.y4m",
|
||||||
std::mem::size_of::<Flt>() * 8,
|
// std::mem::size_of::<Flt>() * 8,
|
||||||
*size_px,
|
// *size_px,
|
||||||
m_to_um(feat_size),
|
// m_to_um(feat_size),
|
||||||
peak_current,
|
// peak_current,
|
||||||
current_duration,
|
// current_duration,
|
||||||
m_to_um(conductor_outer_rad),
|
// m_to_um(conductor_outer_rad),
|
||||||
m_to_um(ferro_inner_rad),
|
// m_to_um(ferro_inner_rad),
|
||||||
m_to_um(ferro_outer_rad),
|
// m_to_um(ferro_outer_rad),
|
||||||
m_to_um(ferro_depth),
|
// m_to_um(ferro_depth),
|
||||||
));
|
// ));
|
||||||
|
driver.add_plotly_renderer();
|
||||||
let conductor_region = CylinderZ::new(
|
let conductor_region = CylinderZ::new(
|
||||||
Vec2::new(half_width, half_width),
|
Vec2::new(half_width, half_width),
|
||||||
conductor_outer_rad);
|
conductor_outer_rad);
|
||||||
|
@@ -64,6 +64,10 @@ impl Driver {
|
|||||||
self.add_renderer(render::Y4MRenderer::new(output), &*name);
|
self.add_renderer(render::Y4MRenderer::new(output), &*name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn add_plotly_renderer(&mut self) {
|
||||||
|
self.add_renderer(render::PlotlyRenderer, "plotly");
|
||||||
|
}
|
||||||
|
|
||||||
pub fn add_term_renderer(&mut self) {
|
pub fn add_term_renderer(&mut self) {
|
||||||
self.add_renderer(render::ColorTermRenderer, "terminal");
|
self.add_renderer(render::ColorTermRenderer, "terminal");
|
||||||
}
|
}
|
||||||
|
@@ -1,11 +1,13 @@
|
|||||||
use ansi_term::Color::RGB;
|
use ansi_term::Color::RGB;
|
||||||
use crate::geom::{Meters, Vec2, Vec3};
|
use crate::geom::{Index, Meters, Vec2, Vec3, Vec3u};
|
||||||
use crate::{flt::{Flt, Real}, Material as _};
|
use crate::{flt::{Flt, Real}, Material as _};
|
||||||
use crate::mat;
|
use crate::mat;
|
||||||
use crate::sim::{Cell, GenericSim};
|
use crate::sim::{Cell, GenericSim};
|
||||||
use crate::meas::AbstractMeasurement;
|
use crate::meas::AbstractMeasurement;
|
||||||
use font8x8::{BASIC_FONTS, GREEK_FONTS, UnicodeFonts as _};
|
use font8x8::{BASIC_FONTS, GREEK_FONTS, UnicodeFonts as _};
|
||||||
use log::{trace, info};
|
use log::{trace, info};
|
||||||
|
use plotly::{Plot, ImageFormat};
|
||||||
|
use plotly::heat_map::HeatMap;
|
||||||
use image::{RgbImage, Rgb};
|
use image::{RgbImage, Rgb};
|
||||||
use imageproc::{pixelops, drawing};
|
use imageproc::{pixelops, drawing};
|
||||||
use std::fs::File;
|
use std::fs::File;
|
||||||
@@ -324,6 +326,33 @@ impl Renderer for Y4MRenderer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub struct PlotlyRenderer;
|
||||||
|
|
||||||
|
impl Renderer for PlotlyRenderer {
|
||||||
|
fn render(&mut self, state: &dyn GenericSim, measurements: &[Box<dyn AbstractMeasurement>]) {
|
||||||
|
let mut plot = Plot::new();
|
||||||
|
let mut xv = Vec::new();
|
||||||
|
let mut yv = Vec::new();
|
||||||
|
let mut zv = Vec::new();
|
||||||
|
for z in 0..state.depth() {
|
||||||
|
for y in 0..state.height() {
|
||||||
|
for x in 0..state.width() {
|
||||||
|
let cell = state.get(Index(Vec3u::new(x, y, z)));
|
||||||
|
if cell.e().mag() > 10.0 {
|
||||||
|
xv.push(x);
|
||||||
|
yv.push(y);
|
||||||
|
zv.push(z);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let heat_map = HeatMap::new(xv, yv, zv);
|
||||||
|
plot.add_trace(heat_map);
|
||||||
|
let name = format!("frame{}", state.step_no());
|
||||||
|
plot.save(&*name, ImageFormat::PNG, state.width() as _, state.height() as _, 1.0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
pub struct MultiRenderer {
|
pub struct MultiRenderer {
|
||||||
renderers: Vec<Box<dyn Renderer>>,
|
renderers: Vec<Box<dyn Renderer>>,
|
||||||
|
Reference in New Issue
Block a user