|
|
#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<double> 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<double> generateLinearTicks(double start, double interval,
|
|
|
double minValue, double maxValue) const;
|
|
|
|
|
|
// 对数刻度辅助方法
|
|
|
QVector<double> generateLogTicks(double logMin, double logMax,
|
|
|
double logInterval) const;
|
|
|
|
|
|
// 日期时间刻度辅助方法
|
|
|
TimeUnit determineBestTimeUnit(double timeRangeSeconds) const;
|
|
|
double calculateNiceTimeInterval(TimeUnit unit) const;
|
|
|
QVector<double> generateDateTimeTicks(double start, double interval,
|
|
|
TimeUnit unit, double minValue,
|
|
|
double maxValue) const;
|
|
|
|
|
|
// 格式化方法
|
|
|
QStringList formatLinearLabels(const QVector<double>& ticks,
|
|
|
double interval) const;
|
|
|
QStringList formatLogLabels(const QVector<double>& ticks) const;
|
|
|
QStringList formatDateTimeLabels(const QVector<double>& ticks,
|
|
|
TimeUnit unit, int interval) const;
|
|
|
|
|
|
// 范围调整方法
|
|
|
void adjustLinearRange(double& minValue, double& maxValue, double interval,
|
|
|
const QVector<double>& ticks) const;
|
|
|
void adjustDateTimeRange(double& minValue, double& maxValue, double interval,
|
|
|
TimeUnit unit, const QVector<double>& 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];
|
|
|
};
|