DiagramDesigner/diagramCavas/include/graphicsDataModel/fixedPortsModel.h

200 lines
11 KiB
C
Raw Normal View History

2026-03-23 11:06:17 +08:00
#pragma once
#include "graphicsDataModel/baseModel.h"
#include "serializable.h"
#include "powerEntity.h"
#include <QSharedPointer>
#include <QJsonObject>
#include <QTimer>
#include <QPointer>
#include "common/frontend/monitor_item.h"
#include "common/backend/project_model.h"
class BaseDrawingPanel;
class DrawingPanel;
class GraphicsBaseItem;
class GraphicsFunctionModelItem;
class GraphicsBaseModelItem;
class BaseProperty;
class BaseModelProperty;
class DesignerScene;
class HttpInterface;
class DiagramCavas;
struct Connection;
class PowerEntity;
class ElectricFunctionModelConnectLineItem;
class ProjectIconSetting;
class ElectricBayItem;
class GraphicsNonStandardItem;
class BayProperty;
class BayManagerDlg;
class ModelProperty;
struct ItemPageInfo;
class EditBaseItem;
class MonitorPanel;
class ItemPropertyDlg;
class BayMeasureDlg;
struct MeasurementInfo;
class FixedPortsModel : public BaseModel, public Serializable
{
Q_OBJECT
public:
FixedPortsModel(PowerEntity*);
~FixedPortsModel();
public:
QMap<QUuid,ItemPageInfo> allNodePos() const;
QVector<ModelProperty*> allConnectionProperty();
QMap<QUuid,GraphicsFunctionModelItem*>& allItems();
bool addNodeItem(QUuid uuid,GraphicsFunctionModelItem*);
QString addNodeItem(QUuid id,QPointF pos,double width = 0,double height = 0,double rotate = 0);
GraphicsFunctionModelItem* nodeItem(QUuid uuid);
BaseProperty* addNodeData(QUuid id,int type,QString name,QString modelName); //对应component数据一个data可对应多个itemid,类型,名称,工程模名)
void loadNodeDataFromDataBase(); //从数据库加载数据
QString addConnectLline(QUuid lineId,QUuid srcId,QUuid destId,QUuid srcPort,QUuid destPort);
void deleteNodeItem(GraphicsFunctionModelItem*);
//QJsonObject saveNode(QUuid const) const;
void saveNode(int nPageId);
void setScene(DesignerScene* p){_scene = p;}
DesignerScene* getScene() {return _scene;}
void setTopWidget(BaseDrawingPanel* p) {_widget = p;}
BaseDrawingPanel* getParent(){return _widget;}
QWidget* getTopWidget();
QPointF getTerminalPos(const QString& sTerminalId); //获取拓扑接线点在当前diagram中的位置
ElectricFunctionModelConnectLineItem* getLineItemById(const QString& terminalId);
void updateItemLinePort(QUuid,ModelFunctionType); //刷新连接item的线端点位置
QMap<QString,ModelStateInfo>& getModelState() {return _modelStateInfo;}
void showModelDlg(const QString&,QUuid,GraphicsFunctionModelItem*); //点击时显示指定模型的dlg、指定item的数据(模型名对象Uuid,触发事件的item)
void initialPropertyDlg(); //初始化属性设置dlg每个模型拥各自的dlg
void generatePropertyDlg(const QString&);
ConfigurationDiagram* getTopologyDiagram(); //返回当前组态图的拓扑实体
void createTopoTerminalsByData(PowerEntity* pParent,QJsonObject componentCon,ModelFunctionType funType = ModelFunctionType::ProjectModel); //通过componet数据创建port接线点(加载)
bool isItemValid(GraphicsFunctionModelItem*); //判断item是否可以连接
void insertProjectModelName(QString,QString); //插入工程模类型(生成工程模时调用)
void showProjectIconSettingDlg(GraphicsFunctionModelItem*); //显示工程模图标设置(设置使用图标)
void updateItemIcon(QString sMeta,QString sModel,QMap<QString,QByteArray>,QString sIndex = "",int type = 0,int slot = 0); //更新指定模型的图标 sIndex:索引下标,为空全部更新 sTemplate模板名 type基础类型 slot HMI资源中的槽位
void updateModelIcon(QString sMeta,QString sModel,QMap<QString,QByteArray>,QString sIndex = ""); //更新某类模型的所有图标
/*************************间隔*****************************/
void addBayItem(QUuid,ModelFunctionType = ModelFunctionType::ProjectModel);
bool addBayItem(QUuid,ElectricBayItem*,ModelFunctionType = ModelFunctionType::ProjectModel);
void addItemsToBay(QList<GraphicsBaseItem*>,ElectricBayItem*); //将对象添加到间隔
BayProperty* addBayData(QUuid uuid,ModelFunctionType = ModelFunctionType::ProjectModel);
QMap<QUuid,ElectricBayItem*>& allBayItem(); //返回所有间隔对象
BayProperty* generateBayData(BayProperty*,QList<BaseProperty*>); //生成新间隔数据(间隔数据结构相同)<baseBay,projectData>
QList<QUuid> getCorrespondId(QList<QUuid>,QList<BaseProperty*>); //获取基模id对应的工程模id
QRectF calculateItemsBoundingRect(QList<GraphicsBaseItem*> items); //返回包含所有item的rect
void addBayByData(BayProperty*,ModelFunctionType = ModelFunctionType::ProjectModel); //data生成bay
void showBayMeasureDlg(BayProperty*); //显示间隔量测
QJsonObject turnListToJson(QList<QUuid> lst,QString sInerTag,QString sOutTag); //将list转换为QJsonObject,<lst,内部标签,外部标签>
QList<QUuid> turnJsonArrToList(QJsonObject obj,QString sInner,QString sOut);
/*************************监控(运行时)**************************/
void generateMonitorConfig(MonitorPanel*); //生成监控配置参数结构
void setMonitorPara(QMap<QUuid,QList<MonitorItemAttributeInfo>> map){m_monitorPara = map;}
QMap<QUuid,QList<MonitorItemAttributeInfo>>& getMonitorPara() {return m_monitorPara;}
void setMonitorRelation(QList<HierarchyItem> lst){m_lstMonitorRelation = lst;}
QList<HierarchyItem> getMonitorRelation() {return m_lstMonitorRelation;}
void monitorItemSelected(QUuid); //运行时item选中事件
void monitorItemDetailAttr(QUuid); //显示属性详情
void monitorItemSet(QUuid); //运行时item设置完成
void updateMonitorDisplay(); //更新监控图元显示
void startAcceptData(); //开始接收实时数据
void stopAcceptData(QString); //停止接收实时数据
QMap<int,QList<QPair<MonitorItemState,QString>>>& getMonitorStateMap(){return m_monitorStateMap;}
void setMonitorDisplaySetting(QMap<MonitorItemTypeStruct,QMap<MonitorItemStateStruct,MonitorItemDisplayInfo>> map){m_monitorDisplaySetting = map;}
QMap<MonitorItemTypeStruct,QMap<MonitorItemStateStruct,MonitorItemDisplayInfo>>& getMonitorDisplaySetting(){return m_monitorDisplaySetting;}
QList<HMIImageRef>& getHMIimageRef(){return _HMIimageRef;}
int imageRefExist(QString model,QByteArray hash256);
void updateHMIRef(QUuid hmiId,QString model,QByteArray hash256,int slot); //更新img引用
/************************数据显示*************************/
void setCurItemPropertyDlg(ItemPropertyDlg* p) {m_curPropertyDlg = p;}
ItemPropertyDlg* getCurItemPropertyDlg() {return m_curPropertyDlg;}
Q_SIGNALS:
void activatePage(const QString&); //激活当前model所在page
void updateCurrentItems(QList<HierarchyItem>,bool); //更新当前组态元件列表 <连接关系,是否刷新>
void itemSelected(QList<HierarchyItem>); //发送选中的元件
void monitorCreated(QString,QPair<QString,QUuid>); //监控创建信号 <工程page,<监控page,page_uid>>
void monitorItems(QList<HierarchyItem>); //发送创建成功的Items
void dataUpdated(); //数据更新通知
void updateTopologyItems(QList<HierarchyItem>,bool,bool); //更新当前拓扑列表 <连接关系,是否刷新,显示全部层级>
void notifyUpdateMonitorTopology(QList<QUuid>); //使用列表中的item id更新总拓扑
void HMIUpdated(QString,QUuid,int,QString); //HMI更新信号,页名、页id、页状态、保存时间
public:
void setPageName(QString s) {_pageName = s;} //设置表名称
QString pageName() const {return _pageName;}
void activateModel() {Q_EMIT activatePage(_pageName);} //发送激活信号(点击)
void startHttpRequest(); //开始请求数据(运行时)
void setCavas(QPointer<DiagramCavas> p) {_cavas = p;} //设置所属顶层容器
DiagramCavas* getCavas();
QMap<QUuid,GraphicsFunctionModelItem*> getHMIItems(){return _nodeItem;}
QMap<QUuid,ElectricBayItem*> getProjectBayItems(){return _bayItem;}
void setPageState(int n) {_pageState = n;}
int getPageState() {return _pageState;}
void setLastSave(QString sTime) {_lastSaveTime = sTime;}
QString getLastSave() {return _lastSaveTime;}
public Q_SLOTS:
void onSignal_ifExits(QUuid id,const QString&,int type,GraphicsFunctionModelItem*); //判断用户输入的名称是否已存在
void onTimeOut();
void onSignal_GetPointData(QString type,QMap<qint64,double> map);
void onSignal_openBayManager();
void onDataTimerOut();
void onSelectionChanged();
private:
void addPortsToItem_json(PortState,QJsonArray,GraphicsBaseItem*); //将json格式的port添加到item
void autoSetModelName(GraphicsBaseModelItem*); //如果此页的工程模已被设置将projectName更新到item
QString removeSuffix(const QString& str); //移除最后一个下划线后的内容 (处理各种tag后缀)
ModelProperty* getItemByUid(QList<GraphicsBaseItem*>,QUuid); //返回uid对应的data
void updateMonitor(QMap<QString,QMap<quint64,double>>); //使用当前数据更新运行时
void assignMeasureSymmetry(QMap<QString, MeasurementInfo>& measurementMap); //设置量测中互为double的name
private:
QMap<QUuid,GraphicsFunctionModelItem*> _nodeItem; //工程模对象
QMap<QUuid,ElectricBayItem*> _bayItem; //间隔对象
QString _pageName;
QPointer<DiagramCavas> _cavas;
DesignerScene* _scene;
BaseDrawingPanel* _widget; //顶层widget
HttpInterface* _Interface;
QTimer* _timer;
PowerEntity* _pEntity; //拓扑实体
QMap<QString,QString> _projectModelName; //该图中所有元件对应的工程模类型(todo:扩展为每张图独立的结构体) uuid,工程模名称
QMap<QString,ModelStateInfo> _modelStateInfo; //模型结构信息
QMap<QString,ModelDataInfo> _modelDataInfo; //模型数据信息
ProjectIconSetting* m_projectIconSettingDlg;
BayManagerDlg* m_pBayManager;
QMap<QUuid,QList<MonitorItemAttributeInfo>> m_monitorPara; //监控参数
QMap<int,QList<QPair<MonitorItemState,QString>>> m_monitorStateMap; //元件状态对照表 <type,<state,状态名>>
QMap<MonitorItemTypeStruct,QMap<MonitorItemStateStruct,MonitorItemDisplayInfo>> m_monitorDisplaySetting; //元件设置
QList<HierarchyItem> m_lstMonitorRelation; //监控item层级关系
ItemPropertyDlg* m_curPropertyDlg;
QTimer* m_dataTimer; //获取数据的定时器
QStringList _curRequestLst; //当前请求对象列表
QMap<QString,QMap<quint64,double>> _curData; //当前数据
BayMeasureDlg* m_bayMeasureDlg; //间隔量测
int _pageState = 0; //当前页面的状态 0未保存1已保存
QString _lastSaveTime; //页面上次保存时间
QList<HMIImageRef> _HMIimageRef; //当前HMI中图片的引用关系
public:
static bool _dataInitialised;
};