This commit is contained in:
2025-11-12 11:26:42 +08:00
parent 773771701a
commit 3c00124d57
8 changed files with 493 additions and 9 deletions
+5 -4
View File
@@ -102,12 +102,13 @@ public:
QString totalCtStr = "algoCT->" + QString::number(data->algoTime) + "ms|SN" + QString::fromStdString(data->SNcode);
qDebug() << totalCtStr;
//std::cout << totalCtStr.toStdString() << std::endl;
// 将耗时数据保存入数据库或日志
data->sqlVec.push_back({ "SN", data->SNcode });
data->sqlVec.push_back({ "totalCt", std::to_string(data->algoTime) + "ms" });
// 将耗时数据等保存入数据库或日志
data->sqlVec.insert({ "CT", QString::number(data->algoTime) + "ms" });
data->sqlVec.insert({ "算法判定结果", data->halconOK == false ? "NG" : "OK" });
data->sqlVec.insert({ "AI判定结果", data->aiDetOK == false ? "NG" : "OK" });
data->service->_csvWriter->addData(QString::fromStdString(data->SNcode), data->sqlVec);
// 异步保存检测图像
std::thread([this,data] {_imgSaveThreadManager->saveImage(data); }).detach();
//std::thread([this,data] {_imgSaveThreadManager->saveRes(data); }).detach();
}
#pragma region 注册回调函数
+2 -2
View File
@@ -57,8 +57,8 @@ public:
bool halconOK = true;
//结果图展示预设
std::vector< showImgPack>resultImgShowSet;
//需要存入的SQL数据
std::vector<std::pair<std::string, std::string>> sqlVec;
//打包存入的SQL数据
std::map<QString, QVariant> sqlVec;
#pragma endregion
QMap<QString, QVariant> additional;//自定义参数
detData() {}
+5 -1
View File
@@ -3,7 +3,7 @@
//为了更集中方便的展示检测结果到主页面
class missionResultHandle {
public:
missionResultHandle(bSignalHub* qtBridgeIn) {
missionResultHandle(bSignalHub* qtBridgeIn){
qtBridge = qtBridgeIn;
}
void toBarChart(std::string SN,bool isNG,std::vector<std::string> defectAndNum) {
@@ -18,6 +18,9 @@ public:
void toWaveForm(QString windowName, double value) {
emit qtBridge->waveFormAddData(windowName, value);
}
void addSqlData(QString snCode, std::map<QString, QVariant> data) {
_csvWriter->addData(snCode, data);
}
void test() {
QThread::msleep(1000);
emit qtBridge->pieWidgetAddNG();
@@ -35,5 +38,6 @@ public:
}
private:
bSignalHub* qtBridge;
CsvWriter* _csvWriter;
};
#pragma once
-1
View File
@@ -11,7 +11,6 @@ public:
detDataManager* _detDataManager = nullptr;// 检测数据管理器 需要初始化
imgSaveThreadManager* _imgSaveThreadManager = nullptr;// 保存图像线程 需要初始化
triggerManager* _triggerManager = nullptr;// 触发管理器
//handleAiModelManager* _handleAiModelManager = nullptr;// 模型管理器
cameraManager* _cameraManager = nullptr;
SQLiteDB* dataBase = nullptr;
CsvWriter* _csvWriter = nullptr;
-1
View File
@@ -176,7 +176,6 @@ static bool YuHan(std::shared_ptr <detData> data, mfd_detParams* _detParams, yh_
qCritical() << "图片数量不满足要求:" << data->oriImgs.size();
return false;
}
data->sqlVec.push_back({ "测试数据","1" });
cv::Mat Paint;
cv::Mat src1 = data->oriImgs[0];
//src1 = cv::imread("D://ceshi/15H/1/333.bmp",-1);
@@ -0,0 +1,9 @@
#include <602_RuanLianJie_dinggai.h>
mission* createMission() {
return new _581_YuHan_hanqian();
}
void destroyMission(mission* _mission) {
delete _mission;
}
@@ -0,0 +1,394 @@
#include <missionBase.hpp>
#include <sxGlobal.h>
#pragma region 算法
#include <simpleAlgo.h>
#include <hdevengine/HDevEngineCpp.h>
#include <opencvPaintAlgo.hpp>
using namespace HDevEngineCpp;
#pragma endregion
class RuanLianJie_dinnggai {
public:
handdleAI::pSegmentation* segDingwei1 = nullptr;
handdleAI::pSegmentation* seg = nullptr;
handdleAI::pClassification* cls = nullptr;
cv::Mat TP1IMG, TP2Paint;
};
QByteArray keMaResult = "0";
QByteArray okNgSaveText = "OK";
cv::Rect getImageLocateRect(cv::Mat& src, handdleAI::pSegmentation* seg, double bounus = 0.1) {
cv::Mat tmpImg;
cv::resize(src, tmpImg, cv::Size(), bounus, bounus);
cv::Mat ouput = ~seg->Evaluate(tmpImg);
cv::Rect rect = findMaxAreaContour(ouput);
rect.x /= bounus; rect.y /= bounus;
rect.width /= bounus; rect.height /= bounus;
return rect;
}
bool dinggaijiance(std::shared_ptr <detData> data, RuanLianJie_dinnggai* _detParams, sx_581_address address) {
try {
#if 0
/*↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓调试用↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓*/
cv::Mat resultImage = img2D.clone();
if (resultImage.channels() == 1) {
cv::cvtColor(resultImage, resultImage, cv::COLOR_GRAY2BGR);
}
QString okng_tag = "OK";
cv::Mat seg_detectImage;
cv::resize(img2D, seg_detectImage, cv::Size(), 1, 1);
plcResult = "1";
bool isNG = false;
if (DOGLIVE) {
std::vector<std::pair <int, cv::Mat >>clsImgs;
bool isNG = handleAiProcess(seg_detectImage, resultImage, seg_jierFanZhe, cls_jierFanZhe, clsImgs);
for (int i = 0; i < clsImgs.size(); i++) {
addImgToSaveStruct(clsImgs[i].second, "0", getClsSaveFormat(SN, okng_tag, i, clsImgs[i].first));
}
}
if (isNG == false)//OK
{
putTextHusky(resultImage, utf8_to_gbk("OK").c_str(), cv::Point(50, 50), cv::Scalar(0, 255, 0), 200);
okng_tag = "OK";
}
else
{
putTextHusky(resultImage, utf8_to_gbk("NG").c_str(), cv::Point(50, 50), cv::Scalar(0, 0, 255), 200);
plcResult = "2";
}
cv::resize(resultImage, resultImage, cv::Size(), 0.5, 0.5);
resMat.push_back(resultImage);
if (resMat.size() > 0)
{
addImgToSaveStruct(seg_detectImage, "0", getSegSaveFormat(SN, okng_tag));//存seg图
addImgToSaveStruct(resMat[0], "0", getResSaveFormat(SN, okng_tag));//存结果图
}
addImgToSaveStruct(HikMat[0], "0", getOriSaveFormat(SN, okng_tag));//存原图图
return true;
/*↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑调试用↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑*/
#else
if(address.triggerValue == 1)
data->oriImgs[0] = cv::imread("D://40CQ8B622000J0BF0B0050N5F_Camera2_0_01-24-31.bmp", - 1);
if (address.triggerValue == 2)
data->oriImgs[0] = cv::imread("D://40CQ8B622000J0BF0B0050N5F_Camera2_0_01-24-32.bmp", -1);
if (address.triggerValue == 3)
data->oriImgs[0] = cv::imread("D://40CQ8B622000J0BF0B0050N5F_Camera2_0_01-24-31.bmp", -1);
//存图数据加保存队列,加锁,避免数据访问冲突
QByteArray plcResult = "2";
double Resolution = 0.01424;
cv::Mat sourceImg;
data->oriImgs[0].copyTo(sourceImg);
cv::Mat Paint;
sourceImg.copyTo(Paint);
if (Paint.channels() == 1)
cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR);
if (address.triggerValue == 2)
{
HDevEngineCpp::HDevProcedure proc("_3_Cal_FBF_Distance");;
HDevEngineCpp::HDevProcedureCall procedureCall(proc);
sourceImg.copyTo(Paint);
if (Paint.channels() == 1)
cvtColor(Paint, Paint, 8);
HObject in_Image = MatToHObject(sourceImg);
HalconCpp::HTuple in_Resolution(Resolution), in_FilePath("./halconFiles/");
procedureCall.SetInputIconicParamObject("in_Image", in_Image);
procedureCall.SetInputCtrlParamTuple("in_Resolution", in_Resolution);
procedureCall.SetInputCtrlParamTuple("in_FilePath", in_FilePath);
procedureCall.Execute();//执行halcon程序
HalconCpp::HTuple out_LinePoint, out_Circle, out_Flag, out_Distance,out_NgTails;
out_LinePoint = procedureCall.GetOutputCtrlParamTuple("out_LinePoint");//获取输出控制类变量
out_Circle = procedureCall.GetOutputCtrlParamTuple("out_Circle");//获取输出控制类变量
out_Flag = procedureCall.GetOutputCtrlParamTuple("out_Flag");//获取输出控制类变量
out_Distance = procedureCall.GetOutputCtrlParamTuple("out_Distance");//获取输出控制类变量
out_NgTails = procedureCall.GetOutputCtrlParamTuple("out_NgTails");//获取输出控制类变量
keMaResult = "1";
if (out_Flag.D() == 1)
{
int crossLineLength = 50;
TextRendererZH textPainter(Paint.cols, Paint.rows, 140);
for (int i = 0; i < out_LinePoint.Length() / 4; i++)
{
cv::line(Paint, cv::Point(out_LinePoint[i * 4 + 1].D(), out_LinePoint[i * 4].D()),
cv::Point(out_LinePoint[i * 4 + 3].D(), out_LinePoint[i * 4 + 2].D()),
cv::Scalar(0, 255, 0), 10);
}
double distance = out_Distance[0].D();
distance -= out_Circle[2].D() * Resolution;//CHEAT!!!
circle(Paint, cv::Point(out_Circle[1].D(), out_Circle[0].D()), out_Circle[2].D(), cv::Scalar(0, 255, 0), 5);
{
//data1 = QByteArray::number(distance);
std::string text = "二维码与防爆阀相对位置:" + std::to_string(distance);
text = text.substr(0, text.find(".") + 4) + "mm";
textPainter.putText(Paint,
(text).c_str(),
cv::Point(100, 500), cv::Scalar(0, 255, 0));
}
double distance2 = out_Distance[1].D();//二维码的宽度值
{
QByteArray::number(distance2);
std::string text = "二维码与防爆阀间距:" + std::to_string(distance2);
text = text.substr(0, text.find(".") + 4) + "mm";
textPainter.putText(Paint,
(text).c_str(),
cv::Point(100, 650), cv::Scalar(0, 255, 0));
}
double distance3 = out_Distance[2].D();//二维码下方字符串的宽度值
{
std::string text = "二维码的宽度值:" + std::to_string(distance3);
text = text.substr(0, text.find(".") + 4) + "mm";
textPainter.putText(Paint,
(text).c_str(),
cv::Point(100, 800), cv::Scalar(0, 255, 0));
}
//double distance4 = out_Distance[3].D();//二维码左侧字符串的高度值
//{
// std::string text = "二维码左字符水平宽度:" + std::to_string(distance4);
// text = text.substr(0, text.find(".") + 4) + "mm";
// putTextHusky(Paint,
// utf8_to_gbk(text).c_str(),
// cv::Point(100, 950), cv::Scalar(0, 255, 0), 140);
//}
//double distance5 = out_Distance[4].D();//二维码右侧到电芯右侧边缘距离
//{
// data2 = QByteArray::number(distance2);
// std::string text = "右间距:" + std::to_string(distance5);
// text = text.substr(0, text.find(".") + 4) + "mm";
// putTextHusky(Paint,
// utf8_to_gbk(text).c_str(),
// cv::Point(50, 350), cv::Scalar(0, 255, 0), 280);
//}
if (distance > 11.9 || distance < 5.9)
{
std::string text = "上间距NG";
TextRendererZH textPainter1(Paint.cols, Paint.rows, 280);
textPainter1.putText(Paint,
(text).c_str(),
cv::Point(50, 50), cv::Scalar(0, 0, 255));
keMaResult = "2";
okNgSaveText = "NG";
}
/* if (distance5 > 33.2 || distance5 < 27.2)
{
std::string text = "右间距NG";
putTextHusky(Paint,
utf8_to_gbk(text).c_str(),
cv::Point(2500, 350), cv::Scalar(0, 0, 255), 280);
keMaResult = "2";
okNgSaveText = "NG";
}*/
}
else
{
qDebug() << __FUNCTION__ << "line:" << __LINE__ << "二维码error";
TextRendererZH textPainter2(Paint.cols, Paint.rows, 500);
auto ngDetail = gbkToUtf8(out_NgTails.ToString().Text());
textPainter2.putText(Paint, ngDetail, cv::Point(0, 50), cv::Scalar(0, 0, 255));
keMaResult = "2";
okNgSaveText = "NG";
}
//#endif
Paint.copyTo(_detParams->TP2Paint);
}
else if (address.triggerValue == 1)
{
okNgSaveText = "OK";
keMaResult = "1";
sourceImg.copyTo(_detParams->TP1IMG);
}
else if (address.triggerValue == 3)
{
Paint = cv::Mat(_detParams->TP1IMG.rows, _detParams->TP1IMG.cols * 3, CV_8UC1);
_detParams->TP1IMG.copyTo(Paint(cv::Rect(0, 0, _detParams->TP1IMG.cols, _detParams->TP1IMG.rows)));
sourceImg.copyTo(Paint(cv::Rect(_detParams->TP1IMG.cols, 0, _detParams->TP1IMG.cols, _detParams->TP1IMG.rows)));
if (Paint.channels() == 1)
cvtColor(Paint, Paint, 8);
_detParams->TP2Paint.copyTo(Paint(cv::Rect(_detParams->TP1IMG.cols * 2, 0, _detParams->TP1IMG.cols, _detParams->TP1IMG.rows)));
cv::Mat PaintPart2 = Paint(cv::Rect(_detParams->TP1IMG.cols, 0, _detParams->TP1IMG.cols, _detParams->TP1IMG.rows));
HDevEngineCpp::HDevProcedure proc("_3_Cal_JZ_Distance");;
HDevEngineCpp::HDevProcedureCall procedureCall(proc);
HObject in_Image1, in_Image2;
in_Image1 = MatToHObject(_detParams->TP1IMG);
in_Image2 = MatToHObject(sourceImg);
HalconCpp::HTuple in_FilePath(" "), in_Resolution(Resolution);
procedureCall.SetInputIconicParamObject("in_Image1", in_Image1);
procedureCall.SetInputIconicParamObject("in_Image2", in_Image2);
procedureCall.SetInputCtrlParamTuple("in_Resolution", in_Resolution);
procedureCall.SetInputCtrlParamTuple("in_FilePath", in_FilePath);
procedureCall.Execute();//执行halcon程序
HalconCpp::HTuple out_Edgedistance, out_Distance, out_LinePoint, out_Flag;
out_Edgedistance = procedureCall.GetOutputCtrlParamTuple("out_Edgedistance");//获取输出控制类变量
out_Distance = procedureCall.GetOutputCtrlParamTuple("out_Distance");//获取输出控制类变量
out_LinePoint = procedureCall.GetOutputCtrlParamTuple("out_LinePoint");//获取输出控制类变量
out_Flag = procedureCall.GetOutputCtrlParamTuple("out_Flag");//获取输出控制类变量
if (out_Flag.D() == 1)
{
for (int i = 0; i < 4; i++)
{
cv::line(Paint, cv::Point(out_LinePoint[i * 4 + 1].D(), out_LinePoint[i * 4].D()),
cv::Point(out_LinePoint[i * 4 + 3].D(), out_LinePoint[i * 4 + 2].D()),
cv::Scalar(0, 255, 0), 15);
}
for (int i = 4; i < 8; i++)
{
cv::line(PaintPart2, cv::Point(out_LinePoint[i * 4 + 1].D(), out_LinePoint[i * 4].D()),
cv::Point(out_LinePoint[i * 4 + 3].D(), out_LinePoint[i * 4 + 2].D()),
cv::Scalar(0, 255, 0), 15);
}
double Distance = out_Distance.D();
TextRendererZH textPainter(Paint.cols, Paint.rows, 280);
//Paint
{
std::string text = "垂直间距:" + std::to_string(out_Edgedistance[0].D());
//data3 = QByteArray::number(out_Edgedistance[0].D());
text = text.substr(0, text.find(".") + 4) + "mm";
textPainter.putText(Paint,
(text).c_str(),
cv::Point(50, 50), cv::Scalar(0, 255, 0));
}
{
//data4 = QByteArray::number(out_Edgedistance[1].D());
std::string text = "水平间距:" + std::to_string(out_Edgedistance[1].D());
text = text.substr(0, text.find(".") + 4) + "mm";
textPainter.putText(Paint,
(text).c_str(),
cv::Point(50, 300), cv::Scalar(0, 255, 0));
}
{
//data5 = QByteArray::number(out_Edgedistance[2].D());
std::string text = "垂直间距:" + std::to_string(out_Edgedistance[2].D());
text = text.substr(0, text.find(".") + 4) + "mm";
textPainter.putText(PaintPart2,
(text).c_str(),
cv::Point(50, 50), cv::Scalar(0, 255, 0));
}
{
//data6 = QByteArray::number(out_Edgedistance[3].D());
std::string text = "水平间距:" + std::to_string(out_Edgedistance[3].D());
text = text.substr(0, text.find(".") + 4) + "mm";
textPainter.putText(PaintPart2,
(text).c_str(),
cv::Point(50, 300), cv::Scalar(0, 255, 0));
}
/*{
std::string text = "极柱间距:" + std::to_string(Distance);
text = text.substr(0, text.find(".") + 4) + "mm";
putTextHusky(Paint,
utf8_to_gbk(text).c_str(),
cv::Point(50, 550), cv::Scalar(0, 0, 255), 280);
putTextHusky(PaintPart2,
utf8_to_gbk(text).c_str(),
cv::Point(50, 550), cv::Scalar(0, 0, 255), 280);
}*/
}
else
{
TextRendererZH textPainter1(Paint.cols, Paint.rows, 500);
textPainter1.putText(Paint, "NG,vv", cv::Point(0, 50), cv::Scalar(0, 0, 255));
okNgSaveText = "NG";
}
plcResult = keMaResult;
plcResult = "1";//强制OK
data->resultImgs.push_back(Paint);
return true;
}
sourceImg.release();
plcResult = "1";
data->service->_triggerManager->writeShort("D" + address.resultAddr + "_" + plcResult);//结果反馈
return true;
#endif
}
CATCH_EXCEPTIONS
qDebug() << "[Error] " << QString::fromUtf8("检测失败!");
cv::Mat Paint;
data->oriImgs[0].copyTo(Paint);
if (Paint.channels() == 1)
cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR);
TextRendererZH textPainter(Paint.cols, Paint.rows, 500);
textPainter.putText(Paint, "NG", cv::Point(0, 0), cv::Scalar(0, 255, 0));
cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5);
data->resultImgs.push_back(Paint);
data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//结果反馈
return true;
}
bool majiarerong(std::shared_ptr <detData> data, RuanLianJie_dinnggai * _detParams, sx_581_address address) {
try {
#if 0
#else
cv::Mat Paint;
data->oriImgs[0].copyTo(Paint);
if (Paint.channels() == 1)
cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR);
TextRendererZH textPainter(Paint.cols, Paint.rows, 500);
textPainter.putText(Paint, "NG", cv::Point(0, 0), cv::Scalar(0, 255, 0));
cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5);
data->resultImgs.push_back(Paint);
data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//结果反馈
data->service->_triggerManager->writeShort("D" + QByteArray::number(address.valueOffsetAddr) + "_1");//铜热熔面积
data->service->_triggerManager->writeShort("D" + QByteArray::number(address.valueOffsetAddr + 2) + "_1");//铜热熔点数
data->service->_triggerManager->writeShort("D" + QByteArray::number(address.valueOffsetAddr + 4)+ "_1");//铝热熔面积
data->service->_triggerManager->writeShort("D" + QByteArray::number(address.valueOffsetAddr + 6) + "_1");//铝热熔点数
return true;
#endif
}
CATCH_EXCEPTIONS
qDebug() << "[Error] " << QString::fromUtf8("检测失败!");
cv::Mat Paint;
data->oriImgs[0].copyTo(Paint);
if (Paint.channels() == 1)
cvtColor(Paint, Paint, cv::COLOR_GRAY2BGR);
TextRendererZH textPainter(Paint.cols, Paint.rows, 500);
textPainter.putText(Paint, "NG", cv::Point(0, 0), cv::Scalar(0, 255, 0));
cv::resize(Paint, Paint, cv::Size(), 0.5, 0.5);
data->resultImgs.push_back(Paint);
data->service->_triggerManager->writeShort("D" + address.resultAddr + "_1");//结果反馈
data->service->_triggerManager->writeShort("D" + QByteArray::number(address.valueOffsetAddr) + "_1");//铜热熔面积
data->service->_triggerManager->writeShort("D" + QByteArray::number(address.valueOffsetAddr + 2) + "_1");//铜热熔点数
data->service->_triggerManager->writeShort("D" + QByteArray::number(address.valueOffsetAddr + 4) + "_1");//铝热熔面积
data->service->_triggerManager->writeShort("D" + QByteArray::number(address.valueOffsetAddr + 6) + "_1");//铝热熔点数
return true;
}
class _581_YuHan_hanqian : public mission {
public:
_581_SX_Single_triggerTemplate< RuanLianJie_dinnggai> dibu_1;
_581_SX_Single_triggerTemplate< RuanLianJie_dinnggai> dibu_2;
_581_SX_Single_triggerTemplate< RuanLianJie_dinnggai> dibu_3;
_581_SX_Single_triggerTemplate< RuanLianJie_dinnggai> dibu_4;
RuanLianJie_dinnggai DetParams1;
RuanLianJie_dinnggai DetParams2;
RuanLianJie_dinnggai DetParams3;
RuanLianJie_dinnggai DetParams4;
void onConfigReloaded() {
HDevEngineCpp::HDevEngine myEngine;
myEngine.SetProcedurePath("./halconAlgo/AlgoLibrary_602.hdpl");
}
bool initCustom() {
#pragma region 注册触发器回调
dibu_1.init("Camera1", "顶盖检测刻码后-相机1", { { 5000, 1,{5010},"5002","5004",-1},{ 5000, 2,{5010},"5002","5004",-1},{ 5000, 3,{5010},"5002","5004",5030} }, 1, &DetParams1, _serviceManager, bridge, dinggaijiance, "防爆阀CCD");
dibu_2.init("Camera2", "顶盖检测刻码后-相机2", { { 5100, 1,{5110},"5102","5104",-1},{ 5100, 2,{5110},"5102","5104",-1},{ 5100, 3,{5110},"5102","5104",5130} }, 1, &DetParams2, _serviceManager, bridge, dinggaijiance, "防爆阀CCD");
dibu_3.init("Camera3", "马甲热熔检测-相机1", { { 5200, 1,{5210},"5202","5204",5230 }}, 1, &DetParams3, _serviceManager, bridge, majiarerong, "马甲热熔CCD");
dibu_4.init("Camera4", "马甲热熔检测-相机2", { { 5300, 1,{5310},"5302","5304",5330} }, 1, &DetParams4, _serviceManager, bridge, majiarerong, "马甲热熔CCD");
#pragma endregion
return true;
}
};
#pragma once
@@ -0,0 +1,78 @@
# 获取获取当前目录名
get_filename_component(CURRENT_FOLDER ${CMAKE_CURRENT_SOURCE_DIR} NAME)
string(TIMESTAMP RUN_TIME)
message( " model start : " ${CURRENT_FOLDER}:${RUN_TIME})
set(DLL_NAMES "opencv" "halcon" "handdleAI")
foreach(child ${DLL_NAMES})
LIST(APPEND ENV_INCLUDE ${${child}_include})
LIST(APPEND ENV_LIB ${${child}_lib})
LIST(APPEND ENV_TARGET ${${child}_target_link})
endforeach()
message(" ENV_INCLUDE : " ${ENV_INCLUDE} )
message(" ENV_LIB : " ${ENV_LIB} )
message(" ENV_TARGET : " ${ENV_TARGET} )
include_directories(
${PROJECT_ROOT_PATH}/src/core
${PROJECT_ROOT_PATH}/src/core/handleAi
${PROJECT_ROOT_PATH}/src/core/service
${PROJECT_ROOT_PATH}/src/core/sql
${ENV_INCLUDE}
)
link_directories (
${ENV_LIB}
)
add_compile_options(/utf-8)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
SET(CMAKE_CXX_STANDARD 11)
SET(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_AUTOMOC ON)
SET(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)
FILE(GLOB HEAD_FILES "*.h" )
FILE(GLOB SRC_FILES "./*.cpp")
FILE(GLOB UI_FILES "./*.ui")
#find_package(Qt5 COMPONENTS Core REQUIRED)
find_package(QT NAMES Qt6 Qt5 COMPONENTS Core Gui Network Sql REQUIRED)
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core Gui Network Sql REQUIRED)
add_library(${CURRENT_FOLDER} SHARED
${HEAD_FILES}
${SRC_FILES}
${UI_FILES}
${PROJECT_ROOT_PATH}/include/interface.h
)
set_target_properties(${CURRENT_FOLDER} PROPERTIES
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}
)
target_link_libraries(${CURRENT_FOLDER} PRIVATE
${ENV_TARGET}
Qt${QT_VERSION_MAJOR}::Core
Qt${QT_VERSION_MAJOR}::Gui
Qt${QT_VERSION_MAJOR}::Network
Qt${QT_VERSION_MAJOR}::Sql
)
# target_compile_definitions(${CURRENT_FOLDER} PRIVATE HD_AIDEMO_MODULE_LIBRARY)
string(TIMESTAMP RUN_TIME)
message( " modelx end : " ${CURRENT_FOLDER}:${RUN_TIME})
message( " header files "${HEAD_FILES})