You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
nmWTAI-Platform/Include/iBase/iUtils/ZxSmartTickHelper.h

166 lines
5.6 KiB
C

#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];
};