Part: ArcOfParabola extension to set the symmetry axis

This commit is contained in:
Abdullah Tahiri 2016-12-17 23:21:47 +01:00
parent 8c83f4142b
commit 579cbb280b
2 changed files with 46 additions and 0 deletions

View File

@ -2322,6 +2322,49 @@ void GeomArcOfParabola::setFocal(double length)
}
}
/*!
* \brief GeomArcOfParabola::getXAxisDir
* \return the direction vector (unit-length) of symmetry axis of the parabola. The
* direction also points to the focus.
*/
Base::Vector3d GeomArcOfParabola::getXAxisDir() const
{
Handle_Geom_Parabola c = Handle_Geom_Parabola::DownCast( myCurve->BasisCurve() );
assert(!c.IsNull());
gp_Dir xdir = c->XAxis().Direction();
return Base::Vector3d(xdir.X(), xdir.Y(), xdir.Z());
}
/*!
* \brief GeomArcOfParabola::setXAxisDir Rotates the parabola in its plane, so
* that its symmetry axis is as close as possible to the provided direction.
* \param newdir [in] is the new direction. If the vector is small, the
* orientation of the parabola will be preserved. If the vector is not small,
* but its projection onto plane of the parabola is small, an exception will be
* thrown.
*/
void GeomArcOfParabola::setXAxisDir(Base::Vector3d newdir)
{
Handle_Geom_Parabola c = Handle_Geom_Parabola::DownCast( myCurve->BasisCurve() );
assert(!c.IsNull());
#if OCC_VERSION_HEX >= 0x060504
if (newdir.Sqr() < Precision::SquareConfusion())
#else
if (newdir.Length() < Precision::Confusion())
#endif
return;//zero vector was passed. Keep the old orientation.
try {
gp_Ax2 pos = c->Position();
pos.SetXDirection(gp_Dir(newdir.x, newdir.y, newdir.z));//OCC should keep the old main Direction (Z), and change YDirection to accomodate the new XDirection.
c->SetPosition(pos);
}
catch (Standard_Failure) {
Handle_Standard_Failure e = Standard_Failure::Caught();
throw Base::Exception(e->GetMessageString());
}
}
Base::Vector3d GeomArcOfParabola::getFocus(void) const
{
Handle_Geom_Parabola p = Handle_Geom_Parabola::DownCast(myCurve->BasisCurve());

View File

@ -497,6 +497,9 @@ public:
double getFocal(void) const;
void setFocal(double length);
Base::Vector3d getXAxisDir() const;
void setXAxisDir(Base::Vector3d newdir);
Base::Vector3d getFocus(void) const;
virtual void getRange(double& u, double& v, bool emulateCCWXY) const;