diff --git a/softwareDirectory/AutoVerScheme/verifywindow.cpp b/softwareDirectory/AutoVerScheme/verifywindow.cpp index 08208aa..3697494 100644 --- a/softwareDirectory/AutoVerScheme/verifywindow.cpp +++ b/softwareDirectory/AutoVerScheme/verifywindow.cpp @@ -24,6 +24,16 @@ } ui->tableWidgetStd->setColumnWidth(0, 60); ui->tableWidgetBiz->setColumnWidth(0, 60); + + //统一定义单位转换系数 + unitTransList=readDataFromFile("unitTrans.txt"); + //统一定义命令占位符 + cmdPlaceHolderList=readDataFromFile("cmdPlaceHolder.txt"); + //单位值特殊转换 + unitTypeTransList=readDataFromFile("unitTypeTrans.txt"); + //测试结果值填充列 + resultfillingList=readDataFromFile("resultfilling.txt"); + getVerifyMethod(); } @@ -33,6 +43,61 @@ delete ui; } +QMap VerifyWindow::readDataFromFile(QString filePath) { + // 获取应用程序的根目录 + QString path = QCoreApplication::applicationDirPath()+"\\File\\config\\"+filePath; + QMap dataMap; + QFile file(path); + if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { + // 错误处理 + qDebug() << "无法打开文件:" << file.errorString(); + QString str=file.errorString(); + return dataMap; + } + + QTextStream in(&file); + in.setCodec("UTF-8"); + QString line; + bool isFirstLine = true; // 跳过第一行 + + while (!in.atEnd()) { + line = in.readLine(); + if (isFirstLine) { + isFirstLine = false; // 第一行已读,接下来读取数据 + continue; + } + + // 使用'|'分割键和值 + QStringList keyValuePairs = line.split(QRegExp("\\s*\\|\\s*"), QString::SkipEmptyParts); + if (keyValuePairs.size() != 2) { + continue; // 跳过不符合格式的行 + } + + QStringList keys, values; + + // 分割键部分,并替换空格为空字符串 + QString keyPart = keyValuePairs.at(0); + keys = keyPart.split(',', QString::SkipEmptyParts); + for (int i = 0; i < keys.size(); ++i) { + keys[i].replace(" ", ""); + } + + // 分割值部分,并替换空格为空字符串 + QString valuePart = keyValuePairs.at(1); + values = valuePart.split(',', QString::SkipEmptyParts); + for (int i = 0; i < values.size(); ++i) { + values[i].replace(" ", ""); + values[i].replace("\t", ""); + } + + // 将键和值的QStringList插入到QMap中 + dataMap.insert(keys, values); + } + + file.close(); + return dataMap; +} + void VerifyWindow::getVerifyMethod() { programList.clear(); @@ -426,91 +491,218 @@ on_deviceButton_clicked(catDeviceList[0],0); ui->horizontalLayout_14->addStretch(); - if(catDeviceList.length()>0) - { - headList.clear(); - calibrationList.clear(); - veriDataMapList = BaseCommonApi::getStandardCheckItemDataCalibrator(standardId,&veriHeadList); -// calibrationList =BaseCommonApi::Search_VerifyTable(standardId,&headList); + getCheckItemData(); + deleteItem(ui->horizontalLayoutMain); + mainTabIdx=-1; + int index=0; + for (const auto &item : veriHeadList.keys()) { + // ======================================================================================== + // 按钮设置显示 + // ==================================================================================== + QPushButton *button = new QPushButton(item, this); + //设置样式 + // 设置按钮大小为 56x20 + //固定大小文字显示不全 + //button->setFixedSize(85, 40); + button->setCheckable(true); + button->setAutoExclusive(true); + //设置第一个按钮选中状态 + if(index==0){ button->setChecked(true);} + //button->setc(true); + // 设置按钮样式表 + button->setStyleSheet("QPushButton {" + "border: 1px solid white;" // 白色边框 + "border-bottom: 2px solid rgba(0, 255, 255, 1);" // 浅蓝色下划线 + "background-color: rgba(242, 242, 242, 1);" // 浅灰色背景 + "height:40px;" + "padding:5px;" + "}" + "QPushButton:hover {" + "background-color: rgba(215, 215, 215, 1);;" // 鼠标悬停时变为深灰色背景 + "}" + "QPushButton:checked {" + "color: white;" + "background-color: rgb(74, 102, 186);" // 选中时变为蓝色背景 + "}"); - //tableWidgetItem - ui->tableWidget_Point->clearContents(); - ui->tableWidget_Point->setRowCount(0); - //循环数据 - int rowCount=0; - int row=0; - for (const QStringList& item : calibrationList) - { - //获取行号 并进行添加行 - rowCount = ui->tableWidget_Point->rowCount(); - ui->tableWidget_Point->insertRow(rowCount); - QTableWidgetItem* p_check = new QTableWidgetItem(); - p_check->setCheckState(Qt::Unchecked); //设置首列为 CheckBox 控件 - ui->tableWidget_Point->setItem(row,0,p_check); - ui->tableWidget_Point->setItem(row, 1, new QTableWidgetItem(item[8])); - ui->tableWidget_Point->setItem(row, 2, new QTableWidgetItem("1")); - row++; - } + ui->horizontalLayoutMain->addWidget(button); + connect(button, &QPushButton::clicked, this, [this,index]() { + //tackedWidget->setCurrentIndex(index); + initCheckTable(index); + }); + //pageButtons.append(button); + ++index; } + ui->horizontalLayoutMain->addStretch(); + initCheckTable(0); +// if(catDeviceList.length()>0) +// { +// headList.clear(); +// calibrationList.clear(); +// QList CliTable = BaseCommonApi::getJudgeCalibrationTable(standardId); +// if(CliTable.length()>0){ +// iEquipType = CliTable[0].belong_standard_equipment.toInt(); +// } +// veriDataMapList = BaseCommonApi::getStandardCheckItemDataCalibrator(standardId,&veriHeadList); +//// calibrationList =BaseCommonApi::Search_VerifyTable(standardId,&headList); + +// //tableWidgetItem +// ui->tableWidget_Point->clearContents(); +// ui->tableWidget_Point->setRowCount(0); +// //循环数据 +// int rowCount=0; +// int row=0; +// for (const QStringList& item : calibrationList) +// { +// //获取行号 并进行添加行 +// rowCount = ui->tableWidget_Point->rowCount(); +// ui->tableWidget_Point->insertRow(rowCount); +// QTableWidgetItem* p_check = new QTableWidgetItem(); +// p_check->setCheckState(Qt::Unchecked); //设置首列为 CheckBox 控件 +// ui->tableWidget_Point->setItem(row,0,p_check); +// ui->tableWidget_Point->setItem(row, 1, new QTableWidgetItem(item[8])); +// ui->tableWidget_Point->setItem(row, 2, new QTableWidgetItem("1")); +// row++; +// } +// } ui->stackedWidget_2->setCurrentIndex(1); } -void VerifyWindow::initCheckTable() +void VerifyWindow::initCheckTable(int idx) { + if(mainTabIdx==idx) + return; + mainTabIdx = idx; + deleteItem(ui->horizontalLayoutItem); + + itemTabIdx=-1; + int index=0; + const auto items = veriHeadList.values().at(mainTabIdx); + for (const auto &item : items.keys()){ + QPushButton *button = new QPushButton(item, this); + //设置样式 + // 设置按钮大小为 56x20 + //固定大小文字显示不全 + //button->setFixedSize(85, 40); + button->setCheckable(true); + button->setAutoExclusive(true); + //设置第一个按钮选中状态 + if(index==0){ button->setChecked(true);} + //button->setc(true); + // 设置按钮样式表 + button->setStyleSheet("QPushButton {" + "border: 1px solid white;" // 白色边框 + "border-bottom: 2px solid rgba(0, 255, 255, 1);" // 浅蓝色下划线 + "background-color: rgba(242, 242, 242, 1);" // 浅灰色背景 + "height:40px;" + "padding:5px;" + "}" + "QPushButton:hover {" + "background-color: rgba(215, 215, 215, 1);;" // 鼠标悬停时变为深灰色背景 + "}" + "QPushButton:checked {" + "color: white;" + "background-color: rgb(74, 102, 186);" // 选中时变为蓝色背景 + "}"); + + ui->horizontalLayoutItem->addWidget(button); + connect(button, &QPushButton::clicked, this, [this,index]() { + //tackedWidget->setCurrentIndex(index); + initCheckItemData(index); + }); + //pageButtons.append(button); + ++index; + } + ui->horizontalLayoutItem->addStretch(); + initCheckItemData(0); +// ui->tableWidgetCheck->clearContents(); +// ui->tableWidgetCheck->setRowCount(0); +// ui->tableWidgetCheck->setColumnCount(0); +// int rowCount = 0; +// int row=0; +// ui->tableWidgetCheck->setColumnCount(headList.count()); +// ui->tableWidgetCheck->setHorizontalHeaderLabels(headList); +// for(int i=0;itableWidgetCheck->horizontalHeader()->setSectionResizeMode(i,QHeaderView::Stretch); +// } +// measureCalList.clear(); +// for(int i=0;itableWidget_Point->rowCount();i++){ +// Qt::CheckState state = ui->tableWidget_Point->item(i,0)->checkState(); +// if(state == Qt::Checked){ +// QStringList& item = calibrationList[i]; +// int cnt = ui->tableWidget_Point->item(i,2)->text().toInt(); +// for(int j=0;jtableWidgetCheck->rowCount(); +// ui->tableWidgetCheck->insertRow(rowCount); +// ui->tableWidgetCheck->setItem(row, 0, new QTableWidgetItem(QString::number(row+1))); +// //循环读取值 headlist,count是列的数量 +// for(int k=1;ktableWidgetCheck->setItem(row, k, new QTableWidgetItem(item[k])); +// } +// StandCheckDataCalibrator measItem; +//// measItem.item_data_id = item[1]; +//// measItem.maximum_error_formula = item[10];//最大允许误差(公式) +//// measItem.error_param_a = item[11];//误差参数a +//// measItem.error_param_b = item[12];//误差参数b +//// measItem.params = item[2];//参数 +//// measItem.capacity=item[3];//量 +//// measItem.unit=item[4];//单位 +//// measItem.frequency=item[5];//频率 +//// measItem.frequency_unit=item[6];//频率单位 +//// measItem.range_range=item[7];//量程 +//// measItem.standard_value=item[8];//标准值(输入字段,特殊:指针式万用表输出字段) +//// measItem.indicating_value=item[15];//示值(输出字段,特殊:指针式万用表输入字段) +//// measItem.maximum_error=item[10];//最大允许误差(值) +//// //measItem.absolute_error=item[11];//绝对误差 +//// measItem.resolution=item[9];//分辨力 +//// measItem.measure_indication_value=item[19];//被检表示值 +// measureCalList.append(measItem); +// row++; +// } +// } +// } +// if(connectList.length()>0&&connectList[0].type==1) +// standardEngine.openDevice(connectList[0].programInterface.visa,"Visa"); +// if(connectList.length()>1&&connectList[1].type==0) +// deviceEngine.openDevice(connectList[1].programInterface.visa,"Visa"); +} + +void VerifyWindow::initCheckItemData(int idx){ + if(itemTabIdx==idx) + return; + itemTabIdx = idx; + QString sLabel = veriHeadList.keys()[mainTabIdx]; + const auto items = veriHeadList.value(sLabel); + + QString sLabel2 = items.keys()[itemTabIdx]; + const auto headrs = items.value(sLabel2); + ui->tableWidgetCheck->clearContents(); ui->tableWidgetCheck->setRowCount(0); ui->tableWidgetCheck->setColumnCount(0); - int rowCount = 0; - int row=0; - ui->tableWidgetCheck->setColumnCount(headList.count()); - ui->tableWidgetCheck->setHorizontalHeaderLabels(headList); - for(int i=0;itableWidgetCheck->setColumnCount(headrs.count()); + ui->tableWidgetCheck->setHorizontalHeaderLabels(headrs); + for(int i=0;itableWidgetCheck->horizontalHeader()->setSectionResizeMode(i,QHeaderView::Stretch); } - measureCalList.clear(); - for(int i=0;itableWidget_Point->rowCount();i++){ - Qt::CheckState state = ui->tableWidget_Point->item(i,0)->checkState(); - if(state == Qt::Checked){ - QStringList& item = calibrationList[i]; - int cnt = ui->tableWidget_Point->item(i,2)->text().toInt(); - for(int j=0;jtableWidgetCheck->rowCount(); - ui->tableWidgetCheck->insertRow(rowCount); - ui->tableWidgetCheck->setItem(row, 0, new QTableWidgetItem(QString::number(row+1))); - //循环读取值 headlist,count是列的数量 - for(int k=1;ktableWidgetCheck->setItem(row, k, new QTableWidgetItem(item[k])); - } - StandCheckDataCalibrator measItem; -// measItem.item_data_id = item[1]; -// measItem.maximum_error_formula = item[10];//最大允许误差(公式) -// measItem.error_param_a = item[11];//误差参数a -// measItem.error_param_b = item[12];//误差参数b -// measItem.params = item[2];//参数 -// measItem.capacity=item[3];//量 -// measItem.unit=item[4];//单位 -// measItem.frequency=item[5];//频率 -// measItem.frequency_unit=item[6];//频率单位 -// measItem.range_range=item[7];//量程 -// measItem.standard_value=item[8];//标准值(输入字段,特殊:指针式万用表输出字段) -// measItem.indicating_value=item[15];//示值(输出字段,特殊:指针式万用表输入字段) -// measItem.maximum_error=item[10];//最大允许误差(值) -// //measItem.absolute_error=item[11];//绝对误差 -// measItem.resolution=item[9];//分辨力 -// measItem.measure_indication_value=item[19];//被检表示值 - measureCalList.append(measItem); - row++; - } + int rowCount = 0; + const auto items2 = veriDataMapList.value(sLabel); + const auto dataRes = items2.value(sLabel2); + for (int i = 0; i < dataRes.count(); ++i) { + //获取行号 并进行添加行 + rowCount = ui->tableWidgetCheck->rowCount(); + ui->tableWidgetCheck->insertRow(rowCount); + ui->tableWidgetCheck->setItem(i, 0, new QTableWidgetItem(QString::number(i+1))); + for(int j=1;jtableWidgetCheck->setItem(i, j, new QTableWidgetItem(dataRes[i][j])); } } - if(connectList.length()>0&&connectList[0].type==1) - standardEngine.openDevice(connectList[0].programInterface.visa,"Visa"); - if(connectList.length()>1&&connectList[1].type==0) - deviceEngine.openDevice(connectList[1].programInterface.visa,"Visa"); } InstructionLib* VerifyWindow::getCmdByCheckName(int idx,QString name) @@ -533,51 +725,491 @@ void VerifyWindow::on_pushButton_start_clicked() { - initCheckTable(); - for(int i=0;iinstruct_config.split(";"); +// if(sList.length()>0){ +// for (QString& sCmd : sList){ +// standardEngine.sendData(sCmd); +// } +// } +// } +// } +// //被检设备读数 +// if(deviceEngine.getState()){ +// InstructionLib *instrcutLib = getCmdByCheckName(0,item.params); +// if(instrcutLib!=nullptr){ +// QStringList sList = instrcutLib->instruct_config.split(";"); +// if(sList.length()>0){ +// for (QString& sCmd : sList){ +// deviceEngine.sendData(sCmd); +// } +// } +// Delay_MSec(2000); +// sRet = deviceEngine.queryData(instrcutLib->instruct_read); +// } +// } +// // +// if(sRet==""){ +// bool bOk = false; +// double dRet = QInputDialog::getDouble(this,"手动测试","请输入被检示值",0,-100000, 100000,1,&bOk); + +// if (bOk) { +// sRet = QString::number(dRet); +// } +// } +// item.test_value_one = sRet; +// ui->tableWidgetCheck->setItem(i,19,new QTableWidgetItem(sRet)); +// } +} + +int VerifyWindow::getIndexByHeader(QString sLabel,QString sLabel2,QStringList sName){ + const auto &headrs = veriHeadList.value(sLabel).value(sLabel2); + for(int j=0;jinstruct_config.split(";"); - if(sList.length()>0){ - for (QString& sCmd : sList){ - standardEngine.sendData(sCmd); + if(Teststate==SyncRunStatus::Stopped){break;}; + + //每次循环按钮变化 + initCheckTable(i); + constsLable= veriHeadList.keys()[i]; + auto items = veriDataMapList.value(constsLable); + QString labelItem = "重复性"; + constsLableItem = labelItem; + int itemIdx = items.keys().indexOf(labelItem); + initCheckItemData(itemIdx); + QList dataRes = items.value(labelItem); + + BaseCommonApi::SaveLogInfo(1,QString("开始 %1 测试").arg(constsLable)); + for (int i = 0; i < dataRes.count(); ++i) { + if(Teststate==SyncRunStatus::Stopped){break;}; + constDataRes=dataRes[i]; + //InItcmd(); + QString sRet=""; + QString newCmd; + double dStdValue=FP_INFINITE,dError=0; + QString newdStdValue,newdError; + + //标准器输出 + BaseCommonApi::SaveLogInfo(1,QString("标准器输出")); + QString sParam; + QStringList TempValue; + TempValue.append("核查项目"); + int idx= getIndexByHeader(constsLable,labelItem,TempValue); + if(idx!=-1) + sParam = dataRes[i][idx]; + //CheckBackColorUpdate(true,i); + + //暂时加到这个地方 后面统一编写 + if(sParam=="DCI"||sParam=="ACI") + { + int idx2= getIndexByHeader(constsLable,labelItem,QStrTranQStrList("单位")); + if(idx2!=-1) + { + QString ConstUnit=""; + QString v=dataRes[i][idx2].toUpper(); + if(i!=0) + ConstUnit=dataRes[i-1][idx2].toUpper(); + + BaseCommonApi::SaveLogInfo(1,ConstUnit+"-"+v); + if((ConstUnit=="MA" && v=="A") || (ConstUnit=="A" && v=="MA")) + { + if(!this->showDialog("电流换线提醒",QString("换线提醒\n %1 -> %2").arg(ConstUnit).arg(v))) + { + continue; + } } } } - } - //被检设备读数 - if(deviceEngine.getState()){ - InstructionLib *instrcutLib = getCmdByCheckName(0,item.params); - if(instrcutLib!=nullptr){ - QStringList sList = instrcutLib->instruct_config.split(";"); - if(sList.length()>0){ - for (QString& sCmd : sList){ - deviceEngine.sendData(sCmd); - } + //标准器输出 + InstructionLib *instrcutLibstan = getCmdByCheckName(1,sParam); + SendDevice(instrcutLibstan,&standardEngine,true); + //被检设备读数 + BaseCommonApi::SaveLogInfo(1,QString("被检设备输出")); + InstructionLib *instrcutLib = getCmdByCheckName(0,sParam); + SendDevice(instrcutLib,&deviceEngine); + //读取6次测试值 + for(QString head : readItems){ + sRet=ReadDevice(instrcutLib,&deviceEngine); + if(sRet!=""){ + TempValue.clear(); + TempValue.append("单位"); + idx= getIndexByHeader(constsLable,labelItem,TempValue); + dStdValue = transUnit(sRet,dataRes[i][idx]); } - Delay_MSec(2000); - sRet = deviceEngine.queryData(instrcutLib->instruct_read); + autoAdujstData(constsLable,labelItem,head,i,dStdValue,dataRes); + //CheckBackColorUpdate(false,i); + Delay_MSec(1000); } + closeCmd(); + //CheckBackColorUpdate(false,i); + Delay_MSec(2000); } - // - if(sRet==""){ + items.insert(labelItem,dataRes); + veriDataMapList.insert(constsLable,items); + } + closeDevice(); +} + +void VerifyWindow::autoAdujstData(QString sLabel,QString labelItem,QString header,int i,double dStdValue,QList& dataRes){ + double dError; + QString newdStdValue,newdError,Value; + if(iEquipType==1 ){ + if(dStdValue==FP_INFINITE){ bool bOk = false; - double dRet = QInputDialog::getDouble(this,"手动测试","请输入被检示值",0,-100000, 100000,1,&bOk); + dStdValue = QInputDialog::getDouble(this,"手动测试","请输入被检示值",0,-100000, 100000,5,&bOk); if (bOk) { - sRet = QString::number(dRet); + //sRet = QString::number(dStdValue); + }else{ + dStdValue=0; } } - item.test_value_one = sRet; - ui->tableWidgetCheck->setItem(i,19,new QTableWidgetItem(sRet)); + // ItemUnitSplit + + //newdStdValue= TranDecimals(sLabel, dataRes[i],dStdValue); + newdStdValue=QString::number(dStdValue,'f',4); + //QStringList ResultName=getsParambyHeader(sParam); + int idx= getIndexByHeader(sLabel,labelItem,QStrTranQStrList(header)); + if(idx!=-1) + { + dataRes[i][idx] = newdStdValue; + ui->tableWidgetCheck->setItem(i,idx,new QTableWidgetItem(newdStdValue)); //示值 + } + double dMean=0; + for(QString item : readItems){ + idx= getIndexByHeader(sLabel,labelItem,QStrTranQStrList(item)); + dMean += dataRes[i][idx].toDouble(); + } + dMean /=readItems.count(); + newdStdValue=QString::number(dMean,'f',4); + idx= getIndexByHeader(sLabel,labelItem,QStrTranQStrList("算数平均值")); + if(idx!=-1) + { + dataRes[i][idx] = newdStdValue; + ui->tableWidgetCheck->setItem(i,idx,new QTableWidgetItem(newdStdValue)); + } + BaseCommonApi::SaveLogInfo(1,QString("转换前 测试值 %1").arg(dStdValue)); + BaseCommonApi::SaveLogInfo(1,QString("转换后 测试值 %1").arg(newdStdValue)); + //Delay_MSec(2000); } } +double VerifyWindow::transUnit(QString sData,QString sUnit,bool reverse){ + double dTmp = sData.toDouble(); + QString unit = sUnit.toUpper(); + QStringList TempValue; + for(const QStringList &key : unitTransList.keys()) + { + for (int i=0;igetState()){ + if(Inst!=nullptr){ + QStringList sList = Inst->instruct_config.split(";"); + if(sList.length()>0){ + for (QString& sCmd : sList){ + newCmd = transCmd(sCmd,constsLable,constsLableItem,constDataRes,IsUnitTran); + if(newCmd!=""){ + QString str=Visa->commType; + Visa->sendData(newCmd); + qDebug() << "config cmds:" << newCmd; + } + } + } + } +} +} +QString VerifyWindow::ReadDevice(InstructionLib* Inst,VisaCommonEngine* Visa,bool IsUnitTran){ + //读取仪器 进一步封装 + QString newCmd=""; + QString result=""; + if(Visa!=nullptr&&Visa->getState()){ + if(Inst!=nullptr){ + newCmd = transCmd(Inst->instruct_read,constsLable,constsLableItem,constDataRes,IsUnitTran); + if(newCmd!=""){ + qDebug() << "query cmds:" << newCmd; + result = Visa->queryData(newCmd); + } + } + } + return result; +} + +void VerifyWindow::InItcmd(){ + //发送INIt相关指令 + int count=0; + for(const ConnectInfo &visa:connectList) + { + VisaCommonEngine *Engine; + InstructionLib *instrcutLib; + if(connectList.length()>0&&visa.type==0) + { + instrcutLib = getCmdByCheckName(count,"INIT"); + Engine=&deviceEngine; + } + if(connectList.length()>1&&visa.type==1) + { + instrcutLib = getCmdByCheckName(count,"INIT"); + if(connectList.count()==2){ + Engine=&standardEngine; + }else{ + int stancount=0; +// for (VisaCommonEngine &item:VisaStanEngineList) { +// if(stancount==count-1){ +// Engine=&item; +// break; +// } +// } + } + + } + SendDevice(instrcutLib,Engine); + count++; + } +} + +void VerifyWindow::connectDevice(){ + int count=0; + QString rolename; + for(const ConnectInfo &visa:connectList) + { + VisaCommonEngine Engine; + if(Engine.openDevice(visa.programInterface.visa,"Visa")){ + if(connectList.length()>0&&visa.type==0) + { + deviceEngine=Engine; + } + if(connectList.length()>1&&visa.type==1) + { + if(connectList.count()==2){ + standardEngine=Engine; + }else{ + //rolename=this->GetdeviceidByRole(visa.programInterface.device_id); + //VisaStanEngineList.insert(rolename,Engine); + } + + } + } + count++; + + } +} + +void VerifyWindow::closeCmd(){ + //发送Close相关指令 + int count=0; + for(const ConnectInfo &visa:connectList) + { + VisaCommonEngine *Engine; + InstructionLib *instrcutLib; + if(connectList.length()>0&&visa.type==0) + { + instrcutLib = getCmdByCheckName(count,"CLOSE"); + Engine=&deviceEngine; + } + if(connectList.length()>1&&visa.type==1) + { + instrcutLib = getCmdByCheckName(count,"CLOSE"); + if(connectList.count()==2){ + Engine=&standardEngine; + }else{ + int stancount=0; +// for (VisaCommonEngine &item:VisaStanEngineList) { +// if(stancount==count-1){ +// Engine=&item; +// break; +// } +// } + } + + } + SendDevice(instrcutLib,Engine); + } +} + +void VerifyWindow::closeDevice(){ + //关闭设备连接 + int count=0; + for(const ConnectInfo &visa:connectList) + { + VisaCommonEngine *Engine; + if(connectList.length()>0&&visa.type==0) + { + Engine=&deviceEngine; + } + if(connectList.length()>1&&visa.type==1) + { + if(connectList.count()==2){ + Engine=&standardEngine; + }else{ + int stancount=0; +// for (VisaCommonEngine &item:VisaStanEngineList) { +// if(stancount==count-1){ +// Engine=&item; +// break; +// } +// } + } + + } + if(Engine!=nullptr) + Engine->closeDevice(); + count++; + + } +} + +QString VerifyWindow::TranTypeUnit(QString sUnit) +{ + QString NewsUnit=sUnit; + + if(unitTypeTransList.keys()[0].contains(sUnit)) + { + NewsUnit=unitTypeTransList.value(unitTypeTransList.keys()[0])[0]; + } + return NewsUnit; +} + +QString VerifyWindow::transCmd(QString sCmd,QString sLabel,QString sLabelItem,QStringList data,bool devicetype) +{ + QString sNewCmd = sCmd; + if(sNewCmd.contains("{DELAY:")){ + QRegExp re("DELAY:(\\d+)"); + int delay=0; + if (re.indexIn(sNewCmd) != -1) { + delay= re.cap(1).toUInt(); + } + BaseCommonApi::SaveLogInfo(1,QString("延迟 %1 ms").arg(delay)); + qDebug() << "delay time:" << delay; + Delay_MSec(delay); + return ""; + } + QString NewUnit; + QStringList cmdPlaceHolderValue; + QStringList TemporaryValue; + for (QStringList keyList : cmdPlaceHolderList.keys()) { + if(sCmd.contains(keyList[0])){ + cmdPlaceHolderValue=cmdPlaceHolderList.value(keyList); + + int idx= getIndexByHeader(sLabel,sLabelItem,cmdPlaceHolderList.value(keyList)); + if(idx!=-1){ + if(devicetype || keyList[0]=="{CH}") + { + NewUnit = TranTypeUnit(data[idx]); //转换 Ω->OHM + sNewCmd = sNewCmd.replace(keyList[0],NewUnit); + continue; + } + double dTmp; + QRegularExpression re("(?=.*[0-9])(?=.*[a-zA-ZΩΜΩ])"); + if(re.match(data[idx]).hasMatch()) + { + dTmp = tranunitSplit(data[idx],true); + }else + { + TemporaryValue.append("单位"); + int idx2= getIndexByHeader(sLabel,sLabelItem,TemporaryValue); + if(idx2!=-1) + { + QString unit = data[idx2]; + dTmp = transUnit(data[idx],unit,true); + }else{ + dTmp=data[idx].toDouble(); + }; + } + sNewCmd = sNewCmd.replace(keyList[0],QString::number(dTmp)); + + } + + } + } + return sNewCmd; +} + +double VerifyWindow::tranunitSplit(QString sData,bool reverse) +{ + + QRegularExpression re("(?=.*[0-9])(?=.*[a-zA-ZΩΜΩ])"); + if(re.match(sData).hasMatch()) + { + QString sData2=sData; + QString sNewData,sUnit; + ItemUnitSplit(sData,sNewData,sUnit); + return transUnit(sNewData,sUnit,reverse); + }else{ + return sData.toDouble(); + } + +} + +void VerifyWindow::ItemUnitSplit(QString Value,QString &data,QString &unit) +{ + QString sData2=Value; + QString sNewData,sUnit; + // 正则表达式匹配数字 + QRegularExpression reLetters("[a-zA-ZΩΜΩ%]"); + QRegularExpression reLetters1("[^a-zA-ZΩΜΩ%]"); + data=sData2.replace(reLetters,""); + unit= Value.replace(reLetters1,""); + +} + void VerifyWindow::on_pushButton_pause_clicked() { @@ -585,7 +1217,7 @@ void VerifyWindow::on_pushButton_stop_clicked() { - + Teststate=SyncRunStatus::Stopped; } void VerifyWindow::on_pushButton_save_clicked() @@ -689,3 +1321,18 @@ } } } + +void VerifyWindow::getCheckItemData(){ + QString standardId=connectList[0].id; + QList CliTable = BaseCommonApi::getJudgeCalibrationTable(standardId); + if(CliTable.length()>0){ + iEquipType = CliTable[0].belong_standard_equipment.toInt(); + } + readItems.clear(); + switch (iEquipType) { + case 1: + veriDataMapList = BaseCommonApi::getStandardCheckItemDataCalibrator(standardId,&veriHeadList); + readItems << "示值1"<< "示值2"<< "示值3"<< "示值4"<< "示值5"<< "示值6"; + break; + } +} diff --git a/softwareDirectory/AutoVerScheme/verifywindow.cpp b/softwareDirectory/AutoVerScheme/verifywindow.cpp index 08208aa..3697494 100644 --- a/softwareDirectory/AutoVerScheme/verifywindow.cpp +++ b/softwareDirectory/AutoVerScheme/verifywindow.cpp @@ -24,6 +24,16 @@ } ui->tableWidgetStd->setColumnWidth(0, 60); ui->tableWidgetBiz->setColumnWidth(0, 60); + + //统一定义单位转换系数 + unitTransList=readDataFromFile("unitTrans.txt"); + //统一定义命令占位符 + cmdPlaceHolderList=readDataFromFile("cmdPlaceHolder.txt"); + //单位值特殊转换 + unitTypeTransList=readDataFromFile("unitTypeTrans.txt"); + //测试结果值填充列 + resultfillingList=readDataFromFile("resultfilling.txt"); + getVerifyMethod(); } @@ -33,6 +43,61 @@ delete ui; } +QMap VerifyWindow::readDataFromFile(QString filePath) { + // 获取应用程序的根目录 + QString path = QCoreApplication::applicationDirPath()+"\\File\\config\\"+filePath; + QMap dataMap; + QFile file(path); + if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { + // 错误处理 + qDebug() << "无法打开文件:" << file.errorString(); + QString str=file.errorString(); + return dataMap; + } + + QTextStream in(&file); + in.setCodec("UTF-8"); + QString line; + bool isFirstLine = true; // 跳过第一行 + + while (!in.atEnd()) { + line = in.readLine(); + if (isFirstLine) { + isFirstLine = false; // 第一行已读,接下来读取数据 + continue; + } + + // 使用'|'分割键和值 + QStringList keyValuePairs = line.split(QRegExp("\\s*\\|\\s*"), QString::SkipEmptyParts); + if (keyValuePairs.size() != 2) { + continue; // 跳过不符合格式的行 + } + + QStringList keys, values; + + // 分割键部分,并替换空格为空字符串 + QString keyPart = keyValuePairs.at(0); + keys = keyPart.split(',', QString::SkipEmptyParts); + for (int i = 0; i < keys.size(); ++i) { + keys[i].replace(" ", ""); + } + + // 分割值部分,并替换空格为空字符串 + QString valuePart = keyValuePairs.at(1); + values = valuePart.split(',', QString::SkipEmptyParts); + for (int i = 0; i < values.size(); ++i) { + values[i].replace(" ", ""); + values[i].replace("\t", ""); + } + + // 将键和值的QStringList插入到QMap中 + dataMap.insert(keys, values); + } + + file.close(); + return dataMap; +} + void VerifyWindow::getVerifyMethod() { programList.clear(); @@ -426,91 +491,218 @@ on_deviceButton_clicked(catDeviceList[0],0); ui->horizontalLayout_14->addStretch(); - if(catDeviceList.length()>0) - { - headList.clear(); - calibrationList.clear(); - veriDataMapList = BaseCommonApi::getStandardCheckItemDataCalibrator(standardId,&veriHeadList); -// calibrationList =BaseCommonApi::Search_VerifyTable(standardId,&headList); + getCheckItemData(); + deleteItem(ui->horizontalLayoutMain); + mainTabIdx=-1; + int index=0; + for (const auto &item : veriHeadList.keys()) { + // ======================================================================================== + // 按钮设置显示 + // ==================================================================================== + QPushButton *button = new QPushButton(item, this); + //设置样式 + // 设置按钮大小为 56x20 + //固定大小文字显示不全 + //button->setFixedSize(85, 40); + button->setCheckable(true); + button->setAutoExclusive(true); + //设置第一个按钮选中状态 + if(index==0){ button->setChecked(true);} + //button->setc(true); + // 设置按钮样式表 + button->setStyleSheet("QPushButton {" + "border: 1px solid white;" // 白色边框 + "border-bottom: 2px solid rgba(0, 255, 255, 1);" // 浅蓝色下划线 + "background-color: rgba(242, 242, 242, 1);" // 浅灰色背景 + "height:40px;" + "padding:5px;" + "}" + "QPushButton:hover {" + "background-color: rgba(215, 215, 215, 1);;" // 鼠标悬停时变为深灰色背景 + "}" + "QPushButton:checked {" + "color: white;" + "background-color: rgb(74, 102, 186);" // 选中时变为蓝色背景 + "}"); - //tableWidgetItem - ui->tableWidget_Point->clearContents(); - ui->tableWidget_Point->setRowCount(0); - //循环数据 - int rowCount=0; - int row=0; - for (const QStringList& item : calibrationList) - { - //获取行号 并进行添加行 - rowCount = ui->tableWidget_Point->rowCount(); - ui->tableWidget_Point->insertRow(rowCount); - QTableWidgetItem* p_check = new QTableWidgetItem(); - p_check->setCheckState(Qt::Unchecked); //设置首列为 CheckBox 控件 - ui->tableWidget_Point->setItem(row,0,p_check); - ui->tableWidget_Point->setItem(row, 1, new QTableWidgetItem(item[8])); - ui->tableWidget_Point->setItem(row, 2, new QTableWidgetItem("1")); - row++; - } + ui->horizontalLayoutMain->addWidget(button); + connect(button, &QPushButton::clicked, this, [this,index]() { + //tackedWidget->setCurrentIndex(index); + initCheckTable(index); + }); + //pageButtons.append(button); + ++index; } + ui->horizontalLayoutMain->addStretch(); + initCheckTable(0); +// if(catDeviceList.length()>0) +// { +// headList.clear(); +// calibrationList.clear(); +// QList CliTable = BaseCommonApi::getJudgeCalibrationTable(standardId); +// if(CliTable.length()>0){ +// iEquipType = CliTable[0].belong_standard_equipment.toInt(); +// } +// veriDataMapList = BaseCommonApi::getStandardCheckItemDataCalibrator(standardId,&veriHeadList); +//// calibrationList =BaseCommonApi::Search_VerifyTable(standardId,&headList); + +// //tableWidgetItem +// ui->tableWidget_Point->clearContents(); +// ui->tableWidget_Point->setRowCount(0); +// //循环数据 +// int rowCount=0; +// int row=0; +// for (const QStringList& item : calibrationList) +// { +// //获取行号 并进行添加行 +// rowCount = ui->tableWidget_Point->rowCount(); +// ui->tableWidget_Point->insertRow(rowCount); +// QTableWidgetItem* p_check = new QTableWidgetItem(); +// p_check->setCheckState(Qt::Unchecked); //设置首列为 CheckBox 控件 +// ui->tableWidget_Point->setItem(row,0,p_check); +// ui->tableWidget_Point->setItem(row, 1, new QTableWidgetItem(item[8])); +// ui->tableWidget_Point->setItem(row, 2, new QTableWidgetItem("1")); +// row++; +// } +// } ui->stackedWidget_2->setCurrentIndex(1); } -void VerifyWindow::initCheckTable() +void VerifyWindow::initCheckTable(int idx) { + if(mainTabIdx==idx) + return; + mainTabIdx = idx; + deleteItem(ui->horizontalLayoutItem); + + itemTabIdx=-1; + int index=0; + const auto items = veriHeadList.values().at(mainTabIdx); + for (const auto &item : items.keys()){ + QPushButton *button = new QPushButton(item, this); + //设置样式 + // 设置按钮大小为 56x20 + //固定大小文字显示不全 + //button->setFixedSize(85, 40); + button->setCheckable(true); + button->setAutoExclusive(true); + //设置第一个按钮选中状态 + if(index==0){ button->setChecked(true);} + //button->setc(true); + // 设置按钮样式表 + button->setStyleSheet("QPushButton {" + "border: 1px solid white;" // 白色边框 + "border-bottom: 2px solid rgba(0, 255, 255, 1);" // 浅蓝色下划线 + "background-color: rgba(242, 242, 242, 1);" // 浅灰色背景 + "height:40px;" + "padding:5px;" + "}" + "QPushButton:hover {" + "background-color: rgba(215, 215, 215, 1);;" // 鼠标悬停时变为深灰色背景 + "}" + "QPushButton:checked {" + "color: white;" + "background-color: rgb(74, 102, 186);" // 选中时变为蓝色背景 + "}"); + + ui->horizontalLayoutItem->addWidget(button); + connect(button, &QPushButton::clicked, this, [this,index]() { + //tackedWidget->setCurrentIndex(index); + initCheckItemData(index); + }); + //pageButtons.append(button); + ++index; + } + ui->horizontalLayoutItem->addStretch(); + initCheckItemData(0); +// ui->tableWidgetCheck->clearContents(); +// ui->tableWidgetCheck->setRowCount(0); +// ui->tableWidgetCheck->setColumnCount(0); +// int rowCount = 0; +// int row=0; +// ui->tableWidgetCheck->setColumnCount(headList.count()); +// ui->tableWidgetCheck->setHorizontalHeaderLabels(headList); +// for(int i=0;itableWidgetCheck->horizontalHeader()->setSectionResizeMode(i,QHeaderView::Stretch); +// } +// measureCalList.clear(); +// for(int i=0;itableWidget_Point->rowCount();i++){ +// Qt::CheckState state = ui->tableWidget_Point->item(i,0)->checkState(); +// if(state == Qt::Checked){ +// QStringList& item = calibrationList[i]; +// int cnt = ui->tableWidget_Point->item(i,2)->text().toInt(); +// for(int j=0;jtableWidgetCheck->rowCount(); +// ui->tableWidgetCheck->insertRow(rowCount); +// ui->tableWidgetCheck->setItem(row, 0, new QTableWidgetItem(QString::number(row+1))); +// //循环读取值 headlist,count是列的数量 +// for(int k=1;ktableWidgetCheck->setItem(row, k, new QTableWidgetItem(item[k])); +// } +// StandCheckDataCalibrator measItem; +//// measItem.item_data_id = item[1]; +//// measItem.maximum_error_formula = item[10];//最大允许误差(公式) +//// measItem.error_param_a = item[11];//误差参数a +//// measItem.error_param_b = item[12];//误差参数b +//// measItem.params = item[2];//参数 +//// measItem.capacity=item[3];//量 +//// measItem.unit=item[4];//单位 +//// measItem.frequency=item[5];//频率 +//// measItem.frequency_unit=item[6];//频率单位 +//// measItem.range_range=item[7];//量程 +//// measItem.standard_value=item[8];//标准值(输入字段,特殊:指针式万用表输出字段) +//// measItem.indicating_value=item[15];//示值(输出字段,特殊:指针式万用表输入字段) +//// measItem.maximum_error=item[10];//最大允许误差(值) +//// //measItem.absolute_error=item[11];//绝对误差 +//// measItem.resolution=item[9];//分辨力 +//// measItem.measure_indication_value=item[19];//被检表示值 +// measureCalList.append(measItem); +// row++; +// } +// } +// } +// if(connectList.length()>0&&connectList[0].type==1) +// standardEngine.openDevice(connectList[0].programInterface.visa,"Visa"); +// if(connectList.length()>1&&connectList[1].type==0) +// deviceEngine.openDevice(connectList[1].programInterface.visa,"Visa"); +} + +void VerifyWindow::initCheckItemData(int idx){ + if(itemTabIdx==idx) + return; + itemTabIdx = idx; + QString sLabel = veriHeadList.keys()[mainTabIdx]; + const auto items = veriHeadList.value(sLabel); + + QString sLabel2 = items.keys()[itemTabIdx]; + const auto headrs = items.value(sLabel2); + ui->tableWidgetCheck->clearContents(); ui->tableWidgetCheck->setRowCount(0); ui->tableWidgetCheck->setColumnCount(0); - int rowCount = 0; - int row=0; - ui->tableWidgetCheck->setColumnCount(headList.count()); - ui->tableWidgetCheck->setHorizontalHeaderLabels(headList); - for(int i=0;itableWidgetCheck->setColumnCount(headrs.count()); + ui->tableWidgetCheck->setHorizontalHeaderLabels(headrs); + for(int i=0;itableWidgetCheck->horizontalHeader()->setSectionResizeMode(i,QHeaderView::Stretch); } - measureCalList.clear(); - for(int i=0;itableWidget_Point->rowCount();i++){ - Qt::CheckState state = ui->tableWidget_Point->item(i,0)->checkState(); - if(state == Qt::Checked){ - QStringList& item = calibrationList[i]; - int cnt = ui->tableWidget_Point->item(i,2)->text().toInt(); - for(int j=0;jtableWidgetCheck->rowCount(); - ui->tableWidgetCheck->insertRow(rowCount); - ui->tableWidgetCheck->setItem(row, 0, new QTableWidgetItem(QString::number(row+1))); - //循环读取值 headlist,count是列的数量 - for(int k=1;ktableWidgetCheck->setItem(row, k, new QTableWidgetItem(item[k])); - } - StandCheckDataCalibrator measItem; -// measItem.item_data_id = item[1]; -// measItem.maximum_error_formula = item[10];//最大允许误差(公式) -// measItem.error_param_a = item[11];//误差参数a -// measItem.error_param_b = item[12];//误差参数b -// measItem.params = item[2];//参数 -// measItem.capacity=item[3];//量 -// measItem.unit=item[4];//单位 -// measItem.frequency=item[5];//频率 -// measItem.frequency_unit=item[6];//频率单位 -// measItem.range_range=item[7];//量程 -// measItem.standard_value=item[8];//标准值(输入字段,特殊:指针式万用表输出字段) -// measItem.indicating_value=item[15];//示值(输出字段,特殊:指针式万用表输入字段) -// measItem.maximum_error=item[10];//最大允许误差(值) -// //measItem.absolute_error=item[11];//绝对误差 -// measItem.resolution=item[9];//分辨力 -// measItem.measure_indication_value=item[19];//被检表示值 - measureCalList.append(measItem); - row++; - } + int rowCount = 0; + const auto items2 = veriDataMapList.value(sLabel); + const auto dataRes = items2.value(sLabel2); + for (int i = 0; i < dataRes.count(); ++i) { + //获取行号 并进行添加行 + rowCount = ui->tableWidgetCheck->rowCount(); + ui->tableWidgetCheck->insertRow(rowCount); + ui->tableWidgetCheck->setItem(i, 0, new QTableWidgetItem(QString::number(i+1))); + for(int j=1;jtableWidgetCheck->setItem(i, j, new QTableWidgetItem(dataRes[i][j])); } } - if(connectList.length()>0&&connectList[0].type==1) - standardEngine.openDevice(connectList[0].programInterface.visa,"Visa"); - if(connectList.length()>1&&connectList[1].type==0) - deviceEngine.openDevice(connectList[1].programInterface.visa,"Visa"); } InstructionLib* VerifyWindow::getCmdByCheckName(int idx,QString name) @@ -533,51 +725,491 @@ void VerifyWindow::on_pushButton_start_clicked() { - initCheckTable(); - for(int i=0;iinstruct_config.split(";"); +// if(sList.length()>0){ +// for (QString& sCmd : sList){ +// standardEngine.sendData(sCmd); +// } +// } +// } +// } +// //被检设备读数 +// if(deviceEngine.getState()){ +// InstructionLib *instrcutLib = getCmdByCheckName(0,item.params); +// if(instrcutLib!=nullptr){ +// QStringList sList = instrcutLib->instruct_config.split(";"); +// if(sList.length()>0){ +// for (QString& sCmd : sList){ +// deviceEngine.sendData(sCmd); +// } +// } +// Delay_MSec(2000); +// sRet = deviceEngine.queryData(instrcutLib->instruct_read); +// } +// } +// // +// if(sRet==""){ +// bool bOk = false; +// double dRet = QInputDialog::getDouble(this,"手动测试","请输入被检示值",0,-100000, 100000,1,&bOk); + +// if (bOk) { +// sRet = QString::number(dRet); +// } +// } +// item.test_value_one = sRet; +// ui->tableWidgetCheck->setItem(i,19,new QTableWidgetItem(sRet)); +// } +} + +int VerifyWindow::getIndexByHeader(QString sLabel,QString sLabel2,QStringList sName){ + const auto &headrs = veriHeadList.value(sLabel).value(sLabel2); + for(int j=0;jinstruct_config.split(";"); - if(sList.length()>0){ - for (QString& sCmd : sList){ - standardEngine.sendData(sCmd); + if(Teststate==SyncRunStatus::Stopped){break;}; + + //每次循环按钮变化 + initCheckTable(i); + constsLable= veriHeadList.keys()[i]; + auto items = veriDataMapList.value(constsLable); + QString labelItem = "重复性"; + constsLableItem = labelItem; + int itemIdx = items.keys().indexOf(labelItem); + initCheckItemData(itemIdx); + QList dataRes = items.value(labelItem); + + BaseCommonApi::SaveLogInfo(1,QString("开始 %1 测试").arg(constsLable)); + for (int i = 0; i < dataRes.count(); ++i) { + if(Teststate==SyncRunStatus::Stopped){break;}; + constDataRes=dataRes[i]; + //InItcmd(); + QString sRet=""; + QString newCmd; + double dStdValue=FP_INFINITE,dError=0; + QString newdStdValue,newdError; + + //标准器输出 + BaseCommonApi::SaveLogInfo(1,QString("标准器输出")); + QString sParam; + QStringList TempValue; + TempValue.append("核查项目"); + int idx= getIndexByHeader(constsLable,labelItem,TempValue); + if(idx!=-1) + sParam = dataRes[i][idx]; + //CheckBackColorUpdate(true,i); + + //暂时加到这个地方 后面统一编写 + if(sParam=="DCI"||sParam=="ACI") + { + int idx2= getIndexByHeader(constsLable,labelItem,QStrTranQStrList("单位")); + if(idx2!=-1) + { + QString ConstUnit=""; + QString v=dataRes[i][idx2].toUpper(); + if(i!=0) + ConstUnit=dataRes[i-1][idx2].toUpper(); + + BaseCommonApi::SaveLogInfo(1,ConstUnit+"-"+v); + if((ConstUnit=="MA" && v=="A") || (ConstUnit=="A" && v=="MA")) + { + if(!this->showDialog("电流换线提醒",QString("换线提醒\n %1 -> %2").arg(ConstUnit).arg(v))) + { + continue; + } } } } - } - //被检设备读数 - if(deviceEngine.getState()){ - InstructionLib *instrcutLib = getCmdByCheckName(0,item.params); - if(instrcutLib!=nullptr){ - QStringList sList = instrcutLib->instruct_config.split(";"); - if(sList.length()>0){ - for (QString& sCmd : sList){ - deviceEngine.sendData(sCmd); - } + //标准器输出 + InstructionLib *instrcutLibstan = getCmdByCheckName(1,sParam); + SendDevice(instrcutLibstan,&standardEngine,true); + //被检设备读数 + BaseCommonApi::SaveLogInfo(1,QString("被检设备输出")); + InstructionLib *instrcutLib = getCmdByCheckName(0,sParam); + SendDevice(instrcutLib,&deviceEngine); + //读取6次测试值 + for(QString head : readItems){ + sRet=ReadDevice(instrcutLib,&deviceEngine); + if(sRet!=""){ + TempValue.clear(); + TempValue.append("单位"); + idx= getIndexByHeader(constsLable,labelItem,TempValue); + dStdValue = transUnit(sRet,dataRes[i][idx]); } - Delay_MSec(2000); - sRet = deviceEngine.queryData(instrcutLib->instruct_read); + autoAdujstData(constsLable,labelItem,head,i,dStdValue,dataRes); + //CheckBackColorUpdate(false,i); + Delay_MSec(1000); } + closeCmd(); + //CheckBackColorUpdate(false,i); + Delay_MSec(2000); } - // - if(sRet==""){ + items.insert(labelItem,dataRes); + veriDataMapList.insert(constsLable,items); + } + closeDevice(); +} + +void VerifyWindow::autoAdujstData(QString sLabel,QString labelItem,QString header,int i,double dStdValue,QList& dataRes){ + double dError; + QString newdStdValue,newdError,Value; + if(iEquipType==1 ){ + if(dStdValue==FP_INFINITE){ bool bOk = false; - double dRet = QInputDialog::getDouble(this,"手动测试","请输入被检示值",0,-100000, 100000,1,&bOk); + dStdValue = QInputDialog::getDouble(this,"手动测试","请输入被检示值",0,-100000, 100000,5,&bOk); if (bOk) { - sRet = QString::number(dRet); + //sRet = QString::number(dStdValue); + }else{ + dStdValue=0; } } - item.test_value_one = sRet; - ui->tableWidgetCheck->setItem(i,19,new QTableWidgetItem(sRet)); + // ItemUnitSplit + + //newdStdValue= TranDecimals(sLabel, dataRes[i],dStdValue); + newdStdValue=QString::number(dStdValue,'f',4); + //QStringList ResultName=getsParambyHeader(sParam); + int idx= getIndexByHeader(sLabel,labelItem,QStrTranQStrList(header)); + if(idx!=-1) + { + dataRes[i][idx] = newdStdValue; + ui->tableWidgetCheck->setItem(i,idx,new QTableWidgetItem(newdStdValue)); //示值 + } + double dMean=0; + for(QString item : readItems){ + idx= getIndexByHeader(sLabel,labelItem,QStrTranQStrList(item)); + dMean += dataRes[i][idx].toDouble(); + } + dMean /=readItems.count(); + newdStdValue=QString::number(dMean,'f',4); + idx= getIndexByHeader(sLabel,labelItem,QStrTranQStrList("算数平均值")); + if(idx!=-1) + { + dataRes[i][idx] = newdStdValue; + ui->tableWidgetCheck->setItem(i,idx,new QTableWidgetItem(newdStdValue)); + } + BaseCommonApi::SaveLogInfo(1,QString("转换前 测试值 %1").arg(dStdValue)); + BaseCommonApi::SaveLogInfo(1,QString("转换后 测试值 %1").arg(newdStdValue)); + //Delay_MSec(2000); } } +double VerifyWindow::transUnit(QString sData,QString sUnit,bool reverse){ + double dTmp = sData.toDouble(); + QString unit = sUnit.toUpper(); + QStringList TempValue; + for(const QStringList &key : unitTransList.keys()) + { + for (int i=0;igetState()){ + if(Inst!=nullptr){ + QStringList sList = Inst->instruct_config.split(";"); + if(sList.length()>0){ + for (QString& sCmd : sList){ + newCmd = transCmd(sCmd,constsLable,constsLableItem,constDataRes,IsUnitTran); + if(newCmd!=""){ + QString str=Visa->commType; + Visa->sendData(newCmd); + qDebug() << "config cmds:" << newCmd; + } + } + } + } +} +} +QString VerifyWindow::ReadDevice(InstructionLib* Inst,VisaCommonEngine* Visa,bool IsUnitTran){ + //读取仪器 进一步封装 + QString newCmd=""; + QString result=""; + if(Visa!=nullptr&&Visa->getState()){ + if(Inst!=nullptr){ + newCmd = transCmd(Inst->instruct_read,constsLable,constsLableItem,constDataRes,IsUnitTran); + if(newCmd!=""){ + qDebug() << "query cmds:" << newCmd; + result = Visa->queryData(newCmd); + } + } + } + return result; +} + +void VerifyWindow::InItcmd(){ + //发送INIt相关指令 + int count=0; + for(const ConnectInfo &visa:connectList) + { + VisaCommonEngine *Engine; + InstructionLib *instrcutLib; + if(connectList.length()>0&&visa.type==0) + { + instrcutLib = getCmdByCheckName(count,"INIT"); + Engine=&deviceEngine; + } + if(connectList.length()>1&&visa.type==1) + { + instrcutLib = getCmdByCheckName(count,"INIT"); + if(connectList.count()==2){ + Engine=&standardEngine; + }else{ + int stancount=0; +// for (VisaCommonEngine &item:VisaStanEngineList) { +// if(stancount==count-1){ +// Engine=&item; +// break; +// } +// } + } + + } + SendDevice(instrcutLib,Engine); + count++; + } +} + +void VerifyWindow::connectDevice(){ + int count=0; + QString rolename; + for(const ConnectInfo &visa:connectList) + { + VisaCommonEngine Engine; + if(Engine.openDevice(visa.programInterface.visa,"Visa")){ + if(connectList.length()>0&&visa.type==0) + { + deviceEngine=Engine; + } + if(connectList.length()>1&&visa.type==1) + { + if(connectList.count()==2){ + standardEngine=Engine; + }else{ + //rolename=this->GetdeviceidByRole(visa.programInterface.device_id); + //VisaStanEngineList.insert(rolename,Engine); + } + + } + } + count++; + + } +} + +void VerifyWindow::closeCmd(){ + //发送Close相关指令 + int count=0; + for(const ConnectInfo &visa:connectList) + { + VisaCommonEngine *Engine; + InstructionLib *instrcutLib; + if(connectList.length()>0&&visa.type==0) + { + instrcutLib = getCmdByCheckName(count,"CLOSE"); + Engine=&deviceEngine; + } + if(connectList.length()>1&&visa.type==1) + { + instrcutLib = getCmdByCheckName(count,"CLOSE"); + if(connectList.count()==2){ + Engine=&standardEngine; + }else{ + int stancount=0; +// for (VisaCommonEngine &item:VisaStanEngineList) { +// if(stancount==count-1){ +// Engine=&item; +// break; +// } +// } + } + + } + SendDevice(instrcutLib,Engine); + } +} + +void VerifyWindow::closeDevice(){ + //关闭设备连接 + int count=0; + for(const ConnectInfo &visa:connectList) + { + VisaCommonEngine *Engine; + if(connectList.length()>0&&visa.type==0) + { + Engine=&deviceEngine; + } + if(connectList.length()>1&&visa.type==1) + { + if(connectList.count()==2){ + Engine=&standardEngine; + }else{ + int stancount=0; +// for (VisaCommonEngine &item:VisaStanEngineList) { +// if(stancount==count-1){ +// Engine=&item; +// break; +// } +// } + } + + } + if(Engine!=nullptr) + Engine->closeDevice(); + count++; + + } +} + +QString VerifyWindow::TranTypeUnit(QString sUnit) +{ + QString NewsUnit=sUnit; + + if(unitTypeTransList.keys()[0].contains(sUnit)) + { + NewsUnit=unitTypeTransList.value(unitTypeTransList.keys()[0])[0]; + } + return NewsUnit; +} + +QString VerifyWindow::transCmd(QString sCmd,QString sLabel,QString sLabelItem,QStringList data,bool devicetype) +{ + QString sNewCmd = sCmd; + if(sNewCmd.contains("{DELAY:")){ + QRegExp re("DELAY:(\\d+)"); + int delay=0; + if (re.indexIn(sNewCmd) != -1) { + delay= re.cap(1).toUInt(); + } + BaseCommonApi::SaveLogInfo(1,QString("延迟 %1 ms").arg(delay)); + qDebug() << "delay time:" << delay; + Delay_MSec(delay); + return ""; + } + QString NewUnit; + QStringList cmdPlaceHolderValue; + QStringList TemporaryValue; + for (QStringList keyList : cmdPlaceHolderList.keys()) { + if(sCmd.contains(keyList[0])){ + cmdPlaceHolderValue=cmdPlaceHolderList.value(keyList); + + int idx= getIndexByHeader(sLabel,sLabelItem,cmdPlaceHolderList.value(keyList)); + if(idx!=-1){ + if(devicetype || keyList[0]=="{CH}") + { + NewUnit = TranTypeUnit(data[idx]); //转换 Ω->OHM + sNewCmd = sNewCmd.replace(keyList[0],NewUnit); + continue; + } + double dTmp; + QRegularExpression re("(?=.*[0-9])(?=.*[a-zA-ZΩΜΩ])"); + if(re.match(data[idx]).hasMatch()) + { + dTmp = tranunitSplit(data[idx],true); + }else + { + TemporaryValue.append("单位"); + int idx2= getIndexByHeader(sLabel,sLabelItem,TemporaryValue); + if(idx2!=-1) + { + QString unit = data[idx2]; + dTmp = transUnit(data[idx],unit,true); + }else{ + dTmp=data[idx].toDouble(); + }; + } + sNewCmd = sNewCmd.replace(keyList[0],QString::number(dTmp)); + + } + + } + } + return sNewCmd; +} + +double VerifyWindow::tranunitSplit(QString sData,bool reverse) +{ + + QRegularExpression re("(?=.*[0-9])(?=.*[a-zA-ZΩΜΩ])"); + if(re.match(sData).hasMatch()) + { + QString sData2=sData; + QString sNewData,sUnit; + ItemUnitSplit(sData,sNewData,sUnit); + return transUnit(sNewData,sUnit,reverse); + }else{ + return sData.toDouble(); + } + +} + +void VerifyWindow::ItemUnitSplit(QString Value,QString &data,QString &unit) +{ + QString sData2=Value; + QString sNewData,sUnit; + // 正则表达式匹配数字 + QRegularExpression reLetters("[a-zA-ZΩΜΩ%]"); + QRegularExpression reLetters1("[^a-zA-ZΩΜΩ%]"); + data=sData2.replace(reLetters,""); + unit= Value.replace(reLetters1,""); + +} + void VerifyWindow::on_pushButton_pause_clicked() { @@ -585,7 +1217,7 @@ void VerifyWindow::on_pushButton_stop_clicked() { - + Teststate=SyncRunStatus::Stopped; } void VerifyWindow::on_pushButton_save_clicked() @@ -689,3 +1321,18 @@ } } } + +void VerifyWindow::getCheckItemData(){ + QString standardId=connectList[0].id; + QList CliTable = BaseCommonApi::getJudgeCalibrationTable(standardId); + if(CliTable.length()>0){ + iEquipType = CliTable[0].belong_standard_equipment.toInt(); + } + readItems.clear(); + switch (iEquipType) { + case 1: + veriDataMapList = BaseCommonApi::getStandardCheckItemDataCalibrator(standardId,&veriHeadList); + readItems << "示值1"<< "示值2"<< "示值3"<< "示值4"<< "示值5"<< "示值6"; + break; + } +} diff --git a/softwareDirectory/AutoVerScheme/verifywindow.h b/softwareDirectory/AutoVerScheme/verifywindow.h index e4d823c..34b77e8 100644 --- a/softwareDirectory/AutoVerScheme/verifywindow.h +++ b/softwareDirectory/AutoVerScheme/verifywindow.h @@ -20,11 +20,30 @@ void getVerifyMethod(); void initDeviceInfo(QString stdId,QString bizId); void deleteItem(QLayout *layout); - void initCheckTable(); + void initCheckTable(int idx); + void initCheckItemData(int idx); InstructionLib* getCmdByCheckName(int idx,QString name); void Delay_MSec(unsigned int msec); void selectStandInfo(); void selectBizInfo(); + void getCheckItemData(); + void startVerify(); + int getIndexByHeader(QString sLabel,QString sLabel2,QStringList sName); + QStringList QStrTranQStrList(QString value); + bool showDialog(QString title,QString mess); + QString ReadDevice(InstructionLib* Inst,VisaCommonEngine* Visa,bool IsUnitTran=false); + void SendDevice(InstructionLib* Inst,VisaCommonEngine* Visa,bool IsUnitTran=false); + void InItcmd(); + void closeCmd(); + void connectDevice(); + void closeDevice(); + QString transCmd(QString sCmd,QString sLabel,QString sLabelItem,QStringList data,bool reverse=false); + QMap readDataFromFile(QString filePath); + double transUnit(QString sData,QString sUnit,bool reverse=false); + void autoAdujstData(QString sLabel,QString labelItem,QString header,int i,double dStdValue,QList& dataRes); + QString TranTypeUnit(QString sUnit); + double tranunitSplit(QString sData,bool reverse); + void ItemUnitSplit(QString Value,QString &data,QString &unit); private slots: void showDevice(); void on_editButton_clicked(); @@ -81,6 +100,18 @@ QStringList bizIdList; QMap>> veriDataMapList; QMap> veriHeadList; + int iEquipType=1; + int mainTabIdx=-1; + int itemTabIdx=-1; + QString constsLable; + QString constsLableItem; + QStringList constDataRes; + SyncRunStatus Teststate; + QMap unitTransList; + QMap resultfillingList; + QMap unitTypeTransList; + QMap cmdPlaceHolderList; + QStringList readItems; }; #endif // VERIFYWINDOW_H diff --git a/softwareDirectory/AutoVerScheme/verifywindow.cpp b/softwareDirectory/AutoVerScheme/verifywindow.cpp index 08208aa..3697494 100644 --- a/softwareDirectory/AutoVerScheme/verifywindow.cpp +++ b/softwareDirectory/AutoVerScheme/verifywindow.cpp @@ -24,6 +24,16 @@ } ui->tableWidgetStd->setColumnWidth(0, 60); ui->tableWidgetBiz->setColumnWidth(0, 60); + + //统一定义单位转换系数 + unitTransList=readDataFromFile("unitTrans.txt"); + //统一定义命令占位符 + cmdPlaceHolderList=readDataFromFile("cmdPlaceHolder.txt"); + //单位值特殊转换 + unitTypeTransList=readDataFromFile("unitTypeTrans.txt"); + //测试结果值填充列 + resultfillingList=readDataFromFile("resultfilling.txt"); + getVerifyMethod(); } @@ -33,6 +43,61 @@ delete ui; } +QMap VerifyWindow::readDataFromFile(QString filePath) { + // 获取应用程序的根目录 + QString path = QCoreApplication::applicationDirPath()+"\\File\\config\\"+filePath; + QMap dataMap; + QFile file(path); + if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { + // 错误处理 + qDebug() << "无法打开文件:" << file.errorString(); + QString str=file.errorString(); + return dataMap; + } + + QTextStream in(&file); + in.setCodec("UTF-8"); + QString line; + bool isFirstLine = true; // 跳过第一行 + + while (!in.atEnd()) { + line = in.readLine(); + if (isFirstLine) { + isFirstLine = false; // 第一行已读,接下来读取数据 + continue; + } + + // 使用'|'分割键和值 + QStringList keyValuePairs = line.split(QRegExp("\\s*\\|\\s*"), QString::SkipEmptyParts); + if (keyValuePairs.size() != 2) { + continue; // 跳过不符合格式的行 + } + + QStringList keys, values; + + // 分割键部分,并替换空格为空字符串 + QString keyPart = keyValuePairs.at(0); + keys = keyPart.split(',', QString::SkipEmptyParts); + for (int i = 0; i < keys.size(); ++i) { + keys[i].replace(" ", ""); + } + + // 分割值部分,并替换空格为空字符串 + QString valuePart = keyValuePairs.at(1); + values = valuePart.split(',', QString::SkipEmptyParts); + for (int i = 0; i < values.size(); ++i) { + values[i].replace(" ", ""); + values[i].replace("\t", ""); + } + + // 将键和值的QStringList插入到QMap中 + dataMap.insert(keys, values); + } + + file.close(); + return dataMap; +} + void VerifyWindow::getVerifyMethod() { programList.clear(); @@ -426,91 +491,218 @@ on_deviceButton_clicked(catDeviceList[0],0); ui->horizontalLayout_14->addStretch(); - if(catDeviceList.length()>0) - { - headList.clear(); - calibrationList.clear(); - veriDataMapList = BaseCommonApi::getStandardCheckItemDataCalibrator(standardId,&veriHeadList); -// calibrationList =BaseCommonApi::Search_VerifyTable(standardId,&headList); + getCheckItemData(); + deleteItem(ui->horizontalLayoutMain); + mainTabIdx=-1; + int index=0; + for (const auto &item : veriHeadList.keys()) { + // ======================================================================================== + // 按钮设置显示 + // ==================================================================================== + QPushButton *button = new QPushButton(item, this); + //设置样式 + // 设置按钮大小为 56x20 + //固定大小文字显示不全 + //button->setFixedSize(85, 40); + button->setCheckable(true); + button->setAutoExclusive(true); + //设置第一个按钮选中状态 + if(index==0){ button->setChecked(true);} + //button->setc(true); + // 设置按钮样式表 + button->setStyleSheet("QPushButton {" + "border: 1px solid white;" // 白色边框 + "border-bottom: 2px solid rgba(0, 255, 255, 1);" // 浅蓝色下划线 + "background-color: rgba(242, 242, 242, 1);" // 浅灰色背景 + "height:40px;" + "padding:5px;" + "}" + "QPushButton:hover {" + "background-color: rgba(215, 215, 215, 1);;" // 鼠标悬停时变为深灰色背景 + "}" + "QPushButton:checked {" + "color: white;" + "background-color: rgb(74, 102, 186);" // 选中时变为蓝色背景 + "}"); - //tableWidgetItem - ui->tableWidget_Point->clearContents(); - ui->tableWidget_Point->setRowCount(0); - //循环数据 - int rowCount=0; - int row=0; - for (const QStringList& item : calibrationList) - { - //获取行号 并进行添加行 - rowCount = ui->tableWidget_Point->rowCount(); - ui->tableWidget_Point->insertRow(rowCount); - QTableWidgetItem* p_check = new QTableWidgetItem(); - p_check->setCheckState(Qt::Unchecked); //设置首列为 CheckBox 控件 - ui->tableWidget_Point->setItem(row,0,p_check); - ui->tableWidget_Point->setItem(row, 1, new QTableWidgetItem(item[8])); - ui->tableWidget_Point->setItem(row, 2, new QTableWidgetItem("1")); - row++; - } + ui->horizontalLayoutMain->addWidget(button); + connect(button, &QPushButton::clicked, this, [this,index]() { + //tackedWidget->setCurrentIndex(index); + initCheckTable(index); + }); + //pageButtons.append(button); + ++index; } + ui->horizontalLayoutMain->addStretch(); + initCheckTable(0); +// if(catDeviceList.length()>0) +// { +// headList.clear(); +// calibrationList.clear(); +// QList CliTable = BaseCommonApi::getJudgeCalibrationTable(standardId); +// if(CliTable.length()>0){ +// iEquipType = CliTable[0].belong_standard_equipment.toInt(); +// } +// veriDataMapList = BaseCommonApi::getStandardCheckItemDataCalibrator(standardId,&veriHeadList); +//// calibrationList =BaseCommonApi::Search_VerifyTable(standardId,&headList); + +// //tableWidgetItem +// ui->tableWidget_Point->clearContents(); +// ui->tableWidget_Point->setRowCount(0); +// //循环数据 +// int rowCount=0; +// int row=0; +// for (const QStringList& item : calibrationList) +// { +// //获取行号 并进行添加行 +// rowCount = ui->tableWidget_Point->rowCount(); +// ui->tableWidget_Point->insertRow(rowCount); +// QTableWidgetItem* p_check = new QTableWidgetItem(); +// p_check->setCheckState(Qt::Unchecked); //设置首列为 CheckBox 控件 +// ui->tableWidget_Point->setItem(row,0,p_check); +// ui->tableWidget_Point->setItem(row, 1, new QTableWidgetItem(item[8])); +// ui->tableWidget_Point->setItem(row, 2, new QTableWidgetItem("1")); +// row++; +// } +// } ui->stackedWidget_2->setCurrentIndex(1); } -void VerifyWindow::initCheckTable() +void VerifyWindow::initCheckTable(int idx) { + if(mainTabIdx==idx) + return; + mainTabIdx = idx; + deleteItem(ui->horizontalLayoutItem); + + itemTabIdx=-1; + int index=0; + const auto items = veriHeadList.values().at(mainTabIdx); + for (const auto &item : items.keys()){ + QPushButton *button = new QPushButton(item, this); + //设置样式 + // 设置按钮大小为 56x20 + //固定大小文字显示不全 + //button->setFixedSize(85, 40); + button->setCheckable(true); + button->setAutoExclusive(true); + //设置第一个按钮选中状态 + if(index==0){ button->setChecked(true);} + //button->setc(true); + // 设置按钮样式表 + button->setStyleSheet("QPushButton {" + "border: 1px solid white;" // 白色边框 + "border-bottom: 2px solid rgba(0, 255, 255, 1);" // 浅蓝色下划线 + "background-color: rgba(242, 242, 242, 1);" // 浅灰色背景 + "height:40px;" + "padding:5px;" + "}" + "QPushButton:hover {" + "background-color: rgba(215, 215, 215, 1);;" // 鼠标悬停时变为深灰色背景 + "}" + "QPushButton:checked {" + "color: white;" + "background-color: rgb(74, 102, 186);" // 选中时变为蓝色背景 + "}"); + + ui->horizontalLayoutItem->addWidget(button); + connect(button, &QPushButton::clicked, this, [this,index]() { + //tackedWidget->setCurrentIndex(index); + initCheckItemData(index); + }); + //pageButtons.append(button); + ++index; + } + ui->horizontalLayoutItem->addStretch(); + initCheckItemData(0); +// ui->tableWidgetCheck->clearContents(); +// ui->tableWidgetCheck->setRowCount(0); +// ui->tableWidgetCheck->setColumnCount(0); +// int rowCount = 0; +// int row=0; +// ui->tableWidgetCheck->setColumnCount(headList.count()); +// ui->tableWidgetCheck->setHorizontalHeaderLabels(headList); +// for(int i=0;itableWidgetCheck->horizontalHeader()->setSectionResizeMode(i,QHeaderView::Stretch); +// } +// measureCalList.clear(); +// for(int i=0;itableWidget_Point->rowCount();i++){ +// Qt::CheckState state = ui->tableWidget_Point->item(i,0)->checkState(); +// if(state == Qt::Checked){ +// QStringList& item = calibrationList[i]; +// int cnt = ui->tableWidget_Point->item(i,2)->text().toInt(); +// for(int j=0;jtableWidgetCheck->rowCount(); +// ui->tableWidgetCheck->insertRow(rowCount); +// ui->tableWidgetCheck->setItem(row, 0, new QTableWidgetItem(QString::number(row+1))); +// //循环读取值 headlist,count是列的数量 +// for(int k=1;ktableWidgetCheck->setItem(row, k, new QTableWidgetItem(item[k])); +// } +// StandCheckDataCalibrator measItem; +//// measItem.item_data_id = item[1]; +//// measItem.maximum_error_formula = item[10];//最大允许误差(公式) +//// measItem.error_param_a = item[11];//误差参数a +//// measItem.error_param_b = item[12];//误差参数b +//// measItem.params = item[2];//参数 +//// measItem.capacity=item[3];//量 +//// measItem.unit=item[4];//单位 +//// measItem.frequency=item[5];//频率 +//// measItem.frequency_unit=item[6];//频率单位 +//// measItem.range_range=item[7];//量程 +//// measItem.standard_value=item[8];//标准值(输入字段,特殊:指针式万用表输出字段) +//// measItem.indicating_value=item[15];//示值(输出字段,特殊:指针式万用表输入字段) +//// measItem.maximum_error=item[10];//最大允许误差(值) +//// //measItem.absolute_error=item[11];//绝对误差 +//// measItem.resolution=item[9];//分辨力 +//// measItem.measure_indication_value=item[19];//被检表示值 +// measureCalList.append(measItem); +// row++; +// } +// } +// } +// if(connectList.length()>0&&connectList[0].type==1) +// standardEngine.openDevice(connectList[0].programInterface.visa,"Visa"); +// if(connectList.length()>1&&connectList[1].type==0) +// deviceEngine.openDevice(connectList[1].programInterface.visa,"Visa"); +} + +void VerifyWindow::initCheckItemData(int idx){ + if(itemTabIdx==idx) + return; + itemTabIdx = idx; + QString sLabel = veriHeadList.keys()[mainTabIdx]; + const auto items = veriHeadList.value(sLabel); + + QString sLabel2 = items.keys()[itemTabIdx]; + const auto headrs = items.value(sLabel2); + ui->tableWidgetCheck->clearContents(); ui->tableWidgetCheck->setRowCount(0); ui->tableWidgetCheck->setColumnCount(0); - int rowCount = 0; - int row=0; - ui->tableWidgetCheck->setColumnCount(headList.count()); - ui->tableWidgetCheck->setHorizontalHeaderLabels(headList); - for(int i=0;itableWidgetCheck->setColumnCount(headrs.count()); + ui->tableWidgetCheck->setHorizontalHeaderLabels(headrs); + for(int i=0;itableWidgetCheck->horizontalHeader()->setSectionResizeMode(i,QHeaderView::Stretch); } - measureCalList.clear(); - for(int i=0;itableWidget_Point->rowCount();i++){ - Qt::CheckState state = ui->tableWidget_Point->item(i,0)->checkState(); - if(state == Qt::Checked){ - QStringList& item = calibrationList[i]; - int cnt = ui->tableWidget_Point->item(i,2)->text().toInt(); - for(int j=0;jtableWidgetCheck->rowCount(); - ui->tableWidgetCheck->insertRow(rowCount); - ui->tableWidgetCheck->setItem(row, 0, new QTableWidgetItem(QString::number(row+1))); - //循环读取值 headlist,count是列的数量 - for(int k=1;ktableWidgetCheck->setItem(row, k, new QTableWidgetItem(item[k])); - } - StandCheckDataCalibrator measItem; -// measItem.item_data_id = item[1]; -// measItem.maximum_error_formula = item[10];//最大允许误差(公式) -// measItem.error_param_a = item[11];//误差参数a -// measItem.error_param_b = item[12];//误差参数b -// measItem.params = item[2];//参数 -// measItem.capacity=item[3];//量 -// measItem.unit=item[4];//单位 -// measItem.frequency=item[5];//频率 -// measItem.frequency_unit=item[6];//频率单位 -// measItem.range_range=item[7];//量程 -// measItem.standard_value=item[8];//标准值(输入字段,特殊:指针式万用表输出字段) -// measItem.indicating_value=item[15];//示值(输出字段,特殊:指针式万用表输入字段) -// measItem.maximum_error=item[10];//最大允许误差(值) -// //measItem.absolute_error=item[11];//绝对误差 -// measItem.resolution=item[9];//分辨力 -// measItem.measure_indication_value=item[19];//被检表示值 - measureCalList.append(measItem); - row++; - } + int rowCount = 0; + const auto items2 = veriDataMapList.value(sLabel); + const auto dataRes = items2.value(sLabel2); + for (int i = 0; i < dataRes.count(); ++i) { + //获取行号 并进行添加行 + rowCount = ui->tableWidgetCheck->rowCount(); + ui->tableWidgetCheck->insertRow(rowCount); + ui->tableWidgetCheck->setItem(i, 0, new QTableWidgetItem(QString::number(i+1))); + for(int j=1;jtableWidgetCheck->setItem(i, j, new QTableWidgetItem(dataRes[i][j])); } } - if(connectList.length()>0&&connectList[0].type==1) - standardEngine.openDevice(connectList[0].programInterface.visa,"Visa"); - if(connectList.length()>1&&connectList[1].type==0) - deviceEngine.openDevice(connectList[1].programInterface.visa,"Visa"); } InstructionLib* VerifyWindow::getCmdByCheckName(int idx,QString name) @@ -533,51 +725,491 @@ void VerifyWindow::on_pushButton_start_clicked() { - initCheckTable(); - for(int i=0;iinstruct_config.split(";"); +// if(sList.length()>0){ +// for (QString& sCmd : sList){ +// standardEngine.sendData(sCmd); +// } +// } +// } +// } +// //被检设备读数 +// if(deviceEngine.getState()){ +// InstructionLib *instrcutLib = getCmdByCheckName(0,item.params); +// if(instrcutLib!=nullptr){ +// QStringList sList = instrcutLib->instruct_config.split(";"); +// if(sList.length()>0){ +// for (QString& sCmd : sList){ +// deviceEngine.sendData(sCmd); +// } +// } +// Delay_MSec(2000); +// sRet = deviceEngine.queryData(instrcutLib->instruct_read); +// } +// } +// // +// if(sRet==""){ +// bool bOk = false; +// double dRet = QInputDialog::getDouble(this,"手动测试","请输入被检示值",0,-100000, 100000,1,&bOk); + +// if (bOk) { +// sRet = QString::number(dRet); +// } +// } +// item.test_value_one = sRet; +// ui->tableWidgetCheck->setItem(i,19,new QTableWidgetItem(sRet)); +// } +} + +int VerifyWindow::getIndexByHeader(QString sLabel,QString sLabel2,QStringList sName){ + const auto &headrs = veriHeadList.value(sLabel).value(sLabel2); + for(int j=0;jinstruct_config.split(";"); - if(sList.length()>0){ - for (QString& sCmd : sList){ - standardEngine.sendData(sCmd); + if(Teststate==SyncRunStatus::Stopped){break;}; + + //每次循环按钮变化 + initCheckTable(i); + constsLable= veriHeadList.keys()[i]; + auto items = veriDataMapList.value(constsLable); + QString labelItem = "重复性"; + constsLableItem = labelItem; + int itemIdx = items.keys().indexOf(labelItem); + initCheckItemData(itemIdx); + QList dataRes = items.value(labelItem); + + BaseCommonApi::SaveLogInfo(1,QString("开始 %1 测试").arg(constsLable)); + for (int i = 0; i < dataRes.count(); ++i) { + if(Teststate==SyncRunStatus::Stopped){break;}; + constDataRes=dataRes[i]; + //InItcmd(); + QString sRet=""; + QString newCmd; + double dStdValue=FP_INFINITE,dError=0; + QString newdStdValue,newdError; + + //标准器输出 + BaseCommonApi::SaveLogInfo(1,QString("标准器输出")); + QString sParam; + QStringList TempValue; + TempValue.append("核查项目"); + int idx= getIndexByHeader(constsLable,labelItem,TempValue); + if(idx!=-1) + sParam = dataRes[i][idx]; + //CheckBackColorUpdate(true,i); + + //暂时加到这个地方 后面统一编写 + if(sParam=="DCI"||sParam=="ACI") + { + int idx2= getIndexByHeader(constsLable,labelItem,QStrTranQStrList("单位")); + if(idx2!=-1) + { + QString ConstUnit=""; + QString v=dataRes[i][idx2].toUpper(); + if(i!=0) + ConstUnit=dataRes[i-1][idx2].toUpper(); + + BaseCommonApi::SaveLogInfo(1,ConstUnit+"-"+v); + if((ConstUnit=="MA" && v=="A") || (ConstUnit=="A" && v=="MA")) + { + if(!this->showDialog("电流换线提醒",QString("换线提醒\n %1 -> %2").arg(ConstUnit).arg(v))) + { + continue; + } } } } - } - //被检设备读数 - if(deviceEngine.getState()){ - InstructionLib *instrcutLib = getCmdByCheckName(0,item.params); - if(instrcutLib!=nullptr){ - QStringList sList = instrcutLib->instruct_config.split(";"); - if(sList.length()>0){ - for (QString& sCmd : sList){ - deviceEngine.sendData(sCmd); - } + //标准器输出 + InstructionLib *instrcutLibstan = getCmdByCheckName(1,sParam); + SendDevice(instrcutLibstan,&standardEngine,true); + //被检设备读数 + BaseCommonApi::SaveLogInfo(1,QString("被检设备输出")); + InstructionLib *instrcutLib = getCmdByCheckName(0,sParam); + SendDevice(instrcutLib,&deviceEngine); + //读取6次测试值 + for(QString head : readItems){ + sRet=ReadDevice(instrcutLib,&deviceEngine); + if(sRet!=""){ + TempValue.clear(); + TempValue.append("单位"); + idx= getIndexByHeader(constsLable,labelItem,TempValue); + dStdValue = transUnit(sRet,dataRes[i][idx]); } - Delay_MSec(2000); - sRet = deviceEngine.queryData(instrcutLib->instruct_read); + autoAdujstData(constsLable,labelItem,head,i,dStdValue,dataRes); + //CheckBackColorUpdate(false,i); + Delay_MSec(1000); } + closeCmd(); + //CheckBackColorUpdate(false,i); + Delay_MSec(2000); } - // - if(sRet==""){ + items.insert(labelItem,dataRes); + veriDataMapList.insert(constsLable,items); + } + closeDevice(); +} + +void VerifyWindow::autoAdujstData(QString sLabel,QString labelItem,QString header,int i,double dStdValue,QList& dataRes){ + double dError; + QString newdStdValue,newdError,Value; + if(iEquipType==1 ){ + if(dStdValue==FP_INFINITE){ bool bOk = false; - double dRet = QInputDialog::getDouble(this,"手动测试","请输入被检示值",0,-100000, 100000,1,&bOk); + dStdValue = QInputDialog::getDouble(this,"手动测试","请输入被检示值",0,-100000, 100000,5,&bOk); if (bOk) { - sRet = QString::number(dRet); + //sRet = QString::number(dStdValue); + }else{ + dStdValue=0; } } - item.test_value_one = sRet; - ui->tableWidgetCheck->setItem(i,19,new QTableWidgetItem(sRet)); + // ItemUnitSplit + + //newdStdValue= TranDecimals(sLabel, dataRes[i],dStdValue); + newdStdValue=QString::number(dStdValue,'f',4); + //QStringList ResultName=getsParambyHeader(sParam); + int idx= getIndexByHeader(sLabel,labelItem,QStrTranQStrList(header)); + if(idx!=-1) + { + dataRes[i][idx] = newdStdValue; + ui->tableWidgetCheck->setItem(i,idx,new QTableWidgetItem(newdStdValue)); //示值 + } + double dMean=0; + for(QString item : readItems){ + idx= getIndexByHeader(sLabel,labelItem,QStrTranQStrList(item)); + dMean += dataRes[i][idx].toDouble(); + } + dMean /=readItems.count(); + newdStdValue=QString::number(dMean,'f',4); + idx= getIndexByHeader(sLabel,labelItem,QStrTranQStrList("算数平均值")); + if(idx!=-1) + { + dataRes[i][idx] = newdStdValue; + ui->tableWidgetCheck->setItem(i,idx,new QTableWidgetItem(newdStdValue)); + } + BaseCommonApi::SaveLogInfo(1,QString("转换前 测试值 %1").arg(dStdValue)); + BaseCommonApi::SaveLogInfo(1,QString("转换后 测试值 %1").arg(newdStdValue)); + //Delay_MSec(2000); } } +double VerifyWindow::transUnit(QString sData,QString sUnit,bool reverse){ + double dTmp = sData.toDouble(); + QString unit = sUnit.toUpper(); + QStringList TempValue; + for(const QStringList &key : unitTransList.keys()) + { + for (int i=0;igetState()){ + if(Inst!=nullptr){ + QStringList sList = Inst->instruct_config.split(";"); + if(sList.length()>0){ + for (QString& sCmd : sList){ + newCmd = transCmd(sCmd,constsLable,constsLableItem,constDataRes,IsUnitTran); + if(newCmd!=""){ + QString str=Visa->commType; + Visa->sendData(newCmd); + qDebug() << "config cmds:" << newCmd; + } + } + } + } +} +} +QString VerifyWindow::ReadDevice(InstructionLib* Inst,VisaCommonEngine* Visa,bool IsUnitTran){ + //读取仪器 进一步封装 + QString newCmd=""; + QString result=""; + if(Visa!=nullptr&&Visa->getState()){ + if(Inst!=nullptr){ + newCmd = transCmd(Inst->instruct_read,constsLable,constsLableItem,constDataRes,IsUnitTran); + if(newCmd!=""){ + qDebug() << "query cmds:" << newCmd; + result = Visa->queryData(newCmd); + } + } + } + return result; +} + +void VerifyWindow::InItcmd(){ + //发送INIt相关指令 + int count=0; + for(const ConnectInfo &visa:connectList) + { + VisaCommonEngine *Engine; + InstructionLib *instrcutLib; + if(connectList.length()>0&&visa.type==0) + { + instrcutLib = getCmdByCheckName(count,"INIT"); + Engine=&deviceEngine; + } + if(connectList.length()>1&&visa.type==1) + { + instrcutLib = getCmdByCheckName(count,"INIT"); + if(connectList.count()==2){ + Engine=&standardEngine; + }else{ + int stancount=0; +// for (VisaCommonEngine &item:VisaStanEngineList) { +// if(stancount==count-1){ +// Engine=&item; +// break; +// } +// } + } + + } + SendDevice(instrcutLib,Engine); + count++; + } +} + +void VerifyWindow::connectDevice(){ + int count=0; + QString rolename; + for(const ConnectInfo &visa:connectList) + { + VisaCommonEngine Engine; + if(Engine.openDevice(visa.programInterface.visa,"Visa")){ + if(connectList.length()>0&&visa.type==0) + { + deviceEngine=Engine; + } + if(connectList.length()>1&&visa.type==1) + { + if(connectList.count()==2){ + standardEngine=Engine; + }else{ + //rolename=this->GetdeviceidByRole(visa.programInterface.device_id); + //VisaStanEngineList.insert(rolename,Engine); + } + + } + } + count++; + + } +} + +void VerifyWindow::closeCmd(){ + //发送Close相关指令 + int count=0; + for(const ConnectInfo &visa:connectList) + { + VisaCommonEngine *Engine; + InstructionLib *instrcutLib; + if(connectList.length()>0&&visa.type==0) + { + instrcutLib = getCmdByCheckName(count,"CLOSE"); + Engine=&deviceEngine; + } + if(connectList.length()>1&&visa.type==1) + { + instrcutLib = getCmdByCheckName(count,"CLOSE"); + if(connectList.count()==2){ + Engine=&standardEngine; + }else{ + int stancount=0; +// for (VisaCommonEngine &item:VisaStanEngineList) { +// if(stancount==count-1){ +// Engine=&item; +// break; +// } +// } + } + + } + SendDevice(instrcutLib,Engine); + } +} + +void VerifyWindow::closeDevice(){ + //关闭设备连接 + int count=0; + for(const ConnectInfo &visa:connectList) + { + VisaCommonEngine *Engine; + if(connectList.length()>0&&visa.type==0) + { + Engine=&deviceEngine; + } + if(connectList.length()>1&&visa.type==1) + { + if(connectList.count()==2){ + Engine=&standardEngine; + }else{ + int stancount=0; +// for (VisaCommonEngine &item:VisaStanEngineList) { +// if(stancount==count-1){ +// Engine=&item; +// break; +// } +// } + } + + } + if(Engine!=nullptr) + Engine->closeDevice(); + count++; + + } +} + +QString VerifyWindow::TranTypeUnit(QString sUnit) +{ + QString NewsUnit=sUnit; + + if(unitTypeTransList.keys()[0].contains(sUnit)) + { + NewsUnit=unitTypeTransList.value(unitTypeTransList.keys()[0])[0]; + } + return NewsUnit; +} + +QString VerifyWindow::transCmd(QString sCmd,QString sLabel,QString sLabelItem,QStringList data,bool devicetype) +{ + QString sNewCmd = sCmd; + if(sNewCmd.contains("{DELAY:")){ + QRegExp re("DELAY:(\\d+)"); + int delay=0; + if (re.indexIn(sNewCmd) != -1) { + delay= re.cap(1).toUInt(); + } + BaseCommonApi::SaveLogInfo(1,QString("延迟 %1 ms").arg(delay)); + qDebug() << "delay time:" << delay; + Delay_MSec(delay); + return ""; + } + QString NewUnit; + QStringList cmdPlaceHolderValue; + QStringList TemporaryValue; + for (QStringList keyList : cmdPlaceHolderList.keys()) { + if(sCmd.contains(keyList[0])){ + cmdPlaceHolderValue=cmdPlaceHolderList.value(keyList); + + int idx= getIndexByHeader(sLabel,sLabelItem,cmdPlaceHolderList.value(keyList)); + if(idx!=-1){ + if(devicetype || keyList[0]=="{CH}") + { + NewUnit = TranTypeUnit(data[idx]); //转换 Ω->OHM + sNewCmd = sNewCmd.replace(keyList[0],NewUnit); + continue; + } + double dTmp; + QRegularExpression re("(?=.*[0-9])(?=.*[a-zA-ZΩΜΩ])"); + if(re.match(data[idx]).hasMatch()) + { + dTmp = tranunitSplit(data[idx],true); + }else + { + TemporaryValue.append("单位"); + int idx2= getIndexByHeader(sLabel,sLabelItem,TemporaryValue); + if(idx2!=-1) + { + QString unit = data[idx2]; + dTmp = transUnit(data[idx],unit,true); + }else{ + dTmp=data[idx].toDouble(); + }; + } + sNewCmd = sNewCmd.replace(keyList[0],QString::number(dTmp)); + + } + + } + } + return sNewCmd; +} + +double VerifyWindow::tranunitSplit(QString sData,bool reverse) +{ + + QRegularExpression re("(?=.*[0-9])(?=.*[a-zA-ZΩΜΩ])"); + if(re.match(sData).hasMatch()) + { + QString sData2=sData; + QString sNewData,sUnit; + ItemUnitSplit(sData,sNewData,sUnit); + return transUnit(sNewData,sUnit,reverse); + }else{ + return sData.toDouble(); + } + +} + +void VerifyWindow::ItemUnitSplit(QString Value,QString &data,QString &unit) +{ + QString sData2=Value; + QString sNewData,sUnit; + // 正则表达式匹配数字 + QRegularExpression reLetters("[a-zA-ZΩΜΩ%]"); + QRegularExpression reLetters1("[^a-zA-ZΩΜΩ%]"); + data=sData2.replace(reLetters,""); + unit= Value.replace(reLetters1,""); + +} + void VerifyWindow::on_pushButton_pause_clicked() { @@ -585,7 +1217,7 @@ void VerifyWindow::on_pushButton_stop_clicked() { - + Teststate=SyncRunStatus::Stopped; } void VerifyWindow::on_pushButton_save_clicked() @@ -689,3 +1321,18 @@ } } } + +void VerifyWindow::getCheckItemData(){ + QString standardId=connectList[0].id; + QList CliTable = BaseCommonApi::getJudgeCalibrationTable(standardId); + if(CliTable.length()>0){ + iEquipType = CliTable[0].belong_standard_equipment.toInt(); + } + readItems.clear(); + switch (iEquipType) { + case 1: + veriDataMapList = BaseCommonApi::getStandardCheckItemDataCalibrator(standardId,&veriHeadList); + readItems << "示值1"<< "示值2"<< "示值3"<< "示值4"<< "示值5"<< "示值6"; + break; + } +} diff --git a/softwareDirectory/AutoVerScheme/verifywindow.h b/softwareDirectory/AutoVerScheme/verifywindow.h index e4d823c..34b77e8 100644 --- a/softwareDirectory/AutoVerScheme/verifywindow.h +++ b/softwareDirectory/AutoVerScheme/verifywindow.h @@ -20,11 +20,30 @@ void getVerifyMethod(); void initDeviceInfo(QString stdId,QString bizId); void deleteItem(QLayout *layout); - void initCheckTable(); + void initCheckTable(int idx); + void initCheckItemData(int idx); InstructionLib* getCmdByCheckName(int idx,QString name); void Delay_MSec(unsigned int msec); void selectStandInfo(); void selectBizInfo(); + void getCheckItemData(); + void startVerify(); + int getIndexByHeader(QString sLabel,QString sLabel2,QStringList sName); + QStringList QStrTranQStrList(QString value); + bool showDialog(QString title,QString mess); + QString ReadDevice(InstructionLib* Inst,VisaCommonEngine* Visa,bool IsUnitTran=false); + void SendDevice(InstructionLib* Inst,VisaCommonEngine* Visa,bool IsUnitTran=false); + void InItcmd(); + void closeCmd(); + void connectDevice(); + void closeDevice(); + QString transCmd(QString sCmd,QString sLabel,QString sLabelItem,QStringList data,bool reverse=false); + QMap readDataFromFile(QString filePath); + double transUnit(QString sData,QString sUnit,bool reverse=false); + void autoAdujstData(QString sLabel,QString labelItem,QString header,int i,double dStdValue,QList& dataRes); + QString TranTypeUnit(QString sUnit); + double tranunitSplit(QString sData,bool reverse); + void ItemUnitSplit(QString Value,QString &data,QString &unit); private slots: void showDevice(); void on_editButton_clicked(); @@ -81,6 +100,18 @@ QStringList bizIdList; QMap>> veriDataMapList; QMap> veriHeadList; + int iEquipType=1; + int mainTabIdx=-1; + int itemTabIdx=-1; + QString constsLable; + QString constsLableItem; + QStringList constDataRes; + SyncRunStatus Teststate; + QMap unitTransList; + QMap resultfillingList; + QMap unitTypeTransList; + QMap cmdPlaceHolderList; + QStringList readItems; }; #endif // VERIFYWINDOW_H diff --git a/softwareDirectory/AutoVerScheme/verifywindow.ui b/softwareDirectory/AutoVerScheme/verifywindow.ui index 464fbf9..15b7dfd 100644 --- a/softwareDirectory/AutoVerScheme/verifywindow.ui +++ b/softwareDirectory/AutoVerScheme/verifywindow.ui @@ -1710,6 +1710,12 @@ + + + + + + @@ -1732,7 +1738,7 @@ - 选择 + 核查项目 @@ -1754,18 +1760,6 @@ - - - 循环次数 - - - - 12 - 75 - true - - -