PlotterHMI/datafile/hpgl/importhpgl.cpp
huahaiyan 80684daf9b 20240322
1、完善dxf解析
2024-03-22 15:58:53 +08:00

2580 lines
74 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 "importhpgl.h"
#include <QFile>
#include <qmath.h>
#include <QDebug>
#include <QList>
#include "vectorfont.h"
ImportHPGL::ImportHPGL(QObject *parent) :
QObject(parent)
{
m_iDPMM = 40;
m_iPenNo = 1;
m_ptCurrentPos = QPoint(0,0);
m_lineType.bDefault = true;
m_bPenUp = true;
m_pMarker = NULL;
m_dScale = (double)1.0;
m_chTerminator = 3;
m_nTerminatorMode = 1;
m_listXY.clear();
m_penPen.setColor(QColor(0,0,0));
m_cutPen.setColor(QColor(0,255,0));
m_halfCutPen.setColor(QColor(0,0,255));
m_dTextHeight = 0.375 * 10 * m_iDPMM;//字的高度
m_dTextWidth = 0.285 * 10 * m_iDPMM;//字的宽度
m_nLableOrigin = 1;//字符串相对于原点位置
m_dTextAngle = 0;//指定每行文本输出时相对于设备x轴的角度其单位为1/10度
m_dScaleX = 1;
m_dScaleY = 1;
m_ptOrigin = QPoint(0,0);
m_nLength = 0;
m_bPage = false;
m_bFontItalic = false;
m_iFontSize = 0;
m_strFontName = "";
m_pFileBuf = NULL;
}
ImportHPGL::~ImportHPGL()
{
}
int ImportHPGL::GetQRVesion(int nCount)
{
int nVesion = 1;
if (nCount < 17)
{
nVesion = 1;
}
else if ((nCount >= 17) && (nCount < 32))
{
nVesion = 2;
}
else if ((nCount >= 32) && (nCount < 53))
{
nVesion = 3;
}
else if ((nCount >= 53) && (nCount < 78))
{
nVesion = 4;
}
else if ((nCount >= 78) && (nCount < 106))
{
nVesion = 5;
}
else if ((nCount >= 106) && (nCount < 134))
{
nVesion = 6;
}
else if ((nCount >= 134) && (nCount < 154))
{
nVesion = 7;
}
else if ((nCount >= 154) && (nCount < 192))
{
nVesion = 8;
}
else if ((nCount >= 192) && (nCount < 230))
{
nVesion = 9;
}
else if ((nCount >= 230) && (nCount < 271))
{
nVesion = 10;
}
else
{
nVesion = 40;
}
return nVesion;
}
void ImportHPGL::PointRotate(QPoint &ptPoint, QPoint ptPointO, double dSinBeta, double dCosBeta)
{
int tx = ptPoint.x() - ptPointO.x();
int ty = ptPoint.y() - ptPointO.y();
int nx = tx*dCosBeta - ty*dSinBeta;
int ny = tx*dSinBeta + ty*dCosBeta;
ptPoint.setX(nx);
ptPoint.setY(ny);
}
void ImportHPGL::IniPara()
{
m_iPenNo = 1;
m_ptCurrentPos = QPoint(0,0);
m_lineType.bDefault = true;
m_bPenUp = true;
m_pMarker=NULL;
m_dScale=(double)1.0;
m_rotateAngle = 0;
m_chTerminator = 3;
m_nTerminatorMode = 1;
m_listXY.clear();
m_dTextHeight = 0.375 * 10 * m_iDPMM;//字的高度
m_dTextWidth = 0.285 * 10 * m_iDPMM;//字的宽度
m_nLableOrigin = 1;//字符串相对于原点位置
m_dTextAngle = 0;//指定每行文本输出时相对于设备x轴的角度其单位为1/10度
m_dScaleX = 1;
m_dScaleY = 1;
m_ptOrigin = QPoint(0,0);
m_nLength = 0;
m_bPage = false;
m_lineType.bDefault = true;
}
bool ImportHPGL::Read(QString strPathName,Marker *pMarker)
{
QFile file(strPathName);
char c;
bool bOk;
if(!file.open(QIODevice::ReadOnly))
{
qDebug() <<"file open failed";
return false;
}
m_pMarker=pMarker;
m_dScale=(double)m_pMarker->m_iDPMM / m_iDPMM;
m_listXY.clear();
m_nFileLength = file.size();
m_pFileBuf = new char[m_nFileLength];
file.read(m_pFileBuf,m_nFileLength);
file.close();
m_nCharCount = 0;
bOk=GetChar(&c);
while (bOk && m_nCharCount < m_nFileLength)
{
switch (c)
{
case 'S': //S命令
case 's':
bOk=S_Code();
break;
case 'I': //I命令
case 'i':
bOk=I_Code();
break;
case 'P': //P命令
case 'p':
bOk=P_Code();
break;
case 'L': //L命令
case 'l':
bOk=L_Code();
break;
case 'D':
case 'd':
bOk=D_Code();
break;
case 'C':
case 'c':
bOk=C_Code();
break;
case ';':
case ' ':
case 0x0A:
case 0x0D:
break;
default:
bOk = MoveToNextEnglishChar();
break;
}
if (bOk)
{
bOk=GetChar(&c);
if (m_nCharCount == m_nFileLength) bOk=true;
}
}
AddPolylineToMarker();
if (m_pFileBuf != NULL)
{
delete []m_pFileBuf;
m_pFileBuf = NULL;
}
return bOk;
}
#if(0)
void ImportHPGL::creatPolylinePainterPath()
{
if(m_pMarker == NULL){return;}
QPainterPath painterPath;
QRect rect = m_pMarker->GetRect();
int minX = rect.left();
int minY = rect.top();
int maxY = rect.bottom();
int nLineCount = m_pMarker->m_listPolyline.size();
// m_polyTextPath = QPainterPath();
for(int i = 0; i < nLineCount; i++)
{
CRPPolyline polyLine = m_pMarker->m_listPolyline.at(i);
int type = polyLine.m_nDrawingType;
// if(polyLine.m_nDrawingType == 3)//文字
// {
// CRPText text = polyLine.m_text;
// }
int nPointCount = polyLine.m_listPoint.size();
for(int j = 0; j < nPointCount; j++)
{
double x = (polyLine.m_listPoint.at(j).x() - minX)/(double)M_IDPMM*MMPIXELY;
double y = (maxY - polyLine.m_listPoint.at(j).y())/(double)M_IDPMM*MMPIXELY;
QPointF point(x,y);
if(j == 0)
{
painterPath.moveTo(point);
}
else
{
painterPath.lineTo(point);
}
}
}
m_polylinePainterPath = painterPath;
}
#endif
//读取一个非空格、非回车、非换行的字符
//输入参数:
// pFile 切割数据文件
//输出参数:
// *pChar 读取的字符
// bEndOfFile =true 已到文件尾
//返回值:
// true 成功取得一个字符
// false 失败
bool ImportHPGL::GetChar(char *pChar)
{
char c;
uint nCount;
bool bOk;
bOk=true;
nCount = ReadChar(&c);
while ((nCount == 1) && ((c == ' ') || (c == 0x0A) || (c == 0x0D)))
{
nCount = ReadChar(&c);
}
if (bOk && (nCount == 0))
{
bOk=false;
}
if (nCount == 1)
{
*pChar=c;
bOk=true;
}
return bOk;
}
uint ImportHPGL::ReadChar(char* lpBuf)
{
uint nCount = 1;
if (m_nCharCount < m_nFileLength)
{
*lpBuf = m_pFileBuf[m_nCharCount];
m_nCharCount = m_nCharCount + 1;
nCount = 1;
}
else
{
nCount = 0;
}
return nCount;
}
//判断下一个非空格、非回车、非换行的字符是不是','
//输入参数:
// pFile 切割数据文件
//输出参数:
// bEndOfFile =true 已到文件尾
//返回值:
// true 下一个非空格、非回车、非换行的字符是',', 并且已将','从文件中读出
// false 下一个非空格、非回车、非换行的字符不是',', 并且该字符没有从文件中读出
bool ImportHPGL::NextCharIsComma()
{
char cCh1;
bool bNextCharIsStart;
bNextCharIsStart=false;
if (GetChar(&cCh1))
{
if (cCh1 == ',')
{
bNextCharIsStart=true;
}
else
{
m_nCharCount = m_nCharCount - 1;
}
}
return bNextCharIsStart;
}
//取一个整数
//输入参数:
// pFile 切割数据文件
//输出参数:
// iValue 取得的整数
// bEndOfFile =true 已到文件尾
//返回值:
// true 成功取得一个整数iValue
// false 失败
bool ImportHPGL::GetIntegerData(int &iValue)
{
QString string1;
char c;
bool bOk,bNum;
bNum=false;
bOk=GetChar(&c);
if (bOk && (c == '-'))
{
string1=string1 + c;
bOk=GetChar(&c);
}
while (bOk)
{
if (('0' <= c) && (c <= '9'))
{
string1=string1 + c;
bNum=true;
}
else
{
m_nCharCount = m_nCharCount - 1;
break;
}
bOk=GetChar(&c);
}
if (!bOk)
{
if (m_nCharCount == m_nFileLength)
bOk=true;
}
if (!bNum)
bOk=false;
if (bOk)
iValue=string1.toInt();
return bOk;
}
//取一个双精度浮点数
//输入参数:
// pFile 切割数据文件
//输出参数:
// dValue 取得的双精度浮点数
// bEndOfFile =true 已到文件尾
//返回值:
// true 成功取得一个双精度浮点数dValue
// false 失败
bool ImportHPGL::GetDoubleData(double &dValue)
{
QString string1;
char c;
bool bOk,bNum;
bNum=false;
bOk=GetChar(&c);
if (bOk && (c == '-'))
{
string1=string1 + c;
bOk=GetChar(&c);
}
while (bOk)
{
if ((('0' <= c) && (c <= '9')) || c == '.')
{
string1=string1 + c;
bNum=true;
}
else
{
m_nCharCount = m_nCharCount - 1;
break;
}
bOk=GetChar(&c);
}
if (!bOk)
{
if (m_nCharCount == m_nFileLength)
bOk=true;
}
if (!bNum)
bOk=false;
if (bOk)
dValue=string1.toDouble();
return bOk;
}
//取坐标值
//输入参数:
// pFile 切割数据文件
//输出参数:
// ptPoint 坐标
// bEndOfFile =true 已到文件尾
//返回值:
// true 成功
// false 失败
bool ImportHPGL::GetCoordinate(QPoint &ptPoint)
{
bool bOk;
int iX,iY;
double x,y;
QString strInfo;
ptPoint=m_ptCurrentPos;
//bOk=GetIntegerData(x);
bOk=GetDoubleData(x);//为了兼容Gemini文件Gemini坐标不是整数是小数
if (bOk)
{
iX=(double)(x+m_nLength) * m_dScale * m_dScaleX;
ptPoint.setX(iX);
}
if (bOk)
{
bOk=SearchChar(',' ,strInfo);
if (bOk)
{
//bOk=GetIntegerData(y);
bOk=GetDoubleData(y);//为了兼容Gemini文件Gemini坐标不是整数是小数
if (bOk)
{
iY=(double)y * m_dScale * m_dScaleY;
ptPoint.setY(iY);
}
}
}
return bOk;
}
//获得线的类型
//输入参数:
// pFile 切割数据文件
//输出参数:
// lineType 线型
// bEndOfFile =true 已到文件尾
//返回值:
// true 成功
// false 失败
bool ImportHPGL::GetLineType(LineType &lineType)
{
bool bOk;
int nLineType, nPatternLength, nMode;
QString strInfo;
lineType = m_lineType;
bOk=GetIntegerData(nLineType);
if (bOk)
{
lineType.bDefault = false;
lineType.nLinetype = nLineType;
bOk=SearchChar( ',' ,strInfo);
if (bOk)
{
bOk=GetIntegerData(nPatternLength);
if (bOk)
{
lineType.nPatternLength = nPatternLength;
}
bOk=SearchChar( ';' ,strInfo);
if (bOk)
{
bOk=GetIntegerData(nMode);
if (bOk)
{
lineType.nMode = nMode;
}
}
else
{
lineType.nMode = 0;
}
}
else
{
lineType.nPatternLength = 4;
}
}
else
{
lineType.bDefault = true;
}
return bOk;
}
//查找一个指定的字符
//输入参数:
// pFile 切割数据文件
// cFind 指定的字符
//输出参数:
// bEndOfFile =true 已到文件尾
// strInfo 从开始位置到指定字符之前的内容(不包括最后的指定字符)
//返回值:
// true 成功取得一个字符
// false 失败
bool ImportHPGL::SearchChar(char cFind,QString &strInfo)
{
char c;
uint nCount;
bool bOk;
bOk=true;
strInfo.clear();
nCount = ReadChar(&c);
while ((nCount == 1) && (c != cFind))
{
strInfo = strInfo + c;
nCount = ReadChar(&c);
}
if (bOk && (nCount == 0))
{
bOk=false;
}
if (nCount == 1)
{
bOk=true;
}
return bOk;
}
//将文件的读取位置移到下一个英文字母(26个英文字母)
//输入参数:
// pFile 切割数据文件
//输出参数:
// bEndOfFile =true 已到文件尾
//返回值:
// true 成功将文件的读取位置移到下一个英文字母
// false 失败
bool ImportHPGL::MoveToNextEnglishChar()
{
char c;
uint nCount;
bool bOk, bFind;
bOk=true;
bFind = false;
nCount = ReadChar(&c);
while ((nCount == 1) && (!bFind))
{
if ((('A' <= c) && (c <= 'Z')) || (('a' <= c) && (c <= 'z')))
{
m_nCharCount = m_nCharCount - 1;
bFind = true;
}
else
{
nCount = ReadChar(&c);
}
}
return bOk;
}
//将m_listXY加入到m_pMarker中,并将m_listXY清空
void ImportHPGL::AddPolylineToMarker()
{
if(m_listXY.size() <= 0)
{
return;
}
//长度<0.2mm为钻孔
CRPPolyline RPPolyline1;
QPointF pt1,pt2;
CDrill drill;
bool bIsdirll = false;
if (m_listXY.size() >= 2)
{
if (m_listXY.size() == 2 && m_iPenNo == 3)
{
pt1 = m_listXY.at(0);
pt2 = m_listXY.at(1);
if (((pt1.x() - pt2.x())*(pt1.x() - pt2.x())+(pt1.y() - pt2.y())*(pt1.y() - pt2.y()))<=64)
{
bIsdirll = true;
}
}
if (bIsdirll)
{
drill.m_pt = pt1;
drill.m_nDrillType = 0;
drill.m_nAngle = 0;
RPPolyline1.m_nDrawingType = 5;
RPPolyline1.m_drill = drill;
RPPolyline1.m_nPenNo = drill.m_nDrillType;
}
else
{
RPPolyline1.m_nPenNo = m_iPenNo;
RPPolyline1.m_bPgEnd = m_bPage;
RPPolyline1.m_lineType = m_lineType;
RPPolyline1.m_listPoint.clear();
RPPolyline1.m_listPoint.append(m_listXY);
}
m_pMarker->m_listPolyline.append(RPPolyline1);
}
else
{
if (m_iPenNo == 20 && m_listXY.size() > 0)
{
drill.m_pt = m_listXY.at(0);
drill.m_nDrillType = 0;
drill.m_nAngle = 0;
RPPolyline1.m_nDrawingType = 5;
RPPolyline1.m_drill = drill;
RPPolyline1.m_nPenNo = drill.m_nDrillType;
m_pMarker->m_listPolyline.append(RPPolyline1);
}
}
m_listXY.clear();
return;
}
void ImportHPGL::AddPoint2listXY(QPoint ptPoint)
{
double angle, sina, cosa;
double rcx, rcy;
angle = sina = cosa = rcx = rcy = 0;
if(m_rotateAngle != 0)
{
angle = (m_rotateAngle * PI) / 180.0;
sina = (double)qSin(angle);
cosa = (double)qCos(angle);
}
if ((m_listXY.size() == 0) && (m_ptCurrentPos != ptPoint))
{
if(m_rotateAngle != 0)
{
rcx = (m_ptCurrentPos.x()*cosa - m_ptCurrentPos.y()*sina);
rcy = (m_ptCurrentPos.x()*sina + m_ptCurrentPos.y()*cosa);
m_ptCurrentPos.setX(rcx);
m_ptCurrentPos.setY(rcy);
}
m_listXY.append(m_ptCurrentPos);
}
if(m_rotateAngle != 0)
{
rcx = (ptPoint.x()*cosa - ptPoint.y()*sina);
rcy = (ptPoint.x()*sina + ptPoint.y()*cosa);
ptPoint.setX(rcx);
ptPoint.setY(rcy);
}
m_listXY.append(ptPoint);
}
void ImportHPGL::AddTextPointToLine(bool bUp,QPoint ptPoint)
{
if (bUp)
{
AddPolylineToMarker();
m_ptCurrentPos = ptPoint;
m_bPenUp = true;
}
else
{
AddPoint2listXY(ptPoint);
m_ptCurrentPos = ptPoint;
m_bPenUp = false;
}
}
QPoint ImportHPGL::GetTextOrigin(QPoint pt,QString strText)
{
int nLen;
double dTextAngle;
double dLength;
int iX;
int iY;
nLen = strText.size();
dTextAngle = m_dTextAngle/180.0*PI ;
switch(m_nLableOrigin)
{
case 1:
iX=pt.x()-(m_dTextHeight)*qSin(dTextAngle);
iY=pt.y()+(m_dTextHeight)*qCos(dTextAngle);
pt.setX(iX);
pt.setY(iY);
break;
case 2:
iX=pt.x()-(0.5*m_dTextHeight)*qSin(dTextAngle);
iY=pt.y()+(0.5*m_dTextHeight)*qCos(dTextAngle);
pt.setX(iX);
pt.setY(iY);
break;
case 4:
iX=pt.x()-(m_dTextHeight)*qSin(dTextAngle);
iY=pt.y()+(m_dTextHeight)*qCos(dTextAngle);
iX=iX-(0.5*nLen*m_dTextWidth)*qCos(dTextAngle);
iY=iY-(0.5*nLen*m_dTextWidth)*qSin(dTextAngle);
pt.setX(iX);
pt.setY(iY);
break;
case 5:
iX=pt.x()-(0.5*m_dTextHeight)*qSin(dTextAngle);
iY=pt.y()+(0.5*m_dTextHeight)*qCos(dTextAngle);
iX=iX-(0.5*nLen*m_dTextWidth)*qCos(dTextAngle);
iY=iY-(0.5*nLen*m_dTextWidth)*qSin(dTextAngle);
pt.setX(iX);
pt.setY(iY);
break;
case 6:
iX=pt.x()-(0.5*nLen*m_dTextWidth)*qCos(dTextAngle);
iY=pt.y()-(0.5*nLen*m_dTextWidth)*qSin(dTextAngle);
pt.setX(iX);
pt.setY(iY);
break;
case 7:
iX=pt.x()-(m_dTextHeight)*qSin(dTextAngle);
iY=pt.y()+(m_dTextHeight)*qCos(dTextAngle);
iX=iX-(nLen*m_dTextWidth)*qCos(dTextAngle);
iY=iY-(nLen*m_dTextWidth)*qSin(dTextAngle);
pt.setX(iX);
pt.setY(iY);
break;
case 8:
iX=pt.x()-(0.5*m_dTextHeight)*qSin(dTextAngle);
iY=pt.y()+(0.5*m_dTextHeight)*qCos(dTextAngle);
iX=iX-(nLen*m_dTextWidth)*qCos(dTextAngle);
iY=iY-(nLen*m_dTextWidth)*qSin(dTextAngle);
pt.setX(iX);
pt.setY(iY);
break;
case 9:
iX=pt.x()-(nLen*m_dTextWidth)*qCos(dTextAngle);
iY=pt.y()-(nLen*m_dTextWidth)*qSin(dTextAngle);
pt.setX(iX);
pt.setY(iY);
break;
case 11:
dTextAngle=qAtan2(0.25*m_dTextHeight,0.25*m_dTextWidth)+m_dTextAngle;
dTextAngle=dTextAngle/180.0*PI ;
dLength=qSqrt((0.25*m_dTextHeight)*(0.25*m_dTextHeight)+(0.25*m_dTextWidth)*(0.25*m_dTextWidth));
iX=pt.x()+dLength*qCos(dTextAngle);
iY=pt.y()+dLength*qSin(dTextAngle);
dTextAngle=m_dTextAngle/180.0*PI;
iX=iX-(m_dTextHeight)*qSin(dTextAngle);
iY=iY+(m_dTextHeight)*qCos(dTextAngle);
pt.setX(iX);
pt.setY(iY);
break;
case 12:
iX=pt.x()+(0.25*m_dTextWidth)*qCos(dTextAngle);
iY=pt.y()+(0.25*m_dTextWidth)*qSin(dTextAngle);
iX=iX-(0.5*m_dTextHeight)*qSin(dTextAngle);
iY=iY+(0.5*m_dTextHeight)*qCos(dTextAngle);
pt.setX(iX);
pt.setY(iY);
break;
case 13:
dTextAngle=qAtan2(0.25*m_dTextHeight,0.25*m_dTextWidth)-m_dTextAngle;
dTextAngle=dTextAngle/180.0*PI;
dLength=qSqrt((0.25*m_dTextHeight)*(0.25*m_dTextHeight)+(0.25*m_dTextWidth)*(0.25*m_dTextWidth));
iX=pt.x()+dLength*qCos(dTextAngle);
iY=pt.y()-dLength*qSin(dTextAngle);
dTextAngle=m_dTextAngle/180.0*PI;
pt.setX(iX);
pt.setY(iY);
break;
case 14:
iX=pt.x()-(1.25*m_dTextHeight)*qSin(dTextAngle);
iY=pt.y()+(1.25*m_dTextHeight)*qCos(dTextAngle);
iX=iX-(0.5*nLen*m_dTextWidth)*qCos(dTextAngle);
iY=iY-(0.5*nLen*m_dTextWidth)*qSin(dTextAngle);
pt.setX(iX);
pt.setY(iY);
break;
case 15:
iX=pt.x()-(0.5*m_dTextHeight)*qSin(dTextAngle);
iY=pt.y()+(0.5*m_dTextHeight)*qCos(dTextAngle);
iX=iX-(0.5*nLen*m_dTextWidth)*qCos(dTextAngle);
iY=iY-(0.5*nLen*m_dTextWidth)*qSin(dTextAngle);
pt.setX(iX);
pt.setY(iY);
break;
case 16:
iX=pt.x()+(0.25*m_dTextHeight)*qSin(dTextAngle);
iY=pt.y()-(0.25*m_dTextHeight)*qCos(dTextAngle);
iX=iX-(0.5*nLen*m_dTextWidth)*qCos(dTextAngle);
iY=iY-(0.5*nLen*m_dTextWidth)*qSin(dTextAngle);
pt.setX(iX);
pt.setY(iY);
break;
case 17:
dTextAngle=qAtan2(0.25*m_dTextHeight,0.25*m_dTextWidth)-m_dTextAngle;
dTextAngle=dTextAngle/180.0*PI;
dLength=qSqrt((0.25*m_dTextHeight)*(0.25*m_dTextHeight)+(0.25*m_dTextWidth)*(0.25*m_dTextWidth));
iX=pt.x()-dLength*qCos(dTextAngle);
iY=pt.y()+dLength*qSin(dTextAngle);
dTextAngle=m_dTextAngle/180.0*PI;
iX=iX-(m_dTextHeight)*qSin(dTextAngle);
iY=iY+(m_dTextHeight)*qCos(dTextAngle);
iX=iX-(nLen*m_dTextWidth)*qCos(dTextAngle);
iY=iY-(nLen*m_dTextWidth)*qSin(dTextAngle);
pt.setX(iX);
pt.setY(iY);
break;
case 18:
iX=pt.x()-(0.25*m_dTextWidth)*qCos(dTextAngle);
iY=pt.y()-(0.25*m_dTextWidth)*qSin(dTextAngle);
iX=iX-(0.5*m_dTextHeight)*qSin(dTextAngle);
iY=pt.y()+(0.5*m_dTextHeight)*qCos(dTextAngle);
iX=iX-(nLen*m_dTextWidth)*qCos(dTextAngle);
iY=iY-(nLen*m_dTextWidth)*qSin(dTextAngle);
pt.setX(iX);
pt.setY(iY);
break;
case 19:
dTextAngle=qAtan2(0.25*m_dTextHeight,0.25*m_dTextWidth)+m_dTextAngle;
dTextAngle=dTextAngle/180.0*PI;
dLength=sqrt((0.25*m_dTextHeight)*(0.25*m_dTextHeight)+(0.25*m_dTextWidth)*(0.25*m_dTextWidth));
iX=pt.x()-dLength*qCos(dTextAngle);
iY=pt.y()-dLength*qSin(dTextAngle);
dTextAngle=m_dTextAngle/180.0*PI;
iX=iX-(nLen*m_dTextWidth)*qCos(dTextAngle);
iY=iY-(nLen*m_dTextWidth)*qSin(dTextAngle);
pt.setX(iX);
pt.setY(iY);
break;
}
return pt;
}
double ImportHPGL::GetTextAngle(double dX,double dY)
{
double dAngle = 0;
if ((dX == 0) && (dY > 0))
{
dAngle = 90;
}
else if ((dX == 0) && (dY < 0))
{
dAngle = -90;
}
else if ((dX > 0) && (dY == 0))
{
dAngle = 0;
}
else if ((dX < 0) && (dY == 0))
{
dAngle = 180;
}
else if ((dX!=0) && (dY!=0))
{
dAngle=qAtan2(dY,dX)*180/PI;
}
double tmp = (dAngle - (int)dAngle);
if(qAbs((int)(tmp*10)) >= 5)
{
double angle = dAngle < 0 ? dAngle += -1 : dAngle+=1;
dAngle = angle;
}
dAngle = (int)dAngle;
return dAngle;
}
void ImportHPGL::SetScale()
{
double dScaleX,dScaleY;
switch(m_sc.nType)
{
case 0://异步
m_dScaleX=(double)(m_ptP2.x()-m_ptP1.x())/(m_sc.dXMax-m_sc.dXMin);
m_dScaleY=(double)(m_ptP2.y()-m_ptP1.y())/(m_sc.dYMax-m_sc.dYMin);
m_ptOrigin.setX(m_ptP1.x()-m_sc.dXMin*m_dScaleX);
m_ptOrigin.setY(m_ptP1.y()-m_sc.dYMin*m_dScaleY);
break;
case 1://同步
dScaleX=(double)(m_ptP2.x()-m_ptP1.x())/(m_sc.dXMax-m_sc.dXMin);
dScaleY=(double)(m_ptP2.y()-m_ptP1.y())/(m_sc.dYMax-m_sc.dYMin);
if(dScaleX>dScaleY) //x>y
{
m_dScaleX=dScaleY;
m_dScaleY=dScaleY;
m_ptOrigin.setY(m_ptP1.y());
m_ptOrigin.setX(((m_ptP2.x()-m_ptP1.x())-(m_sc.dXMax-m_sc.dXMin)*dScaleY)*m_sc.dLeft/100.0);
}
else //x<y
{
m_dScaleX=dScaleX;
m_dScaleY=dScaleX;
m_ptOrigin.setX(m_ptP1.x());
m_ptOrigin.setY(((m_ptP2.y()-m_ptP1.y())-(m_sc.dYMax-m_sc.dYMin)*dScaleX)*m_sc.dBottom/100.0);
}
break;
case 2://点因子
m_dScaleX=m_sc.dXMax;
m_dScaleY=m_sc.dYMax;
m_ptOrigin.setX(m_ptP1.x()-m_sc.dXMin*m_dScaleX);
m_ptOrigin.setY(m_ptP1.y()-m_sc.dYMin*m_dScaleY);
break;
}
}
bool ImportHPGL::IsSecretFile(QString strPatnName)
{
QFile file(strPatnName);
if (!file.open(QIODevice::ReadOnly))
{
return false;
}
int nLength = file.size();
if (nLength >= 22)
{
char cFileBuf[23];
file.read(&cFileBuf[0],22);
if((cFileBuf[0] == 0x66) && (cFileBuf[1] == 0x53) &&(strncmp(&cFileBuf[3],"Richpeace plot file",19) == 0))
{
file.close();
return true;
}
else
{
file.close();
return false;
}
}
return false;
}
int ImportHPGL::BitMapDtat(QString strFileName, QString strSecretFile)
{
int i,j,k,m,n,nRemainChar;
char cFileBuf[1025];
char cSecretBuf[256];
char errRe;
QFile file(strFileName);
int nLength;
BOOL bError = FALSE;
m=j=0;
nRemainChar = 0;
errRe=0;
QFile hFile(strSecretFile);
if (!hFile.open(QIODevice::WriteOnly|QIODevice::Truncate))
{
qDebug()<<"strSecretFile open false1";
return 0;
}
if(!file.open(QIODevice::ReadOnly))
{
qDebug()<<"strSecretFile open false1";
return 0;
}
nLength = file.size();
file.read(&cFileBuf[0],22);
i = 22;
for(;i<nLength;)
{
k = 0;
if (m < j)
{
while(k<(j-m))
{
cFileBuf[k] = cFileBuf[m+k];
k++;
}
j = 1024 - k;
}
else
j = 1024;
if (nRemainChar > 0)
{
n = 252 - nRemainChar + 2;
if (j > nRemainChar)
{
m = 254;
j -= nRemainChar;
i += nRemainChar;
}
else
{
m = n + j;
i += j;
j = 0;
}
if ((n < m) && ((nRemainChar & 0x01) != 0))
{
nRemainChar -= (m - n);
cFileBuf[k++] = cSecretBuf[n++] ^ cSecretBuf[1];
}
else
nRemainChar -= (m - n);
for (;n<m;)
{
cFileBuf[k++] = cSecretBuf[n++] ^ cSecretBuf[0];
cFileBuf[k++] = cSecretBuf[n++] ^ cSecretBuf[1];
}
}
while (j > 0)
{
if (nLength == i)
{
break;
}
if ((nLength - i) < 256)
{
bError = TRUE;
errRe = 1;
break;
}
file.read(cSecretBuf,256);
i += 256;
cSecretBuf[0] ^= cSecretBuf[254];
cSecretBuf[1] ^= cSecretBuf[255];
cSecretBuf[0] ^= 0xac;
cSecretBuf[1] ^= 0xe3;
if (j < 252)
{
m = j + 2;
nRemainChar = 252 - j;
j = 0;
i -= nRemainChar;
}
else
{
m = 254;
j -= 252;
nRemainChar = 0;
}
if ((m & 0x01) != 0)
{
m--;
for (n=2;n<m;)
{
cFileBuf[k++] = cSecretBuf[n++] ^ cSecretBuf[0];
cFileBuf[k++] = cSecretBuf[n++] ^ cSecretBuf[1];
}
cFileBuf[k++] = cSecretBuf[n++] ^ cSecretBuf[0];
}
else
{
for (n=2;n<m;)
{
cFileBuf[k++] = cSecretBuf[n++] ^ cSecretBuf[0];
cFileBuf[k++] = cSecretBuf[n++] ^ cSecretBuf[1];
}
}
}
j = k;
k = 0;
m = j;
hFile.write(cFileBuf, j);
if (bError)
break;
}
file.close();
hFile.close();
if(errRe == 0)
return TRUE;
else
return FALSE;
return 0;
}
bool ImportHPGL::ReadSecretFile(QString stePathName, Marker *pMarker)
{
QFile file(stePathName);
unsigned char c;
unsigned char *cPin;
int nParameter;
int nSecretFileLength;
unsigned char * pSecretFileBuf = NULL;
QString strTemp;
int i = 0;//加密指针pSecretFileBuf索引
VectorFont vectorFont;
connect(&vectorFont, SIGNAL(siLineTo(bool,QPoint)), this, SLOT(AddTextPointToLine(bool,QPoint)));
connect(&vectorFont, SIGNAL(siMoveTo(bool,QPoint)), this, SLOT(AddTextPointToLine(bool,QPoint)));
QPoint ptPoint;
int bitPost[8];
int bitDispStyle[2];
int bitGDIInfo[4];
CBitmapInfo bitmapInfo;
BYTE *pBmpData;
CRPPolyline RPPolyline;
CCode code;
QRcode *pCode;
double dSin,dCos;
int nPixelsDot;
CNotch notch;
CDrill drill;
PlotBitmap plotBitmap;
int pointx,pointy;
int notchPenNO = 5;
int iFontNameLenth = 0;
int notchOffsetX,notchOffsetY;
notchOffsetX = notchOffsetY = 0;
if (!file.open(QIODevice::ReadOnly))
{
return false;
}
m_pMarker = pMarker;
m_dScale = (double)m_pMarker->m_iDPMM / 40;
m_listXY.clear();
nSecretFileLength = file.size();
pSecretFileBuf = new unsigned char[nSecretFileLength];
if(pSecretFileBuf != NULL)
{
file.read((char*)pSecretFileBuf,nSecretFileLength);
}
file.close();
while (i < nSecretFileLength)
{
c = pSecretFileBuf[i++];
switch (c)
{
case DEFCMD_IN://0x8a://IN
break;
case DEFCMD_PG://0x97://PG
m_nLength = m_pMarker->GetRect().right();
break;
case DEFCMD_SP://0x7c:
{
AddPolylineToMarker();
unsigned char cTemp;
cTemp = pSecretFileBuf[i++];
m_iPenNo = cTemp;
}
break;
case DEFCMD_LT://0xe6:
{
c = pSecretFileBuf[i++];
c ^= 0xce;
if (c != 0)
{
if (c == 1)
c = 3;
else if (c == 2)
c = 1;
else
c = 8;
}
}
break;
case DEFCMD_SI://0x5d: 字体宽×高
{
cPin = (unsigned char *)&m_dTextWidth;
for(int nCount=7; nCount>=0; nCount--)
{
*(cPin+nCount) = pSecretFileBuf[i++];
}
m_dTextWidth = m_dTextWidth * 10 * M_IDPMM;
cPin = (unsigned char *)&m_dTextHeight;
for(int nCount=7; nCount>=0; nCount--)
{
*(cPin+nCount) = pSecretFileBuf[i++];
}
m_dTextHeight = m_dTextHeight * 10 * M_IDPMM;
}
break;
case DEFCMD_LB://0x4d:
{
AddPolylineToMarker();
cPin = (unsigned char *)&nParameter;
*(cPin+3) = pSecretFileBuf[i++];
*(cPin+2) = pSecretFileBuf[i++];
*(cPin+1) = pSecretFileBuf[i++];
*cPin = pSecretFileBuf[i++];
cPin = (unsigned char *)&pointx;
*(cPin+3) = pSecretFileBuf[i++];
*(cPin+2) = pSecretFileBuf[i++];
*(cPin+1) = pSecretFileBuf[i++];
*cPin = pSecretFileBuf[i++];
m_ptCurrentPos.setX(pointx);
cPin = (unsigned char *)&pointy;
*(cPin+3) = pSecretFileBuf[i++];
*(cPin+2) = pSecretFileBuf[i++];
*(cPin+1) = pSecretFileBuf[i++];
*cPin = pSecretFileBuf[i++];
m_ptCurrentPos.setY(pointy);
strTemp.clear();
QByteArray tempArr;
tempArr.clear();
for(int nCount=0; nCount<nParameter; nCount++)
{
tempArr.append(pSecretFileBuf[i++]);
}
//防止中文乱码
QTextCodec *gbkCodec = QTextCodec::codecForName("GBK");
strTemp = gbkCodec->toUnicode(tempArr);
m_ptCurrentPos = GetTextOrigin(m_ptCurrentPos,strTemp);
vectorFont.m_dFontHeight = m_dTextHeight;
vectorFont.m_dFontAngle = m_dTextAngle;
vectorFont.TextOutString(m_ptCurrentPos.x(),m_ptCurrentPos.y(),(const char*)strTemp.data(),strTemp.length());
}
break;
case DEFCMD_DI://0x5B:
{
cPin = (unsigned char *)&m_dTextAngle;
*(cPin+3) = pSecretFileBuf[i++];
*(cPin+2) = pSecretFileBuf[i++];
*(cPin+1) = pSecretFileBuf[i++];
*cPin = pSecretFileBuf[i++];
m_bFontItalic = pSecretFileBuf[i++];
cPin = (unsigned char *)&m_iFontSize;
*(cPin+3) = pSecretFileBuf[i++];
*(cPin+2) = pSecretFileBuf[i++];
*(cPin+1) = pSecretFileBuf[i++];
*cPin = pSecretFileBuf[i++];
}
break;
case DEFCMD_FN://0x4B:
{
m_strFontName = "";
cPin = (unsigned char *)&iFontNameLenth;
*(cPin+3) = pSecretFileBuf[i++];
*(cPin+2) = pSecretFileBuf[i++];
*(cPin+1) = pSecretFileBuf[i++];
*cPin = pSecretFileBuf[i++];
for (int a = 0; a < iFontNameLenth; a++)
{
char chTemp = pSecretFileBuf[i++];
m_strFontName = m_strFontName + chTemp;
}
}
break;
case DEFCMD_DRILL://0xD2:冲孔
{
AddPolylineToMarker();
cPin = (unsigned char *)&pointx;
*(cPin+3) = pSecretFileBuf[i++];
*(cPin+2) = pSecretFileBuf[i++];
*(cPin+1) = pSecretFileBuf[i++];
*cPin = pSecretFileBuf[i++];
drill.m_pt.setX(pointx);
cPin = (unsigned char *)&pointy;
*(cPin+3) = pSecretFileBuf[i++];
*(cPin+2) = pSecretFileBuf[i++];
*(cPin+1) = pSecretFileBuf[i++];
*cPin = pSecretFileBuf[i++];
drill.m_pt.setY(pointy);
cPin = (unsigned char *)&drill.m_nDrillType;
*(cPin+3) = pSecretFileBuf[i++];
*(cPin+2) = pSecretFileBuf[i++];
*(cPin+1) = pSecretFileBuf[i++];
*cPin = pSecretFileBuf[i++];
cPin = (unsigned char *)&drill.m_nAngle;
*(cPin+3) = pSecretFileBuf[i++];
*(cPin+2) = pSecretFileBuf[i++];
*(cPin+1) = pSecretFileBuf[i++];
*cPin = pSecretFileBuf[i++];
RPPolyline.m_nDrawingType = 5;
RPPolyline.m_drill = drill;
RPPolyline.m_nPenNo = drill.m_nDrillType;
m_pMarker->m_listPolyline.append(RPPolyline);
}
break;
case DEFCMD_NOTCH://0xD3:剪口
{
AddPolylineToMarker();
cPin = (unsigned char *)&pointx;
*(cPin+3) = pSecretFileBuf[i++];
*(cPin+2) = pSecretFileBuf[i++];
*(cPin+1) = pSecretFileBuf[i++];
*cPin = pSecretFileBuf[i++];
notch.m_ptStart.setX(pointx);
cPin = (unsigned char *)&pointy;
*(cPin+3) = pSecretFileBuf[i++];
*(cPin+2) = pSecretFileBuf[i++];
*(cPin+1) = pSecretFileBuf[i++];
*cPin = pSecretFileBuf[i++];
notch.m_ptStart.setY(pointy);
cPin = (unsigned char *)&pointx;
*(cPin+3) = pSecretFileBuf[i++];
*(cPin+2) = pSecretFileBuf[i++];
*(cPin+1) = pSecretFileBuf[i++];
*cPin = pSecretFileBuf[i++];
notch.m_ptEnd.setX(pointx);
cPin = (unsigned char *)&pointy;
*(cPin+3) = pSecretFileBuf[i++];
*(cPin+2) = pSecretFileBuf[i++];
*(cPin+1) = pSecretFileBuf[i++];
*cPin = pSecretFileBuf[i++];
notch.m_ptEnd.setY(pointy);
cPin = (unsigned char *)&notch.m_nWidth;
*(cPin+3) = pSecretFileBuf[i++];
*(cPin+2) = pSecretFileBuf[i++];
*(cPin+1) = pSecretFileBuf[i++];
*cPin = pSecretFileBuf[i++];
cPin = (unsigned char *)&notch.m_nNotchType;
*(cPin+3) = pSecretFileBuf[i++];
*(cPin+2) = pSecretFileBuf[i++];
*(cPin+1) = pSecretFileBuf[i++];
*cPin = pSecretFileBuf[i++];
notch.CovertToOutputByOffset(notchOffsetX,notchOffsetY);
RPPolyline.m_nDrawingType = 6;
RPPolyline.m_notch = notch;
RPPolyline.m_nPenNo = notchPenNO;
m_pMarker->m_listPolyline.append(RPPolyline);
}
break;
case DEFCMD_PU://0xb5:
case DEFCMD_LPU://0x5e:
{
AddPolylineToMarker();
cPin = (unsigned char *)&pointx;
*(cPin+3) = pSecretFileBuf[i++];
*(cPin+2) = pSecretFileBuf[i++];
*(cPin+1) = pSecretFileBuf[i++];
*cPin = pSecretFileBuf[i++];
ptPoint.setX(pointx);
cPin = (unsigned char *)&pointy;
*(cPin+3) = pSecretFileBuf[i++];
*(cPin+2) = pSecretFileBuf[i++];
*(cPin+1) = pSecretFileBuf[i++];
*cPin = pSecretFileBuf[i++];
ptPoint.setY(pointy);
m_ptCurrentPos = ptPoint;
m_bPenUp = true;
}
break;
case DEFCMD_PD://0x3d:
case DEFCMD_LPD://0x3b:
{
cPin = (unsigned char *)&pointx;
*(cPin+3) = pSecretFileBuf[i++];
*(cPin+2) = pSecretFileBuf[i++];
*(cPin+1) = pSecretFileBuf[i++];
*cPin = pSecretFileBuf[i++];
ptPoint.setX(pointx);
cPin = (unsigned char *)&pointy;
*(cPin+3) = pSecretFileBuf[i++];
*(cPin+2) = pSecretFileBuf[i++];
*(cPin+1) = pSecretFileBuf[i++];
*cPin = pSecretFileBuf[i++];
ptPoint.setY(pointy);
AddPoint2listXY(ptPoint);
m_ptCurrentPos = ptPoint;
}
break;
case DEFCMD_NULL://0x00:空指令
AddPolylineToMarker();
break;
case DEFCMD_BT://0x9a:
{
AddPolylineToMarker();
//位图的左上角在整个图中的X位置
//位图的左上角在整个图中的Y位置
//位图的左下角在整个图中的X位置
//位图的左下角在整个图中的Y位置
//位图的右上角在整个图中的X位置
//位图的右上角在整个图中的Y位置
//位图的右下角在整个图中的X位置
//位图的右下角在整个图中的Y位置
for(int nCount=0; nCount<8; nCount++)
{
cPin = (unsigned char *)&nParameter;
*(cPin+3) = pSecretFileBuf[i++];
*(cPin+2) = pSecretFileBuf[i++];
*(cPin+1) = pSecretFileBuf[i++];
*cPin = pSecretFileBuf[i++];
bitPost[nCount] = nParameter;
}
//为1时则为透明显示; 为0则为非透明显示
//背景颜色(在透明显示时背景颜色的点将不被显示)
for(int nCount=0; nCount<2; nCount++)
{
cPin = (unsigned char *)&nParameter;
*(cPin+3) = pSecretFileBuf[i++];
*(cPin+2) = pSecretFileBuf[i++];
*(cPin+1) = pSecretFileBuf[i++];
*cPin = pSecretFileBuf[i++];
bitDispStyle[nCount] = nParameter;
}
//GDI+中BitmapData的Width,单位:像素
//GDI+中BitmapData的Height,单位:像素
//GDI+中BitmapData的Stride(每行的字节数)
//GDI+中BitmapData的PixelFormat
for(int nCount=0; nCount<4; nCount++)
{
cPin = (unsigned char *)&nParameter;
*(cPin+3) = pSecretFileBuf[i++];
*(cPin+2) = pSecretFileBuf[i++];
*(cPin+1) = pSecretFileBuf[i++];
*cPin = pSecretFileBuf[i++];
bitGDIInfo[nCount] = nParameter;
}
//int压缩后位图数据大小(字节数) V1.01开始有此数据
cPin = (unsigned char *)&nParameter;
*(cPin+3) = pSecretFileBuf[i++];
*(cPin+2) = pSecretFileBuf[i++];
*(cPin+1) = pSecretFileBuf[i++];
*cPin = pSecretFileBuf[i++];
bitmapInfo.m_ptPostLU.setX(bitPost[0]);
bitmapInfo.m_ptPostLU.setY(bitPost[1]);
bitmapInfo.m_ptPostLD.setX(bitPost[2]);
bitmapInfo.m_ptPostLD.setY(bitPost[3]);
bitmapInfo.m_ptPostRU.setX(bitPost[4]);
bitmapInfo.m_ptPostRU.setY(bitPost[5]);
bitmapInfo.m_ptPostRD.setX(bitPost[6]);
bitmapInfo.m_ptPostRD.setY(bitPost[7]);
bitmapInfo.m_ptAbPostLU.setX(bitPost[0] + m_ptOrigin.x() + m_nLength);
bitmapInfo.m_ptAbPostLU.setY(bitPost[1] + m_ptOrigin.y());
bitmapInfo.m_ptAbPostLD.setX(bitPost[2] + m_ptOrigin.x() + m_nLength);
bitmapInfo.m_ptAbPostLD.setY(bitPost[3] + m_ptOrigin.y());
bitmapInfo.m_ptAbPostRU.setX(bitPost[4] + m_ptOrigin.x() + m_nLength);
bitmapInfo.m_ptAbPostRU.setY(bitPost[5] + m_ptOrigin.y());
bitmapInfo.m_ptAbPostRD.setX(bitPost[6] + m_ptOrigin.x() + m_nLength);
bitmapInfo.m_ptAbPostRD.setY(bitPost[7] + m_ptOrigin.y());
//正向旋转90度
if(m_rotateAngle != 0)
{
double angle,sina,cosa,rcx1,rcy1,rcx2,rcy2;
angle = (m_rotateAngle * PI) / 180.0;
sina = (double)qSin(angle);
cosa = (double)qCos(angle);
rcx1 = (bitmapInfo.m_ptAbPostLD.x()*cosa - bitmapInfo.m_ptAbPostLD.y()*sina);
rcy1 = (bitmapInfo.m_ptAbPostLD.x()*sina + bitmapInfo.m_ptAbPostLD.y()*cosa);
bitmapInfo.m_ptAbPostLD.setX(rcx1);
bitmapInfo.m_ptAbPostLD.setY(rcy1);
bitmapInfo.m_ptAbPostLU = bitmapInfo.m_ptAbPostLD;
rcx2 = (bitmapInfo.m_ptAbPostRU.x()*cosa - bitmapInfo.m_ptAbPostRU.y()*sina);
rcy2 = (bitmapInfo.m_ptAbPostRU.x()*sina + bitmapInfo.m_ptAbPostRU.y()*cosa);
bitmapInfo.m_ptAbPostRU.setX(rcx2);
bitmapInfo.m_ptAbPostRU.setY(rcy2);
bitmapInfo.m_ptAbPostRD = bitmapInfo.m_ptAbPostRU;
}
bitmapInfo.m_iTransparent = bitDispStyle[0];
bitmapInfo.m_iBKColor = bitDispStyle[1];
bitmapInfo.m_iWidth = bitGDIInfo[0];
bitmapInfo.m_iHeight = bitGDIInfo[1];
bitmapInfo.m_iStride = bitGDIInfo[2];
bitmapInfo.m_iPixelFormat = bitGDIInfo[3];
bitmapInfo.m_iBytes = nParameter;
QByteArray unBmpArr;
unBmpArr.clear();
pBmpData = new BYTE[bitmapInfo.m_iBytes];
for(int nCount=0; nCount<bitmapInfo.m_iBytes; nCount++)
{
pBmpData[nCount] = pSecretFileBuf[i++];
unBmpArr.append(pBmpData[nCount]);
}
QByteArray pUnCompressData;
pUnCompressData.clear();
//解压缩
// 文件路径
QDir apppath(qApp->applicationDirPath());
QFileInfo fileInfo(stePathName);
QString zipPath = fileInfo.absolutePath();//获取Secret.plt所在的目录
QString cpstePathName = stePathName;
QString zipFile = cpstePathName.remove(cpstePathName.length()-3,3) + "zip";
QFile file(zipFile);
if (!file.open(QIODevice::WriteOnly))
{
qDebug()<<"zipFile open false";
return false;
}
file.write(unBmpArr);
file.close();
//判断zip文件是否存在
if (!QFile::exists(zipFile))
{
qDebug() << "The zip file does not exist";
return false;
}
QZipReader reader(zipFile);
//解压到当前unzipfile文件夹目录
QString unzipPath = zipPath + apppath.separator() + "unzipfile";
QDir unzipDir(unzipPath);
if(!unzipDir.exists())
{
unzipDir.mkdir(unzipPath);
}
if (!reader.extractAll(unzipPath))
{
qDebug() << "Failed to extract all files from the zip.";
return false;
}
reader.close();
unzipDir.setFilter(QDir::Files | QDir::NoDotAndDotDot); //设置过滤
QFileInfoList fileList = unzipDir.entryInfoList(); // 获取所有的文件信息
QString unzipFilePath;
foreach (QFileInfo file, fileList)
{
if (file.isFile())
{
// 解压的文件
unzipFilePath = file.filePath();
QFile uncompressedFile(unzipFilePath);
if (!uncompressedFile.open(QIODevice::ReadOnly))
{
qDebug() << "Failed to open the uncompressedFile file";
return false;
}
pUnCompressData = uncompressedFile.readAll();
uncompressedFile.close();
break;
}
}
if(pUnCompressData.length() <= 0)
{
qDebug() << "pUnCompressData.length() <= 0";
return false;
}
// bitmapInfo.m_pBitmap = plotBitmap.Create1BPPBitmap(bitmapInfo.m_iTransparent,bitmapInfo.m_iBKColor,bitmapInfo.m_iWidth,bitmapInfo.m_iHeight,
// bitmapInfo.m_iStride,bitmapInfo.m_iPixelFormat, pUnCompressData.data());
bitmapInfo.m_pBitmap = plotBitmap.Create1BPPBitmap(bitmapInfo.m_iWidth,bitmapInfo.m_iHeight, (unsigned char*)pUnCompressData.data());
//正向旋转90度
if(m_rotateAngle != 0)
{
QImage rotatedBitmap = bitmapInfo.m_pBitmap.toImage().transformed(QTransform().rotate(90));
// 将旋转后的QImage转换回QBitmap
QBitmap rotatedBitmapQt(bitmapInfo.m_pBitmap.height(),bitmapInfo.m_pBitmap.width());
rotatedBitmapQt.fill(Qt::color0);
QPainter painter(&rotatedBitmapQt);
painter.drawPixmap(0, 0, QPixmap::fromImage(rotatedBitmap));
painter.end();
bitmapInfo.m_pBitmap = rotatedBitmapQt;
//rotatedBitmap.save("D:\\1.bmp");
}
QFile::remove(stePathName);
QFile::remove(zipFile);
QFile::remove(unzipFilePath);
delete pBmpData;
RPPolyline.m_nDrawingType = 1;
RPPolyline.m_bitmapInfo = bitmapInfo;
m_pMarker->m_listPolyline.append(RPPolyline);
}
break;
case DEFCMD_CODE://0xE7:
{
AddPolylineToMarker();
cPin = (unsigned char *)&code.m_nLX;
*(cPin+3) = pSecretFileBuf[i++];
*(cPin+2) = pSecretFileBuf[i++];
*(cPin+1) = pSecretFileBuf[i++];
*cPin = pSecretFileBuf[i++];
cPin = (unsigned char *)&code.m_nLY;
*(cPin+3) = pSecretFileBuf[i++];
*(cPin+2) = pSecretFileBuf[i++];
*(cPin+1) = pSecretFileBuf[i++];
*cPin = pSecretFileBuf[i++];
cPin = (unsigned char *)&code.m_nSizeX;
*(cPin+3) = pSecretFileBuf[i++];
*(cPin+2) = pSecretFileBuf[i++];
*(cPin+1) = pSecretFileBuf[i++];
*cPin = pSecretFileBuf[i++];
cPin = (unsigned char *)&code.m_nSizeY;
*(cPin+3) = pSecretFileBuf[i++];
*(cPin+2) = pSecretFileBuf[i++];
*(cPin+1) = pSecretFileBuf[i++];
*cPin = pSecretFileBuf[i++];
cPin = (unsigned char *)&code.m_nAngle;
*(cPin+3) = pSecretFileBuf[i++];
*(cPin+2) = pSecretFileBuf[i++];
*(cPin+1) = pSecretFileBuf[i++];
*cPin = pSecretFileBuf[i++];
cPin = (unsigned char *)&code.m_nType;
*(cPin+3) = pSecretFileBuf[i++];
*(cPin+2) = pSecretFileBuf[i++];
*(cPin+1) = pSecretFileBuf[i++];
*cPin = pSecretFileBuf[i++];
cPin = (unsigned char *)&code.m_nCount;
*(cPin+3) = pSecretFileBuf[i++];
*(cPin+2) = pSecretFileBuf[i++];
*(cPin+1) = pSecretFileBuf[i++];
*cPin = pSecretFileBuf[i++];
code.m_strCode.clear();
QByteArray codeArr;
codeArr.clear();
for(int nCount=0; nCount<code.m_nCount; nCount++)
{
codeArr.append(pSecretFileBuf[i++]);
}
//防止中文乱码
QTextCodec *gbkCodec = QTextCodec::codecForName("GBK");
code.m_strCode = gbkCodec->toUnicode(codeArr);
if (code.m_nType == 0)
{
}
else if (code.m_nType == 1)
{
int nVesion = GetQRVesion(code.m_nCount);
pCode = QRcode_encodeString(code.m_strCode.toStdString().c_str(),nVesion,QR_ECLEVEL_L,QR_MODE_8,1);
if (pCode != NULL)
{
int scale = 1;
int qrCode_Width = pCode->width > 0 ? pCode->width : 1;
int width = scale * qrCode_Width;
int height = scale * qrCode_Width;
QImage image(width, height, QImage::Format_ARGB32);
QPainter painter(&image);
QColor background(Qt::white);
painter.setBrush(background);
painter.setPen(Qt::NoPen);
painter.drawRect(0, 0, width, height);
QColor foreground(Qt::black);
painter.setBrush(foreground);
for(int y = 0; y < qrCode_Width; ++y)
{
for(int x = 0; x < qrCode_Width; ++x)
{
unsigned char character = pCode->data[y * qrCode_Width + x];
if(character & 0x01)
{
QRect rect(x * scale, y * scale, scale, scale);
painter.drawRects(&rect, 1);
}
}
}
QBitmap qrPixmap = QBitmap::fromImage(image);
//qrPixmap.save("D:\\1.bmp");
bitmapInfo.m_pBitmap = qrPixmap;
//正向旋转90度
if(m_rotateAngle != 0)
{
QImage rotatedBitmap = bitmapInfo.m_pBitmap.toImage().transformed(QTransform().rotate(90));
// 将旋转后的QImage转换回QBitmap
QBitmap rotatedBitmapQt(bitmapInfo.m_pBitmap.height(),bitmapInfo.m_pBitmap.width());
rotatedBitmapQt.fill(Qt::color0);
QPainter painter(&rotatedBitmapQt);
painter.drawPixmap(0, 0, QPixmap::fromImage(rotatedBitmap));
painter.end();
bitmapInfo.m_pBitmap = rotatedBitmapQt;
//rotatedBitmap.save("D:\\1.bmp");
}
if (code.m_nSizeY <= code.m_nSizeX)
{
nPixelsDot = (int)((double)code.m_nSizeY / (double)pCode->width + 0.5);
}
else
{
nPixelsDot = (int)((double)code.m_nSizeX / (double)pCode->width + 0.5);
}
int nStride = WIDTHBYTES(pCode->width * nPixelsDot);
bitmapInfo.m_ptPostLU.setX(code.m_nLX);
bitmapInfo.m_ptPostLU.setY(code.m_nLY);
bitmapInfo.m_ptPostLD.setX(code.m_nLX);
bitmapInfo.m_ptPostLD.setY(code.m_nLY - code.m_nSizeY);
bitmapInfo.m_ptPostRU.setX(code.m_nLX + code.m_nSizeX);
bitmapInfo.m_ptPostRU.setY(code.m_nLY);
bitmapInfo.m_ptPostRD.setX(code.m_nLX + code.m_nSizeX);
bitmapInfo.m_ptPostRD.setY(code.m_nLY - code.m_nSizeY);
dSin = sin(CONST_PI/180.0*code.m_nAngle/100.0);
dCos = cos(CONST_PI/180.0*code.m_nAngle/100.0);
PointRotate(bitmapInfo.m_ptPostLU,bitmapInfo.m_ptPostLU,dSin,dCos);
PointRotate(bitmapInfo.m_ptPostLD,bitmapInfo.m_ptPostLU,dSin,dCos);
PointRotate(bitmapInfo.m_ptPostRU,bitmapInfo.m_ptPostLU,dSin,dCos);
PointRotate(bitmapInfo.m_ptPostRD,bitmapInfo.m_ptPostLU,dSin,dCos);
bitmapInfo.m_ptAbPostLU.setX(bitmapInfo.m_ptPostLU.x() + m_ptOrigin.x() + m_nLength);
bitmapInfo.m_ptAbPostLU.setY(bitmapInfo.m_ptPostLU.y() + m_ptOrigin.y());
bitmapInfo.m_ptAbPostLD.setX(bitmapInfo.m_ptPostLD.x() + m_ptOrigin.x() + m_nLength);
bitmapInfo.m_ptAbPostLD.setY(bitmapInfo.m_ptPostLD.y() + m_ptOrigin.y());
bitmapInfo.m_ptAbPostRU.setX(bitmapInfo.m_ptPostRU.x() + m_ptOrigin.x() + m_nLength);
bitmapInfo.m_ptAbPostRU.setY(bitmapInfo.m_ptPostRU.y() + m_ptOrigin.y());
bitmapInfo.m_ptAbPostRD.setX(bitmapInfo.m_ptPostRD.x() + m_ptOrigin.x() + m_nLength);
bitmapInfo.m_ptAbPostRD.setY(bitmapInfo.m_ptPostRD.y() + m_ptOrigin.y());
if(m_rotateAngle != 0)
{
double angle,sina,cosa,rcx1,rcy1,rcx2,rcy2;
angle = (m_rotateAngle * PI) / 180.0;
sina = (double)qSin(angle);
cosa = (double)qCos(angle);
rcx1 = (bitmapInfo.m_ptAbPostLD.x()*cosa - bitmapInfo.m_ptAbPostLD.y()*sina);
rcy1 = (bitmapInfo.m_ptAbPostLD.x()*sina + bitmapInfo.m_ptAbPostLD.y()*cosa);
bitmapInfo.m_ptAbPostLD.setX(rcx1);
bitmapInfo.m_ptAbPostLD.setY(rcy1);
bitmapInfo.m_ptAbPostLU = bitmapInfo.m_ptAbPostLD;
rcx2 = (bitmapInfo.m_ptAbPostRU.x()*cosa - bitmapInfo.m_ptAbPostRU.y()*sina);
rcy2 = (bitmapInfo.m_ptAbPostRU.x()*sina + bitmapInfo.m_ptAbPostRU.y()*cosa);
bitmapInfo.m_ptAbPostRU.setX(rcx2);
bitmapInfo.m_ptAbPostRU.setY(rcy2);
bitmapInfo.m_ptAbPostRD = bitmapInfo.m_ptAbPostRU;
}
bitmapInfo.m_iTransparent = 0;
bitmapInfo.m_iBKColor = qRgb(255,255,255);
bitmapInfo.m_iWidth = pCode->width;
bitmapInfo.m_iHeight = pCode->width;
bitmapInfo.m_iStride = nStride;
bitmapInfo.m_iPixelFormat = PixelFormat1bppIndexed;
bitmapInfo.m_iBytes = pCode->width*nStride;
RPPolyline.m_nDrawingType = 1;
RPPolyline.m_bitmapInfo = bitmapInfo;
m_pMarker->m_listPolyline.append(RPPolyline);
QRcode_free(pCode);
}
#if(0)
if (code.m_nSizeY <= code.m_nSizeX)
{
nPixelsDot = (int)((double)code.m_nSizeY / (double)pCode->width + 0.5);
}
else
{
nPixelsDot = (int)((double)code.m_nSizeX / (double)pCode->width + 0.5);
}
int nStride = WIDTHBYTES(pCode->width * nPixelsDot);
BYTE* pData = new BYTE[pCode->width*nPixelsDot*nStride];
for (int y = 0; y < pCode->width; y++)
{
for (int x = 0; x < pCode->width; x++)
{
int nByte = x / 8;
int nBit = x % 8;
if ((pCode->data[y*pCode->width + x] & 0x01))
{
//SetUncharBit(pData[y*nStride+nByte],7-nBit,0);
for (nIndexRow = 0; nIndexRow < nPixelsDot; nIndexRow++)
{
for (nIndexCol = 0; nIndexCol < nPixelsDot; nIndexCol++)
{
nByte = (x * nPixelsDot + nIndexCol) / 8;
nBit = (x * nPixelsDot + nIndexCol) % 8;
plotBitmap.SetUncharBit(pData[(y*nPixelsDot +nIndexRow)*nStride + nByte], 7 - nBit, 0);
}
}
}
else
{
//SetUncharBit(pData[y*nStride+nByte],7-nBit,1);
for (nIndexRow = 0; nIndexRow < nPixelsDot; nIndexRow++)
{
for (nIndexCol = 0; nIndexCol < nPixelsDot; nIndexCol++)
{
nByte = (x * nPixelsDot + nIndexCol) / 8;
nBit = (x * nPixelsDot + nIndexCol) % 8;
plotBitmap.SetUncharBit(pData[(y * nPixelsDot + nIndexRow)*nStride + nByte], 7 - nBit, 1);
}
}
}
}
}
bitmapInfo.m_ptPostLU.setX(code.m_nLX);
bitmapInfo.m_ptPostLU.setY(code.m_nLY);
bitmapInfo.m_ptPostLD.setX(code.m_nLX);
bitmapInfo.m_ptPostLD.setY(code.m_nLY - code.m_nSizeY);
bitmapInfo.m_ptPostRU.setX(code.m_nLX + code.m_nSizeX);
bitmapInfo.m_ptPostRU.setY(code.m_nLY);
bitmapInfo.m_ptPostRD.setX(code.m_nLX + code.m_nSizeX);
bitmapInfo.m_ptPostRD.setY(code.m_nLY - code.m_nSizeY);
dSin = sin(CONST_PI/180.0*code.m_nAngle/100.0);
dCos = cos(CONST_PI/180.0*code.m_nAngle/100.0);
PointRotate(bitmapInfo.m_ptPostLU,bitmapInfo.m_ptPostLU,dSin,dCos);
PointRotate(bitmapInfo.m_ptPostLD,bitmapInfo.m_ptPostLU,dSin,dCos);
PointRotate(bitmapInfo.m_ptPostRU,bitmapInfo.m_ptPostLU,dSin,dCos);
PointRotate(bitmapInfo.m_ptPostRD,bitmapInfo.m_ptPostLU,dSin,dCos);
bitmapInfo.m_ptAbPostLU.setX(bitmapInfo.m_ptPostLU.x() + m_ptOrigin.x() + m_nLength);
bitmapInfo.m_ptAbPostLU.setY(bitmapInfo.m_ptPostLU.y() + m_ptOrigin.y());
bitmapInfo.m_ptAbPostLD.setX(bitmapInfo.m_ptPostLD.x() + m_ptOrigin.x() + m_nLength);
bitmapInfo.m_ptAbPostLD.setY(bitmapInfo.m_ptPostLD.y() + m_ptOrigin.y());
bitmapInfo.m_ptAbPostRU.setX(bitmapInfo.m_ptPostRU.x() + m_ptOrigin.x() + m_nLength);
bitmapInfo.m_ptAbPostRU.setY(bitmapInfo.m_ptPostRU.y() + m_ptOrigin.y());
bitmapInfo.m_ptAbPostRD.setX(bitmapInfo.m_ptPostRD.x() + m_ptOrigin.x() + m_nLength);
bitmapInfo.m_ptAbPostRD.setY(bitmapInfo.m_ptPostRD.y() + m_ptOrigin.y());
bitmapInfo.m_iTransparent = 0;
bitmapInfo.m_iBKColor = qRgb(255,255,255);
bitmapInfo.m_iWidth = pCode->width;
bitmapInfo.m_iHeight = pCode->width;
bitmapInfo.m_iStride = nStride;
bitmapInfo.m_iPixelFormat = PixelFormat1bppIndexed;
bitmapInfo.m_iBytes = pCode->width*nStride;
// bitmapInfo.m_pBitmap = plotBitmap.Create1BPPBitmap(bitmapInfo.m_iTransparent,bitmapInfo.m_iBKColor,bitmapInfo.m_iWidth*nPixelsDot,bitmapInfo.m_iHeight*nPixelsDot,
// bitmapInfo.m_iStride,bitmapInfo.m_iPixelFormat, (char*)pData);
bitmapInfo.m_pBitmap = plotBitmap.Create1BPPBitmap(bitmapInfo.m_iWidth*nPixelsDot,bitmapInfo.m_iHeight*nPixelsDot,pData);
RPPolyline.m_nDrawingType = 1;
RPPolyline.m_bitmapInfo = bitmapInfo;
m_pMarker->m_listPolyline.append(RPPolyline);//*/
/*code.m_pBitmap = Create1BPPBitmap(0,RGB(255,255,255),pCode->width,pCode->width,nStride,PixelFormat1bppIndexed,pData);
WritreBMP("D:\\345.bmp", pCode->width, pCode->width, nStride, PixelFormat1bppIndexed, pData);
RPPolyline.m_nDrawingType = 4;
RPPolyline.m_code = code;
m_pMarker->m_listPolyline.AddTail(RPPolyline);*/
QRcode_free(pCode);
delete []pData;
}
#endif
}
}
break;
default:
qDebug()<<tr("Encrypted file parsing error!");//加密文件解析错误!
break;
}
}
return true;
}
bool ImportHPGL::C_Code()
{
char cCh1;
bool bOk;
bOk=GetChar(&cCh1);
if (bOk)
{
switch (cCh1)
{
case 'I':
case 'i':
bOk = MoveToNextEnglishChar();
break;
default:
bOk = MoveToNextEnglishChar();
break;
}
}
return bOk;
}
//分析S指令
//输入参数:
// pFile 切割数据文件
//输出参数:
// bEndOfFile =true 已到文件尾
//返回值:
// true 正确的G指令
// false 不正确的G指令
bool ImportHPGL::S_Code()
{
char cCh1;
bool bOk;
QString strInfo;
bOk=GetChar(&cCh1);
if (bOk) {
switch (cCh1) {
case 'P':
case 'p':
AddPolylineToMarker();
GetIntegerData(m_iPenNo);
break;
case 'I':
case 'i':
bOk=GetDoubleData(m_dTextWidth);
m_dTextWidth = m_dTextWidth * 10 * m_iDPMM;
bOk=SearchChar( ',' ,strInfo);
bOk=GetDoubleData(m_dTextHeight);
m_dTextHeight = m_dTextHeight * 10 * m_iDPMM;
break;
case 'C':
case 'c':
SC_Code();
break;
default:
bOk = MoveToNextEnglishChar();
break;
}
}
return bOk;
}
bool ImportHPGL::SC_Code()
{
bool bOk;
QString strInfo;
double dXMin,dXMax,dYMin,dYMax;
int nType;
bOk = GetDoubleData(dXMin);
bOk=SearchChar(',' ,strInfo);
bOk = GetDoubleData(dXMax);
bOk=SearchChar(',' ,strInfo);
bOk = GetDoubleData(dYMin);
bOk=SearchChar(',',strInfo);
bOk = GetDoubleData(dYMax);
if (NextCharIsComma())
{
bOk = GetIntegerData(nType);
if (NextCharIsComma())
{
bOk = GetDoubleData(m_sc.dLeft);
bOk=SearchChar( ',',strInfo);
bOk = GetDoubleData(m_sc.dBottom);
}
}
else
{
nType = 0;
}
if (bOk)
{
m_sc.dXMin = dXMin;
m_sc.dXMax = dXMax;
m_sc.dYMin = dYMin;
m_sc.dYMax = dYMax;
m_sc.nType = nType;
SetScale();
}
bOk = MoveToNextEnglishChar();
return bOk;
}
bool ImportHPGL::I_Code()
{
char cCh1;
bool bOk;
QString strInfo;
bOk=GetChar(&cCh1);
if (bOk)
{
switch (cCh1)
{
case 'N':
case 'n':
break;
case 'P':
case 'p':
int nP1X,nP1Y,nP2X,nP2Y;
bOk = GetIntegerData(nP1X);
if (bOk)
{
bOk=SearchChar( ',' , strInfo);
bOk = GetIntegerData(nP1Y);
bOk=SearchChar(',' ,strInfo);
bOk = GetIntegerData(nP2X);
bOk=SearchChar(',' ,strInfo);
bOk = GetIntegerData(nP2Y);
}
if (bOk)
{
m_ptP1.setX(nP1X);
m_ptP1.setY(nP1Y);
m_ptP2.setX(nP2X);
m_ptP2.setY(nP2Y);
}
bOk = MoveToNextEnglishChar();
break;
default:
bOk = MoveToNextEnglishChar();
break;
}
}
return bOk;
}
bool ImportHPGL::PU_Code()
{
bool bOk;
QPoint ptPoint;
AddPolylineToMarker();
bOk = GetCoordinate(ptPoint);
if (bOk)
{
m_ptCurrentPos = ptPoint;
}
m_bPenUp = true;
bOk=true;
return bOk;
}
bool ImportHPGL::PD_Code()
{
bool bOk;
QPoint ptPoint;
bOk = GetCoordinate(ptPoint);
if (bOk)
{
AddPoint2listXY(ptPoint);
m_ptCurrentPos = ptPoint;
}
while (bOk)
{
if (NextCharIsComma())
{
bOk = GetCoordinate(ptPoint);
if (bOk)
{
AddPoint2listXY(ptPoint);
m_ptCurrentPos = ptPoint;
}
}
else
{
break;
}
}
m_bPenUp = false;
bOk=true;
return bOk;
}
bool ImportHPGL::P_Code()
{
bool bOk;
char c;
if (GetChar(&c))
{
switch (c)
{
case 'U':
case 'u':
PU_Code();
break;
case 'D':
case 'd':
PD_Code();
break;
case 'A':
case 'a':
if (m_bPenUp)
{
PU_Code();
}
else
{
PD_Code();
}
break;
case 'G':
case 'g':
m_bPage = true;
AddPolylineToMarker();
m_nLength = m_pMarker->GetRect().right();
//qDebug()<< "length:" << m_nLength;
//qDebug()<< "line count:" << m_pMarker->m_listPolyline.size();
m_bPage = false;
break;
default:
bOk = MoveToNextEnglishChar();
break;
}
}
bOk=true;
return bOk;
}
bool ImportHPGL::L_Code()
{
char cCh1;
bool bOk;
QString strText;
VectorFont vectorFont;
connect(&vectorFont, SIGNAL(siLineTo(bool,QPoint)), this, SLOT(AddTextPointToLine(bool,QPoint)));
connect(&vectorFont, SIGNAL(siMoveTo(bool,QPoint)), this, SLOT(AddTextPointToLine(bool,QPoint)));
bOk=GetChar(&cCh1);
if (bOk)
{
switch (cCh1)
{
case 'T':
case 't':
AddPolylineToMarker();
GetLineType(m_lineType);
bOk = MoveToNextEnglishChar();
break;
case 'B':
case 'b':
{
CRPPolyline crppolylineTemp;
AddPolylineToMarker();
bOk = SearchChar(m_chTerminator,strText);
m_ptCurrentPos = GetTextOrigin(m_ptCurrentPos,strText);
crppolylineTemp.m_nDrawingType = 3;
crppolylineTemp.m_text.m_strText = strText;
crppolylineTemp.m_text.m_ptTextPos = m_ptCurrentPos;
crppolylineTemp.m_text.m_dTextAngle = m_dTextAngle;
crppolylineTemp.m_text.m_nHeight = m_dTextHeight;
crppolylineTemp.m_text.m_nWidth = m_dTextWidth;
crppolylineTemp.m_text.m_ptPostLU = m_ptCurrentPos;
crppolylineTemp.m_text.m_ptPostLD = QPoint(m_ptCurrentPos.x(),m_ptCurrentPos.y()+m_dTextHeight);
crppolylineTemp.m_text.m_ptPostRU = QPoint(m_ptCurrentPos.x()+m_dTextWidth*strText.length(),m_ptCurrentPos.y());
crppolylineTemp.m_text.m_ptPostRD = QPoint(m_ptCurrentPos.x()+m_dTextWidth*strText.length(),m_ptCurrentPos.y()+m_dTextHeight);
//用线段方法绘制
#ifdef Q_OS_WIN
vectorFont.m_dFontHeight = m_dTextHeight;
vectorFont.m_dFontAngle = m_dTextAngle;
vectorFont.TextOutString(m_ptCurrentPos.x(),m_ptCurrentPos.y(),strText.toStdString().c_str(),strText.size());
#endif
//qDebug()<<crppolylineTemp.m_text.m_strText;
//m_pMarker->m_listPolyline.append(crppolylineTemp);//用文本方法绘制
}
break;
case 'O':
case 'o':
bOk=GetIntegerData(m_nLableOrigin);
break;
default:
bOk = MoveToNextEnglishChar();
break;
}
}
return bOk;
}
bool ImportHPGL::D_Code()
{
char cCh1;
bool bOk;
QString strInfo;
bOk=GetChar(&cCh1);
if (bOk) {
switch (cCh1) {
case 'F':
case 'f':
break;
case 'I':
case 'i':
double dX,dY;
bOk = GetDoubleData(dX);
if (bOk)
{
bOk = SearchChar(',' ,strInfo);
bOk = GetDoubleData(dY);
}
else
{
dX = 1;
dY = 0;
}
m_dTextAngle = GetTextAngle(dX,dY);
bOk = MoveToNextEnglishChar();
break;
case 'T':
case 't':
char chTerminator;
int nTerminatorMode;
bOk = GetChar(&chTerminator);
if (bOk)
{
m_chTerminator = chTerminator;
bOk = GetIntegerData(nTerminatorMode);
if (bOk)
{
m_nTerminatorMode = nTerminatorMode;
}
}
bOk = MoveToNextEnglishChar();
break;
default:
bOk = MoveToNextEnglishChar();
break;
}
}
return bOk;
}
bool ImportHPGL::Write(QString strPathName,Marker *pMarker)
{
QFile *writeFile = new QFile(strPathName);
writeFile->open(QIODevice::ReadWrite | QFile::Truncate);
// 如果文件没有被占用可以打开
// 创建stream
QTextStream txtOutput(writeFile);
QString strHPGL = "IN;DF;SP0;PU0,0;";
//int nLength = 0;
int i,j;
int iLineCount,iPointCount;
QString strTemp;
int nOldPenNo = 0;
bool bSetLT = false;
iLineCount = pMarker->m_listPolyline.size();
for (i = 0; i < iLineCount; i++)
{
CRPPolyline polyLine = pMarker->m_listPolyline.at(i);
if (polyLine.m_lineType.bDefault == false)
{
bSetLT = true;
strTemp = QString("LT%1,%2,%3;").arg(polyLine.m_lineType.nLinetype).arg(polyLine.m_lineType.nPatternLength).arg(1);
}
else
{
if (bSetLT)
strTemp = "LT;";
}
strHPGL = strHPGL + strTemp;
if (polyLine.m_nDrawingType == 0)
{
iPointCount = polyLine.m_listPoint.size();
//选择画笔 1为笔绘 3为半透切割 其它为切割
if (nOldPenNo != polyLine.m_nPenNo)
{
if (polyLine.m_nPenNo == 1)
{
strTemp = QString("SP%1;").arg(polyLine.m_nPenNo);
nOldPenNo = polyLine.m_nPenNo;
}
else if (polyLine.m_nPenNo == 3)
{
strTemp = QString("SP%1;").arg(polyLine.m_nPenNo);
nOldPenNo = polyLine.m_nPenNo;
}
else
{
strTemp = QString("SP%1;").arg(polyLine.m_nPenNo);
nOldPenNo = polyLine.m_nPenNo;
}
strHPGL = strHPGL + strTemp;
}
for (j = 0; j < iPointCount; j++)
{
QPointF pt = polyLine.m_listPoint.at(j);
if (j == 0)
{
strTemp = QString("PU%1,%2;").arg(pt.x()).arg(pt.y());
}
else if(j == 1)
{
if (j + 1 == iPointCount)
{
strTemp = QString("PD%1,%2;").arg(pt.x()).arg(pt.y());
}
else
{
strTemp = QString("PD%1,%2,").arg(pt.x()).arg(pt.y());
}
}
else
{
if (j + 1 == iPointCount)
{
strTemp = QString("%1,%2;").arg(pt.x()).arg(pt.y());
}
else
{
strTemp = QString("%1,%2,").arg(pt.x()).arg(pt.y());
}
}
strHPGL = strHPGL + strTemp;
}
}
else if (polyLine.m_nDrawingType == 5)
{
strTemp = "SP20;";
strHPGL = strHPGL + strTemp;
strTemp = QString("PU%1,%2;").arg(polyLine.m_drill.m_pt.x()).arg(polyLine.m_drill.m_pt.y());
strHPGL = strHPGL + strTemp;
strTemp = QString("PD%1,%2;").arg(polyLine.m_drill.m_pt.x()).arg(polyLine.m_drill.m_pt.y());
strHPGL = strHPGL + strTemp;
nOldPenNo = 20;
}
// 在stream追加数据并换行
txtOutput << strHPGL << endl;
strHPGL = "";
}
strHPGL = strHPGL + "SP0;";
//nLength = strHPGL.size();
// 在stream追加数据并换行
txtOutput << strHPGL << endl;
strHPGL = "";
writeFile->close();
return true;
}
#if(0)
QPainterPath ImportHPGL::GetPolylinePainterPath()
{
return m_polylinePainterPath;
}
#endif
#if(0)
int ImportHPGL::CreatePreviewImage(QString saveName,QImage *pImg, int saveflag)
{
QImage * pImage = NULL;
int width, height;
width = height = 0;
if (pImg == NULL)
{
width = (m_maxX - m_minX) / M_IDPMM + 2*PREVIEW_SIDE;
height = (m_maxY - m_minY) / M_IDPMM+ 2*PREVIEW_SIDE;
pImage = new QImage(width, height, QImage::Format_ARGB32); //
}
else
{
pImage = pImg;
}
width = pImage->width();
height = pImage->height();
if (width < PREVIEW_SIDE*2 || height < PREVIEW_SIDE*2)
{
if (pImage != NULL)
{
delete pImage;
}
return -1;
}
QPainter painter(pImage);
QColor backcolor(255, 255, 255, 255);
QColor pencolor(0, 0, 0, 255);
// 背景
QPen pen;
pen.setWidth(1);
pen.setColor(backcolor);
painter.setPen(pen);
painter.setBrush(backcolor);
painter.drawRect(0, 0, width, height);
// 图形显示区域
int dpminx = PREVIEW_SIDE;
int dpmaxx = width - PREVIEW_SIDE;
int dpminy = PREVIEW_SIDE;
int dpmaxy = height - PREVIEW_SIDE;
// 计算缩放系数
double factor, temp;
factor = (double)(abs(m_maxX - m_minX)) / (dpmaxx - dpminx); // 按x计算的缩放系数
temp = (double)(abs(m_maxY - m_minY)) / (dpmaxy - dpminy); // 按轮廓计算,最小能够放下重复次数个图形
if (temp >= factor) // 使用较大的缩放系数
{
factor = temp;
}
// 计算显示参数,按照图形的实际位置显示(数据坐标零点对应图形中心)
int dpx = (int)((dpminx+dpmaxx)/2 - ((m_maxX+m_minX)/factor)/2);
int dpy = (int)((dpminy+dpmaxy)/2 - ((m_maxY+m_minY)/factor)/2);
int curx, cury, prex, prey;
curx = cury = prex = prey = 0;
curx = dpx;
cury = (height) - dpy;
pen.setColor(pencolor);
painter.setPen(pen);
int nLineCount = m_pMarker->m_listPolyline.size();
for(int i = 0; i < nLineCount; i++)
{
CRPPolyline polyLine = m_pMarker->m_listPolyline.at(i);
int nPointCount = polyLine.m_listPoint.size();
for(int j = 0; j < nPointCount; j++)
{
prex = curx;
prey = cury;
curx = polyLine.m_listPoint.at(j).x() / factor+ dpx;
cury = height - (polyLine.m_listPoint.at(j).y() / factor + dpy);
if(j == 0)
{
continue;
}
painter.drawLine(prex, prey, curx, cury);
}
}
// 保存成文件
if (saveflag != 0)
{
saveName += ".preview.bmp";
pImage->save(saveName, "bmp");
}
if (pImage != NULL)
{
pImage = NULL;
delete pImage;
}
return 0;
}
#endif