void GCodePlanner::addLinesByOptimizer(Polygons& polygons, GCodePathConfig* config, int wipe_dist) { LineOrderOptimizer orderOptimizer(lastPosition); for(unsigned int i=0;i<polygons.size();i++) orderOptimizer.addPolygon(polygons[i]); orderOptimizer.optimize(); for(unsigned int i=0;i<orderOptimizer.polyOrder.size();i++) { int nr = orderOptimizer.polyOrder[i]; // addPolygon(polygons[nr], orderOptimizer.polyStart[nr], config); PolygonRef polygon = polygons[nr]; int start = orderOptimizer.polyStart[nr]; int end = 1 - start; Point& p0 = polygon[start]; addTravel(p0); Point& p1 = polygon[end]; addExtrusionMove(p1, config); if (wipe_dist != 0) { int line_width = config->getLineWidth(); if (vSize2(p1-p0) > line_width * line_width * 4) { // otherwise line will get optimized by combining multiple into a single extrusion move addExtrusionMove(p1 + normal(p1-p0, wipe_dist), config, 0.0); } } } }
void GCodePlanner::moveInsideCombBoundary() { if (!comb || comb->checkInside(lastPosition)) return; Point p = lastPosition; if (comb->moveInside(p)) { addTravel(p); //Make sure the that any retraction happens after this move, not before it by starting a new move path. forceNewPathStart(); } }
void GCodePlanner::addPolygon(ClipperLib::Polygon& polygon, int startIdx, GCodePathConfig* config) { Point p0 = polygon[startIdx]; addTravel(p0); for(unsigned int i=1; i<polygon.size(); i++) { Point p1 = polygon[(startIdx + i) % polygon.size()]; addExtrusionMove(p1, config); p0 = p1; } if (polygon.size() > 2) addExtrusionMove(polygon[startIdx], config); }
void GCodePlanner::moveInsideCombBoundary(int distance) { if (!comb || comb->checkInside(lastPosition)) return; Point p = lastPosition; if (comb->moveInside(&p, distance)) { //Move inside again, so we move out of tight 90deg corners comb->moveInside(&p, distance); addTravel(p); //Make sure the that any retraction happens after this move, not before it by starting a new move path. forceNewPathStart(); } }
void GCodePlanner::addPolygon(PolygonRef polygon, int startIdx, GCodePathConfig* config, WallOverlapComputation* wall_overlap_computation) { Point p0 = polygon[startIdx]; addTravel(p0); for(unsigned int i=1; i<polygon.size(); i++) { Point p1 = polygon[(startIdx + i) % polygon.size()]; addExtrusionMove(p1, config, (wall_overlap_computation)? wall_overlap_computation->getFlow(p0, p1) : 1.0); p0 = p1; } if (polygon.size() > 2) { Point& p1 = polygon[startIdx]; addExtrusionMove(p1, config, (wall_overlap_computation)? wall_overlap_computation->getFlow(p0, p1) : 1.0); } }
bool GCodePlanner::setExtruder(int extruder) { if (extruder == currentExtruder) { return false; } SettingsBase* train = storage.meshgroup->getExtruderTrain(currentExtruder); bool end_pos_absolute = train->getSettingBoolean("machine_extruder_end_pos_abs"); Point end_pos(train->getSettingInMicrons("machine_extruder_end_pos_x"), train->getSettingInMicrons("machine_extruder_end_pos_y")); addTravel((end_pos_absolute)? end_pos : lastPosition + end_pos); currentExtruder = extruder; // the extruder switch forceNewPathStart(); train = storage.meshgroup->getExtruderTrain(currentExtruder); bool start_pos_absolute = train->getSettingBoolean("machine_extruder_start_pos_abs"); Point start_pos(train->getSettingInMicrons("machine_extruder_start_pos_x"), train->getSettingInMicrons("machine_extruder_start_pos_y")); lastPosition = (start_pos_absolute)? start_pos : lastPosition + start_pos; return true; }