From f59aeb6594ccee22d24d9104fb4bfabf019374ac Mon Sep 17 00:00:00 2001 From: Andy Killorin <37423245+Speedy6451@users.noreply.github.com> Date: Mon, 6 Nov 2023 09:26:50 -0600 Subject: [PATCH] accept command line arguments --- Makefile | 16 ++++++++-- src/main.rs | 89 +++++++++++++++++++++++++++++++++-------------------- 2 files changed, 69 insertions(+), 36 deletions(-) diff --git a/Makefile b/Makefile index 774198a..135f172 100644 --- a/Makefile +++ b/Makefile @@ -6,14 +6,24 @@ ifeq ($(UNAME), Darwin) SCAD = OpenSCAD endif +AIRFOILS = ag24.dat m1-il.dat + b: build/allparts.svg build: mkdir -p build -build/%.scad: src/*.rs ag24.dat m1-il.dat +build/assembly.scad: src/*.rs $(AIRFOILS) mkdir -p build - cargo run + cargo run t-tail assembly + +build/part%.scad: src/*.rs $(AIRFOILS) + mkdir -p build + cargo run parts t-tail + +build/allparts.scad: src/*.rs $(AIRFOILS) + mkdir -p build + cargo run sheet t-tail e393.dat: curl http://airfoiltools.com/airfoil/seligdatfile?airfoil=e393-il -o e393.dat @@ -69,7 +79,7 @@ build/testwing-clear.scad: build/testwing.scad sed 's/color("clear-blue")/color([0.0,1.0,1.0,1.0])/g' -i $@ build/assembly-clear.scad: build/assembly.scad - cargo run --features film + cargo run --features assembly t-tail film sed 's/color("clear-red")/color([1.0,0.0,0.0,0.5])/g' $< > $@ sed 's/color("clear-blue")/color([0.0,1.0,0.0,0.9])/g' -i $@ sed 's/color("clear-blue")/color([0.0,0.0,1.0,0.9])/g' -i $@ diff --git a/src/main.rs b/src/main.rs index 87aab8b..e7c2207 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,11 +3,21 @@ use nalgebra::Vector3; use scad::*; use selig::SeligFile; use selig::Span; +use std::env::args; use std::ops::Range; mod constants; mod selig; fn main() { + let args: Vec = args().collect(); + let gen_film = args.contains(&"film".to_string()); + let gen_v_tail = args.contains(&"v-tail".to_string()); + let gen_t_tail = args.contains(&"t-tail".to_string()); + let gen_parts = args.contains(&"parts".to_string()); + let gen_allparts = args.contains(&"sheet".to_string()); + let gen_assembly = args.contains(&"assembly".to_string()); + let gen_test = args.contains(&"test".to_string()); + let mut scad_file = ScadFile::new(); let mut parts = Vec::new(); @@ -22,7 +32,7 @@ fn main() { // main wing let mut wing_transform = mirrored_wing(&wing_airfoil, &WING); - #[cfg(feature = "film")] { + if gen_film { let mut wrapped = scad!(Hull; wing_transform.visualization.clone()); wrapped = scad!(Minkowski; wrapped); wrapped.add_child(scad!(Sphere(Radius(1.0)))); @@ -38,39 +48,51 @@ fn main() { fuselage.visualization)); parts.append(fuselage.parts.as_mut()); - t_tail(control_airfoil, &mut parts, &mut scad_file, wing_airfoil); - //v_tail(control_airfoil, &mut parts, &mut scad_file, wing_airfoil); - - // every part visualized together - scad_file.write_to_file(String::from("build/assembly.scad")); - - // every part in seperate files - for (idx, part) in parts.clone().into_iter().enumerate() { - let mut file = ScadFile::new(); - file.set_detail(50); - file.add_object(part); - file.write_to_file(format!("build/part{idx:0>3}.scad")); + if gen_t_tail { + t_tail(&control_airfoil, &mut parts, &mut scad_file, &wing_airfoil, gen_film); + } + if gen_v_tail { + v_tail(control_airfoil, &mut parts, &mut scad_file, wing_airfoil, gen_film); } - // all parts in one file - let mut allparts = ScadFile::new(); - parts.push(scad!(Square(vec2(STOCK_WIDTH, STOCK_HEIGHT)))); - allparts.set_detail(50); - for (idx, part) in parts.into_iter().enumerate() { - allparts.add_object(scad!(Translate2d(vec2(0.0, INF * idx as f32)); part)); + if gen_assembly { + // every part visualized together + scad_file.write_to_file(String::from("build/assembly.scad")); } - allparts.write_to_file("build/allparts.scad".to_string()); - // test airfoil - let mut test = ScadFile::new(); - let test_airfoil = SeligFile::parse(include_str!("../m1-il.dat")); - let wing = wing(&test_airfoil, &RUDDER, SparType::Top); - test.add_object(scad!(NamedColor("clear-blue".to_string()); wing.0.visualization)); - test.add_object(scad!(NamedColor("clear-red".to_string()); wing.1.visualization)); - test.write_to_file(String::from("build/testwing.scad")); + if gen_parts { + // every part in seperate files + for (idx, part) in parts.clone().into_iter().enumerate() { + let mut file = ScadFile::new(); + file.set_detail(50); + file.add_object(part); + file.write_to_file(format!("build/part{idx:0>3}.scad")); + } + } + + if gen_allparts { + // all parts in one file + let mut allparts = ScadFile::new(); + parts.push(scad!(Square(vec2(STOCK_WIDTH, STOCK_HEIGHT)))); + allparts.set_detail(50); + for (idx, part) in parts.into_iter().enumerate() { + allparts.add_object(scad!(Translate2d(vec2(0.0, INF * idx as f32)); part)); + } + allparts.write_to_file("build/allparts.scad".to_string()); + } + + if gen_test { + // test airfoil + let mut test = ScadFile::new(); + let test_airfoil = SeligFile::parse(include_str!("../m1-il.dat")); + let wing = wing(&test_airfoil, &RUDDER, SparType::Top); + test.add_object(scad!(NamedColor("clear-blue".to_string()); wing.0.visualization)); + test.add_object(scad!(NamedColor("clear-red".to_string()); wing.1.visualization)); + test.write_to_file(String::from("build/testwing.scad")); + } } -fn t_tail(control_airfoil: SeligFile, parts: &mut Vec, scad_file: &mut ScadFile, wing_airfoil: SeligFile) { +fn t_tail(control_airfoil: &SeligFile, parts: &mut Vec, scad_file: &mut ScadFile, wing_airfoil: &SeligFile, gen_film: bool) { // rudder let mut rudder = scad!(Rotate(90.0, vec3(1.0, 0.0, 0.0))); let (mut struts,mut spar) = wing( @@ -84,7 +106,7 @@ fn t_tail(control_airfoil: SeligFile, parts: &mut Vec, scad_file: &m parts.append(spar.parts.as_mut()); rudder = scad!(Translate(vec3(LENGTH-RUDDER_CHORD, 0.0, 0.0)); rudder); - #[cfg(feature = "film")] { + if gen_film { let mut wrapped = scad!(Hull; rudder.clone()); wrapped = scad!(Minkowski; wrapped); wrapped.add_child(scad!(Sphere(Radius(1.0)))); @@ -96,7 +118,7 @@ fn t_tail(control_airfoil: SeligFile, parts: &mut Vec, scad_file: &m // elevator let mut elevator = mirrored_wing(&wing_airfoil, &ELEVATOR); - #[cfg(feature = "film")] { + if gen_film { let elevator = scad!(Translate(vec3(LENGTH - ELEVATOR_CHORD, 0.0, 0.0)); elevator.visualization.clone()); let mut wrapped = scad!(Hull; elevator); wrapped = scad!(Minkowski; wrapped); @@ -108,7 +130,7 @@ fn t_tail(control_airfoil: SeligFile, parts: &mut Vec, scad_file: &m parts.append(&mut elevator.parts); } -fn v_tail(control_airfoil: SeligFile, parts: &mut Vec, scad_file: &mut ScadFile, wing_airfoil: SeligFile) { +fn v_tail(control_airfoil: SeligFile, parts: &mut Vec, scad_file: &mut ScadFile, wing_airfoil: SeligFile, gen_film: bool) { // rudder let mut ruddervators = scad!(Union); let mut ruddervator = scad!(Union);//scad!(Rotate(90.0, vec3(1.0, 0.0, 0.0))); @@ -127,8 +149,9 @@ fn v_tail(control_airfoil: SeligFile, parts: &mut Vec, scad_file: &m ruddervators.add_child(ruddervator); ruddervators = scad!(Translate(vec3(LENGTH-RUDDER_CHORD, 0.0, 0.0)); ruddervators); - #[cfg(feature = "film")] { - let mut wrapped = scad!(Hull; rudder.clone()); + if gen_film { + // this won't look right + let mut wrapped = scad!(Hull; ruddervators.clone()); wrapped = scad!(Minkowski; wrapped); wrapped.add_child(scad!(Sphere(Radius(1.0)))); scad_file.add_object(scad!(NamedColor("clear-red".to_string()); wrapped));