Added detail texts to layout mode

--HG--
branch : feature
This commit is contained in:
BojanKverh 2016-07-19 02:26:50 +02:00
parent c9ee648cb8
commit 9368978039
7 changed files with 169 additions and 31 deletions

View file

@ -477,7 +477,7 @@ void MainWindowsNoGUI::PrepareDetailsForLayout(const QHash<quint32, VDetail> *de
const VPatternPieceData& data = d.GetPatternPieceData();
if (data.IsVisible() == true)
{
det.SetDetailLabelPoints(data.GetPos(), data.GetLabelWidth(), data.GetLabelHeight(), data.GetRotation());
det.SetDetail(d.getName(), data);
}
const VPatternInfoGeometry& geom = d.GetPatternInfo();
if (geom.IsVisible() == true)

View file

@ -32,6 +32,8 @@
#include <QGraphicsItem>
#include <QPainterPath>
#include <QFont>
#include <QFontMetrics>
#include <QApplication>
#if QT_VERSION < QT_VERSION_CHECK(5, 1, 0)
# include "../vmisc/vmath.h"
@ -43,12 +45,12 @@
//---------------------------------------------------------------------------------------------------------------------
VLayoutDetail::VLayoutDetail()
:VAbstractDetail(), d(new VLayoutDetailData)
:VAbstractDetail(), d(new VLayoutDetailData), m_tmDetail()
{}
//---------------------------------------------------------------------------------------------------------------------
VLayoutDetail::VLayoutDetail(const VLayoutDetail &detail)
:VAbstractDetail(detail), d (detail.d)
:VAbstractDetail(detail), d(detail.d), m_tmDetail(detail.m_tmDetail)
{}
//---------------------------------------------------------------------------------------------------------------------
@ -60,6 +62,7 @@ VLayoutDetail &VLayoutDetail::operator=(const VLayoutDetail &detail)
}
VAbstractDetail::operator=(detail);
d = detail.d;
m_tmDetail = detail.m_tmDetail;
return *this;
}
@ -114,22 +117,63 @@ QVector<QPointF> VLayoutDetail::GetLayoutAllowencePoints() const
}
//---------------------------------------------------------------------------------------------------------------------
QVector<QPointF> VLayoutDetail::GetDetailLabelPoints() const
void VLayoutDetail::SetDetail(const QString& qsName, const VPatternPieceData& data)
{
return d->detailLabel;
}
//---------------------------------------------------------------------------------------------------------------------
void VLayoutDetail::SetDetailLabelPoints(const QPointF& ptPos, qreal dWidth, qreal dHeight, qreal dRot)
{
qreal dAng = qDegreesToRadians(dRot);
QPointF ptCenter(ptPos.x() + dWidth/2, ptPos.y() + dHeight/2);
d->detailData = data;
qreal dAng = qDegreesToRadians(data.GetRotation());
QPointF ptCenter(data.GetPos().x() + data.GetLabelWidth()/2, data.GetPos().y() + data.GetLabelHeight()/2);
QPointF ptPos = data.GetPos();
QVector<QPointF> v;
v << ptPos << QPointF(ptPos.x() + dWidth, ptPos.y()) << QPointF(ptPos.x() + dWidth, ptPos.y() + dHeight)
<< QPointF(ptPos.x(), ptPos.y() + dHeight);
v << ptPos << QPointF(ptPos.x() + data.GetLabelWidth(), ptPos.y())
<< QPointF(ptPos.x() + data.GetLabelWidth(), ptPos.y() + data.GetLabelHeight())
<< QPointF(ptPos.x(), ptPos.y() + data.GetLabelHeight());
for (int i = 0; i < v.count(); ++i)
v[i] = RotatePoint(ptCenter, v[i], dAng);
d->detailLabel = RoundPoints(v);
// generate text
QFont fnt = QApplication::font();
m_tmDetail.SetFont(fnt);
m_tmDetail.SetFontSize(data.GetFontSize());
m_tmDetail.Clear();
TextLine tl;
// letter
tl.m_qsText = data.GetLetter();
if (tl.m_qsText.isEmpty() == false)
{
tl.m_eAlign = Qt::AlignCenter;
tl.m_eFontWeight = QFont::Bold;
tl.m_eStyle = QFont::StyleNormal;
tl.m_iFontSize = 6;
m_tmDetail.AddLine(tl);
}
// name
if (qsName.isEmpty() == false)
{
tl.m_qsText = qsName;
tl.m_eFontWeight = QFont::DemiBold;
tl.m_iFontSize = 2;
m_tmDetail.AddLine(tl);
}
// MCP
QString qsText = "Cut %1 of %2%3";
QStringList qslPlace;
qslPlace << "" << " on Fold";
tl.m_eAlign = Qt::AlignLeft | Qt::AlignVCenter;
tl.m_eFontWeight = QFont::Normal;
tl.m_iFontSize = 0;
for (int i = 0; i < data.GetMCPCount(); ++i)
{
MaterialCutPlacement mcp = data.GetMCP(i);
if (mcp.m_iCutNumber > 0)
{
tl.m_qsText = qsText.arg(mcp.m_iCutNumber).arg(mcp.m_qsMaterialUserDef).arg(qslPlace[int(mcp.m_ePlacement)]);
m_tmDetail.AddLine(tl);
}
}
// will generate the lines of text
m_tmDetail.IsBigEnough(data.GetLabelWidth(), data.GetLabelHeight(), data.GetFontSize());
}
//---------------------------------------------------------------------------------------------------------------------
@ -461,7 +505,7 @@ QPainterPath VLayoutDetail::ContourPath() const
if (d->detailLabel.count() > 0)
{
points = Map(d->detailLabel);
points = Map(Mirror(d->detailLabel));
points.push_back(points.at(0));
QPainterPath pathDet;
@ -472,11 +516,46 @@ QPainterPath VLayoutDetail::ContourPath() const
}
path.addPath(pathDet);
qreal dAng = qAtan2(points.at(1).y() - points.at(0).y(), points.at(1).x() - points.at(0).x());
qreal dW = GetDistance(points.at(0), points.at(1));
qreal dY = 0;
qreal dX;
for (int i = 0; i < m_tmDetail.GetCount(); ++i)
{
const TextLine& tl = m_tmDetail.GetLine(i);
QFont fnt = m_tmDetail.GetFont();
fnt.setPixelSize(m_tmDetail.GetFont().pixelSize() + tl.m_iFontSize);
fnt.setWeight(tl.m_eFontWeight);
fnt.setStyle(tl.m_eStyle);
dY += tl.m_iHeight;
QMatrix mat;
mat.translate(points.at(0).x(), points.at(0).y());
mat.rotate(qRadiansToDegrees(dAng));
QFontMetrics fm(fnt);
if ((tl.m_eAlign & Qt::AlignLeft) > 0)
{
dX = 0;
}
else if ((tl.m_eAlign & Qt::AlignHCenter) > 0)
{
dX = (dW - fm.width(tl.m_qsText))/2;
}
else
{
dX = dW - fm.width(tl.m_qsText);
}
QPainterPath pathText;
pathText.addText(dX, dY - (fm.height() - fm.ascent())/2, fnt, tl.m_qsText);
path.addPath(mat.map(pathText));
dY += m_tmDetail.GetSpacing();
}
}
if (d->patternInfo.count() > 0)
{
points = Map(d->patternInfo);
points = Map(Mirror(d->patternInfo));
points.push_back(points.at(0));
QPainterPath pathDet;
@ -540,3 +619,30 @@ QPointF VLayoutDetail::RotatePoint(const QPointF &ptCenter, const QPointF& pt, q
return ptDest + ptCenter;
}
//---------------------------------------------------------------------------------------------------------------------
QVector<QPointF> VLayoutDetail::Mirror(const QVector<QPointF> &points) const
{
// should only call this method with rectangular shapes
Q_ASSERT(points.count() == 4);
if (d->mirror == false)
{
return points;
}
QVector<QPointF> v;
v.resize(4);
v[0] = points.at(2);
v[1] = points.at(3);
v[2] = points.at(0);
v[3] = points.at(1);
return v;
}
//---------------------------------------------------------------------------------------------------------------------
qreal VLayoutDetail::GetDistance(const QPointF &pt1, const QPointF &pt2) const
{
qreal dX = pt1.x() - pt2.x();
qreal dY = pt1.y() - pt2.y();
return qSqrt(dX*dX + dY*dY);
}

View file

@ -30,6 +30,8 @@
#define VLAYOUTDETAIL_H
#include "vabstractdetail.h"
#include "../vpatterndb/vpatternpiecedata.h"
#include "../vtools/tools/vtextmanager.h"
#include <QMatrix>
#include <QPointF>
@ -54,8 +56,7 @@ public:
QVector<QPointF> GetLayoutAllowencePoints() const;
void SetLayoutAllowencePoints();
QVector<QPointF> GetDetailLabelPoints() const;
void SetDetailLabelPoints(const QPointF& ptPos, qreal dWidth, qreal dHeight, qreal dRot);
void SetDetail(const QString &qsName, const VPatternPieceData& data);
QVector<QPointF> GetPatternInfoPoints() const;
void SetPatternInfoPoints(const QPointF& ptPos, qreal dWidth, qreal dHeight, qreal dRot);
@ -88,12 +89,15 @@ public:
QGraphicsItem *GetItem() const Q_REQUIRED_RESULT;
private:
QSharedDataPointer<VLayoutDetailData> d;
QSharedDataPointer<VLayoutDetailData> d;
VTextManager m_tmDetail;
QVector<QPointF> Map(const QVector<QPointF> &points) const;
static QVector<QPointF> RoundPoints(const QVector<QPointF> &points);
QPointF RotatePoint(const QPointF& ptCenter, const QPointF& pt, qreal dAng) const;
QVector<QPointF> Mirror(const QVector<QPointF>& points) const;
qreal GetDistance(const QPointF& pt1, const QPointF& pt2) const;
};
Q_DECLARE_TYPEINFO(VLayoutDetail, Q_MOVABLE_TYPE);

