Quilting-lw/sharedviews/patterneditwidget.cpp
2026-01-23 16:37:18 +08:00

946 lines
32 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "patterneditwidget.h"
#include "ui_patterneditwidget.h"
PatternEditWidget::PatternEditWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::PatternEditWidget)
{
ui->setupUi(this);
setWindowFlags (Qt::Window | Qt::FramelessWindowHint);
setWindowModality(Qt::ApplicationModal);
// 创建一个QGraphicsView
m_view = new MyGraphicsView(this,GRIDSIZE1);
connect(m_view, SIGNAL(siCurrentIndex(int)), this, SLOT(slotShowCurrentIdx(int)));
ui->labelSize->setText(tr("Each grid is 1 millimeter"));//每个格子为1毫米
QString str= tr("Current number of needles: ") + QString("%1").arg(0);//当前针数:
ui->labelIndex->setText(str);
str= tr("Pattern width: ") + QString("%1mm").arg(0);//花样宽度:
ui->labelWidth->setText(str);
str= tr("Pattern height: ") + QString("%1mm").arg(0);//花样高度:
ui->labelHeight->setText(str);
m_XMoveValue = 0;
m_YMoveValue = 0;
//这三个功能暂时隐藏掉用qui源数据进行编辑时这三个功能有问题
ui->pushButtonPreInsert->hide();
ui->pushButtonNextInsert->hide();
ui->pushButtonDelete->hide();
initResolution();
initControlStyle();
}
PatternEditWidget::~PatternEditWidget()
{
if(m_view != NULL)
{
delete m_view;
m_view = NULL;
}
delete ui;
}
//初始化窗体控件为任意分辨率
void PatternEditWidget::initResolution()
{
double factoryX = getFactoryX();
double factoryY = getFactoryY();
this->resize(GLB_SCR_WIGHT*factoryX,GLB_SCR_HEIGHT*factoryY);
ui->frameBack->setGeometry(0*factoryX,0*factoryX,GLB_SCR_WIGHT*factoryX,GLB_SCR_HEIGHT*factoryY);
// 设置QGraphicsView的位置和大小
m_view->setGeometry(10*factoryX, 10*factoryY, 771*factoryX, 551*factoryY); // 假设整个窗口用来显示图形
ui->frameBtn->setGeometry(790*factoryX,10*factoryY,226*factoryX,581*factoryY);
ui->pushButtonPre1->setGeometry(121*factoryX, 10*factoryY, 86*factoryX, 40*factoryY);
ui->pushButtonNext1->setGeometry(16*factoryX, 10*factoryY, 86*factoryX, 40*factoryY);
ui->pushButtonPre10->setGeometry(121*factoryX, 60*factoryY, 86*factoryX, 40*factoryY);
ui->pushButtonNext10->setGeometry(16*factoryX, 60*factoryY, 86*factoryX, 40*factoryY);
ui->pushButtonPreInsert->setGeometry(16*factoryX, 140*factoryY, 191*factoryX, 40*factoryY);
ui->pushButtonNextInsert->setGeometry(16*factoryX, 190*factoryY, 191*factoryX, 40*factoryY);
ui->pushButtonDelete->setGeometry(16*factoryX, 240*factoryY, 191*factoryX, 41*factoryY);
ui->labelX->setGeometry(5*factoryX, 140*factoryY, 15*factoryX, 40*factoryY);
ui->pushButtonXValue->setGeometry(20*factoryX, 140*factoryY, 50*factoryX, 40*factoryY);
ui->labelXUnit->setGeometry(75*factoryX, 140*factoryY, 25*factoryX, 40*factoryY);
ui->pushButtonXAdd->setGeometry(110*factoryX, 140*factoryY, 50*factoryX, 40*factoryY);
ui->pushButtonXDec->setGeometry(170*factoryX, 140*factoryY, 50*factoryX, 40*factoryY);
ui->labelY->setGeometry(5*factoryX, 200*factoryY, 15*factoryX, 40*factoryY);
ui->pushButtonYValue->setGeometry(20*factoryX, 200*factoryY, 50*factoryX, 40*factoryY);
ui->labelYUnit->setGeometry(75*factoryX, 200*factoryY, 25*factoryX, 40*factoryY);
ui->pushButtonYAdd->setGeometry(110*factoryX, 200*factoryY, 50*factoryX, 40*factoryY);
ui->pushButtonYDec->setGeometry(170*factoryX, 200*factoryY, 50*factoryX, 40*factoryY);
ui->pushButtonEnlarge->setGeometry(16*factoryX, 321*factoryY, 53*factoryX, 53*factoryY);
ui->pushButtonNarrow->setGeometry(154*factoryX, 321*factoryY, 53*factoryX, 53*factoryY);
ui->pushButtonAuto->setGeometry(85*factoryX, 390*factoryY, 53*factoryX, 53*factoryY);
ui->pushButtonLeft->setGeometry(16*factoryX, 390*factoryY, 53*factoryX, 53*factoryY);
ui->pushButtonRight->setGeometry(154*factoryX, 390*factoryY, 53*factoryX, 53*factoryY);
ui->pushButtonUp->setGeometry(85*factoryX, 321*factoryY, 53*factoryX, 53*factoryY);
ui->pushButtonDn->setGeometry(85*factoryX, 459*factoryY, 53*factoryX, 53*factoryY);
ui->pushButtonOk->setGeometry(16*factoryX, 545*factoryY, 80*factoryX, 30*factoryY);
ui->pushButtonCancel->setGeometry(127*factoryX, 545*factoryY, 80*factoryX, 30*factoryY);
ui->frameDown->setGeometry(10*factoryX,560*factoryY,771*factoryX,31*factoryY);
ui->labelSize->setGeometry(10*factoryX,5*factoryY,260*factoryX,21*factoryY);
ui->labelIndex->setGeometry(270*factoryX,5*factoryY,150*factoryX,21*factoryY);
ui->labelWidth->setGeometry(430*factoryX,5*factoryY,160*factoryX,21*factoryY);
ui->labelHeight->setGeometry(590*factoryX,5*factoryY,160*factoryX,21*factoryY);
}
//设置按钮颜色 天蓝色渐变
void PatternEditWidget::setButtonColorForSkyBlue(QPushButton *button)
{
QString style = "QPushButton{background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0,stop: 0 #7DE0E1, stop: 1 #39C2DC);border: none;}";
style += "QPushButton:pressed{background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0,stop: 0 #6DC3C4, stop: 1 #32AAC0);border: none;}";
style += "QPushButton:disabled{background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0,stop: 0 #6DC3C4, stop: 1 #32AAC0);border: none;}";
style += "QPushButton:checked{background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0,stop: 0 #6DC3C4, stop: 1 #32AAC0);border: none;}";
button->setStyleSheet(style);
}
//按钮颜色橘色
void PatternEditWidget::setOrangeButtonStyle(QPushButton *button)
{
QString style = "QPushButton{border-radius:" + borderRadius() + "px;}";
// 橙色按钮,白字
style += "QPushButton{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(247, 180, 61), stop:1 rgb(222, 162, 55));color:rgb(255,255,255);}";
style += "QPushButton:pressed{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(222, 196, 128), stop:1 rgb(213,125,54));color:rgb(255,255,255);}";
style += "QPushButton:disabled{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(227, 227, 227), stop:1 rgb(177,177,177));color:rgb(255,255,255);}";
button->setStyleSheet(style);
}
//按钮颜色天空蓝--清空文本设置icon
void PatternEditWidget::setBlueButtonStyleClearTextAndSettingsIcon(QPushButton *button)
{
QString iconName = ":/images/PatternEditWidget/"+button->objectName()+".png";
button->setIcon(QIcon(iconName));
button->setIconSize(7*QSize(returnMinimumSize(button)/8, 7*returnMinimumSize(button)/8));
button->setText("");
QString style = "QPushButton{background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0,stop: 0 #7DE0E1, stop: 1 #39C2DC);border: none;}";
style += "QPushButton:pressed{background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0,stop: 0 #6DC3C4, stop: 1 #32AAC0);border: none;}";
style += "QPushButton:disabled{background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0,stop: 0 #6DC3C4, stop: 1 #32AAC0);border: none;}";
style += "QPushButton:checked{background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0,stop: 0 #6DC3C4, stop: 1 #32AAC0);border: none;}";
button->setStyleSheet(style);
}
//按钮颜色橘色--清空文本设置icon
void PatternEditWidget::setOrangeButtonStyleSettingsIcon(QPushButton *button)
{
QString iconName = ":/images/PatternEditWidget/"+button->objectName()+".png";
button->setIcon(QIcon(iconName));
button->setIconSize(QSize(returnMinimumSize(button), returnMinimumSize(button)));
button->setText("");
QString style = "QPushButton{border-radius:" + borderRadius() + "px;}";
// 橙色按钮,白字
style += "QPushButton{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(247, 180, 61), stop:1 rgb(222, 162, 55));color:rgb(255,255,255);}";
style += "QPushButton:pressed{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(222, 196, 128), stop:1 rgb(213,125,54));color:rgb(255,255,255);}";
style += "QPushButton:disabled{background-color: qlineargradient(spread:pad, x1:0.5 y1:0, x2:0.5, y2:1, stop:0 rgb(227, 227, 227), stop:1 rgb(177,177,177));color:rgb(255,255,255);}";
button->setStyleSheet(style);
}
//初始化窗体控件的样式
void PatternEditWidget::initControlStyle()
{
ui->labelIndex->setFont(fontSize_M());
ui->labelSize->setFont(fontSize_M());
ui->labelWidth->setFont(fontSize_M());
ui->labelHeight->setFont(fontSize_M());
ui->frameBack->setStyleSheet("QFrame {"
"background-color: rgb(0, 0, 0);"
"}");
ui->frameBtn->setStyleSheet("background-color:rgb(67, 67, 67);border-radius: "+borderRadius()+"px;");
setBlueButtonStyleClearTextAndSettingsIcon(ui->pushButtonEnlarge);
setBlueButtonStyleClearTextAndSettingsIcon(ui->pushButtonNarrow);
setBlueButtonStyleClearTextAndSettingsIcon(ui->pushButtonPre1);
setBlueButtonStyleClearTextAndSettingsIcon(ui->pushButtonNext1);
setBlueButtonStyleClearTextAndSettingsIcon(ui->pushButtonPre10);
setBlueButtonStyleClearTextAndSettingsIcon(ui->pushButtonNext10);
setBlueButtonStyleClearTextAndSettingsIcon(ui->pushButtonAuto);
setBlueButtonStyleClearTextAndSettingsIcon(ui->pushButtonLeft);
setBlueButtonStyleClearTextAndSettingsIcon(ui->pushButtonRight);
setBlueButtonStyleClearTextAndSettingsIcon(ui->pushButtonUp);
setBlueButtonStyleClearTextAndSettingsIcon(ui->pushButtonDn);
setButtonColorForSkyBlue(ui->pushButtonPreInsert);
setButtonColorForSkyBlue(ui->pushButtonNextInsert);
setButtonColorForSkyBlue(ui->pushButtonDelete);
setButtonColorForSkyBlue(ui->pushButtonXValue);
setButtonColorForSkyBlue(ui->pushButtonXAdd);
setButtonColorForSkyBlue(ui->pushButtonXDec);
ui->pushButtonXValue->setFont(fontSize_M());
QFont size(FONTTYPE,g_fontsize + 4, FONTNORMAL);
size.setPointSize(size.pointSize()*getFactoryY());
ui->pushButtonXAdd->setFont(size);
ui->pushButtonXDec->setFont(size);
ui->labelX->setFont(fontSize_M());
ui->labelX->setStyleSheet(stateTextColour());
ui->labelXUnit->setFont(fontSize_M());
ui->labelXUnit->setStyleSheet(stateTextColour());
setButtonColorForSkyBlue(ui->pushButtonYValue);
setButtonColorForSkyBlue(ui->pushButtonYAdd);
setButtonColorForSkyBlue(ui->pushButtonYDec);
ui->pushButtonYValue->setFont(fontSize_M());
ui->pushButtonYAdd->setFont(size);
ui->pushButtonYDec->setFont(size);
ui->labelY->setFont(fontSize_M());
ui->labelY->setStyleSheet(stateTextColour());
ui->labelYUnit->setFont(fontSize_M());
ui->labelYUnit->setStyleSheet(stateTextColour());
ui->pushButtonPreInsert->setFont(fontSize_M());
ui->pushButtonNextInsert->setFont(fontSize_M());
ui->pushButtonDelete->setFont(fontSize_M());
setOrangeButtonStyleSettingsIcon(ui->pushButtonCancel);
setOrangeButtonStyleSettingsIcon(ui->pushButtonOk);
m_view->setStyleSheet("QGraphicsView {"
"border-top-left-radius: "+borderRadius()+"px;" // 左下角圆角
"border-top-right-radius: "+borderRadius()+"px;" // 右下角圆角
"}");
ui->frameDown->setStyleSheet("QFrame {"
"border-bottom-left-radius: "+borderRadius()+"px;" // 左下角圆角
"border-bottom-right-radius: "+borderRadius()+"px;" // 右下角圆角
"}");
}
//返回一个按钮-高和宽最小的一个数值
int PatternEditWidget::returnMinimumSize(QPushButton *button)
{
// 确保指针不是 nullptr以避免在按钮未正确初始化时导致的问题
if (button == NULL) {
return 0; // 或者抛出异常或处理这种情况
}
// 使用三元运算符来返回宽度和高度中的较大值
return button->width() < button->height() ? button->width() : button->height();
}
//刷新图形
void PatternEditWidget::refreshView(QString filePath,s32 scanX,s32 scanY)
{
#if(0)
QByteArray dat = g_pCurEmbData->getDispDat(SCENESIZE,SCENESIZE);
#endif
QList<drawItem> list;
list.clear();
m_filePath = filePath;
QFileInfo file(filePath);
QString ext = file.suffix().toUpper();
int maxX,minX,maxY,minY;
maxX = minX = maxY = minY = 0;
m_pointsNum = 0;
if(ext == "QUI")
{
DataFileQui qui;
qui.initFile(filePath);
qui.creatDrawData(scanX,scanY,SCENESIZE,SCENESIZE,maxX,minX,maxY,minY,m_pointsNum);
list = qui.getDrawData();
}
else if(ext == "DST")
{
DataFileDst dst;
dst.initFile(filePath);
}
else
{
PromptDialog dlg(this);
dlg.initDialog(PromptDialog::BTN_OK);
dlg.setTitleStr(tr("Prompt"));
QString str;
str = tr("Unsupported file format!");//不支持的文件格式!
dlg.setContentStr(str);
dlg.exec();
return;
}
if(list.size() <= 0)
{
ui->pushButtonEnlarge->setEnabled(false);
ui->pushButtonNarrow->setEnabled(false);
ui->pushButtonPre1->setEnabled(false);
ui->pushButtonNext1->setEnabled(false);
ui->pushButtonPre10->setEnabled(false);
ui->pushButtonNext10->setEnabled(false);
ui->pushButtonPreInsert->setEnabled(false);
ui->pushButtonNextInsert->setEnabled(false);
ui->pushButtonDelete->setEnabled(false);
ui->pushButtonOk->setEnabled(false);
return;
}
m_view->creatViewByList(list);
int num = m_view->getItemNums();
//只有格子图时加减针等按钮不可按
if(num <= 1)
{
ui->pushButtonEnlarge->setEnabled(false);
ui->pushButtonNarrow->setEnabled(false);
ui->pushButtonPre1->setEnabled(false);
ui->pushButtonNext1->setEnabled(false);
ui->pushButtonPre10->setEnabled(false);
ui->pushButtonNext10->setEnabled(false);
ui->pushButtonPreInsert->setEnabled(false);
ui->pushButtonNextInsert->setEnabled(false);
ui->pushButtonDelete->setEnabled(false);
ui->pushButtonOk->setEnabled(false);
}
else
{
ui->pushButtonEnlarge->setEnabled(true);
ui->pushButtonNarrow->setEnabled(true);
ui->pushButtonPre1->setEnabled(true);
ui->pushButtonNext1->setEnabled(true);
ui->pushButtonPre10->setEnabled(true);
ui->pushButtonNext10->setEnabled(true);
ui->pushButtonPreInsert->setEnabled(true);
ui->pushButtonNextInsert->setEnabled(true);
ui->pushButtonDelete->setEnabled(true);
ui->pushButtonOk->setEnabled(true);
}
double width = (double)(maxX-minX)/100.0;
QString str= tr("Pattern width: ") + QString("%1mm").arg(width);//花样宽度:
ui->labelWidth->setText(str);
double height = (double)(maxY-minY)/100.0;
str= tr("Pattern height: ") + QString("%1mm").arg(height);//花样高度:
ui->labelHeight->setText(str);
str= tr("Current number of needles: ") + QString("%1/%2").arg(0).arg(m_pointsNum);//当前针数:
ui->labelIndex->setText(str);
#if(0)
double width = g_pCurEmbData->getDatWidth()/100.0;
QString str= tr("Pattern width: ") + QString("%1mm").arg(width);//花样宽度:
ui->labelWidth->setText(str);
double height = g_pCurEmbData->getDatHeight()/100.0;
str= tr("Pattern height: ") + QString("%1mm").arg(height);//花样高度:
ui->labelHeight->setText(str);
#endif
QWidget::show();
}
void PatternEditWidget::on_pushButtonCancel_clicked()
{
this->hide();
}
//放大
void PatternEditWidget::on_pushButtonEnlarge_clicked()
{
m_view->enlargeView();
}
//缩小
void PatternEditWidget::on_pushButtonNarrow_clicked()
{
m_view->narrowView();
}
void PatternEditWidget::on_pushButtonPre1_clicked()
{
m_view->forwardAndBackward(-1);
}
void PatternEditWidget::on_pushButtonNext1_clicked()
{
m_view->forwardAndBackward(1);
}
void PatternEditWidget::on_pushButtonPre10_clicked()
{
m_view->forwardAndBackward(-10);
}
void PatternEditWidget::on_pushButtonNext10_clicked()
{
m_view->forwardAndBackward(10);
}
void PatternEditWidget::on_pushButtonUp_clicked()
{
m_view->moveScene(0,10);
}
void PatternEditWidget::on_pushButtonDn_clicked()
{
m_view->moveScene(0,-10);
}
void PatternEditWidget::on_pushButtonLeft_clicked()
{
m_view->moveScene(10,0);
}
void PatternEditWidget::on_pushButtonRight_clicked()
{
m_view->moveScene(-10,0);
}
void PatternEditWidget::on_pushButtonAuto_clicked()
{
m_view->autoView();
}
//向前插入一点
void PatternEditWidget::on_pushButtonPreInsert_clicked()
{
m_view->insertPoint(-1);
}
//向后插入一点
void PatternEditWidget::on_pushButtonNextInsert_clicked()
{
m_view->insertPoint(1);
}
//删除选中点
void PatternEditWidget::on_pushButtonDelete_clicked()
{
m_view->removeSelectPoint();
}
//保存文件
void PatternEditWidget::on_pushButtonOk_clicked()
{
//保存为qui文件覆盖原来的或另存为新的
PromptDialog promptDlg;
promptDlg.initDialog(PromptDialog::BTN_O_S_C);
promptDlg.setTitleStr(tr("Prompt"));//提示
QString str;
str = tr("Whether to overwrite the source file?");//是否覆盖源文件?
promptDlg.setContentStr(str);
int val = promptDlg.exec();
if(val == 0)
{
return;
}
QList<GLineItem> lineList;
lineList.clear();
QList<GPathItem> pathList;
pathList.clear();
lineList = m_view->getLineItemList();
pathList = m_view->getPathItemList();
//求maxy因为实际数据与scanx和scany相差100倍所以乘以100
int firstX,endX;
firstX = endX= 0;
double maxY = S32_MIN;
int firstFlag = 0;
for(int i = 0; i < lineList.size(); i++)
{
for(int j = 0; j < lineList[i].points.size(); j++)
{
double x = lineList[i].points[j].x()*100.0;
double y = lineList[i].points[j].y()*100.0;
lineList[i].points[j].setX(x);
lineList[i].points[j].setY(y);
if(maxY < lineList[i].points[j].y())
{
maxY = lineList[i].points[j].y();
}
}
}
for(int i = 0; i < pathList.size(); i++)
{
for(int j = 0; j < pathList[i].points.size(); j++)
{
double x = pathList[i].points[j].x()*100.0;
double y = pathList[i].points[j].y()*100.0;
pathList[i].points[j].setX(x);
pathList[i].points[j].setY(y);
if(maxY < pathList[i].points[j].y())
{
maxY = pathList[i].points[j].y();
}
}
}
QByteArray fileData;
fileData.clear();
QFileInfo file(m_filePath);
QString ext = file.suffix().toUpper();
int flag = 0;
if(ext == "QUI")
{
DataFileQui qui;
qui.initFile(m_filePath);
QuiFileHead *head = qui.getQuiHead();
fileData.append((char*)head,sizeof(QuiFileHead));
unsigned char ch1,ch2;
//y向取反并按顺序保存
int idx = 0;//序号
int add = 0;
QPoint lastP;
while(1)
{
if(add >= lineList.size()+pathList.size()+200)
{
flag = 1;
break;//避免陷入死循环
}
if(idx >= lineList.size()+pathList.size())
{
break;
}
for(int i = 0; i < lineList.size(); i++)
{
if(lineList[i].order == idx)
{
unsigned short int type = lineList[i].type;
ch1 = static_cast<unsigned char>(type & 0xFF); // 低字节
fileData.append(ch1);
ch2 = static_cast<unsigned char>((type >> 8) & 0xFF); // 高字节
fileData.append(ch2);
unsigned short int pointsSize = lineList[i].points.size();
ch1 = static_cast<unsigned char>(pointsSize & 0xFF); // 低字节
fileData.append(ch1);
ch2 = static_cast<unsigned char>((pointsSize >> 8) & 0xFF); // 高字节
fileData.append(ch2);
for(int j = 0; j < lineList[i].points.size(); j++)
{
unsigned short int x = lineList[i].points[j].x();
if(firstFlag == 0)
{
firstX = x;
firstFlag = 1;
}
endX = x;
lastP.setX(x);
ch1 = static_cast<unsigned char>(x & 0xFF); // 低字节
fileData.append(ch1);
ch2 = static_cast<unsigned char>((x >> 8) & 0xFF); // 高字节
fileData.append(ch2);
unsigned short int y = maxY-lineList[i].points[j].y();
lastP.setY(y);
ch1 = static_cast<unsigned char>(y & 0xFF); // 低字节
fileData.append(ch1);
ch2 = static_cast<unsigned char>((y >> 8) & 0xFF); // 高字节
fileData.append(ch2);
}
idx++;
}
}
for(int i = 0; i < pathList.size(); i++)
{
if(pathList[i].order == idx)
{
unsigned short int type = pathList[i].type;
if((pathList[i].points.size() == 3 && type == QUI_TYPE_ARC) ||
(pathList[i].points.size() == 4 && type == QUI_TYPE_BES))//圆弧固定为3个点贝塞尔为4个点
{
ch1 = static_cast<unsigned char>(type & 0xFF); // 低字节
fileData.append(ch1);
ch2 = static_cast<unsigned char>((type >> 8) & 0xFF); // 高字节
fileData.append(ch2);
for(int j = 0; j < pathList[i].points.size(); j++)
{
unsigned short int x = pathList[i].points[j].x();
if(firstFlag == 0)
{
firstX = x;
firstFlag = 1;
}
endX = x;
lastP.setX(x);
ch1 = static_cast<unsigned char>(x & 0xFF); // 低字节
fileData.append(ch1);
ch2 = static_cast<unsigned char>((x >> 8) & 0xFF); // 高字节
fileData.append(ch2);
unsigned short int y = maxY-pathList[i].points[j].y();
lastP.setY(y);
ch1 = static_cast<unsigned char>(y & 0xFF); // 低字节
fileData.append(ch1);
ch2 = static_cast<unsigned char>((y >> 8) & 0xFF); // 高字节
fileData.append(ch2);
}
}
idx++;
}
}
add++;
}
//如果起点和终点x不一致则添加一段跨步使起点x和终点x相等
if(firstX != endX)
{
unsigned short int type = QUI_TYPE_STEP;
ch1 = static_cast<unsigned char>(type & 0xFF); // 低字节
fileData.append(ch1);
ch2 = static_cast<unsigned char>((type >> 8) & 0xFF); // 高字节
fileData.append(ch2);
unsigned short int pointsSize = 2;
ch1 = static_cast<unsigned char>(pointsSize & 0xFF); // 低字节
fileData.append(ch1);
ch2 = static_cast<unsigned char>((pointsSize >> 8) & 0xFF); // 高字节
fileData.append(ch2);
//第一个点
unsigned short int x = lastP.x();
ch1 = static_cast<unsigned char>(x & 0xFF); // 低字节
fileData.append(ch1);
ch2 = static_cast<unsigned char>((x >> 8) & 0xFF); // 高字节
fileData.append(ch2);
unsigned short int y = lastP.y();
ch1 = static_cast<unsigned char>(y & 0xFF); // 低字节
fileData.append(ch1);
ch2 = static_cast<unsigned char>((y >> 8) & 0xFF); // 高字节
fileData.append(ch2);
//第二个点
x = lastP.x()+(firstX-endX);
ch1 = static_cast<unsigned char>(x & 0xFF); // 低字节
fileData.append(ch1);
ch2 = static_cast<unsigned char>((x >> 8) & 0xFF); // 高字节
fileData.append(ch2);
y = lastP.y();
ch1 = static_cast<unsigned char>(y & 0xFF); // 低字节
fileData.append(ch1);
ch2 = static_cast<unsigned char>((y >> 8) & 0xFF); // 高字节
fileData.append(ch2);
}
//增加结束
int end = 0xffff;
ch1 = static_cast<unsigned char>(end & 0xFF); // 低字节
fileData.append(ch1);
ch2 = static_cast<unsigned char>((end >> 8) & 0xFF); // 高字节
fileData.append(ch2);
}
else if(ext == "QUIX")
{
DataFileQuix quix;
quix.initFile(m_filePath);
}
else if(ext == "DSR")
{
DataFileDsr dsr;
dsr.initFile(m_filePath);
}
if(flag != 0)
{
PromptDialog dlg(this);
dlg.initDialog(PromptDialog::BTN_OK);
dlg.setTitleStr(tr("Prompt"));
QString str;
str = tr("File save failed!");//文件保存失败!
dlg.setContentStr(str);
dlg.exec();
return;
}
if(val == 1)//覆盖
{
QFile file(m_filePath);
if (file.open(QIODevice::WriteOnly | QIODevice::Truncate))
{
file.write(fileData);
file.close();
//将原来的png删除
QFile::remove(m_filePath+".preview.png");
emit siRemoveOldPng();
}
this->hide();
emit siEditFinish(1);
}
else if(val == 2)//另存为
{
WordsInputDialog wordInputDlg;
wordInputDlg.clean();
wordInputDlg.setTitleStr(tr("Name"));//命名
wordInputDlg.setOldWordsStr("");
if(wordInputDlg.exec() == 1)
{
//文件路径
QString name = wordInputDlg.getInputStr()+".qui";
QDir apppath(qApp->applicationDirPath());
QString filePath = apppath.path() + apppath.separator() + PATTERNPATH + apppath.separator();
QString fileName = filePath + name;
QFile file(fileName);
if(file.exists() == false)
{
QFile wfile(fileName);
if (wfile.open(QIODevice::WriteOnly | QIODevice::Truncate))
{
wfile.write(fileData);
wfile.close();
}
this->hide();
emit siEditFinish(2);
}
else
{
PromptDialog dlg(this);
dlg.initDialog(PromptDialog::BTN_OK);
dlg.setTitleStr(tr("Prompt"));
QString str;
str = tr("This file already exists!");//此文件已经存在!
dlg.setContentStr(str);
dlg.exec();
}
}
}
#if(0)
m_newDat.clear();
double unit = 100.0;
double minX;
double maxX;
double minY;
double maxY;
minX = S32_MAX;
maxX = S32_MIN;
minY = S32_MAX;
maxY = S32_MIN;
QList<QGraphicsEllipseItem *> list = m_view->getPointList();
//dsr数据
QByteArray datArray;
datArray.clear();
DsrStep absItemDat;
memset((char*)&absItemDat,0,sizeof(DsrStep));
s32 prex = 0;
s32 prey = 0;
s32 curx,cury;
curx = cury = 0;
//保存为dsr文件
for(int i = 0; i < list.size(); i++)
{
QPointF point = list[i]->pos();
absItemDat.ctrl = DSR_SEWING;
absItemDat.attr = 0;
absItemDat.dx = 0 - point.x() * unit;
absItemDat.dy = point.y() * unit;
curx = absItemDat.dx;
cury = absItemDat.dy;
int ddx = curx - prex;
int ddy = cury - prey;
double tar = atan2(ddy,ddx);
absItemDat.dr = (tar * 10000+0.5*(tar>0?1:-1));
if (minX > absItemDat.dx) { minX = absItemDat.dx;}
if (maxX < absItemDat.dx) { maxX = absItemDat.dx;}
if (minY > absItemDat.dy) { minY = absItemDat.dy;}
if (maxY < absItemDat.dy) { maxY = absItemDat.dy;}
datArray.append((char*)&absItemDat,sizeof(DsrStep));
prex = curx;//bin
prey = cury;//bin
}
int datlen = datArray.size()/sizeof(DsrStep);
for(int i = 0;i<datlen;i++)
{
DsrStep *absItemDat = reinterpret_cast<DsrStep*>(datArray.data() + i * sizeof(DsrStep));
absItemDat->dx -= maxX;
absItemDat->dy -= maxY;
}
//添加结束码
memset((char*)&absItemDat, 0, sizeof(DsrStep)); // 重置 absItemDat
absItemDat.ctrl = DATA_END;
absItemDat.attr = 0;
datArray.append((char*)&absItemDat,sizeof(DsrStep));
//生成文件头
DsrHead dsrHead;
memset((char*)&dsrHead,0,sizeof(DsrHead));
int itemNums = datArray.length() / sizeof(DsrStep);
//重新生成文件头
float ver = DSR_VERSION_5;
dsrHead.verCode = *((DWORD*)(&ver));
dsrHead.stitches = itemNums;
dsrHead.xyUnit = 1;
dsrHead.rangePx = maxX-minX;
dsrHead.rangePy = maxY-minY;
dsrHead.rangeNx = minX-minX;
dsrHead.rangeNy = minY-minY;
dsrHead.startX = 0;
dsrHead.startY = 0;
dsrHead.anchorX = 0;
dsrHead.anchorY = 0;
dsrHead.dataBegin = sizeof(DsrHead);
dsrHead.stepSize = itemNums*sizeof(DsrStep); // 数据字节数
datArray.insert(0,(char*)&dsrHead,sizeof(DsrHead));
m_newDat = datArray;
PromptDialog promptDlg;
promptDlg.initDialog(PromptDialog::BTN_OK_CANCEL);
promptDlg.setTitleStr(tr("Prompt"));//提示
QString str;
str = tr("Do you want to save as a new file?");//是否保存为一个新文件?
promptDlg.setContentStr(str);
if(promptDlg.exec() == 1)
{
QString filePath = g_pCurEmbData->getFilePath();
QFileInfo info(filePath);
//保存成dsr文件
QString dsrFilePath = filePath.remove(info.suffix()) + "dsr";
QFile file(dsrFilePath);
if(file.exists())//存在dsr文件
{
QFile::remove(dsrFilePath);
QFile::remove(dsrFilePath+".ds16");
QFile::remove(dsrFilePath+".preview.png");
}
if(!file.open(QIODevice::WriteOnly | QIODevice::Truncate))
{
qDebug() << "open file fail when wirte, path =" << filePath;
dsrFilePath.clear();
}
else
{
file.write(datArray);
#ifdef Q_OS_LINUX
system("sync");
#endif
file.close();
}
}
emit siEditPattern();
//this->hide();
#endif
}
void PatternEditWidget::slotShowCurrentIdx(int idx)
{
QString str= tr("Current number of needles: ") + QString("%1/%2").arg(idx).arg(m_pointsNum);//当前针数:
ui->labelIndex->setText(str);
}
void PatternEditWidget::on_pushButtonXValue_clicked()
{
int rslt=0;
m_XMoveValue= ui->pushButtonXValue->text().toDouble()*10;
NumerInputDialog ndlg(this);
ndlg.setTitleStr("X compensation value setting");
ndlg.setUnitStr("mm");
ndlg.setValueAndRange(m_XMoveValue, 0, 100, 1);
rslt = ndlg.exec();
if (rslt == 1)//点了确认按钮
{
s32 val = ndlg.getValue();
if (val != m_XMoveValue)//更改后的值不等于之前存的值
{
m_XMoveValue = val/10.0;
}
}
ui->pushButtonXValue->setText(QString::number(m_XMoveValue));
}
void PatternEditWidget::on_pushButtonYValue_clicked()
{
int rslt=0;
m_YMoveValue= ui->pushButtonYValue->text().toDouble()*10;
NumerInputDialog ndlg(this);
ndlg.setTitleStr("Y compensation value setting");
ndlg.setUnitStr("mm");
ndlg.setValueAndRange(m_YMoveValue, 0, 100, 1);
rslt = ndlg.exec();
if (rslt == 1)//点了确认按钮
{
s32 val = ndlg.getValue();
if (val != m_YMoveValue)//更改后的值不等于之前存的值
{
m_YMoveValue = val/10.0;
}
}
ui->pushButtonYValue->setText(QString::number(m_YMoveValue));
}
void PatternEditWidget::on_pushButtonXAdd_clicked()
{
if(m_view != NULL)
{
m_view->setXYMove(m_XMoveValue,0);
}
}
void PatternEditWidget::on_pushButtonXDec_clicked()
{
if(m_view != NULL)
{
m_view->setXYMove(0-m_XMoveValue,0);
}
}
void PatternEditWidget::on_pushButtonYAdd_clicked()
{
if(m_view != NULL)
{
m_view->setXYMove(0,m_YMoveValue);
}
}
void PatternEditWidget::on_pushButtonYDec_clicked()
{
if(m_view != NULL)
{
m_view->setXYMove(0,0-m_YMoveValue);
}
}