From 4f3c865126d2bee2756ef61d505eeb8ffec4e9c4 Mon Sep 17 00:00:00 2001 From: baiYue Date: Wed, 23 Jul 2025 17:27:35 +0800 Subject: [PATCH] add alter dynamic table/fix bugs --- .../include/graphicsItem/graphicsBaseItem.h | 1 + diagramCavas/include/projectModelSetting.h | 13 +- .../electricBaseModelLineItem.cpp | 3 +- .../electricBaseModelSvgItem.cpp | 34 +---- .../graphicsDataModel/fixedPortsModel.cpp | 3 + .../source/graphicsItem/graphicsBaseItem.cpp | 10 ++ diagramCavas/source/itemPropertyDlg.cpp | 12 +- diagramCavas/source/projectModelSetting.cpp | 126 +++++++++++++++--- diagramCavas/source/propertyContentDlg.cpp | 18 ++- diagramCavas/ui/projectModelSetting.ui | 52 ++------ diagramUtils/include/projectModelManager.h | 2 +- diagramUtils/source/projectModelManager.cpp | 2 +- 12 files changed, 179 insertions(+), 97 deletions(-) diff --git a/diagramCavas/include/graphicsItem/graphicsBaseItem.h b/diagramCavas/include/graphicsItem/graphicsBaseItem.h index 61317d0..27439ee 100644 --- a/diagramCavas/include/graphicsItem/graphicsBaseItem.h +++ b/diagramCavas/include/graphicsItem/graphicsBaseItem.h @@ -465,6 +465,7 @@ class GraphicsBaseModelItem : public GraphicsBaseItem //基模item public: GraphicsBaseModelItem(QGraphicsItem *parent); virtual ~GraphicsBaseModelItem(); + virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*) override; protected: virtual QVariant itemChange(QGraphicsItem::GraphicsItemChange, const QVariant&); }; diff --git a/diagramCavas/include/projectModelSetting.h b/diagramCavas/include/projectModelSetting.h index 6663b6d..71dcd55 100644 --- a/diagramCavas/include/projectModelSetting.h +++ b/diagramCavas/include/projectModelSetting.h @@ -9,6 +9,7 @@ QT_END_NAMESPACE class GraphicsBaseModelItem; class BaseModelProperty; +class FixedPortsModel; class ProjectModelSetting : public QDialog { @@ -21,22 +22,26 @@ public: void loadPicture(); void setSelectedItems(QStringList); void showDlg(GraphicsBaseModelItem*); - void loadProject(const QString& sMeta); -protected: + void setController(FixedPortsModel* p){_controller = p;} + //void loadProject(const QString& sMeta); +public slots: void onOkClicked(); void onCancelClicked(); - void onSaveAsClicked(); + //void onSaveAsClicked(); void onSelectClicked(); //选择图片 void onAddClicked(); //添加属性 void onDecreaseClicked(); //减少属性 + void onSaveClicked(); public slots: - void onSaveAsFinished(); //另存输入完毕 + //void onSaveAsFinished(); //另存输入完毕 void onCurrentTextChanged(const QString&); private: void showTestPic(QByteArray); + void loadModel(const QString&); private: Ui::projectModelSetting *ui; + FixedPortsModel* _controller; BaseModelProperty* _curItemData; //当前操作对象的属性 QString _curPath; }; diff --git a/diagramCavas/source/baseModelItem/electricBaseModelLineItem.cpp b/diagramCavas/source/baseModelItem/electricBaseModelLineItem.cpp index cc86357..e8b6175 100644 --- a/diagramCavas/source/baseModelItem/electricBaseModelLineItem.cpp +++ b/diagramCavas/source/baseModelItem/electricBaseModelLineItem.cpp @@ -77,11 +77,12 @@ void ElectricBaseModelLineItem::paint(QPainter* painter, const QStyleOptionGraph { if (option->state & QStyle::State_Selected) { - painter->setPen(Qt::red); + painter->setPen(QColor(135,206,235,180)); } else { painter->setPen(m_pen); + GraphicsBaseModelItem::paint(painter,option,widget); } painter->setBrush(m_brush); diff --git a/diagramCavas/source/baseModelItem/electricBaseModelSvgItem.cpp b/diagramCavas/source/baseModelItem/electricBaseModelSvgItem.cpp index 8f5e4ad..cbabf4f 100644 --- a/diagramCavas/source/baseModelItem/electricBaseModelSvgItem.cpp +++ b/diagramCavas/source/baseModelItem/electricBaseModelSvgItem.cpp @@ -63,39 +63,11 @@ void ElectricBaseModelSvgItem::paint(QPainter* painter, const QStyleOptionGraphi if (option->state & QStyle::State_Selected) //是选中状态,绘制选中框 { renderSelectBackground(painter); - /*int nPenWidth = 1; - painter->setPen(QPen(QColor(135,206,235,180))); //蓝色的外框 - - painter->setBrush(QBrush(QColor(135,206,235,180))); - - double dx = m_boundingRect_selected.x(); - double dy = m_boundingRect_selected.y(); - double dWidth = m_boundingRect_selected.width(); - double dHeight = m_boundingRect_selected.height(); - - - //画弧线0度是3点钟方向 - if(dWidth > dHeight) - { - painter->drawRect(m_boundingRect_selected); - painter->drawChord(dx-dHeight*0.5,dy,dHeight,dHeight,90*16,180*16); - painter->drawChord(dx+dWidth-dHeight*0.5,dy,dHeight,dHeight,(-90)*16,180*16); - } - else if(dWidth < dHeight) - { - painter->drawRect(m_boundingRect_selected); - painter->drawChord(dx,dy-dWidth*0.5,dWidth,dWidth,0*16,180*16); - painter->drawChord(dx,dy+dHeight-dWidth*0.5,dWidth,dWidth,180*16,180*16); - //painter->drawChord(dx+dWidth-dHeight*0.5,dy,dHeight,dHeight,(-90)*16,180*16); - } - else - { - painter->drawEllipse(QPointF(dx+dWidth*0.5,dy+dHeight*0.5),dHeight*0.5,dHeight*0.5); - }*/ - painter->drawText(QPointF(0,0),"yes"); } else - painter->drawText(QPointF(0,0),"no"); + { + GraphicsBaseModelItem::paint(painter,option,widget); + } } void ElectricBaseModelSvgItem::loadSvg(const QByteArray& data) diff --git a/diagramCavas/source/graphicsDataModel/fixedPortsModel.cpp b/diagramCavas/source/graphicsDataModel/fixedPortsModel.cpp index b1d964b..161aef1 100644 --- a/diagramCavas/source/graphicsDataModel/fixedPortsModel.cpp +++ b/diagramCavas/source/graphicsDataModel/fixedPortsModel.cpp @@ -1118,6 +1118,7 @@ void FixedPortsModel::showProjectModelSettingDlg(GraphicsBaseModelItem* srcItem) if(m_proModelSettingDlg == nullptr) { m_proModelSettingDlg = new ProjectModelSetting(_widget); + m_proModelSettingDlg->setController(this); } m_proModelSettingDlg->showDlg(srcItem); } @@ -1621,6 +1622,8 @@ void FixedPortsModel::addTestData() addBayItem(bayId,pBay); addItemsToBay(lst,pBay); _scene->addItem(pBay); + QString s = pageName(); + int a = 1; } QJsonObject FixedPortsModel::turnListToJson(QList lst,QString sInerTag,QString sOutTag) diff --git a/diagramCavas/source/graphicsItem/graphicsBaseItem.cpp b/diagramCavas/source/graphicsItem/graphicsBaseItem.cpp index 85f1a2a..0fd09d3 100644 --- a/diagramCavas/source/graphicsItem/graphicsBaseItem.cpp +++ b/diagramCavas/source/graphicsItem/graphicsBaseItem.cpp @@ -199,6 +199,16 @@ GraphicsBaseModelItem::~GraphicsBaseModelItem() } +void GraphicsBaseModelItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) +{ + if(getProperty()->modelName().isEmpty()) + { + painter->setPen(QColor(255,0,0,80)); + painter->setBrush(QColor(255,0,0,80)); + painter->drawRoundedRect(m_boundingRect,10,10); + } +} + QVariant GraphicsBaseModelItem::itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant& value) { if (change == QGraphicsItem::ItemSelectedHasChanged) diff --git a/diagramCavas/source/itemPropertyDlg.cpp b/diagramCavas/source/itemPropertyDlg.cpp index cd667ec..e248022 100644 --- a/diagramCavas/source/itemPropertyDlg.cpp +++ b/diagramCavas/source/itemPropertyDlg.cpp @@ -161,7 +161,15 @@ void ItemPropertyDlg::showDlg(modelDataInfo dataInfo,QUuid uuid,GraphicsProjectM curUuid_ = uuid; _curModel = dataInfo.modelName; _curItem = pItem; - QString firstName = groupInfo_.constBegin().key(); - onGroupSelected(firstName); //打开默认显示第一个属性组 + + QString str; + auto btn = dynamic_cast(btnGroup_->checkedButton()); + if(btn == nullptr){ + str = groupInfo_.constBegin().key(); //打开默认显示第一个属性组 + } + else{ + str = btn->text(); + } + onGroupSelected(str); show(); } diff --git a/diagramCavas/source/projectModelSetting.cpp b/diagramCavas/source/projectModelSetting.cpp index d019795..be07a89 100644 --- a/diagramCavas/source/projectModelSetting.cpp +++ b/diagramCavas/source/projectModelSetting.cpp @@ -9,15 +9,18 @@ #include "ui_projectModelSetting.h" #include "baseProperty.h" #include "graphicsItem/graphicsBaseItem.h" +#include "graphicsDataModel/fixedPortsModel.h" #include "projectModelManager.h" #include "tools.h" #include "global.h" #include "logger.h" +#include "dataBase.h" ProjectModelSetting::ProjectModelSetting(QWidget *parent) : QDialog(parent) ,ui(new Ui::projectModelSetting) ,_curItemData(nullptr) + ,_controller(nullptr) { ui->setupUi(this); this->setWindowFlags(Qt::FramelessWindowHint | windowFlags()); @@ -33,19 +36,19 @@ 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_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); + //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(" "); - QRegularExpression regExp("[a-zA-Z0-9]+"); + //ui->cb_modelType->setPlaceholderText(" "); + /*QRegularExpression regExp("[a-zA-Z0-9]+"); QRegularExpressionValidator *validator = new QRegularExpressionValidator(regExp, this); - ui->le_saveAs->setValidator(validator); + ui->le_saveAs->setValidator(validator);*/ } void ProjectModelSetting::loadPicture() @@ -99,12 +102,19 @@ void ProjectModelSetting::showDlg(GraphicsBaseModelItem* srcNode) QString sName = pro->name(); QString sMetaModel = pro->metaModelName(); QString sModel = pro->modelName(); + + if(sModel.isEmpty()) //模型为空直接判断名字() + { + sModel = sMetaModel+"_"+_controller->pageName(); + pro->setModelName(sModel); + } _curItemData = pro; - loadProject(sMetaModel); + //loadProject(sMetaModel); bool bExist = ProjectModelManager::instance().ifProjectExsit(sModel); if(bExist){ //使用存在的属性 - ui->cb_modelType->setCurrentText(sModel); + //ui->cb_modelType->setCurrentText(sModel); + loadModel(sModel); } else{ //新建当前对象的属性 if(pro->getModelProperty().pBase == nullptr && pro->getModelProperty().pSelect == nullptr){ @@ -117,25 +127,26 @@ void ProjectModelSetting::showDlg(GraphicsBaseModelItem* srcNode) ui->treeView_sub->expandAll(); ui->treeView_base->expandAll(); } - ui->le_saveAs->clear(); + //ui->le_saveAs->clear(); ui->le_name->setText(sName); ui->le_base->setText(sMetaModel); } loadPicture(); } -void ProjectModelSetting::loadProject(const QString& sMeta) +/*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() { - _curItemData->setModelName(ui->cb_modelType->currentText()); + //_curItemData->setModelName(ui->cb_modelType->currentText()); + onSaveClicked(); hide(); } @@ -144,7 +155,7 @@ void ProjectModelSetting::onCancelClicked() hide(); } -void ProjectModelSetting::onSaveAsClicked() +/*void ProjectModelSetting::onSaveAsClicked() { QString sModelName = ui->le_saveAs->text(); bool bExist = ProjectModelManager::instance().ifProjectExsit(sModelName); @@ -164,7 +175,7 @@ void ProjectModelSetting::onSaveAsClicked() QMessageBox::information(NULL, QString("提示"), QString::fromWCharArray(L"另存成功")); } ui->label_info->clear(); -} +}*/ void ProjectModelSetting::onSelectClicked() { @@ -267,7 +278,71 @@ void ProjectModelSetting::onDecreaseClicked() ui->treeView_base->expandAll(); } -void ProjectModelSetting::onSaveAsFinished() +void ProjectModelSetting::onSaveClicked() +{ + if(_curItemData){ + QString sMeta = _curItemData->metaModelName(); + QString sModelName = _curItemData->modelName(); + + bool bExist = ProjectModelManager::instance().ifProjectExsit(sModelName); + if(bExist){ + QMessageBox msgBox; + msgBox.setText(QString::fromWCharArray(L"提示")); + msgBox.setInformativeText(QString::fromWCharArray(L"模型将被覆盖,是否保存?")); + msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Cancel); + msgBox.setDefaultButton(QMessageBox::Save); + int ret = msgBox.exec(); + + switch (ret) { + case QMessageBox::Save: + { + PropertyModel pro = _curItemData->getModelProperty().deepCopy(); + ProjectModelManager::instance().getData()[_curItemData->metaModelName()][sModelName] = pro; + ProjectModelManager::instance().updateSetting(_curItemData->metaModelName(),sModelName); + QMap mapCheckState = DataBase::GetInstance()->getCheckStateFromManager(sModelName); + QString sRes = ProjectModelManager::instance().modifyProjectModel(sMeta,sModelName,mapCheckState); + if(!sRes.isEmpty()) + { + QMessageBox::information(NULL, QString::fromWCharArray(L"提示"), QString::fromWCharArray(L"修改成功")); + } + else + { + QMessageBox::information(NULL, QString::fromWCharArray(L"提示"), QString::fromWCharArray(L"修改失败")); + } + } + break; + case QMessageBox::Cancel: + break; + default: + break; + } + } + 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); + QMessageBox::information(NULL, QString("提示"), QString::fromWCharArray(L"保存成功")); + } + + if(_controller){ + QMap mapItem = _controller->allBaseItems(); + for(auto &item:mapItem) + { + ModelProperty* p = item->getProperty(); + BaseModelProperty* pro = dynamic_cast(p); + if(pro){ + if(pro->metaModelName() == _curItemData->metaModelName()){ //将相同基模item的工程模名称都置为相同(改一个全变) + pro->setModelName(_curItemData->modelName()); + } + } + } + } + } +} + +/*void ProjectModelSetting::onSaveAsFinished() { QString sModelName = ui->le_saveAs->text(); bool bExist = ProjectModelManager::instance().ifProjectExsit(sModelName); @@ -277,7 +352,7 @@ void ProjectModelSetting::onSaveAsFinished() else{ ui->label_info->setText(QString::fromWCharArray(L"名称可用")); } -} +}*/ void ProjectModelSetting::onCurrentTextChanged(const QString& text) { @@ -321,3 +396,22 @@ void ProjectModelSetting::showTestPic(QByteArray arr) ui->modelImagePreview->clear(); ui->modelImagePreview->setPixmap(pixmap); } + +void ProjectModelSetting::loadModel(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(); + if(!_curItemData->getModelProperty().modelSetting.mapSvg.isEmpty()) + setSelectedItems(_curItemData->getModelProperty().modelSetting.mapSvg.keys()); + } +} diff --git a/diagramCavas/source/propertyContentDlg.cpp b/diagramCavas/source/propertyContentDlg.cpp index 9345639..565dbf4 100644 --- a/diagramCavas/source/propertyContentDlg.cpp +++ b/diagramCavas/source/propertyContentDlg.cpp @@ -42,7 +42,10 @@ QWidget* PropertyContentDlg::createEditor(propertyStateInfo pro) if(pro.type.contains("SMALLINT")) { QSpinBox* spin = new QSpinBox(this); - spin->setRange(-32768, 32767); + if(pro.lengthPrecision > 0) + spin->setRange(-pro.lengthPrecision,pro.lengthPrecision); + else + spin->setRange(-32768, 32767); pWidget = spin; } else if(pro.type.contains("INTEGER")) @@ -50,6 +53,9 @@ QWidget* PropertyContentDlg::createEditor(propertyStateInfo pro) QSpinBox* spin = new QSpinBox(this); if(pro.lengthPrecision > 0) spin->setRange(-pro.lengthPrecision,pro.lengthPrecision); + else + spin->setRange(-32768,32767); + pWidget = spin; } else if(pro.type.contains("BIGINT")) @@ -63,15 +69,21 @@ QWidget* PropertyContentDlg::createEditor(propertyStateInfo pro) else if(pro.type.contains("REAL")) { QDoubleSpinBox* dbSpin = new QDoubleSpinBox(this); - dbSpin->setDecimals(6); + dbSpin->setDecimals(4); + if(pro.lengthPrecision > 0) + dbSpin->setRange(-pro.lengthPrecision,pro.lengthPrecision); + else + dbSpin->setRange(-9999999,9999999); pWidget = dbSpin; } else if(pro.type.contains("DOUBLE PRECISION")) { QDoubleSpinBox* dbSpin = new QDoubleSpinBox(this); - dbSpin->setDecimals(15); + dbSpin->setDecimals(8); if(pro.lengthPrecision > 0) dbSpin->setRange(-pro.lengthPrecision,pro.lengthPrecision); + else + dbSpin->setRange(-9999999,9999999); pWidget = dbSpin; } else if(pro.type.contains("NUMERIC") || pro.type.contains("DECIMAL")) diff --git a/diagramCavas/ui/projectModelSetting.ui b/diagramCavas/ui/projectModelSetting.ui index 7f13f4a..eaefd0f 100644 --- a/diagramCavas/ui/projectModelSetting.ui +++ b/diagramCavas/ui/projectModelSetting.ui @@ -100,7 +100,7 @@ 基本信息 - + @@ -115,6 +115,19 @@ + + + + Qt::Orientation::Horizontal + + + + 40 + 20 + + + + @@ -129,16 +142,6 @@ - - - - 当前工程模: - - - - - - @@ -368,33 +371,6 @@ color: rgb(8, 8, 8); 6 - - - - 工程模另存为 - - - - - - - false - - - - - - - - 80 - 0 - - - - - - - diff --git a/diagramUtils/include/projectModelManager.h b/diagramUtils/include/projectModelManager.h index d3c0b08..94c639b 100644 --- a/diagramUtils/include/projectModelManager.h +++ b/diagramUtils/include/projectModelManager.h @@ -41,7 +41,7 @@ public: signals: void modelChange(); //模型改变信号 private: - int createPropertyTable(const QString& sMeta,const QString& sProject,const QString& sGroup,QList lstSelect,QList lstBase,int nLinkType,bool isPublic = false); //创建属性组表并插入记录到管理表(工程名,当前项迭代器,关联图元类型) + int createPropertyTable(const QString& sMeta,const QString& sProject,const QString& sGroup,QList lstSelect,QList lstBase,int nLinkType,bool isPublic); //创建属性组表并插入记录到管理表(工程名,当前项迭代器,关联图元类型) QJsonObject getSelectedState(QList select,QList base); //返回json格式的选中状态 QString getItemDataType(const QStandardItem* pItem); //返回数据类型 projectModelSetting getModelSetting(const QString& sMeta,const QString& sProject); //获取指定工程模的设定 diff --git a/diagramUtils/source/projectModelManager.cpp b/diagramUtils/source/projectModelManager.cpp index 8fe9044..ed4fe17 100644 --- a/diagramUtils/source/projectModelManager.cpp +++ b/diagramUtils/source/projectModelManager.cpp @@ -626,7 +626,7 @@ QString ProjectModelManager::modifyProjectModel(const QString& sMeta,const QStri } } else{ //非空且库模型中不存在,新增 - bool res = createPropertyTable(sMeta,sProject,iter.key(),lstSelected,lstBase,iter->isPublic); + bool res = createPropertyTable(sMeta,sProject,iter.key(),lstSelected,lstBase,0,iter->isPublic); if(res) { sRes = QString::fromWCharArray(L"修改模型成功");