Refactor ViewProvider move constraint code
This commit is contained in:
committed by
abdullahtahiriyo
parent
4d860203fc
commit
4586f71d86
@@ -1700,13 +1700,14 @@ 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
|
||||
@@ -1714,44 +1715,25 @@ void ViewProviderSketch::moveConstraint(int constNum, const Base::Vector2d& toPo
|
||||
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;
|
||||
|
||||
Reference in New Issue
Block a user