Move model parameter parsing out of main

This commit is contained in:
Hanno Braun 2022-04-12 17:32:51 +02:00
parent 556de36cd6
commit f1a0b02065
2 changed files with 29 additions and 21 deletions

View File

@ -1,5 +1,7 @@
use std::{path::PathBuf, str::FromStr as _}; use std::{path::PathBuf, str::FromStr as _};
use anyhow::anyhow;
use fj_host::Parameters;
use fj_kernel::algorithms::Tolerance; use fj_kernel::algorithms::Tolerance;
use fj_math::Scalar; use fj_math::Scalar;
@ -15,8 +17,8 @@ pub struct Args {
pub export: Option<PathBuf>, pub export: Option<PathBuf>,
/// Parameters for the model, each in the form `key=value` /// Parameters for the model, each in the form `key=value`
#[clap(short, long)] #[clap(short, long, parse(try_from_str = parse_parameters))]
pub parameters: Vec<String>, pub parameters: Option<Parameters>,
/// Model deviation tolerance /// Model deviation tolerance
#[clap[short, long, parse(try_from_str = parse_tolerance)]] #[clap[short, long, parse(try_from_str = parse_tolerance)]]
@ -33,6 +35,27 @@ impl Args {
} }
} }
fn parse_parameters(input: &str) -> anyhow::Result<Parameters> {
let mut parameters = Parameters::empty();
for parameter in input.split(',') {
let mut parameter = parameter.splitn(2, '=');
let key = parameter
.next()
.ok_or_else(|| anyhow!("Expected model parameter key"))?
.to_owned();
let value = parameter
.next()
.ok_or_else(|| anyhow!("Expected model parameter value"))?
.to_owned();
parameters.0.insert(key, value);
}
Ok(parameters)
}
fn parse_tolerance(input: &str) -> anyhow::Result<Tolerance> { fn parse_tolerance(input: &str) -> anyhow::Result<Tolerance> {
let tolerance = f64::from_str(input)?; let tolerance = f64::from_str(input)?;
let tolerance = Scalar::from_f64(tolerance); let tolerance = Scalar::from_f64(tolerance);

View File

@ -6,7 +6,7 @@ mod input;
mod window; mod window;
use std::path::PathBuf; use std::path::PathBuf;
use std::{collections::HashMap, time::Instant}; use std::time::Instant;
use fj_host::{Model, Parameters}; use fj_host::{Model, Parameters};
use fj_interop::{debug::DebugInfo, mesh::Mesh}; use fj_interop::{debug::DebugInfo, mesh::Mesh};
@ -61,29 +61,14 @@ fn main() -> anyhow::Result<()> {
} }
let model = Model::from_path(path, config.target_dir)?; let model = Model::from_path(path, config.target_dir)?;
let parameters = args.parameters.unwrap_or_else(Parameters::empty);
let mut parameters = HashMap::new();
for parameter in args.parameters {
let mut parameter = parameter.splitn(2, '=');
let key = parameter
.next()
.expect("model parameter: key not found")
.to_owned();
let value = parameter
.next()
.expect("model parameter: value not found")
.to_owned();
parameters.insert(key, value);
}
let shape_processor = ShapeProcessor { let shape_processor = ShapeProcessor {
tolerance: args.tolerance, tolerance: args.tolerance,
}; };
if let Some(path) = args.export { if let Some(path) = args.export {
let shape = model.load_once(&Parameters(parameters))?; let shape = model.load_once(&parameters)?;
let shape = shape_processor.process(&shape); let shape = shape_processor.process(&shape);
let vertices = let vertices =
@ -111,7 +96,7 @@ fn main() -> anyhow::Result<()> {
return Ok(()); return Ok(());
} }
let watcher = model.load_and_watch(Parameters(parameters))?; let watcher = model.load_and_watch(parameters)?;
let event_loop = EventLoop::new(); let event_loop = EventLoop::new();
let window = Window::new(&event_loop); let window = Window::new(&event_loop);