Prusa Slicer 2.6.0
Loading...
Searching...
No Matches
Slic3r::ExtrusionSimulator Class Reference

#include <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 voidimage_ptr () const
 

Private Attributes

Point image_size
 
BoundingBox viewport
 
BoundingBox bbox
 
ExtrusionSimulatorImplpimpl
 

Detailed Description

Constructor & Destructor Documentation

◆ ExtrusionSimulator()

Slic3r::ExtrusionSimulator::ExtrusionSimulator ( )
880 :
881 pimpl(new ExtrusionSimulatorImpl)
882{
885}
ExtrusionSimulatorImpl * pimpl
Definition ExtrusionSimulator.hpp:54
unsigned int bitmap_oversampled
Definition ExtrusionSimulator.cpp:874
std::vector< V3uc > CreatePowerColorGradient24bit()
Definition ExtrusionSimulator.cpp:849
std::vector< boost::geometry::model::point< unsigned char, 3, boost::geometry::cs::cartesian > > color_gradient
Definition ExtrusionSimulator.cpp:877

References Slic3r::ExtrusionSimulatorImpl::bitmap_oversampled, Slic3r::ExtrusionSimulatorImpl::color_gradient, Slic3r::CreatePowerColorGradient24bit(), and pimpl.

+ Here is the call graph for this function:

◆ ~ExtrusionSimulator()

Slic3r::ExtrusionSimulator::~ExtrusionSimulator ( )
888{
889 delete pimpl;
890 pimpl = NULL;
891}

References pimpl.

Member Function Documentation

◆ evaluate_accumulator()

void Slic3r::ExtrusionSimulator::evaluate_accumulator ( ExtrusionSimulationType  simulationType)
986{
987 // printf("ExtrusionSimulator::evaluate_accumulator()\n");
988 Point sz = viewport.size();
989
990 if (simulationType > ExtrusionSimulationDontSpread) {
991 // Average the cells of a bitmap into a lower resolution floating point mask.
992 A2f mask(boost::extents[sz.y()][sz.x()]);
993 for (int r = 0; r < sz.y(); ++r) {
994 for (int c = 0; c < sz.x(); ++c) {
995 float p = 0;
996 for (unsigned int j = 0; j < pimpl->bitmap_oversampled; ++ j) {
997 for (unsigned int i = 0; i < pimpl->bitmap_oversampled; ++ i) {
999 p += 1.f;
1000 }
1001 }
1003 mask[r][c] = p;
1004 }
1005 }
1006
1007 // Spread the excess of the material.
1009 }
1010
1011 // Color map the accumulator.
1012 for (int r = 0; r < sz.y(); ++r) {
1013 unsigned char *ptr = &pimpl->image_data[(image_size.x() * (viewport.min.y() + r) + viewport.min.x()) * 4];
1014 for (int c = 0; c < sz.x(); ++c) {
1015 #if 1
1016 float p = pimpl->accumulator[r][c];
1017 #else
1018 float p = mask[r][c];
1019 #endif
1020 int idx = int(floor(p * float(pimpl->color_gradient.size()) + 0.5f));
1021 V3uc clr = pimpl->color_gradient[std::clamp(idx, 0, int(pimpl->color_gradient.size()-1))];
1022 *ptr ++ = clr.get<0>();
1023 *ptr ++ = clr.get<1>();
1024 *ptr ++ = clr.get<2>();
1025 *ptr ++ = (idx == 0) ? 0 : 255;
1026 }
1027 }
1028}
EIGEN_DEVICE_FUNC const FloorReturnType floor() const
Definition ArrayCwiseUnaryOps.h:388
PointType size() const
Definition BoundingBox.cpp:144
PointType min
Definition BoundingBox.hpp:16
BoundingBox viewport
Definition ExtrusionSimulator.hpp:51
Point image_size
Definition ExtrusionSimulator.hpp:50
void gcode_spread_points(A2f &acc, const A2f &mask, const ExtrusionPoints &points, ExtrusionSimulationType simulationType)
Definition ExtrusionSimulator.cpp:641
A2f accumulator
Definition ExtrusionSimulator.cpp:872
boost::multi_array< float, 2 > A2f
Definition ExtrusionSimulator.cpp:64
A2uc bitmap
Definition ExtrusionSimulator.cpp:873
std::vector< unsigned char > image_data
Definition ExtrusionSimulator.cpp:871
ExtrusionPoints extrusion_points
Definition ExtrusionSimulator.cpp:875
@ ExtrusionSimulationDontSpread
Definition ExtrusionSimulator.hpp:13
V3< unsignedchar >::Type V3uc
Definition ExtrusionSimulator.cpp:54
Kernel::Point_2 Point
Definition point_areas.cpp:20

