use plotpy::Plot;
use std::path::Path;
use std::path::PathBuf;
use structopt::StructOpt;
use tritet::{InputDataTriMesh, StrError, Trigen};
#[derive(Debug, StructOpt)]
#[structopt(
name = "trigen2msh",
about = "Generate mesh of triangles and export it as MSH (Gemlab) and VTU (ParaView)"
)]
struct Options {
#[structopt(parse(from_os_str))]
input: PathBuf,
out_dir: String,
#[structopt(short = "V", long)]
verbose: bool,
#[structopt(short, long)]
o2: bool,
#[structopt(short, long)]
svg_figure: bool,
#[structopt(short = "v", long)]
max_area: Option<f64>,
#[structopt(short = "a", long)]
min_angle: Option<f64>,
}
fn main() -> Result<(), StrError> {
let options = Options::from_args();
let in_path = Path::new(&options.input);
let input_data = InputDataTriMesh::read_json(&in_path)?;
let fn_stem = in_path
.file_stem()
.ok_or("cannot get file stem")?
.to_str()
.ok_or("cannot convert file stem to str")?;
let trigen = Trigen::from_input_data(&input_data)?;
let verbose = options.verbose;
let o2 = options.o2;
trigen.generate_mesh(verbose, o2, true, options.max_area, options.min_angle)?;
let path_msh = format!("{}/{}.msh", options.out_dir, fn_stem);
trigen.write_msh(&path_msh)?;
println!("\nGenerated MSH file: {}/{}.msh", options.out_dir, fn_stem);
let path_vtu = format!("{}/{}.vtu", options.out_dir, fn_stem);
trigen.write_vtu(&path_vtu)?;
println!("Generated VTU file: {}/{}.vtu", options.out_dir, fn_stem);
if options.svg_figure {
let mut plot = Plot::new();
trigen.draw_triangles(&mut plot, true, false, false, false, None, None, None);
plot.set_equal_axes(true)
.set_figure_size_points(800.0, 800.0)
.save(&format!("{}/{}.svg", options.out_dir, fn_stem))?;
println!("Generated SVG file: {}/{}.svg", options.out_dir, fn_stem);
}
println!();
Ok(())
}