OrcaSlicer latest
OrcaSlicer
Loading...
Searching...
No Matches
Slic3r::ExtrusionSimulator Class Reference

#include </home/runner/work/OrcaSlicer/OrcaSlicer/src/libslic3r/ExtrusionSimulator.hpp>

Collaboration diagram for Slic3r::ExtrusionSimulator:

Public Member Functions

 ExtrusionSimulator ()
 ~ExtrusionSimulator ()
void set_image_size (const Point &image_size)
void set_viewport (const BoundingBox &viewport)
void set_bounding_box (const BoundingBox &bbox)
void reset_accumulator ()
void extrude_to_accumulator (const ExtrusionPath &path, const Point &shift, ExtrusionSimulationType simulationType)
void evaluate_accumulator (ExtrusionSimulationType simulationType)
const void * image_ptr () const

Private Attributes

Point image_size
BoundingBox viewport
BoundingBox bbox
ExtrusionSimulatorImpl * pimpl

Detailed Description

Constructor & Destructor Documentation

◆ ExtrusionSimulator()

Slic3r::ExtrusionSimulator::ExtrusionSimulator ( )
891 :
892 pimpl(new ExtrusionSimulatorImpl)
893{
894 pimpl->color_gradient = CreatePowerColorGradient24bit();
895 pimpl->bitmap_oversampled = 4;
896}
ExtrusionSimulatorImpl * pimpl
Definition ExtrusionSimulator.hpp:54
std::vector< V3uc > CreatePowerColorGradient24bit()
Definition ExtrusionSimulator.cpp:860

References Slic3r::CreatePowerColorGradient24bit(), and pimpl.

Here is the call graph for this function:

◆ ~ExtrusionSimulator()

Slic3r::ExtrusionSimulator::~ExtrusionSimulator ( )
899{
900 delete pimpl;
901 pimpl = NULL;
902}

References pimpl.

Member Function Documentation

◆ evaluate_accumulator()

void Slic3r::ExtrusionSimulator::evaluate_accumulator ( ExtrusionSimulationType simulationType)
997{
998 // printf("ExtrusionSimulator::evaluate_accumulator()\n");
999 Point sz = viewport.size();
1000
1001 if (simulationType > ExtrusionSimulationDontSpread) {
1002 // Average the cells of a bitmap into a lower resolution floating point mask.
1003 A2f mask(boost::extents[sz.y()][sz.x()]);
1004 for (int r = 0; r < sz.y(); ++r) {
1005 for (int c = 0; c < sz.x(); ++c) {
1006 float p = 0;
1007 for (unsigned int j = 0; j < pimpl->bitmap_oversampled; ++ j) {
1008 for (unsigned int i = 0; i < pimpl->bitmap_oversampled; ++ i) {
1009 if (pimpl->bitmap[r * pimpl->bitmap_oversampled + j][c * pimpl->bitmap_oversampled + i])
1010 p += 1.f;
1011 }
1012 }
1013 p /= float(pimpl->bitmap_oversampled * pimpl->bitmap_oversampled * 2);
1014 mask[r][c] = p;
1015 }
1016 }
1017
1018 // Spread the excess of the material.
1019 gcode_spread_points(pimpl->accumulator, mask, pimpl->extrusion_points, simulationType);
1020 }
1021
1022 // Color map the accumulator.
1023 for (int r = 0; r < sz.y(); ++r) {
1024 unsigned char *ptr = &pimpl->image_data[(image_size.x() * (viewport.min.y() + r) + viewport.min.x()) * 4];
1025 for (int c = 0; c < sz.x(); ++c) {
1026 #if 1
1027 float p = pimpl->accumulator[r][c];
1028 #else
1029 float p = mask[r][c];
1030 #endif
1031 int idx = int(floor(p * float(pimpl->color_gradient.size()) + 0.5f));
1032 V3uc clr = pimpl->color_gradient[std::clamp(idx, 0, int(pimpl->color_gradient.size()-1))];
1033 *ptr ++ = clr.get<0>();
1034 *ptr ++ = clr.get<1>();
1035 *ptr ++ = clr.get<2>();
1036 *ptr ++ = (idx == 0) ? 0 : 255;
1037 }
1038 }
1039}
BoundingBox viewport
Definition ExtrusionSimulator.hpp:51
Point image_size
Definition ExtrusionSimulator.hpp:50
Kernel::Point_3 Point
Definition MeshRepair.cpp:81
void gcode_spread_points(A2f &acc, const A2f &mask, const ExtrusionPoints &points, ExtrusionSimulationType simulationType)
Definition ExtrusionSimulator.cpp:652
boost::multi_array< float, 2 > A2f
Definition ExtrusionSimulator.cpp:75
@ ExtrusionSimulationDontSpread
Definition ExtrusionSimulator.hpp:13
V3< unsignedchar >::Type V3uc
Definition ExtrusionSimulator.cpp:65

