Sketcher: Various Ellipse enhancements

- Autoconstraints for Ellipse
- Conversion of a Part.Arc of an Ellipse to Sketcher.
This commit is contained in:
Abdullah Tahiri 2014-10-19 07:30:27 +02:00 committed by wmayer
parent dc5c64703a
commit 901bbbed57
2 changed files with 34 additions and 12 deletions

View File

@ -75,12 +75,19 @@ PyObject* SketchObjectPy::addGeometry(PyObject *args)
if (geo->getTypeId() == Part::GeomTrimmedCurve::getClassTypeId()) {
Handle_Geom_TrimmedCurve trim = Handle_Geom_TrimmedCurve::DownCast(geo->handle());
Handle_Geom_Circle circle = Handle_Geom_Circle::DownCast(trim->BasisCurve());
Handle_Geom_Ellipse ellipse = Handle_Geom_Ellipse::DownCast(trim->BasisCurve());
if (!circle.IsNull()) {
// create the definition struct for that geom
Part::GeomArcOfCircle aoc;
aoc.setHandle(trim);
ret = this->getSketchObjectPtr()->addGeometry(&aoc);
}
else if (!ellipse.IsNull()) {
// create the definition struct for that geom
Part::GeomArcOfEllipse aoe;
aoe.setHandle(trim);
ret = this->getSketchObjectPtr()->addGeometry(&aoe);
}
else {
std::stringstream str;
str << "Unsupported geometry type: " << geo->getTypeId().getName();
@ -117,6 +124,7 @@ PyObject* SketchObjectPy::addGeometry(PyObject *args)
if (geo->getTypeId() == Part::GeomTrimmedCurve::getClassTypeId()) {
Handle_Geom_TrimmedCurve trim = Handle_Geom_TrimmedCurve::DownCast(geo->handle());
Handle_Geom_Circle circle = Handle_Geom_Circle::DownCast(trim->BasisCurve());
Handle_Geom_Ellipse ellipse = Handle_Geom_Ellipse::DownCast(trim->BasisCurve());
if (!circle.IsNull()) {
// create the definition struct for that geom
boost::shared_ptr<Part::GeomArcOfCircle> aoc(new Part::GeomArcOfCircle());
@ -124,6 +132,13 @@ PyObject* SketchObjectPy::addGeometry(PyObject *args)
geoList.push_back(aoc.get());
tmpList.push_back(aoc);
}
else if (!ellipse.IsNull()) {
// create the definition struct for that geom
boost::shared_ptr<Part::GeomArcOfEllipse> aoe(new Part::GeomArcOfEllipse());
aoe->setHandle(trim);
geoList.push_back(aoe.get());
tmpList.push_back(aoe);
}
else {
std::stringstream str;
str << "Unsupported geometry type: " << geo->getTypeId().getName();

View File

@ -246,20 +246,27 @@ int DrawSketchHandler::seekAutoConstraint(std::vector<AutoConstraint> &suggested
const Part::GeomEllipse *ellipse = dynamic_cast<const Part::GeomEllipse *>((*it));
Base::Vector3d center = ellipse->getCenter();
Base::Vector3d tmpPos(Pos.fX, Pos.fY, 0.f);
double radius = ellipse->getMajorRadius();
double a = ellipse->getMajorRadius();
double b = ellipse->getMinorRadius();
double phi = ellipse->getAngleXU();
double cf = sqrt(a*a - b*b);
Base::Vector3d focus1P = center + cf * Base::Vector3d(cos(phi),sin(phi),0);
Base::Vector3d focus2P = center - cf * Base::Vector3d(cos(phi),sin(phi),0);
Base::Vector3d norm = Base::Vector3d(Dir.fY,-Dir.fX).Normalize();
double distancetoline = norm*(tmpPos - focus1P); // distance focus1 to line
Base::Vector3d focus1PMirrored = focus1P + 2*distancetoline*norm; // mirror of focus1 with respect to the line
double error = abs((focus1PMirrored-focus2P).Length() - 2*a);
Base::Vector3d projPnt(0.f, 0.f, 0.f);
projPnt = projPnt.ProjToLine(center - tmpPos, Base::Vector3d(Dir.fX, Dir.fY));
double projDist = projPnt.Length();
if ( (projDist < radius + tangDeviation ) && (projDist > radius - tangDeviation)) {
//Find if nearest
if (projDist < tangDeviation) {
if ( error< tangDeviation ) {
tangId = i;
tangDeviation = projDist;
}
tangDeviation = error;
}
} else if ((*it)->getTypeId() == Part::GeomArcOfCircle::getClassTypeId()) {
@ -290,7 +297,7 @@ int DrawSketchHandler::seekAutoConstraint(std::vector<AutoConstraint> &suggested
tangDeviation = projDist;
}
}
}
}
}
if (tangId != Constraint::GeoUndef) {