From 38c8bc51e349e9d128adc8ee0f474a31d8f80bae Mon Sep 17 00:00:00 2001 From: baiYue Date: Fri, 11 Jul 2025 18:13:54 +0800 Subject: [PATCH] add bay editor --- common/include/baseProperty.h | 58 +++ common/include/global.h | 10 +- common/source/global.cpp | 3 + diagramCavas/CMakeLists.txt | 3 + .../baseModelItem/electricBaseModelLineItem.h | 4 - diagramCavas/include/bayInfoDlg.h | 1 + diagramCavas/include/bayManagerContentDlg.h | 10 +- diagramCavas/include/bayManagerDlg.h | 9 +- diagramCavas/include/diagramCavas.h | 2 + diagramCavas/include/drawingPanel.h | 1 + .../graphicsDataModel/fixedPortsModel.h | 25 +- .../include/graphicsItem/electricBayItem.h | 27 + .../graphicsItem/electricConnectLineItem.h | 4 - .../include/graphicsItem/graphicsBaseItem.h | 36 +- diagramCavas/source/baseInfoDlg.cpp | 51 +- .../baseModelItem/electricBaseModelSvgBus.cpp | 1 + diagramCavas/source/bayInfoDlg.cpp | 177 ++++++- diagramCavas/source/bayManagerContentDlg.cpp | 243 +++++++++ diagramCavas/source/bayManagerDlg.cpp | 45 +- diagramCavas/source/diagramCavas.cpp | 35 +- diagramCavas/source/drawingPanel.cpp | 21 +- .../graphicsDataModel/fixedPortsModel.cpp | 464 +++++++++++++----- .../source/graphicsItem/electricBayItem.cpp | 53 ++ .../graphicsItem/electricSvgItemBus.cpp | 5 +- .../source/graphicsItem/graphicsBaseItem.cpp | 1 + diagramCavas/source/util/baseSelector.cpp | 36 +- .../source/util/connectingSelector.cpp | 3 +- diagramCavas/ui/bayInfoDlg.ui | 75 ++- diagramCavas/ui/bayManagerContentDlg.ui | 102 ++-- diagramCavas/ui/bayManagerDlg.ui | 15 + diagramUtils/include/basePropertyManager.h | 7 + diagramUtils/source/basePropertyManager.cpp | 24 + source/mainwindow.cpp | 3 +- 33 files changed, 1311 insertions(+), 243 deletions(-) create mode 100644 diagramCavas/include/graphicsItem/electricBayItem.h create mode 100644 diagramCavas/source/graphicsItem/electricBayItem.cpp diff --git a/common/include/baseProperty.h b/common/include/baseProperty.h index 077452a..4278fbb 100644 --- a/common/include/baseProperty.h +++ b/common/include/baseProperty.h @@ -27,6 +27,61 @@ protected: QJsonObject jContext; //存放port信息 }; +class BayProperty:public AbstractProperty //间隔属性(待扩展) +{ + Q_OBJECT +public: + BayProperty(QObject* parent) + :AbstractProperty(parent){ + } + virtual ~BayProperty(){}; +public: + virtual void setType(QString s) {sType = s;} + virtual QString getType(){return sType;} + virtual void setLstComponent(QList lst) {lstComponent = lst;} + virtual QList& getLstComponent() {return lstComponent;} + virtual void setVoltage(double d) {dVoltage = d;} + virtual double getVoltage() {return dVoltage;} + virtual void setFla(double d) {dFla = d;} + virtual double getFla() {return dFla;} + virtual void setCapacity(double d) {dCapacity = d;} + virtual double getCapacity() {return dCapacity;} + virtual void setInService(bool b) {bInService = b;} + virtual bool getInService() {return bInService;} + virtual void setLstFrom(QList lst) {lstFrom = lst;} + virtual QList& getLstFrom() {return lstFrom;} + virtual void setLstTo(QList lst) {lstTo = lst;} + virtual QList& getLstTo() {return lstTo;} + virtual void setLstProtect(QList lst) {lstProtect = lst;} + virtual QList& getLstProtect() {return lstProtect;} + virtual void setLstFaultRecord(QList lst) {lstFaultRecord = lst;} + virtual QList& getLstFaultRecord() {return lstFaultRecord;} + virtual void setLstDynSense(QList lst) {lstDynSense = lst;} + virtual QList& getLstDynSense() {return lstDynSense;} + virtual void setLstStatus(QList lst) {lstStatus = lst;} + virtual QList& getLstStatus() {return lstStatus;} + virtual void setLstInstruct(QList lst) {lstInstruct = lst;} + virtual QList& getLstInstruct() {return lstInstruct;} + virtual void setLstEtc(QList lst) {lstEtc = lst;} + virtual QList& getLstEtc() {return lstEtc;} +protected: + QString sType; + QList lstComponent; //包含的设备 + double dVoltage; //电压 + double dFla; //电流 + double dCapacity; //容量 + bool bInService; //服役状态 + QList lstFrom; //联结 从 + QList lstTo; //联结到 + + QList lstProtect; //综合保护 + QList lstFaultRecord; //故障录播 + QList lstDynSense; //动态感知 + QList lstStatus; //状态检测 + QList lstInstruct; //监控 + QList lstEtc; //其他设备 +}; + class ModelProperty:public AbstractProperty //模型基类 { Q_OBJECT @@ -47,9 +102,12 @@ public: bool prepareDelete() const {return _prepareDelete;} void setDataChanged(bool b) {_dataChanged = b;} //数据变换标签 bool dataChanged() const {return _dataChanged;} + void setConnection(Connection con){m_connectState = con;} //保留,用以获取当前图中的连接 + Connection getConnection() const {return m_connectState;} signals: void updateData(); //通知数据拥有者更新 protected: + Connection m_connectState; int nType; //设备类型 int nGraphicsType; QString sModelName; //模型名 diff --git a/common/include/global.h b/common/include/global.h index a0cd4c5..45b3141 100644 --- a/common/include/global.h +++ b/common/include/global.h @@ -31,6 +31,7 @@ enum GraphicsItemType GIT_itemRect = QGraphicsItem::UserType + 51, GIT_itemTri = QGraphicsItem::UserType + 52, GIT_link= QGraphicsItem::UserType + 53, + GIT_bay= QGraphicsItem::UserType + 54, //间隔 //====================================== GIT_baseBus = QGraphicsItem::UserType + 200, GIT_baseLine = QGraphicsItem::UserType + 201, @@ -53,6 +54,7 @@ class corresbondItem //类型关联函数 { public: static QMap linkType; + static QMap typeToProGraphic; }; enum DiagramMode //组态图模式 @@ -457,6 +459,10 @@ struct Connection srcPos = P_top; destType = T_none; destPos = P_top; + nSrcNodeId = QUuid(); + nSrcPortId = QUuid(); + nDestNodeId = QUuid(); + nDestPortId = QUuid(); } Connection(const Connection& obj) @@ -484,12 +490,12 @@ struct Connection } bool operator==(const Connection& obj) { - return ((obj.nSrcNodeId == nSrcNodeId)&&(obj.nSrcPortId == nSrcPortId)&&(obj.srcType == srcType)&&(obj.nDestNodeId == nDestNodeId)&&(obj.nDestPortId == nDestPortId)&&(obj.destType == destType)); + return ((nSrcNodeId == obj.nSrcNodeId)&&(nSrcPortId == obj.nSrcPortId)&&(srcType == obj.srcType)&&(nDestNodeId == obj.nDestNodeId)&&(nDestPortId == obj.nDestPortId)&&(destType == obj.destType)); } Connection& operator=(const Connection& obj) { - if(*this == obj) + if(this == &obj) return *this; nSrcNodeId = obj.nSrcNodeId; nSrcPortId = obj.nSrcPortId; diff --git a/common/source/global.cpp b/common/source/global.cpp index 3f44e2f..6473d39 100644 --- a/common/source/global.cpp +++ b/common/source/global.cpp @@ -3,3 +3,6 @@ QMap corresbondItem::linkType = { {AIT_motor,GIT_itemRect},{AIT_bus,GIT_bus}, }; +QMap corresbondItem::typeToProGraphic = { + {1,GIT_bus},{3,GIT_itemRect},{8,GIT_link} + }; diff --git a/diagramCavas/CMakeLists.txt b/diagramCavas/CMakeLists.txt index 58146d0..6a4bf09 100644 --- a/diagramCavas/CMakeLists.txt +++ b/diagramCavas/CMakeLists.txt @@ -48,6 +48,7 @@ set(DIAGRAMCAVAS_HEADER_FILES include/graphicsItem/handleText.h include/graphicsItem/itemControlHandle.h include/graphicsItem/itemPort.h + include/graphicsItem/electricBayItem.h include/baseModelItem/electricBaseModelSvgItem.h include/baseModelItem/electricBaseModelLineItem.h include/baseModelItem/electricBaseModelSvgBus.h @@ -117,6 +118,7 @@ set(DIAGRAMCAVAS_SOURCE_FILES source/graphicsItem/handleText.cpp source/graphicsItem/itemControlHandle.cpp source/graphicsItem/itemPort.cpp + source/graphicsItem/electricBayItem.cpp source/baseModelItem/electricBaseModelSvgItem.cpp source/baseModelItem/electricBaseModelLineItem.cpp source/baseModelItem/electricBaseModelSvgBus.cpp @@ -133,6 +135,7 @@ set(DIAGRAMCAVAS_SOURCE_FILES ../common/source/httpInterface.cpp ../common/source/baseProperty.cpp ../common/source/tools.cpp + ../common/source/global.cpp ) set(UI_FILES diff --git a/diagramCavas/include/baseModelItem/electricBaseModelLineItem.h b/diagramCavas/include/baseModelItem/electricBaseModelLineItem.h index f3a34f8..6e5f907 100644 --- a/diagramCavas/include/baseModelItem/electricBaseModelLineItem.h +++ b/diagramCavas/include/baseModelItem/electricBaseModelLineItem.h @@ -20,15 +20,11 @@ public: void calculatePath(); void resetCurLine(){_curLine = QPoint();} - void setConnection(Connection con){m_connectState = con;} - Connection getConnection() const {return m_connectState;} - protected: virtual QPainterPath shape() const override; virtual QRectF boundingRect() const override; virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*) override; private: - Connection m_connectState; QPainterPath m_points; QPainterPath m_pointsBoundingRect; //包裹点的矩形集合 QList m_lstPoints; diff --git a/diagramCavas/include/bayInfoDlg.h b/diagramCavas/include/bayInfoDlg.h index c6beb39..740ca29 100644 --- a/diagramCavas/include/bayInfoDlg.h +++ b/diagramCavas/include/bayInfoDlg.h @@ -25,6 +25,7 @@ public: auto& getValidType() {return _validType;} //获取可用的量测属性 void setUi(); void addMeasure(MeasurementInfo); + void addOtherMeasure(QStringList); //本间隔的其他量测 public slots: void onAddClicked(); void onDeleteClicked(); diff --git a/diagramCavas/include/bayManagerContentDlg.h b/diagramCavas/include/bayManagerContentDlg.h index 4f47156..482d334 100644 --- a/diagramCavas/include/bayManagerContentDlg.h +++ b/diagramCavas/include/bayManagerContentDlg.h @@ -9,6 +9,8 @@ QT_BEGIN_NAMESPACE namespace Ui { class bayManagerContentDlg; } QT_END_NAMESPACE +class BayProperty; + class BayManagerContentDlg : public QDialog { Q_OBJECT @@ -17,11 +19,13 @@ public: ~BayManagerContentDlg(); void initial(); - void setName(const QString& s) {_sBayName = s;} - QString name() {return _sBayName;} + void setProperty(BayProperty* p) {_pData = p;} + BayProperty* getProperty() {return _pData;} + void updateByProperty(); //根据数据更新显示 + void saveSetting(); //保存修改 private: Ui::bayManagerContentDlg *ui; - QString _sBayName; //每页的间隔名称 + BayProperty* _pData; }; #endif diff --git a/diagramCavas/include/bayManagerDlg.h b/diagramCavas/include/bayManagerDlg.h index f8f431f..4997d17 100644 --- a/diagramCavas/include/bayManagerDlg.h +++ b/diagramCavas/include/bayManagerDlg.h @@ -2,6 +2,7 @@ #define BAYMANAGERDLG_H #include +#include /******************************************************* 间隔管理 ********************************************************/ @@ -10,6 +11,8 @@ namespace Ui { class bayManagerDlg; } QT_END_NAMESPACE class BayManagerContentDlg; +class FixedPortsModel; +class BayProperty; class BayManagerDlg : public QDialog { @@ -20,14 +23,18 @@ public: void initial(); void showDlg(); + void initData(); void clearData(); //切换打开文件时调用 + void setModelController(FixedPortsModel* p) {_modelController = p;} public slots: void onOkClicked(); void onCancelClicked(); + void onListItemClicked(QListWidgetItem *item); private: - void generatePage(QStringList); //生成间隔页 <间隔列表> + void generatePage(QList); //生成间隔页 <间隔列表> private: Ui::bayManagerDlg *ui; + FixedPortsModel* _modelController; QMap _contentData; // }; diff --git a/diagramCavas/include/diagramCavas.h b/diagramCavas/include/diagramCavas.h index 064e124..514827f 100644 --- a/diagramCavas/include/diagramCavas.h +++ b/diagramCavas/include/diagramCavas.h @@ -54,6 +54,8 @@ public slots: EditPanel* onSignal_addEditPanel(QString); void onSignal_addEditWizard(QString); void onSignal_wizardFinished(DiagramEditorWizardInfo); + /*********************************间隔**************************************/ + void onSignl_openCurrentBay(); private: void removePanel(PowerEntity*); private: diff --git a/diagramCavas/include/drawingPanel.h b/diagramCavas/include/drawingPanel.h index b7c43a0..d83329f 100644 --- a/diagramCavas/include/drawingPanel.h +++ b/diagramCavas/include/drawingPanel.h @@ -16,6 +16,7 @@ class GraphicsItemGroup; class StatusBar; class PowerEntity; class ProjectDiagramNameInput; +class BayManagerDlg; class DrawingPanel : public QWidget { diff --git a/diagramCavas/include/graphicsDataModel/fixedPortsModel.h b/diagramCavas/include/graphicsDataModel/fixedPortsModel.h index a979c68..1c4fdb7 100644 --- a/diagramCavas/include/graphicsDataModel/fixedPortsModel.h +++ b/diagramCavas/include/graphicsDataModel/fixedPortsModel.h @@ -22,6 +22,11 @@ struct Connection; class PowerEntity; class ElectricConnectLineItem; class ProjectModelSetting; +class ElectricBayItem; +class GraphicsNonStandardItem; +class BayProperty; +class BayManagerDlg; +class ModelProperty; class FixedPortsModel : public BaseModel, public Serializable { @@ -32,7 +37,7 @@ public: ~FixedPortsModel(); public: QMap allNodePos() const; - QVector allConnections(); + QVector allConnectionProperty(); QMap& allItems(); bool addNodeItem(QUuid uuid,GraphicsProjectModelItem*); void addNodeItem(QUuid id,/*int type,*/QPointF pos); @@ -40,7 +45,7 @@ public: QVariant nodeData(QUuid nodeId, NodeRole role) const; BaseProperty* addNodeData(QUuid id,int type,QString name,QString modelName); //对应component数据,一个data可对应多个item(id,类型,名称,工程模名) void loadNodeDataFromDataBase(); //从数据库加载数据 - void addConnectLline(QUuid srcId,QUuid destId,QUuid srcPort,QUuid destPort); + void addConnectLline(QUuid lineId,QUuid srcId,QUuid destId,QUuid srcPort,QUuid destPort); void deleteNodeItem(GraphicsProjectModelItem*); //QJsonObject saveNode(QUuid const) const; void saveNode(int nPageId); @@ -71,8 +76,19 @@ public: BaseModelProperty* addBaseNodeData(QUuid id,int type,QString name,QString metaName); //添加图元基模数据 void showProjectModelSettingDlg(GraphicsBaseModelItem*); //在基模拓扑图上打开工程模设置对话框 - void generateProjectModel(const QString&,QList); //由基模生成工程模 + void generateProjectModel(const QString&,QList,QList); //由基模生成工程模 void addProjectItemByBaseData(DrawingPanel*,GraphicsBaseModelItem*,BaseProperty*); //从基模item生成工程模item + /*************************间隔*****************************/ + bool addBayItem(QUuid,ElectricBayItem*); + void addItemsToBay(QList,ElectricBayItem*); //将对象添加到间隔 + BayProperty* addBayData(QUuid uuid); + QMap& allBayItem(); //返回所有间隔对象 + + BayProperty* generateBayData(BayProperty*,QList); //生成新间隔数据(间隔数据结构相同) + QList getCorrespondId(QList,QList); //获取基模id对应的工程模id + QRectF calculateItemsBoundingRect(QList items); //返回包含所有item的rect + void addBayByData(BayProperty*); //基模bay生成工程模bay + void addTestData(); //生成测试基模 Q_SIGNALS: void activatePage(const QString&); //激活当前model所在page @@ -87,10 +103,12 @@ public Q_SLOTS: void onTimeOut(); void onSignal_GetPointData(QString type,QMap map); void onSignal_generateDiagram(const QString&); //生成工程组态信号 + void onSignal_openBayManager(); private: QMap _nodeItem; //工程模对象 QMap _baseItem; //基模对象 + QMap _bayItem; //间隔对象 QString _pageName; DiagramCavas* _cavas; @@ -104,6 +122,7 @@ private: QMap _modelStateInfo; //模型结构信息 QMap _modelDataInfo; //模型数据信息 ProjectModelSetting* m_proModelSettingDlg; + BayManagerDlg* m_pBayManager; public: static bool _dataInitialised; }; diff --git a/diagramCavas/include/graphicsItem/electricBayItem.h b/diagramCavas/include/graphicsItem/electricBayItem.h new file mode 100644 index 0000000..1ef1c22 --- /dev/null +++ b/diagramCavas/include/graphicsItem/electricBayItem.h @@ -0,0 +1,27 @@ +#ifndef ELECBAYITEM_H +#define ELECBAYITEM_H + +#include "graphicsBaseItem.h" +#include "baseProperty.h" + +class ElectricBayItem :public GraphicsNonStandardItem +{ + Q_OBJECT +public: + ElectricBayItem(const QRectF &rect, QGraphicsItem *parent = 0); //genNewPort生成新接线点 + virtual ~ElectricBayItem(); + + void setText(const QString& s); +protected: + virtual QPainterPath shape(); + virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*); +private: + void updateTextShape(); +protected: + QRectF _recLabel; + QString m_text; + QFont m_font; + QRectF m_showRect; +}; + +#endif diff --git a/diagramCavas/include/graphicsItem/electricConnectLineItem.h b/diagramCavas/include/graphicsItem/electricConnectLineItem.h index bffc230..b53c908 100644 --- a/diagramCavas/include/graphicsItem/electricConnectLineItem.h +++ b/diagramCavas/include/graphicsItem/electricConnectLineItem.h @@ -19,15 +19,11 @@ public: void calculatePath(); void resetCurLine(){_curLine = QPoint();} - void setConnection(Connection con){m_connectState = con;} //保留,用以获取当前图中的连接 - Connection getConnection() const {return m_connectState;} - protected: virtual QPainterPath shape() const override; virtual QRectF boundingRect() const override; virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*) override; private: - Connection m_connectState; QPainterPath m_points; QPainterPath m_pointsBoundingRect; //包裹点的矩形集合 QList m_lstPoints; diff --git a/diagramCavas/include/graphicsItem/graphicsBaseItem.h b/diagramCavas/include/graphicsItem/graphicsBaseItem.h index 7a4098c..61317d0 100644 --- a/diagramCavas/include/graphicsItem/graphicsBaseItem.h +++ b/diagramCavas/include/graphicsItem/graphicsBaseItem.h @@ -50,6 +50,8 @@ public: public: virtual ShapeType getType() {return m_type;} + virtual QUuid itemId() const {return m_itemId;} + virtual void setItemId(QUuid n){m_itemId = n;} QPen pen() { return m_pen; } void setPen(const QPen &pen) { m_pen = pen; } @@ -96,13 +98,17 @@ public: virtual void syncRotationDataFromParent(const double&) {} virtual double getSyncRotationDataFromParent() {return m_dSyncRotationByParent;} + virtual void setItemType(GraphicsItemType type){m_Itemtype = type;} + virtual GraphicsItemType getItemType() const {return m_Itemtype;} protected: + QUuid m_itemId; ShapeType m_type; QPen m_pen; QBrush m_brush; double m_dWidth; double m_dHeight; QRectF m_boundingRect; + GraphicsItemType m_Itemtype; //显示类型 double m_dSyncRotationByParent; //父项(被加入到某一组)的旋转数据,因为加入某一组后,对该组进行旋转,自身的旋转数据不会同步更新 QGraphicsPathItem* m_pOperationCopy; //图元移动和旋转时的操作副本 @@ -112,9 +118,33 @@ protected: class ItemPort; class ModelProperty; class PowerEntity; +class AbstractProperty; typedef AbstractShapeType AbstractShape; +class GraphicsNonStandardItem:public QObject, public AbstractShapeType //非标准图元,如间隔 +{ + Q_OBJECT +public: + GraphicsNonStandardItem(QGraphicsItem *parent = 0) + :AbstractShapeType(parent) + { + setFlag(QGraphicsItem::ItemIsSelectable, true); + } + virtual ~GraphicsNonStandardItem(){}; + virtual void setProperty(AbstractProperty* p){_property = p;} + virtual AbstractProperty* getProperty() {return _property;} + + bool containsPoint(const QPointF& pos) + { + QPointF localPos = mapFromScene(pos); + QPainterPath path = shape(); // 或更精确的计算 + return path.contains(localPos); + } +protected: + AbstractProperty* _property; +}; + class GraphicsBaseItem :public QObject, public AbstractShapeType { Q_OBJECT @@ -122,8 +152,6 @@ class GraphicsBaseItem :public QObject, public AbstractShapeType GraphicsBaseItem(QGraphicsItem *parent); virtual ~GraphicsBaseItem(); public: - virtual QUuid itemId() const {return m_itemId;} - virtual void setItemId(QUuid n){m_itemId = n;} virtual int addPort(PortState typ,QPointF vec,QString id = "",HandleType hType = T_lineInOut,PortPos pos = P_top); //新建,返回-1失败 virtual void setEntity(PowerEntity*); //设置当前图元的拓扑数据 virtual PowerEntity* entity(); @@ -132,8 +160,6 @@ public: virtual void updateByProperty(){}; //使用data对象更新自己 virtual void setItemChanged(bool b){_itemChanged = b;} virtual bool itemChanged() const {return _itemChanged;} - virtual void setItemType(GraphicsItemType type){m_Itemtype = type;} - virtual GraphicsItemType getItemType() const {return m_Itemtype;} virtual void renderSelectBackground(QPainter*); virtual ItemPort* getPortById(QString) const; virtual ItemPort* getPortPtr(int) const; @@ -422,8 +448,6 @@ public: public slots: void onUpdateData(); //data发送的更新通知 protected: - QUuid m_itemId; - GraphicsItemType m_Itemtype; //显示类型 ModelProperty* _property; PowerEntity* _pEntity; //图元拓扑 bool _itemChanged; //图元变化标志,判断是否需要保存 diff --git a/diagramCavas/source/baseInfoDlg.cpp b/diagramCavas/source/baseInfoDlg.cpp index e861059..53ff95e 100644 --- a/diagramCavas/source/baseInfoDlg.cpp +++ b/diagramCavas/source/baseInfoDlg.cpp @@ -1,5 +1,6 @@ #include "baseInfoDlg.h" -#include "graphicsItem/graphicsBaseItem.h" +#include "graphicsItem/electricBayItem.h" +#include "graphicsDataModel/fixedPortsModel.h" #include "ui_baseInfoDlg.h" #include "dataBase.h" #include "global.h" @@ -97,14 +98,56 @@ void BaseInfoDlg::setPropertyValue(QVariant var) QString bay_offset_inner = connectBus["bay_offset_inner"].toString(); QString from_uuid = connectBus["from_uuid"].toString(); QString to_uuid = connectBus["to_uuid"].toString(); - ui->le_bayName->setText(bay_name); + //ui->le_bayName->setText(bay_name); ui->le_idx_1->setText(bay_offset_outer); ui->le_idx_2->setText(bay_offset_inner); - ui->le_from->setText(from_uuid); - ui->le_to->setText(to_uuid); + //ui->le_from->setText(from_uuid); + //ui->le_to->setText(to_uuid); if(pPro->inService() == 1) ui->rb_inService->setChecked(true); else ui->rb_outService->setChecked(true); + + //间隔处理 + BayProperty* pBay = nullptr; + QMap mapBay = _curModelController->allBayItem(); + for(auto& item:mapBay){ + AbstractProperty* p = item->getProperty(); + BayProperty* pBayPro = dynamic_cast(p); + if(pBayPro){ + QList lstCompo = pBayPro->getLstComponent(); //获取间隔下的component,找到本component对应的间隔 + for(auto& id:lstCompo){ + if(id == pPro->uuid()){ + pBay = pBayPro; + break; + } + } + } + } + + if(pBay){ + auto lstFrom = pBay->getLstFrom(); + auto lstTo = pBay->getLstTo(); + + QStringList sLstFrom; + for(auto& fromId:lstFrom){ + BaseProperty* pPro = BasePropertyManager::instance().findEntityData(fromId); + if(pPro){ + sLstFrom.append(pPro->tag()); + } + } + + QStringList sLstTo; + for(auto& toId:lstTo){ + BaseProperty* pPro = BasePropertyManager::instance().findEntityData(toId); + if(pPro){ + sLstTo.append(pPro->tag()); + } + } + + ui->le_bayName->setText(pBay->tag()); + ui->le_from->setText(sLstFrom.join("、")); + ui->le_to->setText(sLstTo.join("、")); + } } } diff --git a/diagramCavas/source/baseModelItem/electricBaseModelSvgBus.cpp b/diagramCavas/source/baseModelItem/electricBaseModelSvgBus.cpp index 8c72a17..eb70b03 100644 --- a/diagramCavas/source/baseModelItem/electricBaseModelSvgBus.cpp +++ b/diagramCavas/source/baseModelItem/electricBaseModelSvgBus.cpp @@ -48,6 +48,7 @@ void ElectricBaseModelSvgBus::updateConnectData() } obj["port"] = arr; + obj["metaModel"] = _property->metaModelName(); _property->setContext(obj); } } diff --git a/diagramCavas/source/bayInfoDlg.cpp b/diagramCavas/source/bayInfoDlg.cpp index d3be673..2374f0a 100644 --- a/diagramCavas/source/bayInfoDlg.cpp +++ b/diagramCavas/source/bayInfoDlg.cpp @@ -7,6 +7,9 @@ #include "baseProperty.h" #include "basePropertyManager.h" #include "measureSettingDlg.h" +#include "graphicsItem/electricBayItem.h" +#include "graphicsDataModel/fixedPortsModel.h" +#include "basePropertyManager.h" #include "dataBase.h" BayInfoDlg::BayInfoDlg(QWidget *parent) @@ -51,24 +54,151 @@ QMap BayInfoDlg::getPropertyValue(BaseProperty* pPro) void BayInfoDlg::setPropertyValue(QVariant var) { - BaseProperty* pPro = static_cast(var.value()); - if(pPro) + _mapMeasure.clear(); + ui->tableWidget_other->setRowCount(0);; + ui->tableWidget_local->setRowCount(0); //清空列表 + ui->le_zhbh->clear(); + ui->le_jk->clear(); + ui->le_dtgz->clear(); + ui->le_gzlb->clear(); + ui->le_ztjc->clear(); + ui->le_qt->clear(); + + BaseProperty* property = static_cast(var.value()); + if(property) { QList lstType = DataBase::GetInstance()->getMeasureAttributeTypes(); - auto map = pPro->getMeasurement(); + auto map = property->getMeasurement(); - /*QMutableListIterator it(lstType); - while(it.hasNext()){ //设置可用属性 - if(map.contains(it.next().name)){ - it.remove(); - } - }*/ _validType = lstType; - ui->tableWidget_local->clearContents(); //清空列表 for(auto& info:map){ addMeasure(info); } + + //间隔处理 + BayProperty* pBay = nullptr; + QMap mapBay = _curModelController->allBayItem(); + for(auto& item:mapBay){ + AbstractProperty* pPro = item->getProperty(); + BayProperty* pBayPro = dynamic_cast(pPro); + if(pBayPro){ + QList lstCompo = pBayPro->getLstComponent(); //获取间隔下的component,找到本component对应的间隔 + for(auto& id:lstCompo){ + if(id == property->uuid()){ + pBay = pBayPro; + break; + } + } + } + } + + if(pBay){ + auto lstFrom = pBay->getLstFrom(); + auto lstTo = pBay->getLstTo(); + auto lstProtect = pBay->getLstProtect(); + auto lstFaultRecord = pBay->getLstFaultRecord(); + auto lstDynSense = pBay->getLstDynSense(); + auto lstStatus = pBay->getLstStatus(); + auto lstInstruct = pBay->getLstInstruct(); + auto lstEtc = pBay->getLstEtc(); + + QStringList sLstFrom; + for(auto& fromId:lstFrom){ + BaseProperty* pPro = BasePropertyManager::instance().findEntityData(fromId); + if(pPro){ + sLstFrom.append(pPro->tag()); + } + } + + QStringList sLstTo; + for(auto& toId:lstTo){ + BaseProperty* pPro = BasePropertyManager::instance().findEntityData(toId); + if(pPro){ + sLstTo.append(pPro->tag()); + } + } + + QStringList sLstProtect; + for(auto& protectId:lstProtect){ + BaseProperty* pPro = BasePropertyManager::instance().findEntityData(protectId); + if(pPro){ + sLstProtect.append(pPro->tag()); + } + } + + QStringList sLstFaultRecord; + for(auto& faultRecordId:lstFaultRecord){ + BaseProperty* pPro = BasePropertyManager::instance().findEntityData(faultRecordId); + if(pPro){ + sLstFaultRecord.append(pPro->tag()); + } + } + + QStringList sLstDynSense; + for(auto& dynSenseId:lstDynSense){ + BaseProperty* pPro = BasePropertyManager::instance().findEntityData(dynSenseId); + if(pPro){ + sLstDynSense.append(pPro->tag()); + } + } + + QStringList sLstStatus; + for(auto& statusId:lstStatus){ + BaseProperty* pPro = BasePropertyManager::instance().findEntityData(statusId); + if(pPro){ + sLstStatus.append(pPro->tag()); + } + } + + QStringList sLstInstruct; + for(auto& instructId:lstInstruct){ + BaseProperty* pPro = BasePropertyManager::instance().findEntityData(instructId); + if(pPro){ + sLstInstruct.append(pPro->tag()); + } + } + + QStringList sLstEtc; + for(auto& etcId:lstEtc){ + BaseProperty* pPro = BasePropertyManager::instance().findEntityData(etcId); + if(pPro){ + sLstEtc.append(pPro->tag()); + } + } + + QList lstOther; + QList lstCompo = pBay->getLstComponent(); + for(auto& compoId:lstCompo){ + BaseProperty* pPro = BasePropertyManager::instance().findEntityData(compoId); + if(pPro){ + if(pPro->uuid() == property->uuid()){ //取本间隔内的其他元件量测 + continue; + } + else{ + lstOther.append(pPro); + } + } + } + + QStringList lstOtherMeasure; + for(auto& compo:lstOther){ + auto map = compo->getMeasurement(); + for(auto& measure:map){ + lstOtherMeasure.append(compo->tag()+"-"+measure.tag); + } + } + + ui->le_zhbh->setText(sLstProtect.join("、")); + ui->le_jk->setText(sLstInstruct.join("、")); + ui->le_dtgz->setText(sLstDynSense.join("、")); + ui->le_gzlb->setText(sLstFaultRecord.join("、")); + ui->le_ztjc->setText(sLstStatus.join("、")); + ui->le_qt->setText(sLstEtc.join("、")); + + ui->le_bayName->setText(pBay->tag()); + addOtherMeasure(lstOtherMeasure); + } } } @@ -90,6 +220,22 @@ void BayInfoDlg::setUi() " white-space: pre-wrap;" // 关键:保留空白符并允许自动换行 "}" ); + + headerText.clear(); + headerText<<"TAG"; + ui->tableWidget_other->setContextMenuPolicy(Qt::CustomContextMenu); + ui->tableWidget_other->setSelectionMode(QAbstractItemView::SingleSelection); + ui->tableWidget_other->setSelectionBehavior(QAbstractItemView::SelectRows); + ui->tableWidget_other->setColumnCount(headerText.count()); + ui->tableWidget_other->setHorizontalHeaderLabels(headerText); + ui->tableWidget_other->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); + ui->tableWidget_other->verticalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); + ui->tableWidget_other->setStyleSheet( + "QTableWidget::item {" + " padding: 5px;" // 可选:增加内边距 + " white-space: pre-wrap;" // 关键:保留空白符并允许自动换行 + "}" + ); } void BayInfoDlg::addMeasure(MeasurementInfo info) @@ -126,6 +272,17 @@ void BayInfoDlg::addMeasure(MeasurementInfo info) } } +void BayInfoDlg::addOtherMeasure(QStringList lst) +{ + for(auto& str:lst){ + int row = ui->tableWidget_other->rowCount(); + ui->tableWidget_other->insertRow(row); + + QTableWidgetItem* tagItem = new QTableWidgetItem(str); + ui->tableWidget_local->setItem(row, 0, tagItem); + } +} + void BayInfoDlg::onAddClicked() { if(_measureDlg == nullptr){ diff --git a/diagramCavas/source/bayManagerContentDlg.cpp b/diagramCavas/source/bayManagerContentDlg.cpp index 171b874..c156e7d 100644 --- a/diagramCavas/source/bayManagerContentDlg.cpp +++ b/diagramCavas/source/bayManagerContentDlg.cpp @@ -1,9 +1,12 @@ #include "bayManagerContentDlg.h" +#include "baseProperty.h" #include "ui_bayManagerContentDlg.h" +#include "basePropertyManager.h" BayManagerContentDlg::BayManagerContentDlg(QWidget *parent) : QDialog(parent) , ui(new Ui::bayManagerContentDlg) + ,_pData(nullptr) { ui->setupUi(this); this->setWindowFlags(Qt::FramelessWindowHint | windowFlags()); @@ -17,5 +20,245 @@ BayManagerContentDlg::~BayManagerContentDlg() void BayManagerContentDlg::initial() { + QStringList headerText; + headerText<<"选择"<<"名称"; + ui->tw_zongHe->setContextMenuPolicy(Qt::CustomContextMenu); + ui->tw_zongHe->setSelectionMode(QAbstractItemView::SingleSelection); + ui->tw_zongHe->setSelectionBehavior(QAbstractItemView::SelectRows); + ui->tw_zongHe->setColumnCount(headerText.count()); + ui->tw_zongHe->setHorizontalHeaderLabels(headerText); + ui->tw_zongHe->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); + ui->tw_jianKong->setContextMenuPolicy(Qt::CustomContextMenu); + ui->tw_jianKong->setSelectionMode(QAbstractItemView::SingleSelection); + ui->tw_jianKong->setSelectionBehavior(QAbstractItemView::SelectRows); + ui->tw_jianKong->setColumnCount(headerText.count()); + ui->tw_jianKong->setHorizontalHeaderLabels(headerText); + ui->tw_jianKong->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); + + ui->tw_dongTai->setContextMenuPolicy(Qt::CustomContextMenu); + ui->tw_dongTai->setSelectionMode(QAbstractItemView::SingleSelection); + ui->tw_dongTai->setSelectionBehavior(QAbstractItemView::SelectRows); + ui->tw_dongTai->setColumnCount(headerText.count()); + ui->tw_dongTai->setHorizontalHeaderLabels(headerText); + ui->tw_dongTai->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); + + ui->tw_guZhang->setContextMenuPolicy(Qt::CustomContextMenu); + ui->tw_guZhang->setSelectionMode(QAbstractItemView::SingleSelection); + ui->tw_guZhang->setSelectionBehavior(QAbstractItemView::SelectRows); + ui->tw_guZhang->setColumnCount(headerText.count()); + ui->tw_guZhang->setHorizontalHeaderLabels(headerText); + ui->tw_guZhang->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); + + ui->tw_zhuangTai->setContextMenuPolicy(Qt::CustomContextMenu); + ui->tw_zhuangTai->setSelectionMode(QAbstractItemView::SingleSelection); + ui->tw_zhuangTai->setSelectionBehavior(QAbstractItemView::SelectRows); + ui->tw_zhuangTai->setColumnCount(headerText.count()); + ui->tw_zhuangTai->setHorizontalHeaderLabels(headerText); + ui->tw_zhuangTai->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); + + ui->tw_qiTa->setContextMenuPolicy(Qt::CustomContextMenu); + ui->tw_qiTa->setSelectionMode(QAbstractItemView::SingleSelection); + ui->tw_qiTa->setSelectionBehavior(QAbstractItemView::SelectRows); + ui->tw_qiTa->setColumnCount(headerText.count()); + ui->tw_qiTa->setHorizontalHeaderLabels(headerText); + ui->tw_qiTa->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); +} + +void BayManagerContentDlg::updateByProperty() +{ + if(_pData){ + ui->le_name->setText(_pData->tag()); + ui->tw_zongHe->setRowCount(0); + ui->tw_jianKong->setRowCount(0); + ui->tw_dongTai->setRowCount(0); + ui->tw_guZhang->setRowCount(0); + ui->tw_zhuangTai->setRowCount(0); + ui->tw_qiTa->setRowCount(0); + + QList lstPro; + QList lstId = _pData->getLstComponent(); + QList lstProtectId = _pData->getLstProtect(); //综合保护 + QList lstInsId = _pData->getLstInstruct(); //监控 + QList lstDynSenId = _pData->getLstDynSense(); //动态感知 + QList lstFauRecId = _pData->getLstFaultRecord(); //故障录播 + QList lstStaId= _pData->getLstStatus(); //状态监测 + QList lstEtcId= _pData->getLstEtc(); //其他设备 + for(auto& id:lstId){ + BaseProperty* pPro = BasePropertyManager::instance().findEntityData(id); //根据id找到对应的设备 + if(pPro){ + lstPro.append(pPro); + } + } + + for(auto& pro:lstPro){ //初始化tablewidget + int row = ui->tw_zongHe->rowCount(); //综合保护 + ui->tw_zongHe->insertRow(row); + QTableWidgetItem *checkItemProtec = new QTableWidgetItem(); + checkItemProtec->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled); + checkItemProtec->setCheckState(Qt::Unchecked); // 默认未勾选 + checkItemProtec->setData(Qt::UserRole+1,pro->uuid()); + ui->tw_zongHe->setItem(row, 0, checkItemProtec); // 设置到第一列 + QTableWidgetItem* tagItemProtec = new QTableWidgetItem(pro->tag()); + ui->tw_zongHe->setItem(row, 1, tagItemProtec); + + row = ui->tw_jianKong->rowCount(); //监控 + ui->tw_jianKong->insertRow(row); + QTableWidgetItem *checkItemIns = new QTableWidgetItem(); + checkItemIns->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled); + checkItemIns->setCheckState(Qt::Unchecked); + checkItemIns->setData(Qt::UserRole+1,pro->uuid()); + ui->tw_jianKong->setItem(row, 0, checkItemIns); + QTableWidgetItem* tagItemIns = new QTableWidgetItem(pro->tag()); + ui->tw_jianKong->setItem(row, 1, tagItemIns); + + row = ui->tw_dongTai->rowCount(); //动态感知 + ui->tw_dongTai->insertRow(row); + QTableWidgetItem *checkItemDynSen = new QTableWidgetItem(); + checkItemDynSen->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled); + checkItemDynSen->setCheckState(Qt::Unchecked); + checkItemDynSen->setData(Qt::UserRole+1,pro->uuid()); + ui->tw_dongTai->setItem(row, 0, checkItemDynSen); + QTableWidgetItem* tagItemDynSen = new QTableWidgetItem(pro->tag()); + ui->tw_dongTai->setItem(row, 1, tagItemDynSen); + + row = ui->tw_guZhang->rowCount(); //故障录播 + ui->tw_guZhang->insertRow(row); + QTableWidgetItem *checkItemFauRec = new QTableWidgetItem(); + checkItemFauRec->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled); + checkItemFauRec->setCheckState(Qt::Unchecked); + checkItemFauRec->setData(Qt::UserRole+1,pro->uuid()); + ui->tw_guZhang->setItem(row, 0, checkItemFauRec); + QTableWidgetItem* tagItemFauRec = new QTableWidgetItem(pro->tag()); + ui->tw_guZhang->setItem(row, 1, tagItemFauRec); + + row = ui->tw_zhuangTai->rowCount(); //状态监测 + ui->tw_zhuangTai->insertRow(row); + QTableWidgetItem *checkItemSta = new QTableWidgetItem(); + checkItemSta->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled); + checkItemSta->setCheckState(Qt::Unchecked); + checkItemSta->setData(Qt::UserRole+1,pro->uuid()); + ui->tw_zhuangTai->setItem(row, 0, checkItemSta); + QTableWidgetItem* tagItemSta = new QTableWidgetItem(pro->tag()); + ui->tw_zhuangTai->setItem(row, 1, tagItemSta); + + row = ui->tw_qiTa->rowCount(); //其他设备 + ui->tw_qiTa->insertRow(row); + QTableWidgetItem *checkItemEtc = new QTableWidgetItem(); + checkItemEtc->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled); + checkItemEtc->setCheckState(Qt::Unchecked); + checkItemEtc->setData(Qt::UserRole+1,pro->uuid()); + ui->tw_qiTa->setItem(row, 0, checkItemEtc); + QTableWidgetItem* tagItemEtc = new QTableWidgetItem(pro->tag()); + ui->tw_qiTa->setItem(row, 1, tagItemEtc); + } + + for(auto& id:lstProtectId){ //设置勾选状态 + for(int i = 0;i < ui->tw_zongHe->rowCount();++i){ + if(ui->tw_zongHe->item(i,0)->data(Qt::UserRole+1).toUuid() == id){ + ui->tw_zongHe->item(i,0)->setCheckState(Qt::Checked); + break; + } + } + } + + for(auto& id:lstInsId){ + for(int i = 0;i < ui->tw_jianKong->rowCount();++i){ + if(ui->tw_jianKong->item(i,0)->data(Qt::UserRole+1).toUuid() == id){ + ui->tw_jianKong->item(i,0)->setCheckState(Qt::Checked); + break; + } + } + } + + for(auto& id:lstDynSenId){ + for(int i = 0;i < ui->tw_dongTai->rowCount();++i){ + if(ui->tw_dongTai->item(i,0)->data(Qt::UserRole+1).toUuid() == id){ + ui->tw_dongTai->item(i,0)->setCheckState(Qt::Checked); + break; + } + } + } + + for(auto& id:lstFauRecId){ + for(int i = 0;i < ui->tw_guZhang->rowCount();++i){ + if(ui->tw_guZhang->item(i,0)->data(Qt::UserRole+1).toUuid() == id){ + ui->tw_guZhang->item(i,0)->setCheckState(Qt::Checked); + break; + } + } + } + + for(auto& id:lstStaId){ + for(int i = 0;i < ui->tw_zhuangTai->rowCount();++i){ + if(ui->tw_zhuangTai->item(i,0)->data(Qt::UserRole+1).toUuid() == id){ + ui->tw_zhuangTai->item(i,0)->setCheckState(Qt::Checked); + break; + } + } + } + + for(auto& id:lstEtcId){ + for(int i = 0;i < ui->tw_qiTa->rowCount();++i){ + if(ui->tw_qiTa->item(i,0)->data(Qt::UserRole+1).toUuid() == id){ + ui->tw_qiTa->item(i,0)->setCheckState(Qt::Checked); + break; + } + } + } + } +} + +void BayManagerContentDlg::saveSetting() +{ + if(_pData){ + QList lstProtec; + for(int i = 0;i < ui->tw_zongHe->rowCount();++i){ + if(Qt::Checked == ui->tw_zongHe->item(i,0)->checkState()){ + lstProtec.append(ui->tw_zongHe->item(i,0)->data(Qt::UserRole+1).toUuid()); + } + } + + QList lstIns; + for(int i = 0;i < ui->tw_jianKong->rowCount();++i){ + if(Qt::Checked == ui->tw_jianKong->item(i,0)->checkState()){ + lstIns.append(ui->tw_jianKong->item(i,0)->data(Qt::UserRole+1).toUuid()); + } + } + + QList lstDynSen; + for(int i = 0;i < ui->tw_dongTai->rowCount();++i){ + if(Qt::Checked == ui->tw_dongTai->item(i,0)->checkState()){ + lstDynSen.append(ui->tw_dongTai->item(i,0)->data(Qt::UserRole+1).toUuid()); + } + } + + QList lstFauRec; + for(int i = 0;i < ui->tw_guZhang->rowCount();++i){ + if(Qt::Checked == ui->tw_guZhang->item(i,0)->checkState()){ + lstFauRec.append(ui->tw_guZhang->item(i,0)->data(Qt::UserRole+1).toUuid()); + } + } + + QList lstSta; + for(int i = 0;i < ui->tw_zhuangTai->rowCount();++i){ + if(Qt::Checked == ui->tw_zhuangTai->item(i,0)->checkState()){ + lstSta.append(ui->tw_zhuangTai->item(i,0)->data(Qt::UserRole+1).toUuid()); + } + } + + QList lstEtc; + for(int i = 0;i < ui->tw_qiTa->rowCount();++i){ + if(Qt::Checked == ui->tw_qiTa->item(i,0)->checkState()){ + lstEtc.append(ui->tw_qiTa->item(i,0)->data(Qt::UserRole+1).toUuid()); + } + } + + _pData->setLstProtect(lstProtec); + _pData->setLstInstruct(lstIns); + _pData->setLstDynSense(lstDynSen); + _pData->setLstFaultRecord(lstFauRec); + _pData->setLstStatus(lstSta); + _pData->setLstEtc(lstEtc); + } } diff --git a/diagramCavas/source/bayManagerDlg.cpp b/diagramCavas/source/bayManagerDlg.cpp index 3096149..aff7355 100644 --- a/diagramCavas/source/bayManagerDlg.cpp +++ b/diagramCavas/source/bayManagerDlg.cpp @@ -1,10 +1,13 @@ #include "bayManagerDlg.h" #include "bayManagerContentDlg.h" +#include "graphicsItem/electricBayItem.h" +#include "graphicsDataModel/fixedPortsModel.h" #include "ui_bayManagerDlg.h" BayManagerDlg::BayManagerDlg(QWidget *parent) : QDialog(parent) , ui(new Ui::bayManagerDlg) + ,_modelController(nullptr) { ui->setupUi(this); this->setWindowFlags(Qt::FramelessWindowHint | windowFlags()); @@ -20,11 +23,29 @@ void BayManagerDlg::initial() { connect(ui->btn_ok,&QPushButton::clicked,this,&BayManagerDlg::onOkClicked); connect(ui->btn_cancel,&QPushButton::clicked,this,&BayManagerDlg::onCancelClicked); + connect(ui->listWidget,&QListWidget::itemClicked,this,&BayManagerDlg::onListItemClicked); } void BayManagerDlg::showDlg() { + show(); + clearData(); + initData(); +} +void BayManagerDlg::initData() +{ + QList lstBay; + QMap mapBay = _modelController->allBayItem(); //获取当前图中所有bay + for(auto& item:mapBay){ + AbstractProperty* p = item->getProperty(); + BayProperty* pBayPro = dynamic_cast(p); + if(pBayPro){ + lstBay.append(pBayPro); + } + } + + generatePage(lstBay); } void BayManagerDlg::clearData() @@ -41,6 +62,11 @@ void BayManagerDlg::clearData() void BayManagerDlg::onOkClicked() { hide(); + for(auto& pDlg:_contentData){ + if(pDlg){ + pDlg->saveSetting(); + } + } } void BayManagerDlg::onCancelClicked() @@ -48,14 +74,25 @@ void BayManagerDlg::onCancelClicked() hide(); } -void BayManagerDlg::generatePage(QStringList lstBay) +void BayManagerDlg::onListItemClicked(QListWidgetItem *item) { - ui->listWidget->addItems(lstBay); - for(auto& str:lstBay) + int index = item->data(Qt::UserRole+1).toInt(); + ui->stackedWidget->setCurrentIndex(index); +} + +void BayManagerDlg::generatePage(QList lstBay) +{ + for(auto& pData:lstBay) { BayManagerContentDlg* pBay = new BayManagerContentDlg(this); - pBay->setName(str); + pBay->setProperty(pData); + pBay->updateByProperty(); int index = ui->stackedWidget->addWidget(pBay); _contentData.insert(index,pBay); + QListWidgetItem* pItem = new QListWidgetItem(pData->tag()); + pItem->setData(Qt::UserRole+1,index); + ui->listWidget->addItem(pItem); } + if(ui->stackedWidget->count() != 0) + ui->stackedWidget->setCurrentIndex(0); } diff --git a/diagramCavas/source/diagramCavas.cpp b/diagramCavas/source/diagramCavas.cpp index 3df7acb..665b08d 100644 --- a/diagramCavas/source/diagramCavas.cpp +++ b/diagramCavas/source/diagramCavas.cpp @@ -10,7 +10,8 @@ #include "topologyManager.h" #include "powerEntity.h" #include "diagramEditor/diagramEditorWizard.h" -#include "componentIconManager.h" +//#include "componentIconManager.h" +#include "baseProperty.h" #include "diagramEditor/editPanel.h" DiagramCavas::DiagramCavas(QWidget *parent) @@ -109,10 +110,13 @@ void DiagramCavas::onSignal_savePage() QMap map = pPanel->getModelController()->allItems(); for(auto pItem:map) { - if(pItem->itemChanged()) - { - pItem->updateConnectData(); //更新连接状态 - pItem->setItemChanged(false); + BaseProperty* pData = dynamic_cast(pItem->getProperty()); + if(pData){ + if(pItem->itemChanged() || pData->dataChanged()) + { + pItem->updateConnectData(); //更新连接状态 + pItem->setItemChanged(false); + } } } @@ -383,3 +387,24 @@ void DiagramCavas::onSignal_wizardFinished(DiagramEditorWizardInfo info) { } +/*******************bay************************/ +void DiagramCavas::onSignl_openCurrentBay() +{ + QWidget* pWindow= currentSubWindow()->widget(); + DrawingPanel* pPanel = dynamic_cast(pWindow); + if(pPanel) + { + if(pPanel->getMode() == DM_run) + { + + } + else if(pPanel->getMode() == DM_edit) + { + pPanel->getModelController()->onSignal_openBayManager(); + } + else if(pPanel->getMode() == DM_baseModel) + { + + } + } +} diff --git a/diagramCavas/source/drawingPanel.cpp b/diagramCavas/source/drawingPanel.cpp index 6e61ef9..05ee246 100644 --- a/diagramCavas/source/drawingPanel.cpp +++ b/diagramCavas/source/drawingPanel.cpp @@ -5,13 +5,14 @@ #include #include "designerView.h" #include "graphicsDataModel/fixedPortsModel.h" +#include "graphicsItem/graphicsBaseItem.h" #include "util/selectorManager.h" -#include "graphicsItem/electricConnectLineItem.h" #include "statusBar.h" #include "dataBase.h" #include "powerEntity.h" #include "topologyManager.h" #include "projectDiagramNameInput.h" +#include "baseProperty.h" DrawingPanel::DrawingPanel(PowerEntity* pEntity,QWidget *parent,DiagramMode mode) : QWidget(parent) @@ -194,14 +195,15 @@ QJsonObject DrawingPanel::getDiagramInfo() const obj["nodes"] = arr; QJsonArray arrConnect; - QVector vec = _pModel->allConnections(); - for(auto iter = vec.begin(); iter != vec.end();++iter) - { + QVector vec = _pModel->allConnectionProperty(); + for(auto& pPro:vec){ + Connection con = pPro->getConnection(); QJsonObject connect; - connect["SrcNodeId"] = iter->nSrcNodeId.toString(); - connect["SrcPortId"] = iter->nSrcPortId.toString(); - connect["DestNodeId"] = iter->nDestNodeId.toString(); - connect["DestPortId"] = iter->nDestPortId.toString(); + connect["id"] = pPro->uuid().toString(); + connect["SrcNodeId"] = con.nSrcNodeId.toString(); + connect["SrcPortId"] = con.nSrcPortId.toString(); + connect["DestNodeId"] = con.nDestNodeId.toString(); + connect["DestPortId"] = con.nDestPortId.toString(); arrConnect.append(connect); } obj["connections"] = arrConnect; @@ -231,6 +233,7 @@ void DrawingPanel::loadNodes(QJsonObject obj) for(QJsonValueRef connectJson:connectArr) { QJsonObject connect = connectJson.toObject(); + QUuid id = QUuid(connect["id"].toString()); //电缆线id,关联component中的电缆 QUuid srcId = QUuid(connect["SrcNodeId"].toString()); QUuid srcPortId = QUuid(connect["SrcPortId"].toString()); QUuid destId = QUuid(connect["DestNodeId"].toString()); @@ -244,7 +247,7 @@ void DrawingPanel::loadNodes(QJsonObject obj) //todo:从拓扑结构中查找port的id if(_pModel) { - _pModel->addConnectLline(QUuid(srcItemId),QUuid(destItemId),srcPortId,destPortId); + _pModel->addConnectLline(id,QUuid(srcItemId),QUuid(destItemId),srcPortId,destPortId); } } else diff --git a/diagramCavas/source/graphicsDataModel/fixedPortsModel.cpp b/diagramCavas/source/graphicsDataModel/fixedPortsModel.cpp index 11e2637..5032522 100644 --- a/diagramCavas/source/graphicsDataModel/fixedPortsModel.cpp +++ b/diagramCavas/source/graphicsDataModel/fixedPortsModel.cpp @@ -8,6 +8,7 @@ #include "baseModelItem/electricBaseModelSvgItem.h" #include "baseModelItem/electricBaseModelSvgBus.h" #include "baseModelItem/electricBaseModelLineItem.h" +#include "graphicsItem/electricBayItem.h" #include "graphicsItem/itemPort.h" #include "designerScene.h" #include "dataBase.h" @@ -21,8 +22,12 @@ #include "diagramCavas.h" #include #include +#include #include "baseProperty.h" #include "projectModelSetting.h" +#include "bayManagerDlg.h" +#include "projectModelManager.h" +#include "global.h" bool FixedPortsModel::_dataInitialised = false; @@ -32,6 +37,7 @@ FixedPortsModel::FixedPortsModel(PowerEntity* pEntity) ,_Interface(nullptr) ,_pEntity(pEntity) ,m_proModelSettingDlg(nullptr) + ,m_pBayManager(nullptr) { _cavas = nullptr; loadNodeDataFromDataBase(); @@ -61,9 +67,9 @@ QMap FixedPortsModel::allNodePos() const return map; } -QVector FixedPortsModel::allConnections() +QVector FixedPortsModel::allConnectionProperty() { - QVector vec; + QVector vec; for(auto pItem:_nodeItem) { if(pItem->getItemType() == GIT_link) @@ -71,7 +77,10 @@ QVector FixedPortsModel::allConnections() auto pLine = dynamic_cast(pItem); if(pLine) { - vec.push_back(pLine->getConnection()); + ModelProperty* pPro = pLine->getProperty(); + if(pPro){ + vec.push_back(pPro); + } } } } @@ -113,6 +122,10 @@ void FixedPortsModel::addNodeItem(QUuid id/*,int type*/,QPointF pos) if(pro) { int type = pro->graphicsType(); + if(type == GIT_link) //连线对象外部处理 + return; + QString sMeta = pro->metaModelName(); + QString sProModel = pro->modelName(); if(type == GIT_itemTri) { item = new ElectricSvgItemTriangle(QRect(-15, -15, 30, 30)); @@ -120,8 +133,19 @@ void FixedPortsModel::addNodeItem(QUuid id/*,int type*/,QPointF pos) } else if(type == GIT_itemRect) { - item = new ElectricSvgItemRect(QRect(-15, -15, 30, 30),false); - item->setItemType(GIT_itemRect); + PropertyModel model = ProjectModelManager::instance().getData()[sMeta][sProModel]; + QByteArray svg; + if(model.modelSetting.mapSvg.isEmpty()){ + svg = DataBase::GetInstance()->ModelType()[3].icon; + } + else{ + svg = model.modelSetting.mapSvg.first(); + } + + auto pCb = new ElectricSvgItemRect(QRect(-15, -15, 30, 30),false); + pCb->setItemType(GIT_itemRect); + pCb->loadSvg(svg); + item = pCb; QJsonArray portArr = pro->context()["port"].toArray(); for(QJsonValueRef portJson:portArr) { @@ -136,8 +160,19 @@ void FixedPortsModel::addNodeItem(QUuid id/*,int type*/,QPointF pos) } else if(type == GIT_bus) { - item = new ElectricSvgItemBus(QRect(-100, -3, 200, 6)); - item->setItemType(GIT_bus); + PropertyModel model = ProjectModelManager::instance().getData()[sMeta][sProModel]; + QByteArray svg; + if(model.modelSetting.mapSvg.isEmpty()){ + svg = DataBase::GetInstance()->ModelType()[1].icon; + } + else{ + svg = model.modelSetting.mapSvg.first(); + } + + auto pBus = new ElectricSvgItemBus(QRect(-100, -3, 200, 6)); + pBus->setItemType(GIT_bus); + pBus->loadSvg(svg); + item = pBus; QJsonArray portArr = pro->context()["port"].toArray(); for(QJsonValueRef portJson:portArr) @@ -182,8 +217,11 @@ BaseProperty* FixedPortsModel::addNodeData(QUuid id,int type,QString name,QStrin item->setUuid(id); item->setModelName(modelName); item->setType(type); + GraphicsItemType localType = corresbondItem::typeToProGraphic[type]; //将通用类型转换为工程模图元 + item->setGraphicsType(localType); item->setTag(name); item->setName(name); + item->setDataChanged(true); BasePropertyManager::instance().insertEntityData(id,item); } return item; @@ -211,6 +249,9 @@ void FixedPortsModel::loadNodeDataFromDataBase() pData->setStation(info.station); pData->setDataChanged(false); + QString sMeta = info.context["metaModel"].toString(); + pData->setMetaModelName(sMeta); + PowerEntity* pEntity = TopologyManager::instance().createEntity(EntityType::Component,info.uuid.toString(),info.name); //首先load所有data和entity,全局唯一 if(pEntity){ createTopoTerminalsByData(pEntity,info.context); @@ -236,47 +277,44 @@ void FixedPortsModel::loadNodeDataFromDataBase() } } -void FixedPortsModel::addConnectLline(QUuid srcId,QUuid destId,QUuid srcPort,QUuid destPort) +void FixedPortsModel::addConnectLline(QUuid lineId,QUuid srcId,QUuid destId,QUuid srcPort,QUuid destPort) { GraphicsProjectModelItem* src = _nodeItem[srcId]; GraphicsProjectModelItem* dest = _nodeItem[destId]; - if(src && dest) + QMap mapData = BasePropertyManager::instance().getEntityData(); + if(mapData.contains(lineId)) { - ElectricConnectLineItem* pItem = new ElectricConnectLineItem(); - pItem->setItemId(QUuid::createUuid()); - pItem->setItemType(GIT_link); - _scene->addItem(pItem); - - ItemPort* ptSrc = src->getPortById(srcPort.toString()); - HandleType srcType = ptSrc->getType(); - PortPos srcPos = ptSrc->portPos(); - pItem->setStartPoint(ptSrc->scenePos()); - ptSrc->setConnect(pItem); - - ItemPort* ptDest = nullptr; - ptDest = dest->getPortById(destPort.toString()); - pItem->setEndPoint(ptDest->scenePos()); - /*if(dest->getItemType() == GIT_bus) //母线动态创建port + BaseProperty* pPro = mapData.value(lineId); + if(src && dest) { + ElectricConnectLineItem* pItem = new ElectricConnectLineItem(); + pItem->setItemId(lineId); + pItem->setItemType(GIT_link); + _scene->addItem(pItem); + + ItemPort* ptSrc = src->getPortById(srcPort.toString()); + HandleType srcType = ptSrc->getType(); + PortPos srcPos = ptSrc->portPos(); + pItem->setStartPoint(ptSrc->scenePos()); + ptSrc->setConnect(pItem); + + ItemPort* ptDest = nullptr; ptDest = dest->getPortById(destPort.toString()); pItem->setEndPoint(ptDest->scenePos()); - } - else - { - ptDest = dest->getPortById(destPort.toString()); - pItem->setEndPoint(ptDest->scenePos()); - }*/ - if(ptDest != nullptr) - { - HandleType destType = ptDest->getType(); - PortPos destPos = ptDest->portPos(); + if(ptDest != nullptr) + { + HandleType destType = ptDest->getType(); + PortPos destPos = ptDest->portPos(); - pItem->calculatePath(); - pItem->setConnection(Connection(srcId,srcPort,srcType,srcPos,destId,destPort,destType,destPos)); - ptDest->setConnect(pItem); + pItem->calculatePath(); - addNodeItem(pItem->itemId(),pItem); + pPro->setConnection(Connection(srcId,srcPort,srcType,srcPos,destId,destPort,destType,destPos)); + ptDest->setConnect(pItem); + + addNodeItem(pItem->itemId(),pItem); + pItem->setProperty(pPro); + } } } } @@ -424,69 +462,68 @@ QVariant FixedPortsModel::nodeData(QUuid nodeId, NodeRole role) const void FixedPortsModel::saveNode(int nPageId) { - QMap mapData = BasePropertyManager::instance().getEntityData(); - for(auto &pData:mapData) + QMap mapItems = allItems(); + for(auto& pItem:mapItems) { - if(pData->prepareDelete()) - { - DataBase::GetInstance()->deleteComponent(pData->uuid().toString()); - continue; - } - if(pData->dataChanged()) - { - bool exist = DataBase::GetInstance()->componentExist(pData->uuid().toString()); - VariableProperty* pVariable = dynamic_cast(pData); - if(pVariable) + BaseProperty* pData = dynamic_cast(pItem->getProperty()); + if(pData){ + Connection con = pData->getConnection(); + QString fromPin = con.nSrcPortId.toString(); + QString toPin = con.nDestPortId.toString(); + QJsonObject context; + context["from_pin"] = fromPin; + context["to_pin"] = toPin; + if(pData->prepareDelete()) { - modelDataInfo dataInfo = pVariable->getPropertyValue(); - if(exist) //已存在更新 - { - DataBase::GetInstance()->updateComponent(pData->uuid(),pData->tag(),pData->name(),pData->context()); - for(auto &val:dataInfo.groupInfo) - { - DataBase::GetInstance()->updateDynamicProperty(pData->uuid(),val); - } - } - else - { - DataBase::GetInstance()->insertComponent(pData->uuid(),pData->modelName(),pData->path(),pData->tag(),pData->name(),pData->description(),pData->grid(),pData->zone(),pData->station(),pData->type(),true,pData->state(),pData->status(),pData->connectedBus(),pData->label(),pData->context(),1); - for(auto &val:dataInfo.groupInfo) - { - DataBase::GetInstance()->insertDynamicProperty(pData->uuid(),val); + DataBase::GetInstance()->deleteComponent(pData->uuid().toString()); + if(pData->type() == 8){ + PowerConnection* pCon = TopologyManager::instance().connection(fromPin,toPin); + if(pCon){ + DataBase::GetInstance()->deleteTopologic(con.nSrcPortId,con.nDestPortId); + TopologyManager::instance().removeConnection(pCon->id()); } } + continue; } - } - } + if(pData->dataChanged()) + { + bool exist = DataBase::GetInstance()->componentExist(pData->uuid().toString()); + VariableProperty* pVariable = dynamic_cast(pData); + if(pVariable) + { + modelDataInfo dataInfo = pVariable->getPropertyValue(); + if(exist) //已存在更新 + { + DataBase::GetInstance()->updateComponent(pData->uuid(),pData->tag(),pData->name(),pData->context()); + for(auto &val:dataInfo.groupInfo) + { + if(val.groupName == "component") + continue; + DataBase::GetInstance()->updateDynamicProperty(pData->uuid(),val); + } + } + else + { + DataBase::GetInstance()->insertComponent(pData->uuid(),pData->modelName(),pData->path(),pData->tag(),pData->name(),pData->description(),pData->grid(),pData->zone(),pData->station(),pData->type(),true,pData->state(),pData->status(),pData->connectedBus(),pData->label(),pData->context(),1); + for(auto &val:dataInfo.groupInfo) + { + if(val.groupName == "component") + continue; + DataBase::GetInstance()->insertDynamicProperty(pData->uuid(),val); + } + } + } - //todo:增加判断,只在设置模式保存连接关系 - QVector vecCon = allConnections(); //保存当前页面中的连接关系 - for(auto &con:vecCon) - { - QString fromPin = con.nSrcPortId.toString(); - QString toPin = con.nDestPortId.toString(); - QJsonObject context; - context["from_pin"] = fromPin; - context["to_pin"] = toPin; - PowerConnection* pCon = TopologyManager::instance().connection(fromPin,toPin); - if(pCon) - { - DataState state = pCon->state(); - switch (state) { - case DataState::unchanged: - break; - case DataState::prepareDelete: - DataBase::GetInstance()->deleteTopologic(con.nSrcPortId,con.nDestPortId); - TopologyManager::instance().removeConnection(pCon->id()); - break; - case DataState::changed: - DataBase::GetInstance()->insertTopologic(con.nSrcNodeId,con.nDestNodeId,context,0,"",0); - break; - default: - break; + if(pData->type() == 8){ + PowerConnection* pCon = TopologyManager::instance().connection(fromPin,toPin); + if(pCon){ + DataBase::GetInstance()->insertTopologic(con.nSrcNodeId,con.nDestNodeId,context,0,"",0); + } + } } } } + //todo:savebay } void FixedPortsModel::onSignal_ifExits(QUuid id,const QString& str,int type,GraphicsProjectModelItem* pitem) @@ -602,7 +639,22 @@ void FixedPortsModel::onSignal_generateDiagram(const QString& sName) { lst.append(item); } - generateProjectModel(sName,lst); + + QList lstBay; + for(auto& item:_bayItem) + { + lstBay.append(item); + } + generateProjectModel(sName,lst,lstBay); +} + +void FixedPortsModel::onSignal_openBayManager() +{ + if(m_pBayManager == nullptr){ + m_pBayManager = new BayManagerDlg(_widget); + m_pBayManager->setModelController(this); + } + m_pBayManager->showDlg(); } void FixedPortsModel::startHttpRequest() @@ -736,7 +788,7 @@ template void FixedPortsModel::establishConnection(GraphicsBa PowerConnection* pCon = TopologyManager::instance().createConnection(pItem->itemId().toString(),pSrcPort->getId(),pDestPort->getId(),pSrc->itemId().toString(),pDest->itemId().toString(),ModelFunctionType::BaseModel); //创建拓扑连接(逻辑) if(pCon) pCon->setState(DataState::changed); - pItem->setConnection(Connection(pSrc->itemId(),QUuid(pSrcPort->getId()),pSrcPort->getType(),pSrcPort->portPos(),pDest->itemId(),QUuid(pDestPort->getId()),pDestPort->getType(),pDestPort->portPos())); + pItem->getProperty()->setConnection(Connection(pSrc->itemId(),QUuid(pSrcPort->getId()),pSrcPort->getType(),pSrcPort->portPos(),pDest->itemId(),QUuid(pDestPort->getId()),pDestPort->getType(),pDestPort->portPos())); } } @@ -880,7 +932,7 @@ QVector FixedPortsModel::allBaseConnections() auto pLine = dynamic_cast(pItem); if(pLine) { - vec.push_back(pLine->getConnection()); + vec.push_back(pLine->getProperty()->getConnection()); } } } @@ -938,7 +990,7 @@ void FixedPortsModel::showProjectModelSettingDlg(GraphicsBaseModelItem* srcItem) m_proModelSettingDlg->showDlg(srcItem); } -void FixedPortsModel::generateProjectModel(const QString& sPageName,QList lstItem) +void FixedPortsModel::generateProjectModel(const QString& sPageName,QList lstItem,QList lstOther) { DrawingPanel* pProPanel = nullptr; if(_cavas){ @@ -951,20 +1003,6 @@ void FixedPortsModel::generateProjectModel(const QString& sPageName,QListgetPanel(sPageName); } - /*for(auto& pBaseItem:lstItem) //首次循环处理所有非连线对象 - { - BaseModelProperty* pBase = dynamic_cast(pBaseItem->getProperty()); - if(pBase->type() != 8){ //不是电缆 - QUuid id = QUuid::createUuid(); - BaseProperty* pData = pProPanel->getModel()->addNodeData(id,pBase->type(),pBase->name(),pBase->modelName()); - if(pData) - { - pData->setDataChanged(true); //数据状态改变 - addProjectItemByBaseData(pProPanel,pBaseItem,pData); - } - } - }*/ - for(auto& pBaseItem:lstItem) //第二次循环处理所有连线对象 { BaseModelProperty* pBase = dynamic_cast(pBaseItem->getProperty()); @@ -978,16 +1016,38 @@ void FixedPortsModel::generateProjectModel(const QString& sPageName,QList lstProData; + QMap mapItem = pProPanel->getModelController()->allItems(); //根据item获取data + for(auto& item:mapItem){ + BaseProperty* pPro = dynamic_cast(item->getProperty()); + if(pPro){ + lstProData.append(pPro); + } + } + + for(auto& pOtherItem:lstOther) + { + BayProperty* pBay = dynamic_cast(pOtherItem->getProperty()); + if(pBay){ + BayProperty* pData = pProPanel->getModelController()->generateBayData(pBay,lstProData); + if(pData) + { + pProPanel->getModelController()->addBayByData(pData); + } + } + } } -void FixedPortsModel::addProjectItemByBaseData(DrawingPanel* pPanel,GraphicsBaseModelItem* pBaseItem,BaseProperty* pPro) +void FixedPortsModel::addProjectItemByBaseData(DrawingPanel* pPanel,GraphicsBaseModelItem* pItem,BaseProperty* pPro) { - BaseModelProperty* pBase = dynamic_cast(pBaseItem->getProperty()); + BaseModelProperty* pBase = dynamic_cast(pItem->getProperty()); if(pBase){ if(_baseItem.contains(pBase->uuid())){ GraphicsProjectModelItem* pProItem = nullptr; GraphicsBaseModelItem* pBaseItem = _baseItem.value(pBase->uuid()); pPro->setSourceItemId(pBaseItem->itemId().toString()); //设置被哪个对象生成 + pPro->setMetaModelName(pBase->metaModelName()); //传递基模名 int type = pBase->graphicsType(); if(type == GIT_baseBus) { @@ -1105,6 +1165,10 @@ void FixedPortsModel::addProjectItemByBaseData(DrawingPanel* pPanel,GraphicsBase QString proToItemId; QString proFromTerId; QString proToTerId; + HandleType proFromType; + PortPos proFromPos; + HandleType proToType; + PortPos proToPos; for(auto& pPro:mapPro) { if(pPro->getSourceItemId() == baseFromComponentId){ @@ -1144,6 +1208,8 @@ void FixedPortsModel::addProjectItemByBaseData(DrawingPanel* pPanel,GraphicsBase for(auto& port:mapFrom){ if(port->getSourcePortId() == baseFromTerId){ proFromTerId = port->getId(); + proFromType = port->getType(); + proFromPos = port->portPos(); auto pLine = dynamic_cast(pProItem); if(pLine) pLine->setStartPoint(port->scenePos()); @@ -1156,6 +1222,8 @@ void FixedPortsModel::addProjectItemByBaseData(DrawingPanel* pPanel,GraphicsBase for(auto& port:mapTo){ if(port->getSourcePortId() == baseToTerId){ proToTerId = port->getId(); + proToType = port->getType(); + proToPos = port->portPos(); auto pLine = dynamic_cast(pProItem); if(pLine) pLine->setEndPoint(port->scenePos()); @@ -1167,6 +1235,9 @@ void FixedPortsModel::addProjectItemByBaseData(DrawingPanel* pPanel,GraphicsBase auto pLine = dynamic_cast(pProItem); if(pLine) pLine->calculatePath(); + pPanel->getModelController()->addNodeItem(pBase->uuid(),pProItem); + pProItem->setProperty(pPro); + pPro->setConnection(Connection(QUuid(proFromItemId),QUuid(proFromTerId),proFromType,proFromPos,QUuid(proToItemId),QUuid(proToTerId),proToType,proToPos)); } } QString sModel = pBase->getModelProperty().modelSetting.modelName; @@ -1175,6 +1246,159 @@ void FixedPortsModel::addProjectItemByBaseData(DrawingPanel* pPanel,GraphicsBase } } +bool FixedPortsModel::addBayItem(QUuid id,ElectricBayItem* pBay) +{ + if(_bayItem.contains(id)) + return false; + else + { + _bayItem.insert(id,pBay); + return true; + } +} + +void FixedPortsModel::addItemsToBay(QList lstItem,ElectricBayItem* pBay) +{ + if(pBay == nullptr) + return; + BayProperty* proBay = dynamic_cast(pBay->getProperty()); + if(proBay){ + for(auto& item:lstItem){ + if(item){ + ModelProperty* p = item->getProperty(); + auto lstCom = proBay->getLstComponent(); + if(!lstCom.contains(p->uuid())){ + proBay->getLstComponent().append(p->uuid()); + } + } + } + } +} + +BayProperty* FixedPortsModel::addBayData(QUuid uuid) +{ + BayProperty* pData = BasePropertyManager::instance().findBayData(uuid); //已存在不不创建 + if(pData != nullptr) + return pData; + + BayProperty* item = new BayProperty(this); + + if(item) + { + item->setUuid(uuid); + BasePropertyManager::instance().insertBayData(uuid,item); + } + return item; +} + +QMap& FixedPortsModel::allBayItem() +{ + return _bayItem; +} + +BayProperty* FixedPortsModel::generateBayData(BayProperty* pData,QList lst) +{ + QUuid id = QUuid::createUuid(); + BayProperty* p = addBayData(id); + p->setTag(pData->tag()); + p->setName(pData->name()); + p->setType(pData->getType()); + p->setVoltage(pData->getVoltage()); + p->setFla(pData->getFla()); + p->setCapacity(pData->getCapacity()); + p->setInService(pData->getInService()); + QList lstCompo = pData->getLstComponent(); + QList lstNewCompo = getCorrespondId(lstCompo,lst); //将基模component替换为工程模component + p->setLstComponent(lstNewCompo); + + QList lstFrom = pData->getLstFrom(); + QList lstNewFrom = getCorrespondId(lstFrom,lst); + p->setLstFrom(lstNewFrom); + + QList lstTo = pData->getLstTo(); + QList lstNewTo = getCorrespondId(lstTo,lst); + p->setLstTo(lstNewTo); + + QList lstProtect = pData->getLstProtect(); + QList lstNewProtect = getCorrespondId(lstProtect,lst); + p->setLstProtect(lstNewProtect); + + QList lstFaultRecord = pData->getLstFaultRecord(); + QList lstNewFaultRecord = getCorrespondId(lstFaultRecord,lst); + p->setLstFaultRecord(lstNewFaultRecord); + + QList lstDynSense = pData->getLstDynSense(); + QList lstNewDynSense = getCorrespondId(lstDynSense,lst); + p->setLstDynSense(lstNewDynSense); + + QList lstStatus = pData->getLstStatus(); + QList lstNewStatus = getCorrespondId(lstStatus,lst); + p->setLstStatus(lstNewStatus); + + QList lstInstruct = pData->getLstInstruct(); + QList lstNewInstruct = getCorrespondId(lstInstruct,lst); + p->setLstInstruct(lstNewInstruct); + + QList lstEtc = pData->getLstEtc(); + QList lstNewEtc= getCorrespondId(lstEtc,lst); + p->setLstEtc(lstNewEtc); + return p; +} + +QList FixedPortsModel::getCorrespondId(QList lstCompo,QList lst) +{ + QList lstNewCompo; + for(auto& uuid:lstCompo) + { + for(auto& basePro:lst) + { + if(basePro->getSourceItemId() == uuid.toString()){ //工程模sourceid等于基模存储的componentid, + lstNewCompo.append(basePro->uuid()); + break; + } + } + } + return lstNewCompo; +} + +QRectF FixedPortsModel::calculateItemsBoundingRect(QList items) +{ + if (items.isEmpty()) + return QRectF(); + + // 初始化矩形为第一个item的场景边界矩形 + QRectF boundingRect = items.first()->sceneBoundingRect(); + + // 遍历剩余item,扩展矩形以包含所有item + for (int i = 1; i < items.size(); ++i) { + QGraphicsItem* item = items.at(i); + // 确保item在场景中且有效 + if (item && item->scene()) { + boundingRect = boundingRect.united(item->sceneBoundingRect()); + } + } + return boundingRect.adjusted(-10,-10,10,10); +} + +void FixedPortsModel::addBayByData(BayProperty* pData) +{ + QList items; + QList lstCompo = pData->getLstComponent(); + for(auto& id:lstCompo){ + if(_nodeItem.contains(id)){ + items.append(_nodeItem.value(id)); + } + } + + QRectF rec = calculateItemsBoundingRect(items); + auto pBay = new ElectricBayItem(rec); + pBay->setItemType(GIT_bay); + pBay->setProperty(pData); + pBay->setText(pData->tag()); + addBayItem(pData->uuid(),pBay); + getScene()->addItem(pBay); +} + void FixedPortsModel::addTestData() { QUuid breakerId = QUuid::createUuid(); @@ -1236,4 +1460,20 @@ void FixedPortsModel::addTestData() addBaseItem(lineId,pLine); establishConnection(pBreaker,pBus,pLine); _scene->addItem(pLine); + + QList lst; + lst.append(pBreaker); + QRectF rec = calculateItemsBoundingRect(lst); + ElectricBayItem* pBay = new ElectricBayItem(rec); + pBay->setItemType(GIT_bay); + pBay->setText("间隔1"); + QUuid bayId = QUuid::createUuid(); + BayProperty* pBayData = addBayData(bayId); + pBay->setProperty(pBayData); + pBayData->setName("间隔1"); + pBayData->setTag("间隔1"); + pBayData->getLstComponent().append(breakerId); + addBayItem(bayId,pBay); + addItemsToBay(lst,pBay); + _scene->addItem(pBay); } diff --git a/diagramCavas/source/graphicsItem/electricBayItem.cpp b/diagramCavas/source/graphicsItem/electricBayItem.cpp new file mode 100644 index 0000000..1960b0c --- /dev/null +++ b/diagramCavas/source/graphicsItem/electricBayItem.cpp @@ -0,0 +1,53 @@ +#include "graphicsItem/electricBayItem.h" +#include +#include +#include + +ElectricBayItem::ElectricBayItem(const QRectF &rect,QGraphicsItem *parent) + : GraphicsNonStandardItem(parent) +{ + m_showRect = rect; + m_dWidth = rect.width(); + m_dHeight = rect.height(); + m_font.setPointSize(12); +} + +ElectricBayItem::~ElectricBayItem() +{ + +} + +void ElectricBayItem::setText(const QString& text) +{ + prepareGeometryChange(); // 通知框架几何变化 + m_text = text; + updateTextShape(); +} + +QPainterPath ElectricBayItem::shape() +{ + QPainterPath path; + path.addRect(_recLabel); + return path; +} + +void ElectricBayItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) +{ + painter->setPen(m_pen); + painter->drawText(_recLabel,m_text); + m_pen.setStyle(Qt::DashLine); + if (option->state & QStyle::State_Selected) //是选中状态,绘制选中框 + { + painter->drawRect(m_showRect); + } + +} + +void ElectricBayItem::updateTextShape() +{ + QFontMetricsF metrics(m_font); + QRectF recText = metrics.boundingRect(m_text); + //_recLabel = recText.translated(g_offsetX,g_offsetY); + _recLabel = recText; + shape(); +} diff --git a/diagramCavas/source/graphicsItem/electricSvgItemBus.cpp b/diagramCavas/source/graphicsItem/electricSvgItemBus.cpp index b09632b..f839e92 100644 --- a/diagramCavas/source/graphicsItem/electricSvgItemBus.cpp +++ b/diagramCavas/source/graphicsItem/electricSvgItemBus.cpp @@ -35,13 +35,13 @@ void ElectricSvgItemBus::updateConnectData() QJsonArray arr; if(_property) { - for(auto ptr:m_mapPort) + for(auto &ptr:m_mapPort) { //if(ptr->connected()) { QJsonObject port; port["portId"] = ptr->getId(); - auto pLine = ptr->getConnectPtr(); + //auto pLine = ptr->getConnectPtr(); port["x"] = ptr->pos().x(); port["y"] = ptr->pos().y(); port["portType"] = ptr->getType(); @@ -50,6 +50,7 @@ void ElectricSvgItemBus::updateConnectData() } obj["port"] = arr; + obj["metaModel"] = _property->metaModelName(); _property->setContext(obj); } } diff --git a/diagramCavas/source/graphicsItem/graphicsBaseItem.cpp b/diagramCavas/source/graphicsItem/graphicsBaseItem.cpp index 12b626a..85f1a2a 100644 --- a/diagramCavas/source/graphicsItem/graphicsBaseItem.cpp +++ b/diagramCavas/source/graphicsItem/graphicsBaseItem.cpp @@ -414,6 +414,7 @@ void GraphicsProjectModelItem::updateConnectData() } obj["port"] = arr; + obj["metaModel"] = _property->metaModelName(); _property->setContext(obj); } } diff --git a/diagramCavas/source/util/baseSelector.cpp b/diagramCavas/source/util/baseSelector.cpp index 249f735..e5097e9 100644 --- a/diagramCavas/source/util/baseSelector.cpp +++ b/diagramCavas/source/util/baseSelector.cpp @@ -10,6 +10,7 @@ #include "topologyManager.h" #include "graphicsItem/itemPort.h" #include "graphicsItem/electricConnectLineItem.h" +#include "graphicsItem/electricBayItem.h" #include "topologyManager.h" QPointF BaseSelector::ms_ptMouseDown(0.0,0.0); @@ -129,6 +130,21 @@ void BaseSelector::mousePressEvent(QGraphicsSceneMouseEvent* event, DesignerScen } } } + else + { + QPointF pos = event->scenePos(); + // 遍历所有项检测点击 + for (QGraphicsItem* item : scene->items()) { + ElectricBayItem* pItem = dynamic_cast(item); + if (pItem) { + if(pItem->containsPoint(pos)){ + // 处理命中 + pItem->setSelected(true); + return; + } + } + } + } } if(m_opMode == OM_move) //可以多个选中同时移动 @@ -166,6 +182,20 @@ void BaseSelector::mousePressEvent(QGraphicsSceneMouseEvent* event, DesignerScen item->updateHandles(); } } + else{ + QPointF pos = event->scenePos(); + // 遍历所有项检测点击 + for (QGraphicsItem* item : scene->items()) { + ElectricBayItem* pItem = dynamic_cast(item); + if (pItem) { + if(pItem->containsPoint(pos)){ + // 处理命中 + pItem->setSelected(true); + return; + } + } + } + } } } @@ -182,6 +212,8 @@ void BaseSelector::mouseMoveEvent(QGraphicsSceneMouseEvent* event, DesignerScene GraphicsBaseItem* item = qgraphicsitem_cast(items.first()); if(item) { + if(item->getItemType() == GIT_bay) + return; if(ms_nDragHandle == H_none) { //设置光标样式 @@ -409,6 +441,8 @@ void BaseSelector::mouseDoubleClickEvent(QGraphicsSceneMouseEvent* event, Design GraphicsProjectModelItem* item = qgraphicsitem_cast(items.first()); if(item) { + if(item->getItemType() == GIT_bay) //间隔暂时返回 + return; QString modelName = item->getModelName(); //todo:additem时填写模型类型 QUuid uuid = item->itemId(); _model->showModelDlg(modelName,uuid,item); @@ -421,7 +455,7 @@ void BaseSelector::mouseDoubleClickEvent(QGraphicsSceneMouseEvent* event, Design if(items.count() == 1) { GraphicsBaseModelItem* item = qgraphicsitem_cast(items.first()); - if(item) + if(item && item->getItemType() != GIT_bay) { _model->showProjectModelSettingDlg(item); } diff --git a/diagramCavas/source/util/connectingSelector.cpp b/diagramCavas/source/util/connectingSelector.cpp index c4f041d..65cb7db 100644 --- a/diagramCavas/source/util/connectingSelector.cpp +++ b/diagramCavas/source/util/connectingSelector.cpp @@ -6,6 +6,7 @@ #include #include #include +#include "baseProperty.h" #include ConnectingSelector::ConnectingSelector(FixedPortsModel* model,QObject *parent) @@ -135,7 +136,7 @@ void ConnectingSelector::createConnectLline(GraphicsProjectModelItem* connecting pCon->setState(DataState::changed); } - pItem->setConnection(Connection(connectingItem->itemId(),QUuid(srcPortId),ptSrc->getType(),ptSrc->portPos(),touchedItem->itemId(),QUuid(destPortId),ptDest->getType(),ptDest->portPos())); + pItem->getProperty()->setConnection(Connection(connectingItem->itemId(),QUuid(srcPortId),ptSrc->getType(),ptSrc->portPos(),touchedItem->itemId(),QUuid(destPortId),ptDest->getType(),ptDest->portPos())); _model->addNodeItem(pItem->itemId(),pItem); auto srcParent = ptSrc->getParentPtr(); auto destParent = ptDest->getParentPtr(); diff --git a/diagramCavas/ui/bayInfoDlg.ui b/diagramCavas/ui/bayInfoDlg.ui index 241ca58..5b7bc2d 100644 --- a/diagramCavas/ui/bayInfoDlg.ui +++ b/diagramCavas/ui/bayInfoDlg.ui @@ -147,7 +147,14 @@ - + + + false + + + false + + @@ -173,9 +180,6 @@ - - - @@ -186,9 +190,6 @@ - - - @@ -221,9 +222,6 @@ - - - @@ -237,7 +235,11 @@ - + + + true + + @@ -267,9 +269,6 @@ - - - @@ -280,12 +279,6 @@ - - - - - - @@ -296,6 +289,48 @@ + + + + true + + + + + + + true + + + + + + + true + + + + + + + true + + + + + + + true + + + + + + + true + + + diff --git a/diagramCavas/ui/bayManagerContentDlg.ui b/diagramCavas/ui/bayManagerContentDlg.ui index 8a41272..17119a9 100644 --- a/diagramCavas/ui/bayManagerContentDlg.ui +++ b/diagramCavas/ui/bayManagerContentDlg.ui @@ -28,33 +28,16 @@ 10 - - + + + + + + + + - 名称 - - - Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - - - - - - - - - - 间隔序号 - - - - - - - - - - 类型 + 联结 从 Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter @@ -64,12 +47,8 @@ - - - - 服役状态 - - + + @@ -89,18 +68,19 @@ - - + + - 联结 从 - - - Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter + 间隔序号 - - + + + + Qt::Orientation::Horizontal + + @@ -112,13 +92,13 @@ - - - - - - - Qt::Orientation::Horizontal + + + + 类型 + + + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter @@ -135,6 +115,9 @@ + + + @@ -145,8 +128,25 @@ - - + + + + + + + 名称 + + + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter + + + + + + + 服役状态 + + @@ -158,8 +158,8 @@ - - + + diff --git a/diagramCavas/ui/bayManagerDlg.ui b/diagramCavas/ui/bayManagerDlg.ui index 4ab386d..7db802b 100644 --- a/diagramCavas/ui/bayManagerDlg.ui +++ b/diagramCavas/ui/bayManagerDlg.ui @@ -36,6 +36,12 @@ + + + 0 + 21 + + 16777215 @@ -46,6 +52,15 @@ background-color: rgb(209, 209, 209); + + 0 + + + 0 + + + 0 + diff --git a/diagramUtils/include/basePropertyManager.h b/diagramUtils/include/basePropertyManager.h index c334e27..824ef58 100644 --- a/diagramUtils/include/basePropertyManager.h +++ b/diagramUtils/include/basePropertyManager.h @@ -8,6 +8,7 @@ class BaseProperty; class BaseModelProperty; +class BayProperty; class DIAGRAM_DESIGNER_PUBLIC BasePropertyManager : public QObject { @@ -29,6 +30,11 @@ public: BaseModelProperty* findBaseEntityData(QUuid); void deleteBaseEntityData(QUuid); QMap getBaseEntityData() const; + + void insertBayData(QUuid,BayProperty*); + BayProperty* findBayData(QUuid); + void deleteBayData(QUuid); + QMap getBayData() const; signals: void dataCreated(QString uuid); void dataChanged(QString uuid); @@ -37,5 +43,6 @@ public slots: private: QMap m_entityData; //工程模实例化元件的唯一数据 QMap m_baseEntityData; //基模实例元件数据 + QMap m_bayData; //间隔数据 }; #endif // BASEPROPERTYMANAGER_H diff --git a/diagramUtils/source/basePropertyManager.cpp b/diagramUtils/source/basePropertyManager.cpp index 1500aab..a6ceb7d 100644 --- a/diagramUtils/source/basePropertyManager.cpp +++ b/diagramUtils/source/basePropertyManager.cpp @@ -69,3 +69,27 @@ QMap BasePropertyManager::getBaseEntityData() const { return m_baseEntityData; } + +/************************************************************/ +void BasePropertyManager::insertBayData(QUuid id,BayProperty* p) +{ + if(!m_bayData.contains(id)) + m_bayData.insert(id,p); +} + +BayProperty* BasePropertyManager::findBayData(QUuid id) +{ + return m_bayData.value(id,nullptr); +} + +void BasePropertyManager::deleteBayData(QUuid id) +{ + BayProperty* pData = m_bayData.value(id,nullptr); + if(pData) + delete pData; +} + +QMap BasePropertyManager::getBayData() const +{ + return m_bayData; +} diff --git a/source/mainwindow.cpp b/source/mainwindow.cpp index f449a31..1675343 100644 --- a/source/mainwindow.cpp +++ b/source/mainwindow.cpp @@ -152,7 +152,7 @@ void CMainWindow::initializeAction() QAction* actEdit = ui->menuProject->addAction(QString::fromWCharArray(L"编辑工程模")); connect(actEdit,&QAction::triggered,this,&CMainWindow::onAction_editProject); - QAction* actEditBay = ui->menuBay->addAction(QString::fromWCharArray(L"编辑间隔")); + QAction* actEditBay = ui->menuBay->addAction(QString::fromWCharArray(L"管理间隔")); connect(actEditBay,&QAction::triggered,this,&CMainWindow::onAction_editBay); QAction* testAct = ui->menuTest->addAction(QString::fromWCharArray(L"生成测试基模")); @@ -212,6 +212,7 @@ void CMainWindow::onAction_editProject() void CMainWindow::onAction_editBay() { + m_pDiagramCavas->onSignl_openCurrentBay(); } void CMainWindow::onSignal_addItem(QGraphicsItem* item)