View file

@ -34,6 +34,8 @@
#include <QVector>
#include <QTransform>
#include "../vpatterndb/vpatternpiecedata.h"
#ifdef Q_CC_GNU
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Weffc++"
@ -45,13 +47,14 @@ public:
VLayoutDetailData()
:contour(QVector<QPointF>()), seamAllowence(QVector<QPointF>()), layoutAllowence(QVector<QPointF>()),
matrix(QMatrix()), layoutWidth(0), mirror(false), detailLabel(QVector<QPointF>()),
patternInfo(QVector<QPointF>())
patternInfo(QVector<QPointF>()), detailData()
{}
VLayoutDetailData(const VLayoutDetailData &detail)
:QSharedData(detail), contour(detail.contour), seamAllowence(detail.seamAllowence),
layoutAllowence(detail.layoutAllowence), matrix(detail.matrix), layoutWidth(detail.layoutWidth),
mirror(detail.mirror), detailLabel(detail.detailLabel), patternInfo(detail.patternInfo)
mirror(detail.mirror), detailLabel(detail.detailLabel), patternInfo(detail.patternInfo),
detailData(detail.detailData)
{}
~VLayoutDetailData() {}
@ -77,6 +80,8 @@ public:
QVector<QPointF> detailLabel;
/** @brief pattern info rectangle */
QVector<QPointF> patternInfo;
/** @brief detail data */
VPatternPieceData detailData;
private:
VLayoutDetailData &operator=(const VLayoutDetailData &) Q_DECL_EQ_DELETE;

