Comparar commits

..

4 Commits

7 arquivos alterados com 124 adições e 61 exclusões
+71 -51
Ver Arquivo
@@ -108,6 +108,7 @@ private:
gcode.setSwitchExtruderCode(config.preSwitchExtruderCode, config.postSwitchExtruderCode);
gcode.setFlavor(config.gcodeFlavor);
gcode.setRetractionSettings(config.retractionAmount, config.retractionSpeed, config.retractionAmountExtruderSwitch, config.minimalExtrusionBeforeRetraction, config.retractionZHop, config.retractionAmountPrime);
gcode.applyAccelerationSettings(config);
}
bool prepareModel(SliceDataStorage& storage, const std::vector<std::string> &files)
@@ -344,6 +345,8 @@ private:
gcode.writeComment("TIME:<__TIME__>");
gcode.writeComment("MATERIAL:<FILAMENT>");
gcode.writeComment("MATERIAL2:<FILAMEN2>");
gcode.writeComment("NOZZLE_DIAMETER:%f", float(config.nozzleSize) / 1000);
gcode.writeComment("NOZZLE_DIAMETER2:%f", float(config.nozzleSize) / 1000);
}
gcode.writeCode(config.startCode.c_str());
if (gcode.getFlavor() == GCODE_FLAVOR_BFB)
@@ -604,65 +607,22 @@ private:
gcodeLayer.setAlwaysRetract(false);
}
Polygons infillPolygons;
int fillAngle = 45;
if (layerNr & 1)
fillAngle += 90;
int extrusionWidth = config.extrusionWidth;
if (layerNr == 0)
extrusionWidth = config.layer0extrusionWidth;
if (config.sparseInfillLineDistance > 0)
// Add either infill or perimeter first depending on option
if (!config.perimeterBeforeInfill)
{
switch (config.infillPattern)
{
case INFILL_AUTOMATIC:
generateAutomaticInfill(
part->sparseOutline, infillPolygons, extrusionWidth,
config.sparseInfillLineDistance,
config.infillOverlap, fillAngle);
break;
case INFILL_GRID:
generateGridInfill(part->sparseOutline, infillPolygons,
extrusionWidth,
config.sparseInfillLineDistance,
config.infillOverlap, fillAngle);
break;
case INFILL_LINES:
generateLineInfill(part->sparseOutline, infillPolygons,
extrusionWidth,
config.sparseInfillLineDistance,
config.infillOverlap, fillAngle);
break;
case INFILL_CONCENTRIC:
generateConcentricInfill(
part->sparseOutline, infillPolygons,
config.sparseInfillLineDistance);
break;
}
}
gcodeLayer.addPolygonsByOptimizer(infillPolygons, &infillConfig);
//sendPolygonsToGui("infill", layerNr, layer->z, fillPolygons);
if (config.insetCount > 0)
addInfillToGCode(part, gcodeLayer, layerNr, extrusionWidth, fillAngle);
addInsetToGCode(part, gcodeLayer, layerNr);
}else
{
if (config.spiralizeMode)
{
if (static_cast<int>(layerNr) >= config.downSkinCount)
inset0Config.spiralize = true;
if (static_cast<int>(layerNr) == config.downSkinCount && part->insets.size() > 0)
gcodeLayer.addPolygonsByOptimizer(part->insets[0], &insetXConfig);
}
for(int insetNr=part->insets.size()-1; insetNr>-1; insetNr--)
{
if (insetNr == 0)
gcodeLayer.addPolygonsByOptimizer(part->insets[insetNr], &inset0Config);
else
gcodeLayer.addPolygonsByOptimizer(part->insets[insetNr], &insetXConfig);
}
addInsetToGCode(part, gcodeLayer, layerNr);
addInfillToGCode(part, gcodeLayer, layerNr, extrusionWidth, fillAngle);
}
Polygons skinPolygons;
@@ -688,6 +648,66 @@ private:
gcodeLayer.setCombBoundary(nullptr);
}
void addInfillToGCode(SliceLayerPart* part, GCodePlanner& gcodeLayer, int layerNr, int extrusionWidth, int fillAngle)
{
Polygons infillPolygons;
if (config.sparseInfillLineDistance > 0)
{
switch (config.infillPattern)
{
case INFILL_AUTOMATIC:
generateAutomaticInfill(
part->sparseOutline, infillPolygons, extrusionWidth,
config.sparseInfillLineDistance,
config.infillOverlap, fillAngle);
break;
case INFILL_GRID:
generateGridInfill(part->sparseOutline, infillPolygons,
extrusionWidth,
config.sparseInfillLineDistance,
config.infillOverlap, fillAngle);
break;
case INFILL_LINES:
generateLineInfill(part->sparseOutline, infillPolygons,
extrusionWidth,
config.sparseInfillLineDistance,
config.infillOverlap, fillAngle);
break;
case INFILL_CONCENTRIC:
generateConcentricInfill(
part->sparseOutline, infillPolygons,
config.sparseInfillLineDistance);
break;
}
}
gcodeLayer.addPolygonsByOptimizer(infillPolygons, &infillConfig);
}
void addInsetToGCode(SliceLayerPart* part, GCodePlanner& gcodeLayer, int layerNr)
{
if (config.insetCount > 0)
{
if (config.spiralizeMode)
{
if (static_cast<int>(layerNr) >= config.downSkinCount)
inset0Config.spiralize = true;
if (static_cast<int>(layerNr) == config.downSkinCount && part->insets.size() > 0)
gcodeLayer.addPolygonsByOptimizer(part->insets[0], &insetXConfig);
}
for(int insetNr=part->insets.size()-1; insetNr>-1; insetNr--)
{
if (insetNr == 0)
gcodeLayer.addPolygonsByOptimizer(part->insets[insetNr], &inset0Config);
else
gcodeLayer.addPolygonsByOptimizer(part->insets[insetNr], &insetXConfig);
}
}
}
void addSupportToGCode(SliceDataStorage& storage, GCodePlanner& gcodeLayer, int layerNr)
{
if (!storage.support.generated)
+6
Ver Arquivo
@@ -85,6 +85,7 @@ void GCodeExport::setFlavor(int flavor)
for(int n=0; n<MAX_EXTRUDERS; n++)
extruderCharacter[n] = 'E';
}
int GCodeExport::getFlavor()
{
return this->flavor;
@@ -119,6 +120,11 @@ void GCodeExport::setRetractionSettings(int retractionAmount, int retractionSpee
this->retractionZHop = zHop;
}
void GCodeExport::applyAccelerationSettings(ConfigSettings& config)
{
estimateCalculator.applyAccelerationSettings(config);
}
void GCodeExport::setZ(int z)
{
this->zPos = z;
+2
Ver Arquivo
@@ -64,6 +64,8 @@ public:
void setRetractionSettings(int retractionAmount, int retractionSpeed, int extruderSwitchRetraction, int minimalExtrusionBeforeRetraction, int zHop, int retractionAmountPrime);
void applyAccelerationSettings(ConfigSettings& config);
void setZ(int z);
Point getPositionXY();
+16 -3
Ver Arquivo
@@ -18,6 +18,7 @@ ConfigSettings *ConfigSettings::config = NULL;
ConfigSettings::ConfigSettings()
{
config = this;
SETTING(nozzleSize, 400);
SETTING(layerThickness, 100);
SETTING(initialLayerThickness, 300);
SETTING(filamentDiameter, 2890);
@@ -44,6 +45,7 @@ ConfigSettings::ConfigSettings()
SETTING(infillSpeed, 50);
SETTING(infillPattern, INFILL_AUTOMATIC);
SETTING(skinSpeed, 50);
SETTING(perimeterBeforeInfill, 0);
SETTING(supportType, SUPPORT_TYPE_GRID);
SETTING(supportAngle, -1);
@@ -150,6 +152,17 @@ ConfigSettings::ConfigSettings()
"G28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\n"
"M84 ;steppers off\n"
"G90 ;absolute positioning\n";
//Time estimate settings
SETTING(acceleration, 3000 * 1000);
SETTING(max_acceleration[0], 9000 * 1000);
SETTING(max_acceleration[1], 9000 * 1000);
SETTING(max_acceleration[2], 100 * 1000);
SETTING(max_acceleration[3], 10000 * 1000);
SETTING(max_xy_jerk, 20.0 * 1000);
SETTING(max_z_jerk, 0.4 * 1000);
SETTING(max_e_jerk, 5.0 * 1000);
}
#undef STRINGIFY
@@ -199,7 +212,7 @@ bool ConfigSettings::readSettings(const char* path) {
if(!config.good()) return false;
while(config.good()) {
while(config.good()) {
bool multilineContent = false;
size_t pos = std::string::npos;
std::getline(config, line);
@@ -223,7 +236,7 @@ bool ConfigSettings::readSettings(const char* path) {
// Are we about to read a multiline string?
if(val == CONFIG_MULTILINE_SEPARATOR) {
val = "";
val = "";
multilineContent = true;
bool done_multiline = false;
@@ -245,7 +258,7 @@ bool ConfigSettings::readSettings(const char* path) {
// to the parsed value
RTRIM_STRING(val);
}
else {
else {
line += "\n";
val += line;
}
+9
Ver Arquivo
@@ -126,6 +126,7 @@ private:
std::vector<_ConfigSettingIndex> _index;
public:
static ConfigSettings *config; // allow access to config settings from everywhere
int nozzleSize;
int layerThickness;
int initialLayerThickness;
int filamentDiameter;
@@ -167,6 +168,7 @@ public:
int infillSpeed;
int infillPattern;
int skinSpeed;
int perimeterBeforeInfill;
//Support material
int supportType;
@@ -217,6 +219,13 @@ public:
std::string endCode;
std::string preSwitchExtruderCode;
std::string postSwitchExtruderCode;
//Time estimate settings
int acceleration;
int max_acceleration[4];
int max_xy_jerk;
int max_z_jerk;
int max_e_jerk;
ConfigSettings();
bool setSetting(const char* key, const char* value);
+17 -7
Ver Arquivo
@@ -6,16 +6,26 @@
#define MINIMUM_PLANNER_SPEED 0.05// (mm/sec)
const double max_feedrate[TimeEstimateCalculator::NUM_AXIS] = {600, 600, 40, 25};
const double minimumfeedrate = 0.01;
const double acceleration = 3000;
const double max_acceleration[TimeEstimateCalculator::NUM_AXIS] = {9000,9000,100,10000};
const double max_xy_jerk = 20.0;
const double max_z_jerk = 0.4;
const double max_e_jerk = 5.0;
static double max_feedrate[TimeEstimateCalculator::NUM_AXIS] = {600, 600, 40, 25};
static double minimumfeedrate = 0.01;
static double acceleration = 3000;
static double max_acceleration[TimeEstimateCalculator::NUM_AXIS] = {9000,9000,100,10000};
static double max_xy_jerk = 20.0;
static double max_z_jerk = 0.4;
static double max_e_jerk = 5.0;
template<typename T> const T square(const T& a) { return a * a; }
void TimeEstimateCalculator::applyAccelerationSettings(ConfigSettings& config)
{
acceleration = float(config.acceleration) / 1000.0;
for(unsigned int n=0; n<TimeEstimateCalculator::NUM_AXIS; n++)
max_acceleration[n] = float(config.max_acceleration[n]) / 1000.0;
max_xy_jerk = float(config.max_xy_jerk) / 1000.0;
max_z_jerk = float(config.max_z_jerk) / 1000.0;
max_e_jerk = float(config.max_e_jerk) / 1000.0;
}
void TimeEstimateCalculator::setPosition(Position newPos)
{
currentPosition = newPos;
+3
Ver Arquivo
@@ -1,6 +1,7 @@
#ifndef TIME_ESTIMATE_H
#define TIME_ESTIMATE_H
#include "settings.h"
#include <stdint.h>
#include <vector>
@@ -58,6 +59,8 @@ private:
std::vector<Block> blocks;
public:
void applyAccelerationSettings(ConfigSettings& config);
void setPosition(Position newPos);
void plan(Position newPos, double feedRate);
void reset();