#pragma once #include //============================================================ // // Enum // //============================================================ /// /// 自定义控件的类型名称 /// #define CLASS_NAME_BUTTON "VButton" #define CLASS_NAME_LABEL "VLabel" #define CLASS_NAME_CHECKBOX "VCheckBox" #define CLASS_NAME_RADIOBOX "VRadioBox" #define CLASS_NAME_GROUPBOX "VGroupBox" #define CLASS_NAME_IMAGECONTROL "VImageControl" #define CLASS_NAME_LINEDIT "VLineEdit" #define CLASS_NAME_COMBOBOX "VComboBox" #define CLASS_NAME_LISTBOX "VListBox" #define CLASS_NAME_VALUECONTROL "ValueControl" #define CLASS_NAME_PIECHART "VPieChart" #define CLASS_NAME_CUSTOMPLOT "VCustomPlot" #define CLASS_NAME_TABLECONTROL "VTableControl" #define CLASS_NAME_RESULT "VResult" //============================================================ // // Task、Event // //============================================================ // 几个系统内置的任务执行模式 #define TASK_MODE_LOOP "1.Sys.Task.Loop" #define TASK_MODE_EVENT_RUN "2.Sys.Task.Run" #define TASK_MODE_EVENT_STOP "3.Sys.Task.Stop" #define TASK_MODE_EVENT_EXIT "4.Sys.App.Exit" #define TASK_MODE_EVENT_DOCLOADED "5.Sys.Doc.Loaded" #define TASK_MODE_EVENT_TIME_100MS "6.Sys.Time.100ms" #define TASK_MODE_EVENT_TIME_500MS "7.Sys.Time.500ms" #define TASK_MODE_EVENT_TIME_1S "8.Sys.Time.1s" #define TASK_MODE_EVENT_TIME_5S "9.Sys.Time.5s" // 几个内置变量命名的后缀 #define EXEC_COUNT_POSTFIX ".ExecCount" #define ERROR_COUNT_POSTFIX ".ErrorCount" /// /// Task的任务类型 /// enum class TASK_MODE_TYPE : short { MODE_SYS, // 系统内置 MODE_HDW, // 硬件组态 MODE_VAL, // 变量触发 MODE_COUNT // 任务类型的数量 }; /// /// 存储Task相关信息 /// class POU; class TASK { public: TASK(QString strName = "") { this->nIndex = 0; this->strName = strName; this->modeType = TASK_MODE_TYPE::MODE_SYS; this->strModeName = TASK_MODE_LOOP; //pActivator = new TaskActivator(); this->timeOut = ULONG_MAX; // eventID = QEvent::None; this->pEvent = nullptr; } TASK(const TASK& task) { this->nIndex = task.nIndex; this->strName = task.strName; this->execParams = task.execParams; this->modeType = task.modeType; this->strModeName = task.strModeName; // this->pActivator = task.pActivator; // this->eventID = task.eventID; this->timeOut = task.timeOut; this->pEvent = task.pEvent; } ~TASK() { //if (pActivator != nullptr) //{ // delete pActivator; // pActivator = nullptr; //} } // 根据Mode类型绑定对应的Event,返回旧的EventType QEvent::Type bindEventByMode(); // 任务是否执行中(处于Busy和Wait状态) bool isRunning() const; // 序列化 friend QDataStream& operator<<(QDataStream& out, const TASK& task); // 反序列化 friend QDataStream& operator>>(QDataStream& in, TASK& task); public: int nIndex; // 任务序号 QString strName; // 任务名称 TASK_PARAMS execParams; // 执行参数 TASK_MODE_TYPE modeType; // 任务模式的分类 QString strModeName; // 任务模式的名称 // event相关 QMutex mutex; // Task与Event对应的互斥量 quint32 timeOut; // 超时时间 TaskActivator activator; // TaskManager中用于触发Task的事件(如果需要) // EVENT_ID eventID; // dll中事件的ID号 ToolEvent* pEvent; // Task绑定的触发Event QVector pous; // 本Task中的Pou }; using TASK_OPTION = TASK; //============================================================ // // Designer、DataLink // //============================================================ /// /// 定义和注册Designer中的DataLink属性类型 /// class DataLink { public: DataLink() { bForce = false; defaultValue = nullptr; linkValue = nullptr; }; DataLink(const QString linkString) { fromString(linkString); } ~DataLink() { //if (defaultValue != nullptr) //{ // delete defaultValue; // defaultValue = nullptr; //} }; // 重载!= bool operator!= (const DataLink& dl) const; // 重载= DataLink& operator =(const DataLink& dl); // 转换成字符串类型 QString toString() const; // 从字符串解析 void fromString(const QString& linkString); // 是否有效 bool isValid() const; // 序列化 friend QDataStream& operator<<(QDataStream& out, const DataLink& datalink); // 反序列化 friend QDataStream& operator>>(QDataStream& in, DataLink& datalink); public: QString title; // 属性项的名称 QStringList value; // 用户选择的数值,包括(数据分组、数据的子分类、数值,以|分隔) const VARIABLE* defaultValue; // 默认值(不允许更改) VARIABLE* linkValue; // 数据连接中的值 bool bForce; // 是否强制要求赋值 }; // 注册此类型 Q_DECLARE_METATYPE(DataLink) ///// ///// 属性中的数据链接属性项 ///// //#define DEFAULT_DATALINK_VALUE_0 "0" //#define DEFAULT_DATALINK_VALUE_1 "1" //#define DEFAULT_DATALINK_VALUE_MSG "msg" //typedef struct _tagPropertyDataLink //{ // QString title; // 属性项的名称 // // DataLink value; // 数据链接的内容 // // // QStringList valueList; // 用户选择的数值,包括(数据分组、数据的子分类、数值,以|分隔) // // // QString defaultValue; // 默认值 // // VARIABLE* defaultValue; // 默认值 // VARIABLE* linkValue; // 数据连接中的值 // // bool bForce; // 是否强制要求赋值 // // // bool bRefeshIndex; // 是否是触发刷新的主索引 // // _tagPropertyDataLink() // { // bForce = true; // // defaultValue = nullptr; // linkValue = nullptr; // // // bRefeshIndex = false; // } // // // 序列化 // friend QDataStream& operator<<(QDataStream& out, const _tagPropertyDataLink& proplink); // // 反序列化 // friend QDataStream& operator>>(QDataStream& in, _tagPropertyDataLink& proplink); // //} PROPERTY_DATALINK; /// /// 自定义控件属性 /// #include #include class CONTROL_PROPERTY { public: CONTROL_PROPERTY() { this->m_clrBorder = QColor(255, 0, 0); this->m_clrText = QColor(255, 255, 255); this->m_bEnable = true; this->m_nColCount = 0; this->m_nRowCount = 0; this->m_nSliceCount = 0; this->m_nHObjectCount = 0; this->m_nHTupleCount = 0; this->m_nDisplayCount = 0; this->m_nStringCount = 0; this->m_nInteractions = 0; this->m_nTickCountX = 15; this->m_nTickCountY = 10; this->m_nDrawingMode = 0; this->m_RangeX = QSize(0, 100); this->m_RangeY = QSize(0, 100); } // 序列化 friend QDataStream& operator<<(QDataStream& out, const CONTROL_PROPERTY& prop); // 反序列化 friend QDataStream& operator>>(QDataStream& in, CONTROL_PROPERTY& prop); public: QString m_strText; // 控件文字 QString m_strTip; // 控件提示信息 // QRect m_geometry; // 位置和尺寸信息 QColor m_clrText; // 文字颜色 QColor m_clrBg; // 背景色 QFont m_Font; // 控件字体 bool m_bEnable; // 是否启用控件 DataLink m_DataLink; // 数据链接 // 仅Table(行和列) int m_nRowCount; int m_nColCount; // 仅Pie int m_nSliceCount; // 分块的数量 QColor m_clrBorder; // 控件边框颜色 // 仅Image int m_nHObjectCount; int m_nHTupleCount; int m_nDisplayCount; int m_nStringCount; // 仅曲线 int m_nInteractions; // 交互模式 int m_nDrawingMode; // 绘图模式 int m_nTickCountX; // X轴格子数量 int m_nTickCountY; // Y轴格子数量 QSize m_RangeX; // 暂时用QSize 替代。实际应使用自定义结构体 QSize m_RangeY; // 暂时用QSize 替代。实际应使用自定义结构体 }; /// /// 控件的扩展子属性字段 /// typedef struct _tagPropertyExSubGroup { // 子分组名字 QString strTitle; // 数据链接(扩展到多个) QVector dataLinks; // 数值(一般是分块名称、列名等) QString strValueName; QString strValue; // 颜色(本分组的颜色) QString strColorName; QColor color; // Image用 // 组1 //// 透明度 //QString strTranspName; //double fTransparency; // 线宽 QString strLineWidthName; int nLineWidth; // 组2 // 坐标 QString strPtName;; QPoint pt; //// 改为数据链接 //DataLink dataLinkPoint; // 尺寸 QString strSize; int nSize; // 组3 // 启用存图 QString strSaveImage; bool bEnSaveImage; // 启用转储 QString strDumpWindow; bool bEnDumpWindow; // 启用状态判断 QString strExecuteState; bool bEnExecuteState; // 存储模式 QString strSaveMode; int nSaveMode; // 缓存大小 QString strBufferSize; int nBufferSize; // 空闲时间 QString strFreeTime; int nFreeTime; // 序列化 friend QDataStream& operator<<(QDataStream& out, const _tagPropertyExSubGroup& subgroup); // 反序列化 friend QDataStream& operator>>(QDataStream& in, _tagPropertyExSubGroup& subgroup); _tagPropertyExSubGroup() { this->nLineWidth = 0; this->nSize = 0; this->nFreeTime = 0; this->nSaveMode = 0; this->nBufferSize = 0; this->bEnSaveImage = false; this->bEnExecuteState = false; this->bEnDumpWindow = false; } } PROPERTY_EX_SUBGROUP; /// /// 控件的所有扩展属性子分组信息(每个控件对应多个子属性组) /// using PROPERTY_EX_SUBGROUPS = QVector; typedef struct _tagPropertyExGroup { // 本子属性组在属性表里关联Key的名称,这个Key决定了本子属性组有多少个 QString strRelationKey; QString strTitle; // 本组属性下所有的子属性 PROPERTY_EX_SUBGROUPS subGroups; } PROPERTY_EX_GROUP; /// /// 控件的扩展属性 /// using PROPERTY_EX_GROUPS = QVector; using PROPERTY_DATALINKS = QVector; class CONTROL_PROPERTY_EX { public: //// 检查属性是否有效 //bool checkValid(); public: CONTROL_PROPERTY_EX() { } QString m_strTitle; // 扩展属性的总名称 DataLink m_refreshLink; // 刷新链接(有且只有一个) PROPERTY_DATALINKS m_mainDataLinks; // 主数据链接(2022-1-14修改为多个) PROPERTY_EX_GROUPS m_groups; // 所有扩展属性组(2022-1-8修改为了多个,因为有的控件有多个子属性组) // CONTROL_PROPERTY_EX 序列化 friend QDataStream& operator<<(QDataStream& out, const CONTROL_PROPERTY_EX& propEx); // CONTROL_PROPERTY_EX 反序列化 friend QDataStream& operator>>(QDataStream& in, CONTROL_PROPERTY_EX& propEx); }; // 注册此类型 Q_DECLARE_METATYPE(CONTROL_PROPERTY_EX) /// /// 用于复杂控件的Runtime刷新时,每一个刷新单元包含的多个数值 /// typedef struct _tagRUNTIME_SYNC_VAR { QString strPropertyName; const VARIABLE* pVariable; _tagRUNTIME_SYNC_VAR(const QString& strName, const VARIABLE* pVar) { strPropertyName = strName; pVariable = pVar; } } RUNTIME_SYNC_VAR; using RUNTIME_SYNC_VARS = QVector; //============================================================ // // SystemCommand // //============================================================ // 系统指令 #define SYS_CMD_GROUP_NAME "System Command" #define SYS_CMD_TASK_RUN "Sys.Task.Run" #define SYS_CMD_TASK_RUNONCE "Sys.Task.RunOnce" #define SYS_CMD_TASK_STOP "Sys.Task.Stop" #define SYS_CMD_UI_SWITCH "Sys.UI.Switch" /// /// 定义Designer用到的系统指令 /// class SystemCommand { public: // 获取所有的可用指令 static QStringList getAllCmd(); //// 执行指令 //static bool runCmd(const QString& strCmd, const QString& strParam = ""); }; //============================================================ // // Other // //============================================================ /// /// Debug信息类型定义 /// typedef struct _tagDebugMsg { int msgType; QString strMsg; _tagDebugMsg() { msgType = 0; } } DEBUGMSG; /// /// WindowApp中的各个子界面 /// enum class SUBVIEW_TYPE : short { SUBVIEW_GVL, // 全局变量窗口 SUBVIEW_POU, // POU窗口 SUBVIEW_TASK, // Task 窗口 SUBVIEW_UI, // UI设计窗口 SUBVIEW_USER, // 用户管理窗口 SUBVIEW_COUNT = 5, // 视图的分类总数(有部分视图是属于一类的) SUBVIEW_TASKMONITOR, // Task Monitor窗口 SUBVIEW_LOG, // LOG 窗口 SUBVIEW_HDW // 硬件组态 窗口 }; /// /// 各个全局子窗体 /// enum class WND_TYPE : short { WND_HOME, // 首页 // WND_HDW, // 硬件组态 WND_APP, // 程序 // WND_OUTPUT, // 输出 WND_RUNTIME, // 运行 WND_COUNT };