diff --git a/src/Mod/Sketcher/App/SketchObject.cpp b/src/Mod/Sketcher/App/SketchObject.cpp index 3941a9cd2..b502eee50 100644 --- a/src/Mod/Sketcher/App/SketchObject.cpp +++ b/src/Mod/Sketcher/App/SketchObject.cpp @@ -459,7 +459,7 @@ int SketchObject::fillet(int GeoId1, int GeoId2, } else return -1; - + if (trim) { PointPos PosId1 = (filletCenter-intersection)*dir1 > 0 ? start : end; PointPos PosId2 = (filletCenter-intersection)*dir2 > 0 ? start : end; @@ -536,17 +536,28 @@ int SketchObject::trim(int GeoId, const Base::Vector3d& point) if (x1 < x0 && x2 > x0) { int newGeoId = addGeometry(geo); // go through all constraints and replace the point (GeoId,end) with (newGeoId,end) - const std::vector &constraints = this->Constraints.getValues(); + const std::vector &constraints = Constraints.getValues(); + std::vector newVals(constraints); for (int i=0; i < int(newVals.size()); i++) { if (constraints[i]->First == GeoId && - constraints[i]->FirstPos == end) - constraints[i]->First = newGeoId; - else if (constraints[i]->Second == GeoId && - constraints[i]->SecondPos == end) - constraints[i]->Second = newGeoId; + constraints[i]->FirstPos == end) { + + Constraint *constNew = newVals[i]->clone(); + constNew->First = newGeoId; + newVals[i] = constNew; + + } else if (constraints[i]->Second == GeoId && + constraints[i]->SecondPos == end) { + + Constraint *constNew = newVals[i]->clone(); + constNew->Second = newGeoId; + newVals[i] = constNew; + } } + this->Constraints.setValues(newVals); + movePoint(GeoId, end, point1); movePoint(newGeoId, start, point2); @@ -640,17 +651,21 @@ int SketchObject::trim(int GeoId, const Base::Vector3d& point) // Trim Point between intersection points if (theta1 < theta0 && theta2 > theta0) { - Part::GeomArcOfCircle *geo = new Part::GeomArcOfCircle(); - geo->setCenter(center); - geo->setRadius(circle->getRadius()); - geo->setRange(theta2, theta1); - delGeometry(GeoId); - int newGeoId = addGeometry(dynamic_cast(geo)); - delete(geo); + // Create a new arc to substitute Circle in geometry list and set parameters + Part::GeomArcOfCircle *geoNew = new Part::GeomArcOfCircle(); + geoNew->setCenter(center); + geoNew->setRadius(circle->getRadius()); + geoNew->setRange(theta2, theta1); + std::vector< Part::Geometry * > newVals(geomlist); + newVals[GeoId] = geoNew; + Geometry.setValues(newVals); + + delete geoNew; + // go through all constraints and replace the point (GeoId,end) with (newGeoId,end) - const std::vector &constraints = this->Constraints.getValues(); + /*const std::vector &constraints = this->Constraints.getValues(); std::vector newVals(constraints); for (int i=0; i < int(newVals.size()); i++) { if (constraints[i]->First == GeoId && @@ -660,16 +675,17 @@ int SketchObject::trim(int GeoId, const Base::Vector3d& point) constraints[i]->SecondPos == end) constraints[i]->Second = newGeoId; } + */ + // constrain the trimming points on the corresponding geometries - Sketcher::Constraint *newConstr = new Sketcher::Constraint(); newConstr->Type = Sketcher::PointOnObject; - newConstr->First = newGeoId; + newConstr->First = GeoId; newConstr->FirstPos = end; newConstr->Second = GeoId1; addConstraint(newConstr); - newConstr->First = newGeoId; + newConstr->First = GeoId; newConstr->FirstPos = start; newConstr->Second = GeoId2; addConstraint(newConstr); @@ -730,19 +746,29 @@ int SketchObject::trim(int GeoId, const Base::Vector3d& point) Part::GeomArcOfCircle *aoc = dynamic_cast(geomlist[GeoId]); Part::GeomArcOfCircle *aoc2 = dynamic_cast(geomlist[newGeoId]); // go through all constraints and replace the point (GeoId,end) with (newGeoId,end) - const std::vector &constraints = this->Constraints.getValues(); + const std::vector &constraints = Constraints.getValues(); + std::vector newVals(constraints); for (int i=0; i < int(newVals.size()); i++) { if (constraints[i]->First == GeoId && - constraints[i]->FirstPos == end) - constraints[i]->First = newGeoId; - else if (constraints[i]->Second == GeoId && - constraints[i]->SecondPos == end) - constraints[i]->Second = newGeoId; + constraints[i]->FirstPos == end) { + + Constraint *constNew = newVals[i]->clone(); + constNew->First = newGeoId; + newVals[i] = constNew; + + } else if (constraints[i]->Second == GeoId && + constraints[i]->SecondPos == end) { + + Constraint *constNew = newVals[i]->clone(); + constNew->Second = newGeoId; + newVals[i] = constNew; + } } - // Setting the range manually to improve stability before adding constraints + this->Constraints.setValues(newVals); + // Setting the range manually to improve stability before adding constraints aoc->getRange(u,v); u = fmod(u, 2.f*M_PI); v = fmod(v, 2.f*M_PI); @@ -751,6 +777,12 @@ int SketchObject::trim(int GeoId, const Base::Vector3d& point) // constrain the trimming points on the corresponding geometries Sketcher::Constraint *newConstr = new Sketcher::Constraint(); + + newConstr->Type = Sketcher::Equal; + newConstr->First = GeoId; + newConstr->Second = newGeoId; + addConstraint(newConstr); + newConstr->Type = Sketcher::PointOnObject; newConstr->First = GeoId; newConstr->FirstPos = end; @@ -762,6 +794,13 @@ int SketchObject::trim(int GeoId, const Base::Vector3d& point) newConstr->Second = GeoId2; addConstraint(newConstr); + newConstr->Type = Sketcher::Coincident; + newConstr->First = GeoId; + newConstr->FirstPos = Sketcher::mid; + newConstr->Second = newGeoId; + newConstr->SecondPos = Sketcher::mid; + addConstraint(newConstr); + delete newConstr; return 0; diff --git a/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp b/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp index 853dab5d3..d23aa1335 100644 --- a/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp +++ b/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp @@ -1969,25 +1969,24 @@ Restart: Base::Vector3d constrPos2 = midpos2 + (norm2 * scale * 2.5); constrPos2 = seekConstraintPosition(constrPos2, dir2, scale * 2.5, edit->constrGroup->getChild(i)); - constrPos2 = constrPos2 - constrPos1; + // Translate the Icon based on calculated position + Base::Vector3d relPos1 = constrPos1 - midpos1 ; // Relative Position of Icons to Midpoint1 + Base::Vector3d relPos2 = constrPos2 - midpos2 ; // Relative Position of Icons to Midpoint2 - Base::Vector3d relPos1 = midpos1 - constrPos1; - Base::Vector3d relPos2 = midpos2 - constrPos2; + relPos1 = relPos1 / scale; + relPos2 = relPos2 / scale; - relPos1 = relPos1 / scale; - relPos2 = relPos2 / scale; + dynamic_cast(sep->getChild(1))->abPos = SbVec3f(midpos1.x, midpos1.y, zConstr); //Absolute Reference - // Translate the Icon based on calculated position - dynamic_cast(sep->getChild(1))->abPos = SbVec3f(midpos1.x, midpos1.y, zConstr); //Absolute Reference + //Reference Position that is scaled according to zoom + dynamic_cast(sep->getChild(1))->translation = SbVec3f(relPos1.x, relPos1.y, 0); - //Reference Position that is scaled according to zoom - dynamic_cast(sep->getChild(1))->translation = SbVec3f(relPos1.x, relPos1.y, 0); + Base::Vector3d secondPos = midpos2 - midpos1; + dynamic_cast(sep->getChild(3))->abPos = SbVec3f(secondPos.x, secondPos.y, zConstr); //Absolute Reference - // Translate the Icon based on calculated position - dynamic_cast(sep->getChild(3))->abPos = SbVec3f(midpos2.x, midpos2.y, zConstr); //Absolute Reference + //Reference Position that is scaled according to zoom + dynamic_cast(sep->getChild(3))->translation = SbVec3f(relPos2.x -relPos1.x, relPos2.y -relPos1.y, 0); - //Reference Position that is scaled according to zoom - dynamic_cast(sep->getChild(3))->translation = SbVec3f(relPos2.x, relPos2.y, 0); break; } else if (geo2->getTypeId() == Part::GeomLineSegment::getClassTypeId()) {