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++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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