diff --git a/.gitignore b/.gitignore index d8b4fd9..183556c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ build/ .vscode/ +.qtcreator/ # ---> CMake CMakeLists.txt.user diff --git a/common/include/global.h b/common/include/global.h index e47dadd..1b42ea1 100644 --- a/common/include/global.h +++ b/common/include/global.h @@ -876,6 +876,8 @@ struct DiagramContent { struct PtExtraInfo { int id; + QString minTransRatio; //最小变比 + QString maxTransRatio; //最大变比 QString transRatio; //变比 QString accuracyClass; //精度等级 QString secondaryLoadCapacity; //二次负载容量 @@ -886,6 +888,8 @@ struct CtExtraInfo { int id; QString transRatio; //变比 + QString minTransRatio; //最小变比 + QString maxTransRatio; //最大变比 QString accuracyClass; //精度等级 QString secondaryLoadCapacity; //二次负载容量 }; @@ -896,10 +900,23 @@ struct MeasurementInfo //量测 QString name; //量测名称 QString equipment; //设备名称 QString channel; //设备端子 - QString type; //量测类型 + int type; //量测类型 0:遥测 1:遥信 2:遥控 int size; //量测size QUuid bayUuid; //所属间隔 QUuid componentUuid; //所属设备 + + //通讯 + int nSource; //数据来源 1:cl3611 2:104 + QString sStation; //子站名称 + QString sChannel; //通道名(cl3611) 遥测:TMx(1-8); P; Q; S; PF; F; deltaF; UAB; UBC; UCA; 遥信: TSxx(01-10); 遥控: TCx; + int nPacket; //包号(104) + int nOffset; //偏移量(104) + //事件 + bool bEnable = false; //"enable"开启标志 + QMap mapTE; //遥测"cause" key:upup,up,down,downdown可选,val:0-100 + QString sEdge; //遥信"cause:edge" raising, falling 字符串单选 + QString sCommand; //"action:command" info, warning, error, critical, exception 字符串单选 + QStringList lstParameter; //"action:parameters" 字符串数组 }; //================================================== diff --git a/diagramCavas/include/bayInfoDlg.h b/diagramCavas/include/bayInfoDlg.h index 033773c..e5feb65 100644 --- a/diagramCavas/include/bayInfoDlg.h +++ b/diagramCavas/include/bayInfoDlg.h @@ -25,12 +25,13 @@ public: virtual void setPropertyValue(QVariant); auto& getValidType() {return _validType;} //获取可用的量测属性 void setUi(); - void addMeasure(MeasurementInfo); + void addMeasure(MeasurementInfo,int mode = 0); //mode:0新建1修改 void addOtherMeasure(QStringList); //本间隔的其他量测 BaseProperty* getProperty() {return _itemProperty;} public slots: void onAddClicked(); void onDeleteClicked(); + void onModifyClicked(); void onIndexRbtnClicked(const QPoint &pos); //索引列表右键菜单 private: void initial(); diff --git a/diagramCavas/include/ctExtraInfoDlg.h b/diagramCavas/include/ctExtraInfoDlg.h index 249a8ca..054f4ab 100644 --- a/diagramCavas/include/ctExtraInfoDlg.h +++ b/diagramCavas/include/ctExtraInfoDlg.h @@ -28,7 +28,7 @@ public slots: void onAddClicked(); void onDeleteClicked(); protected: - void addTableRow(QString,QString,QString,int id = -1); + void addTableRow(QString,QString,QString,QString,QString,int id = -1); private: Ui::ctExtraInfoDlg *ui; QMap _mapCT; diff --git a/diagramCavas/include/graphicsDataModel/fixedPortsModel.h b/diagramCavas/include/graphicsDataModel/fixedPortsModel.h index 789e79b..3c4f41b 100644 --- a/diagramCavas/include/graphicsDataModel/fixedPortsModel.h +++ b/diagramCavas/include/graphicsDataModel/fixedPortsModel.h @@ -112,6 +112,7 @@ public Q_SLOTS: private: void addPortsToItem_json(PortState,QJsonArray,GraphicsProjectModelItem*); //将json格式的port添加到item void autoSetModelName(GraphicsBaseModelItem*); //如果此页的工程模已被设置,将projectName更新到item + QString removeSuffix(const QString& str); //移除最后一个下划线后的内容 (处理各种tag后缀) private: QMap _nodeItem; //工程模对象 diff --git a/diagramCavas/include/graphicsItem/graphicsBaseItem.h b/diagramCavas/include/graphicsItem/graphicsBaseItem.h index 5c5cd8b..924db1c 100644 --- a/diagramCavas/include/graphicsItem/graphicsBaseItem.h +++ b/diagramCavas/include/graphicsItem/graphicsBaseItem.h @@ -595,7 +595,7 @@ public: QRectF updateBoundRect(); protected: QList m_childItems; - int m_direction = 0; //组内布局,0横1纵 + int m_direction = 1; //组内布局,0横1纵 int m_spacing = 0; //间距 int _groupType = 0; //组类型,0联合(子item独立连接),1聚合(子item仅作展示) }; diff --git a/diagramCavas/include/measureSettingDlg.h b/diagramCavas/include/measureSettingDlg.h index e55110d..2a559e9 100644 --- a/diagramCavas/include/measureSettingDlg.h +++ b/diagramCavas/include/measureSettingDlg.h @@ -2,6 +2,7 @@ #define MEASURESETTINGDLG_H #include +#include /******************************************************* 间隔信息 ********************************************************/ @@ -10,6 +11,7 @@ namespace Ui { class measureSettingDlg; } QT_END_NAMESPACE class BayInfoDlg; +struct MeasurementInfo; class MeasureSettingDlg : public QDialog { @@ -21,16 +23,28 @@ public: void initial(); void setBay(BayInfoDlg* p) {_pBay = p;} void showDlg(); + void showDlg(MeasurementInfo); //修改 public slots: void onOkClicked(); void onCancelClicked(); void onTagChanged(const QString&); void onNameChanged(const QString&); + + void onRuleIndexChanged(int); //通信方式改变时 + void onTypeIndexChanged(int); //量测类型改变时 + + void onAddParaClicked(); + void onDelParaClicked(); + void onEventStrategyChange(int); //事件策略改变 private: void clearData(); private: Ui::measureSettingDlg *ui; BayInfoDlg* _pBay; + + QButtonGroup* _pEventStrategy; //事件策略组 + QButtonGroup* _pEventYXGroup; //遥信事件组 + bool _curMode; //0新增1修改 }; #endif diff --git a/diagramCavas/include/ptExtraInfoDlg.h b/diagramCavas/include/ptExtraInfoDlg.h index ba5cf60..4a51b5e 100644 --- a/diagramCavas/include/ptExtraInfoDlg.h +++ b/diagramCavas/include/ptExtraInfoDlg.h @@ -28,7 +28,7 @@ public slots: void onAddClicked(); void onDeleteClicked(); protected: - void addTableRow(QString,QString,QString,QString,int id = -1); + void addTableRow(QString,QString,QString,QString,QString,QString,int id = -1); private: Ui::ptExtraInfoDlg *ui; QMap _mapPT; diff --git a/diagramCavas/source/bayInfoDlg.cpp b/diagramCavas/source/bayInfoDlg.cpp index d1612d2..2cf7bb1 100644 --- a/diagramCavas/source/bayInfoDlg.cpp +++ b/diagramCavas/source/bayInfoDlg.cpp @@ -72,14 +72,9 @@ void BayInfoDlg::setPropertyValue(QVariant var) { _itemProperty = property; QList lstType = DataBase::GetInstance()->getMeasureAttributeTypes(); - auto map = property->getMeasurement(); _validType = lstType; - for(auto& info:map){ - addMeasure(info); - } - //间隔处理 _bayProperty = nullptr; QMap mapBay = _curModelController->allBayItem(); @@ -97,6 +92,11 @@ void BayInfoDlg::setPropertyValue(QVariant var) } } + auto map = property->getMeasurement(); + for(auto& info:map){ + addMeasure(info); + } + if(_bayProperty){ auto lstFrom = _bayProperty->getLstFrom(); auto lstTo = _bayProperty->getLstTo(); @@ -242,43 +242,104 @@ void BayInfoDlg::setUi() ); } -void BayInfoDlg::addMeasure(MeasurementInfo info) +void BayInfoDlg::addMeasure(MeasurementInfo info,int mode) { - if(_mapMeasure.contains(info.name)) - return; - int row = ui->tableWidget_local->rowCount(); - ui->tableWidget_local->insertRow(row); + if(mode == 0){ //新建 + if(_mapMeasure.contains(info.name)) + return; + int row = ui->tableWidget_local->rowCount(); + ui->tableWidget_local->insertRow(row); - QTableWidgetItem* tagItem = new QTableWidgetItem(info.tag); - ui->tableWidget_local->setItem(row, 0, tagItem); + QTableWidgetItem* tagItem = new QTableWidgetItem(info.tag); + ui->tableWidget_local->setItem(row, 0, tagItem); - QTableWidgetItem* nameItem = new QTableWidgetItem(info.name); - ui->tableWidget_local->setItem(row, 1, nameItem); + QTableWidgetItem* nameItem = new QTableWidgetItem(info.name); + ui->tableWidget_local->setItem(row, 1, nameItem); - QTableWidgetItem* deviceItem = new QTableWidgetItem(info.equipment); - ui->tableWidget_local->setItem(row, 2, deviceItem); + QTableWidgetItem* deviceItem = new QTableWidgetItem(info.equipment); + ui->tableWidget_local->setItem(row, 2, deviceItem); - QTableWidgetItem* channelItem = new QTableWidgetItem(info.channel); - ui->tableWidget_local->setItem(row, 3, channelItem); + QTableWidgetItem* channelItem = new QTableWidgetItem(info.channel); + ui->tableWidget_local->setItem(row, 3, channelItem); - QTableWidgetItem* typeItem = new QTableWidgetItem(info.type); - ui->tableWidget_local->setItem(row, 4, typeItem); + QString sType; + if(info.type == 0){ + sType = "遥测"; + } + else if(info.type == 1){ + sType = "遥信"; + } + else if(info.type == 2){ + sType = "遥控"; + } + else if(info.type == 3){ + sType = "遥调"; + } + else if(info.type == 4){ + sType = "整定值"; + } + QTableWidgetItem* typeItem = new QTableWidgetItem(sType); + ui->tableWidget_local->setItem(row, 4, typeItem); - QTableWidgetItem* sizeItem = new QTableWidgetItem(QString::number(info.size)); - ui->tableWidget_local->setItem(row, 5, sizeItem); + QTableWidgetItem* sizeItem = new QTableWidgetItem(QString::number(info.size)); + ui->tableWidget_local->setItem(row, 5, sizeItem); - if(_bayProperty && _itemProperty){ - QUuid bayId = _bayProperty->uuid(); - QUuid itemId = _itemProperty->uuid(); - info.bayUuid = bayId; - info.componentUuid = itemId; - _mapMeasure.insert(info.name,info); + if(_bayProperty && _itemProperty){ + QUuid bayId = _bayProperty->uuid(); + QUuid itemId = _itemProperty->uuid(); + info.bayUuid = bayId; + info.componentUuid = itemId; + _mapMeasure.insert(info.name,info); + } + + /*for(int i = 0;i < _validType.size();++i){ + if(_validType.at(i).name == info.name){ //可用类型中移除该类型 + _validType.removeAt(i); + break; + } + }*/ } + else if(mode == 1){ //修改 + QModelIndexList selectedIndexes = ui->tableWidget_local->selectionModel()->selectedRows(); + if (selectedIndexes.isEmpty()) { + return; // 没有选中任何行 + } - for(int i = 0;i < _validType.size();++i){ - if(_validType.at(i).name == info.name){ //可用类型中移除该类型 - _validType.removeAt(i); - break; + // 获取当前选中的第一项索引 + QModelIndex index = selectedIndexes.first(); + if (!index.isValid()) { + return; + } + + QModelIndex indexName = index.sibling(index.row(),1); + QString sName = indexName.data().toString(); + if(_mapMeasure.contains(sName)){ + auto itemType = ui->tableWidget_local->item(index.row(),4); + if(itemType){ + QString sType; + if(info.type == 0){ + sType = "遥测"; + } + else if(info.type == 1){ + sType = "遥信"; + } + else if(info.type == 2){ + sType = "遥控"; + } + else if(info.type == 3){ + sType = "遥调"; + } + else if(info.type == 4){ + sType = "整定值"; + } + + itemType->setText(sType); + } + + auto itemSize = ui->tableWidget_local->item(index.row(),5); + if(itemSize){ + itemSize->setText(QString::number(info.size)); + } } } } @@ -320,11 +381,11 @@ void BayInfoDlg::onDeleteClicked() QModelIndex indexName = index.sibling(index.row(),1); QString sName = indexName.data().toString(); if(_mapMeasure.contains(sName)){ - MeasurementInfo info = _mapMeasure.take(sName); + /*MeasurementInfo info = _mapMeasure.take(sName); measureAttributeType typ; typ.name = info.name; typ.tag = info.tag; - _validType.append(typ); + _validType.append(typ);*/ } int currentRow = ui->tableWidget_local->currentRow(); @@ -335,6 +396,32 @@ void BayInfoDlg::onDeleteClicked() ui->tableWidget_local->removeRow(currentRow); } +void BayInfoDlg::onModifyClicked() +{ + // 获取当前选中的索引 + QModelIndexList selectedIndexes = ui->tableWidget_local->selectionModel()->selectedRows(); + if (selectedIndexes.isEmpty()) { + return; // 没有选中任何行 + } + + // 获取当前选中的第一项索引 + QModelIndex index = selectedIndexes.first(); + if (!index.isValid()) { + return; + } + + QModelIndex indexName = index.sibling(index.row(),1); + QString sName = indexName.data().toString(); + if(_mapMeasure.contains(sName)){ + auto info = _mapMeasure.value(sName); + if(_measureDlg == nullptr){ + _measureDlg = new MeasureSettingDlg(this); + _measureDlg->setBay(this); + } + _measureDlg->showDlg(info); + } +} + void BayInfoDlg::onIndexRbtnClicked(const QPoint &pos) { // 获取当前点击的位置对应的索引 @@ -344,10 +431,13 @@ void BayInfoDlg::onIndexRbtnClicked(const QPoint &pos) } QMenu menu; + QAction *modifyAction = new QAction("修改量测", this); QAction *deleteAction = new QAction("移除量测", this); + menu.addAction(modifyAction); menu.addAction(deleteAction); // 连接删除菜单项的触发信号与槽函数 + connect(modifyAction, &QAction::triggered, this, &BayInfoDlg::onModifyClicked); connect(deleteAction, &QAction::triggered, this, &BayInfoDlg::onDeleteClicked); // 在点击位置显示菜单 diff --git a/diagramCavas/source/ctExtraInfoDlg.cpp b/diagramCavas/source/ctExtraInfoDlg.cpp index 97cae51..713b3fb 100644 --- a/diagramCavas/source/ctExtraInfoDlg.cpp +++ b/diagramCavas/source/ctExtraInfoDlg.cpp @@ -4,6 +4,7 @@ #include "basePropertyManager.h" #include #include +#include CtExtraInfoDlg::CtExtraInfoDlg(QWidget *parent) : BaseContentDlg(parent) @@ -85,6 +86,8 @@ QMap CtExtraInfoDlg::getPropertyValue(BaseProperty* p { QJsonObject obj; obj["id"] = info.id; + obj["minTransformationRatio"] = info.minTransRatio; + obj["maxTransformationRatio"] = info.maxTransRatio; obj["transformationRatio"] = info.transRatio; obj["accuracyClass"] = info.accuracyClass; obj["secondaryLoadCapacity"] = info.secondaryLoadCapacity; @@ -101,61 +104,63 @@ QMap CtExtraInfoDlg::getPropertyValue(BaseProperty* p void CtExtraInfoDlg::setPropertyValue(QVariant var) { - BaseProperty* pPro = static_cast(var.value()); - if(pPro) + QMap map = var.value>(); + for(auto &info:map) { - QMap map = var.value>(); - for(auto &info:map) + if(info.name == "额定电流(A)" || info.name == "in_a") //此处应为类型名 { - if(info.name == "额定电流") //此处应为类型名 - { - ui->le_ratedCurrent->setText(QString::number(info.defaultValue.toDouble())); - } - else if(info.name == "工频耐压") - { - ui->le_pfwv_ct->setText(QString::number(info.defaultValue.toDouble())); - } - else if(info.name == "冲击耐压") - { - ui->le_iwv_ct->setText(QString::number(info.defaultValue.toDouble())); - } - else if(info.name == "动稳定电流") - { - ui->le_dsc_ct->setText(QString::number(info.defaultValue.toDouble())); - } - else if(info.name == "仪表保安系数") - { - ui->le_isf->setText(info.defaultValue.toString()); - } - else if(info.name == "短时热电流") - { - ui->le_sttc->setText(QString::number(info.defaultValue.toDouble())); - } - else if(info.name == "额定频率") - { - ui->le_rf_ct->setText(QString::number(info.defaultValue.toDouble())); - } - else if(info.name == "相数") - { - if(info.defaultValue.toInt() == 1) - ui->rb_tpt_ct->setChecked(true); - else - ui->rb_zst_ct->setChecked(true); - } - else if(info.name == "ct绕组") - { - QJsonObject object = info.defaultValue.toJsonObject(); - QJsonArray arr = object["winding"].toArray(); - for (QJsonValueRef jsonObj : arr) - { - QJsonObject node = jsonObj.toObject(); - int id = node["id"].toInt(); - QString sTr = node["transformationRatio"].toString(); - QString sAr = node["accuracyClass"].toString(); - QString sSlc = node["secondaryLoadCapacity"].toString(); + ui->le_ratedCurrent->setText(QString::number(info.defaultValue.toDouble())); + } + else if(info.name == "工频耐压(V/1min)" || info.name == "uac_v_1min") + { + ui->le_pfwv_ct->setText(QString::number(info.defaultValue.toDouble())); + } + else if(info.name == "冲击耐压(V)" || info.name == "uimp_v") + { + ui->le_iwv_ct->setText(QString::number(info.defaultValue.toDouble())); + } + else if(info.name == "动稳定电流(A)" || info.name == "dsc_a") + { + ui->le_dsc_ct->setText(QString::number(info.defaultValue.toDouble())); + } + else if(info.name == "仪表保安系数" || info.name == "fs") + { + ui->le_isf->setText(info.defaultValue.toString()); + } + else if(info.name == "热稳定电流(A)" || info.name == "ith_a") + { + ui->le_sttc->setText(QString::number(info.defaultValue.toDouble())); + } + else if(info.name == "额定频率(Hz)" || info.name == "fn_hz") + { + ui->le_rf_ct->setText(QString::number(info.defaultValue.toDouble())); + } + else if(info.name == "相数" || info.name == "phase_num") + { + if(info.defaultValue.toInt() == 1) + ui->rb_tpt_ct->setChecked(true); + else + ui->rb_zst_ct->setChecked(true); + } + else if(info.name == "CT绕组" || info.name == "ct_winding") + { + QString jsonString = info.defaultValue.toString(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(jsonString.toUtf8().data()); + QJsonObject jsonObject = jsonDocument.object(); - addTableRow(sTr,sAr,sSlc,id); - } + QJsonObject object = jsonObject; + QJsonArray arr = object["winding"].toArray(); + for (QJsonValueRef jsonObj : arr) + { + QJsonObject node = jsonObj.toObject(); + int id = node["id"].toInt(); + QString sTr = node["transformationRatio"].toString(); + QString sMinTr = node["minTransformationRatio"].toString(); + QString sMaxTr = node["maxTransformationRatio"].toString(); + QString sAr = node["accuracyClass"].toString(); + QString sSlc = node["secondaryLoadCapacity"].toString(); + + addTableRow(sTr,sMinTr,sMaxTr,sAr,sSlc,id); } } } @@ -164,9 +169,11 @@ void CtExtraInfoDlg::setPropertyValue(QVariant var) void CtExtraInfoDlg::onAddClicked() { QString sTr = ui->le_tr_ct->text(); + QString sMinTr = ui->le_trMin_ct->text(); + QString sMaxTr = ui->le_trMax_ct->text(); QString sAr = ui->le_ac_ct->text(); QString sSlc = ui->le_slc_ct->text(); - addTableRow(sTr,sAr,sSlc); + addTableRow(sTr,sMinTr,sMaxTr,sAr,sSlc); } void CtExtraInfoDlg::onDeleteClicked() @@ -184,7 +191,7 @@ void CtExtraInfoDlg::onDeleteClicked() } } -void CtExtraInfoDlg::addTableRow(QString sTr,QString sAr,QString sSlc,int id) +void CtExtraInfoDlg::addTableRow(QString sTr,QString sMinTr,QString sMaxTr,QString sAr,QString sSlc,int id) { if(_mapCT.contains(QString::number(id))) { @@ -208,19 +215,27 @@ void CtExtraInfoDlg::addTableRow(QString sTr,QString sAr,QString sSlc,int id) item->setData(Qt::UserRole,info.id); ui->tb_ct->setItem(row, 0, item); + //最小变比 + ui->tb_ct->setItem(row, 1, new QTableWidgetItem(sMinTr)); + + //最大变比 + ui->tb_ct->setItem(row, 2, new QTableWidgetItem(sMaxTr)); + // 精度等级(下拉框) - ui->tb_ct->setItem(row, 1, new QTableWidgetItem(sAr)); + ui->tb_ct->setItem(row, 3, new QTableWidgetItem(sAr)); // 二次负载容量(输入框) - ui->tb_ct->setItem(row, 2, new QTableWidgetItem(sSlc)); + ui->tb_ct->setItem(row, 4, new QTableWidgetItem(sSlc)); // 删除按钮 QPushButton *deleteBtn = new QPushButton("删除"); connect(deleteBtn, &QPushButton::clicked, this, &CtExtraInfoDlg::onDeleteClicked); - ui->tb_ct->setCellWidget(row, 3, deleteBtn); + ui->tb_ct->setCellWidget(row, 5, deleteBtn); info.transRatio = sTr; + info.minTransRatio = sMinTr; + info.maxTransRatio = sMaxTr; info.accuracyClass = sAr; info.secondaryLoadCapacity = sSlc; _mapCT.insert(QString::number(info.id),info); diff --git a/diagramCavas/source/diagramCavas.cpp b/diagramCavas/source/diagramCavas.cpp index 94a5ab9..b18f79d 100644 --- a/diagramCavas/source/diagramCavas.cpp +++ b/diagramCavas/source/diagramCavas.cpp @@ -125,7 +125,7 @@ void DiagramCavas::onSignal_savePage() QString sMeta = pData->metaModelName(); QString sModel = pData->modelName(); if(!updatedModel.contains(sModel)){ - ProjectModelManager::instance().updateSetting(sMeta,sModel); //更新使用的图标数据 + ProjectModelManager::instance().updateSetting(sMeta,sModel,true); //更新使用的图标数据 updatedModel.append(sModel); } diff --git a/diagramCavas/source/graphicsDataModel/fixedPortsModel.cpp b/diagramCavas/source/graphicsDataModel/fixedPortsModel.cpp index bcda20a..003f59d 100644 --- a/diagramCavas/source/graphicsDataModel/fixedPortsModel.cpp +++ b/diagramCavas/source/graphicsDataModel/fixedPortsModel.cpp @@ -39,6 +39,7 @@ #include #include #include +#include #include "baseProperty.h" #include "projectModelSetting.h" #include "bayManagerDlg.h" @@ -142,6 +143,7 @@ void FixedPortsModel::addNodeItem(QUuid id/*,int type*/,QPointF pos,double width BaseProperty* pro = nullptr; GraphicsProjectModelItem* item = nullptr; QMap mapData = BasePropertyManager::instance().getEntityData(); //加载的图形必定关联component(todo:完善判断条件,如判断拓扑节点) + if(mapData.contains(id)) { pro = mapData.value(id); @@ -153,6 +155,13 @@ void FixedPortsModel::addNodeItem(QUuid id/*,int type*/,QPointF pos,double width QString sMeta = pro->metaModelName(); QString sProModel = pro->modelName(); + modelDataInfo mapValue = DataManager::instance().modelData()[sProModel]; + PropertyValueInfo valueInfo; //属性组设置的数据 (ct,pt二次绕组) + if(mapValue.groupInfo.contains("base_extend")) + { + valueInfo = mapValue.groupInfo["base_extend"].mapInfo[id]; + } + double dX = 0.0; double dY = 0.0; if(type == GIT_itemRect) @@ -248,11 +257,91 @@ void FixedPortsModel::addNodeItem(QUuid id/*,int type*/,QPointF pos,double width } auto pCt = new ElectricSvgGroupCT(QRect(-dX*0.5, -dY*0.5, dX, dY)); + pCt->updateMapSvg(ProjectModelManager::instance().getData()[sMeta][sProModel].modelSetting.mapUsedSvg); pCt->setItemType(GIT_ctGroup); item = pCt; QJsonArray portArr = pro->context()["port"].toArray(); addPortsToItem_json(P_const,portArr,item); + if(!valueInfo.isEmpty()){ //使用设置的绕组数更新自己 + int nCtSize = 0; //ct设置的个数 + int nCtType = 0; //ct类型 1三相0零相 + if(valueInfo.contains("ct_winding")){ + propertyStateInfo val = valueInfo.value("ct_winding"); + + QJsonDocument jsonDocument = QJsonDocument::fromJson(val.defaultValue.toString().toUtf8().data()); + if(!jsonDocument.isNull()){ + QJsonObject obj = jsonDocument.object(); + if(obj.contains("winding")){ + QJsonArray arr = obj["winding"].toArray(); + nCtSize = arr.size(); + } + } + } + if(valueInfo.contains("phase_num")){ + propertyStateInfo val = valueInfo.value("phase_num"); + nCtType = val.defaultValue.toInt(); + } + + QPair pair(nCtType,nCtSize); + QVariant var = QVariant::fromValue(pair); + pCt->setupFinish(var); + } + + } + else if(type == GIT_ptGroup) + { + PropertyModel model = ProjectModelManager::instance().getData()[sMeta][sProModel]; + QByteArray svg; + if(model.modelSetting.mapSvg.isEmpty()){ + svg = DataBase::GetInstance()->ModelType()[6].icon; + } + else{ + svg = model.modelSetting.mapSvg.first(); + } + + if(width == 0 && height == 0){ + dX = 50; + dY = 50; + } + else{ + dX = width; + dY = height; + } + + auto pPt = new ElectricSvgGroupPT(QRect(-dX*0.5, -dY*0.5, dX, dY)); + pPt->updateMapSvg(ProjectModelManager::instance().getData()[sMeta][sProModel].modelSetting.mapUsedSvg); + pPt->setItemType(GIT_ptGroup); + item = pPt; + QJsonArray portArr = pro->context()["port"].toArray(); + + addPortsToItem_json(P_const,portArr,item); + if(!valueInfo.isEmpty()){ //使用设置的绕组数更新自己 + QList lst; //二次绕组接法 + if(valueInfo.contains("pt_sec_winding")){ + propertyStateInfo val = valueInfo.value("pt_sec_winding"); + + QJsonDocument jsonDocument = QJsonDocument::fromJson(val.defaultValue.toString().toUtf8().data()); + if(!jsonDocument.isNull()){ + QJsonObject obj = jsonDocument.object(); + QJsonArray arr = obj["winding"].toArray(); + for (QJsonValueRef jsonObj : arr) + { + QJsonObject node = jsonObj.toObject(); + QString sWinding = node["windingConnectionMethod"].toString(); + if(sWinding == "Y"){ + lst.append(1); + } + else{ + lst.append(0); + } + } + } + + QVariant var = QVariant::fromValue(lst); + pPt->setupFinish(var); + } + } } else if(type == GIT_DS) { @@ -585,10 +674,12 @@ void FixedPortsModel::loadNodeDataFromDataBase() QList lst= DataBase::GetInstance()->getAllComponents(); for(auto &info:lst) { + QString preTag = removeSuffix(info.tag); + QString prePath = removeSuffix(info.nspath); BaseProperty* pData = addNodeData(info.uuid,info.type,info.name,info.modelName); - pData->setTag(info.tag); + pData->setTag(preTag); pData->setName(info.name); - pData->setPath(info.nspath); + pData->setPath(prePath); pData->setDescription(info.description); pData->setInService(info.inService); pData->setState(info.state); @@ -612,6 +703,7 @@ void FixedPortsModel::loadNodeDataFromDataBase() QMap mapMeasure; for(auto& info:lstMeasure) { + info.tag = removeSuffix(info.tag); mapMeasure.insert(info.name,info); } pData->setMeasurement(mapMeasure); @@ -629,8 +721,10 @@ void FixedPortsModel::loadNodeDataFromDataBase() QList lstBay = DataBase::GetInstance()->getAllBay(); for(auto& bay:lstBay) { + QString showTag = removeSuffix(bay.tag); BayProperty* pBay = addBayData(bay.uuid); pBay->setName(bay.name); + pBay->setTag(showTag); pBay->setType(bay.type); pBay->setLstComponent(bay.components); pBay->setVoltage(bay.unom); @@ -768,6 +862,7 @@ void FixedPortsModel::saveNode(int nPageId) BayProperty* pBay = dynamic_cast(pro); if(pBay){ bool val = DataBase::GetInstance()->ifBayExist(pBay->uuid()); + QString tempTag = pBay->tag()+"_"+_pageName; //tag后加工程名保持全局唯一 if(!val){ QJsonObject objFrom = turnListToJson(pBay->getLstFrom(),"id","ids"); QJsonObject objTo= turnListToJson(pBay->getLstTo(),"id","ids"); @@ -778,7 +873,7 @@ void FixedPortsModel::saveNode(int nPageId) QJsonObject objIns= turnListToJson(pBay->getLstInstruct(),"id","ids"); QJsonObject objEtc= turnListToJson(pBay->getLstEtc(),"id","ids"); - DataBase::GetInstance()->insertBay(pBay->uuid(),pBay->name(),pBay->tag(),pBay->getType(),pBay->getVoltage(),pBay->getFla(),pBay->getCapacity(),"1",pBay->getInService(),0,"1","1","1",QJsonObject(),objFrom,objTo,objProtec,objFalRec,objStatus,objDynSen,objIns,objEtc,pBay->getLstComponent(),QJsonObject()); + DataBase::GetInstance()->insertBay(pBay->uuid(),pBay->name(),tempTag,pBay->getType(),pBay->getVoltage(),pBay->getFla(),pBay->getCapacity(),"1",pBay->getInService(),0,"1","1","1",QJsonObject(),objFrom,objTo,objProtec,objFalRec,objStatus,objDynSen,objIns,objEtc,pBay->getLstComponent(),QJsonObject()); } else{ QJsonObject objFrom = turnListToJson(pBay->getLstFrom(),"id","ids"); @@ -790,7 +885,7 @@ void FixedPortsModel::saveNode(int nPageId) QJsonObject objIns= turnListToJson(pBay->getLstInstruct(),"id","ids"); QJsonObject objEtc= turnListToJson(pBay->getLstEtc(),"id","ids"); - DataBase::GetInstance()->updateBay(pBay->uuid(),pBay->name(),pBay->tag(),pBay->getVoltage(),pBay->getFla(),pBay->getCapacity(),"",pBay->getInService(),0,QJsonObject(),objFrom,objTo,objProtec,objFalRec,objStatus,objDynSen,objIns,objEtc,pBay->getLstComponent(),QJsonObject()); + DataBase::GetInstance()->updateBay(pBay->uuid(),pBay->name(),tempTag,pBay->getVoltage(),pBay->getFla(),pBay->getCapacity(),"",pBay->getInService(),0,QJsonObject(),objFrom,objTo,objProtec,objFalRec,objStatus,objDynSen,objIns,objEtc,pBay->getLstComponent(),QJsonObject()); } } } @@ -828,7 +923,8 @@ void FixedPortsModel::saveNode(int nPageId) modelDataInfo& dataInfo = pVariable->getPropertyValue(); if(exist) //已存在更新 { - DataBase::GetInstance()->updateComponent(pData->uuid(),pData->tag(),pData->name(),pData->context()); + QString tempTag = pData->tag()+"_"+_pageName; //tag后加工程名使得全局唯一 + DataBase::GetInstance()->updateComponent(pData->uuid(),tempTag,pData->name(),pData->context()); for(auto &val:dataInfo.groupInfo) { if(val.groupName == "component") @@ -845,7 +941,9 @@ void FixedPortsModel::saveNode(int nPageId) } 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); + QString tempTag = pData->tag()+"_"+_pageName; //tag后加工程名使得全局唯一 + QString tempPath = pData->path()+"_"+_pageName; + DataBase::GetInstance()->insertComponent(pData->uuid(),pData->modelName(),tempPath,tempTag,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") @@ -866,31 +964,54 @@ void FixedPortsModel::saveNode(int nPageId) QList lstDataBase = DataBase::GetInstance()->getMeasurement(pData->uuid()); //数据库中现有量测 for(auto& info:mapMeasure) { - int tpe = 0; //todo:建立类型映射表 - if(info.type == "遥测"){ - tpe = 0; + int tpe = info.type; //todo:建立类型映射表 + + QJsonObject objDataSource; + QJsonObject objIoAddress; + if(info.nSource == 1){ //3611 + objDataSource["type"] = 1; + objIoAddress["station"] = info.sStation; + objIoAddress["device"] = info.equipment; + objIoAddress["channel"] = info.sChannel; } - else if(info.type == "遥信"){ - tpe = 1; + else if(info.nSource == 2){ //104 + objDataSource["type"] = 2; + objIoAddress["station"] = info.sStation; + objIoAddress["packet"] = info.nPacket; + objIoAddress["offset"] = info.nOffset; } - else if(info.type == "遥控"){ - tpe = 2; + objDataSource["io_address"] = objIoAddress; + + QJsonObject objEventPlan; + QJsonObject objCause; + QJsonObject objAction; + QJsonArray arrPara; + objEventPlan["enable"] = info.bEnable; + if(tpe == 0){ //遥测 + for(auto iter = info.mapTE.begin();iter != info.mapTE.end();++iter){ + objCause[iter.key()] = iter.value(); + } } - else if(info.type == "遥调"){ - tpe = 3; + else if(tpe == 1){ //遥信 + objCause["edge"] = info.sEdge; } - else if(info.type == "整定值"){ - tpe = 4; + objEventPlan["cause"] = objCause; + + objAction["command"] = info.sCommand; + for(auto ¶:info.lstParameter){ + arrPara.append(para); } - QJsonObject obj; - obj["type"] = info.equipment; - obj["main_pos"] = info.channel; + objAction["parameters"] = arrPara; + objEventPlan["action"] = objAction; + + QString tempTag = info.tag+"_"+_pageName; //tag后加工程名,保持全局唯一 + bool val = DataBase::GetInstance()->ifMeasureExist(info.name,pData->uuid()); if(val){ - DataBase::GetInstance()->updateMeasurement(info.name,tpe,obj,info.size,pData->uuid()); + DataBase::GetInstance()->updateMeasurement(info.name,tpe,objDataSource,objEventPlan,info.size,pData->uuid()); } else{ - DataBase::GetInstance()->insertMeasurement(info.name,info.tag,tpe,obj,info.size,info.bayUuid,info.componentUuid); + DataBase::GetInstance()->insertMeasurement(info.name,tempTag,tpe,objDataSource,objEventPlan,info.size,info.bayUuid,info.componentUuid); } for(int i = 0;i < lstDataBase.size();++i) //从数据库记录中移除操作过的对象 @@ -1078,7 +1199,13 @@ void FixedPortsModel::addPortsToItem_json(PortState sta,QJsonArray jArr,Graphics if(sta == P_const){ HandleType tye = HandleType(portObj["portType"].toInt()); PortPos locate = PortPos(portObj["locate"].toInt()); - pItem->addPort(P_const,QPointF(x,y),portId,tye,locate); + double ratioX = 0.0; + double ratioY = 0.0; + if(portObj.contains("xRatio") || portObj.contains("yRatio")){ + ratioX = portObj["xRatio"].toDouble(); + ratioY = portObj["yRatio"].toDouble(); + } + pItem->addPort(P_const,QPointF(x,y),portId,tye,locate,ratioX,ratioY); } else if(sta == p_movable){ pItem->addPort(p_movable,QPointF(x,y),portId); @@ -1101,6 +1228,14 @@ void FixedPortsModel::autoSetModelName(GraphicsBaseModelItem* pItem) } } +QString FixedPortsModel::removeSuffix(const QString& str) +{ + int lastUnderscore = str.lastIndexOf('_'); + if (lastUnderscore == -1) return str; // 没有下划线 + + return str.left(lastUnderscore); +} + QWidget* FixedPortsModel::getTopWidget() { @@ -1542,6 +1677,7 @@ void FixedPortsModel::addProjectItemByBaseData(DrawingPanel* pPanel,GraphicsBase GraphicsBaseModelItem* pBaseItem = _baseItem.value(pBase->uuid()); pPro->setSourceItemId(pBaseItem->itemId().toString()); //设置被哪个对象生成 pPro->setMetaModelName(pBase->metaModelName()); //传递基模名 + pPro->setPath(pBase->getBay()); QString sMeta = pBase->metaModelName(); QString sModel = pBase->modelName(); @@ -1622,7 +1758,7 @@ void FixedPortsModel::addProjectItemByBaseData(DrawingPanel* pPanel,GraphicsBase pPtGroup->setGroupType(1); pPtGroup->setLayout(1); pProItem = pPtGroup; - pProItem->setItemType(GIT_ctGroup); + pProItem->setItemType(GIT_ptGroup); } else if(type == GIT_baseES) { diff --git a/diagramCavas/source/graphicsItem/graphicsBaseItem.cpp b/diagramCavas/source/graphicsItem/graphicsBaseItem.cpp index 261955a..59976ae 100644 --- a/diagramCavas/source/graphicsItem/graphicsBaseItem.cpp +++ b/diagramCavas/source/graphicsItem/graphicsBaseItem.cpp @@ -511,6 +511,8 @@ void GraphicsProjectModelItem::updateConnectData() port["y"] = ptr->pos().y(); port["locate"] = ptr->portPos(); port["portType"] = ptr->getType(); + port["xRatio"] = ptr->getXPercent(); + port["yRatio"] = ptr->getYPercent(); arr.push_back(port); } } diff --git a/diagramCavas/source/measureSettingDlg.cpp b/diagramCavas/source/measureSettingDlg.cpp index f97e9b7..e3b980b 100644 --- a/diagramCavas/source/measureSettingDlg.cpp +++ b/diagramCavas/source/measureSettingDlg.cpp @@ -10,9 +10,13 @@ MeasureSettingDlg::MeasureSettingDlg(QWidget *parent) : QDialog(parent) , ui(new Ui::measureSettingDlg) ,_pBay(nullptr) + ,_pEventStrategy(nullptr) + ,_pEventYXGroup(nullptr) + ,_curMode(0) { ui->setupUi(this); this->setWindowFlags(Qt::FramelessWindowHint | windowFlags()); + setStyleSheet("background-color: white;"); initial(); } @@ -23,33 +27,61 @@ MeasureSettingDlg::~MeasureSettingDlg() void MeasureSettingDlg::initial() { + _pEventStrategy = new QButtonGroup(this); + _pEventStrategy->addButton(ui->rb_eventOff,0); + _pEventStrategy->addButton(ui->rb_eventOn,1); + + _pEventYXGroup = new QButtonGroup(this); + _pEventYXGroup->addButton(ui->rb_yxDown,0); + _pEventYXGroup->addButton(ui->rb_yxRise,1); + + connect(_pEventStrategy,&QButtonGroup::idClicked,this,&MeasureSettingDlg::onEventStrategyChange); + connect(ui->btn_ok,&QPushButton::clicked,this,&MeasureSettingDlg::onOkClicked); connect(ui->btn_cancel,&QPushButton::clicked,this,&MeasureSettingDlg::onCancelClicked); + connect(ui->btn_addPara,&QPushButton::clicked,this,&MeasureSettingDlg::onAddParaClicked); + connect(ui->btn_delPara,&QPushButton::clicked,this,&MeasureSettingDlg::onDelParaClicked); connect(ui->cb_tag,&QComboBox::textActivated,this,&MeasureSettingDlg::onTagChanged); connect(ui->cb_name,&QComboBox::textActivated,this,&MeasureSettingDlg::onNameChanged); + connect(ui->cb_rule,&QComboBox::currentIndexChanged, this,&MeasureSettingDlg::onRuleIndexChanged); + connect(ui->cb_type,&QComboBox::currentIndexChanged, this,&MeasureSettingDlg::onTypeIndexChanged); + // 设置正则验证器:1-5000整数 QRegularExpression regExp("^(?:[1-9]|[1-9]\\d{1,2}|[1-4]\\d{3}|5000)$"); QRegularExpressionValidator *validator = new QRegularExpressionValidator(regExp,ui->le_size); ui->le_size->setValidator(validator); + + ui->cb_rule->setItemData(0, 1); + ui->cb_rule->setItemData(1, 2); } void MeasureSettingDlg::showDlg() { + _curMode = 0; + //ui->cb_tag->setEditable(true); + //ui->cb_name->setEditable(true); clearData(); QStringList lstTag; QStringList lstName; show(); if(_pBay){ + QString curItemName; //当前元件名称 + if(_pBay){ + auto pItemData = _pBay->getProperty(); + curItemName = pItemData->name(); + } auto lst = _pBay->getValidType(); for(auto& item:lst){ + item.tag = item.tag+"_"+curItemName; + item.name = item.name+"_"+curItemName; lstTag.append(item.tag); lstName.append(item.name); } ui->cb_tag->addItems(lstTag); ui->cb_name->addItems(lstName); - QStringList lstDevice; + /*QStringList lstDevice; if(_pBay){ FixedPortsModel* pModel = _pBay->getModelController(); if(pModel){ @@ -61,16 +93,108 @@ void MeasureSettingDlg::showDlg() } } } - } - - ui->cb_equip->addItems(lstDevice); + }*/ + ui->cb_equip->clear(); + ui->cb_equip->addItem(curItemName); BaseProperty* pro = _pBay->getProperty(); if(pro){ ui->cb_equip->setCurrentText(pro->tag()); + ui->le_s1->setText(pro->station()); + ui->le_s2->setText(pro->station()); } } } +void MeasureSettingDlg::showDlg(MeasurementInfo info) +{ + show(); + //ui->cb_tag->setEditable(false); + //ui->cb_name->setEditable(false); + _curMode = 1; + clearData(); + ui->cb_tag->setCurrentText(info.tag); + ui->cb_name->setCurrentText(info.name); + ui->cb_equip->setCurrentText(info.equipment); + ui->le_port->setText(info.channel); + ui->cb_type->setCurrentIndex(info.type); + ui->le_size->setText(QString::number(info.size)); + + if(info.nSource == 1){ //3611 + ui->cb_rule->setCurrentIndex(0); + ui->le_s1->setText(info.sStation); + ui->le_d1->setText(info.equipment); + if(info.type == 0){ //遥测 + ui->cb_channelYC->setCurrentText(info.sChannel); + } + else if(info.type == 1){ //遥信 + ui->cb_channelYX->setCurrentText(info.sChannel); + } + else if(info.type == 2){ //遥控 + ui->cb_channelYK->setCurrentText(info.sChannel); + } + } + else if(info.nSource == 2){ //104 + ui->cb_rule->setCurrentIndex(1); + ui->le_s2->setText(info.sStation); + ui->le_packet->setText(QString::number(info.nPacket)); + ui->le_offset->setText(QString::number(info.nOffset)); + } + + if(info.bEnable){ + ui->rb_eventOn->setChecked(true); + } + else{ + ui->rb_eventOff->setChecked(true); + } + ui->le_measure->setText(ui->cb_type->currentText()); + if(info.type == 0){ //遥测 + if(info.mapTE.contains("upup")){ + ui->checkBox_upup->setChecked(true); + ui->dbsb_upup->setValue(info.mapTE["upup"]); + } + else{ + ui->checkBox_upup->setChecked(false); + } + + if(info.mapTE.contains("up")){ + ui->checkBox_up->setChecked(true); + ui->dbsb_up->setValue(info.mapTE["up"]); + } + else{ + ui->checkBox_up->setChecked(false); + } + + if(info.mapTE.contains("down")){ + ui->checkBox_down->setChecked(true); + ui->dbsb_down->setValue(info.mapTE["down"]); + } + else{ + ui->checkBox_down->setChecked(false); + } + + if(info.mapTE.contains("downdown")){ + ui->checkBox_downdown->setChecked(true); + ui->dbsb_downdown->setValue(info.mapTE["downdown"]); + } + else{ + ui->checkBox_downdown->setChecked(false); + } + } + else if(info.type == 1){ //遥信 + if(info.sEdge == "raising"){ //上升沿 + ui->rb_yxRise->setChecked(true); + } + else if(info.sEdge == "falling"){ //上升沿 + ui->rb_yxDown->setChecked(true); + } + } + + ui->cb_command->setCurrentText(info.sCommand); + for(auto ¶:info.lstParameter){ + ui->lst_parameter->addItem(para); + } +} + void MeasureSettingDlg::clearData() { if(ui->cb_tag->count()) @@ -79,6 +203,20 @@ void MeasureSettingDlg::clearData() ui->cb_name->clear(); ui->le_port->clear(); ui->le_size->clear(); + ui->cb_type->setCurrentIndex(0); + ui->cb_rule->setCurrentIndex(0); + ui->rb_eventOff->setChecked(true); + ui->checkBox_upup->setChecked(false); + ui->checkBox_up->setChecked(false); + ui->checkBox_down->setChecked(false); + ui->checkBox_downdown->setChecked(false); + ui->dbsb_upup->clear(); + ui->dbsb_up->clear(); + ui->dbsb_down->clear(); + ui->dbsb_downdown->clear(); + ui->cb_command->setCurrentIndex(0); + ui->le_parameter->clear(); + ui->lst_parameter->clear(); } void MeasureSettingDlg::onOkClicked() @@ -88,15 +226,55 @@ void MeasureSettingDlg::onOkClicked() info.name = ui->cb_name->currentText(); info.equipment = ui->cb_equip->currentText(); info.channel = ui->le_port->text(); - info.type = ui->cb_type->currentText(); + info.type = ui->cb_type->currentIndex(); info.size = ui->le_size->text().toInt(); - if(info.channel.isEmpty() || info.size == 0){ - QMessageBox::information(NULL, QString("提示"), QString::fromWCharArray(L"参数未设置完毕")); - return; + + info.nSource = ui->cb_rule->currentData().toInt(); + if(info.nSource == 1){ //cl3611 + info.sStation = ui->le_s1->text(); + } + else if(info.nSource == 2){ + info.sStation = ui->le_s2->text(); + } + if(info.type == 0) + info.sChannel = ui->cb_channelYC->currentText(); + else if(info.type == 1) + info.sChannel = ui->cb_channelYX->currentText(); + else if(info.type == 2) + info.sChannel = ui->cb_channelYK->currentText(); + info.nPacket = ui->le_packet->text().toInt(); //包号 + info.nOffset = ui->le_offset->text().toInt(); //偏移量 + if(_pEventStrategy){ //事件策略开关 + info.bEnable = _pEventStrategy->checkedId(); + } + + if(ui->checkBox_upup->isChecked()){ + info.mapTE.insert("upup",ui->dbsb_upup->value()); + } + if(ui->checkBox_up->isChecked()){ + info.mapTE.insert("up",ui->dbsb_up->value()); + } + if(ui->checkBox_downdown->isChecked()){ + info.mapTE.insert("downdown",ui->dbsb_downdown->value()); + } + if(ui->checkBox_down->isChecked()){ + info.mapTE.insert("down",ui->dbsb_down->value()); + } + + if(_pEventYXGroup->checkedId() == 0){ + info.sEdge = "falling"; + } + else if(_pEventYXGroup->checkedId() == 1){ + info.sEdge = "raising"; + } + info.sCommand = ui->cb_command->currentText(); + for(int i = 0;i < ui->lst_parameter->count();++i){ + QListWidgetItem *item = ui->lst_parameter->item(i); + info.lstParameter.append(item->text()); } if(_pBay) - _pBay->addMeasure(info); + _pBay->addMeasure(info,_curMode); hide(); } @@ -126,3 +304,60 @@ void MeasureSettingDlg::onNameChanged(const QString& str) } } } + +void MeasureSettingDlg::onRuleIndexChanged(int n) +{ + ui->sw_type->setCurrentIndex(n); +} + +void MeasureSettingDlg::onTypeIndexChanged(int n) +{ + switch (n) { + case 0: //遥测 + ui->sw_channel->setCurrentIndex(0); + ui->gb_yc->setVisible(true); + ui->gb_yx->setVisible(false); + break; + case 1: //遥信 + ui->sw_channel->setCurrentIndex(1); + ui->gb_yc->setVisible(false); + ui->gb_yx->setVisible(true); + break; + case 2: //遥控 + ui->sw_channel->setCurrentIndex(2); + ui->gb_yc->setVisible(false); + ui->gb_yx->setVisible(false); + break; + default: + ui->gb_yc->setVisible(false); + ui->gb_yx->setVisible(false); + break; + } + ui->le_measure->setText(ui->cb_type->currentText()); +} + +void MeasureSettingDlg::onAddParaClicked() +{ + QString str = ui->le_parameter->text(); + auto lst = ui->lst_parameter->findItems(str,Qt::MatchExactly); + if(lst.isEmpty()){ //列表中不存在 + ui->lst_parameter->addItem(str); + } +} + +void MeasureSettingDlg::onDelParaClicked() +{ + auto pItem = ui->lst_parameter->takeItem(ui->lst_parameter->currentRow()); + if(pItem) + delete pItem; +} + +void MeasureSettingDlg::onEventStrategyChange(int n) +{ + if(n == 0){ //不启用 + ui->sw_event->setCurrentIndex(0); + } + else if(n == 1){ //启用 + ui->sw_event->setCurrentIndex(1); + } +} diff --git a/diagramCavas/source/projectIconSetting.cpp b/diagramCavas/source/projectIconSetting.cpp index 1e39664..914b50a 100644 --- a/diagramCavas/source/projectIconSetting.cpp +++ b/diagramCavas/source/projectIconSetting.cpp @@ -7,6 +7,7 @@ #include "projectModelManager.h" #include #include +#include "global.h" ProjectIconSetting::ProjectIconSetting(QWidget *parent) : QDialog(parent) @@ -80,7 +81,7 @@ void ProjectIconSetting::addItems(QMap mapSvg) // 创建目标大小的pixmap QPixmap pixmap(_iconSize); - //pixmap.fill(Qt::transparent); // 透明背景 + pixmap.fill(Qt::transparent); // 透明背景 // 创建画家并在pixmap上绘制SVG QPainter painter(&pixmap); @@ -101,7 +102,7 @@ void ProjectIconSetting::selectImage(int row) if (!selectedSVG.isEmpty()) { QSvgRenderer renderer(selectedSVG); QPixmap pixmap(32, 32); - pixmap.fill(Qt::transparent); + //pixmap.fill(Qt::transparent); QPainter painter(&pixmap); renderer.render(&painter); diff --git a/diagramCavas/source/projectModelSetting.cpp b/diagramCavas/source/projectModelSetting.cpp index d8e2b85..48ea51c 100644 --- a/diagramCavas/source/projectModelSetting.cpp +++ b/diagramCavas/source/projectModelSetting.cpp @@ -72,7 +72,7 @@ void ProjectModelSetting::loadPicture() { QString sPath = path+files.at(i); QPixmap pixmap(sPath); - pixmap.fill(Qt::transparent); + //pixmap.fill(Qt::transparent); QListWidgetItem *newitem=new QListWidgetItem(QIcon(pixmap.scaled(100, 100)),files.at(i)); QFile file(sPath); if (!file.open(QIODevice::ReadOnly)) { @@ -202,7 +202,7 @@ void ProjectModelSetting::onSelectClicked() { if(!_curItemData->getModelProperty().modelSetting.mapSvg.contains(item->text())) { - QByteArray data = item->data(Qt::UserRole + 1).toByteArray(); + QByteArray data = QByteArray::fromHex(item->data(Qt::UserRole + 1).toByteArray()); _curItemData->getModelProperty().modelSetting.mapSvg.insert(item->text(),data); } lst.append(item->text()); @@ -320,7 +320,7 @@ void ProjectModelSetting::onSaveClicked() { PropertyModel pro = _curItemData->getModelProperty().deepCopy(); ProjectModelManager::instance().getData()[_curItemData->metaModelName()][sModelName] = pro; - ProjectModelManager::instance().updateSetting(_curItemData->metaModelName(),sModelName); + ProjectModelManager::instance().updateSetting(_curItemData->metaModelName(),sModelName,true); QMap mapCheckState = DataBase::GetInstance()->getCheckStateFromManager(sModelName); QString sRes = ProjectModelManager::instance().modifyProjectModel(sMeta,sModelName,mapCheckState); if(!sRes.isEmpty()) @@ -344,7 +344,7 @@ void ProjectModelSetting::onSaveClicked() 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); + ProjectModelManager::instance().updateSetting(_curItemData->metaModelName(),sModelName,true); QMessageBox::information(NULL, QString("提示"), QString::fromWCharArray(L"保存成功")); } diff --git a/diagramCavas/source/ptExtraInfoDlg.cpp b/diagramCavas/source/ptExtraInfoDlg.cpp index 107c1e5..d1a2949 100644 --- a/diagramCavas/source/ptExtraInfoDlg.cpp +++ b/diagramCavas/source/ptExtraInfoDlg.cpp @@ -4,6 +4,7 @@ #include "basePropertyManager.h" #include #include +#include PtExtraInfoDlg::PtExtraInfoDlg(QWidget *parent) : BaseContentDlg(parent) @@ -82,6 +83,8 @@ QMap PtExtraInfoDlg::getPropertyValue(BaseProperty* p QJsonObject obj; obj["id"] = info.id; obj["transformationRatio"] = info.transRatio; + obj["minTransformationRatio"] = info.minTransRatio; + obj["maxTransformationRatio"] = info.maxTransRatio; obj["accuracyClass"] = info.accuracyClass; obj["secondaryLoadCapacity"] = info.secondaryLoadCapacity; obj["windingConnectionMethod"] = info.windingConnectionMethod; @@ -101,51 +104,58 @@ void PtExtraInfoDlg::setPropertyValue(QVariant var) QMap map = var.value>(); for(auto &info:map) { - if(info.name == "额定电压") //此处应为类型名 + if(info.name == "额定电压(V)" || info.name == "un_v") //此处应为类型名 { ui->le_ratedVol->setText(QString::number(info.defaultValue.toDouble())); } - else if(info.name == "工频耐压") + else if(info.name == "工频耐压(V/1min)" || info.name == "uac_v_1min") { ui->le_pfwv_pt->setText(QString::number(info.defaultValue.toDouble())); } - else if(info.name == "冲击耐压") + else if(info.name == "冲击耐压(V)" || info.name == "uimp_v") { ui->le_iwv_pt->setText(QString::number(info.defaultValue.toDouble())); } - else if(info.name == "额定电压因数") + else if(info.name == "额定电压因数" || info.name == "rvf") { ui->le_ratedVolFactor->setText(QString::number(info.defaultValue.toDouble())); } - else if(info.name == "一次绕组接线接地方式") + else if(info.name == "一次绕组接线接地方式" || info.name == "pwcc") { ui->le_pwwgm->setText(info.defaultValue.toString()); } - else if(info.name == "额定频率") + else if(info.name == "额定频率(Hz)" || info.name == "fn_hz") { ui->le_rf_pt->setText(QString::number(info.defaultValue.toDouble())); } - else if(info.name == "相数") + else if(info.name == "相数" || info.name == "phase_num") { if(info.defaultValue.toInt() == 1) ui->rb_tpt_pt->setChecked(true); else ui->rb_spt_pt->setChecked(true); } - else if(info.name == "pt绕组") + else if(info.name == "PT二次绕组" || info.name == "pt_sec_winding") { - QJsonObject object = info.defaultValue.toJsonObject(); + QString jsonString = info.defaultValue.toString(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(jsonString.toUtf8().data()); + QJsonObject jsonObject = jsonDocument.object(); + + QJsonObject object = jsonObject; + QJsonArray arr = object["winding"].toArray(); for (QJsonValueRef jsonObj : arr) { QJsonObject node = jsonObj.toObject(); int id = node["id"].toInt(); QString sTr = node["transformationRatio"].toString(); + QString sMinTr = node["minTransformationRatio"].toString(); + QString sMaxTr = node["maxTransformationRatio"].toString(); QString sAr = node["accuracyClass"].toString(); QString sSlc = node["secondaryLoadCapacity"].toString(); QString sWin = node["windingConnectionMethod"].toString(); - addTableRow(sTr,sAr,sSlc,sWin,id); + addTableRow(sTr,sMinTr,sMaxTr,sAr,sSlc,sWin,id); } } } @@ -154,10 +164,12 @@ void PtExtraInfoDlg::setPropertyValue(QVariant var) void PtExtraInfoDlg::onAddClicked() { QString sTr = ui->le_tr_pt->text(); + QString sMinTr = ui->le_trMin_pt->text(); + QString sMaxTr = ui->le_trMax_pt->text(); QString sAr = ui->le_ac_pt->text(); QString sSlc = ui->le_slc_pt->text(); QString sWinding = ui->cb_wcm->currentText(); - addTableRow(sTr,sAr,sSlc,sWinding); + addTableRow(sTr,sMinTr,sMaxTr,sAr,sSlc,sWinding); } void PtExtraInfoDlg::onDeleteClicked() @@ -175,7 +187,7 @@ void PtExtraInfoDlg::onDeleteClicked() } } -void PtExtraInfoDlg::addTableRow(QString sTr,QString sAr,QString sSlc,QString sWinding,int id) +void PtExtraInfoDlg::addTableRow(QString sTr,QString sTrMin,QString sTrMax,QString sAr,QString sSlc,QString sWinding,int id) { if(_mapPT.contains(QString::number(id))) { @@ -199,21 +211,29 @@ void PtExtraInfoDlg::addTableRow(QString sTr,QString sAr,QString sSlc,QString sW item->setData(Qt::UserRole,info.id); ui->tb_pt->setItem(row, 0, item); + //最小变比 + ui->tb_pt->setItem(row, 1, new QTableWidgetItem(sTrMin)); + + //最大变比 + ui->tb_pt->setItem(row, 2, new QTableWidgetItem(sTrMax)); + // 精度等级(下拉框) - ui->tb_pt->setItem(row, 1, new QTableWidgetItem(sAr)); + ui->tb_pt->setItem(row, 3, new QTableWidgetItem(sAr)); // 二次负载容量(输入框) - ui->tb_pt->setItem(row, 2, new QTableWidgetItem(sSlc)); + ui->tb_pt->setItem(row, 4, new QTableWidgetItem(sSlc)); // 绕组接法(下拉框) - ui->tb_pt->setItem(row, 3, new QTableWidgetItem(sWinding)); + ui->tb_pt->setItem(row, 5, new QTableWidgetItem(sWinding)); // 删除按钮 QPushButton *deleteBtn = new QPushButton("删除"); connect(deleteBtn, &QPushButton::clicked, this, &PtExtraInfoDlg::onDeleteClicked); - ui->tb_pt->setCellWidget(row, 4, deleteBtn); + ui->tb_pt->setCellWidget(row, 6, deleteBtn); info.transRatio = sTr; + info.minTransRatio = sTrMin; + info.maxTransRatio = sTrMax; info.accuracyClass = sAr; info.secondaryLoadCapacity = sSlc; info.windingConnectionMethod = sWinding; diff --git a/diagramCavas/ui/ctExtraInfoDlg.ui b/diagramCavas/ui/ctExtraInfoDlg.ui index 941e45a..22f3722 100644 --- a/diagramCavas/ui/ctExtraInfoDlg.ui +++ b/diagramCavas/ui/ctExtraInfoDlg.ui @@ -37,7 +37,7 @@ 10 - + @@ -69,21 +69,14 @@ - + false - - - - A - - - - + 动稳定电流 @@ -93,21 +86,21 @@ - + false - + A - + 短时热电流 @@ -117,14 +110,14 @@ - + false - + As @@ -148,14 +141,14 @@ - + V/1min - + 冲击耐压 @@ -165,21 +158,21 @@ - + false - + V - + 仪表保安系数 @@ -189,14 +182,14 @@ - + false - + 额定频率 @@ -206,14 +199,14 @@ - + false - + Hz @@ -258,7 +251,7 @@ - + false @@ -266,6 +259,30 @@ + + + false + + + + + + + 最大变比 + + + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter + + + + + + + false + + + + 精度等级 @@ -275,28 +292,28 @@ - + false - + 二次负载容量 - + false - + @@ -315,13 +332,13 @@ - + false - 180 + 100 true @@ -331,6 +348,16 @@ 变比 + + + 最小变比 + + + + + 最大变比 + + 精度等级 @@ -348,6 +375,23 @@ + + + + A + + + + + + + 最小变比 + + + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter + + + diff --git a/diagramCavas/ui/measureSettingDlg.ui b/diagramCavas/ui/measureSettingDlg.ui index e7fb0d1..f426d13 100644 --- a/diagramCavas/ui/measureSettingDlg.ui +++ b/diagramCavas/ui/measureSettingDlg.ui @@ -6,8 +6,8 @@ 0 0 - 439 - 310 + 452 + 536 @@ -18,9 +18,9 @@ Dialog - + - 10 + 0 0 @@ -90,241 +90,1079 @@ - - - TAG/名称 + + + 0 - - - - - Qt::Orientation::Horizontal - - - - 40 - 20 - - - - - - - - TAG: - - - Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - - - - - - - - 150 - 0 - - - - - - - - 名称: - - - Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - - - - - - - - 150 - 0 - - - - - - - - Qt::Orientation::Horizontal - - - - 40 - 20 - - - - - - - - - - - 设备/端子 - - - - - - Qt::Orientation::Horizontal - - - - 40 - 20 - - - - - - - - 设备: - - - - - - - - 150 - 0 - - - - - - - - 端子: - - - - - - - - 150 - 0 - - - - - - - - Qt::Orientation::Horizontal - - - - 40 - 20 - - - - - - - - - - - 类型/SIZE - - - - - - Qt::Orientation::Horizontal - - - - 40 - 20 - - - - - - - - 类型: - - - - - - - - 150 - 0 - - - + + + 基本参数 + + + + 10 + + + - 遥测 + 端子: - - + + + + - 遥信 + 数据大小(size): - - + + + + + + + 0 + 0 + + + + + 80 + 16777215 + + + + + + - 遥控 + 标签(tag): - - + + Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter + + + + + - 遥调 + 设备: - - + + + + + + + 150 + 0 + + + + + + + + + 150 + 0 + + + + + + + + + 150 + 0 + + + + + + - 整定值 + 类型: - - - - - - - SIZE: - - - - - - - - 150 - 0 - - - - - - - - Qt::Orientation::Horizontal - - - - 40 - 20 - - - - - + + + + + + (唯一标识) + + + Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter + + + + + + + + 150 + 0 + + + + + 遥测 + + + + + 遥信 + + + + + 遥控 + + + + + + + + 名称: + + + Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter + + + + + + + + 150 + 0 + + + + + + + + Qt::Orientation::Vertical + + + + 20 + 40 + + + + + + + + + 通信配置 + + + + + + 规约类型: + + + Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter + + + + + + + + CL3611规约 + + + + + 104规约 + + + + + + + + + 80 + 0 + + + + + + + + + + + Qt::Orientation::Horizontal + + + + + + + 0 + + + + + 0 + + + 0 + + + 0 + + + 10 + + + + + 子站名称(station): + + + Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter + + + + + + + + + + 设备名称(device): + + + Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter + + + + + + + + + + + 16777215 + 22 + + + + 0 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 16777215 + 22 + + + + + TM1 + + + + + TM2 + + + + + TM3 + + + + + TM4 + + + + + TM5 + + + + + TM6 + + + + + TM7 + + + + + TM8 + + + + + P + + + + + Q + + + + + S + + + + + PF + + + + + F + + + + + dF + + + + + UAB + + + + + UBC + + + + + UCA + + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + TS01 + + + + + TS02 + + + + + TS03 + + + + + TS04 + + + + + TS05 + + + + + TS06 + + + + + TS07 + + + + + TS08 + + + + + TS09 + + + + + TS10 + + + + + TS11 + + + + + TS12 + + + + + TS13 + + + + + TS14 + + + + + TS15 + + + + + TS16 + + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + TC1 + + + + + TC2 + + + + + TC3 + + + + + TC4 + + + + + TC5 + + + + + TC6 + + + + + TC7 + + + + + TC8 + + + + + TC9 + + + + + + + + + + + + + 80 + 0 + + + + + + + + + + + 通道名称(channel): + + + Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter + + + + + + + Qt::Orientation::Vertical + + + + 20 + 40 + + + + + + + + + + 0 + + + 0 + + + 0 + + + 10 + + + + + + + + + 80 + 0 + + + + + + + + + + + + + + 偏移量(offset): + + + Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter + + + + + + + 包号(packet): + + + Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter + + + + + + + 子站名称(station): + + + Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter + + + + + + + + + + Qt::Orientation::Vertical + + + + 20 + 40 + + + + + + + + + + + + + 事件策略 + + + + + + 事件策略: + + + Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter + + + + + + + 启用 + + + + + + + 禁用 + + + + + + + + 80 + 0 + + + + + + + + + + + Qt::Orientation::Horizontal + + + + + + + 1 + + + + + + + + + 80 + 0 + + + + + + + + + + + 遥信事件原因 + + + + + + 信号变化: + + + Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter + + + + + + + 上升沿(raising) + + + + + + + 下降沿(falling) + + + + + + + + + + 量测类型: + + + Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter + + + + + + + + 22 + 22 + + + + - + + + + + + + + + + Qt::Orientation::Horizontal + + + + + + + + 22 + 22 + + + + + + + + + + + + 遥测事件原因 + + + + + + 越上限(upup) + + + + + + + 阈值: + + + Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter + + + + + + + 1 + + + 0.000000000000000 + + + + + + + + 80 + 0 + + + + + + + + + + + 越上限(up) + + + + + + + 阈值: + + + Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter + + + + + + + 1 + + + 0.000000000000000 + + + + + + + + 80 + 0 + + + + + + + + + + + 越下限(down) + + + + + + + 阈值: + + + Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter + + + + + + + 1 + + + 0.000000000000000 + + + + + + + + 80 + 0 + + + + + + + + + + + 越下限(downdown) + + + + + + + 阈值: + + + Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter + + + + + + + 1 + + + 0.000000000000000 + + + + + + + + 80 + 0 + + + + + + + + + + + Qt::Orientation::Vertical + + + + 20 + 40 + + + + + + + + + + + 命令级别: + + + Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter + + + + + + + 参数列表: + + + Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter + + + + + + + + info + + + + + warning + + + + + error + + + + + critical + + + + + exception + + + + + + + + + + + + + + + + diff --git a/diagramCavas/ui/ptExtraInfoDlg.ui b/diagramCavas/ui/ptExtraInfoDlg.ui index 0555cf9..4e94f92 100644 --- a/diagramCavas/ui/ptExtraInfoDlg.ui +++ b/diagramCavas/ui/ptExtraInfoDlg.ui @@ -31,10 +31,13 @@ 10 - + + 6 + + 10 - + @@ -66,21 +69,21 @@ - + false - + V - + 工频耐压 @@ -90,21 +93,21 @@ - + false - + V/1min - + 冲击耐压 @@ -114,14 +117,14 @@ - + false - + V @@ -138,14 +141,14 @@ - + false - + 一次绕组接线接地方式 @@ -155,14 +158,14 @@ - + false - + 额定频率 @@ -172,14 +175,14 @@ - + false - + Hz @@ -193,21 +196,21 @@ - + 三相互感器 - + 单相互感器 - + 本元件内含PT二次绕组的配置: @@ -221,49 +224,77 @@ - + false - - + + - 精度等级 + 最小变比 - - + + false - - + + - 二次负载容量 + 最大变比 - - + + false + + + 精度等级 + + + + + + + false + + + + + + + 二次负载容量 + + + + + + + false + + + + 绕组接法 - + Y @@ -280,7 +311,7 @@ - + @@ -299,7 +330,7 @@ - + false @@ -315,6 +346,16 @@ 变比 + + + 最小变比 + + + + + 最大变比 + + 精度等级 diff --git a/diagramUtils/include/dataBase.h b/diagramUtils/include/dataBase.h index 3b17e19..0295c07 100644 --- a/diagramUtils/include/dataBase.h +++ b/diagramUtils/include/dataBase.h @@ -68,8 +68,8 @@ public: bool ifBayExist(QUuid uuid); bool deleteBay(QUuid uuid); /*********************************************************************************/ - bool insertMeasurement(QString name,QString tag,int type,QJsonObject dataSource,int size,QUuid bayId,QUuid componentId); - bool updateMeasurement(QString name,int type,QJsonObject dataSource,int size,QUuid componentId); + bool insertMeasurement(QString name,QString tag,int type,QJsonObject dataSource,QJsonObject eventPlan,int size,QUuid bayId,QUuid componentId); + bool updateMeasurement(QString name,int type,QJsonObject dataSource,QJsonObject eventPlan,int size,QUuid componentId); bool delteMeasurement(QString name,QUuid componentId); bool ifMeasureExist(QString name,QUuid componentId); QList getMeasurement(QUuid componentId); diff --git a/diagramUtils/include/projectModelManager.h b/diagramUtils/include/projectModelManager.h index 94c639b..0b77d29 100644 --- a/diagramUtils/include/projectModelManager.h +++ b/diagramUtils/include/projectModelManager.h @@ -23,7 +23,7 @@ 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); //更新模型数据(图片 + void updateSetting(const QString& sMeta,const QString& sPro,bool toHex = false); //更新模型数据(图片 toHex转换数据为16进制 QStringList getProjectModelLst(const QString& sMeta); public: QStringList getModelList() const; //获取元模型列表 @@ -45,6 +45,11 @@ private: QJsonObject getSelectedState(QList select,QList base); //返回json格式的选中状态 QString getItemDataType(const QStandardItem* pItem); //返回数据类型 projectModelSetting getModelSetting(const QString& sMeta,const QString& sProject); //获取指定工程模的设定 + + QByteArray cleanHexData(const QByteArray& hexData); + QByteArray fixHexLength(const QByteArray& hexData); + QByteArray extractHexOnly(const QByteArray& data); + QByteArray safeFromHex(const QByteArray& hexData); private: MapMeta m_mapTotalData; bool _bInitialised; diff --git a/diagramUtils/source/dataBase.cpp b/diagramUtils/source/dataBase.cpp index 838a7b1..c14bdc0 100644 --- a/diagramUtils/source/dataBase.cpp +++ b/diagramUtils/source/dataBase.cpp @@ -9,6 +9,7 @@ #include #include #include +#include DataBase* DataBase::dbInstance = nullptr; int DataBase::_id = 0; @@ -307,7 +308,14 @@ bool DataBase::insertDynamicProperty(QUuid uuid,groupStateValue groupValue) { strPros += QString(",")+pro.name; strPronouns += QString(",?"); - params.append(pro.defaultValue); + if(pro.defaultValue.userType() == qMetaTypeId()) //json特殊处理 + { + QJsonDocument contextDoc(pro.defaultValue.toJsonObject()); + QString strCon = contextDoc.toJson(QJsonDocument::Compact); + params.append(strCon); + } + else + params.append(pro.defaultValue); } QString strSQL = QString("INSERT INTO %1(global_uuid, attribute_group%2) VALUES (?, ?%3)").arg(groupValue.tableName,strPros,strPronouns); @@ -331,7 +339,14 @@ bool DataBase::updateDynamicProperty(QUuid uuid,groupStateValue groupValue) for(auto &pro:groupValue.mapInfo[uuid]) { setClauses.append(QString("%1 = ?").arg(pro.name)); - params.append(pro.defaultValue); + if(pro.defaultValue.userType() == qMetaTypeId()) //json特殊处理 + { + QJsonDocument contextDoc(pro.defaultValue.toJsonObject()); + QString strCon = contextDoc.toJson(QJsonDocument::Compact); + params.append(strCon); + } + else + params.append(pro.defaultValue); } params.append(uuid); @@ -1369,17 +1384,21 @@ bool DataBase::deleteBay(QUuid uuid) } /*****************************************************************************/ -bool DataBase::insertMeasurement(QString name,QString tag,int type,QJsonObject dataSource,int size,QUuid bayId,QUuid componentId) +bool DataBase::insertMeasurement(QString name,QString tag,int type,QJsonObject dataSource,QJsonObject eventPlan,int size,QUuid bayId,QUuid componentId) { - QString strSQL = "INSERT INTO measurement(tag, name, type, data_source, size, bay_uuid, component_uuid) VALUES (?, ?, ?, ?, ?, ?, ?)"; + QString strSQL = "INSERT INTO measurement(tag, name, type, data_source, event_plan, size, bay_uuid, component_uuid) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"; QJsonDocument dataDoc(dataSource); QString strData = dataDoc.toJson(QJsonDocument::Compact); + QJsonDocument eventDoc(eventPlan); + QString strEvent = eventDoc.toJson(QJsonDocument::Compact); + QVariantList params; params.append(tag); params.append(name); params.append(type); params.append(strData); + params.append(strEvent); params.append(size); params.append(bayId); params.append(componentId); @@ -1396,15 +1415,19 @@ bool DataBase::insertMeasurement(QString name,QString tag,int type,QJsonObject d } } -bool DataBase::updateMeasurement(QString name,int type,QJsonObject dataSource,int size,QUuid componentId) +bool DataBase::updateMeasurement(QString name,int type,QJsonObject dataSource,QJsonObject eventPlan,int size,QUuid componentId) { QJsonDocument dataDoc(dataSource); QString strData = dataDoc.toJson(QJsonDocument::Compact); - QString strSQL = "UPDATE measurement SET type = ?,data_source = ?,size = ? WHERE name = ? AND component_uuid = ?"; + QJsonDocument eventDoc(eventPlan); + QString strEvent = eventDoc.toJson(QJsonDocument::Compact); + + QString strSQL = "UPDATE measurement SET type = ?,data_source = ?,event_plan = ?,size = ? WHERE name = ? AND component_uuid = ?"; QVariantList params; params.append(type); params.append(strData); + params.append(strEvent); params.append(size); params.append(name); params.append(componentId); @@ -1466,7 +1489,7 @@ bool DataBase::ifMeasureExist(QString name,QUuid componentId) QList DataBase::getMeasurement(QUuid componentId) { QList lst; - QString strSQL = "SELECT tag, name, type, data_source, size, bay_uuid, component_uuid FROM measurement WHERE component_uuid = ?"; + QString strSQL = "SELECT tag, name, type, data_source, event_plan, size, bay_uuid, component_uuid FROM measurement WHERE component_uuid = ?"; QVariantList params; params.append(componentId); @@ -1478,14 +1501,49 @@ QList DataBase::getMeasurement(QUuid componentId) MeasurementInfo info; info.tag = query.value(0).toString(); info.name = query.value(1).toString(); - info.type = query.value(2).toString(); - QString con = query.value(3).toString(); - QJsonObject obj = QstringToJson(con); - info.equipment = obj["type"].toString(); - info.channel = obj["main_pos"].toString(); - info.size = query.value(4).toInt(); - info.bayUuid = QUuid(query.value(5).toString()); - info.componentUuid = QUuid(query.value(6).toString()); + info.type = query.value(2).toInt(); + + QString conData = query.value(3).toString(); + QJsonObject objData = QstringToJson(conData); + + QString sEvent = query.value(4).toString(); + QJsonObject objEvent = QstringToJson(sEvent); + + info.size = query.value(5).toInt(); + info.bayUuid = QUuid(query.value(6).toString()); + info.componentUuid = QUuid(query.value(7).toString()); + + info.nSource = objData["type"].toInt(); + QJsonObject objIoAddress = objData["io_address"].toObject(); + info.sStation = objData["station"].toString(); + info.equipment = objIoAddress["device"].toString(); + info.channel = objIoAddress["channel"].toString(); + info.sChannel = objIoAddress["channel"].toString(); + info.nPacket = objIoAddress["packet"].toInt(); + info.nOffset = objIoAddress["offset"].toInt(); + + info.bEnable = objEvent["enable"].toBool(); + QJsonObject objCause = objEvent["cause"].toObject(); + if(objCause.contains("upup")){ + info.mapTE.insert("upup",objCause["upup"].toDouble()); + } + if(objCause.contains("up")){ + info.mapTE.insert("up",objCause["up"].toDouble()); + } + if(objCause.contains("down")){ + info.mapTE.insert("down",objCause["down"].toDouble()); + } + if(objCause.contains("downdown")){ + info.mapTE.insert("downdown",objCause["downdown"].toDouble()); + } + info.sEdge = objCause["edge"].toString(); + QJsonObject objAction = objEvent["action"].toObject(); + info.sCommand = objAction["command"].toString(); + + QJsonArray arrPara = objAction["parameters"].toArray(); + for(const QJsonValue ¶Value:arrPara){ + info.lstParameter.append(paraValue.toString()); + } lst.append(info); } query.clear(); @@ -2352,7 +2410,11 @@ QMap DataBase::selectGroupPropertyByState(const QString pro.name = proVal.name; pro.type = proVal.type; pro.isVisibe = proVal.isVisibe; - pro.defaultValue = query.value(proVal.name ); + /*if(proVal.type == "JSONB"){ //json单独处理 + pro.defaultValue = query.value(proVal.name).toJsonObject(); + } + else*/ + pro.defaultValue = query.value(proVal.name ); info.insert(proVal.name ,pro); } map.insert(uuid,info); @@ -2403,7 +2465,7 @@ PropertyValueInfo DataBase::selectGroupPropertyByValue(const QString& tableName, } } -QList DataBase::getMeasureAttributeTypes() +QList DataBase::getMeasureAttributeTypes() //暂时调换获取的name与tag { QList lst; QString strSQL = "SELECT attribute,attribute_name FROM basic.attribute WHERE is_visible = ?"; @@ -2442,8 +2504,8 @@ QList DataBase::getMeasureAttributeTypes() QString tn2 = name; QString tt2 = tag; measureAttributeType measure; - measure.name = tn2.replace("sn",sn); - measure.tag = tt2.replace("sn",sn); + measure.tag = tn2.replace("sn",sn); + measure.name = tt2.replace("sn",sn); lst.append(measure); } } @@ -2464,8 +2526,8 @@ QList DataBase::getMeasureAttributeTypes() QString tn2 = name; QString tt2 = tag; measureAttributeType measure; - measure.name = tn2.replace("sn",sn); - measure.tag = tt2.replace("sn",sn); + measure.tag = tn2.replace("sn",sn); + measure.name = tt2.replace("sn",sn); lst.append(measure); } } @@ -2484,8 +2546,8 @@ QList DataBase::getMeasureAttributeTypes() QString tn2 = name; QString tt2 = tag; measureAttributeType measure; - measure.name = tn2.replace("sn",sn); - measure.tag = tt2.replace("sn",sn); + measure.tag = tn2.replace("sn",sn); + measure.name = tt2.replace("sn",sn); lst.append(measure); } } @@ -2503,8 +2565,8 @@ QList DataBase::getMeasureAttributeTypes() QString tag = attTag; measureAttributeType measure; - measure.name = name.replace("_$",i); - measure.tag = tag.replace("_$",i); + measure.tag = name.replace("_$",i); + measure.name = tag.replace("_$",i); lst.append(measure); } } @@ -2518,8 +2580,8 @@ QList DataBase::getMeasureAttributeTypes() QString tag = attTag; measureAttributeType measure; - measure.name = name.replace("_$",u); - measure.tag = tag.replace("_$",u); + measure.tag = name.replace("_$",u); + measure.name = tag.replace("_$",u); lst.append(measure); } } @@ -2534,8 +2596,8 @@ QList DataBase::getMeasureAttributeTypes() QString tag = attTag; measureAttributeType measure; - measure.name = name.replace("$",dor); - measure.tag = tag.replace("$",dor); + measure.tag = name.replace("$",dor); + measure.name = tag.replace("$",dor); lst.append(measure); } } @@ -2551,15 +2613,15 @@ QList DataBase::getMeasureAttributeTypes() QString tag = attTag; measureAttributeType measure; - measure.name = name.replace("sn",sn); - measure.tag = tag.replace("sn",sn); + measure.tag = name.replace("sn",sn); + measure.name = tag.replace("sn",sn); lst.append(measure); } } else{ //没有分支 measureAttributeType measure; - measure.name = attName; - measure.tag = attTag; + measure.tag = attName; + measure.name = attTag; lst.append(measure); } } diff --git a/diagramUtils/source/projectModelManager.cpp b/diagramUtils/source/projectModelManager.cpp index d15ff08..bb675ec 100644 --- a/diagramUtils/source/projectModelManager.cpp +++ b/diagramUtils/source/projectModelManager.cpp @@ -266,7 +266,7 @@ void ProjectModelManager::deleteData(const QString& sMeta,const QString& sProjec m_mapTotalData[sMeta].remove(sProject); } -void ProjectModelManager::updateSetting(const QString& sMeta,const QString& sProject) +void ProjectModelManager::updateSetting(const QString& sMeta,const QString& sProject,bool toHex) { QJsonObject object; QJsonArray arr; @@ -278,7 +278,14 @@ void ProjectModelManager::updateSetting(const QString& sMeta,const QString& sPro { QJsonObject obj; obj["name"] = iter.key(); - obj["data"] = QString::fromUtf8(iter.value()); + QString sData; + if(toHex){ + QByteArray svgString = QString(iter.value()).toUtf8().toHex(); + sData = QString::fromUtf8(svgString); + } + else + sData = QString::fromUtf8(iter.value()); + obj["data"] = sData; arr.push_back(obj); } object["picture"] = arr; @@ -287,7 +294,14 @@ void ProjectModelManager::updateSetting(const QString& sMeta,const QString& sPro { QJsonObject obj; obj["name"] = iter.key(); - obj["data"] = QString::fromUtf8(iter.value()); + QString sData; + if(toHex){ + QByteArray svgString = QString(iter.value()).toUtf8().toHex(); + sData = QString::fromUtf8(svgString); + } + else + sData = QString::fromUtf8(iter.value()); + obj["data"] = sData; arrUsed.push_back(obj); } object["usingPicture"] = arrUsed; @@ -831,7 +845,7 @@ projectModelSetting ProjectModelManager::getModelSetting(const QString& sMeta,co { QJsonObject node = jsonObj.toObject(); QString sName = node["name"].toString(); - QByteArray bData = QByteArray::fromHex(node["data"].toString().toUtf8()); + QByteArray bData = safeFromHex(node["data"].toString().toUtf8()); setting.mapSvg.insert(sName,bData); } @@ -840,8 +854,59 @@ projectModelSetting ProjectModelManager::getModelSetting(const QString& sMeta,co { QJsonObject node = jsonObj.toObject(); QString sName = node["name"].toString(); - QByteArray bData = QByteArray::fromHex(node["data"].toString().toUtf8()); + QByteArray bData = safeFromHex(node["data"].toString().toUtf8()); setting.mapUsedSvg.insert(sName,bData); } return setting; } + +QByteArray ProjectModelManager::cleanHexData(const QByteArray& hexData) { + QByteArray cleaned = hexData; + // 移除空格、换行等空白字符 + cleaned.replace(" ", ""); + cleaned.replace("\n", ""); + cleaned.replace("\t", ""); + cleaned.replace("\r", ""); + return cleaned; +} + +// 问题2: 数据长度不是偶数 +QByteArray ProjectModelManager::fixHexLength(const QByteArray& hexData) { + if (hexData.length() % 2 != 0) { + // 如果是奇数长度,在末尾补0 + return hexData + "0"; + } + return hexData; +} + +// 问题3: 包含非十六进制字符 +QByteArray ProjectModelManager::extractHexOnly(const QByteArray& data) { + QByteArray result; + for (char c : data) { + if ((c >= '0' && c <= '9') || + (c >= 'a' && c <= 'f') || + (c >= 'A' && c <= 'F')) { + result.append(c); + } + } + return result; +} + +QByteArray ProjectModelManager::safeFromHex(const QByteArray& hexData) { + + // 步骤1: 清理数据 + QByteArray cleaned = cleanHexData(hexData); + + // 步骤2: 检查并修复长度 + cleaned = fixHexLength(cleaned); + + // 步骤3: 提取纯十六进制字符(如果需要) + if (cleaned != extractHexOnly(cleaned)) { + cleaned = extractHexOnly(cleaned); + cleaned = fixHexLength(cleaned); + } + + // 步骤4: 尝试转换 + QByteArray result = QByteArray::fromHex(cleaned); + return result; +} diff --git a/source/mainwindow.cpp b/source/mainwindow.cpp index 828397c..fb20e7d 100644 --- a/source/mainwindow.cpp +++ b/source/mainwindow.cpp @@ -155,12 +155,12 @@ void CMainWindow::initializeAction() QAction* actRun = ui->menuMode->addAction(QString::fromWCharArray(L"运行")); connect(actRun,&QAction::triggered,m_pDiagramCavas,&DiagramCavas::onSignal_runPage); + QAction* actEditBay = ui->menuProject->addAction(QString::fromWCharArray(L"管理间隔")); + connect(actEditBay,&QAction::triggered,this,&CMainWindow::onAction_editBay); + QAction* actEdit = ui->menuProject->addAction(QString::fromWCharArray(L"编辑工程模")); connect(actEdit,&QAction::triggered,this,&CMainWindow::onAction_editProject); - QAction* actEditBay = ui->menuBay->addAction(QString::fromWCharArray(L"管理间隔")); - connect(actEditBay,&QAction::triggered,this,&CMainWindow::onAction_editBay); - QAction* testAct = ui->menuTest->addAction(QString::fromWCharArray(L"生成测试基模")); connect(testAct,&QAction::triggered,m_pDiagramCavas,&DiagramCavas::onCreateTestBaseModelDiagram); } diff --git a/source/topologyView.cpp b/source/topologyView.cpp index b5fac3b..4395919 100644 --- a/source/topologyView.cpp +++ b/source/topologyView.cpp @@ -59,9 +59,9 @@ void TopologyView::initial() QString sZone = nZ; QString sStation = nS; - if(info.tag.isEmpty()) + if(info.name.isEmpty()) continue; - QStandardItem *pItem = new QStandardItem(info.tag); + QStandardItem *pItem = new QStandardItem(info.name); pItem->setData(info.uuid.toString(),Qt::UserRole); addItemToView(sGrid,sZone,sStation,rootItem,pItem); } diff --git a/ui/mainwindow.ui b/ui/mainwindow.ui index f5430d6..5068403 100644 --- a/ui/mainwindow.ui +++ b/ui/mainwindow.ui @@ -43,11 +43,6 @@ 工程模 - - - 间隔管理 - - 测试 @@ -57,7 +52,6 @@ -