diff --git a/src/Mod/Path/libarea/Curve.cpp b/src/Mod/Path/libarea/Curve.cpp index de103cb8e1..e758a423a9 100644 --- a/src/Mod/Path/libarea/Curve.cpp +++ b/src/Mod/Path/libarea/Curve.cpp @@ -226,7 +226,6 @@ void CCurve::FitArcs(bool retry) if(might_be_an_arc.size() > 0) { // check if the last edge can form an arc with the starting edge if(!retry && - !arc_found && m_vertices.size()>2 && m_vertices.begin()->m_type==0 && IsClosed()) @@ -234,13 +233,28 @@ void CCurve::FitArcs(bool retry) std::list tmp; auto it = m_vertices.begin(); tmp.push_back(&(*it++)); - tmp.push_back(&(*it)); - CArc tmpArc; - if(CheckForArc(new_vertices.back(),tmp,tmpArc)) { - m_vertices.push_front(CVertex(new_vertices.back().m_p)); - m_vertices.pop_back(); - FitArcs(true); - return; + + // this condition check is to skip the situation when both the + // starting and ending has already been fitted with some arc + if(!arc_found || it->m_type==0) { + tmp.push_back(&(*it)); + CArc tmpArc; + auto itEnd = m_vertices.end(); + --itEnd; + --itEnd; + if(CheckForArc(*itEnd,tmp,tmpArc)) { + if(arc_found) { + // this means the last edge has already been fitted with + // some arc, so we move the first edge to the end + m_vertices.push_back(m_vertices.front()); + m_vertices.pop_front(); + }else{ + m_vertices.push_front(CVertex(new_vertices.back().m_p)); + m_vertices.pop_back(); + } + FitArcs(true); + return; + } } } AddArcOrLines(false, new_vertices, might_be_an_arc, arc, arc_found, arc_added);