mirrored_wing extract (initial)
This commit is contained in:
parent
b18987a736
commit
d5ae45fc42
1 changed files with 72 additions and 62 deletions
134
src/main.rs
134
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<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
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue