GCodeProcessor -> Added parsing of 3d part generated gcodes

This commit is contained in:
enricoturri1966 2020-07-27 15:45:29 +02:00
parent 48ae8dc9a2
commit 14366800e2
3 changed files with 335 additions and 0 deletions

View file

@ -296,6 +296,14 @@ void GCodeProcessor::TimeProcessor::reset()
machines[static_cast<size_t>(ETimeMode::Normal)].enabled = true;
}
const std::vector<std::pair<GCodeProcessor::EProducer, std::string>> GCodeProcessor::Producers = {
{ EProducer::PrusaSlicer, "PrusaSlicer" },
{ EProducer::Cura, "Cura" },
{ EProducer::Simplify3D, "Simplify3D" },
{ EProducer::CraftWare, "CraftWare" },
{ EProducer::ideaMaker, "ideaMaker" }
};
unsigned int GCodeProcessor::s_result_id = 0;
void GCodeProcessor::apply_config(const PrintConfig& config)
@ -364,6 +372,9 @@ void GCodeProcessor::reset()
m_extruders_color = ExtrudersColor();
m_cp_color.reset();
m_producer = EProducer::Unknown;
m_producers_enabled = false;
m_time_processor.reset();
m_result.reset();
@ -539,6 +550,13 @@ void GCodeProcessor::process_gcode_line(const GCodeReader::GCodeLine& line)
void GCodeProcessor::process_tags(const std::string& comment)
{
if (m_producers_enabled && m_producer == EProducer::Unknown && detect_producer(comment))
return;
else if (m_producers_enabled && m_producer != EProducer::Unknown) {
if (process_producers_tags(comment))
return;
}
// extrusion role tag
size_t pos = comment.find(Extrusion_Role_Tag);
if (pos != comment.npos) {
@ -645,6 +663,299 @@ void GCodeProcessor::process_tags(const std::string& comment)
}
}
bool GCodeProcessor::process_producers_tags(const std::string& comment)
{
switch (m_producer)
{
case EProducer::PrusaSlicer: { return process_prusaslicer_tags(comment); }
case EProducer::Cura: { return process_cura_tags(comment); }
case EProducer::Simplify3D: { return process_simplify3d_tags(comment); }
case EProducer::CraftWare: { return process_craftware_tags(comment); }
case EProducer::ideaMaker: { return process_ideamaker_tags(comment); }
default: { return false; }
}
}
bool GCodeProcessor::process_prusaslicer_tags(const std::string& comment)
{
std::cout << comment << "\n";
return false;
}
bool GCodeProcessor::process_cura_tags(const std::string& comment)
{
// TYPE -> extrusion role
std::string tag = "TYPE:";
size_t pos = comment.find(tag);
if (pos != comment.npos) {
std::string type = comment.substr(pos + tag.length());
if (type == "SKIRT")
m_extrusion_role = erSkirt;
else if (type == "WALL-OUTER")
m_extrusion_role = erExternalPerimeter;
else if (type == "WALL-INNER")
m_extrusion_role = erPerimeter;
else if (type == "SKIN")
m_extrusion_role = erSolidInfill;
else if (type == "FILL")
m_extrusion_role = erInternalInfill;
else if (type == "SUPPORT")
m_extrusion_role = erSupportMaterial;
else if (type == "SUPPORT-INTERFACE")
m_extrusion_role = erSupportMaterialInterface;
else if (type == "PRIME-TOWER")
m_extrusion_role = erWipeTower;
else {
m_extrusion_role = erNone;
BOOST_LOG_TRIVIAL(warning) << "GCodeProcessor found unknown extrusion role: " << type;
}
return true;
}
return false;
}
bool GCodeProcessor::process_simplify3d_tags(const std::string& comment)
{
// extrusion roles
// ; skirt
size_t pos = comment.find(" skirt");
if (pos == 0) {
m_extrusion_role = erSkirt;
return true;
}
// ; outer perimeter
pos = comment.find(" outer perimeter");
if (pos == 0) {
m_extrusion_role = erExternalPerimeter;
return true;
}
// ; inner perimeter
pos = comment.find(" inner perimeter");
if (pos == 0) {
m_extrusion_role = erPerimeter;
return true;
}
// ; gap fill
pos = comment.find(" gap fill");
if (pos == 0) {
m_extrusion_role = erGapFill;
return true;
}
// ; infill
pos = comment.find(" infill");
if (pos == 0) {
m_extrusion_role = erInternalInfill;
return true;
}
// ; solid layer
pos = comment.find(" solid layer");
if (pos == 0) {
m_extrusion_role = erNone; // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
return true;
}
// ; bridge
pos = comment.find(" bridge");
if (pos == 0) {
m_extrusion_role = erBridgeInfill;
return true;
}
// ; support
pos = comment.find(" support");
if (pos == 0) {
m_extrusion_role = erSupportMaterial;
return true;
}
// ; prime pillar
pos = comment.find(" prime pillar");
if (pos == 0) {
m_extrusion_role = erWipeTower;
return true;
}
// ; ooze shield
pos = comment.find(" ooze shield");
if (pos == 0) {
m_extrusion_role = erNone; // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
return true;
}
// ; raft
pos = comment.find(" raft");
if (pos == 0) {
m_extrusion_role = erSkirt;
return true;
}
// geometry
// ; tool
std::string tag = " tool";
pos = comment.find(tag);
if (pos == 0) {
std::string data = comment.substr(pos + tag.length());
std::string h_tag = "H";
size_t h_start = data.find(h_tag);
size_t h_end = data.find_first_of(' ', h_start);
std::string w_tag = "W";
size_t w_start = data.find(w_tag);
size_t w_end = data.find_first_of(' ', w_start);
if (h_start != data.npos) {
try
{
std::string test = data.substr(h_start + 1, (h_end != data.npos) ? h_end - h_start - 1 : h_end);
m_height = std::stof(data.substr(h_start + 1, (h_end != data.npos) ? h_end - h_start - 1 : h_end));
}
catch (...)
{
BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid value for Height (" << comment << ").";
}
}
if (w_start != data.npos) {
try
{
std::string test = data.substr(w_start + 1, (w_end != data.npos) ? w_end - w_start - 1 : w_end);
m_width = std::stof(data.substr(w_start + 1, (w_end != data.npos) ? w_end - w_start - 1 : w_end));
}
catch (...)
{
BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid value for Width (" << comment << ").";
}
}
return true;
}
std::cout << comment << "\n";
return false;
}
bool GCodeProcessor::process_craftware_tags(const std::string& comment)
{
// segType -> extrusion role
std::string tag = "segType:";
size_t pos = comment.find(tag);
if (pos != comment.npos) {
std::string type = comment.substr(pos + tag.length());
if (type == "Skirt")
m_extrusion_role = erSkirt;
else if (type == "Perimeter")
m_extrusion_role = erExternalPerimeter;
else if (type == "HShell")
m_extrusion_role = erNone; // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
else if (type == "InnerHair")
m_extrusion_role = erNone; // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
else if (type == "Loop")
m_extrusion_role = erNone; // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
else if (type == "Infill")
m_extrusion_role = erInternalInfill;
else if (type == "Raft")
m_extrusion_role = erSkirt;
else if (type == "Support")
m_extrusion_role = erSupportMaterial;
else if (type == "SupportTouch")
m_extrusion_role = erSupportMaterial;
else if (type == "SoftSupport")
m_extrusion_role = erSupportMaterialInterface;
else if (type == "Pillar")
m_extrusion_role = erWipeTower;
else {
m_extrusion_role = erNone;
BOOST_LOG_TRIVIAL(warning) << "GCodeProcessor found unknown extrusion role: " << type;
}
return true;
}
return false;
}
bool GCodeProcessor::process_ideamaker_tags(const std::string& comment)
{
// TYPE -> extrusion role
std::string tag = "TYPE:";
size_t pos = comment.find(tag);
if (pos != comment.npos) {
std::string type = comment.substr(pos + tag.length());
if (type == "RAFT")
m_extrusion_role = erSkirt;
else if (type == "WALL-OUTER")
m_extrusion_role = erExternalPerimeter;
else if (type == "WALL-INNER")
m_extrusion_role = erPerimeter;
else if (type == "SOLID-FILL")
m_extrusion_role = erSolidInfill;
else if (type == "FILL")
m_extrusion_role = erInternalInfill;
else if (type == "BRIDGE")
m_extrusion_role = erBridgeInfill;
else if (type == "SUPPORT")
m_extrusion_role = erSupportMaterial;
else {
m_extrusion_role = erNone;
BOOST_LOG_TRIVIAL(warning) << "GCodeProcessor found unknown extrusion role: " << type;
}
return true;
}
// geometry
// width
tag = "WIDTH:";
pos = comment.find(tag);
if (pos != comment.npos) {
try
{
m_width = std::stof(comment.substr(pos + tag.length()));
}
catch (...)
{
BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid value for Width (" << comment << ").";
}
return true;
}
// height
tag = "HEIGHT:";
pos = comment.find(tag);
if (pos != comment.npos) {
try
{
m_height = std::stof(comment.substr(pos + tag.length()));
}
catch (...)
{
BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid value for Height (" << comment << ").";
}
return true;
}
return false;
}
bool GCodeProcessor::detect_producer(const std::string& comment)
{
for (const auto& [id, search_string] : Producers) {
size_t pos = comment.find(search_string);
if (pos != comment.npos) {
m_producer = id;
BOOST_LOG_TRIVIAL(info) << "Detected gcode producer: " << search_string;
return true;
}
}
return false;
}
void GCodeProcessor::process_G0(const GCodeReader::GCodeLine& line)
{
process_G1(line);

View file

@ -243,6 +243,20 @@ namespace Slic3r {
ExtrudersColor m_extruders_color;
CpColor m_cp_color;
enum class EProducer
{
Unknown,
PrusaSlicer,
Cura,
Simplify3D,
CraftWare,
ideaMaker
};
static const std::vector<std::pair<GCodeProcessor::EProducer, std::string>> Producers;
EProducer m_producer;
bool m_producers_enabled;
TimeProcessor m_time_processor;
Result m_result;
@ -253,6 +267,7 @@ namespace Slic3r {
void apply_config(const PrintConfig& config);
void enable_stealth_time_estimator(bool enabled);
void enable_producers(bool enabled) { m_producers_enabled = enabled; }
void reset();
const Result& get_result() const { return m_result; }
@ -274,6 +289,14 @@ namespace Slic3r {
// Process tags embedded into comments
void process_tags(const std::string& comment);
bool process_producers_tags(const std::string& comment);
bool process_prusaslicer_tags(const std::string& comment);
bool process_cura_tags(const std::string& comment);
bool process_simplify3d_tags(const std::string& comment);
bool process_craftware_tags(const std::string& comment);
bool process_ideamaker_tags(const std::string& comment);
bool detect_producer(const std::string& comment);
// Move
void process_G0(const GCodeReader::GCodeLine& line);

View file

@ -4662,6 +4662,7 @@ void Plater::load_gcode(const wxString& filename)
// process gcode
GCodeProcessor processor;
// processor.apply_config(config);
processor.enable_producers(true);
processor.process_file(filename.ToUTF8().data());
p->gcode_result = std::move(processor.extract_result());