References Slic3r::ExtrusionSimulationDontSpread, Slic3r::gcode_spread_points(), image_size, pimpl, and viewport.

Here is the call graph for this function:

◆ extrude_to_accumulator()

void Slic3r::ExtrusionSimulator::extrude_to_accumulator ( const ExtrusionPath & path,
const Point & shift,
ExtrusionSimulationType simulationType )
964{
965 // printf("Extruding a path. Nr points: %d, width: %f, height: %f\r\n", path.polyline.points.size(), path.width, path.height);
966 // Convert the path to V2f points, shift and scale them to the viewport.
967 std::vector<V2f> polyline;
968 polyline.reserve(path.polyline.points.size());
969 float scalex = float(viewport.size().x()) / float(bbox.size().x());
970 float scaley = float(viewport.size().y()) / float(bbox.size().y());
971 float w = scale_(path.width) * scalex;
972 //float h = scale_(path.height) * scalex;
973 w = scale_(path.mm3_per_mm / path.height) * scalex;
974 // printf("scalex: %f, scaley: %f\n", scalex, scaley);
975 // printf("bbox: %d,%d %d,%d\n", bbox.min.x(), bbox.min.y, bbox.max.x(), bbox.max.y);
976 for (Points3::const_iterator it = path.polyline.points.begin(); it != path.polyline.points.end(); ++ it) {
977 // printf("point %d,%d\n", it->x+shift.x(), it->y+shift.y);
978 ExtrusionPoint ept;
979 ept.center = V2f(float((*it)(0)+shift.x()-bbox.min.x()) * scalex, float((*it)(1)+shift.y()-bbox.min.y()) * scaley);
980 ept.radius = w/2.f;
981 ept.height = 0.5f;
982 polyline.push_back(ept.center);
983 pimpl->extrusion_points.push_back(ept);
984 }
985 // Extrude the polyline into an accumulator.
986 // printf("width scaled: %f, height scaled: %f\n", w, h);
987 gcode_paint_layer(polyline, w, 0.5f, pimpl->accumulator);
988
989 if (simulationType > ExtrusionSimulationDontSpread)
990 gcode_paint_bitmap(polyline, w, pimpl->bitmap, pimpl->bitmap_oversampled);
991 // double path.mm3_per_mm; // mm^3 of plastic per mm of linear head motion
992 // float path.width;
993 // float path.height;
994}
BoundingBox bbox
Definition ExtrusionSimulator.hpp:52
#define scale_(val)
Definition libslic3r.h:106
void gcode_paint_layer(const std::vector< V2f > &polyline, float width, float thickness, A2f &acc)
Definition ExtrusionSimulator.cpp:540
void gcode_paint_bitmap(const std::vector< V2f > &polyline, float width, A2uc &bitmap, float scale)
Definition ExtrusionSimulator.cpp:586
V2< float >::Type V2f
Definition ExtrusionSimulator.cpp:61

