diff --git a/src/Mod/Sketcher/App/Sketch.cpp b/src/Mod/Sketcher/App/Sketch.cpp index dd85933a0..8ca398bfd 100644 --- a/src/Mod/Sketcher/App/Sketch.cpp +++ b/src/Mod/Sketcher/App/Sketch.cpp @@ -109,24 +109,17 @@ void Sketch::clear(void) int Sketch::setUpSketch(const std::vector &GeoList, const std::vector &ConstraintList, bool withDiagnose) +{ + return setUpSketch(GeoList, std::vector(0), ConstraintList); +} + +int Sketch::setUpSketch(const std::vector &GeoList, const std::vector &FixedGeoList, + const std::vector &ConstraintList, bool withDiagnose) { clear(); - for (std::vector::const_iterator it = GeoList.begin(); it != GeoList.end(); ++it) { - if ((*it)->getTypeId()== GeomLineSegment::getClassTypeId()) { // add a line - const GeomLineSegment *lineSeg = dynamic_cast((*it)); - // create the definition struct for that geom - addLineSegment(*lineSeg); - } else if ((*it)->getTypeId()== GeomCircle::getClassTypeId()) { - const GeomCircle *circle = dynamic_cast((*it)); - addCircle(*circle); - } else if ((*it)->getTypeId()== GeomArcOfCircle::getClassTypeId()) { - const GeomArcOfCircle *aoc = dynamic_cast((*it)); - addArc(*aoc); - } else { - Base::Exception("Sketch::setUpSketch(): Unknown or unsupported type added to a sketch"); - } - } + addGeometry(GeoList); + addGeometry(FixedGeoList, true); // The Geoms list might be empty after an undo/redo if (!Geoms.empty()) @@ -163,34 +156,36 @@ const char* nameByType(Sketch::GeoType type) // Geometry adding ========================================================== -int Sketch::addGeometry(const Part::Geometry *geo) +int Sketch::addGeometry(const Part::Geometry *geo, bool fixed) { if (geo->getTypeId()== GeomLineSegment::getClassTypeId()) { // add a line const GeomLineSegment *lineSeg = dynamic_cast(geo); // create the definition struct for that geom - return addLineSegment(*lineSeg); + return addLineSegment(*lineSeg, fixed); } else if (geo->getTypeId()== GeomCircle::getClassTypeId()) { // add a circle const GeomCircle *circle = dynamic_cast(geo); // create the definition struct for that geom - return addCircle(*circle); + return addCircle(*circle, fixed); } else if (geo->getTypeId()== GeomArcOfCircle::getClassTypeId()) { // add an arc const GeomArcOfCircle *aoc = dynamic_cast(geo); // create the definition struct for that geom - return addArc(*aoc); + return addArc(*aoc, fixed); } else { Base::Exception("Sketch::addGeometry(): Unknown or unsupported type added to a sketch"); return 0; } } -void Sketch::addGeometry(const std::vector &geo) +void Sketch::addGeometry(const std::vector &geo, bool fixed) { for (std::vector::const_iterator it = geo.begin();it!=geo.end();++it) - addGeometry(*it); + addGeometry(*it, fixed); } -int Sketch::addPoint(const Base::Vector3d &newPoint) +int Sketch::addPoint(const Base::Vector3d &newPoint, bool fixed) { + std::vector ¶ms = fixed ? FixParameters : Parameters; + // create the definition struct for that geom GeoDef def; def.geo = 0; @@ -198,14 +193,13 @@ int Sketch::addPoint(const Base::Vector3d &newPoint) def.construction = false; // set the parameter for the solver - int paramStartIndex = Parameters.size(); - Parameters.push_back(new double(newPoint.x)); - Parameters.push_back(new double(newPoint.y)); + params.push_back(new double(newPoint.x)); + params.push_back(new double(newPoint.y)); // set the points for later constraints GCS::Point p1; - p1.x = Parameters[paramStartIndex+0]; - p1.y = Parameters[paramStartIndex+1]; + p1.x = params[params.size()-2]; + p1.y = params[params.size()-1]; def.startPointId = Points.size(); Points.push_back(p1); @@ -216,15 +210,17 @@ int Sketch::addPoint(const Base::Vector3d &newPoint) return Geoms.size()-1; } -int Sketch::addLine(const Part::GeomLineSegment &line) +int Sketch::addLine(const Part::GeomLineSegment &line, bool fixed) { // return the position of the newly added geometry return Geoms.size()-1; } -int Sketch::addLineSegment(const Part::GeomLineSegment &lineSegment) +int Sketch::addLineSegment(const Part::GeomLineSegment &lineSegment, bool fixed) { + std::vector ¶ms = fixed ? FixParameters : Parameters; + // create our own copy GeomLineSegment *lineSeg = static_cast(lineSegment.clone()); // create the definition struct for that geom @@ -240,15 +236,15 @@ int Sketch::addLineSegment(const Part::GeomLineSegment &lineSegment) // the points for later constraints GCS::Point p1, p2; - Parameters.push_back(new double(start.x)); - Parameters.push_back(new double(start.y)); - p1.x = Parameters[Parameters.size()-2]; - p1.y = Parameters[Parameters.size()-1]; + params.push_back(new double(start.x)); + params.push_back(new double(start.y)); + p1.x = params[params.size()-2]; + p1.y = params[params.size()-1]; - Parameters.push_back(new double(end.x)); - Parameters.push_back(new double(end.y)); - p2.x = Parameters[Parameters.size()-2]; - p2.y = Parameters[Parameters.size()-1]; + params.push_back(new double(end.x)); + params.push_back(new double(end.y)); + p2.x = params[params.size()-2]; + p2.y = params[params.size()-1]; // add the points def.startPointId = Points.size(); @@ -270,8 +266,10 @@ int Sketch::addLineSegment(const Part::GeomLineSegment &lineSegment) return Geoms.size()-1; } -int Sketch::addArc(const Part::GeomArcOfCircle &circleSegment) +int Sketch::addArc(const Part::GeomArcOfCircle &circleSegment, bool fixed) { + std::vector ¶ms = fixed ? FixParameters : Parameters; + // create our own copy GeomArcOfCircle *aoc = static_cast(circleSegment.clone()); // create the definition struct for that geom @@ -289,20 +287,20 @@ int Sketch::addArc(const Part::GeomArcOfCircle &circleSegment) GCS::Point p1, p2, p3; - Parameters.push_back(new double(startPnt.x)); - Parameters.push_back(new double(startPnt.y)); - p1.x = Parameters[Parameters.size()-2]; - p1.y = Parameters[Parameters.size()-1]; + params.push_back(new double(startPnt.x)); + params.push_back(new double(startPnt.y)); + p1.x = params[params.size()-2]; + p1.y = params[params.size()-1]; - Parameters.push_back(new double(endPnt.x)); - Parameters.push_back(new double(endPnt.y)); - p2.x = Parameters[Parameters.size()-2]; - p2.y = Parameters[Parameters.size()-1]; + params.push_back(new double(endPnt.x)); + params.push_back(new double(endPnt.y)); + p2.x = params[params.size()-2]; + p2.y = params[params.size()-1]; - Parameters.push_back(new double(center.x)); - Parameters.push_back(new double(center.y)); - p3.x = Parameters[Parameters.size()-2]; - p3.y = Parameters[Parameters.size()-1]; + params.push_back(new double(center.x)); + params.push_back(new double(center.y)); + p3.x = params[params.size()-2]; + p3.y = params[params.size()-1]; def.startPointId = Points.size(); Points.push_back(p1); @@ -311,12 +309,12 @@ int Sketch::addArc(const Part::GeomArcOfCircle &circleSegment) def.midPointId = Points.size(); Points.push_back(p3); - Parameters.push_back(new double(radius)); - double *r = Parameters[Parameters.size()-1]; - Parameters.push_back(new double(startAngle)); - double *a1 = Parameters[Parameters.size()-1]; - Parameters.push_back(new double(endAngle)); - double *a2 = Parameters[Parameters.size()-1]; + params.push_back(new double(radius)); + double *r = params[params.size()-1]; + params.push_back(new double(startAngle)); + double *a1 = params[params.size()-1]; + params.push_back(new double(endAngle)); + double *a2 = params[params.size()-1]; // set the arc for later constraints GCS::Arc a; @@ -339,8 +337,10 @@ int Sketch::addArc(const Part::GeomArcOfCircle &circleSegment) return Geoms.size()-1; } -int Sketch::addCircle(const Part::GeomCircle &cir) +int Sketch::addCircle(const Part::GeomCircle &cir, bool fixed) { + std::vector ¶ms = fixed ? FixParameters : Parameters; + // create our own copy GeomCircle *circ = static_cast(cir.clone()); // create the definition struct for that geom @@ -354,18 +354,18 @@ int Sketch::addCircle(const Part::GeomCircle &cir) GCS::Point p1; - Parameters.push_back(new double(center.x)); - Parameters.push_back(new double(center.y)); - p1.x = Parameters[Parameters.size()-2]; - p1.y = Parameters[Parameters.size()-1]; + params.push_back(new double(center.x)); + params.push_back(new double(center.y)); + p1.x = params[params.size()-2]; + p1.y = params[params.size()-1]; - Parameters.push_back(new double(radius)); + params.push_back(new double(radius)); def.midPointId = Points.size(); Points.push_back(p1); // add the radius parameter - double *r = Parameters[Parameters.size()-1]; + double *r = params[params.size()-1]; // set the circle for later constraints GCS::Circle c; @@ -381,7 +381,7 @@ int Sketch::addCircle(const Part::GeomCircle &cir) return Geoms.size()-1; } -int Sketch::addEllipse(const Part::GeomEllipse &ellipse) +int Sketch::addEllipse(const Part::GeomEllipse &ellipse, bool fixed) { // return the position of the newly added geometry return Geoms.size()-1; diff --git a/src/Mod/Sketcher/App/Sketch.h b/src/Mod/Sketcher/App/Sketch.h index 522ea5666..0ba9bc03c 100644 --- a/src/Mod/Sketcher/App/Sketch.h +++ b/src/Mod/Sketcher/App/Sketch.h @@ -54,14 +54,16 @@ public: /// delete all geometry and constraints, leave an empty sketch void clear(void); /// set the sketch up with geoms and constraints - int setUpSketch(const std::vector &GeoList,const std::vector &ConstraintList, + int setUpSketch(const std::vector &GeoList, const std::vector &ConstraintList, bool withDiagnose=true); + int setUpSketch(const std::vector &GeoList, const std::vector &FixedGeoList, + const std::vector &ConstraintList, bool withDiagnose=true); /// return the actual geometry of the sketch a TopoShape Part::TopoShape toShape(void) const; /// add unspecified geometry - int addGeometry(const Part::Geometry *geo); + int addGeometry(const Part::Geometry *geo, bool fixed=false); /// add unspecified geometry - void addGeometry(const std::vector &geo); + void addGeometry(const std::vector &geo, bool fixed=false); /// returns the actual geometry std::vector getGeometry(bool withConstrucionElements = true) const; /// get the geometry as python objects @@ -110,17 +112,17 @@ public: /// add dedicated geometry //@{ /// add a point - int addPoint(const Base::Vector3d &point); + int addPoint(const Base::Vector3d &point, bool fixed=false); /// add an infinite line - int addLine(const Part::GeomLineSegment &line); + int addLine(const Part::GeomLineSegment &line, bool fixed=false); /// add a line segment - int addLineSegment(const Part::GeomLineSegment &lineSegment); + int addLineSegment(const Part::GeomLineSegment &lineSegment, bool fixed=false); /// add a arc (circle segment) - int addArc(const Part::GeomArcOfCircle &circleSegment); + int addArc(const Part::GeomArcOfCircle &circleSegment, bool fixed=false); /// add a circle - int addCircle(const Part::GeomCircle &circle); + int addCircle(const Part::GeomCircle &circle, bool fixed=false); /// add a ellipse - int addEllipse(const Part::GeomEllipse &ellipse); + int addEllipse(const Part::GeomEllipse &ellipse, bool fixed=false); //@}