Compare commits
4
Commits
localBackup
...
sub
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
08f3890ac4 | ||
|
|
21d8ef8c34 | ||
|
|
db5b286fa4 | ||
|
|
8785eb2a37 |
+21
-3
@@ -24,17 +24,35 @@
|
||||
{
|
||||
"hidden": true,
|
||||
"name": "Qt-Default",
|
||||
"inherits": null,
|
||||
"inherits": "allenv_qt5",
|
||||
"vendor": {
|
||||
"qt-project.org/Default": {
|
||||
"checksum": "VoalogTkyWuFomeO1TLFx0olLJ4="
|
||||
"checksum": "Z8G/I2NiO/EJ3GcqVEvZ0lSrMzM="
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"hidden": true,
|
||||
"name": "allenv_qt5",
|
||||
"inherits": "Qt",
|
||||
"environment": {
|
||||
"QTDIR": "G:/detSystem/allenv/qt5"
|
||||
},
|
||||
"architecture": {
|
||||
"strategy": "external",
|
||||
"value": "x64"
|
||||
},
|
||||
"generator": "Ninja",
|
||||
"vendor": {
|
||||
"qt-project.org/Version": {
|
||||
"checksum": "fGB5SKr330WkMcI+0sxuX59JXuA="
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"vendor": {
|
||||
"qt-project.org/Presets": {
|
||||
"checksum": "DiAwp+JKAQXqWc2tOPE/U9qg77Y="
|
||||
"checksum": "yQDlwrq4/xeG9pH9UtkSbCWd0/o="
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,10 @@
|
||||
#include <string.h> // for strstr
|
||||
#include <devguid.h>
|
||||
#include <shellapi.h>
|
||||
#include <ShlObj.h>
|
||||
#include <QPixmap>
|
||||
#include <QFileIconProvider>
|
||||
#include <QFileInfo>
|
||||
#pragma comment(lib, "setupapi.lib")
|
||||
|
||||
static void DisableComPort(const char* portName) {
|
||||
@@ -140,4 +144,41 @@ static void restartAsAdmin() {
|
||||
}
|
||||
}
|
||||
}
|
||||
// 解析 .lnk 文件,获取目标路径
|
||||
static QString getShortcutTarget(const QString& shortcutPath) {
|
||||
HRESULT hres;
|
||||
CoInitialize(NULL);
|
||||
IShellLink* psl;
|
||||
QString targetPath;
|
||||
hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*)&psl);
|
||||
if (SUCCEEDED(hres)) {
|
||||
IPersistFile* ppf;
|
||||
hres = psl->QueryInterface(IID_IPersistFile, (LPVOID*)&ppf);
|
||||
if (SUCCEEDED(hres)) {
|
||||
WCHAR wsz[MAX_PATH];
|
||||
shortcutPath.toWCharArray(wsz);
|
||||
wsz[shortcutPath.length()] = 0;
|
||||
hres = ppf->Load(wsz, STGM_READ);
|
||||
if (SUCCEEDED(hres)) {
|
||||
char szTarget[MAX_PATH];
|
||||
WIN32_FIND_DATA wfd;
|
||||
if (SUCCEEDED(psl->GetPath(szTarget, MAX_PATH, &wfd, SLGP_UNCPRIORITY))) {
|
||||
targetPath = QString::fromLocal8Bit(szTarget);
|
||||
}
|
||||
}
|
||||
ppf->Release();
|
||||
}
|
||||
psl->Release();
|
||||
}
|
||||
CoUninitialize();
|
||||
return targetPath;
|
||||
}
|
||||
// 获取目标文件图标
|
||||
static QIcon getFileIcon(const QString& filePath, const QSize& size) {
|
||||
QFileIconProvider iconProvider;
|
||||
QFileInfo fileInfo(filePath);
|
||||
QIcon icon = iconProvider.icon(fileInfo);
|
||||
QPixmap pixmap = icon.pixmap(size);
|
||||
return QIcon(pixmap);
|
||||
}
|
||||
#pragma once
|
||||
@@ -124,6 +124,7 @@ public:
|
||||
_serviceManager->_triggerManager->registerPlcValueViewer(viewerNameIN + "_" + QString::number(i),
|
||||
{ {"触发",address[i].triggerAddr },
|
||||
{"反馈",address[i].completeAddr.toInt()},
|
||||
{"结果",address[i].resultAddr.toInt()},
|
||||
{"数值1",address[i].valueOffsetAddr},
|
||||
{"数值2",address[i].valueOffsetAddr + 2},
|
||||
{"数值3",address[i].valueOffsetAddr + 4} });
|
||||
|
||||
+27
-9
@@ -91,7 +91,7 @@ static bool generalAlgoTest(std::shared_ptr <detData> data, detParams* _detParam
|
||||
return true;
|
||||
}
|
||||
CATCH_EXCEPTIONS
|
||||
data->service->_triggerManager->writeShort("D" + address.resultAddr + "_2");//发送异常结果
|
||||
data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//发送异常结果
|
||||
return false;
|
||||
}
|
||||
template <typename paramTemplte>
|
||||
@@ -100,7 +100,7 @@ template <typename paramTemplte>
|
||||
//例触发地址有4个,输入信号为 1 0 0 1 则触发1和4的地址拍照检测,2和3拍照取图并废弃
|
||||
class _581_Union_triggerTemplate {
|
||||
public:
|
||||
paramTemplte _detParams;
|
||||
paramTemplte* _detParams;
|
||||
detCallbackChain<paramTemplte, yh_581_address>* generalDet;
|
||||
std::string cameraName;
|
||||
QString viewerName;
|
||||
@@ -119,7 +119,7 @@ public:
|
||||
/// <param name="_processAlgoCallback">算法函数</param>
|
||||
/// <param name="resultHandlerIn"></param>
|
||||
void init(std::string cameraNameIn, QString viewerNameIN, int startAddr, int triggerCount,int oneTriggerCaptrueTimes,
|
||||
paramTemplte& detParamsIn, ServiceManager* _serviceManagerIn, qtFuncBridge* bridgeIn,
|
||||
paramTemplte* detParamsIn, ServiceManager* _serviceManagerIn, qtFuncBridge* bridgeIn,
|
||||
typename detCallbackChain<paramTemplte, yh_581_address>::processAlgoCallback _processAlgoCallback,
|
||||
QString saveObjectNameIN = "") {
|
||||
viewerName = viewerNameIN;
|
||||
@@ -129,7 +129,7 @@ public:
|
||||
bridge = bridgeIn;
|
||||
|
||||
saveObjectName = saveObjectNameIN;
|
||||
generalDet = new detCallbackChain<paramTemplte, yh_581_address>(_serviceManager, &_detParams, bridge);
|
||||
generalDet = new detCallbackChain<paramTemplte, yh_581_address>(_serviceManager, _detParams, bridge);
|
||||
generalDet->registerProcessAlgoCallback(_processAlgoCallback);
|
||||
address = generateYh581AddressMap(startAddr, triggerCount);
|
||||
//联合触发器条件
|
||||
@@ -151,6 +151,15 @@ public:
|
||||
cnt++;
|
||||
}
|
||||
}, "");
|
||||
for (int i = 0; i < address.size(); i++) {
|
||||
_serviceManager->_triggerManager->registerPlcValueViewer(viewerNameIN + "_" + QString::number(i),
|
||||
{ {"触发",address[i].triggerAddr },
|
||||
{"反馈",address[i].completeAddr.toInt()},
|
||||
{"结果",address[i].resultAddr.toInt()},
|
||||
{"数值1",address[i].valueOffsetAddr},
|
||||
{"数值2",address[i].valueOffsetAddr + 2},
|
||||
{"数值3",address[i].valueOffsetAddr + 4} });
|
||||
}
|
||||
}
|
||||
//获取图片并进行检测
|
||||
void evaluate(int batteryOffset, QByteArray& byteArray) {
|
||||
@@ -159,7 +168,7 @@ public:
|
||||
auto camera = _serviceManager->_cameraManager->getCamera(cameraName);
|
||||
camera->clearCache();
|
||||
std::shared_ptr <detData> data = _serviceManager->_detDataManager->createDetData(
|
||||
QString::number(address[batteryOffset].triggerAddr), sn, 1, camera->config.oriSaveFormat);//创建数据包
|
||||
QString::fromStdString(cameraName), sn, 1, camera->config.oriSaveFormat);//创建数据包
|
||||
camera->captureImage(data);//拍照
|
||||
data->saveObjectName = saveObjectName;
|
||||
generalDet->ansyncProcess(data, address[batteryOffset]);//处理算法
|
||||
@@ -183,7 +192,7 @@ template <typename paramTemplte2>
|
||||
//例触发地址有4个,输入信号为 1 0 0 1 则按顺序触发1和4的地址拍照检测,2和3不做处理
|
||||
class _581_Single_triggerTemplate {
|
||||
public:
|
||||
paramTemplte2 _detParams;
|
||||
paramTemplte2* _detParams;
|
||||
detCallbackChain<paramTemplte2, yh_581_address>* generalDet;
|
||||
std::string cameraName;
|
||||
QString viewerName;
|
||||
@@ -202,7 +211,7 @@ public:
|
||||
/// <param name="_processAlgoCallback">算法函数</param>
|
||||
/// <param name="resultHandlerIn"></param>
|
||||
void init(std::string cameraNameIn, QString viewerNameIN, int startAddr, int triggerCount, int oneTriggerCaptrueTimes,
|
||||
paramTemplte2& detParamsIn, ServiceManager* _serviceManagerIn, qtFuncBridge* bridgeIn,
|
||||
paramTemplte2* detParamsIn, ServiceManager* _serviceManagerIn, qtFuncBridge* bridgeIn,
|
||||
typename detCallbackChain<paramTemplte2, yh_581_address>::processAlgoCallback _processAlgoCallback,
|
||||
QString saveObjectNameIN = "") {
|
||||
viewerName = viewerNameIN;
|
||||
@@ -212,7 +221,7 @@ public:
|
||||
bridge = bridgeIn;
|
||||
|
||||
saveObjectName = saveObjectNameIN;
|
||||
generalDet = new detCallbackChain<paramTemplte2, yh_581_address>(_serviceManager, &_detParams, bridge);
|
||||
generalDet = new detCallbackChain<paramTemplte2, yh_581_address>(_serviceManager, _detParams, bridge);
|
||||
generalDet->registerProcessAlgoCallback(_processAlgoCallback);
|
||||
address = generateYh581AddressMap(startAddr, triggerCount);
|
||||
//单次触发器条件
|
||||
@@ -224,6 +233,15 @@ public:
|
||||
_serviceManager->_triggerManager->registerCallback(address[i].triggerAddr, 0, [this, i](int triggerPos, int triggerValue, QByteArray& byteArray) {
|
||||
_serviceManager->_triggerManager->writeShort("D" + address[0].completeAddr + "_0"); }, "D" + address[0].completeAddr.toStdString() + "清零");
|
||||
}
|
||||
for (int i = 0; i < address.size(); i++) {
|
||||
_serviceManager->_triggerManager->registerPlcValueViewer(viewerNameIN + "_" + QString::number(i),
|
||||
{ {"触发",address[i].triggerAddr },
|
||||
{"反馈",address[i].completeAddr.toInt()},
|
||||
{"结果",address[i].resultAddr.toInt()},
|
||||
{"数值1",address[i].valueOffsetAddr},
|
||||
{"数值2",address[i].valueOffsetAddr + 2},
|
||||
{"数值3",address[i].valueOffsetAddr + 4} });
|
||||
}
|
||||
|
||||
}
|
||||
//获取图片并进行检测
|
||||
@@ -233,7 +251,7 @@ public:
|
||||
auto camera = _serviceManager->_cameraManager->getCamera(cameraName);
|
||||
camera->clearCache();
|
||||
std::shared_ptr <detData> data = _serviceManager->_detDataManager->createDetData(
|
||||
QString::number(address[batteryOffset].triggerAddr), sn, 1, camera->config.oriSaveFormat);//创建数据包
|
||||
QString::fromStdString(cameraName), sn, 1, camera->config.oriSaveFormat);//创建数据包
|
||||
camera->captureImage(data);//拍照
|
||||
data->saveObjectName = saveObjectName;
|
||||
generalDet->ansyncProcess(data, address[batteryOffset]);//处理算法
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#pragma once
|
||||
#pragma once
|
||||
|
||||
#include <QDialog>
|
||||
#include <QTableWidget>
|
||||
@@ -17,6 +17,11 @@
|
||||
#include <nlohmannjson.hpp>
|
||||
#include <global.h>
|
||||
#include <uiModule/components/fancyButton.h>
|
||||
#include <QDoubleSpinBox>
|
||||
#include <uiModule/components/sliderSwitch.h>
|
||||
#include <QTableView>
|
||||
#include <QStandardItemModel>
|
||||
|
||||
class JsonParamTableEditor : public QDialog {
|
||||
Q_OBJECT
|
||||
|
||||
@@ -35,12 +40,24 @@ public:
|
||||
: QDialog(parent) {
|
||||
this->setWindowTitle("JSON 表格编辑器");
|
||||
this->resize(700, 450);
|
||||
setWindowFlags(this->windowFlags() | Qt::FramelessWindowHint); // 去掉边框 //现在、、
|
||||
setWindowFlags(this->windowFlags() | Qt::FramelessWindowHint);// 去掉边框
|
||||
//setAttribute(Qt::WA_TranslucentBackground); // 背景透明
|
||||
this->setObjectName("JsonParamTableEditor");
|
||||
this->setStyleSheet(QString("QDialog#JsonParamTableEditor {background-color: rgb(%1);border: 2px solid #000000;border-radius: 6px;}").arg(sColor_Blue));
|
||||
m_tableWidget = new QTableWidget(0, 2, this);
|
||||
m_tableWidget->setHorizontalHeaderLabels({ "选项", "值" });
|
||||
|
||||
m_tableView = new QTableView(this);
|
||||
m_tableModel = new QStandardItemModel(0, 2, this);// 2列:选项、值
|
||||
m_tableView->setModel(m_tableModel);
|
||||
|
||||
//设置表头
|
||||
m_tableModel->setHorizontalHeaderLabels({ "选项", "值" });
|
||||
|
||||
//设置表格属性
|
||||
m_tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
|
||||
m_tableView->setAlternatingRowColors(true);
|
||||
m_tableView->horizontalHeader()->setStretchLastSection(true);
|
||||
m_tableView->setColumnWidth(1, 200);// 选项列宽度
|
||||
|
||||
|
||||
fancyButtonText* okBtn = new fancyButtonText("保存", 70, 22, "");
|
||||
fancyButtonText* cancelBtn = new fancyButtonText("取消", 70, 22, "");
|
||||
@@ -54,65 +71,94 @@ public:
|
||||
btnLayout->addWidget(cancelBtn);
|
||||
|
||||
QVBoxLayout* mainLayout = new QVBoxLayout(this);
|
||||
mainLayout->addWidget(m_tableWidget);
|
||||
mainLayout->addWidget(m_tableView);
|
||||
mainLayout->addLayout(btnLayout);
|
||||
|
||||
// 设置表格样式和属性
|
||||
m_tableWidget->setAlternatingRowColors(true);
|
||||
m_tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
|
||||
m_tableWidget->horizontalHeader()->setStretchLastSection(true);
|
||||
m_tableWidget->setColumnWidth(0, 200); // 选项列宽度
|
||||
|
||||
m_tableWidget->setStyleSheet(QString(R"(
|
||||
QTableWidget {
|
||||
m_tableView->setStyleSheet(QString(R"(
|
||||
QTableView {
|
||||
background-color: rgb(%1);
|
||||
font-family: "Microsoft YaHei";
|
||||
color: #ffffff;
|
||||
gridline-color: #555555;
|
||||
alternate-background-color: #3a3a3a;
|
||||
}
|
||||
QHeaderView::section {
|
||||
background-color: #0078d7;
|
||||
padding: 4px;
|
||||
font-weight: bold;
|
||||
color: #ffffff;
|
||||
border: none;
|
||||
}
|
||||
QTableWidget::item:selected {
|
||||
QTableView::item {
|
||||
background-color: #2d2d2d;
|
||||
color: #ffffff;
|
||||
}
|
||||
QTableView::item:selected {
|
||||
background-color: #0078d7;
|
||||
color: #ffffff;
|
||||
}
|
||||
QTableView::item:alternate {
|
||||
background-color: #3a3a3a;
|
||||
}
|
||||
)").arg(sColor_Blue));
|
||||
}
|
||||
|
||||
void setJsonObject(const nlohmann::json& json) {
|
||||
m_tableWidget->setRowCount(0);
|
||||
m_tableModel->setRowCount(0);
|
||||
m_originalJson = json; // 保存原始JSON
|
||||
m_originalTypes.clear(); // 清空原始类型映射
|
||||
m_editorWidgets.clear();
|
||||
|
||||
if (!json.is_object()) return;
|
||||
|
||||
int row = 0;
|
||||
for (auto it = json.begin(); it != json.end(); ++it) {
|
||||
int row = m_tableWidget->rowCount();
|
||||
m_tableWidget->insertRow(row);
|
||||
m_tableModel->insertRow(row);
|
||||
|
||||
const std::string& key = it.key();
|
||||
const nlohmann::json& value = it.value();
|
||||
|
||||
|
||||
//// 设置行号(不可编辑)
|
||||
//QStandardItem* rowItem = new QStandardItem(QString::number(row + 1));
|
||||
//rowItem->setEditable(false);
|
||||
//rowItem->setBackground(QColor(60, 60, 60));
|
||||
//rowItem->setForeground(QColor(255, 255, 255));
|
||||
//m_tableModel->setItem(row, 0, rowItem);
|
||||
|
||||
// 设置键名(不可编辑)
|
||||
QTableWidgetItem* keyItem = new QTableWidgetItem(QString::fromStdString(key));
|
||||
keyItem->setFlags(keyItem->flags() & ~Qt::ItemIsEditable);
|
||||
keyItem->setBackground(QColor(80, 80, 80));
|
||||
m_tableWidget->setItem(row, 0, keyItem);
|
||||
QStandardItem* keyItem = new QStandardItem(QString::fromStdString(key));
|
||||
keyItem->setEditable(false);
|
||||
keyItem->setBackground(QColor(60, 60, 60));
|
||||
keyItem->setForeground(QColor(255, 255, 255));
|
||||
m_tableModel->setItem(row, 0, keyItem);
|
||||
|
||||
// 确定类型(内部使用,不显示)
|
||||
JsonValueType valueType = getJsonValueType(value);
|
||||
m_originalTypes[key] = valueType;
|
||||
|
||||
// 设置值(可编辑,但需要类型验证)
|
||||
QString valueText = formatValueForDisplay(value, valueType);
|
||||
QTableWidgetItem* valueItem = new QTableWidgetItem(valueText);
|
||||
valueItem->setToolTip(generateTypeHint(valueType));
|
||||
m_tableWidget->setItem(row, 1, valueItem);
|
||||
////为所有类型都创建数据项
|
||||
//QString valueText = formatValueForDisplay(value, valueType);
|
||||
//QStandardItem* valueItem = new QStandardItem(valueText);
|
||||
//valueItem->setToolTip(generateTypeHint(valueType));
|
||||
//valueItem->setBackground(QColor(60, 60, 60));
|
||||
//valueItem->setForeground(QColor(255, 255, 255));
|
||||
//m_tableModel->setItem(row, 1, valueItem);
|
||||
|
||||
//为特定类型创建专用编辑器控件
|
||||
QWidget* editorWidget = createEditorWidget(value, valueType);
|
||||
if (editorWidget) {
|
||||
m_tableView->setIndexWidget(m_tableModel->index(row, 1), editorWidget);
|
||||
m_editorWidgets[key] = editorWidget;
|
||||
}
|
||||
else {
|
||||
// 默认为文本显示
|
||||
QString valueText= formatValueForDisplay(value, valueType);
|
||||
QStandardItem* valueItem = new QStandardItem(valueText);
|
||||
valueItem->setToolTip(generateTypeHint(valueType));
|
||||
m_tableModel->setItem(row, 1, valueItem);
|
||||
}
|
||||
row++;
|
||||
}
|
||||
m_tableWidget->resizeColumnsToContents();
|
||||
}
|
||||
|
||||
signals:
|
||||
@@ -122,24 +168,20 @@ private slots:
|
||||
void onAccept() {
|
||||
nlohmann::json result = nlohmann::json::object();
|
||||
|
||||
for (int row = 0; row < m_tableWidget->rowCount(); ++row) {
|
||||
auto* keyItem = m_tableWidget->item(row, 0);
|
||||
auto* valItem = m_tableWidget->item(row, 1);
|
||||
|
||||
if (!keyItem || !valItem) {
|
||||
for (int row = 0; row < m_tableModel->rowCount(); ++row) {
|
||||
QStandardItem* keyItem = m_tableModel->item(row, 0);
|
||||
if (!keyItem) {
|
||||
QMessageBox::warning(this, "错误", QString("第 %1 行数据不完整").arg(row + 1));
|
||||
return;
|
||||
}
|
||||
|
||||
QString key = keyItem->text().trimmed();
|
||||
QString valStr = valItem->text().trimmed();
|
||||
|
||||
if (key.isEmpty()) {
|
||||
QMessageBox::warning(this, "错误", QString("第 %1 行 key 为空").arg(row + 1));
|
||||
return;
|
||||
}
|
||||
|
||||
// 获取原始类型
|
||||
//获取原始类型
|
||||
std::string keyStd = key.toStdString();
|
||||
if (m_originalTypes.find(keyStd) == m_originalTypes.end()) {
|
||||
QMessageBox::warning(this, "错误", QString("第 %1 行找不到原始类型信息").arg(row + 1));
|
||||
@@ -148,26 +190,160 @@ private slots:
|
||||
|
||||
JsonValueType expectedType = m_originalTypes[keyStd];
|
||||
|
||||
// 验证并转换值
|
||||
//从编辑器获取值
|
||||
nlohmann::json convertedValue;
|
||||
QString errorMsg;
|
||||
if (!validateAndConvertValue(valStr, expectedType, convertedValue, errorMsg)) {
|
||||
QMessageBox::critical(this, "类型验证失败",
|
||||
QString("第 %1 行值验证失败:\n%2").arg(row + 1).arg(errorMsg));
|
||||
if (!getValueFromEditor(keyStd, expectedType, convertedValue, errorMsg)) {
|
||||
QMessageBox::critical(this, "类型验证失败",QString("第 %1 行值验证失败:\n%2").arg(row + 1).arg(errorMsg));
|
||||
return;
|
||||
}
|
||||
|
||||
result[keyStd] = convertedValue;
|
||||
}
|
||||
|
||||
qDebug() << "Result JSON: " << QString::fromStdString(result.dump(4));
|
||||
|
||||
emit jsonAccepted(result);
|
||||
accept();
|
||||
}
|
||||
|
||||
private:
|
||||
QTableWidget* m_tableWidget;
|
||||
QTableView* m_tableView;
|
||||
QStandardItemModel* m_tableModel;
|
||||
nlohmann::json m_originalJson; // 保存原始JSON以便类型检查
|
||||
std::map<std::string, JsonValueType> m_originalTypes; // 保存每个键的原始类型
|
||||
std::map<std::string, JsonValueType> m_originalTypes;// 保存每个键的原始类型
|
||||
std::map<std::string, QWidget*> m_editorWidgets;// 保存每个键对应的编辑器控件
|
||||
|
||||
// 根据类型创建不同的编辑器控件
|
||||
QWidget* createEditorWidget(const nlohmann::json& value, JsonValueType type) {
|
||||
switch (type) {
|
||||
case JsonValueType::Boolean: {
|
||||
CircularSwitch* switchBtn = new CircularSwitch();
|
||||
switchBtn->setChecked(value.get<bool>());
|
||||
switchBtn->setToolTip(generateTypeHint(type));
|
||||
return switchBtn;
|
||||
}
|
||||
case JsonValueType::Number: {
|
||||
QDoubleSpinBox* spinBox = new QDoubleSpinBox();
|
||||
spinBox->setRange(-1e18, 1e18);
|
||||
spinBox->setDecimals(3);//显示小位数
|
||||
|
||||
if (value.is_number_integer()) {
|
||||
spinBox->setValue(value.get<int64_t>());
|
||||
spinBox->setDecimals(0);
|
||||
}
|
||||
else {
|
||||
spinBox->setValue(value.get<double>());
|
||||
}
|
||||
|
||||
spinBox->setToolTip(generateTypeHint(type));
|
||||
return spinBox;
|
||||
}
|
||||
case JsonValueType::String: {
|
||||
QLineEdit* lineEdit = new QLineEdit();
|
||||
lineEdit->setText(QString::fromStdString(value.get<std::string>()));
|
||||
lineEdit->setToolTip(generateTypeHint(type));
|
||||
return lineEdit;
|
||||
}
|
||||
// 其他类型仍使用文本显示
|
||||
default:
|
||||
return nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
bool getValueFromEditor(const std::string& key, JsonValueType expectedType, nlohmann::json& result, QString& errorMsg) {
|
||||
auto it = m_editorWidgets.find(key);
|
||||
|
||||
try {
|
||||
if (it != m_editorWidgets.end()) {
|
||||
// 有专用编辑器控件
|
||||
QWidget* widget = it->second;
|
||||
switch (expectedType) {
|
||||
case JsonValueType::Boolean: {
|
||||
CircularSwitch* switchBtn = qobject_cast<CircularSwitch*>(widget);
|
||||
if (switchBtn) {
|
||||
bool value = switchBtn->isChecked();
|
||||
result = value;
|
||||
// 更新模型数据
|
||||
updateModelData(key, value ? "true" : "false");
|
||||
return true;
|
||||
}
|
||||
errorMsg = "布尔值控件类型错误";
|
||||
return false;
|
||||
}
|
||||
case JsonValueType::Number: {
|
||||
QDoubleSpinBox* spinBox = qobject_cast<QDoubleSpinBox*>(widget);
|
||||
if (spinBox) {
|
||||
double value = spinBox->value();
|
||||
// 检查是否为整数
|
||||
if (spinBox->decimals() == 0 && value == floor(value)) {
|
||||
result = static_cast<int64_t>(value);
|
||||
updateModelData(key, QString::number(static_cast<int64_t>(value)));
|
||||
}
|
||||
else {
|
||||
result = value;
|
||||
updateModelData(key, QString::number(value));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
errorMsg = "数字控件类型错误";
|
||||
return false;
|
||||
}
|
||||
case JsonValueType::String: {
|
||||
QLineEdit* lineEdit = qobject_cast<QLineEdit*>(widget);
|
||||
if (lineEdit) {
|
||||
QString value = lineEdit->text().trimmed();
|
||||
result = value.toStdString();
|
||||
updateModelData(key, value);
|
||||
return true;
|
||||
}
|
||||
errorMsg = "字符串控件类型错误";
|
||||
return false;
|
||||
}
|
||||
default:
|
||||
// 其他类型使用默认文本处理
|
||||
return validateAndConvertValue(getTextFromCell(key), expectedType, result, errorMsg);
|
||||
}
|
||||
}
|
||||
else {
|
||||
// 没有专用编辑器控件,使用默认文本处理
|
||||
return validateAndConvertValue(getTextFromCell(key), expectedType, result, errorMsg);
|
||||
}
|
||||
}
|
||||
catch (const std::exception& e) {
|
||||
errorMsg = QString("获取值错误: %1").arg(e.what());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// 更新模型中的数据项
|
||||
void updateModelData(const std::string& key, const QString& value) {
|
||||
for (int row = 0; row < m_tableModel->rowCount(); ++row) {
|
||||
QStandardItem* keyItem = m_tableModel->item(row, 0);
|
||||
if (keyItem && keyItem->text().toStdString() == key) {
|
||||
QStandardItem* valueItem = m_tableModel->item(row, 1);
|
||||
if (valueItem) {
|
||||
valueItem->setText(value);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 从单元格获取文本值(用于没有专用编辑器的类型)
|
||||
QString getTextFromCell(const std::string& key) {
|
||||
//查找键对应的行
|
||||
for (int row = 0; row < m_tableModel->rowCount(); ++row) {
|
||||
QStandardItem* keyItem = m_tableModel->item(row, 0);
|
||||
if (keyItem && keyItem->text().toStdString() == key) {
|
||||
QStandardItem* valueItem = m_tableModel->item(row, 1);
|
||||
if (valueItem) {
|
||||
return valueItem->text();
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
// 获取JSON值的类型
|
||||
JsonValueType getJsonValueType(const nlohmann::json& value) {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#include <qwidget.h>
|
||||
#include <qwidget.h>
|
||||
#include <qlayout.h>
|
||||
#include <qlabel.h>
|
||||
#include <qpushbutton.h>
|
||||
@@ -74,7 +74,7 @@ public:
|
||||
// 通用的创建工具按钮函数实现
|
||||
bool createToolButton(const QString& iconPath, const QString& text,
|
||||
std::function<void()> clickHandler,
|
||||
const QSize& buttonSize = QSize(60, 60), const QSize& iconSize = QSize(30, 30)){
|
||||
const QSize& buttonSize = QSize(100, 60), const QSize& iconSize = QSize(32, 32)){
|
||||
|
||||
// 参数验证
|
||||
if (iconPath.isEmpty() || text.isEmpty() || !clickHandler) {
|
||||
@@ -105,10 +105,75 @@ public:
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
btn->setIcon(icon);
|
||||
btn->setText(text);
|
||||
btn->setIconSize(iconSize);
|
||||
btn->setFixedSize(buttonSize.width() + 20, buttonSize.height() + 20); // 增加高度以容纳文字
|
||||
btn->setFixedSize(buttonSize.width(), buttonSize.height()); // 增加高度以容纳文字
|
||||
btn->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); // 文字在图标下方
|
||||
|
||||
// 设置按钮样式
|
||||
btn->setStyleSheet(R"(
|
||||
QToolButton {
|
||||
background-color: transparent;
|
||||
border: none;
|
||||
color: white;
|
||||
font-family: "微软雅黑";
|
||||
font-size: 14px;
|
||||
font-weight: bold;
|
||||
}
|
||||
QToolButton:hover {
|
||||
background-color: black;
|
||||
border-radius: 5px;
|
||||
}
|
||||
)");
|
||||
|
||||
btnLayout->addWidget(btn);
|
||||
btnLayout->setAlignment(Qt::AlignCenter);
|
||||
|
||||
// 连接点击事件
|
||||
if (!connect(btn, &QToolButton::clicked, clickHandler)) {
|
||||
delete btn;
|
||||
delete btnLayout;
|
||||
return false;
|
||||
}
|
||||
|
||||
// 添加到按钮布局容器中
|
||||
buttonsLayout->addLayout(btnLayout);
|
||||
|
||||
return true;
|
||||
}
|
||||
bool createToolButton(QIcon icon, const QString& text,
|
||||
std::function<void()> clickHandler,
|
||||
const QSize& buttonSize = QSize(100, 60), const QSize& iconSize = QSize(32, 32)) {
|
||||
|
||||
// 参数验证
|
||||
if (text.isEmpty() || !clickHandler) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// 创建布局
|
||||
QVBoxLayout* btnLayout = new QVBoxLayout();
|
||||
if (!btnLayout) {
|
||||
return false;
|
||||
}
|
||||
|
||||
btnLayout->setSpacing(0);
|
||||
btnLayout->setContentsMargins(0, 0, 0, 0);
|
||||
|
||||
// 使用 QToolButton 来实现图标在上文字在下的效果
|
||||
QToolButton* btn = new QToolButton(this);
|
||||
if (!btn) {
|
||||
delete btnLayout;
|
||||
return false;
|
||||
}
|
||||
|
||||
// 设置图标,检查图标是否加载成功
|
||||
|
||||
btn->setIcon(icon);
|
||||
btn->setText(text);
|
||||
btn->setIconSize(iconSize);
|
||||
btn->setFixedSize(buttonSize.width(), buttonSize.height()); // 增加高度以容纳文字
|
||||
btn->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); // 文字在图标下方
|
||||
|
||||
// 设置按钮样式
|
||||
@@ -343,10 +408,10 @@ public:
|
||||
[=]() {
|
||||
config->Authorization.executeWithPermission(Auth::UserLevel::ADMIN,[this]() {
|
||||
JsonParamTableEditor* dlg = new JsonParamTableEditor(this);
|
||||
dlg->setJsonObject(m_config->settingJson["backend"]["algorithmSettings"]);
|
||||
dlg->setJsonObject(m_config->missionJson["backend"]["missionSettings"]);
|
||||
dlg->setAttribute(Qt::WA_DeleteOnClose);
|
||||
connect(dlg, &JsonParamTableEditor::jsonAccepted, [this](const nlohmann::json& result) {
|
||||
m_config->settingJson["backend"]["algorithmSettings"] = result;
|
||||
m_config->missionJson["backend"]["missionSettings"] = result;
|
||||
});
|
||||
dlg->show();
|
||||
});
|
||||
@@ -364,7 +429,20 @@ public:
|
||||
});
|
||||
}
|
||||
#pragma endregion
|
||||
|
||||
#pragma region 读取bin目录下的tools文件夹并展示
|
||||
{
|
||||
std::vector<std::string> files;
|
||||
fileManager::getAllFiles("./tools", files, "lnk");
|
||||
for (auto& lnkPath : files) {
|
||||
std::string fileName = fileManager::getFileName(lnkPath);
|
||||
auto exePath = getShortcutTarget(QString::fromLocal8Bit(lnkPath.c_str()));
|
||||
auto icon = getFileIcon(exePath, QSize(32, 32));
|
||||
_toolBarWidget->createToolButton(icon, QString::fromLocal8Bit(fileName.c_str()), [exePath]() {
|
||||
QProcess::startDetached(exePath);
|
||||
});
|
||||
}
|
||||
}
|
||||
#pragma endregion
|
||||
vLayout->addWidget(_toolBarWidget);
|
||||
|
||||
vLayout->addWidget(&_ImageWidgetManager);
|
||||
|
||||
@@ -0,0 +1,287 @@
|
||||
#ifndef CIRCULARSWITCH_H
|
||||
#define CIRCULARSWITCH_H
|
||||
|
||||
#include <QWidget>
|
||||
#include <QPainter>
|
||||
#include <QMouseEvent>
|
||||
#include <QPropertyAnimation>
|
||||
#include <QEasingCurve>
|
||||
#include <QTimer>
|
||||
|
||||
class CircularSwitch : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_PROPERTY(int knobPosition READ knobPosition WRITE setKnobPosition NOTIFY knobPositionChanged)
|
||||
Q_PROPERTY(QColor backgroundColor READ backgroundColor WRITE setBackgroundColor NOTIFY backgroundColorChanged)
|
||||
|
||||
public:
|
||||
explicit CircularSwitch(QWidget* parent = nullptr)
|
||||
: QWidget(parent)
|
||||
, m_checked(false)
|
||||
, m_knobPosition(0)
|
||||
, m_animationDuration(200)
|
||||
, m_onColor(QColor("#4CD964"))
|
||||
, m_offColor(QColor("#E5E5EA"))
|
||||
, m_knobColor(Qt::white)
|
||||
, m_borderColor(QColor("#CCCCCC"))
|
||||
, m_textColor(Qt::white)
|
||||
, m_knobDiameter(0)
|
||||
, m_padding(3)
|
||||
, m_borderWidth(1)
|
||||
, m_showText(true)
|
||||
, m_trueText("true")
|
||||
, m_falseText("false")
|
||||
{
|
||||
m_animation = new QPropertyAnimation(this, "knobPosition", this);
|
||||
m_animation->setEasingCurve(QEasingCurve::OutCubic);
|
||||
m_animation->setDuration(m_animationDuration);
|
||||
|
||||
setFixedSize(70, 34); // 稍微加宽以容纳文字
|
||||
setCursor(Qt::PointingHandCursor);
|
||||
updateKnobGeometry();
|
||||
}
|
||||
|
||||
// 获取和设置开关状态
|
||||
bool isChecked() const { return m_checked; }
|
||||
|
||||
void setChecked(bool checked) {
|
||||
if (m_checked == checked) return;
|
||||
|
||||
m_checked = checked;
|
||||
update();
|
||||
|
||||
// 启动动画
|
||||
m_animation->stop();
|
||||
m_animation->setStartValue(m_knobPosition);
|
||||
m_animation->setEndValue(checked ? width() - m_knobDiameter - m_padding : m_padding);
|
||||
m_animation->start();
|
||||
|
||||
// 延迟发射信号,让动画先执行
|
||||
QTimer::singleShot(10, this, [this, checked]() {
|
||||
emit toggled(checked);
|
||||
});
|
||||
}
|
||||
|
||||
// 颜色设置
|
||||
QColor onColor() const { return m_onColor; }
|
||||
void setOnColor(const QColor& color) {
|
||||
m_onColor = color;
|
||||
update();
|
||||
}
|
||||
|
||||
QColor offColor() const { return m_offColor; }
|
||||
void setOffColor(const QColor& color) {
|
||||
m_offColor = color;
|
||||
update();
|
||||
}
|
||||
|
||||
QColor knobColor() const { return m_knobColor; }
|
||||
void setKnobColor(const QColor& color) {
|
||||
m_knobColor = color;
|
||||
update();
|
||||
}
|
||||
|
||||
QColor borderColor() const { return m_borderColor; }
|
||||
void setBorderColor(const QColor& color) {
|
||||
m_borderColor = color;
|
||||
update();
|
||||
}
|
||||
|
||||
QColor textColor() const { return m_textColor; }
|
||||
void setTextColor(const QColor& color) {
|
||||
m_textColor = color;
|
||||
update();
|
||||
}
|
||||
|
||||
QColor backgroundColor() const {
|
||||
return m_checked ? m_onColor : m_offColor;
|
||||
}
|
||||
|
||||
void setBackgroundColor(const QColor& color) {
|
||||
if (m_checked) {
|
||||
m_onColor = color;
|
||||
}
|
||||
else {
|
||||
m_offColor = color;
|
||||
}
|
||||
update();
|
||||
}
|
||||
|
||||
// 动画设置
|
||||
int animationDuration() const { return m_animationDuration; }
|
||||
void setAnimationDuration(int duration) {
|
||||
m_animationDuration = duration;
|
||||
m_animation->setDuration(duration);
|
||||
}
|
||||
|
||||
// 边框设置
|
||||
int borderWidth() const { return m_borderWidth; }
|
||||
void setBorderWidth(int width) {
|
||||
m_borderWidth = width;
|
||||
update();
|
||||
}
|
||||
|
||||
// 文字设置
|
||||
bool showText() const { return m_showText; }
|
||||
void setShowText(bool show) {
|
||||
m_showText = show;
|
||||
update();
|
||||
}
|
||||
|
||||
QString trueText() const { return m_trueText; }
|
||||
void setTrueText(const QString& text) {
|
||||
m_trueText = text;
|
||||
update();
|
||||
}
|
||||
|
||||
QString falseText() const { return m_falseText; }
|
||||
void setFalseText(const QString& text) {
|
||||
m_falseText = text;
|
||||
update();
|
||||
}
|
||||
|
||||
protected:
|
||||
void paintEvent(QPaintEvent* event) override {
|
||||
Q_UNUSED(event)
|
||||
|
||||
QPainter painter(this);
|
||||
painter.setRenderHint(QPainter::Antialiasing);
|
||||
|
||||
// 绘制背景
|
||||
QRect backgroundRect = rect().adjusted(m_padding, m_padding, -m_padding, -m_padding);
|
||||
QPainterPath backgroundPath;
|
||||
backgroundPath.addRoundedRect(backgroundRect, backgroundRect.height() / 2, backgroundRect.height() / 2);
|
||||
|
||||
// 绘制边框
|
||||
if (m_borderWidth > 0) {
|
||||
painter.setPen(QPen(m_borderColor, m_borderWidth));
|
||||
painter.setBrush(Qt::NoBrush);
|
||||
painter.drawPath(backgroundPath);
|
||||
}
|
||||
|
||||
// 绘制填充背景
|
||||
painter.setPen(Qt::NoPen);
|
||||
painter.setBrush(m_checked ? m_onColor : m_offColor);
|
||||
painter.drawPath(backgroundPath);
|
||||
|
||||
// 绘制背景文字
|
||||
if (m_showText) {
|
||||
painter.setPen(m_textColor);
|
||||
QFont font = painter.font();
|
||||
font.setPointSize(8);
|
||||
font.setBold(true);
|
||||
painter.setFont(font);
|
||||
|
||||
// 计算文字位置
|
||||
QRect textRect = backgroundRect;
|
||||
|
||||
if (m_checked) {
|
||||
// 打开状态,文字在左侧
|
||||
textRect.setRight(width() / 2);
|
||||
painter.drawText(textRect, Qt::AlignCenter, m_trueText);
|
||||
}
|
||||
else {
|
||||
// 关闭状态,文字在右侧
|
||||
textRect.setLeft(width() / 2);
|
||||
painter.drawText(textRect, Qt::AlignCenter, m_falseText);
|
||||
}
|
||||
}
|
||||
|
||||
// 绘制滑块
|
||||
int knobY = height() / 2;
|
||||
QRect knobRect(m_knobPosition, knobY - m_knobDiameter / 2,
|
||||
m_knobDiameter, m_knobDiameter);
|
||||
|
||||
QPainterPath knobPath;
|
||||
knobPath.addEllipse(knobRect);
|
||||
|
||||
// 滑块阴影效果
|
||||
QRadialGradient gradient(knobRect.center(), m_knobDiameter / 2);
|
||||
gradient.setColorAt(0, m_knobColor.lighter(110));
|
||||
gradient.setColorAt(1, m_knobColor);
|
||||
|
||||
painter.setPen(QPen(m_borderColor, 1));
|
||||
painter.setBrush(gradient);
|
||||
painter.drawPath(knobPath);
|
||||
|
||||
// 滑块内阴影效果
|
||||
if (m_checked) {
|
||||
QRect innerKnobRect = knobRect.adjusted(3, 3, -3, -3);
|
||||
QPainterPath innerKnobPath;
|
||||
innerKnobPath.addEllipse(innerKnobRect);
|
||||
|
||||
QRadialGradient innerGradient(innerKnobRect.center(), innerKnobRect.width() / 2);
|
||||
innerGradient.setColorAt(0, QColor(255, 255, 255, 100));
|
||||
innerGradient.setColorAt(1, QColor(255, 255, 255, 0));
|
||||
|
||||
painter.setPen(Qt::NoPen);
|
||||
painter.setBrush(innerGradient);
|
||||
painter.drawPath(innerKnobPath);
|
||||
}
|
||||
}
|
||||
|
||||
void mousePressEvent(QMouseEvent* event) override {
|
||||
if (event->button() == Qt::LeftButton) {
|
||||
event->accept();
|
||||
setChecked(!m_checked);
|
||||
}
|
||||
else {
|
||||
event->ignore();
|
||||
}
|
||||
}
|
||||
|
||||
void resizeEvent(QResizeEvent* event) override {
|
||||
Q_UNUSED(event)
|
||||
updateKnobGeometry();
|
||||
// 更新滑块位置
|
||||
setKnobPosition(m_checked ? width() - m_knobDiameter - m_padding : m_padding);
|
||||
}
|
||||
|
||||
private:
|
||||
int knobPosition() const { return m_knobPosition; }
|
||||
|
||||
void setKnobPosition(int position) {
|
||||
if (m_knobPosition != position) {
|
||||
m_knobPosition = position;
|
||||
update();
|
||||
emit knobPositionChanged(position);
|
||||
}
|
||||
}
|
||||
|
||||
void updateKnobGeometry() {
|
||||
m_knobDiameter = height() - 2 * m_padding - 2 * m_borderWidth;
|
||||
// 确保滑块是圆形
|
||||
if (m_knobDiameter > width() / 2 - m_padding) {
|
||||
m_knobDiameter = width() / 2 - m_padding;
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
bool m_checked;
|
||||
int m_knobPosition;
|
||||
int m_animationDuration;
|
||||
|
||||
QColor m_onColor;
|
||||
QColor m_offColor;
|
||||
QColor m_knobColor;
|
||||
QColor m_borderColor;
|
||||
QColor m_textColor;
|
||||
|
||||
QPropertyAnimation* m_animation;
|
||||
|
||||
int m_knobDiameter;
|
||||
int m_padding;
|
||||
int m_borderWidth;
|
||||
|
||||
// 文字相关属性
|
||||
bool m_showText;
|
||||
QString m_trueText;
|
||||
QString m_falseText;
|
||||
|
||||
signals:
|
||||
void toggled(bool checked);
|
||||
void knobPositionChanged(int position);
|
||||
void backgroundColorChanged(const QColor& color);
|
||||
};
|
||||
|
||||
#endif // CIRCULARSWITCH_H
|
||||
@@ -1,4 +1,4 @@
|
||||
#pragma once
|
||||
#pragma once
|
||||
#include <QApplication>
|
||||
#include <QWidget>
|
||||
#include <QVBoxLayout>
|
||||
@@ -12,6 +12,7 @@
|
||||
#include <opencv.hpp>
|
||||
#include <QMenu>
|
||||
#include <QAction>
|
||||
#include <QTimer>
|
||||
#include <qmessagebox.h>
|
||||
#include <qmutex.h>
|
||||
#include <uiModule/components/fancyButton.h>
|
||||
@@ -302,6 +303,18 @@ class ImageWidget : public QWidget {
|
||||
public:
|
||||
QComboBox switchBox;
|
||||
QMutex switchViewerMutex;
|
||||
|
||||
//缩放状态相关
|
||||
QPushButton* zoombtn;
|
||||
bool isZoomed = false;
|
||||
QSize originalSize;
|
||||
QPoint originalPosition;
|
||||
QGridLayout* parentGridLayout = nullptr;
|
||||
int originalRow = -1;
|
||||
int originalColumn = -1;
|
||||
int originalRowSpan = 1;
|
||||
int originalColumnSpan = 1;
|
||||
|
||||
ImageWidget(QWidget* parent = nullptr) : QWidget(parent) {
|
||||
qRegisterMetaType<cv::Mat>("cv::Mat");
|
||||
QVBoxLayout* layout = new QVBoxLayout(this);
|
||||
@@ -324,6 +337,28 @@ public:
|
||||
/* auto spaceItem = new QSpacerItem(100, 1);
|
||||
hLayout->addSpacerItem(spaceItem);*/
|
||||
|
||||
zoombtn = new QPushButton();
|
||||
zoombtn->setFixedSize(16, 16);
|
||||
zoombtn
|
||||
->setStyleSheet(
|
||||
R"(
|
||||
QPushButton {
|
||||
background-color: rgba(0, 0, 0, 0.5);
|
||||
border: 1px solid rgba(255, 255, 255, 0.3);
|
||||
border-radius: 3px;
|
||||
}
|
||||
QPushButton:hover {
|
||||
background-color: rgba(0, 0, 0, 0.7);
|
||||
border: 1px solid rgba(255, 255, 255, 0.5);
|
||||
}
|
||||
)"
|
||||
);
|
||||
zoombtn->setIcon(QPixmap(":icon/icon/fullscreen.png"));
|
||||
zoombtn->setToolTip("放大窗口");
|
||||
hLayout->addWidget(zoombtn);
|
||||
connect(zoombtn, &QPushButton::clicked, this, &ImageWidget::toggleZoom);
|
||||
|
||||
|
||||
label = new QLabel(u8"相机标签");
|
||||
label->setAlignment(Qt::AlignLeft);
|
||||
label->setFont(font);
|
||||
@@ -387,6 +422,32 @@ public:
|
||||
map.insert(name, QPixmap());
|
||||
switchBox.addItem(name);
|
||||
}
|
||||
|
||||
//设置父网格布局和位置信息
|
||||
void setParentGridLayout(QGridLayout* gridLayout, int row, int column, int rowSpan, int columnSpan) {
|
||||
parentGridLayout = gridLayout;
|
||||
originalRow = row;
|
||||
originalColumn = column;
|
||||
originalRowSpan = rowSpan;
|
||||
originalColumnSpan = columnSpan;
|
||||
originalSize = this->size();
|
||||
|
||||
}
|
||||
|
||||
void updateZoomButtonVisibility() {
|
||||
if (parentGridLayout) {
|
||||
int rowCount = parentGridLayout->rowCount();
|
||||
int columnCount = parentGridLayout->columnCount();
|
||||
|
||||
if (rowCount < 3 && columnCount < 3) {
|
||||
zoombtn->hide();
|
||||
}
|
||||
else {
|
||||
zoombtn->show();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public slots:
|
||||
//combobox切换槽
|
||||
void switchViewType(QString name)
|
||||
@@ -455,6 +516,71 @@ public slots:
|
||||
viewer->setImg(px);
|
||||
}
|
||||
}
|
||||
|
||||
//缩放
|
||||
void toggleZoom() {
|
||||
if (!parentGridLayout) return;
|
||||
|
||||
if (!isZoomed) {
|
||||
zoomIn();// 放大
|
||||
}
|
||||
else {
|
||||
zoomOut();//缩小
|
||||
}
|
||||
}
|
||||
// 放大窗口
|
||||
void zoomIn() {
|
||||
if (isZoomed) return;
|
||||
if (!parentGridLayout) return;
|
||||
|
||||
// 保存原始状态
|
||||
originalSize = this->size();
|
||||
|
||||
// 在网格布局中重新放置,占据更多空间
|
||||
parentGridLayout->removeWidget(this);
|
||||
|
||||
//计算父布局的总行数和总列数
|
||||
int maxRowSpan = parentGridLayout->rowCount();// 父布局总行数
|
||||
int maxColSpan = parentGridLayout->columnCount();// 父布局总列数
|
||||
//放大后的跨度
|
||||
int zoomColSize = maxColSpan - 1;
|
||||
int zoomRowSize = maxRowSpan - 1;
|
||||
if (originalRow >= zoomRowSize -1 || originalColumn >= zoomColSize -1) {
|
||||
int x = qMax(0, originalRow - (zoomRowSize - 1));
|
||||
int y = qMax(0, originalColumn - (zoomColSize - 1));
|
||||
parentGridLayout->addWidget(this, x, y, zoomRowSize, zoomColSize);
|
||||
}
|
||||
else{
|
||||
parentGridLayout->addWidget(this, originalRow, originalColumn, zoomRowSize, zoomColSize);
|
||||
}
|
||||
|
||||
this->raise();
|
||||
// 更新按钮状态
|
||||
isZoomed = true;
|
||||
zoombtn->setIcon(QIcon(":/icon/icon/fullscreen-exit.png"));
|
||||
zoombtn->setToolTip("缩小窗口");
|
||||
|
||||
// 强制更新布局
|
||||
parentGridLayout->update();
|
||||
this->update();
|
||||
}
|
||||
// 缩小窗口
|
||||
void zoomOut() {
|
||||
if (!isZoomed) return;
|
||||
|
||||
// 恢复原始布局位置
|
||||
parentGridLayout->removeWidget(this);
|
||||
parentGridLayout->addWidget(this, originalRow, originalColumn, originalRowSpan, originalColumnSpan);
|
||||
|
||||
//更新按钮状态
|
||||
isZoomed = false;
|
||||
zoombtn->setIcon(QIcon(":/icon/icon/fullscreen.png"));
|
||||
zoombtn->setToolTip("放大窗口");
|
||||
|
||||
//强制更新布局
|
||||
parentGridLayout->update();
|
||||
this->update();
|
||||
}
|
||||
protected:
|
||||
void wheelEvent(QWheelEvent* event) override {
|
||||
if (event->modifiers() & Qt::ControlModifier) {
|
||||
@@ -547,20 +673,35 @@ public:
|
||||
ImageWidgetList.push_back(ImageView);
|
||||
map.insert({ windowName,ImageView });
|
||||
ImageView->setTitle(windowName);
|
||||
if (xPos <= 0 || yPos <= 0)
|
||||
if (xPos < 0 || yPos < 0){
|
||||
Layout->addWidget(ImageView);
|
||||
else
|
||||
}
|
||||
else {
|
||||
// 指定位置布局
|
||||
Layout->addWidget(ImageView, yPos, xPos);
|
||||
ImageView ->setParentGridLayout(Layout, yPos, xPos, 1, 1);
|
||||
}
|
||||
|
||||
for (auto& viewer : viewers)
|
||||
ImageView->createViewer(QString::fromStdString(viewer));
|
||||
|
||||
return ImageView;
|
||||
}
|
||||
|
||||
void updateAllZoomButtonsVisibility() {
|
||||
for (auto* widget : ImageWidgetList) {
|
||||
widget->updateZoomButtonVisibility();
|
||||
}
|
||||
}
|
||||
|
||||
QGridLayout* Layout = new QGridLayout();
|
||||
ImageWidgetManager()
|
||||
{
|
||||
this->setLayout(Layout);
|
||||
Layout->setContentsMargins(0, 0, 0, 0);
|
||||
// 设置布局属性,允许窗口缩放
|
||||
/*Layout->setColumnStretch(0, 1);
|
||||
Layout->setColumnStretch(1, 1);
|
||||
Layout->setColumnStretch(2, 1);*/
|
||||
}
|
||||
~ImageWidgetManager()
|
||||
{
|
||||
@@ -578,72 +719,47 @@ public:
|
||||
}
|
||||
void adjustImageWidget() {
|
||||
if (ImageWidgetList.isEmpty()) return;
|
||||
|
||||
// 清除现有布局中的所有部件
|
||||
QLayoutItem* item;
|
||||
while ((item = Layout->takeAt(0)) != nullptr) {
|
||||
if (item->widget()) {
|
||||
Layout->removeWidget(item->widget());
|
||||
}
|
||||
delete item;
|
||||
std::vector<std::vector<ImageWidget*>> vec(Layout->rowCount(), std::vector<ImageWidget*>(Layout->columnCount(),nullptr));
|
||||
for (auto& data : map) {
|
||||
vec[data.second->originalRow][data.second->originalColumn] = data.second;
|
||||
}
|
||||
for (int row = 0; row < vec.size(); row++) {
|
||||
for (int col = 0; col < vec[row].size(); col++) {
|
||||
if (vec[row][col] == nullptr) {
|
||||
if (col > 0) {
|
||||
if (vec[row][col - 1] != nullptr) {
|
||||
|
||||
int total = ImageWidgetList.size();
|
||||
|
||||
// 计算最佳的网格布局行列数
|
||||
int cols = static_cast<int>(std::ceil(std::sqrt(static_cast<double>(total))));
|
||||
int rows = static_cast<int>(std::ceil(static_cast<double>(total) / cols));
|
||||
|
||||
// 创建一个二维数组来跟踪布局占用情况
|
||||
QVector<QVector<bool>> occupied(rows, QVector<bool>(cols, false));
|
||||
QVector<QVector<QPoint>> widgetSpans(rows, QVector<QPoint>(cols, QPoint(1, 1)));
|
||||
|
||||
// 首先按基本网格放置部件
|
||||
int index = 0;
|
||||
for (int row = 0; row < rows && index < total; ++row) {
|
||||
for (int col = 0; col < cols && index < total; ++col) {
|
||||
Layout->addWidget(ImageWidgetList[index], row, col);
|
||||
occupied[row][col] = true;
|
||||
index++;
|
||||
}
|
||||
}
|
||||
|
||||
// 查找和填充空缺
|
||||
for (int row = 0; row < rows; ++row) {
|
||||
for (int col = 0; col < cols; ++col) {
|
||||
if (!occupied[row][col]) {
|
||||
// 优先检查左侧部件是否可以横向扩展
|
||||
if (col > 0 && occupied[row][col-1]) {
|
||||
int spanX = widgetSpans[row][col-1].x();
|
||||
int spanY = widgetSpans[row][col-1].y();
|
||||
QLayoutItem* item = Layout->itemAtPosition(row, col-1);
|
||||
if (item && item->widget()) {
|
||||
Layout->removeItem(item);
|
||||
Layout->addWidget(item->widget(), row, col-1, spanY, spanX + 1);
|
||||
widgetSpans[row][col-1].setX(spanX + 1);
|
||||
occupied[row][col] = true;
|
||||
vec[row][col - 1]->originalColumnSpan++;
|
||||
Layout->removeWidget(vec[row][col - 1]);
|
||||
Layout->addWidget(vec[row][col - 1],
|
||||
vec[row][col - 1]->originalRow,
|
||||
vec[row][col - 1]->originalColumn,
|
||||
vec[row][col - 1]->originalRowSpan,
|
||||
vec[row][col - 1]->originalColumnSpan);
|
||||
vec[row][col] = vec[row][col - 1];
|
||||
}
|
||||
}
|
||||
// 如果左侧扩展不可行,尝试上方部件是否可以纵向扩展
|
||||
else if (row > 0 && occupied[row-1][col]) {
|
||||
int spanX = widgetSpans[row-1][col].x();
|
||||
int spanY = widgetSpans[row-1][col].y();
|
||||
QLayoutItem* item = Layout->itemAtPosition(row-1, col);
|
||||
if (item && item->widget()) {
|
||||
Layout->removeItem(item);
|
||||
Layout->addWidget(item->widget(), row-1, col, spanY + 1, spanX);
|
||||
widgetSpans[row-1][col].setY(spanY + 1);
|
||||
occupied[row][col] = true;
|
||||
else if (col < vec[row].size() - 1) {
|
||||
if (vec[row][col + 1] != nullptr) {
|
||||
|
||||
vec[row][col + 1]->originalRow--;
|
||||
vec[row][col + 1]->originalColumnSpan++;
|
||||
Layout->removeWidget(vec[row][col + 1]);
|
||||
Layout->addWidget(vec[row][col + 1],
|
||||
vec[row][col + 1]->originalRow,
|
||||
vec[row][col + 1]->originalColumn,
|
||||
vec[row][col + 1]->originalRowSpan,
|
||||
vec[row][col + 1]->originalColumnSpan);
|
||||
vec[row][col] = vec[row][col + 1];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 更新布局
|
||||
Layout->update();
|
||||
updateAllZoomButtonsVisibility();
|
||||
}
|
||||
QGridLayout* Layout = new QGridLayout();
|
||||
private:
|
||||
QMutex mutex;
|
||||
QList< ImageWidget*>ImageWidgetList;
|
||||
|
||||
@@ -5,21 +5,21 @@ namespace fs = std::filesystem;
|
||||
void appConfig::parsingSettingJson()
|
||||
{
|
||||
fs::path appWorkPath = fs::current_path();
|
||||
originJson = readJsonFromPath(appWorkPath.string() + "/config/setting.json");
|
||||
jsonVersion = originJson["jsonVersion"];
|
||||
settingJson = readJsonFromPath(appWorkPath.string() + "/config/setting.json");
|
||||
jsonVersion = settingJson["jsonVersion"];
|
||||
if(jsonVersion != euiJsonVersion){
|
||||
std::cout << "Json version mismatch, please update the config file." << std::endl;
|
||||
std::cout << "Json版本不匹配,请检查json配置文件" << std::endl;
|
||||
exit(1);
|
||||
}
|
||||
objectSelect = originJson["objectSelect"];
|
||||
loginPassWord = originJson["loginPassWord"];
|
||||
objectSelect = settingJson["objectSelect"];
|
||||
loginPassWord = settingJson["loginPassWord"];
|
||||
|
||||
settingJson = readOrderedJsonFromPath(appWorkPath.string() + "/config/" + objectSelect +".json");
|
||||
softwareTile = settingJson["softwareTile"];
|
||||
imgSavePath = settingJson["backend"]["imgSaveBasePath"];
|
||||
missionJson = readOrderedJsonFromPath(appWorkPath.string() + "/config/" + objectSelect +".json");
|
||||
softwareTile = missionJson["softwareTile"];
|
||||
imgSavePath = missionJson["backend"]["imgSaveBasePath"];
|
||||
//viewer
|
||||
auto viewerData = settingJson["ImageView"];
|
||||
auto viewerData = missionJson["ImageView"];
|
||||
for (auto data = viewerData.begin(); data != viewerData.end(); data++)
|
||||
{
|
||||
viewerStruct v;
|
||||
@@ -29,6 +29,7 @@ void appConfig::parsingSettingJson()
|
||||
v.viewers.assign(data.value()["viewer"].begin(), data.value()["viewer"].end());
|
||||
viewDatas.push_back(v);
|
||||
}
|
||||
settingJsonPath = appWorkPath.string() + "/config/" + objectSelect + ".json";
|
||||
missionJsonPath = appWorkPath.string() + "/config/" + objectSelect + ".json";
|
||||
|
||||
//if(missionJson["backend"]["missionSettings"].at)
|
||||
}
|
||||
|
||||
@@ -31,14 +31,14 @@ public:
|
||||
}
|
||||
}
|
||||
void saveSettingJson() {
|
||||
saveJsonFromPath("./config/setting.json", originJson);
|
||||
saveOrderedJsonFromPath("./config/"+ objectSelect +".json", settingJson);
|
||||
saveJsonFromPath("./config/setting.json", settingJson);
|
||||
saveOrderedJsonFromPath("./config/"+ objectSelect +".json", missionJson);
|
||||
auto trans = &Translation::getInstance();
|
||||
trans->saveToFile("./config/translation.json");
|
||||
}
|
||||
|
||||
std::string settingJsonPath;
|
||||
nlohmann::ordered_json settingJson;
|
||||
std::string missionJsonPath;
|
||||
nlohmann::ordered_json missionJson;
|
||||
std::string imgSavePath;//原图存储路径
|
||||
HWND consoleHandle;
|
||||
SQLiteDB* dataBase = nullptr;
|
||||
@@ -47,7 +47,7 @@ public:
|
||||
|
||||
Auth::UserManager Authorization;
|
||||
private:
|
||||
nlohmann::json originJson;
|
||||
nlohmann::json settingJson;
|
||||
std::string jsonVersion;
|
||||
std::string objectSelect;
|
||||
std::string loginPassWord;
|
||||
|
||||
@@ -217,12 +217,12 @@ int main(int argc, char* argv[])
|
||||
_core.initDatabase(); // 初始化数据库
|
||||
QCoreApplication::addLibraryPath(QCoreApplication::applicationDirPath() + "/sqldrivers");
|
||||
QCoreApplication::addLibraryPath(QCoreApplication::applicationDirPath());
|
||||
MainWindow w(&config,&bridge, config.settingJson);
|
||||
MainWindow w(&config,&bridge, config.missionJson);
|
||||
connectSignalAndSlot(&_core, &w, &bridge); // 连接信号和槽
|
||||
w.show();
|
||||
QThread::msleep(100);
|
||||
// 创建后端对象
|
||||
_core._backEnd.loadCore(config.dataBase,&bridge, config.settingJson["backend"]); // 加载核心功能
|
||||
_core._backEnd.loadCore(config.dataBase,&bridge, config.missionJson["backend"]); // 加载核心功能
|
||||
#if HIDE_CONSOLE
|
||||
if (config.consoleHandle) {
|
||||
ShowWindow(config.consoleHandle, SW_HIDE);
|
||||
|
||||
@@ -26,8 +26,8 @@ public:
|
||||
// ([=](yh_581_address address, _581_Result resultData, std::shared_ptr <detData> data) {
|
||||
// _serviceManager->_triggerManager->writeShort("D" + address.resultAddr + "_1");//发送结果
|
||||
// });
|
||||
_station_1.init("Camera1","包膜后底托位置度检测相机12",20200,2,1, _params,_serviceManager,bridge, generalAlgoTest);
|
||||
_station_2.init("Camera2", "包膜后底托位置度检测相机13",20400,2,1,_params, _serviceManager, bridge, generalAlgoTest);
|
||||
_station_1.init("Camera1","包膜后底托位置度检测相机12",20200,2,1, &_params,_serviceManager,bridge, generalAlgoTest);
|
||||
_station_2.init("Camera2", "包膜后底托位置度检测相机13",20400,2,1,&_params, _serviceManager, bridge, generalAlgoTest);
|
||||
#pragma endregion
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -244,11 +244,11 @@ public:
|
||||
}
|
||||
bool initCustom() {
|
||||
#pragma region 注册触发器回调
|
||||
_station_1.init("Camera1","包膜前外观检测大面相机1(上大面)", 18000,2, 1, _baoMoHouDaMianDetParams,_serviceManager, bridge, ALGO_BaoMoHouDaMian);
|
||||
_station_2.init("Camera2", "包膜前外观检测大面相机2(下大面)", 18200,2, 1, _baoMoHouDaMianDetParams, _serviceManager,bridge, ALGO_BaoMoHouDaMian);
|
||||
_station_1.init("Camera1","包膜前外观检测大面相机1(上大面)", 18000,2, 1, &_baoMoHouDaMianDetParams,_serviceManager, bridge, ALGO_BaoMoHouDaMian);
|
||||
_station_2.init("Camera2", "包膜前外观检测大面相机2(下大面)", 18200,2, 1, &_baoMoHouDaMianDetParams, _serviceManager,bridge, ALGO_BaoMoHouDaMian);
|
||||
|
||||
_station_3.init("Camera3", "包膜前产品边缘检测大面相机3(下大面2)", 18400,2, 2, _detParams,_serviceManager,bridge, generalAlgoTest);
|
||||
_station_4.init("Camera4", "包膜前前产品边缘检测大面相机4(下大面2)", 18600 ,2, 2, _detParams, _serviceManager, bridge, generalAlgoTest);
|
||||
_station_3.init("Camera3", "包膜前产品边缘检测大面相机3(下大面2)", 18400,2, 2, &_detParams,_serviceManager,bridge, generalAlgoTest);
|
||||
_station_4.init("Camera4", "包膜前前产品边缘检测大面相机4(下大面2)", 18600 ,2, 2, &_detParams, _serviceManager, bridge, generalAlgoTest);
|
||||
#pragma endregion
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -131,7 +131,7 @@ static bool BaoMoHou_ShangDaMian(std::shared_ptr <detData> data, baoMoHouDaMianD
|
||||
}
|
||||
|
||||
data->resultImgs.push_back(Paint);
|
||||
data->service->_missionResultHandle->handleAllResult(data->SNcode, !defects.size() > 0, defects);
|
||||
data->service->_missionResultHandle->handleAllResult(data->SNcode, defects.size() == 0, defects);
|
||||
data->service->_triggerManager->writeFloat("D" + address.resultAddr + "_1");//发送OK
|
||||
return true;
|
||||
}
|
||||
@@ -331,16 +331,16 @@ public:
|
||||
// _serviceManager->_triggerManager->writeShort("D" + address.resultAddr + "_1");//发送结果
|
||||
// _serviceManager->_missionResultHandle->handleAllResult(data->SNcode, resultData.result, resultData.defects);
|
||||
// });
|
||||
_station_1.init("Camera1", "包膜后大面外观检测相机5(上大面1)",18800,2,1, _baoMoHouDaMianDetParams, _serviceManager,bridge, BaoMoHou_ShangDaMian);
|
||||
_station_3.init("Camera3", "包膜后大面外观检测相机7(上大面2)", 19200, 2, 1, _baoMoHouDaMianDetParams, _serviceManager, bridge, BaoMoHou_ShangDaMian);
|
||||
_station_1.init("Camera1", "包膜后大面外观检测相机5(上大面1)",18800,2,1, &_baoMoHouDaMianDetParams, _serviceManager,bridge, BaoMoHou_ShangDaMian);
|
||||
_station_3.init("Camera3", "包膜后大面外观检测相机7(上大面2)", 19200, 2, 1, &_baoMoHouDaMianDetParams, _serviceManager, bridge, BaoMoHou_ShangDaMian);
|
||||
|
||||
//baoMoHouXiaDaMianTrigger::resultHandleCallback resultCallback_BaoMoHouXiaDaMian =
|
||||
// ([=](yh_581_address address, _581_BaoMoResult resultData, std::shared_ptr <detData> data) {
|
||||
// _serviceManager->_triggerManager->writeShort("D" + address.resultAddr + "_1");//发送结果
|
||||
// _serviceManager->_missionResultHandle->handleAllResult(data->SNcode, resultData.result, resultData.defects);
|
||||
// });
|
||||
_station_2.init("Camera2", "包膜后大面外观检测相机6(下大面四角1)", 19000, 2, 1, _baoMoHouDaMianDetParams, _serviceManager, bridge, BaoMoHou_XiaDaMian);
|
||||
_station_4.init("Camera4", "包膜后大面外观检测相机8(下大面四角2)",19400,2,1, _baoMoHouDaMianDetParams, _serviceManager, bridge, BaoMoHou_XiaDaMian);
|
||||
_station_2.init("Camera2", "包膜后大面外观检测相机6(下大面四角1)", 19000, 2, 1, &_baoMoHouDaMianDetParams, _serviceManager, bridge, BaoMoHou_XiaDaMian);
|
||||
_station_4.init("Camera4", "包膜后大面外观检测相机8(下大面四角2)",19400,2,1, &_baoMoHouDaMianDetParams, _serviceManager, bridge, BaoMoHou_XiaDaMian);
|
||||
#pragma endregion
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -42,14 +42,14 @@ public:
|
||||
// ([=](yh_581_address address, _581_BaoMoResult, std::shared_ptr <detData>) {
|
||||
// _serviceManager->_triggerManager->writeShort("D" + address.resultAddr + "_1");//发送结果
|
||||
// });
|
||||
_station_1.init("Camera1","包膜后侧面贴胶错位检测相机9",19600,2,1,_baoMoHouDaMianDetParams,_serviceManager, bridge, ALGO_BaoMoHouCeMian);
|
||||
_station_2.init("Camera2", "包膜后侧面贴胶错位检测相机10",19800,2,1, _baoMoHouDaMianDetParams, _serviceManager, bridge, ALGO_BaoMoHouCeMian);
|
||||
_station_1.init("Camera1","包膜后侧面贴胶错位检测相机9",19600,2,1,&_baoMoHouDaMianDetParams,_serviceManager, bridge, ALGO_BaoMoHouCeMian);
|
||||
_station_2.init("Camera2", "包膜后侧面贴胶错位检测相机10",19800,2,1, &_baoMoHouDaMianDetParams, _serviceManager, bridge, ALGO_BaoMoHouCeMian);
|
||||
|
||||
//generalTrigger::resultHandleCallback resultCallback_general =
|
||||
// ([=](yh_581_address address, _581_Result, std::shared_ptr <detData>) {
|
||||
// _serviceManager->_triggerManager->writeShort("D" + address.resultAddr + "_1");//发送结果
|
||||
// });
|
||||
_station_3.init("Camera3", "包膜后外观检测大面相机11(下大面)",20000,2,1, _detParams, _serviceManager, bridge, generalAlgoTest);
|
||||
_station_3.init("Camera3", "包膜后外观检测大面相机11(下大面)",20000,2,1, &_detParams, _serviceManager, bridge, generalAlgoTest);
|
||||
#pragma endregion
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -37,19 +37,15 @@ public:
|
||||
}
|
||||
bool initCustom() {
|
||||
#pragma region 注册触发器回调
|
||||
//generalTrigger::resultHandleCallback resultCallback_general =
|
||||
// ([=](yh_581_address address, _581_Result, std::shared_ptr <detData>) {
|
||||
// _serviceManager->_triggerManager->writeShort("D" + address.resultAddr + "_1");//发送结果
|
||||
// });
|
||||
dgh_cb_yh_3d_1.init("Camera1", "长边预焊前3D-1", 18000,2,1, _params, _serviceManager, bridge, generalAlgoTest);
|
||||
dgh_cb_yh_3d_2.init("Camera2", "长边预焊前3D-2", 18200,2,1, _params, _serviceManager, bridge, generalAlgoTest);
|
||||
dgh_cb_yh_3d_3.init("Camera3", "长边预焊前3D-3", 18400,2,1, _params, _serviceManager, bridge, generalAlgoTest);
|
||||
dgh_cb_yh_3d_4.init("Camera4", "长边预焊前3D-4", 18600,2,1, _params, _serviceManager, bridge, generalAlgoTest);
|
||||
dgh_cb_yh_3d_1.init("Camera1", "长边预焊前3D-1", 18000,2,1, &_params, _serviceManager, bridge, generalAlgoTest);
|
||||
dgh_cb_yh_3d_2.init("Camera2", "长边预焊前3D-2", 18200,2,1, &_params, _serviceManager, bridge, generalAlgoTest);
|
||||
dgh_cb_yh_3d_3.init("Camera3", "长边预焊前3D-3", 18400,2,1, &_params, _serviceManager, bridge, generalAlgoTest);
|
||||
dgh_cb_yh_3d_4.init("Camera4", "长边预焊前3D-4", 18600,2,1, &_params, _serviceManager, bridge, generalAlgoTest);
|
||||
|
||||
dgh_cb_mh_3d_1.init("Camera5", "长边满焊前3D-1", 19600,2,1, _params, _serviceManager, bridge, generalAlgoTest);
|
||||
dgh_cb_mh_3d_2.init("Camera6", "长边满焊前3D-2", 19800,2,1, _params, _serviceManager, bridge, generalAlgoTest);
|
||||
dgh_cb_mh_3d_3.init("Camera7", "长边满焊前3D-3", 20000,2,1, _params, _serviceManager, bridge, generalAlgoTest);
|
||||
dgh_cb_mh_3d_4.init("Camera8", "长边满焊前3D-4", 20200,2,1, _params, _serviceManager, bridge, generalAlgoTest);
|
||||
dgh_cb_mh_3d_1.init("Camera5", "长边满焊前3D-1", 19600,2,1, &_params, _serviceManager, bridge, generalAlgoTest);
|
||||
dgh_cb_mh_3d_2.init("Camera6", "长边满焊前3D-2", 19800,2,1, &_params, _serviceManager, bridge, generalAlgoTest);
|
||||
dgh_cb_mh_3d_3.init("Camera7", "长边满焊前3D-3", 20000,2,1, &_params, _serviceManager, bridge, generalAlgoTest);
|
||||
dgh_cb_mh_3d_4.init("Camera8", "长边满焊前3D-4", 20200,2,1, &_params, _serviceManager, bridge, generalAlgoTest);
|
||||
#pragma endregion
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -39,20 +39,20 @@ public:
|
||||
// ([=](yh_581_address address, _581_Result, std::shared_ptr <detData>) {
|
||||
// _serviceManager->_triggerManager->writeShort("D" + address.resultAddr + "_1");//发送结果
|
||||
// });
|
||||
dgh_cb_mh_2d_1.init("Camera1", "长边满焊前2D-1",18800, 2,1, _params, _serviceManager, bridge, generalAlgoTest);
|
||||
dgh_cb_mh_2d_2.init("Camera2", "长边满焊前2D-2", 19000, 2,1, _params, _serviceManager, bridge, generalAlgoTest);
|
||||
dgh_cb_mh_2d_3.init("Camera3", "长边满焊前2D-3", 19200, 2,1, _params, _serviceManager, bridge, generalAlgoTest);
|
||||
dgh_cb_mh_2d_4.init("Camera4", "长边满焊前2D-4", 19400, 2,1, _params, _serviceManager, bridge, generalAlgoTest);
|
||||
dgh_cb_mh_2d_1.init("Camera1", "长边满焊前2D-1",18800, 2,1, &_params, _serviceManager, bridge, generalAlgoTest);
|
||||
dgh_cb_mh_2d_2.init("Camera2", "长边满焊前2D-2", 19000, 2,1, &_params, _serviceManager, bridge, generalAlgoTest);
|
||||
dgh_cb_mh_2d_3.init("Camera3", "长边满焊前2D-3", 19200, 2,1, &_params, _serviceManager, bridge, generalAlgoTest);
|
||||
dgh_cb_mh_2d_4.init("Camera4", "长边满焊前2D-4", 19400, 2,1, &_params, _serviceManager, bridge, generalAlgoTest);
|
||||
|
||||
dgh_cb_gy_2d_1.init("Camera5", "长边滚压后2D-1", 20400, 2,1, _params, _serviceManager, bridge, generalAlgoTest);
|
||||
dgh_cb_gy_2d_2.init("Camera6", "长边滚压后2D-2", 20600, 2,1, _params, _serviceManager, bridge, generalAlgoTest);
|
||||
dgh_cb_gy_2d_3.init("Camera7", "长边滚压后2D-3", 20800, 2,1, _params, _serviceManager, bridge, generalAlgoTest);
|
||||
dgh_cb_gy_2d_4.init("Camera8", "长边滚压后2D-4", 21000, 2,1, _params, _serviceManager, bridge, generalAlgoTest);
|
||||
dgh_cb_gy_2d_1.init("Camera5", "长边滚压后2D-1", 20400, 2,1, &_params, _serviceManager, bridge, generalAlgoTest);
|
||||
dgh_cb_gy_2d_2.init("Camera6", "长边滚压后2D-2", 20600, 2,1, &_params, _serviceManager, bridge, generalAlgoTest);
|
||||
dgh_cb_gy_2d_3.init("Camera7", "长边滚压后2D-3", 20800, 2,1, &_params, _serviceManager, bridge, generalAlgoTest);
|
||||
dgh_cb_gy_2d_4.init("Camera8", "长边滚压后2D-4", 21000, 2,1, &_params, _serviceManager, bridge, generalAlgoTest);
|
||||
|
||||
dgh_cb_gy_3d_1.init("Camera9", "长边滚压后3D-1", 21200, 2,1, _params, _serviceManager, bridge, generalAlgoTest);
|
||||
dgh_cb_gy_3d_2.init("Camera10", "长边滚压后3D-2", 21400, 2,1, _params, _serviceManager, bridge, generalAlgoTest);
|
||||
dgh_cb_gy_3d_3.init("Camera11", "长边滚压后3D-3", 21600, 2,1, _params, _serviceManager, bridge, generalAlgoTest);
|
||||
dgh_cb_gy_3d_4.init("Camera12", "长边滚压后3D-4", 21800, 2,1, _params, _serviceManager, bridge, generalAlgoTest);
|
||||
dgh_cb_gy_3d_1.init("Camera9", "长边滚压后3D-1", 21200, 2,1, &_params, _serviceManager, bridge, generalAlgoTest);
|
||||
dgh_cb_gy_3d_2.init("Camera10", "长边滚压后3D-2", 21400, 2,1, &_params, _serviceManager, bridge, generalAlgoTest);
|
||||
dgh_cb_gy_3d_3.init("Camera11", "长边滚压后3D-3", 21600, 2,1, &_params, _serviceManager, bridge, generalAlgoTest);
|
||||
dgh_cb_gy_3d_4.init("Camera12", "长边滚压后3D-4", 21800, 2,1, &_params, _serviceManager, bridge, generalAlgoTest);
|
||||
#pragma endregion
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -25,10 +25,10 @@ public:
|
||||
}
|
||||
bool initCustom() {
|
||||
#pragma region 注册触发器回调
|
||||
dgh_db_yh_3d_1.init("Camera1", "短边预焊前3D-1", 18000,4,1, _params, _serviceManager, bridge, generalAlgoTest);
|
||||
dgh_db_yh_3d_2.init("Camera2", "短边预焊前3D-2", 18200,4,1, _params, _serviceManager, bridge, generalAlgoTest);
|
||||
dgh_db_mh_3d_1.init("Camera3", "短边满焊前3D-1", 18800,4,1, _params, _serviceManager, bridge, generalAlgoTest);
|
||||
dgh_db_mh_3d_2.init("Camera4", "短边满焊前3D-2", 19000,4,1, _params, _serviceManager, bridge, generalAlgoTest);
|
||||
dgh_db_yh_3d_1.init("Camera1", "短边预焊前3D-1", 18000,4,1, &_params, _serviceManager, bridge, generalAlgoTest);
|
||||
dgh_db_yh_3d_2.init("Camera2", "短边预焊前3D-2", 18200,4,1, &_params, _serviceManager, bridge, generalAlgoTest);
|
||||
dgh_db_mh_3d_1.init("Camera3", "短边满焊前3D-1", 18800,4,1, &_params, _serviceManager, bridge, generalAlgoTest);
|
||||
dgh_db_mh_3d_2.init("Camera4", "短边满焊前3D-2", 19000,4,1, &_params, _serviceManager, bridge, generalAlgoTest);
|
||||
#pragma endregion
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -29,12 +29,12 @@ public:
|
||||
}
|
||||
bool initCustom(){
|
||||
#pragma region 注册触发器回调 满焊
|
||||
dgh_db_mh_2d_1.init("Camera1", "短边满焊前2D-1", 18400,4,1, _params, _serviceManager, bridge, generalAlgoTest);
|
||||
dgh_db_mh_2d_2.init("Camera2", "短边满焊前2D-2", 18600,4,1, _params, _serviceManager, bridge, generalAlgoTest);
|
||||
dgh_db_gy_2d_1.init("Camera3", "短边滚压后2D-1", 19200,4,1, _params, _serviceManager, bridge, generalAlgoTest);
|
||||
dgh_db_gy_2d_2.init("Camera4", "短边滚压后2D-2", 19400,4,1, _params, _serviceManager, bridge, generalAlgoTest);
|
||||
dgh_db_gy_3d_1.init("Camera5", "短边滚压后3D-1", 19600,4,1, _params, _serviceManager, bridge, generalAlgoTest);
|
||||
dgh_db_gy_3d_2.init("Camera6", "短边滚压后3D-2", 19800,4,1, _params, _serviceManager, bridge, generalAlgoTest);
|
||||
dgh_db_mh_2d_1.init("Camera1", "短边满焊前2D-1", 18400,4,1, &_params, _serviceManager, bridge, generalAlgoTest);
|
||||
dgh_db_mh_2d_2.init("Camera2", "短边满焊前2D-2", 18600,4,1, &_params, _serviceManager, bridge, generalAlgoTest);
|
||||
dgh_db_gy_2d_1.init("Camera3", "短边滚压后2D-1", 19200,4,1, &_params, _serviceManager, bridge, generalAlgoTest);
|
||||
dgh_db_gy_2d_2.init("Camera4", "短边滚压后2D-2", 19400,4,1, &_params, _serviceManager, bridge, generalAlgoTest);
|
||||
dgh_db_gy_3d_1.init("Camera5", "短边滚压后3D-1", 19600,4,1, &_params, _serviceManager, bridge, generalAlgoTest);
|
||||
dgh_db_gy_3d_2.init("Camera6", "短边滚压后3D-2", 19800,4,1, &_params, _serviceManager, bridge, generalAlgoTest);
|
||||
#pragma endregion
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
#include <hdevengine/HDevEngineCpp.h>
|
||||
#include <opencvPaintAlgo.hpp>
|
||||
using namespace HDevEngineCpp;
|
||||
static bool ShangDing(std::shared_ptr <detData> data, detParams* _detParams, yh_581_address address){;
|
||||
static bool ShangDing(std::shared_ptr <detData> data, detParams* &_detParams, yh_581_address address){;
|
||||
qDebug() << "SN" << QString::fromStdString(data->SNcode) << "algo start";
|
||||
std::map<QString, QVariant> sqlMapData;
|
||||
sqlMapData["项目"] = "上钉";
|
||||
@@ -145,15 +145,15 @@ public:
|
||||
}
|
||||
bool initCustom() {
|
||||
#pragma region 注册触发器回调
|
||||
djy_1.init("Camera1", "电解液1", 18000, 2, 1, _detParams, _serviceManager, bridge, generalAlgoTest);
|
||||
djy_2.init("Camera2", "电解液2", 18200, 2, 1, _detParams, _serviceManager, bridge, generalAlgoTest);
|
||||
djy_3.init("Camera3", "电解液3", 18400, 2, 1, _detParams, _serviceManager, bridge, generalAlgoTest);
|
||||
djy_4.init("Camera4", "电解液4", 18600, 2, 1, _detParams, _serviceManager, bridge, generalAlgoTest);
|
||||
djy_1.init("Camera1", "电解液1", 18000, 2, 1, &_detParams, _serviceManager, bridge, generalAlgoTest);
|
||||
djy_2.init("Camera2", "电解液2", 18200, 2, 1, &_detParams, _serviceManager, bridge, generalAlgoTest);
|
||||
djy_3.init("Camera3", "电解液3", 18400, 2, 1, &_detParams, _serviceManager, bridge, generalAlgoTest);
|
||||
djy_4.init("Camera4", "电解液4", 18600, 2, 1, &_detParams, _serviceManager, bridge, generalAlgoTest);
|
||||
|
||||
sd_1.init("Camera5", "上钉1", 18800, 1, 1, _detParams, _serviceManager, bridge, generalAlgoTest);
|
||||
sd_2.init("Camera6", "上钉2", 19000, 1, 1, _detParams, _serviceManager, bridge, generalAlgoTest);
|
||||
sd_3.init("Camera7", "上钉3", 19200, 1, 1, _detParams, _serviceManager, bridge, generalAlgoTest);
|
||||
sd_4.init("Camera8", "上钉4", 19400, 1, 1, _detParams, _serviceManager, bridge, generalAlgoTest);
|
||||
sd_1.init("Camera5", "上钉1", 18800, 1, 1, &_detParams, _serviceManager, bridge, generalAlgoTest);
|
||||
sd_2.init("Camera6", "上钉2", 19000, 1, 1, &_detParams, _serviceManager, bridge, generalAlgoTest);
|
||||
sd_3.init("Camera7", "上钉3", 19200, 1, 1, &_detParams, _serviceManager, bridge, generalAlgoTest);
|
||||
sd_4.init("Camera8", "上钉4", 19400, 1, 1, &_detParams, _serviceManager, bridge, generalAlgoTest);
|
||||
#pragma endregion
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -352,16 +352,16 @@ public:
|
||||
}
|
||||
bool initCustom() {
|
||||
#pragma region 注册触发器回调
|
||||
yh_1.init("Camera1", "预焊1", 19600, 2, 1, _params, _serviceManager, bridge, YuHan);
|
||||
yh_2.init("Camera2", "预焊2", 19800, 2, 1, _params, _serviceManager, bridge, YuHan);
|
||||
yh_1.init("Camera1", "预焊1", 19600, 2, 1, &_params, _serviceManager, bridge, YuHan);
|
||||
yh_2.init("Camera2", "预焊2", 19800, 2, 1, &_params, _serviceManager, bridge, YuHan);
|
||||
|
||||
mh_1.init("Camera3", "满焊1", 20000, 2, 1, _params, _serviceManager, bridge, ManHan);
|
||||
mh_2.init("Camera4", "满焊2", 20200, 2, 1, _params, _serviceManager, bridge, ManHan);
|
||||
mh_3.init("Camera5", "满焊3", 20400, 2, 1, _params, _serviceManager, bridge, ManHan);
|
||||
mh_4.init("Camera6", "满焊4", 20600, 2, 1, _params, _serviceManager, bridge, ManHan);
|
||||
mh_1.init("Camera3", "满焊1", 20000, 2, 1, &_params, _serviceManager, bridge, ManHan);
|
||||
mh_2.init("Camera4", "满焊2", 20200, 2, 1, &_params, _serviceManager, bridge, ManHan);
|
||||
mh_3.init("Camera5", "满焊3", 20400, 2, 1, &_params, _serviceManager, bridge, ManHan);
|
||||
mh_4.init("Camera6", "满焊4", 20600, 2, 1, &_params, _serviceManager, bridge, ManHan);
|
||||
|
||||
hh_2D.init("Camera7", "焊后2d", 20800, 2, 1, _detParams, _serviceManager, bridge, generalAlgoTest);
|
||||
hh_3D.init("Camera8", "焊后3d", 21000, 2, 1, _detParams, _serviceManager, bridge, generalAlgoTest);
|
||||
hh_2D.init("Camera7", "焊后2d", 20800, 2, 1, &_detParams, _serviceManager, bridge, generalAlgoTest);
|
||||
hh_3D.init("Camera8", "焊后3d", 21000, 2, 1, &_detParams, _serviceManager, bridge, generalAlgoTest);
|
||||
#pragma endregion
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -22,10 +22,10 @@ public:
|
||||
}
|
||||
bool initCustom() {
|
||||
#pragma region 注册触发器回调
|
||||
ruke_cam1_3.init("Camera1","入壳相机1下",18000, 2, 3, _params,_serviceManager, bridge, generalAlgoTest);
|
||||
ruke_cam2_1.init("Camera2", "入壳相机2左",18200 , 2, 1, _params, _serviceManager, bridge, generalAlgoTest);
|
||||
ruke_cam3_3.init("Camera3", "入壳相机3上",18400, 2, 3, _params, _serviceManager, bridge, generalAlgoTest);
|
||||
ruke_cam4_1.init("Camera4", "入壳相机4右",18600, 2, 1, _params, _serviceManager, bridge, generalAlgoTest);
|
||||
ruke_cam1_3.init("Camera1","入壳相机1下",18000, 2, 3, &_params,_serviceManager, bridge, generalAlgoTest);
|
||||
ruke_cam2_1.init("Camera2", "入壳相机2左",18200 , 2, 1,& _params, _serviceManager, bridge, generalAlgoTest);
|
||||
ruke_cam3_3.init("Camera3", "入壳相机3上",18400, 2, 3, &_params, _serviceManager, bridge, generalAlgoTest);
|
||||
ruke_cam4_1.init("Camera4", "入壳相机4右",18600, 2, 1, &_params, _serviceManager, bridge, generalAlgoTest);
|
||||
#pragma endregion
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#include <581_YiCiZhuYe_canye.h>
|
||||
|
||||
void exceptionResume(std::shared_ptr<detData> data, canyeParams* _detParams, sx_581_address address) {
|
||||
qDebug() << "[Error] " << QString::fromUtf8("检测失败!") << data->uuid << QString::fromStdString(data->SNcode);
|
||||
void exceptionResume(std::shared_ptr<detData> data, canyeParams* _detParams, sx_581_address address,QString why = "") {
|
||||
qDebug() << "[Error] " << QString::fromUtf8("检测失败!") << data->uuid << QString::fromStdString(data->SNcode)<< why;
|
||||
cv::Mat Paint;
|
||||
data->oriImgs[0].copyTo(Paint);
|
||||
if (Paint.channels() == 1)
|
||||
@@ -18,7 +18,7 @@ bool yizhuCanYe(std::shared_ptr<detData> data, canyeParams* _detParams, sx_581_a
|
||||
{
|
||||
if (!_detParams->DOGLIVE)
|
||||
{
|
||||
exceptionResume(data, _detParams, address);
|
||||
exceptionResume(data, _detParams, address,"未插加密狗");
|
||||
return true;
|
||||
}
|
||||
else
|
||||
@@ -66,7 +66,7 @@ bool yizhuCanYe(std::shared_ptr<detData> data, canyeParams* _detParams, sx_581_a
|
||||
}
|
||||
}
|
||||
CATCH_EXCEPTIONS
|
||||
exceptionResume(data, _detParams, address);
|
||||
exceptionResume(data, _detParams, address,"检测程序异常");
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 42 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 43 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 13 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 75 KiB |
Reference in New Issue
Block a user