[Sketcher] Expose general tangency with B-splines to Sketcher
The following commits were squashed into this [Sketcher] Handle some corner cases in AngleViaPoint [Sketcher] Avoid redundant constraints with B-splines... When involving tangent, perpendicular and angle constraints. [Sketcher] Add pre-commit changes [Sketcher] Do not allow 2-selection tangent with B-spline Also... [Sketcher] Report error when using direct tangency with B-splines [Sketcher] Fix malformed constraint when B-spline is selected second To clarify, this means the second curve selected. The position of the point in selection order does not matter in angle-via-point. [Sketcher] Fix wrong number for B-Spline tangent on redundancy [Sketcher] Remove existing point-on-object in some redundant cases Particularly when point constrained on a B-spline is being used for tangent, perpendicular or angle via point with the same B-spline. [Sketcher] Fix direction issue with B-spline tangents. Without these changes the solver might try to "twist" the B-spline to make the angle between curves be 0 instead of PI (which may be closer to the initial shape).
This commit is contained in:
@@ -8578,13 +8578,24 @@ double SketchObject::calculateAngleViaPoint(int GeoId1, int GeoId2, double px, d
|
||||
// Temporary sketch based calculation. Slow, but guaranteed consistency with constraints.
|
||||
Sketcher::Sketch sk;
|
||||
|
||||
const Part::Geometry* p1 = this->getGeometry(GeoId1);
|
||||
const Part::Geometry* p2 = this->getGeometry(GeoId2);
|
||||
const Part::GeomCurve* p1 = dynamic_cast<const Part::GeomCurve*>(this->getGeometry(GeoId1));
|
||||
const Part::GeomCurve* p2 = dynamic_cast<const Part::GeomCurve*>(this->getGeometry(GeoId2));
|
||||
|
||||
if (p1 && p2) {
|
||||
// TODO: Check if any of these are B-splines
|
||||
int i1 = sk.addGeometry(this->getGeometry(GeoId1));
|
||||
int i2 = sk.addGeometry(this->getGeometry(GeoId2));
|
||||
|
||||
if (p1->is<Part::GeomBSplineCurve>() ||
|
||||
p2->is<Part::GeomBSplineCurve>()) {
|
||||
double p1ClosestParam, p2ClosestParam;
|
||||
Base::Vector3d pt(px, py, 0);
|
||||
p1->closestParameter(pt, p1ClosestParam);
|
||||
p2->closestParameter(pt, p2ClosestParam);
|
||||
|
||||
return sk.calculateAngleViaParams(i1, i2, p1ClosestParam, p2ClosestParam);
|
||||
}
|
||||
|
||||
return sk.calculateAngleViaPoint(i1, i2, px, py);
|
||||
}
|
||||
else
|
||||
|
||||
Reference in New Issue
Block a user