#pragma once #include "graphicsDataModel/baseModel.h" #include "serializable.h" #include "powerEntity.h" #include #include #include class BaseDrawingPanel; class DrawingPanel; class GraphicsBaseItem; class GraphicsProjectModelItem; class GraphicsBaseModelItem; class BaseProperty; class BaseModelProperty; class DesignerScene; class HttpInterface; class DiagramCavas; struct Connection; class PowerEntity; class ElectricConnectLineItem; class ProjectModelSetting; class ProjectIconSetting; class ElectricBayItem; class GraphicsNonStandardItem; class BayProperty; class BayManagerDlg; class ModelProperty; struct itemPageInfo; class EditBaseItem; class FixedPortsModel : public BaseModel, public Serializable { Q_OBJECT public: FixedPortsModel(PowerEntity*); ~FixedPortsModel(); public: QMap allNodePos() const; QVector allConnectionProperty(); QMap& allItems(); bool addNodeItem(QUuid uuid,GraphicsProjectModelItem*); QString addNodeItem(QUuid id,QPointF pos,double width = 0,double height = 0,double rotate = 0); GraphicsProjectModelItem* nodeItem(QUuid uuid); BaseProperty* addNodeData(QUuid id,int type,QString name,QString modelName); //对应component数据,一个data可对应多个item(id,类型,名称,工程模名) void loadNodeDataFromDataBase(); //从数据库加载数据 QString addConnectLline(QUuid lineId,QUuid srcId,QUuid destId,QUuid srcPort,QUuid destPort); void deleteNodeItem(GraphicsProjectModelItem*); //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;} QWidget* getTopWidget(); QPointF getTerminalPos(const QString& sTerminalId); //获取拓扑接线点在当前diagram中的位置 ElectricConnectLineItem* getLineItemById(const QString& terminalId); void showModelDlg(const QString&,QUuid,GraphicsProjectModelItem*); //点击时显示指定模型的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(GraphicsProjectModelItem*); //判断item是否可以连接 void insertProjectModelName(QString,QString); //插入工程模类型(生成工程模时调用) void showProjectIconSettingDlg(GraphicsProjectModelItem*); //显示工程模图标设置(设置使用图标) void updateItemIcon(QString sMeta,QString sModel); //更新指定模型的图标 /********************baseModel相关**********************/ QMap& allBaseItems(); //获取所有基模对象 QVector allBaseConnections(); QMap allBaseNodePos() const; bool addBaseItem(QUuid uuid,GraphicsBaseModelItem*); BaseModelProperty* addBaseNodeData(QUuid id,int type,QString name,QString metaName,QString bay = QString()); //添加图元基模数据 void showProjectModelSettingDlg(GraphicsBaseModelItem*); //在基模拓扑图上打开工程模设置对话框 void generateProjectModel(const QString&,QList,QList); //由基模生成工程模 void addProjectItemByBaseData(DrawingPanel*,GraphicsBaseModelItem*,BaseProperty*); //从基模item生成工程模item void onWizardFinished(QMap mapItem,QList mapBay); //editor结束生成基模 /*************************间隔*****************************/ void addBayItem(QUuid,ModelFunctionType = ModelFunctionType::ProjectModel); bool addBayItem(QUuid,ElectricBayItem*,ModelFunctionType = ModelFunctionType::ProjectModel); void addItemsToBay(QList,ElectricBayItem*); //将对象添加到间隔 BayProperty* addBayData(QUuid uuid,ModelFunctionType = ModelFunctionType::ProjectModel); QMap& allBayItem(); //返回所有间隔对象 BayProperty* generateBayData(BayProperty*,QList); //生成新间隔数据(间隔数据结构相同) QList getCorrespondId(QList,QList); //获取基模id对应的工程模id QRectF calculateItemsBoundingRect(QList items); //返回包含所有item的rect void addBayByData(BayProperty*,ModelFunctionType = ModelFunctionType::ProjectModel); //data生成bay void addTestData(); //生成测试基模 QJsonObject turnListToJson(QList lst,QString sInerTag,QString sOutTag); //将list转换为QJsonObject, QList turnJsonArrToList(QJsonObject obj,QString sInner,QString sOut); /*************************监控(运行时)**************************/ void generateMonitor(QString,QList>); //生成监控 (监控名,选中的设备列表) Q_SIGNALS: void activatePage(const QString&); //激活当前model所在page void updateCurrentItems(QList,bool); //更新当前组态元件列表 <名称,uid> void itemSelected(QList>); //发送选中的元件 void monitorCreated(QString,QPair); //监控创建信号 <工程page,<监控page,page_uid>> void monitorItems(QList>); //发送创建成功的Items public: void setPageName(QString s) {_pageName = s;} //设置表名称 QString pageName() const {return _pageName;} void activateModel() {Q_EMIT activatePage(_pageName);} //发送激活信号(点击) void startHttpRequest(); //开始请求数据(运行时) void setCavas(DiagramCavas* p) {_cavas = p;} //设置所属顶层容器 public Q_SLOTS: void onSignal_ifExits(QUuid id,const QString&,int type,GraphicsProjectModelItem*); //判断用户输入的名称是否已存在 void onTimeOut(); void onSignal_GetPointData(QString type,QMap map); void onSignal_generateDiagram(const QString&); //生成工程组态信号 void onSignal_openBayManager(); private: void addPortsToItem_json(PortState,QJsonArray,GraphicsProjectModelItem*); //将json格式的port添加到item void autoSetModelName(GraphicsBaseModelItem*); //如果此页的工程模已被设置,将projectName更新到item QString removeSuffix(const QString& str); //移除最后一个下划线后的内容 (处理各种tag后缀) ModelProperty* getItemByUid(QList,QUuid); //返回uid对应的data private: QMap _nodeItem; //工程模对象 QMap _baseItem; //基模对象 QMap _baseBayItem; //基模间隔对象 QMap _bayItem; //间隔对象 QString _pageName; DiagramCavas* _cavas; DesignerScene* _scene; BaseDrawingPanel* _widget; //顶层widget HttpInterface* _Interface; QTimer* _timer; PowerEntity* _pEntity; //拓扑实体 QMap _projectModelName; //该图中所有元件对应的工程模类型(todo:扩展为每张图独立的结构体) uuid,工程模名称 QMap _modelStateInfo; //模型结构信息 QMap _modelDataInfo; //模型数据信息 ProjectModelSetting* m_proModelSettingDlg; ProjectIconSetting* m_projectIconSettingDlg; BayManagerDlg* m_pBayManager; public: static bool _dataInitialised; };