7#include "CallbackGatherXThetaValuesFunctions.h"
8#include "CurveConnectAs.h"
10#include "EngaugeAssert.h"
11#include "ExportFileFunctions.h"
12#include "ExportLayoutFunctions.h"
13#include "ExportOrdinalsSmooth.h"
14#include "ExportXThetaValuesMergedFunctions.h"
15#include "FormatCoordsUnits.h"
20#include "SplinePair.h"
21#include "Transformation.h"
33 const QStringList &curvesIncluded,
34 const ExportValuesXOrY &xThetaValues,
35 const QString &delimiter,
37 QTextStream &str)
const
39 LOG4CPP_INFO_S ((*mainCat)) <<
"ExportFileFunctions::exportAllPerLineXThetaValuesMerged";
41 int curveCount = curvesIncluded.count();
42 int xThetaCount = xThetaValues.count();
43 QVector<QVector<QString*> > yRadiusValues (curveCount, QVector<QString*> (xThetaCount));
44 initializeYRadiusValues (curvesIncluded,
47 loadYRadiusValues (modelExportOverride,
55 outputXThetaYRadiusValues (modelExportOverride,
70 const QStringList &curvesIncluded,
71 const ExportValuesXOrY &xThetaValues,
72 const QString &delimiter,
74 QTextStream &str)
const
76 LOG4CPP_INFO_S ((*mainCat)) <<
"ExportFileFunctions::exportOnePerLineXThetaValuesMerged";
80 QStringList::const_iterator itr;
81 for (itr = curvesIncluded.begin(); itr != curvesIncluded.end(); itr++) {
84 modelExportOverride.
header(),
88 const int CURVE_COUNT = 1;
89 QString curveIncluded = *itr;
90 QStringList curvesIncluded (curveIncluded);
92 int xThetaCount = xThetaValues.count();
93 QVector<QVector<QString*> > yRadiusValues (CURVE_COUNT, QVector<QString*> (xThetaCount));
94 initializeYRadiusValues (curvesIncluded,
97 loadYRadiusValues (modelExportOverride,
104 outputXThetaYRadiusValues (modelExportOverride,
121 QTextStream &str)
const
123 LOG4CPP_INFO_S ((*mainCat)) <<
"ExportFileFunctions::exportToFile";
129 CONNECT_AS_FUNCTION_SMOOTH,
130 CONNECT_AS_FUNCTION_STRAIGHT);
133 const QString delimiter = exportDelimiterToText (modelExportOverride.
delimiter());
139 Functor2wRet<const QString &, const Point &, CallbackSearchReturn> ftorWithCallback = functor_ret (ftor,
146 ExportValuesXOrY xThetaValuesMerged = exportXTheta.
xThetaValues ();
149 if (xThetaValuesMerged.count() > 0) {
152 if (modelExportOverride.
layoutFunctions() == EXPORT_LAYOUT_ALL_PER_LINE) {
153 exportAllPerLineXThetaValuesMerged (modelExportOverride,
162 exportOnePerLineXThetaValuesMerged (modelExportOverride,
174void ExportFileFunctions::initializeYRadiusValues (
const QStringList &curvesIncluded,
175 const ExportValuesXOrY &xThetaValuesMerged,
176 QVector<QVector<QString*> > &yRadiusValues)
const
178 LOG4CPP_INFO_S ((*mainCat)) <<
"ExportFileFunctions::initializeYRadiusValues";
181 int curveCount = curvesIncluded.count();
182 int xThetaCount = xThetaValuesMerged.count();
183 for (
int row = 0; row < xThetaCount; row++) {
184 for (
int col = 0; col < curveCount; col++) {
185 yRadiusValues [col] [row] =
new QString;
190double ExportFileFunctions::linearlyInterpolate (
const Points &points,
194 LOG4CPP_INFO_S ((*mainCat)) <<
"ExportFileFunctions::linearlyInterpolate";
197 QPointF posGraphBefore;
198 bool foundIt =
false;
199 for (
int ip = 0; ip < points.count(); ip++) {
201 const Point &point = points.at (ip);
206 if (xThetaValue <= posGraph.x()) {
212 yRadius = posGraph.y();
218 double s = (xThetaValue - posGraphBefore.x()) / (posGraph.x() - posGraphBefore.x());
219 yRadius = (1.0 -s) * posGraphBefore.y() + s * posGraph.y();
225 posGraphBefore = posGraph;
231 yRadius = posGraphBefore.y();
241 const QStringList &curvesIncluded,
243 const ExportValuesXOrY &xThetaValues,
244 QVector<QVector<QString*> > &yRadiusValues)
const
246 LOG4CPP_INFO_S ((*mainCat)) <<
"ExportFileFunctions::loadYRadiusValues";
249 int curveCount = curvesIncluded.count();
250 for (
int col = 0; col < curveCount; col++) {
252 const QString curveName = curvesIncluded.at (col);
255 const Points points = curve->
points ();
260 loadYRadiusValuesForCurveRaw (document.
modelCoords(),
265 yRadiusValues [col]);
271 loadYRadiusValuesForCurveInterpolatedSmooth (document.
modelCoords(),
276 yRadiusValues [col]);
280 loadYRadiusValuesForCurveInterpolatedStraight (document.
modelCoords(),
285 yRadiusValues [col]);
291void ExportFileFunctions::loadYRadiusValuesForCurveInterpolatedSmooth (
const DocumentModelCoords &modelCoords,
293 const Points &points,
294 const ExportValuesXOrY &xThetaValues,
296 QVector<QString*> &yRadiusValues)
const
298 LOG4CPP_INFO_S ((*mainCat)) <<
"ExportFileFunctions::loadYRadiusValuesForCurveInterpolatedSmooth";
302 vector<SplinePair> xy;
312 QString dummyXThetaOut;
314 if (points.count() == 0) {
317 for (
int row = 0; row < xThetaValues.count(); row++) {
318 *(yRadiusValues [row]) =
"";
321 }
else if (points.count() == 1 ||
322 points.count() == 2) {
325 for (
int row = 0; row < xThetaValues.count(); row++) {
327 double xTheta = xThetaValues.at (row);
329 if (points.count() == 1) {
330 yRadius = xy.at (0).y ();
332 double x0 = xy.at (0).x ();
333 double x1 = xy.at (1).x ();
334 double y0 = xy.at (0).y ();
335 double y1 = xy.at (1).y ();
338 yRadius = xy.at (0).y ();
340 double s = (xTheta - x0) / (x1 - x0);
341 yRadius = (1.0 - s) * y0 + s * y1;
349 *(yRadiusValues [row]),
359 const int MAX_ITERATIONS = 32;
366 for (
int row = 0; row < xThetaValues.count(); row++) {
368 double xTheta = xThetaValues.at (row);
369 SplinePair splinePairFound = spline.findSplinePairForFunctionX (xTheta,
371 double yRadius = splinePairFound.
y ();
374 QString dummyXThetaOut;
380 *(yRadiusValues [row]),
386void ExportFileFunctions::loadYRadiusValuesForCurveInterpolatedStraight (
const DocumentModelCoords &modelCoords,
388 const Points &points,
389 const ExportValuesXOrY &xThetaValues,
391 QVector<QString*> &yRadiusValues)
const
393 LOG4CPP_INFO_S ((*mainCat)) <<
"ExportFileFunctions::loadYRadiusValuesForCurveInterpolatedStraight";
398 for (
int row = 0; row < xThetaValues.count(); row++) {
400 double xThetaValue = xThetaValues.at (row);
402 double yRadius = linearlyInterpolate (points,
407 QString dummyXThetaOut;
413 *(yRadiusValues [row]),
418void ExportFileFunctions::loadYRadiusValuesForCurveRaw (
const DocumentModelCoords &modelCoords,
420 const Points &points,
421 const ExportValuesXOrY &xThetaValues,
423 QVector<QString*> &yRadiusValues)
const
425 LOG4CPP_INFO_S ((*mainCat)) <<
"ExportFileFunctions::loadYRadiusValuesForCurveRaw";
431 for (
int pt = 0; pt < points.count(); pt++) {
433 const Point &point = points.at (pt);
441 double closestSeparation = 0.0;
443 for (
int row = 0; row < xThetaValues.count(); row++) {
445 double xThetaValue = xThetaValues.at (row);
447 double separation = qAbs (posGraph.x() - xThetaValue);
450 (separation < closestSeparation)) {
452 closestSeparation = separation;
459 QString dummyXThetaOut;
465 *(yRadiusValues [rowClosest]),
473 const QStringList &curvesIncluded,
474 const ExportValuesXOrY &xThetaValuesMerged,
476 QVector<QVector<QString*> > &yRadiusValues,
477 const QString &delimiter,
478 QTextStream &str)
const
480 LOG4CPP_INFO_S ((*mainCat)) <<
"ExportFileFunctions::outputXThetaYRadiusValues";
483 if (modelExportOverride.
header() != EXPORT_HEADER_NONE) {
484 if (modelExportOverride.
header() == EXPORT_HEADER_GNUPLOT) {
488 str << modelExportOverride.
xLabel();
489 QStringList::const_iterator itrHeader;
490 for (itrHeader = curvesIncluded.begin(); itrHeader != curvesIncluded.end(); itrHeader++) {
491 QString curveName = *itrHeader;
492 str << delimiter << curveName;
498 const double DUMMY_Y_RADIUS = 1.0;
500 for (
int row = 0; row < xThetaValuesMerged.count(); row++) {
502 if (rowHasAtLeastOneYRadiusEntry (yRadiusValues,
505 double xTheta = xThetaValuesMerged.at (row);
508 QString xThetaString, yRadiusString;
518 for (
int col = 0; col < yRadiusValues.count(); col++) {
520 str << delimiter << *(yRadiusValues [col] [row]);
528bool ExportFileFunctions::rowHasAtLeastOneYRadiusEntry (
const QVector<QVector<QString*> > &yRadiusValues,
531 bool hasEntry =
false;
533 for (
int col = 0; col < yRadiusValues.count(); col++) {
535 QString entry = *(yRadiusValues [col] [row]);
536 if (!entry.isEmpty()) {
Callback for collecting X/Theta independent variables, for functions, in preparation for exporting.
CallbackSearchReturn callback(const QString &curveName, const Point &point)
Callback method.
ValuesVectorXOrY xThetaValuesRaw() const
Resulting x/theta values for all included functions.
LineStyle lineStyle() const
Get method for LineStyle.
Container for one set of digitized Points.
CurveStyle curveStyle() const
Return the curve style.
const Points points() const
Return a shallow copy of the Points.
Model for DlgSettingsCoords and CmdSettingsCoords.
Storage of one imported image and the data attached to that image.
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.
QString curveSeparator(const QString *string) const
Gnuplot requires, and other graphing tools probably prefer, blank lines between successive curves.
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) const
Export Document points according to the settings.
Utility class to interpolate points spaced evenly along a piecewise defined curve with fitted spline.
void loadSplinePairsWithTransformation(const Points &points, const Transformation &transformation, 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() const
Resulting x/theta values for all included functions.
CurveConnectAs curveConnectAs() const
Get method for connect type.
Model for DlgSettingsMainWindow.
Class that represents one digitized point. The screen-to-graph coordinate transformation is always ex...
QPointF posScreen() const
Accessor for screen position.
Single X/Y pair for cubic spline interpolation initialization and calculations.
double y() const
Get method for y.
Cubic interpolation given independent and dependent value vectors.