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"
26 const QStringList &curvesIncluded,
27 const ExportValuesXOrY &xThetaValues,
28 const QString &delimiter,
30 QTextStream &str)
const
32 LOG4CPP_INFO_S ((*mainCat)) <<
"ExportFileFunctions::exportAllPerLineXThetaValuesMerged";
34 int curveCount = curvesIncluded.count();
35 int xThetaCount = xThetaValues.count();
36 QVector<QVector<QString*> > yRadiusValues (curveCount, QVector<QString*> (xThetaCount));
37 initializeYRadiusValues (curvesIncluded,
40 loadYRadiusValues (modelExportOverride,
47 outputXThetaYRadiusValues (modelExportOverride,
55 destroy2DArray (yRadiusValues);
60 const QStringList &curvesIncluded,
61 const ExportValuesXOrY &xThetaValues,
62 const QString &delimiter,
64 QTextStream &str)
const
66 LOG4CPP_INFO_S ((*mainCat)) <<
"ExportFileFunctions::exportOnePerLineXThetaValuesMerged";
70 QStringList::const_iterator itr;
71 for (itr = curvesIncluded.begin(); itr != curvesIncluded.end(); itr++) {
73 insertLineSeparator (isFirst,
74 modelExportOverride.
header(),
78 const int CURVE_COUNT = 1;
79 QString curveIncluded = *itr;
80 QStringList curvesIncluded (curveIncluded);
82 int xThetaCount = xThetaValues.count();
83 QVector<QVector<QString*> > yRadiusValues (CURVE_COUNT, QVector<QString*> (xThetaCount));
84 initializeYRadiusValues (curvesIncluded,
87 loadYRadiusValues (modelExportOverride,
93 outputXThetaYRadiusValues (modelExportOverride,
101 destroy2DArray (yRadiusValues);
108 QTextStream &str)
const
110 LOG4CPP_INFO_S ((*mainCat)) <<
"ExportFileFunctions::exportToFile";
113 QStringList curvesIncluded = curvesToInclude (modelExportOverride,
116 CONNECT_AS_FUNCTION_SMOOTH,
117 CONNECT_AS_FUNCTION_STRAIGHT);
120 const QString delimiter = exportDelimiterToText (modelExportOverride.
delimiter());
126 Functor2wRet<const QString &, const Point &, CallbackSearchReturn> ftorWithCallback = functor_ret (ftor,
131 ftor.xThetaValuesRaw(),
133 ExportValuesXOrY xThetaValuesMerged = exportXTheta.
xThetaValues ();
136 if (xThetaValuesMerged.count() > 0) {
139 if (modelExportOverride.
layoutFunctions() == EXPORT_LAYOUT_ALL_PER_LINE) {
140 exportAllPerLineXThetaValuesMerged (modelExportOverride,
148 exportOnePerLineXThetaValuesMerged (modelExportOverride,
159 void ExportFileFunctions::initializeYRadiusValues (
const QStringList &curvesIncluded,
160 const ExportValuesXOrY &xThetaValuesMerged,
161 QVector<QVector<QString*> > &yRadiusValues)
const
163 LOG4CPP_INFO_S ((*mainCat)) <<
"ExportFileFunctions::initializeYRadiusValues";
166 int curveCount = curvesIncluded.count();
167 int xThetaCount = xThetaValuesMerged.count();
168 for (
int row = 0; row < xThetaCount; row++) {
169 for (
int col = 0; col < curveCount; col++) {
170 yRadiusValues [col] [row] =
new QString;
175 double ExportFileFunctions::linearlyInterpolate (
const Points &points,
179 LOG4CPP_INFO_S ((*mainCat)) <<
"ExportFileFunctions::linearlyInterpolate";
182 QPointF posGraphBefore;
183 bool foundIt =
false;
184 for (
int ip = 0; ip < points.count(); ip++) {
186 const Point &point = points.at (ip);
191 if (xThetaValue <= posGraph.x()) {
197 yRadius = posGraph.y();
203 double s = (xThetaValue - posGraphBefore.x()) / (posGraph.x() - posGraphBefore.x());
204 yRadius = (1.0 -s) * posGraphBefore.y() + s * posGraph.y();
210 posGraphBefore = posGraph;
216 yRadius = posGraphBefore.y();
225 const QStringList &curvesIncluded,
227 const ExportValuesXOrY &xThetaValues,
228 QVector<QVector<QString*> > &yRadiusValues)
const
230 LOG4CPP_INFO_S ((*mainCat)) <<
"ExportFileFunctions::loadYRadiusValues";
233 int curveCount = curvesIncluded.count();
234 for (
int col = 0; col < curveCount; col++) {
236 const QString curveName = curvesIncluded.at (col);
239 const Points points = curve->
points ();
244 loadYRadiusValuesForCurveRaw (document.
modelCoords(),
248 yRadiusValues [col]);
254 loadYRadiusValuesForCurveInterpolatedSmooth (document.
modelCoords(),
258 yRadiusValues [col]);
262 loadYRadiusValuesForCurveInterpolatedStraight (document.
modelCoords(),
266 yRadiusValues [col]);
272 void ExportFileFunctions::loadYRadiusValuesForCurveInterpolatedSmooth (
const DocumentModelCoords &modelCoords,
273 const Points &points,
274 const ExportValuesXOrY &xThetaValues,
276 QVector<QString*> &yRadiusValues)
const
278 LOG4CPP_INFO_S ((*mainCat)) <<
"ExportFileFunctions::loadYRadiusValuesForCurveInterpolatedSmooth";
282 const int MAX_ITERATIONS = 12;
285 vector<SplinePair> xy;
300 for (
int row = 0; row < xThetaValues.count(); row++) {
302 double xTheta = xThetaValues.at (row);
303 SplinePair splinePairFound = spline.findSplinePairForFunctionX (xTheta,
305 double yRadius = splinePairFound.
y ();
308 QString dummyXThetaOut;
313 *(yRadiusValues [row]),
318 void ExportFileFunctions::loadYRadiusValuesForCurveInterpolatedStraight (
const DocumentModelCoords &modelCoords,
319 const Points &points,
320 const ExportValuesXOrY &xThetaValues,
322 QVector<QString*> &yRadiusValues)
const
324 LOG4CPP_INFO_S ((*mainCat)) <<
"ExportFileFunctions::loadYRadiusValuesForCurveInterpolatedStraight";
329 for (
int row = 0; row < xThetaValues.count(); row++) {
331 double xThetaValue = xThetaValues.at (row);
333 double yRadius = linearlyInterpolate (points,
338 QString dummyXThetaOut;
343 *(yRadiusValues [row]),
348 void ExportFileFunctions::loadYRadiusValuesForCurveRaw (
const DocumentModelCoords &modelCoords,
349 const Points &points,
350 const ExportValuesXOrY &xThetaValues,
352 QVector<QString*> &yRadiusValues)
const
354 LOG4CPP_INFO_S ((*mainCat)) <<
"ExportFileFunctions::loadYRadiusValuesForCurveRaw";
360 for (
int pt = 0; pt < points.count(); pt++) {
362 const Point &point = points.at (pt);
370 double closestSeparation = 0.0;
372 for (
int row = 0; row < xThetaValues.count(); row++) {
374 double xThetaValue = xThetaValues.at (row);
376 double separation = qAbs (posGraph.x() - xThetaValue);
379 (separation < closestSeparation)) {
381 closestSeparation = separation;
388 QString dummyXThetaOut;
393 *(yRadiusValues [rowClosest]),
400 const QStringList &curvesIncluded,
401 const ExportValuesXOrY &xThetaValuesMerged,
403 QVector<QVector<QString*> > &yRadiusValues,
404 const QString &delimiter,
405 QTextStream &str)
const
407 LOG4CPP_INFO_S ((*mainCat)) <<
"ExportFileFunctions::outputXThetaYRadiusValues";
410 if (modelExportOverride.
header() != EXPORT_HEADER_NONE) {
411 if (modelExportOverride.
header() == EXPORT_HEADER_GNUPLOT) {
412 str << curveSeparator (str.string());
413 str << gnuplotComment();
415 str << modelExportOverride.
xLabel();
416 QStringList::const_iterator itrHeader;
417 for (itrHeader = curvesIncluded.begin(); itrHeader != curvesIncluded.end(); itrHeader++) {
418 QString curveName = *itrHeader;
419 str << delimiter << curveName;
425 const double DUMMY_Y_RADIUS = 1.0;
427 for (
int row = 0; row < xThetaValuesMerged.count(); row++) {
429 if (rowHasAtLeastOneYRadiusEntry (yRadiusValues,
432 double xTheta = xThetaValuesMerged.at (row);
435 QString xThetaString, yRadiusString;
444 for (
int col = 0; col < yRadiusValues.count(); col++) {
446 str << delimiter << *(yRadiusValues [col] [row]);
454 bool ExportFileFunctions::rowHasAtLeastOneYRadiusEntry (
const QVector<QVector<QString*> > &yRadiusValues,
457 bool hasEntry =
false;
459 for (
int col = 0; col < yRadiusValues.count(); col++) {
461 QString entry = *(yRadiusValues [col] [row]);
462 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...
Utility class to interpolate points spaced evenly along a piecewise defined curve with fitted spline...
Model for DlgSettingsCoords and CmdSettingsCoords.
void exportToFile(const DocumentModelExportFormat &modelExportOverride, const Document &document, const Transformation &transformation, QTextStream &str) const
Export Document points according to the settings.
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.