From 49991aa47625a064dce2e8530b7093c6c05ba08f Mon Sep 17 00:00:00 2001 From: baiYue Date: Fri, 27 Jun 2025 19:17:04 +0800 Subject: [PATCH] add project model edit --- common/include/baseProperty.h | 3 + common/include/global.h | 34 ++- common/include/tools.h | 6 + common/source/tools.cpp | 38 +++ diagramCavas/CMakeLists.txt | 5 + diagramCavas/include/drawingPanel.h | 5 + .../graphicsDataModel/fixedPortsModel.h | 5 +- .../include/graphicsItem/electricSvgItem.h | 2 +- .../include/graphicsItem/graphicsBaseItem.h | 3 - diagramCavas/include/powerTerminal.h | 3 + .../include/projectDiagramNameInput.h | 30 ++ diagramCavas/include/projectModelSetting.h | 12 + diagramCavas/include/statusBar.h | 8 + diagramCavas/source/drawingPanel.cpp | 15 +- .../graphicsDataModel/fixedPortsModel.cpp | 134 +++++++-- .../source/graphicsItem/electricSvgItem.cpp | 10 +- .../graphicsItem/electricSvgItemBus.cpp | 2 +- .../graphicsItem/electricSvgItemRect.cpp | 2 +- .../graphicsItem/electricSvgItemTriangle.cpp | 2 +- .../source/graphicsItem/graphicsBaseItem.cpp | 8 +- .../source/projectDiagramNameInput.cpp | 51 ++++ diagramCavas/source/projectModelSetting.cpp | 265 +++++++++++++++++- diagramCavas/source/statusBar.cpp | 20 ++ diagramCavas/ui/projectDiagramNameInput.ui | 222 +++++++++++++++ diagramCavas/ui/projectModelSetting.ui | 103 ++++++- diagramUtils/include/dataBase.h | 6 + diagramUtils/include/projectModelManager.h | 3 + diagramUtils/source/dataBase.cpp | 115 ++++++++ diagramUtils/source/projectModelManager.cpp | 78 ++++-- source/projectModelDlg.cpp | 4 +- 30 files changed, 1129 insertions(+), 65 deletions(-) create mode 100644 diagramCavas/include/projectDiagramNameInput.h create mode 100644 diagramCavas/source/projectDiagramNameInput.cpp create mode 100644 diagramCavas/ui/projectDiagramNameInput.ui diff --git a/common/include/baseProperty.h b/common/include/baseProperty.h index 6045fd9..f82c072 100644 --- a/common/include/baseProperty.h +++ b/common/include/baseProperty.h @@ -68,8 +68,11 @@ public: virtual ~BaseModelProperty(); virtual void addProData(QString sPage,BaseProperty* pData) {_generatedData.insert(sPage,pData);} + virtual PropertyModel& getModelProperty() {return pm;} + virtual void setModelProperty(PropertyModel pro) {pm = pro;} private: QMap _generatedData; //该数据生成过的工程模数据 + PropertyModel pm; //工程模的选择状态 }; class BaseProperty:public ModelProperty //图像工程模模属性类,存放电路元件属性 diff --git a/common/include/global.h b/common/include/global.h index 55a1f11..53467e6 100644 --- a/common/include/global.h +++ b/common/include/global.h @@ -9,12 +9,14 @@ #include #include #include +#include "tools.h" const double g_dGriaphicsScene_Width = 800; const double g_dGriaphicsScene_Height = 600; const int g_dEditorItem_Width = 150; const int g_dEditorItem_Height = 80; + //Q_NAMESPACE enum GraphicsItemType { @@ -194,6 +196,12 @@ struct projectManager //工程模管理类 QJsonObject checkState; //属性选择状态 }; +struct projectModelSetting //工程模设定类,如图标 +{ + QString modelName; //工程模名 + QMap mapSvg; //存放选择的svg图片 +}; + /*struct baseModelSelectManger { int id = 0; @@ -236,11 +244,31 @@ struct PropertyModel //工程模 { MapProperty mapProperty; int nType = 0; //工程模类型,选择图标后确定 - QStandardItemModel* pBase; //基础属性 - QStandardItemModel* pSelect; //已选择属性 + QStandardItemModel* pBase = nullptr; //基础属性 + QStandardItemModel* pSelect = nullptr; //已选择属性 FormerName formerMeta; //曾用元模名 - FormerName formerProject; //曾用工程模名 + FormerName formerProject; //曾用工程模名 QMap dataInfo; //存放数据库内容 + projectModelSetting modelSetting; + PropertyModel deepCopy() //深拷贝 + { + PropertyModel copy; + copy.mapProperty = mapProperty; + copy.pBase = deepCloneModel(pBase); + copy.pSelect = deepCloneModel(pSelect); + copy.formerMeta = formerMeta; + copy.formerProject = formerProject; + copy.dataInfo = dataInfo; + copy.modelSetting = modelSetting; + return copy; + } + void release() + { + delete pBase; + delete pSelect; + pBase = nullptr; + pSelect = nullptr; + } }; typedef QMap MapProject; //str为工程名,PropertyModel为工程属性 typedef QMap MapMeta; //str为元模名,PropertyModel为工程模集 diff --git a/common/include/tools.h b/common/include/tools.h index e674d8a..7f4c070 100644 --- a/common/include/tools.h +++ b/common/include/tools.h @@ -69,4 +69,10 @@ private: int getLevel(QStandardItem *item); QModelIndex findIndex(const QAbstractItemModel* model, const QVariant& target, int role = Qt::DisplayRole, const QModelIndex& parent = QModelIndex()); + +// 使用 clone() 方法深拷贝item +QStandardItem* deepCloneItem(const QStandardItem* source); + +// 深拷贝整个模型(不复制表头) +QStandardItemModel* deepCloneModel(const QStandardItemModel* source); #endif // DATABASE_H diff --git a/common/source/tools.cpp b/common/source/tools.cpp index b4e98ee..fa311a5 100644 --- a/common/source/tools.cpp +++ b/common/source/tools.cpp @@ -33,3 +33,41 @@ QModelIndex findIndex(const QAbstractItemModel* model, const QVariant& target, } return QModelIndex(); // 未找到 } + +QStandardItem* deepCloneItem(const QStandardItem* source) { + if (!source) return nullptr; + + // 使用 clone() 方法创建副本 + QStandardItem* clone = source->clone(); + + // 递归复制所有子项 + for (int row = 0; row < source->rowCount(); ++row) { + for (int col = 0; col < source->columnCount(); ++col) { + if (QStandardItem* child = source->child(row, col)) { + clone->setChild(row, col, deepCloneItem(child)); + } + } + } + + return clone; +} + +QStandardItemModel* deepCloneModel(const QStandardItemModel* source) { + if (source == nullptr) return nullptr; + + // 设置相同的行列数 + QStandardItemModel* dest = new QStandardItemModel(source->parent()); + + dest->setRowCount(source->rowCount()); + dest->setColumnCount(source->columnCount()); + + // 复制所有数据项 + for (int row = 0; row < source->rowCount(); ++row) { + for (int col = 0; col < source->columnCount(); ++col) { + if (QStandardItem* item = source->item(row, col)) { + dest->setItem(row, col, deepCloneItem(item)); + } + } + } + return dest; +} diff --git a/diagramCavas/CMakeLists.txt b/diagramCavas/CMakeLists.txt index 58e2e4b..53f1dd2 100644 --- a/diagramCavas/CMakeLists.txt +++ b/diagramCavas/CMakeLists.txt @@ -19,6 +19,7 @@ set(DIAGRAMCAVAS_HEADER_FILES include/ptExtraInfoDlg.h include/ctExtraInfoDlg.h include/projectModelSetting.h + include/projectDiagramNameInput.h include/diagramEditor/editPanel.h include/diagramEditor/editView.h include/diagramEditor/editScene.h @@ -57,6 +58,7 @@ set(DIAGRAMCAVAS_HEADER_FILES include/util/selectorManager.h include/util/subMovingSelector.h ../common/include/httpInterface.h + ../common/include/tools.h ../common/include/global.h ../common/include/baseProperty.h ../common/include/compiler.hpp @@ -82,6 +84,7 @@ set(DIAGRAMCAVAS_SOURCE_FILES source/ptExtraInfoDlg.cpp source/ctExtraInfoDlg.cpp source/projectModelSetting.cpp + source/projectDiagramNameInput.cpp source/diagramEditor/editPanel.cpp source/diagramEditor/editView.cpp source/diagramEditor/editScene.cpp @@ -121,6 +124,7 @@ set(DIAGRAMCAVAS_SOURCE_FILES source/util/subMovingSelector.cpp ../common/source/httpInterface.cpp ../common/source/baseProperty.cpp + ../common/source/tools.cpp ) set(UI_FILES @@ -132,6 +136,7 @@ set(UI_FILES ui/editorSettingDlg.ui ui/diagramEditorWizard.ui ui/projectModelSetting.ui + ui/projectDiagramNameInput.ui ) if(${QT_VERSION_MAJOR} GREATER_EQUAL 6) diff --git a/diagramCavas/include/drawingPanel.h b/diagramCavas/include/drawingPanel.h index b88950b..11818bc 100644 --- a/diagramCavas/include/drawingPanel.h +++ b/diagramCavas/include/drawingPanel.h @@ -15,6 +15,7 @@ class SelectorManager; class GraphicsItemGroup; class StatusBar; class PowerEntity; +class ProjectDiagramNameInput; class DrawingPanel : public QWidget { @@ -45,12 +46,15 @@ public: QJsonObject getDiagramInfo() const; //返回图元位置信息 void loadNodes(QJsonObject obj); //加载图元信息 void saveNodes(int pageId); //保存到数据库 + + DesignerScene* getScene() {return m_pGraphicsScene;} signals: void panelDelete(const QString&); protected: void closeEvent(QCloseEvent *closeEvent); public slots: void onSignal_addGraphicsItem(modelStateInfo&); + void onSignal_Generate(); //由基模组态生成工程模组态 private: Ui::drawingPanel *ui; DesignerView* m_pGraphicsView; @@ -61,6 +65,7 @@ private: DiagramMode _mode; QString _name; PowerEntity* _pEntity; //组态图拓扑对象 + ProjectDiagramNameInput* m_pDiagramNameInputer; }; #endif diff --git a/diagramCavas/include/graphicsDataModel/fixedPortsModel.h b/diagramCavas/include/graphicsDataModel/fixedPortsModel.h index ca4ef0f..c5d98c7 100644 --- a/diagramCavas/include/graphicsDataModel/fixedPortsModel.h +++ b/diagramCavas/include/graphicsDataModel/fixedPortsModel.h @@ -44,6 +44,7 @@ public: //QJsonObject saveNode(QUuid const) const; void saveNode(int nPageId); void setScene(DesignerScene* p){_scene = p;} + DesignerScene* getScene() {return _scene;} void setTopWidget(DrawingPanel* p) {_widget = p;} QWidget* getTopWidget(); QPointF getTerminalPos(const QString& sTerminalId); //获取拓扑接线点在当前diagram中的位置 @@ -69,7 +70,8 @@ public: BaseModelProperty* addBaseNodeData(QUuid id,int type,QString name,QString metaName); //添加图元基模数据 void showProjectModelSettingDlg(GraphicsBaseModelItem*); //在基模拓扑图上打开工程模设置对话框 - void generateProjectModel(const QString&,QList); //由基模生成工程模 + void generateProjectModel(const QString&,QList); //由基模生成工程模 + void addProjectItemByBaseData(DrawingPanel*,GraphicsBaseModelItem*,BaseProperty*); //从基模item生成工程模item void addTestData(); //生成测试基模 Q_SIGNALS: void activatePage(const QString&); //激活当前model所在page @@ -83,7 +85,6 @@ public Q_SLOTS: void onSignal_ifExits(QUuid id,const QString&,int type,GraphicsProjectModelItem*); //判断用户输入的名称是否已存在 void onTimeOut(); void onSignal_GetPointData(QString type,QMap map); - private: QMap _nodeItem; //工程模对象 diff --git a/diagramCavas/include/graphicsItem/electricSvgItem.h b/diagramCavas/include/graphicsItem/electricSvgItem.h index 41eeda7..fc384af 100644 --- a/diagramCavas/include/graphicsItem/electricSvgItem.h +++ b/diagramCavas/include/graphicsItem/electricSvgItem.h @@ -13,12 +13,12 @@ public: void resize(int,double, double, const QPointF&); void updateCoordinate(); void move(const QPointF&); + virtual void loadSvg(const QByteArray& data); protected: virtual QPainterPath shape(); virtual void editShape(int, const QPointF&); virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*); - virtual void loadSvg(const QString&); protected: QRectF m_lastBoudingRect; //记录上一时刻的boundingRect QSvgRenderer* m_pRender; diff --git a/diagramCavas/include/graphicsItem/graphicsBaseItem.h b/diagramCavas/include/graphicsItem/graphicsBaseItem.h index 3c0bad6..8f7e9dc 100644 --- a/diagramCavas/include/graphicsItem/graphicsBaseItem.h +++ b/diagramCavas/include/graphicsItem/graphicsBaseItem.h @@ -461,8 +461,6 @@ public: virtual bool itemChanged() const {return _itemChanged;} virtual void setItemType(GraphicsItemType type){m_Itemtype = type;} virtual GraphicsItemType getItemType() const {return m_Itemtype;} - virtual void setInnerType(int type){m_inerType = type;} - virtual int getInnerType() const {return m_inerType;} virtual void renderSelectBackground(QPainter*); virtual ItemPort* getPortById(QString) const; virtual ItemPort* getPortPtr(int) const; @@ -475,7 +473,6 @@ public slots: protected: QUuid m_itemId; GraphicsItemType m_Itemtype; //显示类型 - int m_inerType; //实际类型 ModelProperty* _property; PowerEntity* _pEntity; //图元拓扑 bool _itemChanged; //图元变化标志,判断是否需要保存 diff --git a/diagramCavas/include/powerTerminal.h b/diagramCavas/include/powerTerminal.h index efcfda2..ce6c38b 100644 --- a/diagramCavas/include/powerTerminal.h +++ b/diagramCavas/include/powerTerminal.h @@ -41,6 +41,8 @@ public: QJsonObject toJson() const; static PowerTerminal* fromJson(const QJsonObject& json, QObject* parent = nullptr); + void setGenerateBy(const QString& sName) {m_generateBy = sName;} + QString getGenerateBy() {return m_generateBy;} signals: void positionChanged(const QPointF& newPosition); @@ -50,5 +52,6 @@ private: const TerminalType m_type; QString m_name; QPointF m_relativePosition; + QString m_generateBy; //被哪个Terminal生成 }; #endif //POWERTERMINAL_H diff --git a/diagramCavas/include/projectDiagramNameInput.h b/diagramCavas/include/projectDiagramNameInput.h new file mode 100644 index 0000000..539bff8 --- /dev/null +++ b/diagramCavas/include/projectDiagramNameInput.h @@ -0,0 +1,30 @@ +#ifndef PROJECTDIAGRAMNAMEINPUT_H +#define PROJECTDIAGRAMNAMEINPUT_H + +#include + +QT_BEGIN_NAMESPACE +namespace Ui { class projectDiagramNameInput; } +QT_END_NAMESPACE + +class FixedPortsModel; + +class ProjectDiagramNameInput : public QDialog +{ + Q_OBJECT +public: + ProjectDiagramNameInput(QWidget *parent = nullptr); + ~ProjectDiagramNameInput(); + + void initial(); + void setModel(FixedPortsModel* p) {_model = p;} +public slots: + void onOkClicked(); + void onCancelClicked(); + void onNameEdited(const QString&); +private: + Ui::projectDiagramNameInput *ui; + FixedPortsModel* _model; +}; + +#endif diff --git a/diagramCavas/include/projectModelSetting.h b/diagramCavas/include/projectModelSetting.h index 76e9205..6663b6d 100644 --- a/diagramCavas/include/projectModelSetting.h +++ b/diagramCavas/include/projectModelSetting.h @@ -8,6 +8,7 @@ namespace Ui { class projectModelSetting; } QT_END_NAMESPACE class GraphicsBaseModelItem; +class BaseModelProperty; class ProjectModelSetting : public QDialog { @@ -17,16 +18,27 @@ public: ~ProjectModelSetting(); void initial(); + void loadPicture(); + void setSelectedItems(QStringList); void showDlg(GraphicsBaseModelItem*); + void loadProject(const QString& sMeta); protected: void onOkClicked(); void onCancelClicked(); void onSaveAsClicked(); + void onSelectClicked(); //选择图片 void onAddClicked(); //添加属性 void onDecreaseClicked(); //减少属性 +public slots: + void onSaveAsFinished(); //另存输入完毕 + void onCurrentTextChanged(const QString&); +private: + void showTestPic(QByteArray); private: Ui::projectModelSetting *ui; + BaseModelProperty* _curItemData; //当前操作对象的属性 + QString _curPath; }; #endif diff --git a/diagramCavas/include/statusBar.h b/diagramCavas/include/statusBar.h index a9ab80f..ca3afc1 100644 --- a/diagramCavas/include/statusBar.h +++ b/diagramCavas/include/statusBar.h @@ -4,6 +4,7 @@ #include class QLabel; +class QPushButton; class StatusBar : public QStatusBar { @@ -12,9 +13,16 @@ class StatusBar : public QStatusBar public: explicit StatusBar(QWidget *parent = nullptr); ~StatusBar(); + + void initial(); + void setButtonVisible(bool); +signals: + void generateDiagram(); public slots: void onScaleLevelChanged(double f); + void onGenerateClicked(); private: QLabel *m_pScaleLevel; + QPushButton *m_pButtonGenerate; }; #endif // STATUSBAR_H diff --git a/diagramCavas/source/drawingPanel.cpp b/diagramCavas/source/drawingPanel.cpp index 43bb3d6..d915c56 100644 --- a/diagramCavas/source/drawingPanel.cpp +++ b/diagramCavas/source/drawingPanel.cpp @@ -11,6 +11,7 @@ #include "dataBase.h" #include "powerEntity.h" #include "topologyManager.h" +#include "projectDiagramNameInput.h" DrawingPanel::DrawingPanel(PowerEntity* pEntity,QWidget *parent,DiagramMode mode) : QWidget(parent) @@ -18,6 +19,7 @@ DrawingPanel::DrawingPanel(PowerEntity* pEntity,QWidget *parent,DiagramMode mode ,_pModel(nullptr) ,_mode(mode) ,_pEntity(pEntity) + ,m_pDiagramNameInputer(nullptr) { ui->setupUi(this); @@ -37,9 +39,11 @@ DrawingPanel::DrawingPanel(PowerEntity* pEntity,QWidget *parent,DiagramMode mode _pModel->setScene(m_pGraphicsScene); m_pStatusBar = new StatusBar(this); + if(mode == DM_edit) + m_pStatusBar->setButtonVisible(false); ui->mainLayout->addWidget(m_pStatusBar); connect(m_pGraphicsView,&DesignerView::onScaleChanged,m_pStatusBar,&StatusBar::onScaleLevelChanged); - + connect(m_pStatusBar,&StatusBar::generateDiagram,this,&DrawingPanel::onSignal_Generate); } DrawingPanel::~DrawingPanel() @@ -162,6 +166,15 @@ void DrawingPanel::onSignal_addGraphicsItem(modelStateInfo& info) } } +void DrawingPanel::onSignal_Generate() +{ + if(m_pDiagramNameInputer == nullptr){ + m_pDiagramNameInputer = new ProjectDiagramNameInput(this); + m_pDiagramNameInputer->setModel(_pModel); + } + m_pDiagramNameInputer->show(); +} + QJsonObject DrawingPanel::getDiagramInfo() const { QJsonObject obj; diff --git a/diagramCavas/source/graphicsDataModel/fixedPortsModel.cpp b/diagramCavas/source/graphicsDataModel/fixedPortsModel.cpp index 08443e8..d2dbfd0 100644 --- a/diagramCavas/source/graphicsDataModel/fixedPortsModel.cpp +++ b/diagramCavas/source/graphicsDataModel/fixedPortsModel.cpp @@ -107,7 +107,7 @@ void FixedPortsModel::addNodeItem(QUuid id/*,int type*/,QPointF pos) pro = mapData[id]; if(pro) { - int type = pro->type(); + int type = pro->graphicsType(); if(type == GIT_itemTri) { item = new ElectricSvgItemTriangle(QRect(-15, -15, 30, 30)); @@ -783,6 +783,7 @@ void FixedPortsModel::createTopoTerminalsByItem(GraphicsBaseItem* pItem,ModelFun default: break; } + QPointF f = port->pos(); TopologyManager::instance().createTerminal(pEntity->id(),terType,"",port->pos(),port->getId(),funType); } } @@ -906,7 +907,7 @@ void FixedPortsModel::showProjectModelSettingDlg(GraphicsBaseModelItem* srcItem) m_proModelSettingDlg->showDlg(srcItem); } -void FixedPortsModel::generateProjectModel(const QString& sPageName,QList lstData) +void FixedPortsModel::generateProjectModel(const QString& sPageName,QList lstItem) { DrawingPanel* pProPanel = nullptr; if(_cavas){ @@ -919,19 +920,117 @@ void FixedPortsModel::generateProjectModel(const QString& sPageName,QListgetPanel(sPageName); } - for(auto& pBase:lstData) + for(auto& pBaseItem:lstItem) //首次循环处理所有非连线对象 { - QUuid id = QUuid::createUuid(); - BaseProperty* pData = addNodeData(id,pBase->type(),pBase->name(),pBase->modelName()); - if(pData) - { - //pitem->setProperty(pData); - pData->setDataChanged(true); //数据状态改变 + 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); + } + } + } - PowerEntity* pEntity = TopologyManager::instance().createEntity(EntityType::Component,id.toString(),pBase->name()); - //if(pEntity) - //pitem->setEntity(pEntity); - //createTopoTerminalsByItem(pitem); //创建item对象的逻辑接线点 + 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); + } + } + } +} + +void FixedPortsModel::addProjectItemByBaseData(DrawingPanel* pPanel,GraphicsBaseModelItem* pBaseItem,BaseProperty* pPro) +{ + BaseModelProperty* pBase = dynamic_cast(pBaseItem->getProperty()); + if(pBase){ + if(_baseItem.contains(pBase->uuid())){ + GraphicsProjectModelItem* pProItem = nullptr; + GraphicsBaseModelItem* pBaseItem = _baseItem.value(pBase->uuid()); + int type = pBase->graphicsType(); + if(type == GIT_baseBus) + { + QRectF rec = pBaseItem->boundingRect(); + pProItem = new ElectricSvgItemBus(rec.toRect()); + pProItem->setItemType(GIT_bus); + QByteArray svg = pBase->getModelProperty().modelSetting.mapSvg.first(); + } + else if(type == GIT_baseBreaker) + { + QRectF rec = pBaseItem->boundingRect(); + pProItem = new ElectricSvgItemRect(rec.toRect()); + pProItem->setItemType(GIT_itemRect); + QByteArray svg = pBase->getModelProperty().modelSetting.mapSvg.first(); + } + + if(pBase->graphicsType() == GIT_baseLine) + { + + } + else + { + PowerEntity* pEntity = TopologyManager::instance().createEntity(EntityType::Component,pPro->uuid().toString(),pBase->name()); + QList lstBase = TopologyManager::instance().getTerminalsForEntity(pBase->uuid().toString(),ModelFunctionType::BaseModel); //获取基模的逻辑点 + for(auto& baseTer:lstBase) + { + QUuid uid = QUuid::createUuid(); + PowerTerminal* proTer = TopologyManager::instance().createTerminal(pEntity->id(),baseTer->type(),"",baseTer->relativePosition(),uid.toString(),ModelFunctionType::ProjectModel); + proTer->setGenerateBy(baseTer->id()); + if(proTer->type() == TerminalType::PowerConnect) + { + pProItem->addPort(p_movable,proTer->relativePosition(),proTer->id()); + } + else if(proTer->type() == TerminalType::PowerInput || proTer->type() == TerminalType::PowerOutput) + { + HandleType typ; + if(proTer->type() == TerminalType::PowerInput){ + typ = T_lineIn; + } + else{ + typ = T_lineOut; + } + QPointF pos = proTer->relativePosition(); + PortPos locate; + if(pos.x() < 0) + { + locate = P_left; + } + else if(pos.x() > 0) + { + locate = P_right; + } + else if(pos.y() > 0) + { + locate = P_top; + } + else if(pos.y() < 0) + { + locate = P_down; + } + pProItem->addPort(P_const,pos,proTer->id(),typ,locate); + } + } + + pProItem->setItemId(QUuid(pEntity->id())); + pProItem->updateHandles(); + pProItem->setPos(pBaseItem->pos()); + pPanel->getScene()->addItem(pProItem); + pProItem->setProperty(pPro); //绑定模型 + pProItem->updateByProperty(); //使用模型更新自身 + //QString sModel = _projectModelName.value(id.toString()); + QString sModel = pBase->getModelProperty().modelSetting.modelName; + pProItem->setModelName(sModel); + pPanel->getModel()->addNodeItem(QUuid(pEntity->id()),pProItem); + } } } } @@ -942,18 +1041,17 @@ void FixedPortsModel::addTestData() ElectricBaseModelSvgItem* pBreaker = new ElectricBaseModelSvgItem(QRect(-15, -15, 30, 30)); pBreaker->setItemId(breakerId); pBreaker->setItemType(GIT_baseBreaker); - pBreaker->setInnerType(3); - pBreaker->initialPortsByDatabase(); QByteArray byte = DataBase::GetInstance()->ModelType()[3].icon; pBreaker->loadSvg(byte); PowerEntity* pEntityBreaker = TopologyManager::instance().createEntity(EntityType::Component,breakerId.toString(),"断路器1",ModelFunctionType::BaseModel); if(pEntityBreaker) pBreaker->setEntity(pEntityBreaker); - createTopoTerminalsByItem(pBreaker,ModelFunctionType::BaseModel); BaseModelProperty* pBreakerData = addBaseNodeData(breakerId,3,"断路器1",DataBase::GetInstance()->ModelType()[3].modelType); if(pBreakerData) { pBreaker->setProperty(pBreakerData); + pBreaker->initialPortsByDatabase(); + createTopoTerminalsByItem(pBreaker,ModelFunctionType::BaseModel); pBreakerData->setDataChanged(true); //数据状态改变 } addBaseItem(breakerId,pBreaker); @@ -965,7 +1063,6 @@ void FixedPortsModel::addTestData() ElectricBaseModelSvgBus* pBus = new ElectricBaseModelSvgBus(QRect(-200, -3, 400, 6)); pBus->setItemId(busId); pBus->setItemType(GIT_baseBus); - pBus->setInnerType(1); //pBreaker->initialPortsByDatabase(); QByteArray byte1 = DataBase::GetInstance()->ModelType()[1].icon; pBus->loadSvg(byte1); @@ -987,8 +1084,7 @@ void FixedPortsModel::addTestData() ElectricBaseModelLineItem* pLine = new ElectricBaseModelLineItem(); pLine->setItemId(lineId); pLine->setItemType(GIT_baseLine); - pLine->setInnerType(4); - BaseModelProperty* pLineData = addBaseNodeData(lineId,4,"电缆1",DataBase::GetInstance()->ModelType()[4].modelType); + BaseModelProperty* pLineData = addBaseNodeData(lineId,8,"电缆1",DataBase::GetInstance()->ModelType()[4].modelType); if(pLineData) { pLine->setProperty(pLineData); diff --git a/diagramCavas/source/graphicsItem/electricSvgItem.cpp b/diagramCavas/source/graphicsItem/electricSvgItem.cpp index 3773798..21fe1bb 100644 --- a/diagramCavas/source/graphicsItem/electricSvgItem.cpp +++ b/diagramCavas/source/graphicsItem/electricSvgItem.cpp @@ -76,11 +76,6 @@ void ElectricSvgItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* o } } -void ElectricSvgItem::loadSvg(const QString& str) -{ - m_pRender = new QSvgRenderer(str); -} - void ElectricSvgItem::resize(int nHandle,double dSX, double dSY, const QPointF& basePoint) { switch (nHandle) @@ -115,6 +110,11 @@ void ElectricSvgItem::move(const QPointF& point) moveBy(point.x(), point.y()); } +void ElectricSvgItem::loadSvg(const QByteArray& data) +{ + m_pRender = new QSvgRenderer(data); +} + void ElectricSvgItem::editShape(int nHandle,const QPointF& ptMouse) { prepareGeometryChange(); diff --git a/diagramCavas/source/graphicsItem/electricSvgItemBus.cpp b/diagramCavas/source/graphicsItem/electricSvgItemBus.cpp index 5c2df02..b09632b 100644 --- a/diagramCavas/source/graphicsItem/electricSvgItemBus.cpp +++ b/diagramCavas/source/graphicsItem/electricSvgItemBus.cpp @@ -10,7 +10,7 @@ ElectricSvgItemBus::ElectricSvgItemBus(const QRect &rect, QGraphicsItem *parent) : ElectricSvgItem(rect,parent) { - loadSvg(":/images/element/svg_bus.svg"); + //loadSvg(":/images/element/svg_bus.svg"); setHandleIfShow(H_textCaption,false); setHandleVisible(false); setFunctionHandleIfShow(false); diff --git a/diagramCavas/source/graphicsItem/electricSvgItemRect.cpp b/diagramCavas/source/graphicsItem/electricSvgItemRect.cpp index 3f0359b..b6e055d 100644 --- a/diagramCavas/source/graphicsItem/electricSvgItemRect.cpp +++ b/diagramCavas/source/graphicsItem/electricSvgItemRect.cpp @@ -10,7 +10,7 @@ ElectricSvgItemRect::ElectricSvgItemRect(const QRect &rect, bool genNewPort, QGraphicsItem *parent) : ElectricSvgItem(rect,parent) { - loadSvg(":/images/element/svg_rect.svg"); + //loadSvg(":/images/element/svg_rect.svg"); setHandleIfShow(H_textCaption,false); setHandleIfShow(H_textCurrent,false); setHandleIfShow(h_textVoltage,false); diff --git a/diagramCavas/source/graphicsItem/electricSvgItemTriangle.cpp b/diagramCavas/source/graphicsItem/electricSvgItemTriangle.cpp index 75c6331..26850dc 100644 --- a/diagramCavas/source/graphicsItem/electricSvgItemTriangle.cpp +++ b/diagramCavas/source/graphicsItem/electricSvgItemTriangle.cpp @@ -7,7 +7,7 @@ ElectricSvgItemTriangle::ElectricSvgItemTriangle(const QRect &rect, QGraphicsItem *parent) : ElectricSvgItem(rect,parent) { - loadSvg(":/images/element/svg_triangle.svg"); + //loadSvg(":/images/element/svg_triangle.svg"); setHandleIfShow(H_textCaption,false); setHandleVisible(false); setFunctionHandleIfShow(false); diff --git a/diagramCavas/source/graphicsItem/graphicsBaseItem.cpp b/diagramCavas/source/graphicsItem/graphicsBaseItem.cpp index 036b450..edf46b0 100644 --- a/diagramCavas/source/graphicsItem/graphicsBaseItem.cpp +++ b/diagramCavas/source/graphicsItem/graphicsBaseItem.cpp @@ -158,9 +158,13 @@ void GraphicsBaseItem::initialPortsByDatabase() { QMap mapType = DataBase::GetInstance()->getAllComponentType(); - if(mapType.contains(m_inerType)) + if(_property == nullptr){ + qDebug()<<"item property null"; + return; + } + if(mapType.contains(_property->type())) { - QJsonArray nodesJsonArray = mapType[m_inerType].config["port"].toArray(); + QJsonArray nodesJsonArray = mapType[_property->type()].config["port"].toArray(); for (QJsonValueRef nodeJson : nodesJsonArray) { diff --git a/diagramCavas/source/projectDiagramNameInput.cpp b/diagramCavas/source/projectDiagramNameInput.cpp new file mode 100644 index 0000000..7ab3174 --- /dev/null +++ b/diagramCavas/source/projectDiagramNameInput.cpp @@ -0,0 +1,51 @@ +#include +#include "projectDiagramNameInput.h" +#include "dataBase.h" +#include "ui_projectDiagramNameInput.h" + +ProjectDiagramNameInput::ProjectDiagramNameInput(QWidget *parent) + : QDialog(parent) + ,ui(new Ui::projectDiagramNameInput) + ,_model(nullptr) +{ + ui->setupUi(this); + this->setWindowFlags(Qt::FramelessWindowHint | windowFlags()); + initial(); +} + +ProjectDiagramNameInput::~ProjectDiagramNameInput() +{ + +} + +void ProjectDiagramNameInput::initial() +{ + connect(ui->btn_ok,&QPushButton::clicked,this,&ProjectDiagramNameInput::onOkClicked); + connect(ui->btn_cancel,&QPushButton::clicked,this,&ProjectDiagramNameInput::onCancelClicked); + connect(ui->le_name,&QLineEdit::textEdited,this,&ProjectDiagramNameInput::onNameEdited); +} + +void ProjectDiagramNameInput::onOkClicked() +{ + if(DataBase::GetInstance()->getPageIdByName(ui->le_name->text()) != -1) + { + hide(); + } +} + +void ProjectDiagramNameInput::onCancelClicked() +{ + hide(); +} + +void ProjectDiagramNameInput::onNameEdited(const QString& text) +{ + if(_model) + { + if(DataBase::GetInstance()->getPageIdByName(text) == -1){ //不存在,可以创建 + ui->label_info->setText("名称可用"); + }else{ + ui->label_info->setText("名称重复!"); + } + } +} diff --git a/diagramCavas/source/projectModelSetting.cpp b/diagramCavas/source/projectModelSetting.cpp index e811464..a7cbac3 100644 --- a/diagramCavas/source/projectModelSetting.cpp +++ b/diagramCavas/source/projectModelSetting.cpp @@ -1,13 +1,27 @@ +#include +#include +#include +#include +#include +#include +#include #include "projectModelSetting.h" #include "ui_projectModelSetting.h" -#include +#include "baseProperty.h" +#include "graphicsItem/graphicsBaseItem.h" +#include "projectModelManager.h" +#include "tools.h" +#include "global.h" +#include "logger.h" ProjectModelSetting::ProjectModelSetting(QWidget *parent) : QDialog(parent) ,ui(new Ui::projectModelSetting) + ,_curItemData(nullptr) { - setWindowFlags(Qt::Widget); + ui->setupUi(this); this->setWindowFlags(Qt::FramelessWindowHint | windowFlags()); + initial(); } ProjectModelSetting::~ProjectModelSetting() @@ -20,14 +34,100 @@ void ProjectModelSetting::initial() connect(ui->btn_ok,&QPushButton::clicked,this,&ProjectModelSetting::onOkClicked); connect(ui->btn_cancel,&QPushButton::clicked,this,&ProjectModelSetting::onCancelClicked); connect(ui->btn_saveAs,&QPushButton::clicked,this,&ProjectModelSetting::onSaveAsClicked); + connect(ui->btn_select,&QPushButton::clicked,this,&ProjectModelSetting::onSelectClicked); connect(ui->btn_apply,&QPushButton::clicked,this,&ProjectModelSetting::onAddClicked); connect(ui->btn_revoke,&QPushButton::clicked,this,&ProjectModelSetting::onDecreaseClicked); + + connect(ui->le_saveAs,&QLineEdit::editingFinished,this,&ProjectModelSetting::onSaveAsFinished); + connect(ui->cb_modelType,&QComboBox::currentTextChanged,this,&ProjectModelSetting::onCurrentTextChanged); + _curPath = QCoreApplication::applicationDirPath()+"/proModelImage/"; + ui->cb_modelType->setPlaceholderText(" "); +} + +void ProjectModelSetting::loadPicture() +{ + ui->listWidget_icon->clear(); + QString path = _curPath+_curItemData->metaModelName()+"/"; + QDir dir(path); + QStringList namefiles; + namefiles<<"*.png"<<"*.svg"; + + QStringList files=dir.entryList(namefiles,QDir::Files|QDir::Readable,QDir::Name); + //动态添加item到QListWidget里 + for(int i=0;isetData(Qt::UserRole + 1,svgData); //item附带二进制数据 + QFileInfo fi(path+files.at(i)); //获取文件信息 + newitem->setText(fi.baseName());//Returns the base name of the file without the path + newitem->setTextAlignment(Qt::AlignHCenter);//设置文字对齐方式:水平居中 + ui->listWidget_icon->addItem(newitem); + } +} + +void ProjectModelSetting::setSelectedItems(QStringList lst) +{ + QList lstItem = ui->listWidget_icon->findItems(lst.first(),Qt::MatchExactly); + if(!lstItem.empty()) + { + ui->listWidget_icon->setCurrentItem(lstItem.first()); + } } void ProjectModelSetting::showDlg(GraphicsBaseModelItem* srcNode) { show(); + ui->treeView_base->setModel(nullptr); + ui->treeView_sub->setModel(nullptr); + ModelProperty* p = srcNode->getProperty(); + BaseModelProperty* pro = dynamic_cast(p); + if(pro) + { + QString sName = pro->name(); + QString sMetaModel = pro->metaModelName(); + QString sModel = pro->modelName(); + _curItemData = pro; + loadProject(sMetaModel); + + bool bExist = ProjectModelManager::instance().ifProjectExsit(sModel); + if(bExist){ //使用存在的属性 + ui->cb_modelType->setCurrentText(sModel); + } + else{ //新建当前对象的属性 + if(pro->getModelProperty().pBase == nullptr && pro->getModelProperty().pSelect == nullptr){ + pro->getModelProperty().pBase = new QStandardItemModel(this); + pro->getModelProperty().pSelect = new QStandardItemModel(this); + pro->getModelProperty().mapProperty = ProjectModelManager::instance().addNewProject(sMetaModel,sModel,pro->getModelProperty()); + } + ui->treeView_base->setModel(pro->getModelProperty().pBase); + ui->treeView_sub->setModel(pro->getModelProperty().pSelect); + ui->treeView_sub->expandAll(); + ui->treeView_base->expandAll(); + } + ui->le_saveAs->clear(); + ui->le_name->setText(sName); + ui->le_base->setText(sMetaModel); + } + loadPicture(); +} + +void ProjectModelSetting::loadProject(const QString& sMeta) +{ + ui->cb_modelType->blockSignals(true); + ui->cb_modelType->clear(); + QStringList lst = ProjectModelManager::instance().getProjectModelLst(sMeta); + ui->cb_modelType->addItems(lst); + ui->cb_modelType->blockSignals(false); } void ProjectModelSetting::onOkClicked() @@ -42,15 +142,176 @@ void ProjectModelSetting::onCancelClicked() void ProjectModelSetting::onSaveAsClicked() { + QString sModelName = ui->le_saveAs->text(); + bool bExist = ProjectModelManager::instance().ifProjectExsit(sModelName); + if(bExist){ + QMessageBox::information(NULL, QString("提示"), QString::fromWCharArray(L"该模型已存在")); + } + else{ //新建的模型拷贝当前内容到全局队列 + _curItemData->getModelProperty().modelSetting.modelName = sModelName; + PropertyModel pro = _curItemData->getModelProperty().deepCopy(); + ProjectModelManager::instance().getData()[_curItemData->metaModelName()].insert(sModelName,pro); + ProjectModelManager::instance().generate(_curItemData->metaModelName(),sModelName); + ProjectModelManager::instance().updateSetting(_curItemData->metaModelName(),sModelName); + ui->cb_modelType->blockSignals(true); + ui->cb_modelType->addItem(sModelName); + ui->cb_modelType->setCurrentText(sModelName); + ui->cb_modelType->blockSignals(false); + QMessageBox::information(NULL, QString("提示"), QString::fromWCharArray(L"另存成功")); + } + ui->label_info->clear(); +} +void ProjectModelSetting::onSelectClicked() +{ + QList items = ui->listWidget_icon->selectedItems(); + for(auto& item:items) + { + if(!_curItemData->getModelProperty().modelSetting.mapSvg.contains(item->text())) + { + QByteArray data = item->data(Qt::UserRole + 1).toByteArray(); + _curItemData->getModelProperty().modelSetting.mapSvg.insert(item->text(),data); + ui->label_infoIcon->setText("当前选择:"+item->text()); + } + } } void ProjectModelSetting::onAddClicked() { + if(_curItemData == nullptr) + return; + QModelIndex selected = ui->treeView_base->currentIndex(); + QStandardItem* pItem = _curItemData->getModelProperty().pBase->itemFromIndex(selected); + if(pItem) + { + int nLevel = getLevel(pItem); + if(nLevel != 1) //不是二级节点就返回 + return; + else{ + QString strGroup = pItem->parent()->text(); + + QStandardItem *parentItem = pItem->parent(); + if (parentItem) { + parentItem->takeRow(pItem->row()); + } + + QList groupItem = _curItemData->getModelProperty().pSelect->findItems(strGroup); + if(groupItem.isEmpty()) //已选对象中是否存在该组,没有则添加 + { + QStandardItem* pGroup = new QStandardItem(strGroup); + _curItemData->getModelProperty().pSelect->appendRow(pGroup); + pGroup->appendRow(pItem); + } + else{ + QStandardItem* pGroup = groupItem[0]; + pGroup->appendRow(pItem); + } + + _curItemData->getModelProperty().mapProperty[strGroup].mCheckState[pItem->text()].checkState = true; //选择状态设为1 + } + } + + ui->treeView_sub->expandAll(); + ui->treeView_base->expandAll(); } void ProjectModelSetting::onDecreaseClicked() { + if(_curItemData == nullptr) + return; + QStringList lstPub = ProjectModelManager::instance().getPublicGroupList(); + QModelIndex selected = ui->treeView_sub->currentIndex(); + QStandardItem* pItem = _curItemData->getModelProperty().pSelect->itemFromIndex(selected); + if(pItem) + { + if(lstPub.contains(pItem->parent()->text())){ + QMessageBox::information(NULL, QString("提示"), QString::fromWCharArray(L"公共属性无法编辑")); + return; + } + int nLevel = getLevel(pItem); + if(nLevel != 1) //不是二级节点就返回 + return; + else{ + QString strGroup = pItem->parent()->text(); + + QStandardItem *parentItem = pItem->parent(); + if (parentItem) { + parentItem->takeRow(pItem->row()); + if(!parentItem->hasChildren()){ + _curItemData->getModelProperty().pSelect->takeRow(parentItem->row()); + } + } + + QList groupItem = _curItemData->getModelProperty().pBase->findItems(strGroup); + if(groupItem.isEmpty()) //已选对象中是否存在该组,没有则添加 + { + QStandardItem* pGroup = new QStandardItem(strGroup); + _curItemData->getModelProperty().pBase->appendRow(pGroup); + pGroup->appendRow(pItem); + } + else{ + QStandardItem* pGroup = groupItem[0]; + pGroup->appendRow(pItem); + } + + _curItemData->getModelProperty().mapProperty[strGroup].mCheckState[pItem->text()].checkState = false; //选择状态设为1 + } + } + + ui->treeView_base->expandAll(); +} + +void ProjectModelSetting::onSaveAsFinished() +{ + QString sModelName = ui->le_saveAs->text(); + bool bExist = ProjectModelManager::instance().ifProjectExsit(sModelName); + if(bExist){ + ui->label_info->setText(QString::fromWCharArray(L"名称已存在")); + } + else{ + ui->label_info->setText(QString::fromWCharArray(L"名称可用")); + } +} + +void ProjectModelSetting::onCurrentTextChanged(const QString& text) +{ + if(text.isEmpty()) + return; + if(_curItemData) + { + _curItemData->getModelProperty().release(); + PropertyModel model = ProjectModelManager::instance().getData()[_curItemData->metaModelName()][text].deepCopy(); + _curItemData->setModelProperty(model); + ui->treeView_base->setModel(_curItemData->getModelProperty().pBase); + ui->treeView_sub->setModel(_curItemData->getModelProperty().pSelect); + ui->treeView_sub->expandAll(); + ui->treeView_base->expandAll(); + loadPicture(); + setSelectedItems(_curItemData->getModelProperty().modelSetting.mapSvg.keys()); + showTestPic(_curItemData->getModelProperty().modelSetting.mapSvg.first()); + } +} + +void ProjectModelSetting::showTestPic(QByteArray arr) +{ + QSvgRenderer renderer(arr); + bool a = renderer.isValid(); + qreal dipScale = qApp->devicePixelRatio(); + QSize scaledSize = ui->modelImagePreview->size() * dipScale; + //创建透明背景的高分辨率图像 + QImage image(scaledSize, QImage::Format_A2BGR30_Premultiplied); + image.fill(Qt::transparent); + //高质量渲染设置 + QPainter painter(&image); + painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform | QPainter::TextAntialiasing); + //渲染到目标对象 + renderer.render(&painter, QRect(0, 0, scaledSize.width(), scaledSize.height())); + //转换为像素图 + QPixmap pixmap = QPixmap::fromImage(image); + pixmap.setDevicePixelRatio(dipScale); + //显示图片 + ui->modelImagePreview->clear(); + ui->modelImagePreview->setPixmap(pixmap); } diff --git a/diagramCavas/source/statusBar.cpp b/diagramCavas/source/statusBar.cpp index 80ad03e..2123ffe 100644 --- a/diagramCavas/source/statusBar.cpp +++ b/diagramCavas/source/statusBar.cpp @@ -1,13 +1,18 @@ #include +#include #include "statusBar.h" StatusBar::StatusBar(QWidget *parent) : QStatusBar(parent) ,m_pScaleLevel(nullptr) + ,m_pButtonGenerate(nullptr) { m_pScaleLevel = new QLabel("当前级数:10",this); m_pScaleLevel->setMinimumWidth(250); + m_pButtonGenerate = new QPushButton("生成工程组态",this); addWidget(m_pScaleLevel); + addPermanentWidget(m_pButtonGenerate); + initial(); } StatusBar::~StatusBar() @@ -15,7 +20,22 @@ StatusBar::~StatusBar() } +void StatusBar::initial() +{ + connect(m_pButtonGenerate,&QPushButton::clicked,this,&StatusBar::onGenerateClicked); +} + +void StatusBar::setButtonVisible(bool val) +{ + setVisible(m_pButtonGenerate); +} + void StatusBar::onScaleLevelChanged(double f) { m_pScaleLevel->setText(QString::fromWCharArray(L"当前级数:")+QString::number(f)); } + +void StatusBar::onGenerateClicked() +{ + emit generateDiagram(); +} diff --git a/diagramCavas/ui/projectDiagramNameInput.ui b/diagramCavas/ui/projectDiagramNameInput.ui new file mode 100644 index 0000000..66d1147 --- /dev/null +++ b/diagramCavas/ui/projectDiagramNameInput.ui @@ -0,0 +1,222 @@ + + + projectDiagramNameInput + + + + 0 + 0 + 330 + 138 + + + + + 12 + + + + Dialog + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 25 + + + + + 16777215 + 25 + + + + background-color: rgb(200, 200, 200); + + + + 0 + + + 0 + + + + + + 12 + + + + color: rgb(0, 0, 0); + + + 输入组态图名称 + + + + + + + Qt::Orientation::Horizontal + + + + 227 + 20 + + + + + + + + + + + + 6 + + + 10 + + + 10 + + + + + Qt::Orientation::Vertical + + + + 20 + 40 + + + + + + + + + 12 + + + + color: rgb(0, 0, 0); + + + 名称 + + + + + + + + + + Qt::Orientation::Vertical + + + + 20 + 40 + + + + + + + + + + + 12 + + + + color: rgb(0, 0, 0); + + + 提示: + + + + + + + + 60 + 0 + + + + + 12 + + + + color: rgb(0, 0, 0); + + + + + + + + + + Qt::Orientation::Horizontal + + + + 40 + 20 + + + + + + + + 确定 + + + + + + + 取消 + + + + + + + + + + + + + diff --git a/diagramCavas/ui/projectModelSetting.ui b/diagramCavas/ui/projectModelSetting.ui index 1106c8d..7f13f4a 100644 --- a/diagramCavas/ui/projectModelSetting.ui +++ b/diagramCavas/ui/projectModelSetting.ui @@ -6,8 +6,8 @@ 0 0 - 634 - 596 + 814 + 723 @@ -236,23 +236,103 @@ color: rgb(8, 8, 8); 其他设置 - + 工程图标设置 - + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + QAbstractItemView::DragDropMode::DragDrop + + + + 100 + 100 + + QListView::ViewMode::IconMode + + + + + + + 80 + 0 + + + + + + + + + + + Qt::Orientation::Horizontal + + + + 40 + 20 + + + + + + + + 选择 + + + + + + + + + + 0 + 100 + + + + + 100 + 100 + + + + + + + @@ -298,7 +378,20 @@ color: rgb(8, 8, 8); - true + false + + + + + + + + 80 + 0 + + + + diff --git a/diagramUtils/include/dataBase.h b/diagramUtils/include/dataBase.h index dc6b867..1daf585 100644 --- a/diagramUtils/include/dataBase.h +++ b/diagramUtils/include/dataBase.h @@ -86,6 +86,12 @@ public: QMap ModelAttributePublic() const {return _modelAttributePublic;} QMap ModelConnectivity() const {return _modelConnectivity;} //***********工程模 + bool insertProjectSetting(const QString& baseModel,const QString& modelName,QJsonObject setting); //插入工程模设置信息(图标等选择信息) + bool updateProjectSetting(const QString& baseModel,const QString& modelName,QJsonObject setting); + QJsonObject getProjectSetting(const QString& baseModel,const QString& modelName); + QStringList getProjectWithinBase(const QString& baseModel); //获取基模下的所有工程模名称 + bool deleteProjectSetting(const QString& baseModel,const QString& modelName); + bool createProjectManager(); //生成记录表,包含工程模名称,属性组名,启用和关闭的属性字段(json类型)[一个属性组建一个表] bool insertProjectManager(const QString& name,const QString& tag,const QString& metaModel,const QString& groupName,int linkType,QJsonObject checkState,bool isPublic = false); bool updateCheckState(const QString& tableName,QJsonObject checkState); //更新属性选中状态 diff --git a/diagramUtils/include/projectModelManager.h b/diagramUtils/include/projectModelManager.h index b062d85..d3c0b08 100644 --- a/diagramUtils/include/projectModelManager.h +++ b/diagramUtils/include/projectModelManager.h @@ -23,6 +23,8 @@ public: QList getGroupSub(QStandardItemModel*,const QString&); //返回指定组下的属性(如果存在) MapMeta& getData() {return m_mapTotalData;} void deleteData(const QString& meta,const QString& proj); + void updateSetting(const QString& sMeta,const QString& sPro); //更新模型数据(图片 + QStringList getProjectModelLst(const QString& sMeta); public: QStringList getModelList() const; //获取元模型列表 QStringList getGroupList(const QString& model) const; //返回该元模下的属性组列表 @@ -42,6 +44,7 @@ private: int createPropertyTable(const QString& sMeta,const QString& sProject,const QString& sGroup,QList lstSelect,QList lstBase,int nLinkType,bool isPublic = false); //创建属性组表并插入记录到管理表(工程名,当前项迭代器,关联图元类型) QJsonObject getSelectedState(QList select,QList base); //返回json格式的选中状态 QString getItemDataType(const QStandardItem* pItem); //返回数据类型 + projectModelSetting getModelSetting(const QString& sMeta,const QString& sProject); //获取指定工程模的设定 private: MapMeta m_mapTotalData; bool _bInitialised; diff --git a/diagramUtils/source/dataBase.cpp b/diagramUtils/source/dataBase.cpp index 7cc2432..a8f74fb 100644 --- a/diagramUtils/source/dataBase.cpp +++ b/diagramUtils/source/dataBase.cpp @@ -1427,6 +1427,121 @@ bool DataBase::getModelConnectivity() } } //=================================工程模===========================================// + +bool DataBase::insertProjectSetting(const QString& baseModel,const QString& modelName,QJsonObject setting) +{ + QString strSQL = "INSERT INTO diagramui_projectmodelSetting(base_name,model_name, context) VALUES (?, ?, ?)"; + QJsonDocument contextDoc(setting); + QString strContext = contextDoc.toJson(QJsonDocument::Compact); + + QVariantList params; + params.append(baseModel); + params.append(modelName); + params.append(strContext); + try + { + executeSQL(strSQL,false,params); + return true; + } + catch (const std::exception& e) + { + LOG_ERROR("DB", QString("Insert diagramui_projectmodelSetting fail")); + return false; + } +} + +bool DataBase::updateProjectSetting(const QString& baseModel,const QString& modelName,QJsonObject setting) +{ + QJsonDocument contextDoc(setting); + QString strContext = contextDoc.toJson(QJsonDocument::Compact); + + QString strSQL = "UPDATE diagramui_projectmodelsetting SET context = ? WHERE base_name = ? AND model_name = ?"; + QVariantList params; + params.append(strContext); + params.append(baseModel); + params.append(modelName); + + try + { + executeSQL(strSQL,false,params); + return true; + } + catch (const std::exception& e) + { + LOG_ERROR("DB", QString("Update model %1 setting %2 fail").arg(modelName,strContext)); + return false; + } +} + +QJsonObject DataBase::getProjectSetting(const QString& baseModel,const QString& modelName) +{ + + QString strSQL = "SELECT context FROM diagramui_projectmodelsetting WHERE base_name = ? AND model_name = ?"; + QVariantList params; + params.append(baseModel); + params.append(modelName); + + try + { + QJsonObject obj; + QSqlQuery query = executeSQL(strSQL,false,params); + while (query.next()) + { + QString con = query.value(0).toString(); + obj= QstringToJson(con); + } + return obj; + } + catch (const std::exception& e) + { + return QJsonObject(); + } +} + +QStringList DataBase::getProjectWithinBase(const QString& baseModel) +{ + QStringList lst; + + QString strSQL = "SELECT model_name FROM diagramui_projectmodelsetting WHERE base_name = ?"; + QVariantList params; + params.append(baseModel); + + try + { + QSqlQuery query = executeSQL(strSQL,false,params); + while (query.next()) + { + QString name = query.value(0).toString(); + lst.append(name); + } + return lst; + } + catch (const std::exception& e) + { + return lst; + } +} + +bool DataBase::deleteProjectSetting(const QString& baseModel,const QString& modelName) +{ + QString strSQL = "DELETE FROM diagramui_projectmodelsetting WHERE base_name = ? AND model_name = ?"; + QVariantList params; + params.append(baseModel); + params.append(modelName); + + try + { + executeSQL(strSQL,false,params); + LOG_INFO("DB", QString("Delete row %1 success").arg(modelName)); + return true; + } + catch (const std::exception& e) + { + LOG_ERROR("DB", QString("Delete row %1 failed").arg(modelName)); + return false; + } +} + bool DataBase::createProjectManager() { QString strSQL = R"( diff --git a/diagramUtils/source/projectModelManager.cpp b/diagramUtils/source/projectModelManager.cpp index 3962276..04317f0 100644 --- a/diagramUtils/source/projectModelManager.cpp +++ b/diagramUtils/source/projectModelManager.cpp @@ -27,30 +27,28 @@ void ProjectModelManager::initialModel() if(_bInitialised) return; QStringList lstModel = getModelList(); - for(auto &model:lstModel) + for(auto &sModel:lstModel) { MapProject mp; - QMap mapProject = DataBase::GetInstance()->getProjectFromManager(model); + QMap mapProject = DataBase::GetInstance()->getProjectFromManager(sModel); QMap::Iterator iter; for(iter = mapProject.begin();iter != mapProject.end(); ++iter) { - //QStandardItem* propertyItem = new QStandardItem(iter.key()); - PropertyModel pm; pm.pBase = new QStandardItemModel(this); pm.pSelect = new QStandardItemModel(this); - pm.mapProperty = addNewProject(model,iter.key(),pm); + pm.mapProperty = addNewProject(sModel,iter.key(),pm); pm.nType = iter.value(); - pm.formerMeta.sName = model; + pm.formerMeta.sName = sModel; pm.formerProject.sName = iter.key(); pm.dataInfo = DataBase::GetInstance()->getProjectModelGroupInfo(iter.key()); + pm.modelSetting = getModelSetting(sModel,iter.key()); mp.insert(iter.key(),pm); } - //todo:读取存储,按分类遍历名称 - m_mapTotalData.insert(model,mp); + m_mapTotalData.insert(sModel,mp); } _bInitialised = true; @@ -266,6 +264,42 @@ void ProjectModelManager::deleteData(const QString& sMeta,const QString& sProjec m_mapTotalData[sMeta].remove(sProject); } +void ProjectModelManager::updateSetting(const QString& sMeta,const QString& sProject) +{ + QJsonObject object; + QJsonArray arr; + QMap mapSvg = m_mapTotalData[sMeta][sProject].modelSetting.mapSvg; + + for(auto iter = mapSvg.begin();iter != mapSvg.end();++iter) + { + QJsonObject obj; + obj["name"] = iter.key(); + obj["data"] = QString::fromUtf8(iter.value()); + arr.push_back(obj); + } + object["picture"] = arr; + + QJsonObject jsVal = DataBase::GetInstance()->getProjectSetting(sMeta,sProject); + if(jsVal.empty()){ + DataBase::GetInstance()->insertProjectSetting(sMeta,sProject,object); + } + else{ + DataBase::GetInstance()->updateProjectSetting(sMeta,sProject,object); + } +} + +QStringList ProjectModelManager::getProjectModelLst(const QString& sMeta) +{ + //return DataBase::GetInstance()->getProjectWithinBase(sMeta); + QStringList lst; + QMap mapPro = m_mapTotalData.value(sMeta); + for(auto it = mapPro.begin();it != mapPro.end();++it) + { + lst.append(it.key()); + } + return lst; +} + QStringList ProjectModelManager::getModelList() const { QMap modelMap = DataBase::GetInstance()->ModelType(); @@ -588,7 +622,7 @@ QString ProjectModelManager::modifyProjectModel(const QString& sMeta,const QStri } } else{ //非空且库模型中不存在,新增 - bool res = createPropertyTable(sMeta,sProject,iter.key(),lstSelected,lstBase,nType); + bool res = createPropertyTable(sMeta,sProject,iter.key(),lstSelected,lstBase,iter->isPublic); if(res) { sRes = QString::fromWCharArray(L"修改模型成功"); @@ -681,14 +715,8 @@ int ProjectModelManager::createPropertyTable(const QString& sMeta,const QString& if(!DataBase::GetInstance()->ifDynamicTableExist(sName)) { bool val = DataBase::GetInstance()->createDynamicTable(sName,fields); - if(val) - { - DataBase::GetInstance()->insertProjectManager(sName,sName,"NULL",sGroup,0,objState,true); - return int(AlertInfo::success); - } - else { - return int(AlertInfo::fail); - } + DataBase::GetInstance()->insertProjectManager(sName,sName,"NULL",sGroup,0,objState,true); + return val; } else { @@ -776,3 +804,19 @@ QString ProjectModelManager::getItemDataType(const QStandardItem* pItem) } return dataTypePart; } + +projectModelSetting ProjectModelManager::getModelSetting(const QString& sMeta,const QString& sProject) +{ + projectModelSetting setting; + setting.modelName = sProject; + QJsonObject obj = DataBase::GetInstance()->getProjectSetting(sMeta,sProject); + QJsonArray arr = obj["picture"].toArray(); + for (QJsonValueRef jsonObj : arr) + { + QJsonObject node = jsonObj.toObject(); + QString sName = node["name"].toString(); + QByteArray bData = QByteArray::fromHex(node["data"].toString().toUtf8()); + setting.mapSvg.insert(sName,bData); + } + return setting; +} diff --git a/source/projectModelDlg.cpp b/source/projectModelDlg.cpp index b73b53e..ee38b01 100644 --- a/source/projectModelDlg.cpp +++ b/source/projectModelDlg.cpp @@ -687,8 +687,8 @@ void projectModelDlg::onDelegateFinishEdit(const QModelIndex &index, const QStri } else //新建 { - _curModel.mapProperty = ProjectModelManager::instance().addNewProject(value,_curProject,_curModel); - ProjectModelManager::instance().getData()[value].insert(_curProject,_curModel); + _curModel.mapProperty = ProjectModelManager::instance().addNewProject(value,_curProject,_curModel); //新建(不添加到队列 + ProjectModelManager::instance().getData()[value].insert(_curProject,_curModel); //添加 ui->treeView_base->setModel(nullptr); ui->treeView_sub->setModel(nullptr);