diff --git a/src/Mod/Sketcher/App/SketchObject.cpp b/src/Mod/Sketcher/App/SketchObject.cpp index bc9148dd39..92c7a9b703 100644 --- a/src/Mod/Sketcher/App/SketchObject.cpp +++ b/src/Mod/Sketcher/App/SketchObject.cpp @@ -3276,6 +3276,7 @@ void createNewConstraintsForTrim(const SketchObject* obj, const std::array& cuttingGeoIds, const std::array& cutPoints, const std::vector& newIds, + const std::vector newGeos, std::vector& idsOfOldConstraints, std::vector& newConstraints, std::set>& geoIdsToBeDeleted) @@ -3320,7 +3321,7 @@ void createNewConstraintsForTrim(const SketchObject* obj, continue; } // constraint has not yet been changed - obj->deriveConstraintsForPieces(GeoId, newIds, con, newConstraints); + obj->deriveConstraintsForPieces(GeoId, newIds, newGeos, con, newConstraints); } // Add point-on-object/coincidence constraints with the newly exposed points. @@ -3403,6 +3404,7 @@ int SketchObject::trim(int GeoId, const Base::Vector3d& point) //****************************************// std::vector newIds; std::vector newGeos; + std::vector newGeosAsConsts; switch (paramsOfNewGeos.size()) { case 0: { @@ -3424,6 +3426,9 @@ int SketchObject::trim(int GeoId, const Base::Vector3d& point) } createArcsFromGeoWithLimits(geoAsCurve, paramsOfNewGeos, newGeos); + for (const auto* geo : newGeos) { + newGeosAsConsts.push_back(geo); + } //******************* Step C => Creation of new constraints //****************************************// @@ -3461,6 +3466,7 @@ int SketchObject::trim(int GeoId, const Base::Vector3d& point) cuttingGeoIds, cutPoints, newIds, + newGeosAsConsts, idsOfOldConstraints, newConstraints, geoIdsToBeDeleted); @@ -3578,6 +3584,8 @@ bool SketchObject::deriveConstraintsForPieces(const int oldId, conPos = con->SecondPos; } + bool newGeosLikelyNotCreated = std::ranges::find(newGeos, nullptr) != newGeos.end(); + bool transferToAll = false; switch (con->Type) { case Horizontal: @@ -3598,6 +3606,11 @@ bool SketchObject::deriveConstraintsForPieces(const int oldId, return false; } + // no use going forward if newGeos aren't ready + if (newGeosLikelyNotCreated) { + break; + } + // For now: just transfer to the first intersection // TODO: Actually check that there was perpendicularity earlier // TODO: Choose piece based on parameters ("values" of the constraint) @@ -3632,10 +3645,11 @@ bool SketchObject::deriveConstraintsForPieces(const int oldId, return true; } - if (conId == GeoEnum::GeoUndef) { + if (conId == GeoEnum::GeoUndef || newGeosLikelyNotCreated) { // nothing further to do return false; } + Base::Vector3d conPoint(getPoint(conId, conPos)); double conParam; auto* geoAsCurve = static_cast(geo);