You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

588 lines
16 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include "DieUI.h"
DieUI::DieUI(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
//connect(ui.pushButton_autoId, SIGNAL(clicked()), this, SLOT(slot_autoId()));
//connect(ui.pushButton_addText, SIGNAL(clicked()), this, SLOT(slot_addText()));
//connect(ui.pushButton_deleteChar, SIGNAL(clicked()), this, SLOT(slot_deleteText()));
connect(ui.pushButton_addAllChar, SIGNAL(clicked()), this, SLOT(slot_addAllChar()));
connect(ui.pushButton_modifyText, SIGNAL(clicked()), this, SLOT(slot_modifyText()));
connect(ui.pushButton_cancelAllSelectChar, SIGNAL(clicked()), this, SLOT(slot_cancelAllSelectChar()));
connect(ui.pushButton_topAdjustPos, SIGNAL(clicked()), this, SLOT(slot_topAdjustPos()));
connect(ui.pushButton_downAdjustPos, SIGNAL(clicked()), this, SLOT(slot_downAdjustPos()));
connect(ui.pushButton_leftAdjustPos, SIGNAL(clicked()), this, SLOT(slot_leftAdjustPos()));
connect(ui.pushButton_rightAdjustPos, SIGNAL(clicked()), this, SLOT(slot_rightAdjustPos()));
// 创建正则表达式,允许数字和小数点,但不能以小数点开头
QRegExp regExp("[0-9]*\\.?[0-9]+");
QValidator *validator = new QRegExpValidator(regExp, this);
ui.lineEdit_charWidth->setValidator(validator);
ui.lineEdit_charHeight->setValidator(validator);
ui.lineEdit_charX->setValidator(validator);
ui.lineEdit_charY->setValidator(validator);
QRegExp regExp3("[a-zA-Z0-9_]{1}"); //只是允许输入一个字符
/*ui.lineEdit_charContent->setValidator(new QRegExpValidator(regExp2, ui.lineEdit_charContent));
QValidator *validator = new QRegExpValidator(regExp3, this);*/
QValidator *validator2 = new QRegExpValidator(regExp3, this);
ui.lineEdit_charContent->setValidator(validator2);
m_pen.setColor(RECT_COLOR);
m_pen.setWidth(4);
ui.comboBox_2->clear();
QStringList resList;
resList << "0.001" << "0.005" << "0.010" << "0.020";
ui.comboBox_2->addItems(resList);
ui.comboBox_2->setCurrentIndex(2);
}
DieUI::~DieUI()
{
}
void DieUI::slot_dealMouseEvent(QPointF p1, QPointF p2)
{
if (m_drawType == LINE)
{
//AddLine(p1.x(), p1.y(), p2.x(), p2.y());
}
else if (m_drawType == RECT)
{
AddRect(p1.x(), p1.y(), p2.x(), p2.y());
}
else if (m_drawType == CIRCLE)
{
//AddCircle(p1.x(), p1.y(), p2.x(), p2.y());
}
else if (m_drawType == TEXT)
{
//AddText(p1.x(), p1.y());
}
}
void DieUI::slot_dealSelect(int id)
{
m_curSelectId = id;
for (auto& iter : m_textItemVec)
{
if (iter->m_id == id)
{
ui.lineEdit_uniqueId->setText(QString::number(iter->m_id));
//更新界面显示
ui.lineEdit_charContent->setText(iter->charContent);
ui.lineEdit_charX->setText(QString::number(iter->charPosX));
ui.lineEdit_charY->setText(QString::number(iter->charPosY));
ui.lineEdit_charWidth->setText(QString::number(iter->charWidth));
ui.lineEdit_charHeight->setText(QString::number(iter->charHeight));
}
}
}
void DieUI::AddLine(int id, double x1, double y1, double x2, double y2)
{
//std::shared_ptr<MyQGraphicsLineItem> lineObj = std::make_shared<MyQGraphicsLineItem>(x1 - x1, y1 - y1, x2 - x1, y2 - y1);
std::shared_ptr<MyQGraphicsLineItem> lineObj = std::make_shared<MyQGraphicsLineItem>();
connect(lineObj.get(), SIGNAL(signal_select(int)), this, SLOT(slot_dealSelect(int)));
lineObj->SetLineCoord(x1, y1, x2, y2, true);
lineObj->Id(id);
lineObj->setPen(m_pen);
m_lineItemVec.push_back(lineObj);
m_scene.addItem(lineObj.get());
}
void DieUI::AddRect(double x1, double y1, double x2, double y2)
{
if (x1 >= x2 || y1 >= y2)
{
return;
}
double width = abs(x2 - x1);
double height = abs(y2 - y1);
std::shared_ptr<MyDrawRectItem> RectObj = std::make_shared<MyDrawRectItem>(0, 0, width, height);
connect(RectObj.get(), SIGNAL(signal_select(int)), this, SLOT(slot_dealSelect(int)));
RectObj->SetDrawRectAttr(x1, y1, width, height);
RectObj->setPen(m_pen);
m_rectItemVec.push_back(RectObj);
m_scene.addItem(RectObj.get());
}
void DieUI::AddCircle(int id, double x1, double y1, double diameter)
{
std::shared_ptr<MyQGraphicsEllipseItem> ciecleObj = std::make_shared<MyQGraphicsEllipseItem>(0, 0, diameter, diameter);
connect(ciecleObj.get(), SIGNAL(signal_select(int)), this, SLOT(slot_dealSelect(int)));
ciecleObj->SetCircleAttr(x1, y1, diameter, diameter);
ciecleObj->Id(id);
ciecleObj->setPen(m_pen);
m_circleItemVec.push_back(ciecleObj);
m_scene.addItem(ciecleObj.get());
}
void DieUI::AddText(double x1, double y1)
{
/*QString testA = "A";
std::shared_ptr<MyQGraphicsTextItem> textObj = std::make_shared<MyQGraphicsTextItem>(testA);
connect(textObj.get(), SIGNAL(signal_select(int)), this, SLOT(slot_dealSelect(int)));
textObj->SetTextAttr(x1, y1);
textObj->setDefaultTextColor(RECT_COLOR);
m_textItemVec.push_back(textObj);
m_scene.addItem(textObj.get());*/
}
void DieUI::commonAddText(int charId)
{
if (!JudgeIdIsNormal())
{
return;
}
/*if (!(ui.lineEdit_charWidth->text().toDouble() >= 0.08 && ui.lineEdit_charWidth->text().toDouble() <= m_dieWidth &&
ui.lineEdit_charHeight->text().toDouble() >= 0.12 && ui.lineEdit_charHeight->text().toDouble() <= m_dieHeight))
{
QMessageBox::StandardButton button = QMessageBox::information(
nullptr,
QString::fromLocal8Bit("提示"),
QString::fromLocal8Bit("请输入字高≥0.12mm,字宽≥0.08mm,并且都小于die宽高的数据"),
QMessageBox::Yes,
QMessageBox::NoButton);
ui.lineEdit_charWidth->clear();
ui.lineEdit_charHeight->clear();
return;
}*/
/*if (!(ui.lineEdit_charX->text().toDouble() >= ZERO && ui.lineEdit_charX->text().toDouble() <= m_dieWidth &&
ui.lineEdit_charY->text().toDouble() >= 0.12 && ui.lineEdit_charY->text().toDouble() <= m_dieHeight))
{
QMessageBox::StandardButton button = QMessageBox::information(
nullptr,
QString::fromLocal8Bit("提示"),
QString::fromLocal8Bit("输入的基准点必须大于等于零且小于等于die的宽高"),
QMessageBox::Yes,
QMessageBox::NoButton);
ui.lineEdit_charX->clear();
ui.lineEdit_charY->clear();
return;
}*/
QString testA = ui.lineEdit_charContent->text();
std::shared_ptr<MyQGraphicsTextItem> textObj = std::make_shared<MyQGraphicsTextItem>(testA);
connect(textObj.get(), SIGNAL(signal_select(int)), this, SLOT(slot_dealSelect(int)));
textObj->SetTextAttr(ui.lineEdit_charX->text().toDouble() * DIE_SCALE, ui.lineEdit_charY->text().toDouble() * DIE_SCALE);
textObj->setDefaultTextColor(RECT_COLOR);
textObj->m_id = charId;
textObj->charPosX = ui.lineEdit_charX->text().toDouble();
textObj->charPosY = ui.lineEdit_charY->text().toDouble()/* * (-1.0)*/;
textObj->charWidth = ui.lineEdit_charWidth->text().toDouble();
textObj->charHeight = ui.lineEdit_charHeight->text().toDouble();
textObj->charContent = testA;
//200字体大概等于400宽度
QFont font("Arial", ui.lineEdit_charHeight->text().toDouble() * DIE_SCALE / 2, QFont::Bold); // 字体名称,大小,粗细
textObj->setFont(font);
m_textItemVec.push_back(textObj);
m_scene.addItem(textObj.get());
}
bool DieUI::JudgeIdIsNormal()
{
bool flag = true;
int id = ui.lineEdit_uniqueId->text().toInt();
if (ui.lineEdit_uniqueId->text().size() <= 0)
{
flag = false;
}
for (auto& iter : m_lineItemVec)
{
if (iter->Id() == id)
{
flag = false;
}
}
for (auto& iter : m_rectItemVec)
{
if (iter->Id() == id)
{
flag = false;
}
}
for (auto& iter : m_circleItemVec)
{
if (iter->Id() == id)
{
flag = false;
}
}
for (auto& iter : m_textItemVec)
{
if (iter->Id() == id)
{
flag = false;
}
}
if (!flag)
{
QMessageBox::StandardButton button = QMessageBox::information(
nullptr,
QString::fromLocal8Bit("提示"),
QString::fromLocal8Bit("请点击自动生成ID"),
QMessageBox::Yes,
QMessageBox::NoButton);
return false;
}
return true;
}
void DieUI::CommonAdjustCharPos(int flag, double dis)
{
for (auto& iter : m_textItemVec)
{
if (iter->m_textItemIsSelect)
{
if (flag == 0)
{
iter->charPosY -= dis;
}
if (flag == 1)
{
iter->charPosY += dis;
}
if (flag == 2)
{
iter->charPosX -= dis;
}
if (flag == 3)
{
iter->charPosX += dis;
}
iter->SetTextAttr(iter->charPosX * DIE_SCALE, iter->charPosY * DIE_SCALE);
m_scene.update();
}
}
}
void DieUI::slot_addText()
{
commonAddText(ui.lineEdit_uniqueId->text().toInt());
}
void DieUI::slot_deleteText()
{
for (auto& iter = m_textItemVec.begin(); iter != m_textItemVec.end(); iter++)
{
if ((*iter)->m_id == m_curSelectId)
{
m_scene.removeItem((*iter).get());
m_textItemVec.erase(iter);
break;
}
}
}
void DieUI::slot_modifyText()
{
if (ui.lineEdit_uniqueId->text().size() < 1)
{
return;
}
int id = ui.lineEdit_uniqueId->text().toInt();
for (auto& iter = m_textItemVec.begin(); iter != m_textItemVec.end(); iter++)
{
if ((*iter)->m_id == id)
{
(*iter)->charPosX = ui.lineEdit_charX->text().toDouble();
(*iter)->charPosY = ui.lineEdit_charY->text().toDouble();
(*iter)->charWidth = ui.lineEdit_charWidth->text().toDouble();
(*iter)->charHeight = ui.lineEdit_charHeight->text().toDouble();
(*iter)->SetTextAttr((*iter)->charPosX * DIE_SCALE, (*iter)->charPosY * DIE_SCALE);
m_scene.update();
}
}
}
void DieUI::slot_addAllChar()
{
for (auto& iter = m_textItemVec.begin(); iter != m_textItemVec.end(); iter++)
{
m_scene.removeItem((*iter).get());
}
m_textItemVec.clear();
int normalReplaceStrNum = ui.lineEdit_normalReplaceStr->text().toInt();
int serialNumSize = ui.lineEdit_serialReplaceStr->text().toInt();
int startIndex = 0;
for (char c = 'A'; c <= 'Z'; ++c) {
if (startIndex >= normalReplaceStrNum)
{
break;
}
QString testA = QString(QChar(c));
std::shared_ptr<MyQGraphicsTextItem> textObj = std::make_shared<MyQGraphicsTextItem>(testA);
textObj->m_id = startIndex;
textObj->charPosX = 0.5 + startIndex * 0.2;
textObj->charPosY = 0.5;
textObj->charWidth = 0.09;
textObj->charHeight = 0.12;
textObj->charContent = testA;
connect(textObj.get(), SIGNAL(signal_select(int)), this, SLOT(slot_dealSelect(int)));
textObj->SetTextAttr(textObj->charPosX * DIE_SCALE, textObj->charPosY * DIE_SCALE);
textObj->setDefaultTextColor(RECT_COLOR);
//200字体大概等于400宽度
QFont font("Arial", textObj->charHeight * DIE_SCALE, QFont::Bold); // 字体名称,大小,粗细
textObj->setFont(font);
m_textItemVec.push_back(textObj);
m_scene.addItem(textObj.get());
startIndex++;
}
for (int i = 0; i < serialNumSize; i++)
{
QString testA = QString::number(i);
std::shared_ptr<MyQGraphicsTextItem> textObj = std::make_shared<MyQGraphicsTextItem>(testA);
textObj->m_id = startIndex;
textObj->charPosX = 0.5 + i * 0.2;
textObj->charPosY = 1;
textObj->charWidth = 0.09;
textObj->charHeight = 0.12;
textObj->charContent = testA;
connect(textObj.get(), SIGNAL(signal_select(int)), this, SLOT(slot_dealSelect(int)));
textObj->SetTextAttr(textObj->charPosX * DIE_SCALE, textObj->charPosY * DIE_SCALE);
textObj->setDefaultTextColor(RECT_COLOR);
//200字体大概等于400宽度
QFont font("Arial", textObj->charHeight * DIE_SCALE, QFont::Bold); // 字体名称,大小,粗细
textObj->setFont(font);
m_textItemVec.push_back(textObj);
m_scene.addItem(textObj.get());
startIndex++;
}
}
void DieUI::slot_cancelAllSelectChar()
{
for (auto& iter : m_textItemVec)
{
iter->m_textItemIsSelect = false;
iter->setDefaultTextColor(RECT_COLOR);
}
}
void DieUI::slot_topAdjustPos()
{
CommonAdjustCharPos(0, ui.comboBox_2->currentText().toDouble());
}
void DieUI::slot_downAdjustPos()
{
CommonAdjustCharPos(1, ui.comboBox_2->currentText().toDouble());
}
void DieUI::slot_leftAdjustPos()
{
CommonAdjustCharPos(2, ui.comboBox_2->currentText().toDouble());
}
void DieUI::slot_rightAdjustPos()
{
CommonAdjustCharPos(3, ui.comboBox_2->currentText().toDouble());
}
void DieUI::slot_autoId()
{
int uniqueId = -1;
for (int id = 0; id < 1000; id++)
{
bool idIsUse = false;
for (auto& iter : m_lineItemVec)
{
if (iter->Id() == id)
{
idIsUse = true;
}
}
for (auto& iter : m_rectItemVec)
{
if (iter->Id() == id)
{
idIsUse = true;
}
}
for (auto& iter : m_circleItemVec)
{
if (iter->Id() == id)
{
idIsUse = true;
}
}
for (auto& iter : m_textItemVec)
{
if (iter->Id() == id)
{
idIsUse = true;
}
}
if (!idIsUse)
{
uniqueId = id;
break;
}
}
ui.lineEdit_uniqueId->setText(QString::number(uniqueId));
}
void DieUI::ShowDieCoordLayout(double dieWidth, double dieHeight, QStringList& allFontList, QString recipeFileCurFont)
{
m_dieWidth = dieWidth;
m_dieHeight = dieHeight;
m_allFontList = allFontList;
//绘制坐标系
m_XCoordAxis = std::make_shared<MyQGraphicsLineItem>(-m_dieWidth * DIE_SCALE - 100, 0, m_dieWidth * DIE_SCALE + 100, 0);
m_XCoordAxis->setPen(m_pen);
m_XCoordAxis->CoordAxis(true);
m_YCoordAxis = std::make_shared<MyQGraphicsLineItem>(0, -m_dieHeight * DIE_SCALE - 100, 0, m_dieHeight * DIE_SCALE + 100);
m_YCoordAxis->setPen(m_pen);
m_YCoordAxis->CoordAxis(true);
//绘制die
m_dieObj = std::make_shared<MyDieRectItem>(0, 0, m_dieWidth * DIE_SCALE, m_dieHeight * DIE_SCALE);
m_dieObj->setPen(m_pen);
connect(m_dieObj.get(), SIGNAL(signal_mouse(QPointF, QPointF)), this, SLOT(slot_dealMouseEvent(QPointF, QPointF)));
m_scene.addItem(m_XCoordAxis.get());
m_scene.addItem(m_YCoordAxis.get());
m_scene.addItem(m_dieObj.get());
ui.graphicsView->setScene(&m_scene);
//添加字体
QStringListModel *model = new QStringListModel();
model->setStringList(m_allFontList);
ui.comboBox->setModel(model);
ui.comboBox->setCurrentIndex(0);
for (auto& iter : m_allFontList)
{
if (iter == recipeFileCurFont)
{
ui.comboBox->setCurrentText(recipeFileCurFont);
}
}
}
bool DieUI::SetRecipeDie(RecipeAttrObj& obj)
{
if (m_textItemVec.size() <= 0)
{
return false;
}
obj.m_fontType = ui.comboBox->currentText();
obj.m_markCharVec.clear();
obj.m_markGraphicsVec.clear();
for (auto& iter : m_textItemVec)
{
MarkChar resMarkChar;
resMarkChar.charId = iter->m_id;
resMarkChar.charData = iter->charContent.toStdString();
resMarkChar.x = iter->charPosX;
resMarkChar.y = iter->charPosY;
resMarkChar.charWidth = iter->charWidth;
resMarkChar.charHeight = iter->charHeight;
obj.m_markCharVec.push_back(resMarkChar);
}
//赋值
obj.m_serialStartStr.clear();
for (int i = 0; i < ui.lineEdit_serialReplaceStr->text().toInt(); i++)
{
obj.m_serialStartStr.append(QString::number(0));
}
return true;
}
void DieUI::ShowRecipeAllCharOnDie(RecipeAttrObj& obj, QStringList allFontType)
{
ShowDieCoordLayout(obj.m_dieWidth, obj.m_dieHeight, allFontType, obj.m_fontType);
for (auto& iter : m_textItemVec)
{
m_scene.removeItem(iter.get());
}
m_textItemVec.clear();
for (auto& iter : obj.m_markCharVec)
{
QString testA = QString::fromStdString(iter.charData);
std::shared_ptr<MyQGraphicsTextItem> textObj = std::make_shared<MyQGraphicsTextItem>(testA);
connect(textObj.get(), SIGNAL(signal_select(int)), this, SLOT(slot_dealSelect(int)));
textObj->SetTextAttr(iter.x * DIE_SCALE, iter.y * DIE_SCALE/* * (-1)*/);
textObj->setDefaultTextColor(RECT_COLOR);
textObj->m_id = iter.charId;
textObj->charPosX = iter.x;
textObj->charPosY = iter.y;
textObj->charWidth = iter.charWidth;
textObj->charHeight = iter.charHeight;
textObj->charContent = testA;
//200字体大概等于400宽度
QFont font("Arial", textObj->charHeight * DIE_SCALE/* / 2*/, QFont::Bold); // 字体名称,大小,粗细
textObj->setFont(font);
m_textItemVec.push_back(textObj);
m_scene.addItem(textObj.get());
}
ui.lineEdit_normalReplaceStr->setText(QString::number(obj.m_markCharVec.size() - obj.m_serialStartStr.size()));
ui.lineEdit_serialReplaceStr->setText(QString::number(obj.m_serialStartStr.size()));
ui.graphicsView->update();
}
void DieUI::ClearUIDie()
{
for (auto& iter : m_textItemVec)
{
m_scene.removeItem(iter.get());
}
m_textItemVec.clear();
ui.lineEdit_uniqueId->clear();
ui.lineEdit_charContent->clear();
ui.lineEdit_charX->clear();
ui.lineEdit_charY->clear();
ui.lineEdit_charWidth->clear();
ui.lineEdit_charHeight->clear();
}