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.

403 lines
12 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_line, SIGNAL(clicked()), this, SLOT(slot_setDrawLineFlag()));
connect(ui.pushButton_rect, SIGNAL(clicked()), this, SLOT(slot_setDrawRectFlag()));
connect(ui.pushButton_circle, SIGNAL(clicked()), this, SLOT(slot_setCircleFlag()));
connect(ui.pushButton_text, SIGNAL(clicked()), this, SLOT(slot_setTextFlag()));
connect(ui.pushButton_none, SIGNAL(clicked()), this, SLOT(slot_setDrawNone()));
connect(ui.pushButton_setLine, SIGNAL(clicked()), this, SLOT(slot_setLineCoord()));
connect(ui.pushButton_setRect, SIGNAL(clicked()), this, SLOT(slot_setRectCoord()));
connect(ui.pushButton_setCircle, SIGNAL(clicked()), this, SLOT(slot_setCircle()));
connect(ui.pushButton_addText, SIGNAL(clicked()), this, SLOT(slot_addText()));
connect(ui.pushButton_deleteChar, SIGNAL(clicked()), this, SLOT(slot_deleteText()));
connect(ui.pushButton_ensure, SIGNAL(clicked()), this, SLOT(slot_sendEditEnd()));
// 创建正则表达式,允许数字和小数点,但不能以小数点开头
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);
//QStringList stringList;
//stringList << "Arial.sl" << "SENI-ksht.sl" << "Simplex1_2MEIGUO.sl"; // 向列表添加数据
//QStringListModel *model = new QStringListModel();
//model->setStringList(stringList);
//ui.comboBox->setModel(model);
//ui.comboBox->setCurrentIndex(0);
//m_curFontType.clear();
}
DieUI::~DieUI()
{
}
void DieUI::slot_setDrawLineFlag()
{
m_drawType = LINE;
m_dieObj->DrawType(MyDieRectItem::LINE);
}
void DieUI::slot_setDrawRectFlag()
{
m_drawType = RECT;
m_dieObj->DrawType(MyDieRectItem::RECT);
}
void DieUI::slot_setCircleFlag()
{
m_drawType = CIRCLE;
m_dieObj->DrawType(MyDieRectItem::CIRCLE);
}
void DieUI::slot_setTextFlag()
{
m_drawType = TEXT;
m_dieObj->DrawType(MyDieRectItem::TEXT);
}
void DieUI::slot_setDrawNone()
{
m_drawType = NONE;
m_dieObj->DrawType(MyDieRectItem::NONE);
}
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_lineItemVec)
{
if (iter->Id() == id)
{
QPen pen;
pen.setWidth(SELECT_WIDTH);
pen.setColor(CUR_SELECT_DIE);
iter->setPen(pen);
//更新界面显示
ui.lineEdit_lineId->setText(QString::number(iter->Id()));
ui.lineEdit_lineP1X->setText(QString::number(iter->ActualP1DieCoordX()));
ui.lineEdit_lineP1Y->setText(QString::number(iter->ActualP1DieCoordY()));
ui.lineEdit_lineP2X->setText(QString::number(iter->ActualP2DieCoordX()));
ui.lineEdit_lineP2Y->setText(QString::number(iter->ActualP2DieCoordY()));
}
else {
iter->setPen(m_pen);
}
}
for (auto& iter : m_rectItemVec)
{
if (iter->Id() == id)
{
QPen pen;
pen.setWidth(SELECT_WIDTH);
pen.setColor(CUR_SELECT_DIE);
iter->setPen(pen);
//更新界面显示
ui.lineEdit_rectId->setText(QString::number(iter->Id()));
ui.lineEdit_rectX->setText(QString::number(iter->RectX()));
ui.lineEdit_rectY->setText(QString::number(iter->RectY()));
ui.lineEdit_rectWidth->setText(QString::number(iter->Width()));
ui.lineEdit_rectHeight->setText(QString::number(iter->Height()));
}
else {
iter->setPen(m_pen);
}
}
for (auto& iter : m_circleItemVec)
{
if (iter->Id() == id)
{
QPen pen;
pen.setWidth(SELECT_WIDTH);
pen.setColor(CUR_SELECT_DIE);
iter->setPen(pen);
//更新界面显示
ui.lineEdit_circleId->setText(QString::number(iter->Id()));
ui.lineEdit_circleX->setText(QString::number(iter->CircleX() + iter->Diameter() / 2));
ui.lineEdit_circleY->setText(QString::number(iter->CircleY() + iter->Diameter() / 2));
ui.lineEdit_dia->setText(QString::number(iter->Diameter()));
}
else {
iter->setPen(m_pen);
}
}
for (auto& iter : m_textItemVec)
{
if (iter->m_id == id)
{
iter->setDefaultTextColor(CUR_SELECT_DIE);
//更新界面显示
ui.lineEdit_charId->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));
}
else {
iter->setDefaultTextColor(RECT_COLOR);
}
}
}
void DieUI::slot_setLineCoord()
{
for (auto& iter : m_lineItemVec)
{
if (iter->Id() == ui.lineEdit_lineId->text().toInt())
{
iter->SetActualCoordAndUpdate(
ui.lineEdit_lineP1X->text().toDouble(),
ui.lineEdit_lineP1Y->text().toDouble(),
ui.lineEdit_lineP2X->text().toDouble(),
ui.lineEdit_lineP2Y->text().toDouble());
}
}
}
void DieUI::slot_setRectCoord()
{
for (auto& iter : m_rectItemVec)
{
if (iter->Id() == ui.lineEdit_rectId->text().toInt())
{
iter->SetActualDieCoordAndUpdate(
ui.lineEdit_rectX->text().toDouble(),
ui.lineEdit_rectY->text().toDouble(),
ui.lineEdit_rectWidth->text().toDouble(),
ui.lineEdit_rectHeight->text().toDouble(),
ui.lineEdit_rectAngle->text().toDouble());
}
}
}
void DieUI::slot_setCircle()
{
for (auto& iter : m_circleItemVec)
{
if (iter->Id() == ui.lineEdit_circleId->text().toInt())
{
iter->SetCircleInterfaceAttr(ui.lineEdit_circleX->text().toDouble() - ui.lineEdit_dia->text().toDouble() / 2,
ui.lineEdit_circleY->text().toDouble() - ui.lineEdit_dia->text().toDouble() / 2,
ui.lineEdit_dia->text().toDouble());
}
}
}
void DieUI::AddLine(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);
connect(lineObj.get(), SIGNAL(signal_select(int)), this, SLOT(slot_dealSelect(int)));
lineObj->SetLineItemAttr(QPointF(x1, y1), QPointF(x2, y2));
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(double x1, double y1, double x2, double y2)
{
if (x1 >= x2 || y1 >= y2)
{
return;
}
double diameter = sqrt(std::pow(x1 - x2, 2) + std::pow(y1 - y2, 2)); //直径
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->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::slot_addText()
{
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() >= 0.08 && 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() * 100, ui.lineEdit_charY->text().toDouble() * 100);
textObj->setDefaultTextColor(RECT_COLOR);
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() * 100 / 2, QFont::Bold); // 字体名称,大小,粗细
textObj->setFont(font);
m_textItemVec.push_back(textObj);
m_scene.addItem(textObj.get());
QString curText = ui.comboBox->currentText();
if (m_curFontType.size() >= 1 && m_curFontType != curText.toStdString())
{
QMessageBox::StandardButton button = QMessageBox::information(
nullptr,
QString::fromLocal8Bit("提示"),
QString::fromLocal8Bit("字体选择不一样,请重新选择一样字体"),
QMessageBox::Yes,
QMessageBox::NoButton);
return;
}
m_curFontType = curText.toStdString();
}
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_sendEditEnd()
{
emit signal_charEditEnd();
}
void DieUI::InitDieUI(double dieWidth, double dieHeight, QStringList& allFontList)
{
m_dieWidth = dieWidth;
m_dieHeight = dieHeight;
m_allFontList = allFontList;
//绘制坐标系
m_XCoordAxis = std::make_shared<MyQGraphicsLineItem>(-m_dieWidth * DIE_SCALE - 200, 0, m_dieWidth * DIE_SCALE + 200, 0);
m_XCoordAxis->setPen(m_pen);
m_XCoordAxis->CoordAxis(true);
m_YCoordAxis = std::make_shared<MyQGraphicsLineItem>(0, -m_dieHeight * DIE_SCALE - 200, 0, m_dieHeight * DIE_SCALE + 200);
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);
m_curFontType.clear();
}