/** * @brief SaveDialog save options into file after change in dialog. */ void VToolSpline::SaveDialog(QDomElement &domElement) { SCASSERT(dialog != nullptr); DialogSpline *dialogTool = qobject_cast<DialogSpline*>(dialog); SCASSERT(dialogTool != nullptr); VPointF point1 = *VAbstractTool::data.GeometricObject<const VPointF *>(dialogTool->getP1()); VPointF point4 = *VAbstractTool::data.GeometricObject<const VPointF *>(dialogTool->getP4()); VSpline spl = VSpline (point1, point4, dialogTool->getAngle1(), dialogTool->getAngle2(), dialogTool->getKAsm1(), dialogTool->getKAsm2(), dialogTool->getKCurve()); disconnect(controlPoints[0], &VControlPointSpline::ControlPointChangePosition, this, &VToolSpline::ControlPointChangePosition); disconnect(controlPoints[1], &VControlPointSpline::ControlPointChangePosition, this, &VToolSpline::ControlPointChangePosition); controlPoints[0]->setPos(spl.GetP2()); controlPoints[1]->setPos(spl.GetP3()); connect(controlPoints[0], &VControlPointSpline::ControlPointChangePosition, this, &VToolSpline::ControlPointChangePosition); connect(controlPoints[1], &VControlPointSpline::ControlPointChangePosition, this, &VToolSpline::ControlPointChangePosition); spl = VSpline (point1, controlPoints[0]->pos(), controlPoints[1]->pos(), point4, dialogTool->getKCurve()); doc->SetAttribute(domElement, AttrPoint1, spl.GetP1().id()); doc->SetAttribute(domElement, AttrPoint4, spl.GetP4().id()); doc->SetAttribute(domElement, AttrAngle1, spl.GetAngle1()); doc->SetAttribute(domElement, AttrAngle2, spl.GetAngle2()); doc->SetAttribute(domElement, AttrKAsm1, spl.GetKasm1()); doc->SetAttribute(domElement, AttrKAsm2, spl.GetKasm2()); doc->SetAttribute(domElement, AttrKCurve, spl.GetKcurve()); }
//--------------------------------------------------------------------------------------------------------------------- QPointF VSplinePath::CutSplinePath(qreal length, qint32 &p1, qint32 &p2, QPointF &spl1p2, QPointF &spl1p3, QPointF &spl2p2, QPointF &spl2p3) const { if (Count() < 2) { throw VException(tr("Can't cut spline path with one point")); } //Always need return two spline paths, so we must correct wrong length. qreal fullLength = GetLength(); if (length < fullLength * 0.02) { length = fullLength * 0.02; } else if ( length > fullLength * 0.98) { length = fullLength * 0.98; } fullLength = 0; for (qint32 i = 1; i <= Count(); ++i) { VSpline spl = VSpline(path.at(i-1).P(), path.at(i).P(), path.at(i-1).Angle2(), path.at(i).Angle1(), path.at(i-1).KAsm2(), path.at(i).KAsm1(), kCurve); fullLength += spl.GetLength(); if (fullLength > length) { p1 = i-1; p2 = i; return spl.CutSpline(length - (fullLength - spl.GetLength()), spl1p2, spl1p3, spl2p2, spl2p3); } } return QPointF(); }
/** * @brief Create help create tool. * @param _id tool id, 0 if tool doesn't exist yet. * @param p1 id first spline point. * @param p4 id last spline point. * @param kAsm1 coefficient of length first control line. * @param kAsm2 coefficient of length second control line. * @param angle1 angle from first point to first control point. * @param angle2 angle from second point to second control point. * @param kCurve coefficient of curvature spline. * @param scene pointer to scene. * @param doc dom document container. * @param data container with variables. * @param parse parser file mode. * @param typeCreation way we create this tool. */ void VToolSpline::Create(const quint32 _id, const quint32 &p1, const quint32 &p4, const qreal &kAsm1, const qreal kAsm2, const qreal &angle1, const qreal &angle2, const qreal &kCurve, VMainGraphicsScene *scene, VPattern *doc, VContainer *data, const Document &parse, const Source &typeCreation) { VPointF point1 = *data->GeometricObject<const VPointF *>(p1); VPointF point4 = *data->GeometricObject<const VPointF *>(p4); VSpline *spline = new VSpline(point1, point4, angle1, angle2, kAsm1, kAsm2, kCurve); quint32 id = _id; if (typeCreation == Source::FromGui) { id = data->AddGObject(spline); data->AddLengthSpline(spline->name(), qApp->fromPixel(spline->GetLength())); } else { data->UpdateGObject(id, spline); data->AddLengthSpline(spline->name(), qApp->fromPixel(spline->GetLength())); if (parse != Document::FullParse) { doc->UpdateToolData(id, data); } } VDrawTool::AddRecord(id, Tool::SplineTool, doc); if (parse == Document::FullParse) { VToolSpline *spl = new VToolSpline(doc, data, id, typeCreation); scene->addItem(spl); connect(spl, &VToolSpline::ChoosedTool, scene, &VMainGraphicsScene::ChoosedItem); connect(scene, &VMainGraphicsScene::NewFactor, spl, &VToolSpline::SetFactor); connect(scene, &VMainGraphicsScene::DisableItem, spl, &VToolSpline::Disable); doc->AddTool(id, spl); doc->IncrementReferens(p1); doc->IncrementReferens(p4); } }
/** * @brief AddToNewDetail create united detail adding one node per time. * @param tool tool that make union. * @param doc dom document container. * @param data container with variables. * @param newDetail united detail. * @param det detail what we union. * @param i index node in detail. * @param idTool id tool union details. * @param dx bias node x axis. * @param dy bias node y axis. * @param pRotate point rotation. * @param angle angle rotation. */ void VToolUnionDetails::AddToNewDetail(QObject *tool, VPattern *doc, VContainer *data, VDetail &newDetail, const VDetail &det, const int &i, const quint32 &idTool, const qreal &dx, const qreal &dy, const quint32 &pRotate, const qreal &angle) { quint32 id = 0, idObject = 0; switch (det.at(i).getTypeTool()) { case (Tool::NodePoint): { if ( qFuzzyCompare(dx+1, 1) && qFuzzyCompare(dy+1, 1) && (pRotate == 0)) { id = det.at(i).getId(); } else { VPointF *point = new VPointF(*data->GeometricObject<VPointF>(det.at(i).getId())); point->setMode(Draw::Modeling); BiasRotatePoint(point, dx, dy, data->GeometricObject<VPointF>(pRotate)->toQPointF(), angle); idObject = data->AddGObject(point); VPointF *point1 = new VPointF(*point); point1->setMode(Draw::Modeling); id = data->AddGObject(point1); VNodePoint::Create(doc, data, id, idObject, Document::FullParse, Source::FromGui, idTool, tool); } } break; case (Tool::NodeArc): { if (qFuzzyCompare(dx+1, 1) && qFuzzyCompare(dy+1, 1) && pRotate == 0) { id = det.at(i).getId(); } else { const QSharedPointer<VArc> arc = data->GeometricObject<VArc>(det.at(i).getId()); VPointF p1 = VPointF(arc->GetP1(), "A", 0, 0); BiasRotatePoint(&p1, dx, dy, data->GeometricObject<VPointF>(pRotate)->toQPointF(), angle); VPointF p2 = VPointF(arc->GetP2(), "A", 0, 0); BiasRotatePoint(&p2, dx, dy, data->GeometricObject<VPointF>(pRotate)->toQPointF(), angle); VPointF *center = new VPointF(arc->GetCenter()); BiasRotatePoint(center, dx, dy, data->GeometricObject<VPointF>(pRotate)->toQPointF(), angle); QLineF l1(center->toQPointF(), p1.toQPointF()); QLineF l2(center->toQPointF(), p2.toQPointF()); center->setMode(Draw::Modeling); quint32 idCenter = data->AddGObject(center); Q_UNUSED(idCenter); VArc *arc1 = new VArc(*center, arc->GetRadius(), arc->GetFormulaRadius(), l1.angle(), QString().setNum(l1.angle()), l2.angle(), QString().setNum(l2.angle())); arc1->setMode(Draw::Modeling); idObject = data->AddGObject(arc1); VArc *arc2 = new VArc(*arc1); arc2->setMode(Draw::Modeling); id = data->AddGObject(arc2); VNodeArc::Create(doc, data, id, idObject, Document::FullParse, Source::FromGui, idTool, tool); } } break; case (Tool::NodeSpline): { if (qFuzzyCompare(dx+1, 1) && qFuzzyCompare(dy+1, 1) && pRotate == 0) { id = det.at(i).getId(); } else { const QSharedPointer<VSpline> spline = data->GeometricObject<VSpline>(det.at(i).getId()); VPointF *p1 = new VPointF(spline->GetP1()); BiasRotatePoint(p1, dx, dy, data->GeometricObject<VPointF>(pRotate)->toQPointF(), angle); //quint32 idP1 = data->AddGObject(p1); VPointF p2 = VPointF(spline->GetP2()); BiasRotatePoint(&p2, dx, dy, data->GeometricObject<VPointF>(pRotate)->toQPointF(), angle); VPointF p3 = VPointF(spline->GetP3()); BiasRotatePoint(&p3, dx, dy, data->GeometricObject<VPointF>(pRotate)->toQPointF(), angle); VPointF *p4 = new VPointF(spline->GetP4()); BiasRotatePoint(p4, dx, dy, data->GeometricObject<VPointF>(pRotate)->toQPointF(), angle); //quint32 idP4 = data->AddGObject(p4); VSpline *spl = new VSpline(*p1, p2.toQPointF(), p3.toQPointF(), *p4, spline->GetKcurve(), 0, Draw::Modeling); idObject = data->AddGObject(spl); VSpline *spl1 = new VSpline(*spl); spl1->setMode(Draw::Modeling); id = data->AddGObject(spl1); VNodeSpline::Create(doc, data, id, idObject, Document::FullParse, Source::FromGui, idTool, tool); delete p4; delete p1; } } break; case (Tool::NodeSplinePath): { if (qFuzzyCompare(dx+1, 1) && qFuzzyCompare(dy+1, 1) && pRotate == 0) { id = det.at(i).getId(); } else { VSplinePath *path = new VSplinePath(); path->setMode(Draw::Modeling); const QSharedPointer<VSplinePath> splinePath = data->GeometricObject<VSplinePath>(det.at(i).getId()); qint32 k = splinePath->getMaxCountPoints(); for (qint32 i = 1; i <= splinePath->Count(); ++i) { VSpline spline(splinePath->at(i-1).P(), splinePath->at(i).P(), splinePath->at(i-1).Angle2(), splinePath->at(i).Angle1(), splinePath->at(i-1).KAsm2(), splinePath->at(i).KAsm1(), splinePath->getKCurve()); VPointF *p1 = new VPointF(spline.GetP1()); BiasRotatePoint(p1, dx, dy, data->GeometricObject<VPointF>(pRotate)->toQPointF(), angle); //quint32 idP1 = data->AddGObject(p1); --k; VPointF p2 = VPointF(spline.GetP2()); BiasRotatePoint(&p2, dx, dy, data->GeometricObject<VPointF>(pRotate)->toQPointF(), angle); VPointF p3 = VPointF(spline.GetP3()); BiasRotatePoint(&p3, dx, dy, data->GeometricObject<VPointF>(pRotate)->toQPointF(), angle); VPointF *p4 = new VPointF(spline.GetP4()); BiasRotatePoint(p4, dx, dy, data->GeometricObject<VPointF>(pRotate)->toQPointF(), angle); //quint32 idP4 = data->AddGObject(p4); --k; VSpline spl = VSpline(*p1, p2.toQPointF(), p3.toQPointF(), *p4, spline.GetKcurve()); if (i==1) { path->append(VSplinePoint(*p1, splinePath->at(i-1).KAsm1(), spl.GetAngle1()+180, splinePath->at(i-1).KAsm2(), spl.GetAngle1())); } path->append(VSplinePoint(*p4, splinePath->at(i).KAsm1(), spl.GetAngle2(), splinePath->at(i).KAsm2(), spl.GetAngle2()+180)); delete p4; delete p1; } while (k>=0) { data->getNextId(); --k; } idObject = data->AddGObject(path); VSplinePath *path1 = new VSplinePath(*path); path1->setMode(Draw::Modeling); id = data->AddGObject(path1); VNodeSplinePath::Create(doc, data, id, idObject, Document::FullParse, Source::FromGui, idTool, tool); } } break; default: qDebug()<<"May be wrong tool type!!! Ignoring."<<Q_FUNC_INFO; break; } newDetail.append(VNodeDetail(id, det.at(i).getTypeTool(), NodeDetail::Contour)); }
/** * @brief UpdatePoints update data for united details. * @param idDetail id united detail. * @param data container with variables. * @param det detail what we union. * @param i index node in detail. * @param idCount count updated or created objects. * @param dx bias node x axis. * @param dy bias node y axis. * @param pRotate point rotation. * @param angle angle rotation. */ void VToolUnionDetails::UpdatePoints(const quint32 &idDetail, VContainer *data, const VDetail &det, const int &i, quint32 &idCount, const qreal &dx, const qreal &dy, const quint32 &pRotate, const qreal &angle) { switch (det.at(i).getTypeTool()) { case (Tool::NodePoint): { if (qFuzzyCompare(dx+1, 1) == false || qFuzzyCompare(dy+1, 1) == false || pRotate != 0) { VPointF *point = new VPointF(*data->GeometricObject<VPointF>(det.at(i).getId())); point->setMode(Draw::Modeling); BiasRotatePoint(point, dx, dy, data->GeometricObject<VPointF>(pRotate)->toQPointF(), angle); ++idCount; data->UpdateGObject(idDetail+idCount, point); ++idCount; } } break; case (Tool::NodeArc): { if (qFuzzyCompare(dx+1, 1) == false || qFuzzyCompare(dy+1, 1) == false || pRotate != 0) { const QSharedPointer<VArc> arc = data->GeometricObject<VArc>(det.at(i).getId()); VPointF p1 = VPointF(arc->GetP1()); BiasRotatePoint(&p1, dx, dy, data->GeometricObject<VPointF>(pRotate)->toQPointF(), angle); VPointF p2 = VPointF(arc->GetP2()); BiasRotatePoint(&p2, dx, dy, data->GeometricObject<VPointF>(pRotate)->toQPointF(), angle); VPointF *center = new VPointF(arc->GetCenter()); BiasRotatePoint(center, dx, dy, data->GeometricObject<VPointF>(pRotate)->toQPointF(), angle); QLineF l1(center->toQPointF(), p1.toQPointF()); QLineF l2(center->toQPointF(), p2.toQPointF()); ++idCount; center->setMode(Draw::Modeling); data->UpdateGObject(idDetail+idCount, center); VArc *arc1 = new VArc(*center, arc->GetRadius(), arc->GetFormulaRadius(), l1.angle(), QString().setNum(l1.angle()), l2.angle(), QString().setNum(l2.angle())); arc1->setMode(Draw::Modeling); ++idCount; data->UpdateGObject(idDetail+idCount, arc1); ++idCount; } } break; case (Tool::NodeSpline): { if (qFuzzyCompare(dx+1, 1) == false || qFuzzyCompare(dy+1, 1) == false || pRotate != 0) { const QSharedPointer<VSpline> spline = data->GeometricObject<VSpline>(det.at(i).getId()); VPointF *p1 = new VPointF(spline->GetP1()); BiasRotatePoint(p1, dx, dy, data->GeometricObject<VPointF>(pRotate)->toQPointF(), angle); ++idCount; data->UpdateGObject(idDetail+idCount, p1); VPointF p2 = VPointF(spline->GetP2()); BiasRotatePoint(&p2, dx, dy, data->GeometricObject<VPointF>(pRotate)->toQPointF(), angle); VPointF p3 = VPointF(spline->GetP3()); BiasRotatePoint(&p3, dx, dy, data->GeometricObject<VPointF>(pRotate)->toQPointF(), angle); VPointF *p4 = new VPointF(spline->GetP4()); BiasRotatePoint(p4, dx, dy, data->GeometricObject<VPointF>(pRotate)->toQPointF(), angle); ++idCount; data->UpdateGObject(idDetail+idCount, p4); VSpline *spl = new VSpline(*p1, p2.toQPointF(), p3.toQPointF(), *p4, spline->GetKcurve(), 0, Draw::Modeling); ++idCount; data->UpdateGObject(idDetail+idCount, spl); ++idCount; } } break; case (Tool::NodeSplinePath): { if (qFuzzyCompare(dx+1, 1) == false || qFuzzyCompare(dy+1, 1) == false || pRotate != 0) { VSplinePath *path = new VSplinePath(); path->setMode(Draw::Modeling); const QSharedPointer<VSplinePath> splinePath = data->GeometricObject<VSplinePath>(det.at(i).getId()); SCASSERT(splinePath != nullptr); qint32 k = splinePath->getMaxCountPoints(); for (qint32 i = 1; i <= splinePath->Count(); ++i) { VSpline spline(splinePath->at(i-1).P(), splinePath->at(i).P(), splinePath->at(i-1).Angle2(), splinePath->at(i).Angle1(), splinePath->at(i-1).KAsm2(), splinePath->at(i).KAsm1(), splinePath->getKCurve()); VPointF *p1 = new VPointF(spline.GetP1()); BiasRotatePoint(p1, dx, dy, data->GeometricObject<VPointF>(pRotate)->toQPointF(), angle); ++idCount; data->UpdateGObject(idDetail+idCount, p1); --k; VPointF p2 = VPointF(spline.GetP2()); BiasRotatePoint(&p2, dx, dy, data->GeometricObject<VPointF>(pRotate)->toQPointF(), angle); VPointF p3 = VPointF(spline.GetP3()); BiasRotatePoint(&p3, dx, dy, data->GeometricObject<VPointF>(pRotate)->toQPointF(), angle); VPointF *p4 = new VPointF(spline.GetP4()); BiasRotatePoint(p4, dx, dy, data->GeometricObject<VPointF>(pRotate)->toQPointF(), angle); ++idCount; data->UpdateGObject(idDetail+idCount, p4); --k; VSpline spl = VSpline(*p1, p2.toQPointF(), p3.toQPointF(), *p4, spline.GetKcurve()); if (i==1) { path->append(VSplinePoint(*p1, splinePath->at(i-1).KAsm1(), spl.GetAngle1()+180, splinePath->at(i-1).KAsm2(), spl.GetAngle1())); } path->append(VSplinePoint(*p4, splinePath->at(i).KAsm1(), spl.GetAngle2(), splinePath->at(i).KAsm2(), spl.GetAngle2()+180)); } while (k>=0) { data->getNextId(); --k; ++idCount; } ++idCount; data->UpdateGObject(idDetail+idCount, path); ++idCount; } } break; default: qDebug()<<"May be wrong tool type!!! Ignoring."<<Q_FUNC_INFO; break; } }
/** * @brief VSpline constructor. * @param spline spline from which the copy. */ VSpline::VSpline ( const VSpline & spline ) :VAbstractCurve(spline), p1(spline.GetP1 ()), p2(spline.GetP2 ()), p3(spline.GetP3 ()), p4(spline.GetP4 ()), angle1(spline.GetAngle1 ()), angle2(spline.GetAngle2 ()), kAsm1(spline.GetKasm1()), kAsm2(spline.GetKasm2()), kCurve(spline.GetKcurve()) {}