void ScaleEngine::autoScale (int maxNumSteps, double &x1, double &x2, double &stepSize) const { if (!hasBreak() || testAttribute(QwtScaleEngine::Inverted)){ QwtScaleEngine *engine = newScaleEngine(); engine->setAttributes(attributes()); engine->setReference(reference()); engine->setMargins(lowerMargin(), upperMargin()); if (type() == ScaleTransformation::Log10 || type() == ScaleTransformation::Ln || type() == ScaleTransformation::Log2){ if (x1 <= 0.0) x1 = LOG_MIN; if (x2 <= 0.0) x2 = LOG_MIN; } engine->autoScale(maxNumSteps, x1, x2, stepSize); delete engine; } else { QwtScaleEngine *engine = newScaleEngine(); engine->setAttributes(attributes()); double breakLeft = d_break_left; engine->autoScale(maxNumSteps, x1, breakLeft, stepSize); delete engine; engine = new QwtLinearScaleEngine(); engine->setAttributes(attributes()); double breakRight = d_break_right; engine->autoScale(maxNumSteps, breakRight, x2, stepSize); delete engine; } }
void ScaleEngine::autoScale (int maxNumSteps, double &x1, double &x2, double &stepSize) const { if (!hasBreak() || testAttribute(QwtScaleEngine::Inverted)){ QwtScaleEngine *engine; if (d_type == QwtScaleTransformation::Log10) engine = new QwtLog10ScaleEngine(); else engine = new QwtLinearScaleEngine(); engine->setAttributes(attributes()); engine->setReference(reference()); engine->setMargins(loMargin(), hiMargin()); engine->autoScale(maxNumSteps, x1, x2, stepSize); delete engine; } else { QwtScaleEngine *engine; if (d_type == QwtScaleTransformation::Log10) engine = new QwtLog10ScaleEngine(); else engine = new QwtLinearScaleEngine(); engine->setAttributes(attributes()); double breakLeft = d_break_left; engine->autoScale(maxNumSteps, x1, breakLeft, stepSize); delete engine; engine = new QwtLinearScaleEngine(); engine->setAttributes(attributes()); double breakRight = d_break_right; engine->autoScale(maxNumSteps, breakRight, x2, stepSize); delete engine; } }
QwtScaleDiv ScaleEngine::divideScale(double x1, double x2, int maxMajSteps, int maxMinSteps, double stepSize) const { QwtScaleEngine *engine; if (!hasBreak()){ engine = newScaleEngine(); QwtScaleDiv div = engine->divideScale(x1, x2, maxMajSteps, maxMinSteps, stepSize); delete engine; return div; } double lb = d_break_left; double rb = d_break_right; double step1 = d_step_before; double step2 = d_step_after; if (x1 > x2){ lb = d_break_right; rb = d_break_left; step1 = d_step_after; step2 = d_step_before; if (d_log10_scale_after) engine = new QwtLog10ScaleEngine(); else engine = new QwtLinearScaleEngine(); } else engine = newScaleEngine(); int max_min_intervals = d_minor_ticks_before; if (d_minor_ticks_before == 1) max_min_intervals = 3; if (d_minor_ticks_before > 1) max_min_intervals = d_minor_ticks_before + 1; QwtScaleDiv div1 = engine->divideScale(x1, lb, maxMajSteps/2, max_min_intervals, step1); max_min_intervals = d_minor_ticks_after; if (d_minor_ticks_after == 1) max_min_intervals = 3; if (d_minor_ticks_after > 1) max_min_intervals = d_minor_ticks_after + 1; delete engine; if (testAttribute(QwtScaleEngine::Inverted)) engine = newScaleEngine(); else if (d_log10_scale_after) engine = new QwtLog10ScaleEngine(); else engine = new QwtLinearScaleEngine(); QwtScaleDiv div2 = engine->divideScale(rb, x2, maxMajSteps/2, max_min_intervals, step2); QwtValueList ticks[QwtScaleDiv::NTickTypes]; ticks[QwtScaleDiv::MinorTick] = div1.ticks(QwtScaleDiv::MinorTick) + div2.ticks(QwtScaleDiv::MinorTick); ticks[QwtScaleDiv::MediumTick] = div1.ticks(QwtScaleDiv::MediumTick) + div2.ticks(QwtScaleDiv::MediumTick); ticks[QwtScaleDiv::MajorTick] = div1.ticks(QwtScaleDiv::MajorTick) + div2.ticks(QwtScaleDiv::MajorTick); delete engine; return QwtScaleDiv(x1, x2, ticks); }