/************************************************************************ ** ** @file visualization.cpp ** @author Roman Telezhynskyi ** @date 15 8, 2014 ** ** @brief ** @copyright ** This source code is part of the Valentina project, a pattern making ** program, whose allow create and modeling patterns of clothing. ** Copyright (C) 2013-2015 Valentina project ** All Rights Reserved. ** ** Valentina is free software: you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** Valentina is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with Valentina. If not, see . ** *************************************************************************/ #include "visualization.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "../vpatterndb/calculator.h" #include "../vpatterndb/vtranslatevars.h" #include "../qmuparser/qmuparsererror.h" #include "../vmisc/vcommonsettings.h" #include "../vpatterndb/vcontainer.h" #include "../vwidgets/vmaingraphicsscene.h" #include "../vwidgets/vcurvepathitem.h" #include "../vwidgets/scalesceneitems.h" template class QHash; QT_WARNING_PUSH QT_WARNING_DISABLE_CLANG("-Wmissing-prototypes") QT_WARNING_DISABLE_INTEL(1418) Q_LOGGING_CATEGORY(vVis, "v.visualization") // NOLINT QT_WARNING_POP namespace { //--------------------------------------------------------------------------------------------------------------------- VScaledEllipse *InitPointItem(const QColor &color, QGraphicsItem *parent, qreal z = 0) { VScaledEllipse *point = new VScaledEllipse(parent); point->setZValue(1); point->setBrush(QBrush(Qt::NoBrush)); QPen visPen = point->pen(); visPen.setColor(color); point->setPen(visPen); point->setRect(PointRect(ScaledRadius(SceneScale(VAbstractValApplication::VApp()->getCurrentScene())))); point->setPos(QPointF()); point->setFlags(QGraphicsItem::ItemStacksBehindParent); point->setZValue(z); point->setVisible(false); return point; } //--------------------------------------------------------------------------------------------------------------------- VCurvePathItem *InitCurveItem(const QColor &color, QGraphicsItem *parent, qreal z = 0) { VCurvePathItem *curve = new VCurvePathItem(parent); curve->setBrush(QBrush(Qt::NoBrush)); QPen visPen = curve->pen(); visPen.setColor(color); curve->setPen(visPen); curve->setFlags(QGraphicsItem::ItemStacksBehindParent); curve->setZValue(z); curve->setVisible(false); return curve; } } //--------------------------------------------------------------------------------------------------------------------- Visualization::Visualization(const VContainer *data) :QObject(), data(data), scenePos(QPointF()), mainColor(Qt::red), supportColor(Qt::magenta), lineStyle(Qt::SolidLine), object1Id(NULL_ID), toolTip(QString()), mode(Mode::Creation) {} //--------------------------------------------------------------------------------------------------------------------- void Visualization::setObject1Id(const quint32 &value) { object1Id = value; } //--------------------------------------------------------------------------------------------------------------------- void Visualization::setLineStyle(const Qt::PenStyle &value) { lineStyle = value; InitPen(); } //--------------------------------------------------------------------------------------------------------------------- // cppcheck-suppress unusedFunction void Visualization::setScenePos(const QPointF &value) { scenePos = value; } //--------------------------------------------------------------------------------------------------------------------- void Visualization::VisualMode(const quint32 &pointId) { VMainGraphicsScene *scene = qobject_cast(VAbstractValApplication::VApp()->getCurrentScene()); SCASSERT(scene != nullptr) this->object1Id = pointId; this->scenePos = scene->getScenePos(); RefreshGeometry(); AddOnScene(); } //--------------------------------------------------------------------------------------------------------------------- // cppcheck-suppress unusedFunction void Visualization::setMainColor(const QColor &value) { mainColor = value; InitPen(); } //--------------------------------------------------------------------------------------------------------------------- const VContainer *Visualization::GetData() const { return data; } //--------------------------------------------------------------------------------------------------------------------- void Visualization::SetData(const VContainer *data) { this->data = data; } //--------------------------------------------------------------------------------------------------------------------- void Visualization::MousePos(const QPointF &scenePos) { this->scenePos = scenePos; RefreshGeometry(); RefreshToolTip(); } //--------------------------------------------------------------------------------------------------------------------- VScaledEllipse *Visualization::InitPoint(const QColor &color, QGraphicsItem *parent, qreal z) const { return InitPointItem(color, parent, z); } //--------------------------------------------------------------------------------------------------------------------- qreal Visualization::FindLengthFromUser(const QString &expression, const QHash > *vars, bool fromUser) { return VAbstractValApplication::VApp()->toPixel(FindValFromUser(expression, vars, fromUser)); } //--------------------------------------------------------------------------------------------------------------------- qreal Visualization::FindValFromUser(const QString &expression, const QHash > *vars, bool fromUser) { qreal val = 0; if (expression.isEmpty()) { val = 0; } else { try { // Replace line return with spaces for calc if exist QString formula = expression; if (fromUser) { formula = VAbstractApplication::VApp()->TrVars() ->FormulaFromUser(formula, VAbstractApplication::VApp()->Settings()->GetOsSeparator()); } QScopedPointer cal(new Calculator()); val = cal->EvalFormula(vars, formula); if (qIsInf(val) || qIsNaN(val)) { val = 0; } } catch (qmu::QmuParserError &e) { val = 0; qDebug() << "\nMath parser error:\n" << "--------------------------------------\n" << "Message: " << e.GetMsg() << "\n" << "Expression: " << e.GetExpr() << "\n" << "--------------------------------------"; } } return val; } //--------------------------------------------------------------------------------------------------------------------- void Visualization::RefreshToolTip() const { if (!toolTip.isEmpty()) { emit ToolTip(toolTip); } } //--------------------------------------------------------------------------------------------------------------------- void Visualization::DrawPoint(QGraphicsEllipseItem *point, const QPointF &pos, const QColor &color, Qt::PenStyle style) { SCASSERT (point != nullptr) point->setPos(pos); QPen visPen = point->pen(); visPen.setColor(color); visPen.setStyle(style); point->setPen(visPen); point->setVisible(true); } //--------------------------------------------------------------------------------------------------------------------- void Visualization::DrawLine(VScaledLine *lineItem, const QLineF &line, const QColor &color, Qt::PenStyle style) { SCASSERT (lineItem != nullptr) QPen visPen = lineItem->pen(); visPen.setColor(color); visPen.setStyle(not line.isNull() ? style : Qt::NoPen); lineItem->setPen(visPen); if (not line.isNull()) { lineItem->setLine(line); } lineItem->setVisible(not line.isNull()); } //--------------------------------------------------------------------------------------------------------------------- void Visualization::DrawPath(VCurvePathItem *pathItem, const QPainterPath &path, const QColor &color, Qt::PenStyle style, Qt::PenCapStyle cap) { DrawPath(pathItem, path, QVector(), color, style, cap); } //--------------------------------------------------------------------------------------------------------------------- void Visualization::DrawPath(VCurvePathItem *pathItem, const QPainterPath &path, const QVector &directionArrows, const QColor &color, Qt::PenStyle style, Qt::PenCapStyle cap) { SCASSERT (pathItem != nullptr) QPen visPen = pathItem->pen(); visPen.setColor(color); visPen.setStyle(style); visPen.setCapStyle(cap); pathItem->setPen(visPen); pathItem->setPath(path); pathItem->SetDirectionArrows(directionArrows); pathItem->setVisible(true); } //--------------------------------------------------------------------------------------------------------------------- VScaledEllipse *Visualization::GetPointItem(QVector &points, quint32 i, const QColor &color, QGraphicsItem *parent) { if (not points.isEmpty() && static_cast(points.size() - 1) >= i) { return points.at(static_cast(i)); } else { auto point = InitPointItem(color, parent); points.append(point); return point; } } //--------------------------------------------------------------------------------------------------------------------- VCurvePathItem *Visualization::GetCurveItem(QVector &curves, quint32 i, const QColor &color, QGraphicsItem *parent) { if (not curves.isEmpty() && static_cast(curves.size() - 1) >= i) { return curves.at(static_cast(i)); } else { auto point = InitCurveItem(color, parent); curves.append(point); return point; } } //--------------------------------------------------------------------------------------------------------------------- QString Visualization::NumberToUser(qreal value) { return VAbstractApplication::VApp()->TrVars() ->FormulaToUser(QString::number(VAbstractValApplication::VApp()->fromPixel(value)), VAbstractApplication::VApp()->Settings()->GetOsSeparator()); } //--------------------------------------------------------------------------------------------------------------------- Mode Visualization::GetMode() const { return mode; } //--------------------------------------------------------------------------------------------------------------------- void Visualization::SetMode(const Mode &value) { mode = value; }