1
Fork 0

mirrored_wing extract (initial)

This commit is contained in:
Andy Killorin 2023-11-05 12:36:32 -06:00
parent b18987a736
commit d5ae45fc42
Signed by: ank
GPG key ID: B6241CA3B552BCA4

View file

@ -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<ScadObject>,
}
impl Construct {
fn new(visualization: ScadObject, parts: Vec<ScadObject>) -> 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<f32>) -> 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<Point> = 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
}