From d5ae45fc42630f7b1bacb55eebc8b84ad48dd06f Mon Sep 17 00:00:00 2001 From: Andy Killorin <37423245+Speedy6451@users.noreply.github.com> Date: Sun, 5 Nov 2023 12:36:32 -0600 Subject: [PATCH] mirrored_wing extract (initial) --- src/main.rs | 134 ++++++++++++++++++++++++++++------------------------ 1 file changed, 72 insertions(+), 62 deletions(-) diff --git a/src/main.rs b/src/main.rs index ed64119..b9a701a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -32,59 +32,11 @@ fn main() { .clone() .unwrap_or("no desc".to_string()) ); - //println!("span {:?}", points_in_range(wing_airfoil.get_points()[0..80], 0.0..1.0)); - - let points = wing_airfoil.get_points()[0..80].to_vec(); - let perimeter = points.length(); - let span = points.to_vec().points_in_range(perimeter * 0.4..perimeter); - let points = scad::PolygonParameters::new(span); - register_part(scad!(Polygon(points))); // symetric airfoil, used in the control surfaces let control_airfoil: SeligFile = SeligFile::parse(include_str!("../edgevertical.dat")); - let mut wing_transform = scad!(Translate(vec3(0.0, 0.0, 0.0))); - - // struts - let mut symetric_spar = scad!(Union); - for port in [true, false] { - let mut wing = wing( - &wing_airfoil, - STRUTS / 2, - WINGSPAN / 2.0, - CHORD, - CHORD * WING_TAPER, - SparType::Top, - ); - let top_spar = topwing_spar( - &wing_airfoil, - STRUTS / 2, - WINGSPAN / 2.0, - CHORD, - CHORD * WING_TAPER, - ); - - let mut top_spar_neg = scad!(Difference; top_spar); - top_spar_neg.add_child(wing.clone()); - - wing.add_child(scad!(NamedColor("red".to_string()); top_spar_neg.clone())); - - symetric_spar.add_child(top_spar_neg); - - wing = scad!(Translate(vec3(0.0, FUSELAGE_GAP,0.0)); wing); - if port { - wing = scad!(Mirror(vec3(0.0, 1.0, 0.0)); wing); - } - wing_transform.add_child(wing); - } - - // fuselage affixment point - symetric_spar.add_child(centered_cube( - vec3(CHORD, FUSELAGE_GAP * 2.0, 1.0), - (false, true, false), - )); - wing_transform.add_child(symetric_spar.clone()); - register_part(scad!(Projection(false); symetric_spar)); + let wing_transform = mirrored_wing(&wing_airfoil); // spars @@ -143,7 +95,7 @@ fn main() { register_part(scad!(Projection(false); symetric_spar)); let cardboard = vec3(0.38, 0.26, 0.26); - scad_file.add_object(scad!(Color(cardboard); wing_transform)); + scad_file.add_object(scad!(Color(cardboard); wing_transform.visualization)); scad_file.write_to_file(String::from("build/assembly.scad")); @@ -162,6 +114,74 @@ fn main() { allparts.write_to_file("build/allparts.scad".to_string()); } +/// A physical object +struct Construct { + /// The object in 3d space + pub visualization: ScadObject, + /// the 2d parts that make up the object + pub parts: Vec, +} + +impl Construct { + fn new(visualization: ScadObject, parts: Vec) -> Self { + Construct { + visualization, + parts, + } + } + + fn cosmetic(visualization: ScadObject) -> Self { + Construct { visualization, parts: Vec::new() } + } +} + +fn mirrored_wing(wing_airfoil: &SeligFile) -> Construct { + let mut parts = Vec::new(); + let mut wing_transform = scad!(Translate(vec3(0.0, 0.0, 0.0))); + // struts + let mut symetric_spar = scad!(Union); + for port in [true, false] { + let mut wing = wing( + wing_airfoil, + STRUTS / 2, + WINGSPAN / 2.0, + CHORD, + CHORD * WING_TAPER, + SparType::Top, + ); + let top_spar = topwing_spar( + wing_airfoil, + STRUTS / 2, + WINGSPAN / 2.0, + CHORD, + CHORD * WING_TAPER, + ); + + let mut top_spar_neg = scad!(Difference; top_spar); + top_spar_neg.add_child(wing.clone()); + + wing.add_child(scad!(NamedColor("red".to_string()); top_spar_neg.clone())); + + symetric_spar.add_child(top_spar_neg); + + wing = scad!(Translate(vec3(0.0, FUSELAGE_GAP,0.0)); wing); + if port { + wing = scad!(Mirror(vec3(0.0, 1.0, 0.0)); wing); + } + wing_transform.add_child(wing); + } + // fuselage affixment point + symetric_spar.add_child(centered_cube( + vec3(CHORD, FUSELAGE_GAP * 2.0, 1.0), + (false, true, false), + )); + parts.push(scad!(Projection(false); symetric_spar.clone())); + wing_transform.add_child(symetric_spar); + Construct::new( + wing_transform.clone() + , parts) +} + enum SparType { None, Top, @@ -220,7 +240,7 @@ fn extrude_strut( fn topspar_negative(airfoil: &SeligFile, chord: f32, range: Range) -> ScadObject { let points = airfoil.get_points(); let points = &points[0..points.len() / 2]; - let perimeter = span_length(points); + let perimeter = points.to_vec().length(); let span = points .to_vec() @@ -352,14 +372,4 @@ fn topwing_spar( wing } -fn span_length(points: &[Point]) -> f32 { - let mut last_point: Option = None; - let mut distance: f32 = 0.0; - for point in points { - if let Some(last) = last_point { - distance += (last - point).magnitude(); - } - last_point = Some(*point); - } - distance -} +