//--------------------------------------------------------------------------------------------------------------------- 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); } }