diff --git a/src/libs/vtools/tools/vtoolseamallowance.cpp b/src/libs/vtools/tools/vtoolseamallowance.cpp index 30d00a394..37463f6e2 100644 --- a/src/libs/vtools/tools/vtoolseamallowance.cpp +++ b/src/libs/vtools/tools/vtoolseamallowance.cpp @@ -477,33 +477,38 @@ void VToolSeamAllowance::Highlight(quint32 id) void VToolSeamAllowance::UpdateLabel() { const VPiece detail = VAbstractTool::data.GetPiece(id); - const VPieceLabelData& data = detail.GetPatternPieceData(); + const VPieceLabelData& labelData = detail.GetPatternPieceData(); - if (data.IsVisible() == true) + if (labelData.IsVisible() == true) { + QPointF pos; + qreal labelWidth = 0; + qreal labelHeight = 0; + FindLabelGeometry(labelData, labelWidth, labelHeight, pos); + QFont fnt = qApp->font(); { - const int iFS = data.GetFontSize(); + const int iFS = labelData.GetFontSize(); iFS < MIN_FONT_SIZE ? fnt.setPixelSize(MIN_FONT_SIZE) : fnt.setPixelSize(iFS); } m_dataLabel->SetFont(fnt); - m_dataLabel->SetSize(data.GetLabelWidth(), data.GetLabelHeight()); - m_dataLabel->UpdateData(detail.GetName(), data); - QPointF pt = data.GetPos(); + m_dataLabel->SetSize(labelWidth, labelHeight); + m_dataLabel->UpdateData(detail.GetName(), labelData); + QRectF rectBB; - rectBB.setTopLeft(pt); + rectBB.setTopLeft(pos); rectBB.setWidth(m_dataLabel->boundingRect().width()); rectBB.setHeight(m_dataLabel->boundingRect().height()); qreal dX; qreal dY; - if (m_dataLabel->IsContained(rectBB, data.GetRotation(), dX, dY) == false) + if (m_dataLabel->IsContained(rectBB, labelData.GetRotation(), dX, dY) == false) { - pt.setX(pt.x() + dX); - pt.setY(pt.y() + dY); + pos.setX(pos.x() + dX); + pos.setY(pos.y() + dY); } - m_dataLabel->setPos(pt); - m_dataLabel->setRotation(data.GetRotation()); + m_dataLabel->setPos(pos); + m_dataLabel->setRotation(labelData.GetRotation()); m_dataLabel->Update(); m_dataLabel->show(); } @@ -524,6 +529,11 @@ void VToolSeamAllowance::UpdatePatternInfo() if (geom.IsVisible() == true) { + QPointF pos; + qreal labelWidth = 0; + qreal labelHeight = 0; + FindLabelGeometry(geom, labelWidth, labelHeight, pos); + QFont fnt = qApp->font(); int iFS = geom.GetFontSize(); if (iFS < MIN_FONT_SIZE) @@ -532,23 +542,22 @@ void VToolSeamAllowance::UpdatePatternInfo() } fnt.setPixelSize(iFS); m_patternInfo->SetFont(fnt); - m_patternInfo->SetSize(geom.GetLabelWidth(), geom.GetLabelHeight()); + m_patternInfo->SetSize(labelWidth, labelHeight); m_patternInfo->UpdateData(doc, getData()->size(), getData()->height()); - QPointF pt = geom.GetPos(); QRectF rectBB; - rectBB.setTopLeft(pt); + rectBB.setTopLeft(pos); rectBB.setWidth(m_patternInfo->boundingRect().width()); rectBB.setHeight(m_patternInfo->boundingRect().height()); qreal dX; qreal dY; if (m_patternInfo->IsContained(rectBB, geom.GetRotation(), dX, dY) == false) { - pt.setX(pt.x() + dX); - pt.setY(pt.y() + dY); + pos.setX(pos.x() + dX); + pos.setY(pos.y() + dY); } - m_patternInfo->setPos(pt); + m_patternInfo->setPos(pos); m_patternInfo->setRotation(geom.GetRotation()); m_patternInfo->Update(); m_patternInfo->GetTextLines() > 0 ? m_patternInfo->show() : m_patternInfo->hide(); @@ -570,30 +579,17 @@ void VToolSeamAllowance::UpdateGrainline() if (geom.IsVisible() == true) { - qreal dRotation; - qreal dLength; - try - { - QString qsFormula; - qsFormula = geom.GetRotation().replace("\n", " "); - qsFormula = qApp->TrVars()->FormulaFromUser(qsFormula, qApp->Settings()->GetOsSeparator()); + QPointF pos; + qreal dRotation = 0; + qreal dLength = 0; - Calculator cal1; - dRotation = cal1.EvalFormula(VDataTool::data.PlainVariables(), qsFormula); - - qsFormula = geom.GetLength().replace("\n", " "); - qsFormula = qApp->TrVars()->FormulaFromUser(qsFormula, qApp->Settings()->GetOsSeparator()); - Calculator cal2; - dLength = cal2.EvalFormula(VDataTool::data.PlainVariables(), qsFormula); - } - catch(qmu::QmuParserError &e) + if ( not FindGrainlineGeometry(geom, dLength, dRotation, pos)) { - Q_UNUSED(e); m_grainLine->hide(); return; } - m_grainLine->UpdateGeometry(geom.GetPos(), dRotation, ToPixel(dLength, *VDataTool::data.GetPatternUnit()), + m_grainLine->UpdateGeometry(pos, dRotation, ToPixel(dLength, *VDataTool::data.GetPatternUnit()), geom.GetArrowType()); m_grainLine->show(); } @@ -1155,6 +1151,95 @@ void VToolSeamAllowance::SaveDialogChange() UpdateLabel(); } +//--------------------------------------------------------------------------------------------------------------------- +void VToolSeamAllowance::FindLabelGeometry(const VPatternLabelData& labelData, qreal &labelWidth, qreal &labelHeight, + QPointF &pos) +{ + const quint32 topLeftPin = labelData.TopLeftPin(); + const quint32 bottomRightPin = labelData.BottomRightPin(); + + if (topLeftPin != NULL_ID && bottomRightPin != NULL_ID) + { + try + { + const auto topLeftPinPoint = VAbstractTool::data.GeometricObject(topLeftPin); + const auto bottomRightPinPoint = VAbstractTool::data.GeometricObject(bottomRightPin); + + const QRectF labelRect = QRectF(*topLeftPinPoint, *bottomRightPinPoint); + labelWidth = qAbs(labelRect.width()); + labelHeight = qAbs(labelRect.height()); + + pos = labelRect.topLeft(); + + return; + } + catch(const VExceptionBadId &) + { + // do nothing. + } + } + + labelWidth = labelData.GetLabelWidth(); + labelHeight = labelData.GetLabelHeight(); + pos = labelData.GetPos(); +} + +//--------------------------------------------------------------------------------------------------------------------- +bool VToolSeamAllowance::FindGrainlineGeometry(const VGrainlineData& geom, qreal &length, qreal &rotationAngle, + QPointF &pos) +{ + const quint32 topPin = geom.TopPin(); + const quint32 bottomPin = geom.BottomPin(); + + if (topPin != NULL_ID && bottomPin != NULL_ID) + { + try + { + const auto topPinPoint = VAbstractTool::data.GeometricObject(topPin); + const auto bottomPinPoint = VAbstractTool::data.GeometricObject(bottomPin); + + QLineF grainline(*bottomPinPoint, *topPinPoint); + length = FromPixel(grainline.length(), *VDataTool::data.GetPatternUnit()); + rotationAngle = grainline.angle(); + + if (not VFuzzyComparePossibleNulls(rotationAngle, 0)) + { + grainline.setAngle(0); + } + + pos = grainline.p1(); + + return true; + } + catch(const VExceptionBadId &) + { + // do nothing. + } + } + + try + { + QString qsFormula = geom.GetRotation().replace("\n", " "); + qsFormula = qApp->TrVars()->FormulaFromUser(qsFormula, qApp->Settings()->GetOsSeparator()); + + Calculator cal1; + rotationAngle = cal1.EvalFormula(VAbstractTool::data.PlainVariables(), qsFormula); + + qsFormula = geom.GetLength().replace("\n", " "); + qsFormula = qApp->TrVars()->FormulaFromUser(qsFormula, qApp->Settings()->GetOsSeparator()); + Calculator cal2; + length = cal2.EvalFormula(VAbstractTool::data.PlainVariables(), qsFormula); + } + catch(qmu::QmuParserError &e) + { + Q_UNUSED(e); + return false; + } + + pos = geom.GetPos(); + return true; +} + //--------------------------------------------------------------------------------------------------------------------- void VToolSeamAllowance::InitNodes(const VPiece &detail, VMainGraphicsScene *scene) { diff --git a/src/libs/vtools/tools/vtoolseamallowance.h b/src/libs/vtools/tools/vtoolseamallowance.h index d0dec269a..fc948e1ae 100644 --- a/src/libs/vtools/tools/vtoolseamallowance.h +++ b/src/libs/vtools/tools/vtoolseamallowance.h @@ -151,6 +151,8 @@ private: void RefreshGeometry(); void SaveDialogChange(); + void FindLabelGeometry(const VPatternLabelData &labelData, qreal &labelWidth, qreal &labelHeight, QPointF &pos); + bool FindGrainlineGeometry(const VGrainlineData &geom, qreal &length, qreal &rotationAngle, QPointF &pos); void InitNodes(const VPiece &detail, VMainGraphicsScene *scene); void InitCSAPaths(const VPiece &detail);