123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837 |
- #include "Bond.h"
- #include <QDebug>
- #include <QPair>
- #include <QSet>
- #include <QMap>
- #include <cmath>
- Bond::Bond(QWidget* parent)
- : QWidget(parent)
- {
-
- }
- void Bond::UpdataGenerateTestData()
- {
-
- int pcbIndex = 0;
- int dieIndex = 0;
- std::srand(std::time(nullptr));
- for (int pcbRow = 0; pcbRow < 2; ++pcbRow) {
- for (int pcbCol = 0; pcbCol < 2; ++pcbCol) {
- int iPcbMatId = ++pcbIndex;
- pcbDimensions[iPcbMatId] = qMakePair(2, 2);
- int ptIndex = 0;
- for (int ptRow = 0; ptRow < 2; ++ptRow) {
- for (int ptCol = 0; ptCol < 2; ++ptCol) {
- int iPtMatId = ++ptIndex;
- ptDimensions[iPcbMatId][iPtMatId] = qMakePair(2, 3);
- for (int dieRow = 0; dieRow < 2; ++dieRow) {
- for (int dieCol = 0; dieCol < 3; ++dieCol) {
- ns_mat::POINT_INFO_STRUCT point;
- point.stIndex.iPcbMatId = iPcbMatId;
- point.stIndex.iPtMatId = iPtMatId;
- point.stIndex.iPcbRow = pcbRow;
- point.stIndex.iPcbCol = pcbCol;
- point.stIndex.iPtRow = dieRow;
- point.stIndex.iPtCol = dieCol;
- point.stIndex.iIndex = ++dieIndex;
- point.stBondStatus.bDieStatus = static_cast<ns_mat::DIE_STATUS>(std::rand() % 7);
- bondData.append(point);
- }
- }
- }
- }
- }
- }
- }
- void Bond::initFrom(QWidget* parent) {
- m_pScene = new QGraphicsScene(parent);
- m_pView = new BondGraphicsView(m_pScene);
- m_pView->setCViewInterface(m_pCViewInterface);
- int width = parent->width();
- int height = parent->height();
- double maxWidth = maxPoint.x() - minPoint.x();
- double maxHeight = maxPoint.y() - minPoint.y();
- double ratio;
- if (maxHeight > maxWidth) {
- ratio = maxHeight / (width - 100);
- }
- else {
- ratio = maxWidth / (width - 100);
- }
-
- double dieWidth = 20000;
- double dieHeight = 20000;
- QFont matrixFont;
- double matrixFontSize = qMin(dieWidth/ratio, dieHeight / ratio)*0.1;
- matrixFont.setPointSizeF(matrixFontSize);
- for (int i = 0; i < bondData.size(); ++i) {
-
-
- double dieWidthr = dieWidth / ratio;
- double dieHeightr = dieHeight / ratio;
- double diex, diey;
- diex = (bondData[i].stBondStatus.stAlnBondPosition.x - minPoint.x() + dieWidth) / ratio;
- diey = (bondData[i].stBondStatus.stAlnBondPosition.y - minPoint.y() + dieHeight) / ratio;
-
- QRectF dieRect(
- diex,
- diey,
- dieWidthr,
- dieHeightr
- );
- BondItem* dieItem = new BondItem(bondData[i]);
- dieItem->setRect(dieRect);
- dieItem->setZValue(1.0);
- m_pScene->addItem(dieItem);
-
- QGraphicsTextItem* dieText = new QGraphicsTextItem(dieItem);
- dieText->setPlainText("PT" + QString::number(bondData[i].stIndex.iIndex));
- double dieFontSize = qMin(dieWidthr, dieHeightr) * 0.2;
- QFont font;
- font.setPointSizeF(dieFontSize);
- dieText->setFont(font);
- dieText->setPos(dieRect.center() - QPointF(dieText->boundingRect().width() / 2,
- dieText->boundingRect().height() / 2));
- }
-
- QPen ptpen(Qt::blue, 0.5);
- QPen pcbpen(Qt::red, 0.5);
- QPen subpen(Qt::black, 0.5);
-
- POINT_INFO_STRUCT maxPcbPoint = m_vptMaxPoints[0];
- POINT_INFO_STRUCT minPcbPoint = m_vptMaxPoints[0];
- int pcbmatx, pcbmaty, pcbmatWidth, pcbmatHeight;
- QVector<POINT_INFO_STRUCT> maxSubPoints;
- QVector<POINT_INFO_STRUCT> minSubPoints;
- for (int i = 0;i < m_vptMaxPoints.size();i++) {
- if (minPcbPoint.stIndex.iPcbRow != m_vptMinPoints[i].stIndex.iPcbRow || minPcbPoint.stIndex.iPcbCol != m_vptMinPoints[i].stIndex.iPcbCol) {
-
-
- pcbmatx = (minPcbPoint.stBondStatus.stAlnBondPosition.x - minPoint.x() + 0.4 * dieWidth) / ratio;
- pcbmaty = (minPcbPoint.stBondStatus.stAlnBondPosition.y - minPoint.y() + 0.4 * dieHeight) / ratio;
- pcbmatWidth = (maxPcbPoint.stBondStatus.stAlnBondPosition.x - minPcbPoint.stBondStatus.stAlnBondPosition.x + dieWidth * 2.2) / ratio;
- pcbmatHeight = (maxPcbPoint.stBondStatus.stAlnBondPosition.y - minPcbPoint.stBondStatus.stAlnBondPosition.y + dieHeight * 2.2) / ratio;
- QRectF pcbRect(
- pcbmatx,
- pcbmaty,
- pcbmatWidth,
- pcbmatHeight
-
- );
-
- QGraphicsRectItem* pcbItem = new QGraphicsRectItem(pcbRect);
- pcbItem->setPen(pcbpen);
-
- m_pScene->addItem(pcbItem);
-
- QRectF pcbTextRect(
- pcbmatx,
- pcbmaty,
- dieWidth / ratio * 0.6,
- dieHeight / ratio * 0.2
- );
- QGraphicsRectItem* pcbTextItem = new QGraphicsRectItem(pcbTextRect);
- pcbTextItem->setPen(Qt::NoPen);
- m_pScene->addItem(pcbTextItem);
- QGraphicsTextItem* pcbText = new QGraphicsTextItem(pcbTextItem);
- pcbText->setPlainText(QString(QString(tr("Pcb%1*%2")).arg(minPcbPoint.stIndex.iPcbRow).arg(minPcbPoint.stIndex.iPcbCol)));
- pcbText->setFont(matrixFont);
-
- pcbText->setPos(pcbTextRect.center() - QPointF(pcbText->boundingRect().width() / 2,
- pcbText->boundingRect().height() / 2));
- pcbText->setFont(matrixFont);
- maxSubPoints.append(maxPcbPoint);
- minSubPoints.append(minPcbPoint);
- maxPcbPoint = m_vptMaxPoints[i];
- minPcbPoint = m_vptMinPoints[i];
- }
- else {
- if (m_vptMaxPoints[i].stBondStatus.stAlnBondPosition.x > maxPcbPoint.stBondStatus.stAlnBondPosition.x)
- maxPcbPoint = m_vptMaxPoints[i];
- if (m_vptMinPoints[i].stBondStatus.stAlnBondPosition.x < minPcbPoint.stBondStatus.stAlnBondPosition.x)
- minPcbPoint = m_vptMinPoints[i];
- if (m_vptMaxPoints[i].stBondStatus.stAlnBondPosition.y > maxPcbPoint.stBondStatus.stAlnBondPosition.y)
- maxPcbPoint = m_vptMaxPoints[i];
- if (m_vptMinPoints[i].stBondStatus.stAlnBondPosition.y < minPcbPoint.stBondStatus.stAlnBondPosition.y)
- minPcbPoint = m_vptMinPoints[i];
- }
- int ptmatx, ptmaty, ptmatWidth, ptmatHeight;
- ptmatx = (m_vptMinPoints[i].stBondStatus.stAlnBondPosition.x - minPoint.x() + 0.7 * dieWidth) / ratio ;
- ptmaty = (m_vptMinPoints[i].stBondStatus.stAlnBondPosition.y - minPoint.y() + 0.7 * dieHeight) / ratio ;
- ptmatWidth = (m_vptMaxPoints[i].stBondStatus.stAlnBondPosition.x - m_vptMinPoints[i].stBondStatus.stAlnBondPosition.x +dieWidth*1.6)/ratio;
- ptmatHeight = (m_vptMaxPoints[i].stBondStatus.stAlnBondPosition.y - m_vptMinPoints[i].stBondStatus.stAlnBondPosition.y + dieHeight*1.6) / ratio;
- QRectF ptRect(
- ptmatx,
- ptmaty,
- ptmatWidth,
- ptmatHeight
- );
-
-
-
- QGraphicsRectItem* ptItem = new QGraphicsRectItem(ptRect);
- ptItem->setPen(ptpen);
-
- m_pScene->addItem(ptItem);
-
- QRectF ptTextRect(
- ptmatx,
- ptmaty,
- dieWidth/ratio* 0.6,
- dieHeight / ratio * 0.2
- );
- QGraphicsRectItem* ptTextItem = new QGraphicsRectItem(ptTextRect);
- ptTextItem->setPen(Qt::NoPen);
- m_pScene->addItem(ptTextItem);
- QGraphicsTextItem* ptText = new QGraphicsTextItem(ptTextItem);
- ptText->setPlainText(QString(tr("PtMat%1")).arg(m_vptMinPoints[i].stIndex.iPtMatId));
- ptText->setFont(matrixFont);
-
- ptText->setPos(ptTextRect.center()- QPointF(ptText->boundingRect().width() / 2,
- ptText->boundingRect().height() / 2));
-
- }
- pcbmatx = (minPcbPoint.stBondStatus.stAlnBondPosition.x - minPoint.x() + 0.4 * dieWidth) / ratio;
- pcbmaty = (minPcbPoint.stBondStatus.stAlnBondPosition.y - minPoint.y() + 0.4 * dieHeight) / ratio;
- pcbmatWidth = (maxPcbPoint.stBondStatus.stAlnBondPosition.x - minPcbPoint.stBondStatus.stAlnBondPosition.x + dieWidth * 2.2) / ratio;
- pcbmatHeight = (maxPcbPoint.stBondStatus.stAlnBondPosition.y - minPcbPoint.stBondStatus.stAlnBondPosition.y + dieHeight * 2.2) / ratio;
- QRectF pcbRect(
- pcbmatx,
- pcbmaty,
- pcbmatWidth,
- pcbmatHeight
- );
-
- QGraphicsRectItem* pcbItem = new QGraphicsRectItem(pcbRect);
- pcbItem->setPen(pcbpen);
-
- m_pScene->addItem(pcbItem);
-
- QRectF pcbTextRect(
- pcbmatx,
- pcbmaty,
- dieWidth / ratio * 0.6,
- dieHeight / ratio * 0.2
- );
- QGraphicsRectItem* pcbTextItem = new QGraphicsRectItem(pcbTextRect);
- pcbTextItem->setPen(Qt::NoPen);
- m_pScene->addItem(pcbTextItem);
- QGraphicsTextItem* pcbText = new QGraphicsTextItem(pcbTextItem);
- pcbText->setPlainText(QString(QString(tr("Pcb%1*%2")).arg(minPcbPoint.stIndex.iPcbRow).arg(minPcbPoint.stIndex.iPcbCol)));
- pcbText->setFont(matrixFont);
-
- pcbText->setPos(pcbTextRect.center() - QPointF(pcbText->boundingRect().width() / 2,
- pcbText->boundingRect().height() / 2));
- pcbText->setFont(matrixFont);
-
- maxSubPoints.append(maxPcbPoint);
- minSubPoints.append(minPcbPoint);
- POINT_INFO_STRUCT maxSubPoint = maxSubPoints[0];
- POINT_INFO_STRUCT minSubPoint = minSubPoints[0];
- int submatx, submaty, submatWidth, submatHeight;
- for (int i = 0;i < maxSubPoints.size();i++) {
- if (maxSubPoint.stIndex.iPcbMatId != maxSubPoints[i].stIndex.iPcbMatId) {
- submatx = (minSubPoint.stBondStatus.stAlnBondPosition.x - minPoint.x() + 0.1 * dieWidth) / ratio;
- submaty = (minSubPoint.stBondStatus.stAlnBondPosition.y - minPoint.y() + 0.1 * dieHeight) / ratio;
- submatWidth = (maxSubPoint.stBondStatus.stAlnBondPosition.x - minSubPoint.stBondStatus.stAlnBondPosition.x + dieWidth * 2.8) / ratio;
- submatHeight = (maxSubPoint.stBondStatus.stAlnBondPosition.y - minSubPoint.stBondStatus.stAlnBondPosition.y + dieHeight * 2.8) / ratio;
- QRectF subRect(
- submatx,
- submaty,
- submatWidth,
- submatHeight
- );
-
- QGraphicsRectItem* subItem = new QGraphicsRectItem(subRect);
- subItem->setPen(subpen);
-
- m_pScene->addItem(subItem);
-
- QRectF subTextRect(
- submatx,
- submaty,
- dieWidth / ratio * 0.6,
- dieHeight / ratio * 0.2
- );
- QGraphicsRectItem* subTextItem = new QGraphicsRectItem(subTextRect);
- subTextItem->setPen(Qt::NoPen);
- m_pScene->addItem(subTextItem);
- QGraphicsTextItem* subText = new QGraphicsTextItem(subTextItem);
- subText->setPlainText(QString(QString(tr("Sub%1")).arg(minSubPoint.stIndex.iPcbMatId)));
- subText->setFont(matrixFont);
-
- subText->setPos(subTextRect.center() - QPointF(subText->boundingRect().width() / 2,
- pcbText->boundingRect().height() / 2));
- subText->setFont(matrixFont);
- }
- else {
- if (maxSubPoints[i].stBondStatus.stAlnBondPosition.x > maxSubPoint.stBondStatus.stAlnBondPosition.x)
- maxSubPoint = maxSubPoints[i];
- if (minSubPoints[i].stBondStatus.stAlnBondPosition.x < minSubPoint.stBondStatus.stAlnBondPosition.x)
- minPcbPoint = minSubPoints[i];
- if (maxSubPoints[i].stBondStatus.stAlnBondPosition.y > maxSubPoint.stBondStatus.stAlnBondPosition.y)
- maxSubPoint = maxSubPoints[i];
- if (minSubPoints[i].stBondStatus.stAlnBondPosition.y < minSubPoint.stBondStatus.stAlnBondPosition.y)
- minSubPoint = minSubPoints[i];
- }
- }
- submatx = (minSubPoint.stBondStatus.stAlnBondPosition.x - minPoint.x() + 0.1 * dieWidth) / ratio;
- submaty = (minSubPoint.stBondStatus.stAlnBondPosition.y - minPoint.y() + 0.1 * dieHeight) / ratio;
- submatWidth = (maxSubPoint.stBondStatus.stAlnBondPosition.x - minSubPoint.stBondStatus.stAlnBondPosition.x + dieWidth * 2.8) / ratio;
- submatHeight = (maxSubPoint.stBondStatus.stAlnBondPosition.y - minSubPoint.stBondStatus.stAlnBondPosition.y + dieHeight * 2.8) / ratio;
- QRectF subRect(
- submatx,
- submaty,
- submatWidth,
- submatHeight
- );
-
- QGraphicsRectItem* subItem = new QGraphicsRectItem(subRect);
-
- subItem->setPen(subpen);
-
-
- m_pScene->addItem(subItem);
-
- QRectF subTextRect(
- submatx,
- submaty,
- dieWidth / ratio * 0.6,
- dieHeight / ratio * 0.2
- );
- QGraphicsRectItem* subTextItem = new QGraphicsRectItem(subTextRect);
- subTextItem->setPen(Qt::NoPen);
- m_pScene->addItem(subTextItem);
- QGraphicsTextItem* subText = new QGraphicsTextItem(subTextItem);
- subText->setPlainText(QString(QString(tr("Sub%1")).arg(minSubPoint.stIndex.iPcbMatId)));
- subText->setFont(matrixFont);
-
- subText->setPos(subTextRect.center() - QPointF(subText->boundingRect().width() / 2,
- pcbText->boundingRect().height() / 2));
- subText->setFont(matrixFont);
- m_pView->setScene(m_pScene);
- m_pView->resize(width, height);
-
- globalPixmap = QPixmap(width, height);
- globalPixmap.fill(Qt::white);
- QPixmap originalPixmap = QPixmap::grabWidget(m_pView);
-
- QSize targetSize(width, height);
-
- QPixmap scaledPixmap = originalPixmap.scaled(
- targetSize,
- Qt::IgnoreAspectRatio,
- Qt::SmoothTransformation
- );
- globalPixmap = scaledPixmap;
-
- }
- void Bond::paintInitFrom(QWidget* parent) {
-
- }
- QColor Bond::getColorByStatus() {
- ns_mat::DIE_STATUS status;
-
- switch (status) {
-
-
-
- case ns_mat::DIE_STATUS::TRANSFER_PICK_DONE: return QColor(255, 165, 0);
- case ns_mat::DIE_STATUS::LOOKUP_CALIB_DONE: return QColor(0, 150, 255);
- case ns_mat::DIE_STATUS::BOND_DONE: return QColor(144, 238, 144);
- case ns_mat::DIE_STATUS::BOND_DEL: return QColor(255, 50, 50);
- default: return Qt::gray;
- }
- }
- void Bond::UpdataVal(std::vector<ns_mat::POINT_INFO_STRUCT>& stPointInfo)
- {
- maxPoint = QPointF(stPointInfo[0].stBondStatus.stAlnBondPosition.x, stPointInfo[0].stBondStatus.stAlnBondPosition.y);
- minPoint = QPointF(stPointInfo[0].stBondStatus.stAlnBondPosition.x, stPointInfo[0].stBondStatus.stAlnBondPosition.y);
- QVector<POINT_INFO_STRUCT> ptMatrix;
- QMap<int, QMap<int, QVector<POINT_INFO_STRUCT>>> pcbMatrix;
- UINT iPcbMatId = stPointInfo[0].stIndex.iPcbMatId;
- UINT iPtId = stPointInfo[0].stIndex.iPtMatId;
- POINT_INFO_STRUCT ptMinPoint = stPointInfo[0];
- POINT_INFO_STRUCT ptMaxPoint = stPointInfo[0];
- QMap<int, QPointF> ptMinPointmap;
- QMap<int, QPointF> ptMaxPointmap;
- QMap<int, QMap<int, QPointF>> pcbMinPointmap;
- QMap<int, QMap<int, QPointF>> pcbMaxPointmap;
- int pcbRow = stPointInfo[0].stIndex.iPcbRow;
- int pcbCol = stPointInfo[0].stIndex.iPcbCol;
- int pcbId = 1;
- for (auto&a: stPointInfo)
- {
- bondData.append(a);
- if (a.stIndex.iPtMatId == iPtId) {
- ptMatrix.append(a);
- }
- else {
- m_vptMaxPoints.append(ptMaxPoint);
- m_vptMinPoints.append(ptMinPoint);
- iPtId = a.stIndex.iPtMatId;
- ptMaxPoint = a;
- ptMinPoint = a;
- }
-
- if (a.stBondStatus.stAlnBondPosition.x > maxPoint.x())
- maxPoint.setX(a.stBondStatus.stAlnBondPosition.x);
- if(a.stBondStatus.stAlnBondPosition.x < minPoint.x())
- minPoint.setX(a.stBondStatus.stAlnBondPosition.x);
- if (a.stBondStatus.stAlnBondPosition.y > maxPoint.y())
- maxPoint.setY(a.stBondStatus.stAlnBondPosition.y);
- if (a.stBondStatus.stAlnBondPosition.y < minPoint.y())
- minPoint.setY(a.stBondStatus.stAlnBondPosition.y);
-
-
- if (a.stBondStatus.stAlnBondPosition.x > ptMaxPoint.stBondStatus.stAlnBondPosition.x)
- ptMaxPoint = a;
- if (a.stBondStatus.stAlnBondPosition.x < ptMinPoint.stBondStatus.stAlnBondPosition.x)
- ptMinPoint = a;
- if (a.stBondStatus.stAlnBondPosition.y > ptMaxPoint.stBondStatus.stAlnBondPosition.y)
- ptMaxPoint = a;
- if (a.stBondStatus.stAlnBondPosition.y < ptMinPoint.stBondStatus.stAlnBondPosition.y)
- ptMinPoint = a;
-
-
- qDebug() << a.stBondStatus.stAlnBondPosition.x << " " << a.stBondStatus.stAlnBondPosition.y;
-
- }
- m_vptMaxPoints.append(ptMaxPoint);
- m_vptMinPoints.append(ptMinPoint);
-
-
-
-
-
-
-
- }
- QPixmap Bond::getGlobalPixmap() const {
- return globalPixmap;
- }
- void Bond::setBondInfo(ns_module::CViewInterface* CViewInterface) {
- m_pCViewInterface = CViewInterface;
- }
|