38 const QStringList &curvesIncluded,
40 const QString &delimiter,
47 unsigned int &numWritesSoFar)
const
51 int curveCount = curvesIncluded.count();
52 int xThetaCount = xThetaValues.count();
53 QVector<QVector<QString*> > yRadiusValues (curveCount, QVector<QString*> (xThetaCount));
54 initializeYRadiusValues (curvesIncluded,
57 loadYRadiusValues (modelExportOverride,
69 outputXThetaYRadiusValues (modelExportOverride,
86 const QStringList &curvesIncluded,
88 const QString &delimiter,
95 unsigned int &numWritesSoFar)
const
99 QStringList::const_iterator itr;
100 for (itr = curvesIncluded.begin(); itr != curvesIncluded.end(); itr++) {
103 const int CURVE_COUNT = 1;
104 QString curveIncluded = *itr;
105 QStringList curvesIncludedIter (curveIncluded);
107 int xThetaCount = xThetaValues.count();
108 QVector<QVector<QString*> > yRadiusValues (CURVE_COUNT, QVector<QString*> (xThetaCount));
109 initializeYRadiusValues (curvesIncludedIter,
112 loadYRadiusValues (modelExportOverride,
123 outputXThetaYRadiusValues (modelExportOverride,
143 unsigned int &numWritesSoFar,
144 bool &isOverrun)
const
174 Functor2wRet<const QString &, const Point &, CallbackSearchReturn> ftorWithCallback = functor_ret (ftor,
184 Functor2wRet<const QString &, const Point &, CallbackSearchReturn> ftorWithCallback = functor_ret (ftor,
202 str << QObject::tr (
"Too many points");
207 if (xThetaValuesMerged.count() > 0) {
211 exportAllPerLineXThetaValuesMerged (modelExportOverride,
225 exportOnePerLineXThetaValuesMerged (modelExportOverride,
243void ExportFileFunctions::initializeYRadiusValues (
const QStringList &curvesIncluded,
245 QVector<QVector<QString*> > &yRadiusValues)
const
250 int curveCount = curvesIncluded.count();
251 int xThetaCount = xThetaValuesMerged.count();
252 for (
int row = 0; row < xThetaCount; row++) {
253 for (
int col = 0; col < curveCount; col++) {
254 yRadiusValues [col] [row] =
new QString;
260 double xThetaLinearized)
const
266 double yRadiusLinearized = 0;
267 QPointF posGraphBefore;
268 bool foundIt =
false;
269 FittingPointsConvenient::const_iterator itr;
270 for (itr = positionsLinearized.begin(); itr != positionsLinearized.end(); itr++) {
271 const QPointF posGraph = *itr;
277 if (xThetaLinearized <= posGraph.x() && (itr != positionsLinearized.begin())) {
291 posGraphBefore = posGraph;
296 if (positionsLinearized.count() > 1) {
300 int N = positionsLinearized.count();
301 const QPointF &pointBefore = positionsLinearized.at (N - 2);
302 const QPointF &pointLast = positionsLinearized.at (N - 1);
307 }
else if (positionsLinearized.count() == 1) {
310 yRadiusLinearized = posGraphBefore.y();
319 return yRadiusLinearized;
325 const QStringList &curvesIncluded,
332 QVector<QVector<QString*> > &yRadiusValues)
const
337 int curveCount = curvesIncluded.count();
338 for (
int col = 0; col < curveCount; col++) {
340 const QString curveName = curvesIncluded.at (col);
348 loadYRadiusValuesForCurveRaw (document.
modelCoords(),
357 yRadiusValues [col]);
364 loadYRadiusValuesForCurveInterpolatedSmooth (document.
modelCoords(),
375 yRadiusValues [col]);
380 loadYRadiusValuesForCurveInterpolatedStraight (document.
modelCoords(),
391 yRadiusValues [col]);
397void ExportFileFunctions::loadYRadiusValuesForCurveInterpolatedSmooth (
const DocumentModelCoords &modelCoords,
405 const QString &curveName,
408 QVector<QString*> &yRadiusValues)
const
414 vector<SplinePair> xyLinearized;
415 ExportOrdinalsSmooth ordinalsSmooth;
426 LinearToLog linearToLog;
429 FormatCoordsUnits format;
430 QString dummyXThetaOut;
432 if (points.count() == 0) {
435 for (
int row = 0; row < xThetaValues.count(); row++) {
436 *(yRadiusValues [row]) =
"";
439 }
else if (points.count() == 1 ||
440 points.count() == 2) {
443 for (
int row = 0; row < xThetaValues.count(); row++) {
446 double xTheta = xThetaValues.at (row);
447 double xThetaLinearized = linearToLog.
linearize (xTheta,
450 double yRadiusLinearized;
451 if (points.count() == 1) {
452 yRadiusLinearized = xyLinearized.at (0).y ();
454 double x0 = xyLinearized.at (0).x ();
455 double x1 = xyLinearized.at (1).x ();
456 double y0 = xyLinearized.at (0).y ();
457 double y1 = xyLinearized.at (1).y ();
458 double numerator = (xThetaLinearized - x0);
459 double denominator = (x1 - x0);
460 if (qAbs (denominator) < qAbs (numerator) / 1.0e6) {
462 yRadiusLinearized = xyLinearized.at (0).y ();
464 double s = numerator / denominator;
465 yRadiusLinearized = (1.0 - s) * y0 + s * y1;
470 double yRadius = linearToLog.
delinearize (yRadiusLinearized,
473 if (xThetaIsNotOutOfBounds (xTheta,
483 *(yRadiusValues [row]),
486 *(yRadiusValues [row]) =
"";
496 const int MAX_ITERATIONS = 32;
499 if (xyLinearized.size() > 0) {
506 for (
int row = 0; row < xThetaValues.count(); row++) {
509 double xTheta = xThetaValues.at (row);
510 double xThetaLinearized = linearToLog.
linearize (xTheta,
513 SplinePair splinePairFound = spline.findSplinePairForFunctionX (xThetaLinearized,
515 double yRadiusLinearized = splinePairFound.
y ();
518 double yRadius = linearToLog.
delinearize (yRadiusLinearized,
522 if (xThetaIsNotOutOfBounds (xTheta,
532 *(yRadiusValues [row]),
535 *(yRadiusValues [row]) =
"";
542void ExportFileFunctions::loadYRadiusValuesForCurveInterpolatedStraight (
const DocumentModelCoords &modelCoords,
550 const QString &curveName,
553 QVector<QString*> &yRadiusValues)
const
557 FormatCoordsUnits format;
560 LinearToLog linearToLog;
568 QString dummyXThetaOut;
569 for (
int row = 0; row < xThetaValues.count(); row++) {
572 double xTheta = xThetaValues.at (row);
573 double xThetaLinearized = linearToLog.
linearize (xTheta,
577 *(yRadiusValues [row]) =
"";
578 if (positionsLinearized.count () > 0) {
580 double yRadiusLinearized = linearlyInterpolate (positionsLinearized,
582 double yRadius = linearToLog.
delinearize (yRadiusLinearized,
586 if (xThetaIsNotOutOfBounds (xTheta,
596 *(yRadiusValues [row]),
603void ExportFileFunctions::loadYRadiusValuesForCurveRaw (
const DocumentModelCoords &modelCoords,
609 const QString &curveName,
612 QVector<QString*> &yRadiusValues)
const
616 FormatCoordsUnits format;
620 for (
int pt = 0; pt < points.count(); pt++) {
622 const Point &point = points.at (pt);
630 double closestSeparation = 0.0;
632 for (
int row = 0; row < xThetaValues.count(); row++) {
634 double xTheta = xThetaValues.at (row);
636 double separation = qAbs (posGraph.x() - xTheta);
639 (separation < closestSeparation)) {
641 closestSeparation = separation;
648 if (xThetaIsNotOutOfBounds (posGraph.x(),
652 QString dummyXThetaOut;
659 *(yRadiusValues [rowClosest]),
662 *(yRadiusValues [rowClosest]) =
"";
671 const QStringList &curvesIncluded,
674 QVector<QVector<QString*> > &yRadiusValues,
675 const QString &delimiter,
677 unsigned int &numWritesSoFar)
const
684 modelExportOverride.
header (),
689 str << modelExportOverride.
xLabel();
690 QStringList::const_iterator itrHeader;
691 for (itrHeader = curvesIncluded.begin(); itrHeader != curvesIncluded.end(); itrHeader++) {
692 QString curveName = *itrHeader;
693 str << delimiter << curveName;
699 FormatCoordsUnits format;
700 const double DUMMY_Y_RADIUS = 1.0;
702 for (
int row = 0; row < xThetaValuesMerged.count(); row++) {
704 if (rowHasAtLeastOneYRadiusEntry (yRadiusValues,
707 double xTheta = xThetaValuesMerged.at (row);
710 QString xThetaString, yRadiusString;
722 for (
int col = 0; col < yRadiusValues.count(); col++) {
724 QString yRadiusString = *(yRadiusValues [col] [row]);
739 bool isLogYRadius)
const
741 LinearToLog linearToLog;
744 Points::const_iterator itr;
745 for (itr = points.begin(); itr != points.end(); itr++) {
746 const Point &point = *itr;
752 QPointF positionLinearized (linearToLog.
linearize (posGraph.x(),
756 positionsLinearized.push_back (positionLinearized);
759 return positionsLinearized;
762bool ExportFileFunctions::rowHasAtLeastOneYRadiusEntry (
const QVector<QVector<QString*> > &yRadiusValues,
765 bool hasEntry =
false;
767 for (
int col = 0; col < yRadiusValues.count(); col++) {
769 QString entry = *(yRadiusValues [col] [row]);
770 if (!entry.isEmpty()) {
781bool ExportFileFunctions::xThetaIsNotOutOfBounds (
double xTheta,
782 const QString &curveName,
788 if (curveLimitsMin.contains (curveName)) {
789 ok = ok && (curveLimitsMin [curveName] <= xTheta);
792 if (curveLimitsMax.contains (curveName)) {
793 ok = ok && (xTheta <= curveLimitsMax [curveName]);
@ CONNECT_AS_FUNCTION_STRAIGHT
@ CONNECT_AS_FUNCTION_SMOOTH
QHash< QString, double > CurveLimits
#define ENGAUGE_ASSERT(cond)
Drop in replacement for Q_ASSERT.
QString exportDelimiterToText(ExportDelimiter exportDelimiter, bool isGnuplotDelimiter)
@ EXPORT_LAYOUT_ALL_PER_LINE
@ EXPORT_POINTS_SELECTION_FUNCTIONS_RAW
@ EXPORT_POINTS_SELECTION_FUNCTIONS_INTERPOLATE_GRID_LINES
QList< double > ExportValuesXOrY
QList< QPointF > FittingPointsConvenient
Array of (x,y) points in graph coordinates.
log4cpp::Category * mainCat
QMap< double, bool > ValuesVectorXOrY
CurveLimits curveLimitsMax() const
Endpoint maxima for each curve, if extrapolation has been disabled.
ValuesVectorXOrY xThetaValuesRaw() const
Resulting x/theta values for all included functions.
CurveLimits curveLimitsMin() const
Endpoint minima for each curve, if extrapolation has been disabled.
Callback for collecting X/Theta independent variables, for functions, in preparation for exporting,...
virtual CallbackSearchReturn callback(const QString &curveName, const Point &point)
Callback method.
Callback for collecting X/Theta independent variables, for functions, in preparation for exporting,...
virtual CallbackSearchReturn callback(const QString &curveName, const Point &point)
Callback method.
LineStyle lineStyle() const
Get method for LineStyle.
CurveStyle curveStyle() const
Return the curve style.
const Points points() const
Return a shallow copy of the Points.
Model for DlgSettingsCoords and CmdSettingsCoords.
Model for DlgSettingsGeneral and CmdSettingsGeneral.
Storage of one imported image and the data attached to that image.
DocumentModelGeneral modelGeneral() const
Get method for DocumentModelGeneral.
void iterateThroughCurvesPointsGraphs(const Functor2wRet< const QString &, const Point &, CallbackSearchReturn > &ftorWithCallback)
See Curve::iterateThroughCurvePoints, for all the graphs curves.
QStringList curvesGraphsNames() const
See CurvesGraphs::curvesGraphsNames.
DocumentModelCoords modelCoords() const
Get method for DocumentModelCoords.
const Curve * curveForCurveName(const QString &curveName) const
See CurvesGraphs::curveForCurveNames, although this also works for AXIS_CURVE_NAME.
void destroy2DArray(QVector< QVector< QString * > > &array) const
Deallocate memory for array.
double linearlyInterpolateYRadiusFromTwoPoints(double xThetaLinearized, const QPointF &posGraphBefore, const QPointF &posGraph) const
Interpolate (if xThetaValue is between posGraphBefore.x() and posGraph.x()) or extrapolate (if xTheta...
QString wrapInDoubleQuotesIfNeeded(const DocumentModelExportFormat &modelExportOverride, const QString &valueString) const
RFC 4180 says if values are delimited by a comma AND a value has commas in it (for locale like Englis...
QString gnuplotComment() const
Gnuplot comment delimiter.
QStringList curvesToInclude(const DocumentModelExportFormat &modelExportOverride, const Document &document, const QStringList &curvesGraphsNames, CurveConnectAs curveConnectAs1, CurveConnectAs curveConnectAs2) const
Identify curves to include in export. The specified DocumentModelExportFormat overrides same data in ...
void insertLineSeparator(bool isFirst, ExportHeader exportHeader, QTextStream &str) const
Insert line(s) between successive sets of curves.
ExportFileFunctions()
Single constructor.
void exportToFile(const DocumentModelExportFormat &modelExportOverride, const Document &document, const MainWindowModel &modelMainWindow, const Transformation &transformation, QTextStream &str, unsigned int &numWritesSoFar, bool &isOverrun) const
Export Document points according to the settings.
void loadSplinePairsWithTransformation(const Points &points, const Transformation &transformation, bool isLogXTheta, bool isLogYRadius, std::vector< double > &t, std::vector< SplinePair > &xy) const
Load t (=ordinal) and xy (=screen position) spline pairs, converting screen coordinates to graph coor...
Creates the set of merged x/theta values for exporting functions, using interpolation.
ExportValuesXOrY xThetaValues(bool &isOverrun) const
Resulting x/theta values for all included functions.
CurveConnectAs curveConnectAs() const
Get method for connect type.
double delinearize(double value, bool isLog) const
Convert linear coordinates to log. This is a noop if the output is supposed to be linear.
double linearize(double value, bool isLog) const
Convert log coordinates to linear. This is a noop if the input is already linear.
Model for DlgSettingsMainWindow.
QPointF posScreen() const
Accessor for screen position.
double y() const
Get method for y.
#define LOG4CPP_INFO_S(logger)