/* * This file is part of project OpenEmbroidery. It's copyrighted by * the contributors recorded in the version control history of the file. * Original project location https://code.electrolab.fr/openEmbroidery/openEmbroidery_software * * SPDX-License-Identifier: CECILL-2.1 * License-Filename: Licence_CeCILL_V2.1-en.txt */ #include "curves/OE_joincurve.h" #include #include #include #include #include OE_joincurve::OE_joincurve() { } OE_joincurve::OE_joincurve(OE_subcurve* curve1, OE_subcurve* curve2) { if (curve1) { curves.push_back(curve1); curve1->addDependency(this); } if (curve2) { curves.push_back(curve2); curve2->addDependency(this); } //refresh(); } void OE_joincurve::persist(Pakal::Archive* archive) { archive->value("subcurves", curves); } OE_joincurve::~OE_joincurve() { std::list::iterator i = curves.begin(); while (i != curves.end()) { (*i)->removeDependency(this); i++; } } void OE_joincurve::addCurve(OE_subcurve* curve, int pos) { if (curve) { if (pos < 0) { curves.push_back(curve); } else { pos = std::min((int)curves.size(), pos); std::list::iterator it = std::next(curves.begin(), pos); curves.insert(it, curve); } curve->addDependency(this); setNeedRefresh(); } } void OE_joincurve::removeLastCurve() { if (curves.size()) { OE_subcurve* curve = curves.back(); curves.pop_back(); curve->removeDependency(this); setNeedRefresh(); } } void OE_joincurve::removeCurve(OE_subcurve* curve) { if (curves.size()) { curve->removeDependency(this); curves.remove(curve); needRefresh = true; } } OE_subcurve* OE_joincurve::getCurve(int index) { if (index<0) { index = curves.size()+index; } std::list::iterator curve = curves.begin(); for(int i=0; i::iterator i = curves.begin(); while (i != curves.end()) { if (!(*i)->check()) { return false; } i++; } return true; } return false; } /** \brief refresh the discPts array. */ void OE_joincurve::refresh(float dpi, bool force) { if (!check() || !(needRefresh||force)) { return; } pts.clear(); std::list::iterator i = curves.begin(); while (i != curves.end()) { (*i)->refresh(dpi); //pts.push_back((pts.end()+curves.at(i)->pts.begin())/2.0); //pts.push_back((pts.end()+curves.at(i)->pts.begin())/2.0); if (pts.size() && (*i)->pts.size()) { pts.push_back(((*i)->pts.at(0)-pts.at(pts.size()-1))/3.0f+pts.at(pts.size()-1)); pts.push_back(((*i)->pts.at(0)-pts.at(pts.size()-1))*2.0f /3.0f+pts.at(pts.size()-1)); } pts.insert(pts.end(), (*i)->pts.begin(), (*i)->pts.end()); i++; } } void OE_joincurve::delDependency(OE_base * object) { if (curves.size()) { curves.remove(static_cast(object)); } } void OE_joincurve::refreshDependency() { std::list::iterator i = curves.begin(); while (i != curves.end()) { (*i)->refreshDependency(); (*i)->addDependency(this); i++; } }