mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-07-15 02:37:51 -06:00
Ported the G-code generator from Perl to C++.
Removed GCode.pm Removed the Perl bindigns for AvoidCrossingPerimeters, OozePrevention, SpiralVase, Wipe Changed the std::set of extruder IDs to vector of IDs. Removed some MSVC compiler warnings, removed obnoxious compiler warnings when compiling the Perl bindings.
This commit is contained in:
parent
72ae3585e4
commit
e90279c513
52 changed files with 1362 additions and 1632 deletions
|
@ -30,7 +30,7 @@ Print::~Print()
|
|||
void
|
||||
Print::clear_objects()
|
||||
{
|
||||
for (int i = this->objects.size()-1; i >= 0; --i)
|
||||
for (int i = int(this->objects.size())-1; i >= 0; --i)
|
||||
this->delete_object(i);
|
||||
|
||||
this->clear_regions();
|
||||
|
@ -255,70 +255,65 @@ Print::step_done(PrintObjectStep step) const
|
|||
}
|
||||
|
||||
// returns 0-based indices of used extruders
|
||||
std::set<size_t>
|
||||
Print::object_extruders() const
|
||||
std::vector<unsigned int> Print::object_extruders() const
|
||||
{
|
||||
std::set<size_t> extruders;
|
||||
std::vector<unsigned int> extruders;
|
||||
|
||||
FOREACH_REGION(this, region) {
|
||||
// these checks reflect the same logic used in the GUI for enabling/disabling
|
||||
// extruder selection fields
|
||||
if ((*region)->config.perimeters.value > 0 || this->config.brim_width.value > 0)
|
||||
extruders.insert((*region)->config.perimeter_extruder - 1);
|
||||
|
||||
extruders.push_back((*region)->config.perimeter_extruder - 1);
|
||||
if ((*region)->config.fill_density.value > 0)
|
||||
extruders.insert((*region)->config.infill_extruder - 1);
|
||||
|
||||
extruders.push_back((*region)->config.infill_extruder - 1);
|
||||
if ((*region)->config.top_solid_layers.value > 0 || (*region)->config.bottom_solid_layers.value > 0)
|
||||
extruders.insert((*region)->config.solid_infill_extruder - 1);
|
||||
extruders.push_back((*region)->config.solid_infill_extruder - 1);
|
||||
}
|
||||
|
||||
std::sort(extruders.begin(), extruders.end());
|
||||
extruders.erase(std::unique(extruders.begin(), extruders.end()), extruders.end());
|
||||
return extruders;
|
||||
}
|
||||
|
||||
// returns 0-based indices of used extruders
|
||||
std::set<size_t>
|
||||
Print::support_material_extruders() const
|
||||
std::vector<unsigned int> Print::support_material_extruders() const
|
||||
{
|
||||
std::set<size_t> extruders;
|
||||
std::vector<unsigned int> extruders;
|
||||
bool support_uses_current_extruder = false;
|
||||
|
||||
FOREACH_OBJECT(this, object) {
|
||||
if ((*object)->has_support_material()) {
|
||||
if ((*object)->config.support_material_extruder == 0)
|
||||
for (PrintObject *object : this->objects) {
|
||||
if (object->has_support_material()) {
|
||||
if (object->config.support_material_extruder == 0)
|
||||
support_uses_current_extruder = true;
|
||||
else
|
||||
extruders.insert((*object)->config.support_material_extruder - 1);
|
||||
if ((*object)->config.support_material_interface_extruder == 0)
|
||||
extruders.push_back(object->config.support_material_extruder - 1);
|
||||
if (object->config.support_material_interface_extruder == 0)
|
||||
support_uses_current_extruder = true;
|
||||
else
|
||||
extruders.insert((*object)->config.support_material_interface_extruder - 1);
|
||||
extruders.push_back(object->config.support_material_interface_extruder - 1);
|
||||
}
|
||||
}
|
||||
|
||||
if (support_uses_current_extruder) {
|
||||
if (support_uses_current_extruder)
|
||||
// Add all object extruders to the support extruders as it is not know which one will be used to print supports.
|
||||
std::set<size_t> object_extruders = this->object_extruders();
|
||||
extruders.insert(object_extruders.begin(), object_extruders.end());
|
||||
}
|
||||
append(extruders, this->object_extruders());
|
||||
|
||||
std::sort(extruders.begin(), extruders.end());
|
||||
extruders.erase(std::unique(extruders.begin(), extruders.end()), extruders.end());
|
||||
return extruders;
|
||||
}
|
||||
|
||||
// returns 0-based indices of used extruders
|
||||
std::set<size_t>
|
||||
Print::extruders() const
|
||||
std::vector<unsigned int> Print::extruders() const
|
||||
{
|
||||
std::set<size_t> extruders = this->object_extruders();
|
||||
|
||||
std::set<size_t> s_extruders = this->support_material_extruders();
|
||||
extruders.insert(s_extruders.begin(), s_extruders.end());
|
||||
|
||||
std::vector<unsigned int> extruders = this->object_extruders();
|
||||
append(extruders, this->support_material_extruders());
|
||||
std::sort(extruders.begin(), extruders.end());
|
||||
extruders.erase(std::unique(extruders.begin(), extruders.end()), extruders.end());
|
||||
return extruders;
|
||||
}
|
||||
|
||||
void
|
||||
Print::_simplify_slices(double distance)
|
||||
void Print::_simplify_slices(double distance)
|
||||
{
|
||||
FOREACH_OBJECT(this, object) {
|
||||
FOREACH_LAYER(*object, layer) {
|
||||
|
@ -330,23 +325,17 @@ Print::_simplify_slices(double distance)
|
|||
}
|
||||
}
|
||||
|
||||
double
|
||||
Print::max_allowed_layer_height() const
|
||||
double Print::max_allowed_layer_height() const
|
||||
{
|
||||
std::vector<double> nozzle_diameter;
|
||||
|
||||
std::set<size_t> extruders = this->extruders();
|
||||
for (std::set<size_t>::const_iterator e = extruders.begin(); e != extruders.end(); ++e) {
|
||||
nozzle_diameter.push_back(this->config.nozzle_diameter.get_at(*e));
|
||||
}
|
||||
|
||||
return *std::max_element(nozzle_diameter.begin(), nozzle_diameter.end());
|
||||
double nozzle_diameter_max = 0.;
|
||||
for (unsigned int extruder_id : this->extruders())
|
||||
nozzle_diameter_max = std::max(nozzle_diameter_max, this->config.nozzle_diameter.get_at(extruder_id));
|
||||
return nozzle_diameter_max;
|
||||
}
|
||||
|
||||
/* Caller is responsible for supplying models whose objects don't collide
|
||||
and have explicit instance positions */
|
||||
void
|
||||
Print::add_model_object(ModelObject* model_object, int idx)
|
||||
void Print::add_model_object(ModelObject* model_object, int idx)
|
||||
{
|
||||
DynamicPrintConfig object_config = model_object->config; // clone
|
||||
object_config.normalize();
|
||||
|
@ -617,9 +606,9 @@ Print::validate() const
|
|||
convex_hull = offset(convex_hull, scale_(this->config.extruder_clearance_radius.value)/2, jtRound, scale_(0.1)).front();
|
||||
|
||||
// now we check that no instance of convex_hull intersects any of the previously checked object instances
|
||||
for (Points::const_iterator copy = object->_shifted_copies.begin(); copy != object->_shifted_copies.end(); ++copy) {
|
||||
for (const Point © : object->_shifted_copies) {
|
||||
Polygon p = convex_hull;
|
||||
p.translate(*copy);
|
||||
p.translate(copy);
|
||||
if (! intersection(a, p).empty())
|
||||
return "Some objects are too close; your extruder will collide with them.";
|
||||
polygons_append(a, p);
|
||||
|
@ -654,13 +643,13 @@ Print::validate() const
|
|||
|
||||
{
|
||||
// find the smallest nozzle diameter
|
||||
std::set<size_t> extruders = this->extruders();
|
||||
std::vector<unsigned int> extruders = this->extruders();
|
||||
if (extruders.empty())
|
||||
return "The supplied settings will cause an empty print.";
|
||||
|
||||
std::set<double> nozzle_diameters;
|
||||
for (std::set<size_t>::iterator it = extruders.begin(); it != extruders.end(); ++it)
|
||||
nozzle_diameters.insert(this->config.nozzle_diameter.get_at(*it));
|
||||
std::vector<double> nozzle_diameters;
|
||||
for (unsigned int extruder_id : extruders)
|
||||
nozzle_diameters.push_back(this->config.nozzle_diameter.get_at(extruder_id));
|
||||
double min_nozzle_diameter = *std::min_element(nozzle_diameters.begin(), nozzle_diameters.end());
|
||||
|
||||
FOREACH_OBJECT(this, i_object) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue