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" 17 #include <QTextStream> 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,
64 destroy2DArray (yRadiusValues);
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++) {
83 insertLineSeparator (isFirst,
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,
113 destroy2DArray (yRadiusValues);
121 QTextStream &str)
const 123 LOG4CPP_INFO_S ((*mainCat)) <<
"ExportFileFunctions::exportToFile";
126 QStringList curvesIncluded = curvesToInclude (modelExportOverride,
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,
144 ftor.xThetaValuesRaw(),
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,
174 void 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;
190 double 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]);
291 void 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);
371 double yRadius = splinePairFound.
y ();
374 QString dummyXThetaOut;
380 *(yRadiusValues [row]),
386 void 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]),
418 void 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) {
485 str << curveSeparator (str.string());
486 str << gnuplotComment();
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]);
528 bool 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()) {
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.
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.
SplinePair findSplinePairForFunctionX(double x, int numIterations) const
Use bisection algorithm to iteratively find the SplinePair interpolated to best match the specified x...
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.