References Slic3r::ExtrusionSimulatorImpl::accumulator, Slic3r::ExtrusionSimulatorImpl::bitmap, Slic3r::ExtrusionSimulatorImpl::bitmap_oversampled, Slic3r::ExtrusionSimulatorImpl::color_gradient, Slic3r::ExtrusionSimulatorImpl::extrusion_points, Slic3r::ExtrusionSimulationDontSpread, floor(), Slic3r::gcode_spread_points(), Slic3r::ExtrusionSimulatorImpl::image_data, image_size, Slic3r::BoundingBoxBase< PointType, APointsType >::min, pimpl, Slic3r::BoundingBoxBase< PointType, APointsType >::size(), 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 
)
953{
954 // printf("Extruding a path. Nr points: %d, width: %f, height: %f\r\n", path.polyline.points.size(), path.width, path.height);
955 // Convert the path to V2f points, shift and scale them to the viewport.
956 std::vector<V2f> polyline;
957 polyline.reserve(path.polyline.points.size());
958 float scalex = float(viewport.size().x()) / float(bbox.size().x());
959 float scaley = float(viewport.size().y()) / float(bbox.size().y());
960 float w = scale_(path.width) * scalex;
961 //float h = scale_(path.height) * scalex;
962 w = scale_(path.mm3_per_mm / path.height) * scalex;
963 // printf("scalex: %f, scaley: %f\n", scalex, scaley);
964 // printf("bbox: %d,%d %d,%d\n", bbox.min.x(), bbox.min.y, bbox.max.x(), bbox.max.y);
965 for (Points::const_iterator it = path.polyline.points.begin(); it != path.polyline.points.end(); ++ it) {
966 // printf("point %d,%d\n", it->x+shift.x(), it->y+shift.y);
967 ExtrusionPoint ept;
968 ept.center = V2f(float((*it)(0)+shift.x()-bbox.min.x()) * scalex, float((*it)(1)+shift.y()-bbox.min.y()) * scaley);
969 ept.radius = w/2.f;
970 ept.height = 0.5f;
971 polyline.push_back(ept.center);
972 pimpl->extrusion_points.push_back(ept);
973 }
974 // Extrude the polyline into an accumulator.
975 // printf("width scaled: %f, height scaled: %f\n", w, h);
976 gcode_paint_layer(polyline, w, 0.5f, pimpl->accumulator);
977
978 if (simulationType > ExtrusionSimulationDontSpread)
980 // double path.mm3_per_mm; // mm^3 of plastic per mm of linear head motion
981 // float path.width;
982 // float path.height;
983}
BoundingBox bbox
Definition ExtrusionSimulator.hpp:52
#define scale_(val)
Definition libslic3r.h:69
void gcode_paint_layer(const std::vector< V2f > &polyline, float width, float thickness, A2f &acc)
Definition ExtrusionSimulator.cpp:529
void gcode_paint_bitmap(const std::vector< V2f > &polyline, float width, A2uc &bitmap, float scale)
Definition ExtrusionSimulator.cpp:575
V2< float >::Type V2f
Definition ExtrusionSimulator.cpp:50

References Slic3r::ExtrusionSimulatorImpl::accumulator, bbox, Slic3r::ExtrusionSimulatorImpl::bitmap, Slic3r::ExtrusionSimulatorImpl::bitmap_oversampled, Slic3r::ExtrusionPoint::center, Slic3r::ExtrusionSimulatorImpl::extrusion_points, Slic3r::ExtrusionSimulationDontSpread, Slic3r::gcode_paint_bitmap(), Slic3r::gcode_paint_layer(), Slic3r::ExtrusionPath::height, Slic3r::ExtrusionPoint::height, Slic3r::BoundingBoxBase< PointType, APointsType >::min, Slic3r::ExtrusionPath::mm3_per_mm, pimpl, Slic3r::MultiPoint::points, Slic3r::ExtrusionPath::polyline, Slic3r::ExtrusionPoint::radius, scale_, Slic3r::BoundingBoxBase< PointType, APointsType >::size(), viewport, and Slic3r::ExtrusionPath::width.

