/************************************************************************ ** ** @file vtooltruedarts.cpp ** @author Roman Telezhynskyi ** @date 23 6, 2015 ** ** @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) 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 "vtooltruedarts.h" #include #include #include #include #include #include #include #include "../../../../dialogs/tools/dialogtruedarts.h" #include "../../../../dialogs/tools/dialogtool.h" #include "../../../../visualization/visualization.h" #include "../../../../visualization/line/vistooltruedarts.h" #include "../ifc/exception/vexception.h" #include "../ifc/ifcdef.h" #include "../vgeometry/vgobject.h" #include "../vgeometry/vpointf.h" #include "../vpatterndb/vcontainer.h" #include "../vwidgets/vmaingraphicsscene.h" #include "../../../vabstracttool.h" #include "../../vdrawtool.h" #include "vtooldoublepoint.h" #include "../vmisc/compatibility.h" template class QSharedPointer; const QString VToolTrueDarts::ToolType = QStringLiteral("trueDarts"); //--------------------------------------------------------------------------------------------------------------------- VToolTrueDarts::VToolTrueDarts(const VToolTrueDartsInitData &initData, QGraphicsItem *parent) :VToolDoublePoint(initData.doc, initData.data, initData.id, initData.p1id, initData.p2id, initData.notes, parent), baseLineP1Id (initData.baseLineP1Id), baseLineP2Id(initData.baseLineP2Id), dartP1Id(initData.dartP1Id), dartP2Id(initData.dartP2Id), dartP3Id(initData.dartP3Id) { ToolCreation(initData.typeCreation); } //--------------------------------------------------------------------------------------------------------------------- void VToolTrueDarts::FindPoint(const QPointF &baseLineP1, const QPointF &baseLineP2, const QPointF &dartP1, const QPointF &dartP2, const QPointF &dartP3, QPointF &p1, QPointF &p2) { const QLineF d2d1(dartP2, dartP1); const QLineF d2d3(dartP2, dartP3); const qreal degrees = d2d3.angleTo(d2d1); QLineF d2blP2(dartP2, baseLineP2); d2blP2.setAngle(d2blP2.angle()+degrees); if (Intersects(QLineF(baseLineP1, d2blP2.p2()), d2d1, &p1) == QLineF::NoIntersection) { p1 = QPointF(0, 0); p2 = QPointF(0, 0); return; } QLineF d2p1(dartP2, p1); d2p1.setAngle(d2p1.angle()-degrees); p2 = d2p1.p2(); } //--------------------------------------------------------------------------------------------------------------------- void VToolTrueDarts::setDialog() { SCASSERT(not m_dialog.isNull()) const QPointer dialogTool = qobject_cast(m_dialog); SCASSERT(not dialogTool.isNull()) const QSharedPointer p1 = VAbstractTool::data.GeometricObject(p1id); const QSharedPointer p2 = VAbstractTool::data.GeometricObject(p2id); dialogTool->SetChildrenId(p1id, p2id); dialogTool->SetNewDartPointNames(p1->name(), p2->name()); dialogTool->SetFirstBasePointId(baseLineP1Id); dialogTool->SetSecondBasePointId(baseLineP2Id); dialogTool->SetFirstDartPointId(dartP1Id); dialogTool->SetSecondDartPointId(dartP2Id); dialogTool->SetThirdDartPointId(dartP3Id); dialogTool->SetNotes(m_notes); } //--------------------------------------------------------------------------------------------------------------------- VToolTrueDarts *VToolTrueDarts::Create(const QPointer &dialog, VMainGraphicsScene *scene, VAbstractPattern *doc, VContainer *data) { SCASSERT(not dialog.isNull()) const QPointer dialogTool = qobject_cast(dialog); SCASSERT(not dialogTool.isNull()) VToolTrueDartsInitData initData; initData.name1 = dialogTool->GetFirstNewDartPointName(); initData.name2 = dialogTool->GetSecondNewDartPointName(); initData.baseLineP1Id = dialogTool->GetFirstBasePointId(); initData.baseLineP2Id = dialogTool->GetSecondBasePointId(); initData.dartP1Id = dialogTool->GetFirstDartPointId(); initData.dartP2Id = dialogTool->GetSecondDartPointId(); initData.dartP3Id = dialogTool->GetThirdDartPointId(); initData.scene = scene; initData.doc = doc; initData.data = data; initData.parse = Document::FullParse; initData.typeCreation = Source::FromGui; initData.notes = dialogTool->GetNotes(); VToolTrueDarts *point = Create(initData); if (point != nullptr) { point->m_dialog = dialog; } return point; } //--------------------------------------------------------------------------------------------------------------------- VToolTrueDarts *VToolTrueDarts::Create(VToolTrueDartsInitData initData) { const QSharedPointer baseLineP1 = initData.data->GeometricObject(initData.baseLineP1Id); const QSharedPointer baseLineP2 = initData.data->GeometricObject(initData.baseLineP2Id); const QSharedPointer dartP1 = initData.data->GeometricObject(initData.dartP1Id); const QSharedPointer dartP2 = initData.data->GeometricObject(initData.dartP2Id); const QSharedPointer dartP3 = initData.data->GeometricObject(initData.dartP3Id); QPointF fPoint1; QPointF fPoint2; VToolTrueDarts::FindPoint(static_cast(*baseLineP1), static_cast(*baseLineP2), static_cast(*dartP1), static_cast(*dartP2), static_cast(*dartP3), fPoint1, fPoint2); VPointF *p1 = new VPointF(fPoint1, initData.name1, initData.mx1, initData.my1, initData.id); p1->SetShowLabel(initData.showLabel1); VPointF *p2 = new VPointF(fPoint2, initData.name2, initData.mx2, initData.my2, initData.id); p2->SetShowLabel(initData.showLabel2); if (initData.typeCreation == Source::FromGui) { initData.id = initData.data->getNextId();//Just reserve id for tool initData.p1id = initData.data->AddGObject(p1); initData.p2id = initData.data->AddGObject(p2); } else { initData.data->UpdateGObject(initData.p1id, p1); initData.data->UpdateGObject(initData.p2id, p2); if (initData.parse != Document::FullParse) { initData.doc->UpdateToolData(initData.id, initData.data); } } if (initData.parse == Document::FullParse) { VAbstractTool::AddRecord(initData.id, Tool::TrueDarts, initData.doc); VToolTrueDarts *points = new VToolTrueDarts(initData); initData.scene->addItem(points); InitToolConnections(initData.scene, points); VAbstractPattern::AddTool(initData.id, points); initData.doc->IncrementReferens(baseLineP1->getIdTool()); initData.doc->IncrementReferens(baseLineP2->getIdTool()); initData.doc->IncrementReferens(dartP1->getIdTool()); initData.doc->IncrementReferens(dartP2->getIdTool()); initData.doc->IncrementReferens(dartP3->getIdTool()); return points; } return nullptr; } //--------------------------------------------------------------------------------------------------------------------- void VToolTrueDarts::ShowVisualization(bool show) { ShowToolVisualization(show); } //--------------------------------------------------------------------------------------------------------------------- QString VToolTrueDarts::BaseLineP1Name() const { return VAbstractTool::data.GetGObject(baseLineP1Id)->name(); } //--------------------------------------------------------------------------------------------------------------------- QString VToolTrueDarts::BaseLineP2Name() const { return VAbstractTool::data.GetGObject(baseLineP2Id)->name(); } //--------------------------------------------------------------------------------------------------------------------- QString VToolTrueDarts::DartP1Name() const { return VAbstractTool::data.GetGObject(dartP1Id)->name(); } //--------------------------------------------------------------------------------------------------------------------- QString VToolTrueDarts::DartP2Name() const { return VAbstractTool::data.GetGObject(dartP2Id)->name(); } //--------------------------------------------------------------------------------------------------------------------- QString VToolTrueDarts::DartP3Name() const { return VAbstractTool::data.GetGObject(dartP3Id)->name(); } //--------------------------------------------------------------------------------------------------------------------- void VToolTrueDarts::ShowContextMenu(QGraphicsSceneContextMenuEvent *event, quint32 id) { try { ContextMenu(event, id); } catch(const VExceptionToolWasDeleted &e) { Q_UNUSED(e) return;//Leave this method immediately!!! } } //--------------------------------------------------------------------------------------------------------------------- void VToolTrueDarts::RemoveReferens() { const auto baseLineP1 = VAbstractTool::data.GetGObject(baseLineP1Id); const auto baseLineP2 = VAbstractTool::data.GetGObject(baseLineP2Id); const auto dartP1 = VAbstractTool::data.GetGObject(dartP1Id); const auto dartP2 = VAbstractTool::data.GetGObject(dartP2Id); const auto dartP3 = VAbstractTool::data.GetGObject(dartP3Id); doc->DecrementReferens(baseLineP1->getIdTool()); doc->DecrementReferens(baseLineP2->getIdTool()); doc->DecrementReferens(dartP1->getIdTool()); doc->DecrementReferens(dartP2->getIdTool()); doc->DecrementReferens(dartP3->getIdTool()); VToolDoublePoint::RemoveReferens(); } //--------------------------------------------------------------------------------------------------------------------- void VToolTrueDarts::SaveDialog(QDomElement &domElement, QList &oldDependencies, QList &newDependencies) { SCASSERT(not m_dialog.isNull()) const QPointer dialogTool = qobject_cast(m_dialog); SCASSERT(not dialogTool.isNull()) AddDependence(oldDependencies, baseLineP1Id); AddDependence(oldDependencies, baseLineP2Id); AddDependence(oldDependencies, dartP1Id); AddDependence(oldDependencies, dartP2Id); AddDependence(oldDependencies, dartP3Id); AddDependence(newDependencies, dialogTool->GetFirstBasePointId()); AddDependence(newDependencies, dialogTool->GetSecondBasePointId()); AddDependence(newDependencies, dialogTool->GetFirstDartPointId()); AddDependence(newDependencies, dialogTool->GetSecondDartPointId()); AddDependence(newDependencies, dialogTool->GetThirdDartPointId()); doc->SetAttribute(domElement, AttrName1, dialogTool->GetFirstNewDartPointName()); doc->SetAttribute(domElement, AttrName2, dialogTool->GetSecondNewDartPointName()); doc->SetAttribute(domElement, AttrBaseLineP1, QString().setNum(dialogTool->GetFirstBasePointId())); doc->SetAttribute(domElement, AttrBaseLineP2, QString().setNum(dialogTool->GetSecondBasePointId())); doc->SetAttribute(domElement, AttrDartP1, QString().setNum(dialogTool->GetFirstDartPointId())); doc->SetAttribute(domElement, AttrDartP2, QString().setNum(dialogTool->GetSecondDartPointId())); doc->SetAttribute(domElement, AttrDartP3, QString().setNum(dialogTool->GetThirdDartPointId())); doc->SetAttributeOrRemoveIf(domElement, AttrNotes, dialogTool->GetNotes(), [](const QString ¬es) noexcept {return notes.isEmpty();}); } //--------------------------------------------------------------------------------------------------------------------- void VToolTrueDarts::SaveOptions(QDomElement &tag, QSharedPointer &obj) { VToolDoublePoint::SaveOptions(tag, obj); doc->SetAttribute(tag, AttrType, ToolType); doc->SetAttribute(tag, AttrBaseLineP1, baseLineP1Id); doc->SetAttribute(tag, AttrBaseLineP2, baseLineP2Id); doc->SetAttribute(tag, AttrDartP1, dartP1Id); doc->SetAttribute(tag, AttrDartP2, dartP2Id); doc->SetAttribute(tag, AttrDartP3, dartP3Id); } //--------------------------------------------------------------------------------------------------------------------- void VToolTrueDarts::ReadToolAttributes(const QDomElement &domElement) { VToolDoublePoint::ReadToolAttributes(domElement); baseLineP1Id = doc->GetParametrUInt(domElement, AttrBaseLineP1, NULL_ID_STR); baseLineP2Id = doc->GetParametrUInt(domElement, AttrBaseLineP2, NULL_ID_STR); dartP1Id = doc->GetParametrUInt(domElement, AttrDartP1, NULL_ID_STR); dartP2Id = doc->GetParametrUInt(domElement, AttrDartP2, NULL_ID_STR); dartP3Id = doc->GetParametrUInt(domElement, AttrDartP3, NULL_ID_STR); } //--------------------------------------------------------------------------------------------------------------------- void VToolTrueDarts::SetVisualization() { if (not vis.isNull()) { VisToolTrueDarts *visual = qobject_cast(vis); SCASSERT(visual != nullptr) visual->setObject1Id(baseLineP1Id); visual->setObject2Id(baseLineP2Id); visual->setD1PointId(dartP1Id); visual->setD2PointId(dartP2Id); visual->setD3PointId(dartP3Id); visual->RefreshGeometry(); } }