2

私が望むのは、カーブポイントを変更せずにインチとミリメートルを表示するのに最適なように軸ラベルと目盛りを切り替えることです。カスタム QwtScaleDraw を作成し、label() メソッドを上書きしましたが、目盛りは変更されません。

class QwtMyScaleDraw : public QwtScaleDraw {
public:
    QwtMyScaleDraw() : QwtScaleDraw() {
    }
protected:
    QwtText label(double value) const {
           // global conversion routine that creates a display string either as millimeter or inch
           return ConvertToString(value, ConversionFromMillimeter);
    }
};

この動作は、次の図で確認できます。 Qwt プロット スケールのデモ

左のスケールは元のスケール、中央のスケールはカスタム ラベル、右は目的のスケールです。

手動で変換された値を使用して曲線全体を再度追加せずに、目的の結果を得る最良の方法は何ですか?

4

1 に答える 1

3

qwt ライブラリの作成者の助けを借りて、解決策を見つけました。QwtLinearScaleEngine答えは、クラスとオーバーロードautoScaledivideScaleメソッドから派生することです。

私の実装では、任意の変換係数を選択できます (デフォルトは 1 = 変換なし)。これは私のコードです:

class QwtUnitScaleDraw : public QwtScaleDraw {
public:
    QwtUnitScaleDraw(double ConversionFactor = 1.0) : QwtScaleDraw(), _ConversionFactor(ConversionFactor) {
    }
protected:
    QwtText label(double value) const {
        return QwtScaleDraw::label(value * _ConversionFactor);
    }
protected:
    double _ConversionFactor;
};

class QwtUnitScaleEngine: public QwtLinearScaleEngine {
public:
    QwtUnitScaleEngine(double ConversionFactor = 1.0) : QwtLinearScaleEngine(10), _ConversionFactor(ConversionFactor) {
    }

    void autoScale(int maxSteps, double &x1, double &x2, double &stepSize) const {
        x1 *= _ConversionFactor;
        x2 *= _ConversionFactor;
        stepSize *= _ConversionFactor;
        QwtLinearScaleEngine::autoScale(maxSteps, x1, x2, stepSize);
        x1 /= _ConversionFactor;
        x2 /= _ConversionFactor;
        stepSize /= _ConversionFactor;

    }

    QwtScaleDiv divideScale(double x1, double x2, int numMajorSteps, int numMinorSteps, double stepSize = 0.0) const {
        x1 *= _ConversionFactor;
        x2 *= _ConversionFactor;
        stepSize *= _ConversionFactor;

        QwtScaleDiv Div = QwtLinearScaleEngine::divideScale(x1, x2, numMajorSteps, numMinorSteps, stepSize);

        QList<double> Ticks[QwtScaleDiv::NTickTypes];

        Ticks[QwtScaleDiv::MajorTick] = Div.ticks(QwtScaleDiv::MajorTick);
        for (unsigned int i = 0; i < Ticks[QwtScaleDiv::MajorTick].count(); i++) {
            Ticks[QwtScaleDiv::MajorTick][i] /= _ConversionFactor;
        }
        Ticks[QwtScaleDiv::MediumTick] = Div.ticks(QwtScaleDiv::MediumTick);
        for (unsigned int i = 0; i < Ticks[QwtScaleDiv::MediumTick].count(); i++) {
            Ticks[QwtScaleDiv::MediumTick][i] /= _ConversionFactor;
        }
        Ticks[QwtScaleDiv::MinorTick] = Div.ticks(QwtScaleDiv::MinorTick);
        for (unsigned int i = 0; i < Ticks[QwtScaleDiv::MinorTick].count(); i++) {
            Ticks[QwtScaleDiv::MinorTick][i] /= _ConversionFactor;
        }

        return QwtScaleDiv(QwtInterval(x1 / _ConversionFactor, x2 / _ConversionFactor), Ticks);
    }
protected:
    double _ConversionFactor;
};
于 2013-09-03T13:44:54.057 に答える