From 9368978039c12337bdbbfacfd302f7892a9184e3 Mon Sep 17 00:00:00 2001 From: BojanKverh Date: Tue, 19 Jul 2016 02:26:50 +0200 Subject: [PATCH] Added detail texts to layout mode --HG-- branch : feature --- src/app/valentina/mainwindowsnogui.cpp | 2 +- src/libs/vlayout/vlayoutdetail.cpp | 136 ++++++++++++++++++++++--- src/libs/vlayout/vlayoutdetail.h | 10 +- src/libs/vlayout/vlayoutdetail_p.h | 9 +- src/libs/vtools/tools/vtextmanager.cpp | 39 +++++-- src/libs/vtools/tools/vtextmanager.h | 1 + src/libs/vtools/tools/vtooldetail.cpp | 3 +- 7 files changed, 169 insertions(+), 31 deletions(-) diff --git a/src/app/valentina/mainwindowsnogui.cpp b/src/app/valentina/mainwindowsnogui.cpp index eb359d25a..d2cecb66d 100644 --- a/src/app/valentina/mainwindowsnogui.cpp +++ b/src/app/valentina/mainwindowsnogui.cpp @@ -477,7 +477,7 @@ void MainWindowsNoGUI::PrepareDetailsForLayout(const QHash *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) diff --git a/src/libs/vlayout/vlayoutdetail.cpp b/src/libs/vlayout/vlayoutdetail.cpp index 69eee267b..251fd2269 100644 --- a/src/libs/vlayout/vlayoutdetail.cpp +++ b/src/libs/vlayout/vlayoutdetail.cpp @@ -32,6 +32,8 @@ #include #include #include +#include +#include #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 VLayoutDetail::GetLayoutAllowencePoints() const } //--------------------------------------------------------------------------------------------------------------------- -QVector 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 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 VLayoutDetail::Mirror(const QVector &points) const +{ + // should only call this method with rectangular shapes + Q_ASSERT(points.count() == 4); + if (d->mirror == false) + { + return points; + } + + QVector 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); +} diff --git a/src/libs/vlayout/vlayoutdetail.h b/src/libs/vlayout/vlayoutdetail.h index 59b7fd53a..b639420b9 100644 --- a/src/libs/vlayout/vlayoutdetail.h +++ b/src/libs/vlayout/vlayoutdetail.h @@ -30,6 +30,8 @@ #define VLAYOUTDETAIL_H #include "vabstractdetail.h" +#include "../vpatterndb/vpatternpiecedata.h" +#include "../vtools/tools/vtextmanager.h" #include #include @@ -54,8 +56,7 @@ public: QVector GetLayoutAllowencePoints() const; void SetLayoutAllowencePoints(); - QVector GetDetailLabelPoints() const; - void SetDetailLabelPoints(const QPointF& ptPos, qreal dWidth, qreal dHeight, qreal dRot); + void SetDetail(const QString &qsName, const VPatternPieceData& data); QVector 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 d; + QSharedDataPointer d; + VTextManager m_tmDetail; QVector Map(const QVector &points) const; static QVector RoundPoints(const QVector &points); QPointF RotatePoint(const QPointF& ptCenter, const QPointF& pt, qreal dAng) const; + QVector Mirror(const QVector& points) const; + qreal GetDistance(const QPointF& pt1, const QPointF& pt2) const; }; Q_DECLARE_TYPEINFO(VLayoutDetail, Q_MOVABLE_TYPE); diff --git a/src/libs/vlayout/vlayoutdetail_p.h b/src/libs/vlayout/vlayoutdetail_p.h index 1a2e00147..d7fe95d53 100644 --- a/src/libs/vlayout/vlayoutdetail_p.h +++ b/src/libs/vlayout/vlayoutdetail_p.h @@ -34,6 +34,8 @@ #include #include +#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()), seamAllowence(QVector()), layoutAllowence(QVector()), matrix(QMatrix()), layoutWidth(0), mirror(false), detailLabel(QVector()), - patternInfo(QVector()) + patternInfo(QVector()), 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 detailLabel; /** @brief pattern info rectangle */ QVector patternInfo; + /** @brief detail data */ + VPatternPieceData detailData; private: VLayoutDetailData &operator=(const VLayoutDetailData &) Q_DECL_EQ_DELETE; diff --git a/src/libs/vtools/tools/vtextmanager.cpp b/src/libs/vtools/tools/vtextmanager.cpp index 4724f82f3..328457fcc 100644 --- a/src/libs/vtools/tools/vtextmanager.cpp +++ b/src/libs/vtools/tools/vtextmanager.cpp @@ -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) diff --git a/src/libs/vtools/tools/vtextmanager.h b/src/libs/vtools/tools/vtextmanager.h index 3ee8e8183..da7b0a169 100644 --- a/src/libs/vtools/tools/vtextmanager.h +++ b/src/libs/vtools/tools/vtextmanager.h @@ -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); diff --git a/src/libs/vtools/tools/vtooldetail.cpp b/src/libs/vtools/tools/vtooldetail.cpp index c89cc6970..cb16778f4 100644 --- a/src/libs/vtools/tools/vtooldetail.cpp +++ b/src/libs/vtools/tools/vtooldetail.cpp @@ -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) {