#pragma once #include "Defines.h" #include "LlUtils_global.h" /// @brief 坐标刻度智能计算(扩展)2025-12-16 class I_UTILS_EXPORT ZxSmartTickHelper : public QObject { Q_OBJECT public: // 刻度类型枚举 enum ScaleType { LinearScale = 0, // 线性刻度 LogScale = 1, // 对数刻度 DateTimeScale = 2 // 日期时间刻度 }; // 时间单位枚举 enum TimeUnit { Milliseconds = 0, Seconds = 1, Minutes = 2, Hours = 3, Days = 4, Weeks = 5, Months = 6, Years = 7 }; // 日期时间格式枚举 enum DateTimeFormat { AutoDateTimeFormat = 0, // 自动选择格式 ISO8601Format = 1, // ISO 8601格式 ShortDateTimeFormat = 2, // 短日期时间 LongDateTimeFormat = 3, // 长日期时间 TimeOnlyFormat = 4, // 只显示时间 DateOnlyFormat = 5 // 只显示日期 }; // 刻度结果结构体 class TickResult { public: TickResult() : originalMin(0.0), originalMax(0.0) , adjustedMin(0.0), adjustedMax(0.0) , tickInterval(0.0), tickCount(0) , scaleType(LinearScale) , timeUnit(Seconds) , success(true) { } public: double originalMin; double originalMax; double adjustedMin; double adjustedMax; QVector ticks; QStringList tickLabels; double tickInterval; int tickCount; ScaleType scaleType; TimeUnit timeUnit; bool success; QString errorMessage; }; public: explicit ZxSmartTickHelper(QObject *parent = 0); ZxSmartTickHelper(int maxTicks, bool preferIntegers, QObject *parent = 0); // 主要计算方法 TickResult calculate(double dMin, double dMax, ScaleType scaleType = LinearScale) const; TickResult calculateLinear(double dMin, double dMax) const; TickResult calculateLog(double dMin, double dMax) const; TickResult calculateDateTime(double dMin, double dMax) const; // 静态工具方法 static bool shouldUseLogScale(double dMin, double dMax, double threshold = 1000.0); static bool shouldUseDateTimeScale(double dMin, double dMax); static QString timestampToString(double timestamp, DateTimeFormat format = AutoDateTimeFormat); static double stringToTimestamp(const QString& datetime); static QDateTime timestampToDateTime(double timestamp); static double dateTimeToTimestamp(const QDateTime& datetime); QDateTime alignToUnit(const QDateTime& dt, TimeUnit unit, int interval) const; int getSecondsPerUnit(TimeUnit unit) const; QDateTime addTimeUnits(const QDateTime& dt, TimeUnit unit, int count) const; // 设置参数 void setMaxTicks(int maxTicks) { m_maxTicks = qMax(3, maxTicks); } void setPreferIntegers(bool prefer) { m_preferIntegers = prefer; } void setDateTimeFormat(DateTimeFormat format) { m_dateTimeFormat = format; } int maxTicks() const { return m_maxTicks; } bool preferIntegers() const { return m_preferIntegers; } DateTimeFormat dateTimeFormat() const { return m_dateTimeFormat; } private: // 线性刻度辅助方法 double calculateNiceInterval(double rangeSize) const; double calculateNiceStart(double minValue, double interval) const; QVector generateLinearTicks(double start, double interval, double minValue, double maxValue) const; // 对数刻度辅助方法 QVector generateLogTicks(double logMin, double logMax, double logInterval) const; // 日期时间刻度辅助方法 TimeUnit determineBestTimeUnit(double timeRangeSeconds) const; double calculateNiceTimeInterval(TimeUnit unit) const; QVector generateDateTimeTicks(double start, double interval, TimeUnit unit, double minValue, double maxValue) const; // 格式化方法 QStringList formatLinearLabels(const QVector& ticks, double interval) const; QStringList formatLogLabels(const QVector& ticks) const; QStringList formatDateTimeLabels(const QVector& ticks, TimeUnit unit, int interval) const; // 范围调整方法 void adjustLinearRange(double& minValue, double& maxValue, double interval, const QVector& ticks) const; void adjustDateTimeRange(double& minValue, double& maxValue, double interval, TimeUnit unit, const QVector& ticks) const; // 时间转换辅助方法 static double secondsToUnit(double seconds, TimeUnit unit); static double unitToSeconds(double value, TimeUnit unit); static QString formatDateTimeForUnit(double timestamp, TimeUnit unit, DateTimeFormat format = AutoDateTimeFormat); // 成员变量 int m_maxTicks; bool m_preferIntegers; DateTimeFormat m_dateTimeFormat; // 常量 static const double MILLISECONDS_PER_SECOND; static const double SECONDS_PER_MINUTE; static const double MINUTES_PER_HOUR; static const double HOURS_PER_DAY; static const double DAYS_PER_WEEK; static const double DAYS_PER_MONTH; static const double DAYS_PER_YEAR; // 时间单位阈值 static const double TIME_UNIT_THRESHOLDS[8]; // 时间单位名称 static const char* TIME_UNIT_NAMES[8]; // 美观数字 static const double NICE_NUMBERS[5]; };