Path.Command: rounding instead of truncate in toGCode

Also changed default Path.Area pareameter ClipperScale to 1e6 which
corresponds to the default 5 digits output of Path.Command toGCode()
This commit is contained in:
Zheng, Lei
2017-05-28 11:20:39 +08:00
committed by wmayer
parent 4a08048901
commit 0e9c1c076e
2 changed files with 28 additions and 5 deletions

View File

@@ -90,7 +90,7 @@
((double,units,Unit,1.0,"Scaling factor for conversion to inch",App::PropertyFloat))\
((short,min_arc_points,MinArcPoints,4,"Minimum segments for arc discretization"))\
((short,max_arc_points,MaxArcPoints,100,"Maximum segments for arc discretization"))\
((double,clipper_scale,ClipperScale,10000.0,\
((double,clipper_scale,ClipperScale,1e6,\
"ClipperLib operate on intergers. This is the scale factor to convert\n"\
"floating points.",App::PropertyFloat))
@@ -150,7 +150,7 @@
((double,offset,SectionOffset,0.0,"Offset for the first section. The direction of the offset is\n"\
"determined by the section direction (i.e. the signess of Stepdown). If going from top down,\n"\
"a positive value means offset downward, and if bottom up, it means upward",App::PropertyDistance))\
((double,tolerance,SectionTolerance,1e-5,"Offset value added when hitting the boundary.\n"\
((double,tolerance,SectionTolerance,1e-6,"Offset value added when hitting the boundary.\n"\
"When the section hits or over the shape boundary, a section with the height of that boundary\n"\
"will be created. A small offset is usually required to avoid the tagnetial cut.",\
App::PropertyPrecision))\

View File

@@ -26,6 +26,8 @@
#ifndef _PreComp_
#endif
#include <cinttypes>
#include <iomanip>
#include <boost/algorithm/string.hpp>
#include <boost/lexical_cast.hpp>
#include <Base/Vector3D.h>
@@ -99,12 +101,33 @@ bool Command::has(const std::string& attr) const
std::string Command::toGCode (int precision, bool padzero) const
{
std::stringstream str;
if(padzero) str.setf(std::ios::fixed);
str.precision(precision);
str.fill('0');
str << Name;
if(precision<=0)
precision = 1;
double scale = std::pow(10.0,precision);
std::int64_t iscale = static_cast<std::int64_t>(scale)/10;
for(std::map<std::string,double>::const_iterator i = Parameters.begin(); i != Parameters.end(); ++i) {
if(i->first == "N") continue;
str << " " << i->first << i->second;
std::int64_t v = static_cast<std::int64_t>(i->second*scale);
if(v>=0)
v+=5;
else
v-=5;
v /= 10;
str << " " << i->first << (v/iscale);
if(precision==1) continue;
int width = precision-1;
std::int64_t digits = v%iscale;
if(!padzero) {
if(!digits) continue;
while(digits%10 == 0) {
digits/=10;
--width;
}
}
str << '.' << std::setw(width) << std::right << digits;
}
return str.str();
}