View file

@ -20,36 +20,57 @@ VTextManager::~VTextManager()
//---------------------------------------------------------------------------------------------------------------------
int VTextManager::GetSpacing() const
{ return 2; }
{
return 2;
}
//---------------------------------------------------------------------------------------------------------------------
void VTextManager::SetFont(const QFont& font)
{ m_font = font; }
{
m_font = font;
}
//---------------------------------------------------------------------------------------------------------------------
const QFont& VTextManager::GetFont() const
{ return m_font; }
{
return m_font;
}
//---------------------------------------------------------------------------------------------------------------------
void VTextManager::SetFontSize(int iFS)
{ m_font.setPixelSize(iFS); }
{
m_font.setPixelSize(iFS);
}
//---------------------------------------------------------------------------------------------------------------------
void VTextManager::AddLine(const TextLine& tl)
{ m_liLines << tl; }
{
m_liLines << tl;
}
//---------------------------------------------------------------------------------------------------------------------
void VTextManager::Clear()
{ m_liLines.clear(); }
{
m_liLines.clear();
}
//---------------------------------------------------------------------------------------------------------------------
int VTextManager::GetCount() const
{ return m_liOutput.count(); }
{
return m_liOutput.count();
}
//---------------------------------------------------------------------------------------------------------------------
int VTextManager::GetSourceLineCount() const
{
return m_liLines.count();
}
//---------------------------------------------------------------------------------------------------------------------
const TextLine& VTextManager::GetLine(int i) const
{ return m_liOutput[i]; }
{
return m_liOutput[i];
}
//---------------------------------------------------------------------------------------------------------------------
bool VTextManager::IsBigEnough(qreal fW, qreal fH, int iFontSize)

View file

@ -32,6 +32,7 @@ public:
void AddLine(const TextLine& tl);
void Clear();
int GetCount() const;
int GetSourceLineCount() const;
const TextLine& GetLine(int i) const;
bool IsBigEnough(qreal fW, qreal fH, int iFontSize);

View file

@ -712,7 +712,8 @@ void VToolDetail::UpdateLabel()
tl.m_eAlign = Qt::AlignLeft | Qt::AlignVCenter;
tl.m_eFontWeight = QFont::Normal;
tl.m_iFontSize = 0;
for (int i = 0; i < data.GetMCPCount(); ++i) {
for (int i = 0; i < data.GetMCPCount(); ++i)
{
MaterialCutPlacement mcp = data.GetMCP(i);
if (mcp.m_iCutNumber > 0)
{