References bbox, Slic3r::ExtrusionPoint::center, Slic3r::ExtrusionSimulationDontSpread, Slic3r::gcode_paint_bitmap(), Slic3r::gcode_paint_layer(), Slic3r::ExtrusionPath::height, Slic3r::ExtrusionPoint::height, Slic3r::ExtrusionPath::mm3_per_mm, pimpl, Slic3r::MultiPoint3::points, Slic3r::ExtrusionPath::polyline, Slic3r::ExtrusionPoint::radius, scale_, viewport, and Slic3r::ExtrusionPath::width.

Here is the call graph for this function:

◆ image_ptr()

const void * Slic3r::ExtrusionSimulator::image_ptr ( ) const
948{
949 return (pimpl->image_data.empty()) ? NULL : (void*)&pimpl->image_data.front();
950}

References pimpl.

◆ reset_accumulator()

void Slic3r::ExtrusionSimulator::reset_accumulator ( )
953{
954 // printf("ExtrusionSimulator::reset_accumulator()\n");
955 Point sz = viewport.size();
956 // printf("Reset accumulator, Accumulator size: %d, %d\n", sz.y, sz.x);
957 memset(&pimpl->accumulator[0][0], 0, sizeof(float) * sz.x() * sz.y());
958 memset(&pimpl->bitmap[0][0], 0, sz.x() * sz.y() * pimpl->bitmap_oversampled * pimpl->bitmap_oversampled);
959 pimpl->extrusion_points.clear();
960 // printf("Reset accumulator, done.\n");
961}

References pimpl, and viewport.

◆ set_bounding_box()

void Slic3r::ExtrusionSimulator::set_bounding_box ( const BoundingBox & bbox)
943{
944 this->bbox = bbox;
945}

References bbox.

◆ set_image_size()

void Slic3r::ExtrusionSimulator::set_image_size ( const Point & image_size)
905{
906 // printf("ExtrusionSimulator::set_image_size()\n");
907 if (this->image_size.x() == image_size.x() &&
908 this->image_size.y() == image_size.y())
909 return;
910
911 // printf("Setting image size: %d, %d\n", image_size.x, image_size.y);
912 this->image_size = image_size;
913 // Allocate the image data in an RGBA format.
914 // printf("Allocating image data, size %d\n", image_size.x * image_size.y * 4);
915 pimpl->image_data.assign(image_size.x() * image_size.y() * 4, 0);
916 // printf("Allocating image data, allocated\n");
917
918 //FIXME fill the image with red vertical lines.
919 for (size_t r = 0; r < size_t(image_size.y()); ++ r) {
920 for (size_t c = 0; c < size_t(image_size.x()); c += 2) {
921 // Color red
922 pimpl->image_data[r * image_size.x() * 4 + c * 4] = 255;
923 // Opacity full
924 pimpl->image_data[r * image_size.x() * 4 + c * 4 + 3] = 255;
925 }
926 }
927 // printf("Allocating image data, set\n");
928}

References image_size, and pimpl.

◆ set_viewport()

void Slic3r::ExtrusionSimulator::set_viewport ( const BoundingBox & viewport)
931{
932 // printf("ExtrusionSimulator::set_viewport(%d, %d, %d, %d)\n", viewport.min.x, viewport.min.y, viewport.max.x, viewport.max.y);
933 if (this->viewport != viewport) {
934 this->viewport = viewport;
935 Point sz = viewport.size();
936 pimpl->accumulator.resize(boost::extents[sz.y()][sz.x()]);
937 pimpl->bitmap.resize(boost::extents[sz.y()*pimpl->bitmap_oversampled][sz.x()*pimpl->bitmap_oversampled]);
938 // printf("Accumulator size: %d, %d\n", sz.y, sz.x);
939 }
940}

References pimpl, and viewport.

Member Data Documentation

◆ bbox

BoundingBox Slic3r::ExtrusionSimulator::bbox
private

◆ image_size

Point Slic3r::ExtrusionSimulator::image_size
private

◆ pimpl

◆ viewport

BoundingBox Slic3r::ExtrusionSimulator::viewport
private

The documentation for this class was generated from the following files: