Skip to content

Commit

Permalink
Refactor ViewProvider move constraint code
Browse files Browse the repository at this point in the history
  • Loading branch information
abdullahtahiriyo authored and FlachyJoe committed Dec 12, 2023
1 parent e36248c commit 5cbb381
Showing 1 changed file with 11 additions and 29 deletions.
40 changes: 11 additions & 29 deletions src/Mod/Sketcher/Gui/ViewProviderSketch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1700,58 +1700,40 @@ void ViewProviderSketch::moveConstraint(int constNum, const Base::Vector2d& toPo
p1 = getSolvedSketch().getPoint(Constr->First, Constr->FirstPos);
const Part::Geometry *geo1 = GeoList::getGeometryFromGeoId (geomlist, Constr->First);
const Part::Geometry *geo2 = GeoList::getGeometryFromGeoId (geomlist, Constr->Second);

if (isLineSegment(*geo2)) {
if (isCircle(*geo1) || isArcOfCircle(*geo1)){
if (isCircleOrArc(*geo1)){
std::swap(geo1, geo2); // see below
}
else {
// point to line distance
auto lineSeg = static_cast<const Part::GeomLineSegment *>(geo2);
auto lineSeg = static_cast<const Part::GeomLineSegment *>(geo2); //NOLINT
Base::Vector3d l2p1 = lineSeg->getStartPoint();
Base::Vector3d l2p2 = lineSeg->getEndPoint();
// calculate the projection of p1 onto line2
p2.ProjectToLine(p1-l2p1, l2p2-l2p1);
p2 += p1;
}
}
if (isCircle(*geo2) || isArcOfCircle(*geo2)) {

if (isCircleOrArc(*geo2)) {
if (Constr->FirstPos != Sketcher::PointPos::none){ // circular to point distance
Base::Vector3d ct;
double rad = 0.0;
if (isCircle(*geo2)){
auto circleSeg2 = static_cast<const Part::GeomCircle*>(geo2);
ct = circleSeg2->getCenter();
rad = circleSeg2->getRadius();
}
else {
auto circleSeg2 = static_cast<const Part::GeomArcOfCircle*>(geo2);
ct = circleSeg2->getCenter();
rad = circleSeg2->getRadius();
}
auto [rad, ct] = getRadiusCenterCircleArc(geo2);

Base::Vector3d v = p1 - ct;
v = v.Normalize();
p2 = ct + rad * v;
}
else if (isCircle(*geo1) || isArcOfCircle(*geo1)) { // circular to circular distance
else if (isCircleOrArc(*geo1)) { // circular to circular distance
GetCirclesMinimalDistance(geo1, geo2, p1, p2);
}
else if (isLineSegment(*geo1)){ // circular to line distance
auto lineSeg = static_cast<const Part::GeomLineSegment*>(geo1);
auto lineSeg = static_cast<const Part::GeomLineSegment*>(geo1); //NOLINT
Base::Vector3d l2p1 = lineSeg->getStartPoint();
Base::Vector3d l2p2 = lineSeg->getEndPoint();

Base::Vector3d ct;
double rad;
if (isCircle(*geo2)){
auto circleSeg = static_cast<const Part::GeomCircle*>(geo2);
ct = circleSeg->getCenter();
rad = circleSeg->getRadius();
}
else {
auto circleSeg = static_cast<const Part::GeomArcOfCircle*>(geo2);
ct = circleSeg->getCenter();
rad = circleSeg->getRadius();
}
auto [rad, ct] = getRadiusCenterCircleArc(geo2);

p1.ProjectToLine(ct - l2p1, l2p2 - l2p1);// project on the line translated to origin
Base::Vector3d v = p1;
p1 += ct;
Expand Down

0 comments on commit 5cbb381

Please sign in to comment.