comments and inflate change
This commit is contained in:
		
							parent
							
								
									a185939953
								
							
						
					
					
						commit
						63203ee717
					
				@ -12,6 +12,7 @@ pub fn draw_gerbers_(ui: &mut PlotUi, app: &mut Application) {
 | 
			
		||||
    for (file_name, (_, geo)) in &app.gerbers {
 | 
			
		||||
        let selected = &app.selection == file_name;
 | 
			
		||||
 | 
			
		||||
        // draw apertures
 | 
			
		||||
        for geometry in geo.apertures.iter() {
 | 
			
		||||
            draw_on_plot_canvas(
 | 
			
		||||
                ui,
 | 
			
		||||
@ -20,6 +21,7 @@ pub fn draw_gerbers_(ui: &mut PlotUi, app: &mut Application) {
 | 
			
		||||
            );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // draw lines
 | 
			
		||||
        for line in geo.paths.iter() {
 | 
			
		||||
            draw_on_plot_canvas(
 | 
			
		||||
                ui,
 | 
			
		||||
@ -28,7 +30,7 @@ pub fn draw_gerbers_(ui: &mut PlotUi, app: &mut Application) {
 | 
			
		||||
            );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // draw union path
 | 
			
		||||
        // draw outline union path
 | 
			
		||||
        for path in geo.outline_union.iter() {
 | 
			
		||||
            let mut points = path
 | 
			
		||||
                .iter()
 | 
			
		||||
 | 
			
		||||
@ -30,6 +30,7 @@ impl From<GerberDoc> for Geometry {
 | 
			
		||||
        let mut path_container: Vec<LinePath> = Vec::new();
 | 
			
		||||
        let mut added_apertures: Vec<Element> = Vec::new();
 | 
			
		||||
 | 
			
		||||
        // create geometries by applying all gerber commands
 | 
			
		||||
        for command in gerber.commands {
 | 
			
		||||
            println!("{command:?}");
 | 
			
		||||
            match command {
 | 
			
		||||
@ -39,14 +40,15 @@ impl From<GerberDoc> for Geometry {
 | 
			
		||||
                            match code {
 | 
			
		||||
                                DCode::Operation(op) => match op {
 | 
			
		||||
                                    Operation::Interpolate(coordinates, offset) => {
 | 
			
		||||
                                        // create line by interpolating from current position to new position
 | 
			
		||||
                                        if selected_interpolation_mode == InterpolationMode::Linear
 | 
			
		||||
                                        {
 | 
			
		||||
                                            // self.add_draw_segment(coord);
 | 
			
		||||
                                            let point = Point::try_from(&coordinates);
 | 
			
		||||
                                            // add current position as starting position if active path is empty (=> start new one)
 | 
			
		||||
                                            if active_path.is_empty() {
 | 
			
		||||
                                                active_path.add(current_position);
 | 
			
		||||
                                            }
 | 
			
		||||
                                            match point {
 | 
			
		||||
                                            // add point (from gerber coordinates) to active path
 | 
			
		||||
                                            match Point::try_from(&coordinates) {
 | 
			
		||||
                                                Ok(point) => {
 | 
			
		||||
                                                    active_path.add(point);
 | 
			
		||||
                                                }
 | 
			
		||||
@ -56,25 +58,29 @@ impl From<GerberDoc> for Geometry {
 | 
			
		||||
                                            // TODO
 | 
			
		||||
                                            // self.add_arc_segment(coord, offset.as_ref().expect(format!("No offset coord with 'Circular' state\r\n{:#?}", c).as_str()))
 | 
			
		||||
                                        }
 | 
			
		||||
                                        // move current coordinates to new position
 | 
			
		||||
                                        Self::move_position(&coordinates, &mut current_position);
 | 
			
		||||
                                    }
 | 
			
		||||
                                    // move current coordinates to new position
 | 
			
		||||
                                    Operation::Move(m) => {
 | 
			
		||||
                                        debug!("Move to {:?}, create path.", &m);
 | 
			
		||||
                                        // self.create_path_from_data();
 | 
			
		||||
                                        // check if a aperture is selected and if it's circular
 | 
			
		||||
                                        if let Some(Aperture::Circle(c)) =
 | 
			
		||||
                                            selected_aperture.as_ref()
 | 
			
		||||
                                        {
 | 
			
		||||
                                            // check if a path is currently active
 | 
			
		||||
                                            if !active_path.is_empty() {
 | 
			
		||||
                                                // finish active path if there is an active one
 | 
			
		||||
                                                active_path.finalize(c.diameter);
 | 
			
		||||
                                                path_container.push(active_path);
 | 
			
		||||
                                            }
 | 
			
		||||
                                        }
 | 
			
		||||
 | 
			
		||||
                                        // create new active path and move position tp current position
 | 
			
		||||
                                        active_path = LinePath::new();
 | 
			
		||||
                                        Geometry::move_position(&m, &mut current_position);
 | 
			
		||||
                                        Self::move_position(&m, &mut current_position);
 | 
			
		||||
                                    }
 | 
			
		||||
                                    // add selected Aperture
 | 
			
		||||
                                    Operation::Flash(f) => {
 | 
			
		||||
                                        // self.create_path_from_data();
 | 
			
		||||
                                        Self::add_geometry(
 | 
			
		||||
                                            &mut added_apertures,
 | 
			
		||||
                                            ¤t_position,
 | 
			
		||||
@ -85,8 +91,8 @@ impl From<GerberDoc> for Geometry {
 | 
			
		||||
                                        Self::move_position(&f, &mut current_position);
 | 
			
		||||
                                    }
 | 
			
		||||
                                },
 | 
			
		||||
                                // select an aperture
 | 
			
		||||
                                DCode::SelectAperture(ap) => {
 | 
			
		||||
                                    // self.create_path_from_data();
 | 
			
		||||
                                    selected_aperture = Some(
 | 
			
		||||
                                        gerber
 | 
			
		||||
                                            .apertures
 | 
			
		||||
@ -121,6 +127,7 @@ impl From<GerberDoc> for Geometry {
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // create empty path set
 | 
			
		||||
        let mut result = clipper2::Paths::new(vec![]);
 | 
			
		||||
        // if path_container.len() > 1 {
 | 
			
		||||
        //     let mut clipper = path_container[1]
 | 
			
		||||
@ -149,15 +156,17 @@ impl From<GerberDoc> for Geometry {
 | 
			
		||||
        //         .unwrap();
 | 
			
		||||
        // }
 | 
			
		||||
 | 
			
		||||
        let mut geo = Paths::new(vec![]);
 | 
			
		||||
        // let mut geo = Paths::new(vec![]);
 | 
			
		||||
 | 
			
		||||
        // union all drawn lines into nets of conductors
 | 
			
		||||
        let conductor_net = union_lines(&path_container);
 | 
			
		||||
 | 
			
		||||
        for outline in &conductor_net {
 | 
			
		||||
            println!("{:?}", outline.included_points);
 | 
			
		||||
            geo.push(outline.outline.clone());
 | 
			
		||||
        }
 | 
			
		||||
        // for outline in &conductor_net {
 | 
			
		||||
        //     println!("{:?}", outline.included_points);
 | 
			
		||||
        //     geo.push(outline.outline.clone());
 | 
			
		||||
        // }
 | 
			
		||||
 | 
			
		||||
        println!("Number of conductor net paths: {}", geo.len());
 | 
			
		||||
        // println!("Number of conductor net paths: {}", geo.len());
 | 
			
		||||
 | 
			
		||||
        if let Some(geo) = union_with_apertures(&added_apertures, conductor_net) {
 | 
			
		||||
            println!("Number of finalized net paths: {}", geo.len());
 | 
			
		||||
@ -175,7 +184,6 @@ impl From<GerberDoc> for Geometry {
 | 
			
		||||
impl Geometry {
 | 
			
		||||
    fn move_position(coord: &Coordinates, position: &mut Point) -> () {
 | 
			
		||||
        if let Ok(pos) = Point::try_from(coord) {
 | 
			
		||||
            debug!("Moved position to {pos:?}");
 | 
			
		||||
            *position = pos;
 | 
			
		||||
        };
 | 
			
		||||
    }
 | 
			
		||||
@ -201,10 +209,10 @@ impl Geometry {
 | 
			
		||||
                )));
 | 
			
		||||
            }
 | 
			
		||||
            Aperture::Obround(o) => {
 | 
			
		||||
                // error!("Unsupported Obround aperture:\r\n{:#?}", o);
 | 
			
		||||
                geometries.push(Element::Obround(Obround::from_aperture_obround(o, target)));
 | 
			
		||||
            }
 | 
			
		||||
            Aperture::Polygon(p) => {
 | 
			
		||||
                // TODO add polygon
 | 
			
		||||
                error!("Unsupported Polygon aperture:\r\n{:#?}", p);
 | 
			
		||||
            }
 | 
			
		||||
            Aperture::Other(o) => {
 | 
			
		||||
 | 
			
		||||
@ -30,7 +30,7 @@ pub fn union_lines(lines: &[LinePath]) -> Vec<ConductorNet> {
 | 
			
		||||
            // create list of intersecting lines
 | 
			
		||||
            let mut intersections = Vec::new();
 | 
			
		||||
            let (p1, q1) = (line.points[0], line.points[1]);
 | 
			
		||||
            println!("LINE 1 {p1:?}, {q1:?}");
 | 
			
		||||
            // println!("LINE 1 {p1:?}, {q1:?}");
 | 
			
		||||
            for (i, l) in lines.iter().enumerate() {
 | 
			
		||||
                if !l.is_empty() {
 | 
			
		||||
                    // do not check for intersection with itself
 | 
			
		||||
@ -38,13 +38,14 @@ pub fn union_lines(lines: &[LinePath]) -> Vec<ConductorNet> {
 | 
			
		||||
                        // check for all lines in path
 | 
			
		||||
                        let intersect = l.points.windows(2).any(|w| {
 | 
			
		||||
                            let (p2, q2) = (w[0], w[1]);
 | 
			
		||||
                            println!("LINE 2 {p2:?}, {q2:?}");
 | 
			
		||||
                            // println!("LINE 2 {p2:?}, {q2:?}");
 | 
			
		||||
                            do_intersect(p1, q1, p2, q2)
 | 
			
		||||
                        });
 | 
			
		||||
                        println!("INTERSECTING: {intersect}");
 | 
			
		||||
                        // println!("INTERSECTING: {intersect}");
 | 
			
		||||
                        if intersect {
 | 
			
		||||
                            // let entry = intersection_map.entry(index).or_insert(Vec::new());
 | 
			
		||||
                            // entry.push(i);
 | 
			
		||||
                            println!("INTERSECTING {:?} and {:?}", line.points, l.points);
 | 
			
		||||
                            intersections.push(i);
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
@ -38,7 +38,7 @@ impl OutlineGeometry {
 | 
			
		||||
        // inflate given path
 | 
			
		||||
        let outline = outline
 | 
			
		||||
            .clone()
 | 
			
		||||
            .inflate((stroke / 2.).into(), JoinType::Round, EndType::Polygon, 2.0)
 | 
			
		||||
            .inflate((stroke / 2.).into(), JoinType::Miter, EndType::Polygon, 30.)
 | 
			
		||||
            .simplify(0.01, false);
 | 
			
		||||
        Self {
 | 
			
		||||
            // path: outline,
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user