/************************************************************************ ** ** @file vppiece.cpp ** @author Ronan Le Tiec ** @date 13 4, 2020 ** ** @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) 2020 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 "vppiece.h" #include #include "vppiecelist.h" #include "../vmisc/def.h" #include #include #include Q_LOGGING_CATEGORY(pPiece, "p.piece") //--------------------------------------------------------------------------------------------------------------------- VPPiece::VPPiece() { } //--------------------------------------------------------------------------------------------------------------------- VPPiece::VPPiece(VLayoutPiece layoutPiece): VLayoutPiece(layoutPiece) { // Resets the translation of the matrix QTransform matrix = GetMatrix(); matrix.translate(-matrix.dx() ,-matrix.dy()); SetMatrix(matrix); // then translate the piece so that the top left corner of the bouding rect of the piece is at the position // (0,0) in the sheet coordinate system QRectF boundingRect = DetailBoundingRect(); m_offset = boundingRect.topLeft(); matrix = GetMatrix(); matrix.translate(-m_offset.x() ,-m_offset.y()); SetMatrix(matrix); } //--------------------------------------------------------------------------------------------------------------------- VPPiece::~VPPiece() { } //--------------------------------------------------------------------------------------------------------------------- bool VPPiece::GetShowSeamLine() const { return m_showSeamline; } //--------------------------------------------------------------------------------------------------------------------- void VPPiece::SetShowSeamLine(bool value) { m_showSeamline = value; emit PropertiesChanged(); } //--------------------------------------------------------------------------------------------------------------------- bool VPPiece::GetPieceMirrored() const { return m_mirrorPiece; } //--------------------------------------------------------------------------------------------------------------------- void VPPiece::SetPieceMirrored(bool value) { m_mirrorPiece = value; emit PropertiesChanged(); } //--------------------------------------------------------------------------------------------------------------------- void VPPiece::SetPosition(QPointF point) { QTransform matrix = GetMatrix(); matrix.translate(point.x() - matrix.dx() - m_offset.x(), point.y() - matrix.dy() - m_offset.y()); SetMatrix(matrix); emit PositionChanged(); } //--------------------------------------------------------------------------------------------------------------------- QPointF VPPiece::GetPosition() { return QPointF(GetMatrix().dx() + m_offset.x(), GetMatrix().dy()+m_offset.y()); } //--------------------------------------------------------------------------------------------------------------------- void VPPiece::SetRotation(qreal angle) { // qreal currentAngle = GetRotation(); // qreal newAngle = angle - currentAngle; // m_transform.rotate(newAngle); if(not VFuzzyComparePossibleNulls(m_pieceAngle, angle)) { m_pieceAngle = angle; // make sure the angle is [0 <= angle < 360] while(m_pieceAngle >= 360) { m_pieceAngle -= 360; } while(m_pieceAngle < 0) { m_pieceAngle += 360; } emit RotationChanged(); } } //--------------------------------------------------------------------------------------------------------------------- qreal VPPiece::GetRotation() { return m_pieceAngle; // We don't use the QTransform vor now because the math behind it to retrieve the angle is not trivial. // TODO / FIXME: we can use QTransform later for optimization // QTransform tmpTransform = m_transform; // tmpTransform.translate(-tmpTransform.dx(), -tmpTransform.dy()); // make sure there is only the rotation in the matrix // qreal angle = qRadiansToDegrees(qAcos(tmpTransform.m11())); // qCDebug(pPiece, "new angle : %f", angle); // return angle; } //--------------------------------------------------------------------------------------------------------------------- void VPPiece::SetIsSelected(bool value) { if(m_isSelected != value) { m_isSelected = value; emit SelectionChanged(); } } //--------------------------------------------------------------------------------------------------------------------- bool VPPiece::GetIsSelected() { return m_isSelected; } //--------------------------------------------------------------------------------------------------------------------- VPPieceList* VPPiece::GetPieceList() { return m_pieceList; } //--------------------------------------------------------------------------------------------------------------------- void VPPiece::SetPieceList(VPPieceList* pieceList) { if(pieceList != m_pieceList) { m_pieceList = pieceList; } }