1042版本发行

This commit is contained in:
2026-07-30 08:24:45 +08:00
parent 241367e8d6
commit dea3229996
23 changed files with 3127 additions and 3303 deletions
+239 -566
View File
@@ -31,6 +31,7 @@
#include "scene/PicDateItem.h"
#include "scene/PicScheduleShiftItem.h"
#include "scene/piccodeitem.h"
#include "scene/PicCounterItem.h"
#include <QElapsedTimer>
#include <QScroller>
@@ -530,6 +531,8 @@ QList<QRect> MainWidget::variableItemsUpdate()
return QList<QRect>();
}
/*
旧实现:
int totalOfProcessedDots = 0;
int totalOfDatetimeNumber = 0;
int nbInvaliedDatetimePreview = 0;
@@ -537,6 +540,38 @@ QList<QRect> MainWidget::variableItemsUpdate()
QList<QRect> updateAreas;
auto items = pPicScene->items();
for(auto i : items) {
PicTextItem* item = dynamic_cast<PicTextItem*>(i);
if(!item)
continue;
...
auto boundingRect = pPicScene->itemsBoundingRect().toRect();
QRect itemRect(item->pos().x() - boundingRect.x(), item->pos().y() - boundingRect.y(), img.width(), img.height());
...
QRect intersectRect = itemRect.intersected(sceneRect);
...
}
*/
int totalOfProcessedDots = 0;
int totalOfDatetimeNumber = 0;
int nbInvaliedDatetimePreview = 0;
int nbClipDatetimePreview = 0;
QList<QRect> updateAreas;
const QRectF contentRect = pPicScene->itemsBoundingRect();
if(contentRect.isEmpty())
return updateAreas;
const int maxPicWidth = sysPara->status.flagOfNo67FPGA ? MAX_PRINT_COL_NUM_Normal : MAX_PRINT_COL_NUM_Wide;
const int maxPicHeight = MAX_PRINT_ROW_NUM;
const QRectF outputRect(0, 0, maxPicWidth, maxPicHeight);
auto items = pPicScene->items();
for(auto i : items) {
PicTextItem* item = dynamic_cast<PicTextItem*>(i);
@@ -570,8 +605,8 @@ QList<QRect> MainWidget::variableItemsUpdate()
auto codeItem = dynamic_cast<PicCodeItem*>(item);
if(!codeItem)
continue;
QVector<int> counterValus{QString::number(sysPara->status.calandar_and_dat.cnt1CurrValue,16).toInt(),
QVector<int> counterValus{QString::number(sysPara->status.calandar_and_dat.cnt1CurrValue,16).toInt(),
QString::number(sysPara->status.calandar_and_dat.cnt2CurrValue,16).toInt()};
auto b = codeItem->updateVariants(counterValus);
if(!b)
@@ -584,34 +619,24 @@ QList<QRect> MainWidget::variableItemsUpdate()
continue;
}
auto sceneRect = pPicScene->sceneRect().toRect();
auto boundingRect = pPicScene->itemsBoundingRect().toRect();
QRect itemRect(item->pos().x() - boundingRect.x(), item->pos().y() - boundingRect.y(), img.width(), img.height());
totalOfDatetimeNumber++;
// 裁剪item位置, 确保item位于场景内
// 如果item超出了场景范围,则裁剪img并更新itemRect,只显示场景内的部分
QRect intersectRect = itemRect.intersected(sceneRect);
if(!intersectRect.isEmpty() && intersectRect != itemRect) {
// 计算裁剪区域在原图中的偏移
int cropX = qMax(0, (int)(intersectRect.left() - itemRect.left()));
int cropY = qMax(0, (int)(intersectRect.top() - itemRect.top()));
int cropWidth = (int)intersectRect.width();
int cropHeight = (int)intersectRect.height();
// 裁剪图像
img = img.copy(cropX, cropY, cropWidth, cropHeight);
// 更新itemRect为裁剪后的区域
itemRect = intersectRect;
const QRectF itemSceneRect = item->sceneBoundingRect();
const QRectF itemBufferRect = itemSceneRect.translated(-contentRect.topLeft());
const QRectF clippedBufferRect = itemBufferRect.intersected(outputRect);
if(clippedBufferRect.isEmpty())
continue;
QRect targetRect = clippedBufferRect.toAlignedRect();
totalOfDatetimeNumber++;
if(targetRect != itemBufferRect.toAlignedRect()) {
const int cropX = qMax(0, targetRect.left() - itemBufferRect.toAlignedRect().left());
const int cropY = qMax(0, targetRect.top() - itemBufferRect.toAlignedRect().top());
img = img.copy(cropX, cropY, targetRect.width(), targetRect.height());
++nbClipDatetimePreview;
}
totalOfProcessedDots += imageToPrintData(img, (int)itemRect.left(), (int)itemRect.top());
updateAreas.append(itemRect);
totalOfProcessedDots += imageToPrintData(img, targetRect.left(), targetRect.top());
updateAreas.append(targetRect);
}
if(updateAreas.isEmpty())
@@ -667,12 +692,15 @@ int MainWidget::imageToPrintData(QImage &image, int startX, int startY)
for(int k = 0; k < height; k++)
{
QRgb rgb = image.pixel(j, k);
if(((rgb >> 24) & 0xff) > 0x80)
{
c |= (1 << (hStart % 8));
}
else
{
if (rgb & 0x80000000) { // 判断 alpha
// 灰度计算:Y = 0.299*R + 0.587*G + 0.114*B
int y = int((((rgb & 0xff) * 299 + ((rgb >> 8) & 0xff) * 587 + ((rgb >> 16) & 0xff) * 114)) / 1000.0f);
if (y < 125) {
c |= (1 << (hStart % 8));
} else {
c &= ~(1 << (hStart % 8));
}
} else {
c &= ~(1 << (hStart % 8));
}
@@ -795,6 +823,7 @@ void MainWidget::on_m_StartBtn_clicked()
sysPara->saveParaToFile();
}
// onPreviewScene 没有必要再次调用,评估后删除 byons@2026年7月28日
if(sysPara->para.EditMode == SCENE)
onPreviewScene();
@@ -899,19 +928,16 @@ void MainWidget::on_m_StopBtn_clicked()
}
unsigned char blankDat1[BLANK_COL_NUM*MAX_PRINT_ROW_BYTE_NUM]={0};
void MainWidget::SendPrintDataToFpga(unsigned char alterMode, int startCol, int size)
void MainWidget::SendPrintDataToFpga(unsigned char alterEnable, bool isUpdate)
{
if(!sysPara) return ;
// fileChange=false;
Q_UNUSED(alterMode);
Q_UNUSED(alterEnable);
// 看清楚,最后取反,也就是说,如果不是局部更新,则写入打印设置和变量控制
if(!(startCol >= 0 && size > 0)) {
if(!isUpdate) {
sysPara->devOp->writeFpgaPrintPara(1);
sysPara->devOp->writeFpgaVariCtrl();
startCol = 0;
size = sysPara->status.currPrintCol;
}
sysPara->devOp->fpgaWr(0,blankDat1,sizeof(blankDat1));//...所加的空白偏移地址
@@ -930,14 +956,11 @@ void MainWidget::SendPrintDataToFpga(unsigned char alterMode, int startCol, int
dat =sysPara->status.printDat;
sizeofdat = sizeof(sysPara->status.printDat);
}
if(sysPara->status.currPrintCol* MAX_PRINT_ROW_BYTE_NUM <= 20000)
sysPara->devOp->fpgaWr(sizeof(blankDat1),dat, sysPara->status.currPrintCol* MAX_PRINT_ROW_BYTE_NUM);
else
sysPara->devOp->fpgaWrD2(sizeof(blankDat1),dat, sysPara->status.currPrintCol* MAX_PRINT_ROW_BYTE_NUM);
dat = dat + startCol * MAX_PRINT_ROW_BYTE_NUM;
size = size * MAX_PRINT_ROW_BYTE_NUM;
if(size <= 20000)
sysPara->devOp->fpgaWr(sizeof(blankDat1), dat, size);
else
sysPara->devOp->fpgaWrD2(sizeof(blankDat1), dat, size);
static QElapsedTimer bnsTimer;
static uint64_t nbRestartCount = 0;
@@ -1822,8 +1845,30 @@ int MainWidget::getMaxSpeedCalcPara(){
return pulseNum;
}
QRect clipBottom(const QImage& img, const QRect& region)
{
for(int y = region.bottom() - 1; y >= region.top(); --y) {
auto line = img.scanLine(y);
for(int x = region.left(); x < region.right(); ++x) {
auto rgb = *((const uint32_t*)(x * 4 + line));
int y = int((((rgb & 0xff) * 299 + ((rgb >> 8) & 0xff) * 587 + ((rgb >> 16) & 0xff) * 114)) / 1000.0f);
if((rgb & 0x80000000) && y < 125) {
return QRect(QPoint(region.topLeft()), QPoint(region.right(), y + 1));
}
}
}
return QRect(region.topLeft(), QSize(region.width(), 0));
}
void MainWidget::onPreviewScene()
{
if(!sysPara){
qCritical() << "SysPara is empty!";
return;
}
sysPara->para.EditMode = SCENE;
if(!pPicScene) {
@@ -1831,547 +1876,176 @@ void MainWidget::onPreviewScene()
}
pPicScene->clearSelection();
pPicScene->update();
QRect sceneRect = pPicScene->itemsBoundingRect().toRect();
QSize size = sceneRect.size();
bool MaxCol4000;
if(sysPara->status.flagOfNo67FPGA)
MaxCol4000 = true;
else
MaxCol4000 = false;
unsigned char *dat;
if(MaxCol4000){
dat = sysPara->status.printDat_Normal;
memset(dat,0,sizeof(sysPara->status.printDat_Normal));
}else{
dat = sysPara->status.printDat;
memset(dat,0,sizeof(sysPara->status.printDat));
}
const QRectF contentRect = pPicScene->itemsBoundingRect();
const QRect sceneRect = contentRect.toAlignedRect();
qDebug() << "sceneRect: " << sceneRect;
// 限定最大高度和宽度
int coldot = qMin(sceneRect.width(), MaxCol4000 ? MAX_PRINT_COL_NUM_Normal : MAX_PRINT_COL_NUM_Wide);
int maxPicHeight = qMin(sceneRect.height(), int(sysPara->para.canvasHeight));
QSize size(coldot,maxPicHeight);
if(size.isEmpty()) {
//场景为空时,渲染空场景并刷新界面
handleEmptySize();
return;
}
QImage image(size,QImage::Format_ARGB32);
QImage image(size, QImage::Format_ARGB32);
image.fill(0x00ffffff);//填充白色
//image.save("./printScene.jpg");//图片
QPainter painter(&image);
pPicScene->render(&painter,QRectF(), sceneRect);
int coldot=0;
if(sysPara){
bool MaxCol4000;
if(sysPara->status.flagOfNo67FPGA)
MaxCol4000 = true;
else
MaxCol4000 = false;
previewFlag=1;
sysPara->status.currPrintRow = 0;
sysPara->status.variNum = 0;
sysPara->status.QRvariNum = 0;
unsigned char *dat;
if(MaxCol4000){
dat =sysPara->status.printDat_Normal;
memset(dat,0,sizeof(sysPara->status.printDat_Normal));
}else{
dat =sysPara->status.printDat;
memset(dat,0,sizeof(sysPara->status.printDat));
}
//qDebug()<<"Preview:";
int firstRow = 0;
{
sysPara->status.addSpace = sysPara->para.checkSpace;
int myvariNum=0;
int expiryVarNum = 0;
coldot = sceneRect.width();
if(coldot > (MaxCol4000?MAX_PRINT_COL_NUM_Normal:MAX_PRINT_COL_NUM_Wide))
coldot = MaxCol4000?MAX_PRINT_COL_NUM_Normal:MAX_PRINT_COL_NUM_Wide;
int maxPicHeight = MAX_PRINT_ROW_NUM + 12;
QSize size(coldot,maxPicHeight);
sysPara->status.variNum = 0;
sysPara->status.QRvariNum = 0;
sysPara->status.addSpace = sysPara->para.checkSpace; // 空列已经弃用 __attribute__((deprecated))
sysPara->status.currPrintRow = 0;
sysPara->status.currPrintCol = coldot;
sysPara->status.ExpiryVarNum = 0;
sysPara->print.ExpiryVar.startColPos = 0;
sysPara->print.ExpiryVar.endRowPos = 0;
sysPara->print.ExpiryVar.letterSpace =0;
sysPara->print.CurDateVar.startColPos = 0;
sysPara->print.CurDateVar.endRowPos = 0;
sysPara->print.CurDateVar.letterSpace = 0;
sysPara->status.CurrDateVariNum = 0;
sysPara->status.currPrintRow =0;
sysPara->status.currPrintCol = coldot + ( sysPara->status.addSpace?coldot:0) ; //checkSpace
qDebug() << "Loading scene items: \r\n\r\n\r\n";
QImage image(size,QImage::Format_ARGB32);
image.fill(0x00ffffff);//填充白色
QPainter painter(&image);
QRectF validRectF(sceneRect.x(),sceneRect.y(),coldot,maxPicHeight);
pPicScene->render(&painter,QRectF(),validRectF);
int firstRow = 0;
int lastRow = firstRow + MAX_PRINT_ROW_NUM;
int TempVarNum=0;
int varLastRow=0;
lastRow = (lastRow>maxPicHeight)?maxPicHeight:lastRow;
QList<QGraphicsItem *> items = pPicScene->items();
foreach (QGraphicsItem *item, items) {
// 接下来就是要把打印到数据data填充以及确认变量的个数,变量对应的开始列和结束行
for(int j = 0; j < lastRow - firstRow; j++){ // Y
for(int i = 0; i < coldot; i++){ //
QRgb rgb = image.pixel(i,j + firstRow);
if(rgb&0x80000000){ //判断alpha
if((rgb & 0xf0f0ff) == 0xf0f000){ //处理变量, 查找左下角,因为同一行的左下角是对齐的 看起来这个颜色是黄色
bool foundvar=0;
if(j>0){
QRgb r_rgb = image.pixel(i,j + firstRow+1);
if((r_rgb & 0xf0f0ff) != 0xf0f000 ){foundvar =1;}
//QRgb r_rgb = image.pixel(i,j + firstRow-1);if((r_rgb & 0xf0f0ff) == 0xf0f000 )foundvar =0;
}
if(foundvar){
if(sysPara->status.variNum < MAX_VARI_NUM){
sysPara->status.vars[sysPara->status.variNum].startColPos = i+(sysPara->status.addSpace?i:0);
sysPara->status.vars[sysPara->status.variNum].endRowPos = j;
//if(varLastRow<j+1) varLastRow=j+1;
//sysPara->status.variNum ++;TempVarNum++;
//i+=5;//scene 每一行可能都包含变量
//qDebug()<<"VARr:"<<TempVarNum<<i<<j;
}
else TempVarNum++;
//dat[MAX_PRINT_ROW_BYTE_NUM*i + j/8] |= 1 << (j%8); //画黑点
}
}
else if( ((rgb & 0xfffff0) == 0x00ff10) || ((rgb & 0xfffff0) == 0x00ff20) ||((rgb & 0xfffff0) == 0x00ff30) ){
// 0xff00ff01(DMT) 0xff00ff02(QR) 0xff00ff03(BAR)
//qDebug()<<"FLAG:"<<i<<j+1<<QString().sprintf("%08X", rgb);
if(sysPara->status.QRvariNum>=4)continue;
if((rgb & 0x00ffff0) == 0x00ff10) { //MDT
sysPara->print.QRvars[sysPara->status.QRvariNum].type=MDT;
sysPara->print.QRvars[sysPara->status.QRvariNum].countEn=1;
sysPara->print.QRvars[sysPara->status.QRvariNum].Counter=sysPara->status.productCnt;
sysPara->print.QRvars[sysPara->status.QRvariNum].startColPos=i+(sysPara->status.addSpace?i:0);
sysPara->print.QRvars[sysPara->status.QRvariNum].endRowPos=j+1;
if(varLastRow<j+1) varLastRow=j+1;
sysPara->status.QRvariNum++;
}
else if((rgb & 0x00ffff0) == 0x00ff20) { //QR
sysPara->print.QRvars[sysPara->status.QRvariNum].type=QR;
sysPara->print.QRvars[sysPara->status.QRvariNum].countEn=1;
sysPara->print.QRvars[sysPara->status.QRvariNum].Counter=sysPara->status.productCnt;
sysPara->print.QRvars[sysPara->status.QRvariNum].startColPos=i+(sysPara->status.addSpace?i:0);
sysPara->print.QRvars[sysPara->status.QRvariNum].endRowPos=j+1;
if(varLastRow<j+1) varLastRow=j+1;
sysPara->status.QRvariNum++;
}
else if((rgb & 0x00fffff0) == 0x00ff30) { //BAR
sysPara->print.QRvars[sysPara->status.QRvariNum].type=BAR;
sysPara->print.QRvars[sysPara->status.QRvariNum].countEn=1;
sysPara->print.QRvars[sysPara->status.QRvariNum].Counter=sysPara->status.productCnt;
sysPara->print.QRvars[sysPara->status.QRvariNum].startColPos=i+(sysPara->status.addSpace?i:0);
sysPara->print.QRvars[sysPara->status.QRvariNum].endRowPos=j+1;
if(varLastRow<j+1) varLastRow=j+1;
sysPara->status.QRvariNum++;
}
if(sysPara->status.QRvariNum>=4)sysPara->status.QRvariNum=4;
}
else if((rgb & 0x00ffffff)==EXPIRY_VARI_RECONISE)
{ // 有效期变量 : 处理变量, 查找左下角,因为同一行的左下角是对齐的
bool foundExVar=0;
if(j>0){
QRgb r_rgb = image.pixel(i,j + firstRow+1);
if((r_rgb & 0x00ffffff) != EXPIRY_VARI_RECONISE ){foundExVar =1;}
}
if(foundExVar)
{
if(sysPara->status.ExpiryVarNum <2)
{
sysPara->print.ExpiryVar.startColPos = i+(sysPara->status.addSpace?i:0);
sysPara->print.ExpiryVar.endRowPos = j;
if(varLastRow<j+1) varLastRow=j+1;
sysPara->status.ExpiryVarNum ++;
i+=5;
}
//else TempVarNum++;
//dat[MAX_PRINT_ROW_BYTE_NUM*i + j/8] |= 1 << (j%8); //画黑点
}
}
else if((rgb & 0xfffff0)==0xff0cf0)
{ // 有效期变量 : 处理变量, 查找左下角,因为同一行的左下角是对齐的
bool foundExVar=0;
if(j>0){
QRgb r_rgb = image.pixel(i,j + firstRow+1);
if((r_rgb & 0xfffff0) != 0xff0cf0 ){foundExVar =1;}
}
if(foundExVar)
{
if(sysPara->status.ExpiryVarNum <2)
{
sysPara->print.CurDateVar.startColPos = i+(sysPara->status.addSpace?i:0);
sysPara->print.CurDateVar.endRowPos = j;
if(varLastRow<j+1) varLastRow=j+1;
sysPara->status.CurrDateVariNum ++;
i+=5;
}
//else TempVarNum++;
//dat[MAX_PRINT_ROW_BYTE_NUM*i + j/8] |= 1 << (j%8); //画黑点
}
}
else if((rgb & 0xffffff)==0xff00ff)
{ // 有效期变量 : 处理变量, 查找左下角,因为同一行的左下角是对齐的
{
if(sysPara->status.classVariNum <3) {
EXPIRYVAR_t *currCLass = &sysPara->print.ClassVari ;
currCLass->day = QDateTime::currentDateTime().date().day();
currCLass->startColPos = i+(sysPara->status.addSpace?i:0);
currCLass->endRowPos = j;
if(varLastRow<j+1) varLastRow=j+1;
sysPara->status.classVariNum ++;
i+=5;
}
}
}
else
{ //Y = 0.299*R' + 0.587*G' + 0.114*B //非变量
int y = (((rgb&0xff)*299 + ((rgb>>8)&0xff)*587 + ((rgb>>16)&0xff)*114))/1000;
if(y < 125 ){
dat[MAX_PRINT_ROW_BYTE_NUM*(i+(sysPara->status.addSpace?i:0)) + j/8] |= 1 << (j%8); //画黑点
if((j+1) > sysPara->status.currPrintRow) {
sysPara->status.currPrintRow = j+1;
}
}
}
}/*判断alpha end*/
}
}
if(TempVarNum>MAX_VARI_NUM){
setRunStatus(tr("变量数大于8个,某些变量将不起作用!!!"));
strTitle= tr("变量数大于8个,某些变量将不起作用!!!");
strTitle.append("\r\n");
strTitle.append(tr("请减少信息中的变量(或计数器)数量."));
QMessageBox::warning(this, tr("警告"),strTitle,QMessageBox::Ok);
}
sysPara->status.variNum = 0;
sysPara->status.ExpiryVarNum = 0;
sysPara->print.ExpiryVar.startColPos = 0;
sysPara->print.ExpiryVar.endRowPos = 0;
sysPara->print.ExpiryVar.letterSpace =0;
sysPara->print.CurDateVar.startColPos = 0;
sysPara->print.CurDateVar.endRowPos = 0;
sysPara->print.CurDateVar.letterSpace = 0;
sysPara->status.CurrDateVariNum = 0;
sysPara->status.QRvariNum=0;//lch add
int myvariNum=0;
int expiryVarNum = 0;
QList<QGraphicsItem *> items = pPicScene->items();
foreach (QGraphicsItem *item, items) {
PicTextItem *picText = qgraphicsitem_cast<PicTextItem*>(item);
bool ok;
int textvariNum=0;
int textColdot=0;
textColdot = picText->boundingRect().width();
if(textColdot > (MaxCol4000?MAX_PRINT_COL_NUM_Normal:MAX_PRINT_COL_NUM_Wide))
textColdot = MaxCol4000?MAX_PRINT_COL_NUM_Normal:MAX_PRINT_COL_NUM_Wide;
int maxTextHeight = MAX_PRINT_ROW_NUM + 12;
QSize textSize(textColdot, maxTextHeight);
QImage textImage(textSize,QImage::Format_ARGB32);
textImage.fill(0x00ffffff);//填充白色
//image.fill(0x00f0f000);//填充白色
QPainter textPainter(&textImage);
//textImage.save("./textImage.jpg");
//QRectF validtextRectF(picText->pos().x(),picText->pos().y(),textColdot,maxTextHeight);
QRectF validtextRectF(picText->pos().x(),picText->pos().y(),textColdot,picText->document()->size().height());
pPicScene->render(&textPainter,QRectF(),validtextRectF);
//qDebug()<<"validtextRectF:"<<validtextRectF;
//textImage.save("./textImage.bmp");
int textFirstRow = 0;
//qDebug()<<"textFirstRow:"<<textFirstRow;
int textLastRow = textFirstRow + MAX_PRINT_ROW_NUM;
int textItemPosX;
int textItemPosY;
textItemPosX = picText->pos().x() - sceneRect.x();
textItemPosY = picText->pos().y() - sceneRect.y();
//接下来就是要把打印到数据data填充以及确认变量的个数,变量对应的开始列和结束行
for(int j = 0; j < textLastRow - textFirstRow; j++){ // Y
for(int i = 0; i < textColdot; i++){ //
QRgb rgb = textImage.pixel(i,j + textFirstRow);
if((rgb&0x80000000)){ //判断alpha
if((rgb & 0xf0f0ff) == 0xf0f000){ //处理变量, 查找左下角,因为同一行的左下角是对齐的 看起来这个颜色是黄色
bool textfoundvar = 0;
if(j>0){
QRgb r_rgb = textImage.pixel(i,j + textFirstRow+1);
if((r_rgb & 0xf0f0ff) != 0xf0f000 )
{
textfoundvar =1;
}
}
if(textfoundvar){
if(sysPara->status.variNum < MAX_VARI_NUM){
sysPara->status.vars[sysPara->status.variNum].startColPos = i+(sysPara->status.addSpace?i:0)+textItemPosX;
sysPara->status.vars[sysPara->status.variNum].endRowPos = j+textItemPosY;
//qDebug()<<"sysPara->status.variNum:"<<sysPara->status.variNum;
//qDebug()<<"startColPos:"<<sysPara->status.vars[sysPara->status.variNum].startColPos;
//qDebug()<<"endRowPos:"<<sysPara->status.vars[sysPara->status.variNum].endRowPos;
if(varLastRow<j+1)
varLastRow=j+1;
sysPara->status.variNum ++;
textvariNum++;
i+=5;//scene 每一行可能都包含变量
//qDebug()<<"VARr:"<<TempVarNum<<i<<j;
//gItem = pPicScene->itemAt(i,j+firstRow);
//picText_var[i]= (PicTextItem*) gItem;
//picText_var_hash.insert(picText_var[i],i);
}
else
{
textvariNum++;
}
}
}
else if( ((rgb & 0xfffff0) == 0x00ff10) || ((rgb & 0xfffff0) == 0x00ff20) ||((rgb & 0xfffff0) == 0x00ff30) ){
// 0xff00ff01(DMT) 0xff00ff02(QR) 0xff00ff03(BAR)
//qDebug()<<"FLAG:"<<i<<j+1<<QString().sprintf("%08X", rgb);
if(sysPara->status.QRvariNum>=4)continue;
if((rgb & 0x00ffff0) == 0x00ff10) { //MDT
sysPara->print.QRvars[sysPara->status.QRvariNum].type=MDT;
sysPara->print.QRvars[sysPara->status.QRvariNum].countEn=1;
sysPara->print.QRvars[sysPara->status.QRvariNum].Counter=sysPara->status.productCnt;
sysPara->print.QRvars[sysPara->status.QRvariNum].startColPos=i+(sysPara->status.addSpace?i:0)+textItemPosX;
sysPara->print.QRvars[sysPara->status.QRvariNum].endRowPos=j+1+textItemPosY;
if(varLastRow<j+1) varLastRow=j+1;
sysPara->status.QRvariNum++;
}
else if((rgb & 0x00ffff0) == 0x00ff20) { //QR
sysPara->print.QRvars[sysPara->status.QRvariNum].type=QR;
sysPara->print.QRvars[sysPara->status.QRvariNum].countEn=1;
sysPara->print.QRvars[sysPara->status.QRvariNum].Counter=sysPara->status.productCnt;
sysPara->print.QRvars[sysPara->status.QRvariNum].startColPos=i+(sysPara->status.addSpace?i:0)+textItemPosX;
sysPara->print.QRvars[sysPara->status.QRvariNum].endRowPos=j+1+textItemPosY;
if(varLastRow<j+1) varLastRow=j+1;
sysPara->status.QRvariNum++;
}
else if((rgb & 0x00fffff0) == 0x00ff30) { //BAR
sysPara->print.QRvars[sysPara->status.QRvariNum].type=BAR;
sysPara->print.QRvars[sysPara->status.QRvariNum].countEn=1;
sysPara->print.QRvars[sysPara->status.QRvariNum].Counter=sysPara->status.productCnt;
sysPara->print.QRvars[sysPara->status.QRvariNum].startColPos=i+(sysPara->status.addSpace?i:0)+textItemPosX;
sysPara->print.QRvars[sysPara->status.QRvariNum].endRowPos=j+1+textItemPosY;
if(varLastRow<j+1) varLastRow=j+1;
sysPara->status.QRvariNum++;
}
if(sysPara->status.QRvariNum>=4)sysPara->status.QRvariNum=4;
}
//else if((rgb & 0xfffff0)==0xff00f0)
else if((rgb & 0x0000ffff)==EXPIRY_VARI_RECONISE)
{ // 有效期变量 : 处理变量, 查找左下角,因为同一行的左下角是对齐的
//qDebug()<<"found EXPIRY_VARI_RECONISE";
bool foundExVar=0;
if(j>0){
QRgb r_rgb = textImage.pixel(i,j + firstRow+1);
if(((r_rgb & 0x0000ffff) != EXPIRY_VARI_RECONISE )){foundExVar =1;}
}
if(foundExVar)
{
//if(sysPara->status.ExpiryVarNum <2)
{
//if(sysPara->print.ExpiryVar.endRowPos==0)
if(sysPara->status.ExpiryVarNum == 0)
{
sysPara->status.ExpiryVarNum ++;
}
sysPara->print.ExpiryVar.startColPos = i+(sysPara->status.addSpace?i:0)+textItemPosX;
sysPara->print.ExpiryVar.endRowPos = j+textItemPosY;
if(varLastRow<j+1) varLastRow=j+1;
i+=10;
//qDebug()<<"ExpiryVar ixj:"<<i<<"x"<<j + firstRow;
//qDebug()<<"qqqq textItemPosY:"<<textItemPosY;
//qDebug()<<"qqqq sysPara->print.ExpiryVar.endRowPos:"<<sysPara->print.ExpiryVar.endRowPos;
}
//else TempVarNum++;
//dat[MAX_PRINT_ROW_BYTE_NUM*i + j/8] |= 1 << (j%8); //画黑点
}
}
else if((rgb & 0xfffff0)==0xff0cf0)
{ // 有效期变量 : 处理变量, 查找左下角,因为同一行的左下角是对齐的
bool foundExVar=0;
if(j>0){
QRgb r_rgb = textImage.pixel(i,j + firstRow+1);
if((r_rgb & 0xfffff0) != 0xff0cf0 ){foundExVar =1;}
}
if(foundExVar)
{
//qDebug()<<"found CurDateVar";
//if(sysPara->status.ExpiryVarNum <2)
{
//if(sysPara->print.CurDateVar.endRowPos==0)
if(sysPara->status.CurrDateVariNum == 0)
{
sysPara->status.CurrDateVariNum ++;
//setRunStatus(QString("CurrDateVariNum(%1)").arg(sysPara->status.CurrDateVariNum));
}
sysPara->print.CurDateVar.startColPos = i+(sysPara->status.addSpace?i:0)+textItemPosX;
sysPara->print.CurDateVar.endRowPos = j + textItemPosY;
//qDebug()<<"CurDateVar ixj:"<<i<<"x"<<j + firstRow;
//qDebug()<<"sysPara->print.CurDateVar.endRowPos:"<<sysPara->print.CurDateVar.endRowPos;
if(varLastRow<j+1) varLastRow=j+1;
i+=10;
//j++;
}
//else TempVarNum++;
//dat[MAX_PRINT_ROW_BYTE_NUM*i + j/8] |= 1 << (j%8); //画黑点
}
}
if(j > sysPara->status.currPrintRow) {
sysPara->status.currPrintRow = j+textItemPosY;
}
}/*判断alpha end*/
}
}
//qDebug()<<"ExpiryVarNum:"<<sysPara->status.ExpiryVarNum;
//===================一般变量=====================
//myvariNum = 0;
QString textVariPattern = "<img src=\":/(\\d*)/(\\d*)/../image/digitalWidth(\\d*).bmp\" width=\"(\\d*)\" height=\"(\\d*)\" />";
QRegExp textrx(textVariPattern);
QString textHtml = picText->toHtml();
int from = 0;
//int myvariNum=0;
while(from < textHtml.size() && from != -1){
from = textHtml.indexOf(textrx,from);
if(from != -1){//找到匹配的
//qDebug()<<"found variable";
from ++;
//if(myvariNum < textvariNum)
if(myvariNum < sysPara->status.variNum)
{
sysPara->status.vars[myvariNum].digitalNum = textrx.cap(3).toInt(&ok);//第二个匹配,数字到个数
sysPara->status.vars[myvariNum].bold = (sysPara->status.vars[myvariNum].digitalNum%100) == 75;
if(sysPara->status.vars[myvariNum].bold)
sysPara->status.vars[myvariNum].digitalNum = sysPara->status.vars[myvariNum].digitalNum/100;
sysPara->status.vars[myvariNum].type = textrx.cap(2).toInt(&ok);//第一个匹配
sysPara->status.vars[myvariNum].width = textrx.cap(4).toInt(&ok)*(sysPara->status.addSpace?2:1);
sysPara->status.vars[myvariNum].height = textrx.cap(5).toInt(&ok);
//qDebug()<<"myvariNum endRowPos:"<<sysPara->status.vars[myvariNum].endRowPos;
//qDebug()<<"myvariNum height:"<<sysPara->status.vars[myvariNum].height;
sysPara->status.vars[myvariNum].startRowPos = sysPara->status.vars[myvariNum].endRowPos - sysPara->status.vars[myvariNum].height+1;
//sysPara->status.vars[myvariNum].startRowPos = sysPara->status.vars[myvariNum].endRowPos - sysPara->status.vars[myvariNum].height;
//qDebug()<<"start row:"<<sysPara->status.vars[myvariNum].startRowPos;
if(sysPara->status.vars[myvariNum].startRowPos<0)
sysPara->status.vars[myvariNum].startRowPos=0;
int item_x_start_pos = sysPara->status.vars[myvariNum].startColPos;
int item_x_end_pos = item_x_start_pos + sysPara->status.vars[myvariNum].width ;
if(item_x_end_pos > (MaxCol4000?MAX_PRINT_COL_NUM_Normal:MAX_PRINT_COL_NUM_Wide))
item_x_end_pos = MaxCol4000?MAX_PRINT_COL_NUM_Normal:MAX_PRINT_COL_NUM_Wide;
int item_y_start_pos = sysPara->status.vars[myvariNum].startRowPos;
int item_y_end_pos = sysPara->status.vars[myvariNum].endRowPos+1 ;
if(item_y_start_pos < 0)
item_y_start_pos = 0;
for(int i = item_x_start_pos; i < item_x_end_pos; i++){
for(int j = item_y_start_pos; j < item_y_end_pos; j++){
dat[MAX_PRINT_ROW_BYTE_NUM*(i+(sysPara->status.addSpace?0:0)) + j/8] &= ~(1 << (j%8)); //将画点取消掉
dat[MAX_PRINT_ROW_BYTE_NUM*(i+(sysPara->status.addSpace?0:0)) + j/8] &= ~(1 << (j%8));
}
}
sysPara->status.vars[myvariNum].height = textrx.cap(5).toInt(&ok)-1;
if(sysPara->status.vars[myvariNum].height>16 ){
if(sysPara->status.vars[myvariNum].height==24)
;
else {
if(sysPara->status.vars[myvariNum].startRowPos)
{
sysPara->status.vars[myvariNum].endRowPos--;
sysPara->status.vars[myvariNum].startRowPos--;
}
}
}
if(sysPara->status.vars[myvariNum].type == RANDOMNUM)
{
//qDebug()<<"RAND:"<<sysPara->status.vars[myvariNum].type<< sysPara->status.vars[myvariNum].digitalNum;
sysPara->status.RandomDigitNum = sysPara->status.vars[myvariNum].digitalNum;
}
int pixelSize = Public::derivePixelSizeFromHeight(sysPara->status.vars[myvariNum].height);
//qDebug()<<"MainWindows"<<sysPara->status.vars[myvariNum].height<<pixelSize;
sysPara->status.vars[myvariNum].letterSpace = 0;
if(sysPara->status.vars[myvariNum].digitalNum){ //算出letterspace
QFont font;
//font.setFamily(Public::getFontFamily(pixelSize));
font.setFamily(Public::getFontFamily(pixelSize,sysPara->status.vars[myvariNum].type )); // 20160812
//pixelSize==7? font.setFamily(ui->textEditOption->getLabelFontFamily()->text()):font.setFamily(Public::getFontFamily(pixelSize, 0));
font.setPixelSize(pixelSize);
font.setWeight(sysPara->status.vars[myvariNum].bold?QFont::Bold:QFont::Normal);
//font.setLetterSpacing(QFont::AbsoluteSpacing,sysPara->para.textEditCharSpace);
QFontMetrics fontMetrics(font);
int charWidth = (fontMetrics.width("0123456789"))/10 ;
// sysPara->status.vars[myvariNum].letterSpace = sysPara->para.textEditCharSpace;
sysPara->status.vars[myvariNum].letterSpace = picText->letterSpace();
//sysPara->status.vars[myvariNum].letterSpace =
//sysPara->status.vars[myvariNum].width/sysPara->status.vars[myvariNum].digitalNum/(sysPara->status.addSpace?2:1) - charWidth;
}
myvariNum++;
}
}
}
//==========================一般变量结束=======================
}
/*--------------------------------------------------------------------------*/
generateCharRamData();
if(sysPara->status.currPrintRow>MAX_PRINT_ROW_NUM-1)sysPara->status.currPrintRow=MAX_PRINT_ROW_NUM-1;
bool found=0;
lastRow = sysPara->status.currPrintRow;
//qDebug()<<"lastRow:"<<lastRow;
for(int j = sysPara->status.currPrintRow; j >2 ; j--){ //计算首行位置
for(int i = 0; i < coldot; i++){
if(dat[MAX_PRINT_ROW_BYTE_NUM*i + j/8] & (1 << (j%8))){
lastRow = j+1;
found=1;//qDebug()<<"fOUND:"<<i<<j<<dat[MAX_PRINT_ROW_BYTE_NUM*i + j/8]<<sysPara->status.currPrintRow;
break;
}
}
if(found)
break;
}
if(lastRow>MAX_PRINT_ROW_NUM-1)lastRow = MAX_PRINT_ROW_NUM-1;
if(lastRow<varLastRow)lastRow= varLastRow-1;//在场景模式下,变量的最低一行并不一定是打印的最后一行
if(lastRow<1) lastRow =1;
sysPara->status.currPrintRow =lastRow;
PicTextItem *picText = qgraphicsitem_cast<PicTextItem*>(item);
if(!picText)
continue;
qDebug() << "Item propertices: ";
qDebug() << picText->pos();
qDebug() << picText->boundingRect();
QXmlStreamAttributes attrs;
picText->saveAttrs(attrs);
for(auto attr : attrs) {
qDebug() << attr.name() << ": " << attr.value();
}
if(sysPara->status.QRvariNum) {
// onUpdateDispQRCode(1);
const QRectF itemSceneRect = item->sceneBoundingRect();
const QRectF clippedSceneRect = itemSceneRect.intersected(contentRect);
if(clippedSceneRect.isEmpty())
continue;
const QRect itemRect = clippedSceneRect.translated(-contentRect.topLeft()).toAlignedRect();
const QRectF sourceRect = clippedSceneRect;
if(picText && picText->sourceType() == SourceType::COUNTER) {
PicCounterItem* counterItem = qgraphicsitem_cast<PicCounterItem*>(picText);
if(!counterItem)
continue;
if(sysPara->status.variNum >= 8)
continue;
int varI = sysPara->status.variNum;
auto& varPara = sysPara->status.vars[varI];
varPara.type = int(counterItem->counterType());
varPara.digitalNum = counterItem->digitalNum();
varPara.width = itemRect.width();
varPara.height = itemRect.height();
varPara.startColPos = itemRect.left();
varPara.endRowPos = itemRect.bottom() + 1;
varPara.startRowPos = itemRect.top();
varPara.currVal = 0;
varPara.bold = 0;
varPara.letterSpace = counterItem->letterSpace();
++sysPara->status.variNum;
// // 将变量序号、类型、数字个数、大小位置打印到日志
// LogInfo::setRunStatusText("Variable " + QString::number(varI) + ": type=" + QString::number(varPara.type) +
// "\n digitalNum=" + QString::number(varPara.digitalNum) +
// "\n width=" + QString::number(varPara.width) +
// "\n height=" + QString::number(varPara.height) +
// "\n startColPos=" + QString::number(varPara.startColPos) +
// "\n endRowPos=" + QString::number(varPara.endRowPos) +
// "\n startRowPos=" + QString::number(varPara.startRowPos) +
// "\n letterSpace=" + QString::number(varPara.letterSpace));
}
int wmax = sysPara->status.currPrintRow;
sysPara->status.currAlterPrintRow = sysPara->status.currPrintRow/2;
if(sysPara->para.alterPrint.enable<1) sysPara->para.AlterMode=0;
else {
if(sysPara->para.AlterMode==0)sysPara->para.AlterMode=1;
wmax = sysPara->status.currAlterPrintRow;
pPicScene->render(&painter, itemRect, sourceRect);
}
/*-------------------------------切换到显示窗口-----------------------------------*/
qDebug() << "currPrintCol: " << sysPara->status.currPrintCol;
LogInfo::setRunStatusText("currPrintCol: " + QString::number(sysPara->status.currPrintCol));
LogInfo::setRunStatusText("currPrintRow: " + QString::number(sysPara->status.currPrintRow));
LogInfo::setRunStatusText(QString("Items bounding rect: {%1, %2}").arg(sceneRect.width()).arg(sceneRect.height()));
// sysPara->status.currPrintRow = sceneRect.height();
sysPara->status.currPrintCol = sceneRect.width();
auto rows = sysPara->para.AlterMode?sysPara->status.currAlterPrintRow : sysPara->status.currPrintRow;
rows = std::max(rows, (m_PrintDisplay->parentWidget()->height() / m_PrintDisplay->currScaleRatio()));
auto cols = sysPara->status.currPrintCol;
cols = std::max(cols, (m_PrintDisplay->parentWidget()->width() / m_PrintDisplay->currScaleRatio()));
m_PrintDisplay->setDisplaySize(cols, rows);
m_PrintDisplay->update();
}
previewFlag=0;
sysPara->status.currPrintRow = sceneRect.height();
sysPara->status.currPrintCol = sceneRect.width();
imageToPrintData(image, 0, 0);
// /*--------------------------------------------------------------------------*/
generateCharRamData();
if(sysPara->status.currPrintRow>MAX_PRINT_ROW_NUM-1)sysPara->status.currPrintRow=MAX_PRINT_ROW_NUM-1;
sysPara->status.currPrintRow = qMin(sysPara->status.currPrintRow, MAX_PRINT_ROW_NUM-1);
// 计算末行位置
bool found = false;
int lastRow = sysPara->status.currPrintRow;
for(int j = sysPara->status.currPrintRow; j > 2 ; j--){
for(int i = 0; i < coldot; i++){
if(dat[MAX_PRINT_ROW_BYTE_NUM*i + j/8] & (1 << (j%8))){
lastRow = j+1;
found = true;//qDebug()<<"fOUND:"<<i<<j<<dat[MAX_PRINT_ROW_BYTE_NUM*i + j/8]<<sysPara->status.currPrintRow;
break;
}
}
if(found)
break;
}
sysPara->status.currPrintRow = qBound(1, lastRow, MAX_PRINT_ROW_NUM - 1);
int wmax = sysPara->status.currPrintRow;
sysPara->status.currAlterPrintRow = sysPara->status.currPrintRow/2;
if(sysPara->para.alterPrint.enable<1) sysPara->para.AlterMode=0;
else {
if(sysPara->para.AlterMode==0)sysPara->para.AlterMode=1;
wmax = sysPara->status.currAlterPrintRow;
}
/*-------------------------------切换到显示窗口-----------------------------------*/
qDebug() << "currPrintCol: " << sysPara->status.currPrintCol;
LogInfo::setRunStatusText("currPrintCol: " + QString::number(sysPara->status.currPrintCol));
LogInfo::setRunStatusText("currPrintRow: " + QString::number(sysPara->status.currPrintRow));
LogInfo::setRunStatusText(QString("Items bounding rect: {%1, %2}").arg(sceneRect.width()).arg(sceneRect.height()));
// sysPara->status.currPrintRow = sceneRect.height();
sysPara->status.currPrintCol = sceneRect.width();
auto rows = sysPara->para.AlterMode?sysPara->status.currAlterPrintRow : sysPara->status.currPrintRow;
rows = std::max(rows, (m_PrintDisplay->parentWidget()->height() / m_PrintDisplay->currScaleRatio()));
auto cols = sysPara->status.currPrintCol;
cols = std::max(cols, (m_PrintDisplay->parentWidget()->width() / m_PrintDisplay->currScaleRatio()));
m_PrintDisplay->setDisplaySize(cols, rows);
m_PrintDisplay->update();
}
void MainWidget::handleEmptySize()
@@ -2387,7 +2061,6 @@ void MainWidget::handleEmptySize()
// pPicScene->render(&emptyPainter, QRectF(), QRectF(0, 0, emptySize.width(), emptySize.height()));
// 初始化打印参数,避免空场景导致的参数异常
previewFlag = 1;
sysPara->status.currPrintRow = 0;
sysPara->status.currPrintCol = 0; // emptySize.width();
sysPara->status.variNum = 0;
@@ -2405,7 +2078,6 @@ void MainWidget::handleEmptySize()
rows = std::max(rows, (m_PrintDisplay->parentWidget()->height() / m_PrintDisplay->currScaleRatio()));
m_PrintDisplay->setDisplaySize(m_PrintDisplay->parentWidget()->width() / m_PrintDisplay->currScaleRatio(), rows);
m_PrintDisplay->update();
previewFlag = 0;
return;
}
@@ -2873,6 +2545,7 @@ void MainWidget::UpdateUIVersion(){
QString VernonBach;
VernonBach.sprintf("A%d.%d.%02d%s%s", UP_PRINTER_MAJOR_VER, UP_PRINTER_MINOR_VER,UP_PRINTER_RIVISION_VER,SUB_VERSION,SUB_RFID);
VernonBach = VernonBach + (QString) Public::DateToString(__DATE__)+"_"+ QString(__TIME__)+"_";
QString Mac = QString::number(sysPara->status.machineMac);
LogInfo::setRunStatusText(QString("Mac:%1").arg(Mac));