1 #include "CallbackGatherXThetaValuesFunctions.h"
2 #include "CurveConnectAs.h"
4 #include "EngaugeAssert.h"
5 #include "ExportFileFunctions.h"
6 #include "ExportLayoutFunctions.h"
7 #include "ExportOrdinalsSmooth.h"
8 #include "ExportXThetaValuesMergedFunctions.h"
9 #include "FormatCoordsUnits.h"
11 #include <QTextStream>
14 #include "SplinePair.h"
15 #include "Transformation.h"
27 const QStringList &curvesIncluded,
28 const ExportValuesXOrY &xThetaValues,
29 const QString &delimiter,
31 QTextStream &str)
const
33 LOG4CPP_INFO_S ((*mainCat)) <<
"ExportFileFunctions::exportAllPerLineXThetaValuesMerged";
35 int curveCount = curvesIncluded.count();
36 int xThetaCount = xThetaValues.count();
37 QVector<QVector<QString*> > yRadiusValues (curveCount, QVector<QString*> (xThetaCount));
38 initializeYRadiusValues (curvesIncluded,
41 loadYRadiusValues (modelExportOverride,
49 outputXThetaYRadiusValues (modelExportOverride,
58 destroy2DArray (yRadiusValues);
64 const QStringList &curvesIncluded,
65 const ExportValuesXOrY &xThetaValues,
66 const QString &delimiter,
68 QTextStream &str)
const
70 LOG4CPP_INFO_S ((*mainCat)) <<
"ExportFileFunctions::exportOnePerLineXThetaValuesMerged";
74 QStringList::const_iterator itr;
75 for (itr = curvesIncluded.begin(); itr != curvesIncluded.end(); itr++) {
77 insertLineSeparator (isFirst,
78 modelExportOverride.
header(),
82 const int CURVE_COUNT = 1;
83 QString curveIncluded = *itr;
84 QStringList curvesIncluded (curveIncluded);
86 int xThetaCount = xThetaValues.count();
87 QVector<QVector<QString*> > yRadiusValues (CURVE_COUNT, QVector<QString*> (xThetaCount));
88 initializeYRadiusValues (curvesIncluded,
91 loadYRadiusValues (modelExportOverride,
98 outputXThetaYRadiusValues (modelExportOverride,
107 destroy2DArray (yRadiusValues);
115 QTextStream &str)
const
117 LOG4CPP_INFO_S ((*mainCat)) <<
"ExportFileFunctions::exportToFile";
120 QStringList curvesIncluded = curvesToInclude (modelExportOverride,
123 CONNECT_AS_FUNCTION_SMOOTH,
124 CONNECT_AS_FUNCTION_STRAIGHT);
127 const QString delimiter = exportDelimiterToText (modelExportOverride.
delimiter());
133 Functor2wRet<const QString &, const Point &, CallbackSearchReturn> ftorWithCallback = functor_ret (ftor,
138 ftor.xThetaValuesRaw(),
140 ExportValuesXOrY xThetaValuesMerged = exportXTheta.
xThetaValues ();
143 if (xThetaValuesMerged.count() > 0) {
146 if (modelExportOverride.
layoutFunctions() == EXPORT_LAYOUT_ALL_PER_LINE) {
147 exportAllPerLineXThetaValuesMerged (modelExportOverride,
156 exportOnePerLineXThetaValuesMerged (modelExportOverride,
168 void ExportFileFunctions::initializeYRadiusValues (
const QStringList &curvesIncluded,
169 const ExportValuesXOrY &xThetaValuesMerged,
170 QVector<QVector<QString*> > &yRadiusValues)
const
172 LOG4CPP_INFO_S ((*mainCat)) <<
"ExportFileFunctions::initializeYRadiusValues";
175 int curveCount = curvesIncluded.count();
176 int xThetaCount = xThetaValuesMerged.count();
177 for (
int row = 0; row < xThetaCount; row++) {
178 for (
int col = 0; col < curveCount; col++) {
179 yRadiusValues [col] [row] =
new QString;
184 double ExportFileFunctions::linearlyInterpolate (
const Points &points,
188 LOG4CPP_INFO_S ((*mainCat)) <<
"ExportFileFunctions::linearlyInterpolate";
191 QPointF posGraphBefore;
192 bool foundIt =
false;
193 for (
int ip = 0; ip < points.count(); ip++) {
195 const Point &point = points.at (ip);
200 if (xThetaValue <= posGraph.x()) {
206 yRadius = posGraph.y();
212 double s = (xThetaValue - posGraphBefore.x()) / (posGraph.x() - posGraphBefore.x());
213 yRadius = (1.0 -s) * posGraphBefore.y() + s * posGraph.y();
219 posGraphBefore = posGraph;
225 yRadius = posGraphBefore.y();
235 const QStringList &curvesIncluded,
237 const ExportValuesXOrY &xThetaValues,
238 QVector<QVector<QString*> > &yRadiusValues)
const
240 LOG4CPP_INFO_S ((*mainCat)) <<
"ExportFileFunctions::loadYRadiusValues";
243 int curveCount = curvesIncluded.count();
244 for (
int col = 0; col < curveCount; col++) {
246 const QString curveName = curvesIncluded.at (col);
249 const Points points = curve->
points ();
254 loadYRadiusValuesForCurveRaw (document.
modelCoords(),
259 yRadiusValues [col]);
265 loadYRadiusValuesForCurveInterpolatedSmooth (document.
modelCoords(),
270 yRadiusValues [col]);
274 loadYRadiusValuesForCurveInterpolatedStraight (document.
modelCoords(),
279 yRadiusValues [col]);
285 void ExportFileFunctions::loadYRadiusValuesForCurveInterpolatedSmooth (
const DocumentModelCoords &modelCoords,
287 const Points &points,
288 const ExportValuesXOrY &xThetaValues,
290 QVector<QString*> &yRadiusValues)
const
292 LOG4CPP_INFO_S ((*mainCat)) <<
"ExportFileFunctions::loadYRadiusValuesForCurveInterpolatedSmooth";
296 vector<SplinePair> xy;
306 QString dummyXThetaOut;
308 if (points.count() == 0) {
311 for (
int row = 0; row < xThetaValues.count(); row++) {
312 *(yRadiusValues [row]) =
"";
315 }
else if (points.count() == 1 ||
316 points.count() == 2) {
319 for (
int row = 0; row < xThetaValues.count(); row++) {
321 double xTheta = xThetaValues.at (row);
323 if (points.count() == 1) {
324 yRadius = xy.at (0).y ();
326 double x0 = xy.at (0).x ();
327 double x1 = xy.at (1).x ();
328 double y0 = xy.at (0).y ();
329 double y1 = xy.at (1).y ();
332 yRadius = xy.at (0).y ();
334 double s = (xTheta - x0) / (x1 - x0);
335 yRadius = (1.0 - s) * y0 + s * y1;
343 *(yRadiusValues [row]),
351 const int MAX_ITERATIONS = 12;
358 for (
int row = 0; row < xThetaValues.count(); row++) {
360 double xTheta = xThetaValues.at (row);
361 SplinePair splinePairFound = spline.findSplinePairForFunctionX (xTheta,
363 double yRadius = splinePairFound.
y ();
366 QString dummyXThetaOut;
372 *(yRadiusValues [row]),
378 void ExportFileFunctions::loadYRadiusValuesForCurveInterpolatedStraight (
const DocumentModelCoords &modelCoords,
380 const Points &points,
381 const ExportValuesXOrY &xThetaValues,
383 QVector<QString*> &yRadiusValues)
const
385 LOG4CPP_INFO_S ((*mainCat)) <<
"ExportFileFunctions::loadYRadiusValuesForCurveInterpolatedStraight";
390 for (
int row = 0; row < xThetaValues.count(); row++) {
392 double xThetaValue = xThetaValues.at (row);
394 double yRadius = linearlyInterpolate (points,
399 QString dummyXThetaOut;
405 *(yRadiusValues [row]),
410 void ExportFileFunctions::loadYRadiusValuesForCurveRaw (
const DocumentModelCoords &modelCoords,
412 const Points &points,
413 const ExportValuesXOrY &xThetaValues,
415 QVector<QString*> &yRadiusValues)
const
417 LOG4CPP_INFO_S ((*mainCat)) <<
"ExportFileFunctions::loadYRadiusValuesForCurveRaw";
423 for (
int pt = 0; pt < points.count(); pt++) {
425 const Point &point = points.at (pt);
433 double closestSeparation = 0.0;
435 for (
int row = 0; row < xThetaValues.count(); row++) {
437 double xThetaValue = xThetaValues.at (row);
439 double separation = qAbs (posGraph.x() - xThetaValue);
442 (separation < closestSeparation)) {
444 closestSeparation = separation;
451 QString dummyXThetaOut;
457 *(yRadiusValues [rowClosest]),
465 const QStringList &curvesIncluded,
466 const ExportValuesXOrY &xThetaValuesMerged,
468 QVector<QVector<QString*> > &yRadiusValues,
469 const QString &delimiter,
470 QTextStream &str)
const
472 LOG4CPP_INFO_S ((*mainCat)) <<
"ExportFileFunctions::outputXThetaYRadiusValues";
475 if (modelExportOverride.
header() != EXPORT_HEADER_NONE) {
476 if (modelExportOverride.
header() == EXPORT_HEADER_GNUPLOT) {
477 str << curveSeparator (str.string());
478 str << gnuplotComment();
480 str << modelExportOverride.
xLabel();
481 QStringList::const_iterator itrHeader;
482 for (itrHeader = curvesIncluded.begin(); itrHeader != curvesIncluded.end(); itrHeader++) {
483 QString curveName = *itrHeader;
484 str << delimiter << curveName;
490 const double DUMMY_Y_RADIUS = 1.0;
492 for (
int row = 0; row < xThetaValuesMerged.count(); row++) {
494 if (rowHasAtLeastOneYRadiusEntry (yRadiusValues,
497 double xTheta = xThetaValuesMerged.at (row);
500 QString xThetaString, yRadiusString;
510 for (
int col = 0; col < yRadiusValues.count(); col++) {
512 str << delimiter << *(yRadiusValues [col] [row]);
520 bool ExportFileFunctions::rowHasAtLeastOneYRadiusEntry (
const QVector<QVector<QString*> > &yRadiusValues,
523 bool hasEntry =
false;
525 for (
int col = 0; col < yRadiusValues.count(); col++) {
527 QString entry = *(yRadiusValues [col] [row]);
528 if (!entry.isEmpty()) {
Creates the set of merged x/theta values for exporting functions, using interpolation.
Cubic interpolation given independent and dependent value vectors.
const Points points() const
Return a shallow copy of the Points.
ExportValuesXOrY xThetaValues() const
Resulting x/theta values for all included functions.
LineStyle lineStyle() const
Get method for LineStyle.
ExportFileFunctions()
Single constructor.
DocumentModelCoords modelCoords() const
Get method for DocumentModelCoords.
double y() const
Get method for y.
Class that represents one digitized point. The screen-to-graph coordinate transformation is always ex...
QPointF posScreen() const
Accessor for screen position.
CallbackSearchReturn callback(const QString &curveName, const Point &point)
Callback method.
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...
Model for DlgSettingsMainWindow and CmdSettingsMainWindow.
Utility class to interpolate points spaced evenly along a piecewise defined curve with fitted spline...
Model for DlgSettingsCoords and CmdSettingsCoords.
Storage of one imported image and the data attached to that image.
Container for one set of digitized Points.
QStringList curvesGraphsNames() const
See CurvesGraphs::curvesGraphsNames.
const Curve * curveForCurveName(const QString &curveName) const
See CurvesGraphs::curveForCurveNames, although this also works for AXIS_CURVE_NAME.
CurveStyle curveStyle() const
Return the curve style.
void iterateThroughCurvesPointsGraphs(const Functor2wRet< const QString &, const Point &, CallbackSearchReturn > &ftorWithCallback)
See Curve::iterateThroughCurvePoints, for all the graphs curves.
CurveConnectAs curveConnectAs() const
Get method for connect type.
Callback for collecting X/Theta independent variables, for functions, in preparation for exporting...
Single X/Y pair for cubic spline interpolation initialization and calculations.
void exportToFile(const DocumentModelExportFormat &modelExportOverride, const Document &document, const MainWindowModel &modelMainWindow, const Transformation &transformation, QTextStream &str) const
Export Document points according to the settings.