|
@@ -90,8 +90,8 @@ void Wafer::UpdataVal(const std::vector<ns_mat::WAFER_MATRIX_POINT_INFO_STRUCT>&
|
|
|
if (a.nDieRow >= rowMax) rowMax = a.nDieRow;
|
|
|
if (a.nDieCol >= colsMax) colsMax = a.nDieCol;
|
|
|
if (a.stPosition.x >= maxx) maxx = a.stPosition.x;
|
|
|
- if (a.stPosition.y <= maxx) maxx = a.stPosition.y;
|
|
|
- if (a.stPosition.x >= minx) minx = a.stPosition.x;
|
|
|
+ if (a.stPosition.y >= maxy) maxy = a.stPosition.y;
|
|
|
+ if (a.stPosition.x <= minx) minx = a.stPosition.x;
|
|
|
if (a.stPosition.x <= miny) miny = a.stPosition.y;
|
|
|
}
|
|
|
}
|
|
@@ -203,6 +203,9 @@ void Wafer::initFrom(QWidget* parent) {
|
|
|
scene = new QGraphicsScene(parent);
|
|
|
view = new WaferGraphicsView(scene);
|
|
|
view->resize(width, height);
|
|
|
+ //获取当前角度
|
|
|
+ double angle;
|
|
|
+ m_pCViewInterface->GetViewMatrix()->GetWaferTableAngle(angle);
|
|
|
QPointF center(width / 2.0, height / 2.0);
|
|
|
QPointF pointf(m_centerX, m_centerY);
|
|
|
double radius = width / 2 - 10;
|
|
@@ -210,16 +213,20 @@ void Wafer::initFrom(QWidget* parent) {
|
|
|
double radio = m_radius / radius;
|
|
|
int dieLong = m_dieLong / radio;
|
|
|
int dieWide = m_dieWide / radio;
|
|
|
+
|
|
|
+ //test 实际使用时需要删除或注释
|
|
|
+ angle = 0.00;
|
|
|
// 初始化晶圆参数
|
|
|
view->initWafer(center, // 中心坐标
|
|
|
radius, // 半径
|
|
|
- dieLong, dieWide); // 固晶点显示尺寸
|
|
|
+ dieLong, dieWide,angle); // 固晶点显示尺寸
|
|
|
|
|
|
// 添加固晶点
|
|
|
int currentDieMatrixId = -1;
|
|
|
double referPointX = 0.0;
|
|
|
double referPointY = 0.0;
|
|
|
MaxRow_Col maxRow_Col;
|
|
|
+ double minx, miny,maxx,maxy, widthMatrix, heightMatrix;
|
|
|
for (int i = 0; i < waferData.size(); ++i) {
|
|
|
//判断是否属于同一个矩阵
|
|
|
if (waferData[i].nDieMatrixId != currentDieMatrixId) {
|
|
@@ -228,11 +235,21 @@ void Wafer::initFrom(QWidget* parent) {
|
|
|
referPointX = center.x() + (waferData[i].stPosition.x - m_centerX) / radio;
|
|
|
referPointY = center.y() - (waferData[i].stPosition.y - m_centerY) / radio;
|
|
|
maxRow_Col = maxRow_Colmap.value(currentDieMatrixId);
|
|
|
- view->drawDieMatrix(QPointF(referPointX - dieLong, referPointY - dieWide), (maxRow_Col.maxRow+2) * dieLong, (maxRow_Col.maxCol+2) * dieWide);
|
|
|
+ minx = center.x()+(maxRow_Col.minX - m_centerX) / radio - 20;
|
|
|
+ miny = center.y() - (maxRow_Col.minY - m_centerY) / radio + 20;
|
|
|
+ maxx = center.x() + (maxRow_Col.maxX - m_centerX) / radio + 20;
|
|
|
+ maxy = center.y() - (maxRow_Col.maxY - m_centerY) / radio - 20;
|
|
|
+ widthMatrix = maxx - minx;
|
|
|
+ heightMatrix = miny - maxy;
|
|
|
+ view->drawDieMatrix(QPointF(minx, maxy), widthMatrix, heightMatrix, currentDieMatrixId);
|
|
|
|
|
|
}
|
|
|
referPointX = center.x() + (waferData[i].stPosition.x - m_centerX) / radio;
|
|
|
referPointY = center.y() - (waferData[i].stPosition.y - m_centerY) / radio;
|
|
|
+
|
|
|
+ //test
|
|
|
+ //referPointX = i * 5;
|
|
|
+ //referPointY = i * 5;
|
|
|
view->addDiePoint(QPointF(referPointX, referPointY),waferData[i]);
|
|
|
}
|
|
|
scene->setSceneRect(0, 0, view->width(), view->height());
|
|
@@ -249,11 +266,89 @@ void Wafer::setWaferInfo(ns_module::CViewInterface* CViewInterface) {
|
|
|
long result = m_pCViewInterface->GetViewMatrix()->GetDieSize(m_dieLong,m_dieWide);
|
|
|
|
|
|
m_pCViewInterface->GetViewMatrix()->GetWaferSize(m_centerX, m_centerY,m_radius);
|
|
|
+ ImageInfo image;
|
|
|
+ m_pCViewInterface->GetViewMatrix()->GetWaferRefImage(image);
|
|
|
+
|
|
|
+ QPixmap test = convertToPixmap(image);
|
|
|
|
|
|
//这里到时候更新接口时替换真实圆心点的数据
|
|
|
/*m_dieLong = 10;
|
|
|
- m_dieWide = 10;
|
|
|
- m_radius = 200;*/
|
|
|
+ m_dieWide = 10;*/
|
|
|
+ m_radius = 10000;
|
|
|
m_centerX = 0;
|
|
|
m_centerY = 0;
|
|
|
}
|
|
|
+
|
|
|
+void Wafer::yuv422_to_rgb888(const unsigned char* src, unsigned char* dst, int width, int height)
|
|
|
+{
|
|
|
+ for (int i = 0; i < width * height; i += 2) {
|
|
|
+ unsigned char y0 = src[0];
|
|
|
+ unsigned char u = src[1];
|
|
|
+ unsigned char y1 = src[2];
|
|
|
+ unsigned char v = src[1];
|
|
|
+
|
|
|
+ // 简单反色度插值,适用于 U/V 在相邻像素间共享的情况
|
|
|
+ int r, g, b;
|
|
|
+
|
|
|
+ // YUV to RGB 转换公式
|
|
|
+#define CLIP(x) qBound(0, int(x), 255)
|
|
|
+
|
|
|
+// Pixel 0
|
|
|
+ r = CLIP(y0 + 1.402 * (v - 128));
|
|
|
+ g = CLIP(y0 - 0.344 * (u - 128) - 0.714 * (v - 128));
|
|
|
+ b = CLIP(y0 + 1.772 * (u - 128));
|
|
|
+ *dst++ = r;
|
|
|
+ *dst++ = g;
|
|
|
+ *dst++ = b;
|
|
|
+
|
|
|
+ // Pixel 1
|
|
|
+ r = CLIP(y1 + 1.402 * (v - 128));
|
|
|
+ g = CLIP(y1 - 0.344 * (u - 128) - 0.714 * (v - 128));
|
|
|
+ b = CLIP(y1 + 1.772 * (u - 128));
|
|
|
+ *dst++ = r;
|
|
|
+ *dst++ = g;
|
|
|
+ *dst++ = b;
|
|
|
+
|
|
|
+ src += 4;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+QPixmap Wafer::convertToPixmap(const ImageInfo& imgData)
|
|
|
+{
|
|
|
+ QImage::Format qFormat = QImage::Format_Invalid;
|
|
|
+
|
|
|
+ switch (imgData.format) {
|
|
|
+ case ImageFormat::GRAY8:
|
|
|
+ qFormat = QImage::Format_Grayscale8;
|
|
|
+ break;
|
|
|
+ case ImageFormat::RGB888:
|
|
|
+ qFormat = QImage::Format_RGB888;
|
|
|
+ break;
|
|
|
+ case ImageFormat::ARGB32:
|
|
|
+ qFormat = QImage::Format_ARGB32;
|
|
|
+ break;
|
|
|
+ case ImageFormat::RGB32:
|
|
|
+ qFormat = QImage::Format_RGB32;
|
|
|
+ break;
|
|
|
+ case ImageFormat::YUV422: {
|
|
|
+ // 需要先转换为 RGB888
|
|
|
+ int byteCount = imgData.width * imgData.height * 3;
|
|
|
+ unsigned char* rgbData = new unsigned char[byteCount];
|
|
|
+ yuv422_to_rgb888(imgData.data, rgbData, imgData.width, imgData.height);
|
|
|
+
|
|
|
+ QImage tmp(rgbData, imgData.width, imgData.height, QImage::Format_RGB888);
|
|
|
+ QPixmap pixmap = QPixmap::fromImage(tmp);
|
|
|
+
|
|
|
+ delete[] rgbData;
|
|
|
+ return pixmap;
|
|
|
+ }
|
|
|
+ default:
|
|
|
+ qDebug() << "Unsupported image format!";
|
|
|
+ return QPixmap();
|
|
|
+ }
|
|
|
+
|
|
|
+ QImage qImg(imgData.data, imgData.width, imgData.height,
|
|
|
+ imgData.width * imgData.channel, qFormat);
|
|
|
+
|
|
|
+ return QPixmap::fromImage(qImg);
|
|
|
+}
|