mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-07-12 09:17:52 -06:00
Fills were reimplemented in C++.
While reimplementing the FillPlanePath code, the octagon infill was fixed to extrude the right amount of material.
This commit is contained in:
parent
7da68c91a5
commit
be3e4caf1d
12 changed files with 1162 additions and 0 deletions
83
xs/src/libslic3r/Fill/FillBase.cpp
Normal file
83
xs/src/libslic3r/Fill/FillBase.cpp
Normal file
|
@ -0,0 +1,83 @@
|
|||
#include "../Surface.hpp"
|
||||
|
||||
#include "FillBase.hpp"
|
||||
#include "FillConcentric.hpp"
|
||||
#include "FillHoneycomb.hpp"
|
||||
#include "Fill3DHoneycomb.hpp"
|
||||
#include "FillPlanePath.hpp"
|
||||
#include "FillRectilinear.hpp"
|
||||
|
||||
namespace Slic3r {
|
||||
|
||||
Fill* Fill::new_from_type(const std::string &type)
|
||||
{
|
||||
if (type == "concentric")
|
||||
return new FillConcentric();
|
||||
if (type == "honeycomb")
|
||||
return new FillHoneycomb();
|
||||
if (type == "3dhoneycomb")
|
||||
return new Fill3DHoneycomb();
|
||||
if (type == "rectilinear")
|
||||
return new FillRectilinear();
|
||||
if (type == "line")
|
||||
return new FillLine();
|
||||
if (type == "grid")
|
||||
return new FillGrid();
|
||||
if (type == "archimedeanchords")
|
||||
return new FillArchimedeanChords();
|
||||
if (type == "hilbertcurve")
|
||||
return new FillHilbertCurve();
|
||||
if (type == "octagramspiral")
|
||||
return new FillOctagramSpiral();
|
||||
CONFESS("unknown type");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
coord_t Fill::adjust_solid_spacing(const coord_t width, const coord_t distance)
|
||||
{
|
||||
coord_t number_of_lines = coord_t(coordf_t(width) / coordf_t(distance)) + 1;
|
||||
coord_t extra_space = width % distance;
|
||||
return (number_of_lines <= 1) ?
|
||||
distance :
|
||||
distance + extra_space / (number_of_lines - 1);
|
||||
}
|
||||
|
||||
std::pair<float, Point> FillWithDirection::infill_direction(const Surface *surface) const
|
||||
{
|
||||
// set infill angle
|
||||
float out_angle = this->angle;
|
||||
|
||||
if (out_angle == FLT_MAX) {
|
||||
//FIXME Vojtech: Add a warning?
|
||||
// warn "Using undefined infill angle";
|
||||
out_angle = 0.f;
|
||||
}
|
||||
|
||||
Point out_shift = empty(this->bounding_box) ?
|
||||
surface->expolygon.contour.bounding_box().center() :
|
||||
this->bounding_box.center();
|
||||
|
||||
if (surface->bridge_angle >= 0) {
|
||||
// use bridge angle
|
||||
//FIXME Vojtech: Add a debugf?
|
||||
// Slic3r::debugf "Filling bridge with angle %d\n", rad2deg($surface->bridge_angle);
|
||||
#if 1
|
||||
//#ifdef _DEBUG
|
||||
printf("Filling bridge with angle %f\n", surface->bridge_angle);
|
||||
#endif /* _DEBUG */
|
||||
out_angle = surface->bridge_angle;
|
||||
} else if (this->layer_id != size_t(-1)) {
|
||||
// alternate fill direction
|
||||
printf("Filling layer %d, thickness %d, id: %d\n",
|
||||
this->layer_id, surface->thickness_layers, int(this->layer_id / surface->thickness_layers));
|
||||
out_angle += this->_layer_angle(this->layer_id / surface->thickness_layers);
|
||||
} else {
|
||||
printf("Layer_ID undefined!\n");
|
||||
}
|
||||
|
||||
out_angle += float(M_PI/2.);
|
||||
printf("out_angle: %f", out_angle);
|
||||
return std::pair<float, Point>(out_angle, out_shift);
|
||||
}
|
||||
|
||||
} // namespace Slic3r
|
Loading…
Add table
Add a link
Reference in a new issue