#include "VImageControl.h" #include "GvlManager.h" #include "Preferences.h" // 默认的HObject数量 #define DEFAULT_HOBJECT_COUNT 0 // 默认的HTuple数量 #define DEFAULT_HTUPLE_COUNT 0 // 默认的Display数量 #define DEFAULT_DISPALY_COUNT 0 // 默认的字符串数量 #define DEFAULT_STRING_COUNT 0 VImageControl::VImageControl( QWidget* parent, const QPoint& pos, const QSize& size, CONTROL_PROPERTY* pProperty, CONTROL_PROPERTY_EX* pPropertyEx, bool bStartSaveThread ) : HWndUnit(parent) , VControlObject(pProperty) { // 设置控件指针 m_pWidget = this; // 设置控件类型 m_Type = VALUE_TYPE::Control_Image; // 备用颜色集合 m_defaultColors << QColor(0, 176, 180, 128) << QColor(255, 192, 0, 128) << QColor(0, 113, 193, 128) << QColor(72, 103, 149, 128) << QColor(185, 87, 86, 128) << QColor(0, 177, 125, 128) << QColor(214, 77, 84, 128) << QColor(71, 164, 233, 128) << QColor(34, 163, 169, 128) << QColor(40, 45, 48, 128) << QColor(162, 121, 197, 128) << QColor(72, 202, 245, 128) << QColor(0, 150, 121, 128) << QColor(111, 9, 176, 128) << QColor(250, 170, 20, 128); // 设置尺寸 if (size == DEFAULT_CONTROL_SIZE) { this->resize(DEFAULT_IMAGE_SIZE); } else { this->resize(size); } // 设置中心点坐标 QPoint tempPos; tempPos.setX(pos.x() - width() / 2); tempPos.setY(pos.y() - height() / 2); // 设置位置 this->move(tempPos); this->setWndTitle(m_Property.m_strText); // 初始化扩展属性 if (pPropertyEx == nullptr) { // 设置初始化的数量 this->m_Property.m_nHObjectCount = DEFAULT_HOBJECT_COUNT; this->m_Property.m_nHTupleCount = DEFAULT_HTUPLE_COUNT; this->m_Property.m_nDisplayCount = DEFAULT_DISPALY_COUNT; this->m_Property.m_nStringCount = DEFAULT_STRING_COUNT; // 初始化扩展属性 this->initPropertyEx(); // 刷新图形 //this->Refresh(); } else { this->m_PropertyEx = *pPropertyEx; // 刷新图形 this->Refresh(); } if (bStartSaveThread) { startSaveThread(); } } VImageControl::~VImageControl() { m_nThreadState = 0; } /// /// 重绘图像背景,显示默认图片 /// /// void VImageControl::paintEvent(QPaintEvent*) { QPainter painter(this); painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing); QString path = ":/image/Vimage.png"; QPixmap pixmap = QPixmap(path).scaled(this->size()); painter.drawImage(QRect(0, 0, this->width(), this->height()), pixmap.toImage()); } /// /// 显示图像 /// /// void VImageControl::ShowImage(HImage image) { HWndUnit::ShowImage(image); } /// /// 显示Object /// /// /// /// /// void VImageControl::ShowObj(HObject obj, QColor color, int nLineWidth) { Q_UNUSED(nLineWidth); Q_UNUSED(color); HWndUnit::ShowObj(obj, color, nLineWidth); } /// /// 显示文字 /// /// /// /// /// /// void VImageControl::ShowMsg(HTuple msg, QColor color, QPoint pt, int nSize) { HWndUnit::ShowMsg(msg, color, pt.x(), pt.y(), nSize); } /// /// 刷新图片显示 /// void VImageControl::Refresh() { HWndUnit::Refresh(false); } /// /// 生成一个随机的HObject供预览使用(暂未使用) /// /// HalconCpp::HObject VImageControl::genRandomHObject() { HObject dd; GenRectangle1(&dd, 500, 500, 900, 900); // GetDebugDataPtr()->addObj(dd, qRgb(255, 255, 0), 0.3); return dd; } /// /// 生成一个随机的Tuple供预览使用(暂未使用) /// /// HalconCpp::HTuple VImageControl::genRandomHTuple() { HTuple msg("msg"); return msg; } //============================================================== // // 基础属性相关 // //============================================================== //void VImageControl::setEnable(const bool enable) //{ // if (this->m_Property.m_bEnable != enable) // { // this->m_Property.m_bEnable = enable; // //QRadioButton::setEnabled(enable); // } //} void VImageControl::setText(const QString& title) { // qDebug() << m_Property.m_strText; if (this->m_Property.m_strText != title) { this->m_Property.m_strText = title; } } /// /// 设置HObject数量 /// /// void VImageControl::setHObjectCount(const int& count) { if (this->m_Property.m_nHObjectCount != count) { this->m_Property.m_nHObjectCount = count; } } /// /// 获取HObject数量 /// /// int VImageControl::getHObjectCount() { return this->m_Property.m_nHObjectCount; } /// /// 设置HTuple数量 /// /// void VImageControl::setHTupleCount(const int& count) { if (this->m_Property.m_nHTupleCount != count) { this->m_Property.m_nHTupleCount = count; } } /// /// 获取HTuple数量 /// /// int VImageControl::getHTupleCount() { return this->m_Property.m_nHTupleCount; } /// /// 设置Display数量 /// /// void VImageControl::setDisplayCount(const int& count) { if (this->m_Property.m_nDisplayCount != count) { this->m_Property.m_nDisplayCount = count; } } /// /// 获取HTuple数量 /// /// int VImageControl::getDisplayCount() { return this->m_Property.m_nDisplayCount; } /// /// 设置Display数量 /// /// void VImageControl::setStringCount(const int& count) { if (this->m_Property.m_nStringCount != count) { this->m_Property.m_nStringCount = count; } } /// /// 获取HTuple数量 /// /// int VImageControl::getStringCount() { return this->m_Property.m_nStringCount; } //============================================================== // // 扩展属性相关 // //============================================================== /// /// 初始化扩展属性 /// void VImageControl::initPropertyEx() { // 扩展属性的总名称 m_PropertyEx.m_strTitle = IMAGE_PROPERTY_EX_NAME; // 用于触发刷新的数据链接(无默认值) m_PropertyEx.m_refreshLink.title = IMAGE_PROPERTY_EX_REFRESHLINK_NAME; // 需要强制设置 m_PropertyEx.m_refreshLink.bForce = true; // 图像主数据连接(1个,无默认值) m_PropertyEx.m_mainDataLinks.resize(IMAGE_PROPERTY_EX_MAINLINK_COUNT); // 图像链接名称 m_PropertyEx.m_mainDataLinks[0].title = IMAGE_PROPERTY_EX_MAINLINK_NAME; // 需要强制设置 m_PropertyEx.m_mainDataLinks[0].bForce = true; // 初始化每一个扩展子属性组(Image控件有两个扩展属性组) //----------- HObject分组 PROPERTY_EX_GROUP group; // HObject信息属性 group.strTitle = IMAGE_PROPERTY_EX_GROUP_NAME; group.strRelationKey = IMAGE_OBJ_COUNT_NAME; //初始化HObject信息每一个子分组 for (int i = 0; i < m_Property.m_nHObjectCount; i++) { PROPERTY_EX_SUBGROUP subGroup; this->initSubGroup(subGroup, i, GROUP_INDEX_HOBJECT); // 保存子分组 group.subGroups.push_back(subGroup); } // 保存本子分组定义信息 m_PropertyEx.m_groups.push_back(group); //----------- HTuple 分组 PROPERTY_EX_GROUP group2; // HObject信息属性分组 group2.strTitle = IMAGE_PROPERTY_EX_GROUP2_NAME; group2.strRelationKey = IMAGE_MSG_COUNT_NAME; //初始化HTuple信息每一个子分组 for (int i = 0; i < m_Property.m_nHTupleCount; i++) { PROPERTY_EX_SUBGROUP subGroup; this->initSubGroup(subGroup, i, GROUP_INDEX_HTUPLE); // 保存子分组 group2.subGroups.push_back(subGroup); } // 保存本子分组定义信息 m_PropertyEx.m_groups.push_back(group2); //----------- DIsplay 分组 PROPERTY_EX_GROUP group3; // DIsplay信息属性分组 group3.strTitle = IMAGE_PROPERTY_EX_GROUP3_NAME; group3.strRelationKey = IMAGE_DISPLAY_COUNT_NAME; //初始化DIsplay信息每一个子分组 for (int i = 0; i < m_Property.m_nDisplayCount; i++) { PROPERTY_EX_SUBGROUP subGroup; this->initSubGroup(subGroup, i, GROUP_INDEX_DISPLAY); // 保存子分组 group3.subGroups.push_back(subGroup); } // 保存本子分组定义信息 m_PropertyEx.m_groups.push_back(group3); //----------- 字符串信息 PROPERTY_EX_GROUP group4; // String 信息属性分组 group4.strTitle = IMAGE_PROPERTY_EX_GROUP4_NAME; group4.strRelationKey = IMAGE_STRING_COUNT_NAME; //初始化String信息每一个子分组 for (int i = 0; i < m_Property.m_nStringCount; i++) { PROPERTY_EX_SUBGROUP subGroup; this->initSubGroup(subGroup, i, GROUP_INDEX_STRING); // 保存子分组 group4.subGroups.push_back(subGroup); } // 保存本子分组定义信息 m_PropertyEx.m_groups.push_back(group4); //----------- 附加信息(配置文件名,文件路径,是否存储,存储模式) PROPERTY_EX_GROUP group5; // HObject信息属性分组 group5.strTitle = IMAGE_PROPERTY_EX_GROUP5_NAME; group5.strRelationKey = IMAGE_DISPLAY_COUNT_NAME; { PROPERTY_EX_SUBGROUP subGroup; this->initSubGroup(subGroup, 0, GROUP_INDEX_SAVE); // 保存子分组 group5.subGroups.push_back(subGroup); } // 保存本子分组定义信息 m_PropertyEx.m_groups.push_back(group5); //// 2022-9-11 为刷新链接绑定默认值(系统的执行次数) //this->bindDefaultRefreshDataLink(); } /// /// 初始化扩展属性组 /// /// /// /// void VImageControl::initSubGroup(PROPERTY_EX_SUBGROUP& subGroup, int nIndex, int nSubGroupID) { switch (nSubGroupID) { case GROUP_INDEX_HOBJECT: this->initSubGroupHObject(subGroup, nIndex); break; case GROUP_INDEX_HTUPLE: this->initSubGroupHTuple(subGroup, nIndex); break; case GROUP_INDEX_DISPLAY: this->initSubGroupDisplay(subGroup, nIndex); break; case GROUP_INDEX_STRING: this->initSubGroupString(subGroup, nIndex); break; case GROUP_INDEX_SAVE: this->initSubGroupSave(subGroup, nIndex); break; default: break; } } /// /// 初始化一个扩展属性组 /// /// /// void VImageControl::initSubGroupHObject(PROPERTY_EX_SUBGROUP& subGroup, int nIndex) { QString idx = QString::number(nIndex + 1); // 子分组名称 subGroup.strTitle = IMAGE_PROPERTY_EX_SUBGROUP_NAME + idx; // 图层链接 DataLink dataLink1; dataLink1.title = IMAGE_PROPERTY_EX_LINK1_NAME + idx; // 强制链接 dataLink1.bForce = true; subGroup.dataLinks.push_back(dataLink1); // 状态链接 DataLink dataLink2; dataLink2.title = IMAGE_PROPERTY_EX_LINK2_NAME + idx; // 默认值(int, 0) dataLink2.defaultValue = g_pGvlManager->getDefaultValueByName(DEFAULT_VALUE_0); subGroup.dataLinks.push_back(dataLink2); // 杂项 // HObject颜色名称 subGroup.strColorName = IMAGE_PROPERTY_EX_HOBJECT_COLOR_NAME + idx; // 按顺序给一个默认值(可能会越界) if (nIndex < m_defaultColors.size()) { subGroup.color = m_defaultColors.at(nIndex); } else { subGroup.color = m_defaultColors.at(nIndex - m_defaultColors.size()); } //// HObject透明度 //subGroup.strTranspName = IMAGE_PROPERTY_EX_TRANSP_NAME + idx; //subGroup.fTransparency = 0.0; // HObject 线宽 subGroup.strLineWidthName = IMAGE_PROPERTY_EX_LINEWIDTH_NAME + idx; subGroup.nLineWidth = IMAGE_DEFAULT_LINEWIDTH; } /// /// 初始化一个扩展属性组2 /// /// /// void VImageControl::initSubGroupHTuple(PROPERTY_EX_SUBGROUP& subGroup, int nIndex) { QString idx = QString::number(nIndex + 1); // 子分组名称 subGroup.strTitle = IMAGE_PROPERTY_EX_SUBGROUP2_NAME + idx; // 文本链接 DataLink dataLink1; dataLink1.title = IMAGE_PROPERTY_EX_LINK3_NAME + idx; // 默认值(QString,"") dataLink1.defaultValue = g_pGvlManager->getDefaultValueByName(DEFAULT_VALUE_0); subGroup.dataLinks.push_back(dataLink1); // 状态链接 DataLink dataLink2; dataLink2.title = IMAGE_PROPERTY_EX_LINK4_NAME + idx; // 默认值(int, 0) dataLink2.defaultValue = g_pGvlManager->getDefaultValueByName(DEFAULT_VALUE_0); subGroup.dataLinks.push_back(dataLink2); // 杂项 // HTuple 颜色名称 subGroup.strColorName = IMAGE_PROPERTY_EX_HTUPLE_COLOR_NAME + idx; // 按顺序给一个默认值(可能会越界) if (nIndex < m_defaultColors.size()) { subGroup.color = m_defaultColors.at(nIndex); } else { subGroup.color = m_defaultColors.at(nIndex - m_defaultColors.size()); } // HTuple 坐标值(数据链接暂未启用) subGroup.strPtName = IMAGE_PROPERTY_EX_HTUPLE_PT_NAME + idx; subGroup.pt = QPoint(IMAGE_DEFAULT_X, IMAGE_DEFAULT_Y); //// HTuple 坐标数据链接 //subGroup.dataLinkPoint.title = IMAGE_PROPERTY_EX_HTUPLE_PT_NAME + idx; // HTuple 尺寸 subGroup.strSize = IMAGE_PROPERTY_EX_HTUPLE_SIZE_NAME + idx; subGroup.nSize = IMAGE_DEFAULT_SIZE; //// 图层链接名称 //subGroup.dataLink.title = IMAGE_PROPERTY_EX_LINK2_NAME + idx; } /// /// 初始化一个扩展属性组3 /// /// /// void VImageControl::initSubGroupDisplay(PROPERTY_EX_SUBGROUP& subGroup, int nIndex) { QString idx = QString::number(nIndex + 1); // 子分组名称 subGroup.strTitle = IMAGE_PROPERTY_EX_SUBGROUP3_NAME + idx; // DIsplay 链接 DataLink dataLink1; dataLink1.title = IMAGE_PROPERTY_EX_LINK5_NAME + idx; // 强制链接 dataLink1.bForce = true; subGroup.dataLinks.push_back(dataLink1); // 杂项 // HObject颜色名称 subGroup.strColorName = IMAGE_PROPERTY_EX_DISPLAY_COLOR_NAME + idx; // 按顺序给一个默认值(可能会越界) if (nIndex < m_defaultColors.size()) { subGroup.color = m_defaultColors.at(nIndex); } else { subGroup.color = m_defaultColors.at(nIndex - m_defaultColors.size()); } } /// /// 初始化一个扩展属性组4 /// /// /// void VImageControl::initSubGroupString(PROPERTY_EX_SUBGROUP& subGroup, int nIndex) { QString idx = QString::number(nIndex + 1); // 子分组名称 subGroup.strTitle = IMAGE_PROPERTY_EX_SUBGROUP4_NAME + idx; // String 链接 DataLink dataLink1; dataLink1.title = IMAGE_PROPERTY_EX_LINK6_NAME + idx; // 强制链接 dataLink1.bForce = true; subGroup.dataLinks.push_back(dataLink1); // 杂项 // String颜色名称 subGroup.strColorName = IMAGE_PROPERTY_EX_STRING_COLOR_NAME + idx; // 按顺序给一个默认值(可能会越界) if (nIndex < m_defaultColors.size()) { subGroup.color = m_defaultColors.at(nIndex); } else { subGroup.color = m_defaultColors.at(nIndex - m_defaultColors.size()); } // String 坐标值(数据链接暂未启用) subGroup.strPtName = IMAGE_PROPERTY_EX_STRING_PT_NAME + idx; subGroup.pt = QPoint(IMAGE_DEFAULT_X, IMAGE_DEFAULT_Y); //// HTuple 坐标数据链接 //subGroup.dataLinkPoint.title = IMAGE_PROPERTY_EX_HTUPLE_PT_NAME + idx; // HTuple 尺寸 subGroup.strSize = IMAGE_PROPERTY_EX_STRING_SIZE_NAME + idx; subGroup.nSize = IMAGE_DEFAULT_SIZE; } /// /// 初始化一个扩展属性组5 /// /// /// void VImageControl::initSubGroupSave(PROPERTY_EX_SUBGROUP& subGroup, int nIndex) { QString idx = QString::number(nIndex + 1); // 子分组名称 subGroup.strTitle = IMAGE_PROPERTY_EX_SUBGROUP5_NAME; // 文件名称 链接 DataLink dataLink1; dataLink1.title = IMAGE_PROPERTY_EX_LINK7_NAME; // 非强制链接的需要给默认值 dataLink1.defaultValue = g_pGvlManager->getDefaultValueByName(DEFAULT_VALUE_NULLSTRING); subGroup.dataLinks.push_back(dataLink1); // 文件路径 链接 DataLink dataLink2; dataLink2.title = IMAGE_PROPERTY_EX_LINK8_NAME; // 非强制链接的需要给默认值 dataLink2.defaultValue = g_pGvlManager->getDefaultValueByName(DEFAULT_VALUE_NULLSTRING); subGroup.dataLinks.push_back(dataLink2); // 状态 链接 DataLink dataLink3; dataLink3.title = IMAGE_PROPERTY_EX_LINK9_NAME; // 非强制链接的需要给默认值 dataLink3.defaultValue = g_pGvlManager->getDefaultValueByName(DEFAULT_VALUE_NULLSTRING); subGroup.dataLinks.push_back(dataLink3); // 杂项 (在杂项级别,或者和存储相关下面, // 1 添加两个复选框,启用存图,启用转储) // 2 添加一个下拉列表,选择寸图模式(按日期存储,按序号存储,自定义存储) // 启用保存原图 subGroup.strSaveImage = IMAGE_PROPERTY_EX_SACVE_IMG_NAME; subGroup.bEnSaveImage = false; // 启用截图 subGroup.strDumpWindow = IMAGE_PROPERTY_EX_SAVE_DUMP_NAME; subGroup.bEnDumpWindow = false; // 启用状态判断 subGroup.strExecuteState = IMAGE_PROPERTY_EX_EXE_STATE_NAME; subGroup.bEnExecuteState = false; // 存储模式 subGroup.strSaveMode = IMAGE_PROPERTY_EX_SAVE_MODE_NAME; subGroup.nSaveMode = 0; // 缓冲区大小 subGroup.strBufferSize = IMAGE_PROPERTY_EX_BUFFER_SIZE_NAME; subGroup.nBufferSize = 100; // 空闲时间 subGroup.strFreeTime = IMAGE_PROPERTY_EX_FREE_TIME_NAME; subGroup.nFreeTime = 100; } /// /// 重绘图像(图像+图层+文本) /// void VImageControl::redraw() { if (!m_Image.IsInitialized()) { return; } // 首先显示图形 ShowImage(m_Image); // HOBject for (int i = 0; i < this->m_HObjects.size(); i++) { if (m_HObjects[i].IsInitialized()) { if (m_HObjectsStatus[i] == 2) { ShowObj( m_HObjects[i], qRgb(255, 0, 0), m_PropertyEx.m_groups[GROUP_INDEX_HOBJECT].subGroups[i].nLineWidth ); } else { ShowObj( m_HObjects[i], m_PropertyEx.m_groups[GROUP_INDEX_HOBJECT].subGroups[i].color, m_PropertyEx.m_groups[GROUP_INDEX_HOBJECT].subGroups[i].nLineWidth ); } } } // HTuple for (int i = 0; i < this->m_HTuples.size(); i++) { if (m_HTuplesStatus[i] == 2) { ShowMsg( m_HTuples[i], qRgb(255, 0, 0), m_PropertyEx.m_groups[GROUP_INDEX_HTUPLE].subGroups[i].pt, m_PropertyEx.m_groups[GROUP_INDEX_HTUPLE].subGroups[i].nSize ); } else { ShowMsg( m_HTuples[i], m_PropertyEx.m_groups[GROUP_INDEX_HTUPLE].subGroups[i].color, m_PropertyEx.m_groups[GROUP_INDEX_HTUPLE].subGroups[i].pt, m_PropertyEx.m_groups[GROUP_INDEX_HTUPLE].subGroups[i].nSize ); } } // Dsiplay for (int i = 0; i < this->m_Dsiplays.size(); i++) { if (m_Dsiplays[i].IsInitialized()) { ShowObj( m_Dsiplays[i], m_PropertyEx.m_groups[GROUP_INDEX_DISPLAY].subGroups[i].color, 1 ); } } // String for (int i = 0; i < this->m_String.size(); i++) { if (!m_String[i].isEmpty()) { ShowMsg( m_String[i].toStdString().c_str(), m_PropertyEx.m_groups[GROUP_INDEX_STRING].subGroups[i].color, m_PropertyEx.m_groups[GROUP_INDEX_STRING].subGroups[i].pt, m_PropertyEx.m_groups[GROUP_INDEX_STRING].subGroups[i].nSize ); } } Refresh(); if (m_PropertyEx.m_groups.size() <= GROUP_INDEX_SAVE) { return; } bool bEnSaveImage = m_PropertyEx.m_groups[GROUP_INDEX_SAVE].subGroups[0].bEnSaveImage; if (bEnSaveImage) { int nBufferSize = m_PropertyEx.m_groups[GROUP_INDEX_SAVE].subGroups[0].nBufferSize; if (m_SaveImages.size() < nBufferSize) { SAVE_IMG SaveImg; SaveImg.hoImage = m_Image; QHalconWindow* pHalconWindow = getHWndCtrl(); if (pHalconWindow != nullptr) { SaveImg.hvWindow = pHalconWindow->getWindowID(); } SaveImg.strFileName = m_strFileName; SaveImg.strFilePath = m_strFilePath; SaveImg.nExecuteState = m_nExecuteState; SaveImg.bEnSaveImage = m_PropertyEx.m_groups[GROUP_INDEX_SAVE].subGroups[0].bEnSaveImage; SaveImg.bEnSaveDumpWindow = m_PropertyEx.m_groups[GROUP_INDEX_SAVE].subGroups[0].bEnDumpWindow; SaveImg.bEnExecuteState = m_PropertyEx.m_groups[GROUP_INDEX_SAVE].subGroups[0].bEnExecuteState; SaveImg.nSaveMode = m_PropertyEx.m_groups[GROUP_INDEX_SAVE].subGroups[0].nSaveMode; SaveImg.nBufferSize = m_PropertyEx.m_groups[GROUP_INDEX_SAVE].subGroups[0].nBufferSize; SaveImg.nFreeTime = m_PropertyEx.m_groups[GROUP_INDEX_SAVE].subGroups[0].nFreeTime; m_SaveImages.push_back(SaveImg); } } } /// /// 调整块属性数量(虚函数) /// /// void VImageControl::updateExPropertyCount(const int fixCount, const QString& strPropName) { // 获取属性的当前数量 int curCount = this->getExPropertyCountByName(strPropName); // 子分组编号 int curGroup = this->getGroupIDByName(strPropName); // 检查有效性 if (curGroup < 0) { qDebug() << "[Error] VImageControl::updateExPropertyCount - nGroupID in invalid: " << curGroup; return; } // 如果需要增加 if (fixCount > 0) { int nEnd = curCount + fixCount; for (int i = curCount; i < nEnd; i++) { PROPERTY_EX_SUBGROUP subItem; this->initSubGroup(subItem, i, curGroup); m_PropertyEx.m_groups[curGroup].subGroups.push_back(subItem); } } // 如果需要减少 else if (fixCount < 0) { for (int i = 0; i < qAbs(fixCount); i++) { // 去掉对应的数据结构信息 m_PropertyEx.m_groups[curGroup].subGroups.pop_back(); //// TODO:如果实现了预览的话,这里需要实时去掉预览数值 //if (groupID == HOBJECT_SUBGROUP_INDEX) //{ // m_HObjects.pop_back(); //} //else if (groupID == HTUPLE_SUBGROUP_INDEX) //{ // m_HTuples.pop_back(); //} } } } /// /// 修改扩展属性(虚函数) /// /// /// void VImageControl::changeExProperties(QString strValueTitle, const QVariant& newValue) { // 获取修改属性项的索引值 int nIndex = this->indexOfProperty(strValueTitle); // 如果改变了线宽 if (strValueTitle.contains(IMAGE_PROPERTY_EX_LINEWIDTH_NAME)) { // 刷新线宽 this->updateLineWidth(newValue.toInt(), nIndex); } // 如果改变了图层颜色 else if (strValueTitle.contains(IMAGE_PROPERTY_EX_HOBJECT_COLOR_NAME)) { // 更新图层颜色 this->updateHObjectColor(newValue.value(), nIndex); } // 如果改变了文本颜色 else if (strValueTitle.contains(IMAGE_PROPERTY_EX_HTUPLE_COLOR_NAME)) { // 更新文本颜色 this->updateHTupleColor(newValue.value(), nIndex); } // 如果改变了显示颜色 else if (strValueTitle.contains(IMAGE_PROPERTY_EX_DISPLAY_COLOR_NAME)) { // 更新文本颜色 this->updateDisplayColor(newValue.value(), nIndex); } // 如果改变了字符颜色 else if (strValueTitle.contains(IMAGE_PROPERTY_EX_STRING_COLOR_NAME)) { // 更新字符颜色 this->updateStringColor(newValue.value(), nIndex); } // 如果改变了文本坐标 else if (strValueTitle.contains(IMAGE_PROPERTY_EX_HTUPLE_PT_NAME)) { // 更新文本颜色 this->updateHTuplePt(newValue.toPoint(), nIndex); } // 如果改变了文本尺寸 else if (strValueTitle.contains(IMAGE_PROPERTY_EX_HTUPLE_SIZE_NAME)) { // 刷新线宽 this->updateHTupleSize(newValue.toInt(), nIndex); } // 如果改变了字符坐标 else if (strValueTitle.contains(IMAGE_PROPERTY_EX_STRING_PT_NAME)) { // 更新字符颜色 this->updateStringPt(newValue.toPoint(), nIndex); } // 如果改变了字符尺寸 else if (strValueTitle.contains(IMAGE_PROPERTY_EX_STRING_SIZE_NAME)) { // 刷新线宽 this->updateStringSize(newValue.toInt(), nIndex); } // 如果改变 存图选项 else if (strValueTitle.contains(IMAGE_PROPERTY_EX_SACVE_IMG_NAME)) { // 刷新是否启用存图 this->updateSaveImage(newValue.toBool()); } // 如果改变了 转储选项 else if (strValueTitle.contains(IMAGE_PROPERTY_EX_SAVE_DUMP_NAME)) { // 刷新是否启用转储窗口 this->updateDumpWindow(newValue.toBool()); } // 如果改变了 转储选项 else if (strValueTitle.contains(IMAGE_PROPERTY_EX_EXE_STATE_NAME)) { // 刷新是否启用转储窗口 this->updateExeState(newValue.toBool()); } // 如果改变了 存储模式 else if (strValueTitle.contains(IMAGE_PROPERTY_EX_SAVE_MODE_NAME)) { // 刷新 存储模式 this->updateSaveMode(newValue.toInt()); } // 如果改变了缓冲区大小 else if (strValueTitle.contains(IMAGE_PROPERTY_EX_BUFFER_SIZE_NAME)) { // 刷新 缓冲区大小 this->updateBufferSize(newValue.toInt()); } // 如果改变了 空闲时间 else if (strValueTitle.contains(IMAGE_PROPERTY_EX_FREE_TIME_NAME)) { // 刷新 空闲时间 this->updateFreeTime(newValue.toInt()); } // 2022-2-10 此处数据链接也会触发到这里,但是数据链接不需要再这里更新 else { qDebug() << "[Ignore]: VImageControl::changeExProperties - strValueTitle:" << strValueTitle; } } /// /// 更新图像数据 /// /// void VImageControl::updateImageFromVariables(const RUNTIME_SYNC_VARS& sync_vars) { try { // 按照数量重置一下数组空间 if (m_PropertyEx.m_groups[GROUP_INDEX_HOBJECT].subGroups.size() != m_HObjects.size()) { m_HObjects.clear(); m_HObjects.resize(m_PropertyEx.m_groups[GROUP_INDEX_HOBJECT].subGroups.size()); } if (m_PropertyEx.m_groups[GROUP_INDEX_HOBJECT].subGroups.size() != m_HObjectsStatus.size()) { m_HObjectsStatus.clear(); m_HObjectsStatus.resize(m_PropertyEx.m_groups[GROUP_INDEX_HOBJECT].subGroups.size()); } if (m_PropertyEx.m_groups[GROUP_INDEX_HTUPLE].subGroups.size() != m_HTuples.size()) { m_HTuples.clear(); m_HTuples.resize(m_PropertyEx.m_groups[GROUP_INDEX_HTUPLE].subGroups.size()); } if (m_PropertyEx.m_groups[GROUP_INDEX_HTUPLE].subGroups.size() != m_HTuplesStatus.size()) { m_HTuplesStatus.clear(); m_HTuplesStatus.resize(m_PropertyEx.m_groups[GROUP_INDEX_HTUPLE].subGroups.size()); } if (m_PropertyEx.m_groups[GROUP_INDEX_DISPLAY].subGroups.size() != m_Dsiplays.size()) { m_Dsiplays.clear(); m_Dsiplays.resize(m_PropertyEx.m_groups[GROUP_INDEX_DISPLAY].subGroups.size()); } if (m_PropertyEx.m_groups[GROUP_INDEX_STRING].subGroups.size() != m_String.size()) { m_String.clear(); m_String.resize(m_PropertyEx.m_groups[GROUP_INDEX_STRING].subGroups.size()); } // 从连接中获取每一个数值执行更新 for (const auto sync_var : sync_vars) { QString strPropName = sync_var.strPropertyName; // qDebug() << strPropName; // 图像链接 if (strPropName == IMAGE_PROPERTY_EX_MAINLINK_NAME) { m_Image = *(HImage*)sync_var.pVariable->getValuePtr(); } // HObject else if (strPropName.contains(IMAGE_PROPERTY_EX_LINK1_NAME)) { HObject obj = *(HObject*)sync_var.pVariable->getValuePtr(); int nIndex = strPropName.remove(IMAGE_PROPERTY_EX_LINK1_NAME).toInt() - 1; m_HObjects[nIndex] = obj; } // 图层状态 else if (strPropName.contains(IMAGE_PROPERTY_EX_LINK2_NAME)) { int nStatus = *(int*)sync_var.pVariable->getValuePtr(); int nIndex = strPropName.remove(IMAGE_PROPERTY_EX_LINK2_NAME).toInt() - 1; m_HObjectsStatus[nIndex] = nStatus; } // HTuple else if (strPropName.contains(IMAGE_PROPERTY_EX_LINK3_NAME)) { try { HTuple obj = *(HTuple*)sync_var.pVariable->getValuePtr(); int nIndex = strPropName.remove(IMAGE_PROPERTY_EX_LINK3_NAME).toInt() - 1; m_HTuples[nIndex] = obj; } catch (...) { qWarning() << "updateImageFromVariables -----> add HTuple Error"; } } // 文本状态 else if (strPropName.contains(IMAGE_PROPERTY_EX_LINK4_NAME)) { int nStatus = *(int*)sync_var.pVariable->getValuePtr(); int nIndex = strPropName.remove(IMAGE_PROPERTY_EX_LINK4_NAME).toInt() - 1; m_HTuplesStatus[nIndex] = nStatus; } // Display else if (strPropName.contains(IMAGE_PROPERTY_EX_LINK5_NAME)) { HObject obj = *(HObject*)sync_var.pVariable->getValuePtr(); int nIndex = strPropName.remove(IMAGE_PROPERTY_EX_LINK5_NAME).toInt() - 1; m_Dsiplays[nIndex] = obj; } // String else if (strPropName.contains(IMAGE_PROPERTY_EX_LINK6_NAME)) { QString str = sync_var.pVariable->getValueString(); int nIndex = strPropName.remove(IMAGE_PROPERTY_EX_LINK6_NAME).toInt() - 1; m_String[nIndex] = str; } // FileName else if (strPropName.contains(IMAGE_PROPERTY_EX_LINK7_NAME)) { m_strFileName = *(QString*)sync_var.pVariable->getValuePtr(); } // FIlePath else if (strPropName.contains(IMAGE_PROPERTY_EX_LINK8_NAME)) { m_strFilePath = *(QString*)sync_var.pVariable->getValuePtr(); } // 执行状态 else if (strPropName.contains(IMAGE_PROPERTY_EX_LINK9_NAME)) { m_nExecuteState = *(int*)sync_var.pVariable->getValuePtr(); } } // 更新完后,刷新图像 this->redraw(); } catch (...) { qWarning() << "updateImageFromVariables Error"; } } /// /// 更新图层线宽 /// /// /// void VImageControl::updateLineWidth(const int lineWidth, const int index) { int& nWidth = m_PropertyEx.m_groups[GROUP_INDEX_HOBJECT].subGroups[index].nLineWidth; if (nWidth != lineWidth) { nWidth = lineWidth; // TODO:刷新预览 } qDebug() << "VImageControl::updateLineWidth - update [" << m_PropertyEx.m_groups[GROUP_INDEX_HOBJECT].subGroups[index].strLineWidthName << "] to [" << lineWidth << "]"; } /// /// 更新图层颜色 /// /// /// void VImageControl::updateHObjectColor(const QColor newColor, const int index) { QColor& color = m_PropertyEx.m_groups[GROUP_INDEX_HOBJECT].subGroups[index].color; if (color != newColor) { color = newColor; // TODO:刷新预览 } qDebug() << "VImageControl::updateHObjectColor - update [" << m_PropertyEx.m_groups[GROUP_INDEX_HOBJECT].subGroups[index].strColorName << "] to [" << newColor << "]"; } /// /// 更新文本颜色 /// /// /// void VImageControl::updateHTupleColor(const QColor newColor, const int index) { QColor& color = m_PropertyEx.m_groups[GROUP_INDEX_HTUPLE].subGroups[index].color; if (color != newColor) { color = newColor; // TODO:刷新预览 } qDebug() << "VImageControl::updateHTupleColor - update [" << m_PropertyEx.m_groups[GROUP_INDEX_HTUPLE].subGroups[index].strColorName << "] to [" << newColor << "]"; } /// /// 更新显示颜色 /// /// /// void VImageControl::updateDisplayColor(const QColor newColor, const int index) { QColor& color = m_PropertyEx.m_groups[GROUP_INDEX_DISPLAY].subGroups[index].color; if (color != newColor) { color = newColor; // TODO:刷新预览 } qDebug() << "VImageControl::updateHObjectColor - update [" << m_PropertyEx.m_groups[GROUP_INDEX_DISPLAY].subGroups[index].strColorName << "] to [" << newColor << "]"; } /// /// 更新文本颜色 /// /// /// void VImageControl::updateStringColor(const QColor newColor, const int index) { QColor& color = m_PropertyEx.m_groups[GROUP_INDEX_STRING].subGroups[index].color; if (color != newColor) { color = newColor; // TODO:刷新预览 } qDebug() << "VImageControl::updateStringColor - update [" << m_PropertyEx.m_groups[GROUP_INDEX_STRING].subGroups[index].strColorName << "] to [" << newColor << "]"; } /// /// 更新文本坐标 /// /// /// void VImageControl::updateHTuplePt(const QPoint newPt, const int index) { QPoint& pt = m_PropertyEx.m_groups[GROUP_INDEX_HTUPLE].subGroups[index].pt; if (pt != newPt) { pt = newPt; // TODO:刷新预览 } qDebug() << "VImageControl::updateHTuplePt - update [" << m_PropertyEx.m_groups[GROUP_INDEX_HTUPLE].subGroups[index].strPtName << "] to [" << newPt << "]"; } /// /// 更新文本尺寸 /// /// /// void VImageControl::updateHTupleSize(const int newSize, const int index) { int& size = m_PropertyEx.m_groups[GROUP_INDEX_HTUPLE].subGroups[index].nSize; if (size != newSize) { size = newSize; // TODO:刷新预览 } qDebug() << "VImageControl::updateHTuplePt - update [" << m_PropertyEx.m_groups[GROUP_INDEX_HTUPLE].subGroups[index].nSize << "] to [" << newSize << "]"; } /// /// 更新在字符坐标 /// /// /// void VImageControl::updateStringPt(const QPoint newPt, const int index) { QPoint& pt = m_PropertyEx.m_groups[GROUP_INDEX_STRING].subGroups[index].pt; if (pt != newPt) { pt = newPt; // TODO:刷新预览 } qDebug() << "VImageControl::updateStringPt - update [" << m_PropertyEx.m_groups[GROUP_INDEX_HTUPLE].subGroups[index].strPtName << "] to [" << newPt << "]"; } /// /// 更新字符尺寸 /// /// /// void VImageControl::updateStringSize(const int newSize, const int index) { int& size = m_PropertyEx.m_groups[GROUP_INDEX_STRING].subGroups[index].nSize; if (size != newSize) { size = newSize; // TODO:刷新预览 } qDebug() << "VImageControl::updateStringPt - update [" << m_PropertyEx.m_groups[GROUP_INDEX_HTUPLE].subGroups[index].nSize << "] to [" << newSize << "]"; } /// /// 更新是否存图 /// /// void VImageControl::updateSaveImage(const bool bNewEnable) { bool& bEn = m_PropertyEx.m_groups[GROUP_INDEX_SAVE].subGroups[0].bEnSaveImage; if (bEn != bNewEnable) { bEn = bNewEnable; // TODO:刷新预览 } } /// /// 更新是否转储窗口 /// /// void VImageControl::updateDumpWindow(const bool bNewEnable) { bool& bEn = m_PropertyEx.m_groups[GROUP_INDEX_SAVE].subGroups[0].bEnDumpWindow; if (bEn != bNewEnable) { bEn = bNewEnable; // TODO:刷新预览 } } /// /// 更新是否转储窗口 /// /// void VImageControl::updateExeState(const bool bNewEnable) { bool& bEn = m_PropertyEx.m_groups[GROUP_INDEX_SAVE].subGroups[0].bEnExecuteState; if (bEn != bNewEnable) { bEn = bNewEnable; // TODO:刷新预览 } } /// /// 更新存储模式 /// /// void VImageControl::updateSaveMode(const int nNewValue) { int& nValue = m_PropertyEx.m_groups[GROUP_INDEX_SAVE].subGroups[0].nSaveMode; if (nValue != nNewValue) { nValue = nNewValue; // TODO:刷新预览 } } /// /// 更新 缓冲区大小 /// /// void VImageControl::updateBufferSize(const int nNewValue) { int& nValue = m_PropertyEx.m_groups[GROUP_INDEX_SAVE].subGroups[0].nBufferSize; if (nValue != nNewValue) { nValue = nNewValue; // TODO:刷新预览 }; } /// /// 更新空闲时间 /// /// void VImageControl::updateFreeTime(const int nNewValue) { int& nValue = m_PropertyEx.m_groups[GROUP_INDEX_SAVE].subGroups[0].nFreeTime; if (nValue != nNewValue) { nValue = nNewValue; // TODO:刷新预览 }; } /// /// 启动 存储线程 /// void VImageControl::startSaveThread() { m_nThreadState = 1; // 启动线程 m_SaveThreadPool.start( new _SaveThread(this) ); } //============================================================ // // Save 线程 // //============================================================ /// /// 线程函数 /// void _SaveThread::run() { // 调用函数执行任务 while (m_pImageControl->m_nThreadState) { if (m_pImageControl->m_SaveImages.size() > 0) { SAVE_IMG SaveImage = m_pImageControl->m_SaveImages[0]; QString strProjectPath = thePrefs.m_strProjectPath; QString strImagePath = strProjectPath + "//Image"; // TODO: 在此处根据不同的模式,生成对应的路径(此处不管本地有没有改路径的文件夹,但是需要确保路径是合法的) // TODO: 如无特别情况,图像日志都会生成在工程目录下 if (SaveImage.bEnSaveDumpWindow) { try { DumpWindowImage(&SaveImage.hoDumpWindow, SaveImage.hvWindow); } catch (...) {} } switch (SaveImage.nSaveMode) { case 0:// 序号模式 (0001 - 999 的自增序号) { qDebug() << SaveImage.bEnSaveImage; qDebug() << SaveImage.bEnSaveDumpWindow; qDebug() << SaveImage.bEnExecuteState; qDebug() << SaveImage.nSaveMode; qDebug() << SaveImage.nBufferSize; qDebug() << SaveImage.nFreeTime; } break; case 1:// 日期模式 { } break; case 2:// 链接模式(根据链接进来的文本,生成路径) { } break; default: break; } // TODO:在此根据上面生成的合法路径,去写文件。写文件的过程中,如果发现目录不存在,需要创建改目录 qDebug() << "Save Image ok FilePath: " << strImagePath; Utility::qSleep(SaveImage.nFreeTime); m_pImageControl->m_SaveImages.remove(0); } else { Utility::qSleep(1000); } } return; }