+ Here is the call graph for this function:

◆ image_ptr()

const void * Slic3r::ExtrusionSimulator::image_ptr ( ) const
937{
938 return (pimpl->image_data.empty()) ? NULL : (void*)&pimpl->image_data.front();
939}

References Slic3r::ExtrusionSimulatorImpl::image_data, and pimpl.

◆ reset_accumulator()

void Slic3r::ExtrusionSimulator::reset_accumulator ( )
942{
943 // printf("ExtrusionSimulator::reset_accumulator()\n");
944 Point sz = viewport.size();
945 // printf("Reset accumulator, Accumulator size: %d, %d\n", sz.y, sz.x);
946 memset(&pimpl->accumulator[0][0], 0, sizeof(float) * sz.x() * sz.y());
947 memset(&pimpl->bitmap[0][0], 0, sz.x() * sz.y() * pimpl->bitmap_oversampled * pimpl->bitmap_oversampled);
948 pimpl->extrusion_points.clear();
949 // printf("Reset accumulator, done.\n");
950}

References Slic3r::ExtrusionSimulatorImpl::accumulator, Slic3r::ExtrusionSimulatorImpl::bitmap, Slic3r::ExtrusionSimulatorImpl::bitmap_oversampled, Slic3r::ExtrusionSimulatorImpl::extrusion_points, pimpl, Slic3r::BoundingBoxBase< PointType, APointsType >::size(), and viewport.

+ Here is the call graph for this function:

◆ set_bounding_box()

void Slic3r::ExtrusionSimulator::set_bounding_box ( const BoundingBox bbox)
932{
933 this->bbox = bbox;
934}

References bbox.

◆ set_image_size()

void Slic3r::ExtrusionSimulator::set_image_size ( const Point image_size)
894{
895 // printf("ExtrusionSimulator::set_image_size()\n");
896 if (this->image_size.x() == image_size.x() &&
897 this->image_size.y() == image_size.y())
898 return;
899
900 // printf("Setting image size: %d, %d\n", image_size.x, image_size.y);
901 this->image_size = image_size;
902 // Allocate the image data in an RGBA format.
903 // printf("Allocating image data, size %d\n", image_size.x * image_size.y * 4);
904 pimpl->image_data.assign(image_size.x() * image_size.y() * 4, 0);
905 // printf("Allocating image data, allocated\n");
906
907 //FIXME fill the image with red vertical lines.
908 for (size_t r = 0; r < size_t(image_size.y()); ++ r) {
909 for (size_t c = 0; c < size_t(image_size.x()); c += 2) {
910 // Color red
911 pimpl->image_data[r * image_size.x() * 4 + c * 4] = 255;
912 // Opacity full
913 pimpl->image_data[r * image_size.x() * 4 + c * 4 + 3] = 255;
914 }
915 }
916 // printf("Allocating image data, set\n");
917}

References Slic3r::ExtrusionSimulatorImpl::image_data, image_size, and pimpl.

◆ set_viewport()

void Slic3r::ExtrusionSimulator::set_viewport ( const BoundingBox viewport)
920{
921 // printf("ExtrusionSimulator::set_viewport(%d, %d, %d, %d)\n", viewport.min.x, viewport.min.y, viewport.max.x, viewport.max.y);
922 if (this->viewport != viewport) {
923 this->viewport = viewport;
924 Point sz = viewport.size();
925 pimpl->accumulator.resize(boost::extents[sz.y()][sz.x()]);
926 pimpl->bitmap.resize(boost::extents[sz.y()*pimpl->bitmap_oversampled][sz.x()*pimpl->bitmap_oversampled]);
927 // printf("Accumulator size: %d, %d\n", sz.y, sz.x);
928 }
929}

References Slic3r::ExtrusionSimulatorImpl::accumulator, Slic3r::ExtrusionSimulatorImpl::bitmap, Slic3r::ExtrusionSimulatorImpl::bitmap_oversampled, pimpl, Slic3r::BoundingBoxBase< PointType, APointsType >::size(), and viewport.

+ Here is the call graph for this function:

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: