#include "MappingUI.h" MappingUI::MappingUI(QWidget *parent) : QWidget(parent) { ui.setupUi(this); } MappingUI::~MappingUI() { QList items = m_scene.items(); foreach(QGraphicsItem *item, items) { m_scene.removeItem(item); //delete item; // 如果需要,可以删除项以释放内存 } m_allDieItem.clear(); m_ellipseItem.clear(); m_allLineItem.clear(); m_curDie = nullptr; } void MappingUI::SetRecipe(double waferDia, double dieWidth, double dieHeight, double baseDiePosX, double baseDiePosY, double markPoint1X, double markPoint1Y, double markPoint2X, double markPoint2Y, int areaXDirectionNum, int areaYDirectionNum) { m_maferRecipe.m_waferDia = waferDia; m_maferRecipe.m_dieWidth = dieWidth; m_maferRecipe.m_dieHeight = dieHeight; m_maferRecipe.m_baseDiePosX = baseDiePosX; m_maferRecipe.m_baseDiePosY = baseDiePosY; m_maferRecipe.m_markPoint1X = markPoint1X; m_maferRecipe.m_markPoint1Y = markPoint1Y; m_maferRecipe.m_markPoint2X = markPoint2X; m_maferRecipe.m_markPoint2Y = markPoint2Y; m_maferRecipe.areaXDirectionNum = areaXDirectionNum; m_maferRecipe.areaYDirectionNum = areaYDirectionNum; DrawMapping(); } void MappingUI::DrawMapping() { //计算每个区域X和Y方向die的数量 CountDieNumInArea(); double rectFirstPointX = m_maferRecipe.m_baseDiePosX/* - m_maferRecipe.m_dieWidth / 2.0*/; double rectFirstPointY = m_maferRecipe.m_baseDiePosY/* + m_maferRecipe.m_dieHeight / 2.0*/; std::shared_ptr rectObj = std::make_shared(rectFirstPointX, rectFirstPointY, m_maferRecipe.m_dieWidth, m_maferRecipe.m_dieHeight); SetDieAttr(rectObj, true, false, rectFirstPointX, rectFirstPointY); rectObj->setBrush(BASE_POINT_COLOR); m_allDieItem.push_back(rectObj); m_scene.addItem(rectObj.get()); std::shared_ptr EllipseObj = std::make_shared(0, 0, m_maferRecipe.m_waferDia, m_maferRecipe.m_waferDia); m_ellipseItem.push_back(EllipseObj); EllipseObj->setPen(QPen(RECT_COLOR)); EllipseObj->setPos(-rectObj->pos().x() - m_maferRecipe.m_waferDia / 2, -rectObj->pos().y() - m_maferRecipe.m_waferDia / 2); m_scene.addItem(EllipseObj.get()); //基准die往上延伸 for (int i = 0; i < MAX_EXTEND_NUM; i++) { double xCoord = rectFirstPointX; double yCoord = rectFirstPointY + i * m_maferRecipe.m_dieHeight; if (yCoord < -1 * m_maferRecipe.m_waferDia / 2) { break; } LeftExtend(xCoord, yCoord); bool isIncludeBaseDie = false; i == 0 ? isIncludeBaseDie = true : isIncludeBaseDie = false; RightExtend(xCoord, yCoord, isIncludeBaseDie); } //基准die往下延伸 for (int i = 1; i < MAX_EXTEND_NUM; i++) { double xCoord = rectFirstPointX; double yCoord = rectFirstPointY - i * m_maferRecipe.m_dieHeight; if (yCoord > m_maferRecipe.m_waferDia / 2) { break; } LeftExtend(xCoord, yCoord); RightExtend(xCoord, yCoord, false); } if (m_allDieItem.size() > 0) { m_areaStartX = m_allDieItem[0]->xCoord(); m_areaStartY = m_allDieItem[0]->yCoord(); } for (auto& iter : m_allDieItem) { if (iter->xCoord() < m_areaStartX) { m_areaStartX = iter->xCoord(); } if (iter->yCoord() > m_areaStartY) { m_areaStartY = iter->yCoord(); } } double resAreaStartX = m_areaStartX; double resAreaStartY = m_areaStartY * (-1); //绘制区域横线 for (int i = 0; i < 10; i++) { std::shared_ptr LineObj = std::make_shared(resAreaStartX, resAreaStartY + m_maferRecipe.m_dieHeight * m_readAreaYNum * i, resAreaStartX + m_maferRecipe.m_waferDia, resAreaStartY + m_maferRecipe.m_dieHeight * m_readAreaYNum * i); LineObj->setPen(QPen(AREA_LINE_COLOR)); m_allLineItem.push_back(LineObj); m_scene.addItem(LineObj.get()); } //绘制区域竖线 for (int i = 0; i < 10; i++) { std::shared_ptr LineObj = std::make_shared( resAreaStartX + m_maferRecipe.m_dieWidth * m_realAreaXNum * i, resAreaStartY, resAreaStartX + m_maferRecipe.m_dieWidth * m_realAreaXNum * i, resAreaStartY + m_maferRecipe.m_waferDia); LineObj->setPen(QPen(AREA_LINE_COLOR)); m_allLineItem.push_back(LineObj); m_scene.addItem(LineObj.get()); } ui.graphicsView->setScene(&m_scene); if (!m_isScale) { ui.graphicsView->scale(m_scaleFactor, m_scaleFactor); m_isScale = true; } } void MappingUI::SetWaferRecipe(MaferRecipe& maferRecipe) { } void MappingUI::SetLabelHide() { ui.horizontalLayout->removeWidget(ui.label); ui.horizontalLayout->removeWidget(ui.label_2); ui.label->hide(); ui.label_2->hide(); ui.verticalLayout->removeItem(ui.horizontalLayout); } void MappingUI::LeftExtend(double firstX, double firstY) { for (int i = 1; i < MAX_EXTEND_NUM; i++) { double rectFirstX = firstX - m_maferRecipe.m_dieWidth * i; double rectFirstY = firstY; if (JudgeIsInWafer(rectFirstX, rectFirstY)) { AddDieRect(rectFirstX, rectFirstY); } else { if (rectFirstX < -1 * m_maferRecipe.m_waferDia / 2) { break; } } } } void MappingUI::RightExtend(double firstX, double firstY, bool isIncludeCur) { int startPos = 0; isIncludeCur ? startPos = 1 : startPos = 0; for (int i = startPos; i < MAX_EXTEND_NUM; i++) { double rectFirstX = firstX + m_maferRecipe.m_dieWidth * i; double rectFirstY = firstY; if (JudgeIsInWafer(rectFirstX, rectFirstY)) { AddDieRect(rectFirstX, rectFirstY, "right"); } else { if (rectFirstX > m_maferRecipe.m_waferDia / 2) { break; } } } } void MappingUI::AddDieRect(double xCoord, double yCoord, std::string direction) { std::shared_ptr rectObj = std::make_shared( xCoord, yCoord, m_maferRecipe.m_dieWidth, m_maferRecipe.m_dieHeight); /*if (direction == "right") { xCoord += m_maferRecipe.m_dieWidth; }*/ rectObj->setPen(QPen(RECT_COLOR)); if (JudgeIsMark(xCoord, yCoord)) { SetDieAttr(rectObj, false, true, xCoord, yCoord); rectObj->setBrush(MARK_POINT_COLOR); } else { SetDieAttr(rectObj, false, false, xCoord, yCoord); } m_allDieItem.push_back(rectObj); m_scene.addItem(rectObj.get()); } void MappingUI::SetDieAttr(std::shared_ptr& dieObj, bool isBase, bool isMark, double xCoord, double yCoord) { connect(dieObj.get(), SIGNAL(signal_select(double,double)), this, SLOT(slot_UpdateAllDieStatus(double, double))); dieObj->Base(isBase); dieObj->Mark(isMark); dieObj->xCoord(xCoord); dieObj->yCoord(yCoord * -1); } bool MappingUI::JudgeIsInWafer(double xCoord, double yCoord) { if (abs(xCoord) > (m_maferRecipe.m_waferDia / 2.0) || abs(yCoord) > m_maferRecipe.m_waferDia / 2.0) { return false; } int judgeIsOk = 0; //矩形左上侧点 if (sqrt(std::pow(m_maferRecipe.m_waferDia / 2, 2) - std::pow(yCoord, 2)) > abs(xCoord) && sqrt(std::pow(m_maferRecipe.m_waferDia / 2, 2) - std::pow(xCoord, 2)) > abs(yCoord)) { judgeIsOk++; } //矩形左下侧点 if (sqrt(std::pow(m_maferRecipe.m_waferDia / 2, 2) - std::pow(yCoord + m_maferRecipe.m_dieHeight, 2)) > abs(xCoord) && sqrt(std::pow(m_maferRecipe.m_waferDia / 2, 2) - std::pow(xCoord, 2)) > abs(yCoord + m_maferRecipe.m_dieHeight)) { judgeIsOk++; } //矩形右上侧点 if (sqrt(std::pow(m_maferRecipe.m_waferDia / 2, 2) - std::pow(yCoord, 2)) > abs(xCoord + m_maferRecipe.m_dieWidth) && sqrt(std::pow(m_maferRecipe.m_waferDia / 2, 2) - std::pow(xCoord + m_maferRecipe.m_dieWidth, 2)) > abs(yCoord)) { judgeIsOk++; } //矩形右下侧点 if (sqrt(std::pow(m_maferRecipe.m_waferDia / 2, 2) - std::pow(yCoord + +m_maferRecipe.m_dieHeight, 2)) > abs(xCoord + m_maferRecipe.m_dieWidth) && sqrt(std::pow(m_maferRecipe.m_waferDia / 2, 2) - std::pow(xCoord + m_maferRecipe.m_dieWidth, 2)) > abs(yCoord + m_maferRecipe.m_dieHeight)) { judgeIsOk++; } if (4 == judgeIsOk) { return true; } return false; } bool MappingUI::JudgeIsMark(double xCoord, double yCoord) { //判断mark1点 if (xCoord - JUDGE_DECIMAL <= m_maferRecipe.m_markPoint1X && xCoord + JUDGE_DECIMAL >= m_maferRecipe.m_markPoint1X && yCoord - JUDGE_DECIMAL <= m_maferRecipe.m_markPoint1Y && yCoord + JUDGE_DECIMAL >= m_maferRecipe.m_markPoint1Y) { return true; } //判断mark2点 if (xCoord - JUDGE_DECIMAL <= m_maferRecipe.m_markPoint2X && xCoord + JUDGE_DECIMAL >= m_maferRecipe.m_markPoint2X && yCoord - JUDGE_DECIMAL <= m_maferRecipe.m_markPoint2Y && yCoord + JUDGE_DECIMAL >= m_maferRecipe.m_markPoint2Y) { return true; } return false; } void MappingUI::CountDieNumInArea() { //计算每个区域X方向和Y方向一共有多少个die if (m_maferRecipe.m_dieHeight < JUDGE_DECIMAL || m_maferRecipe.m_dieWidth < JUDGE_DECIMAL || m_maferRecipe.areaXDirectionNum <= 0 || m_maferRecipe.areaYDirectionNum <= 0) { return; } double XDirectionNum = m_maferRecipe.m_waferDia / m_maferRecipe.m_dieWidth; double YDirectionNum = m_maferRecipe.m_waferDia / m_maferRecipe.m_dieHeight; double areaDieNumX = XDirectionNum / m_maferRecipe.areaXDirectionNum; double areaDieNumY = YDirectionNum / m_maferRecipe.areaYDirectionNum; m_realAreaXNum = floor(areaDieNumX + 1.0); m_readAreaYNum = floor(areaDieNumY + 1.0); } void MappingUI::wheelEvent(QWheelEvent *event) { ui.graphicsView->resetMatrix(); // 滚轮向上放大,向下缩小 qDebug() << event->angleDelta().y(); if (event->angleDelta().y() > 0) { if (m_scaleFactor < 10) { m_scaleFactor *= 1.05; // 放大 } } else { if (m_scaleFactor > 2) { m_scaleFactor /= 1.05; // 缩小 } } qDebug() << event->angleDelta().y()<< " "<< m_scaleFactor; ui.graphicsView->scale(m_scaleFactor, m_scaleFactor); } void MappingUI::mousePressEvent(QMouseEvent *event) { /*if (event->button() == Qt::LeftButton) { for (auto& iter : m_allItem) { if (iter->Base() != true && iter->Mark() != true) { iter->setBrush(Qt::NoBrush); } } }*/ } void MappingUI::slot_UpdateAllDieStatus(double xCoord, double yCoord) { for (auto& iter : m_allDieItem) { if (iter->Base() != true && iter->Mark() != true) { if (!(xCoord - JUDGE_DECIMAL <= iter->xCoord() && xCoord + JUDGE_DECIMAL >= iter->xCoord() && yCoord - JUDGE_DECIMAL <= iter->yCoord() && yCoord + JUDGE_DECIMAL >= iter->yCoord())) { iter->Select(false); iter->setBrush(Qt::NoBrush); } else { //更新die相关信息 m_curDieCoordX = xCoord; m_curDieCoordY = yCoord; m_curAreaIdX = iter->AreaIdX(); m_curAreaIdY = iter->AreaIdY(); m_curDie = iter; } } } QString str = QString::number(xCoord) + "," + QString::number(yCoord); ui.label->setText(str); }