Part: Geometry functionality extension
====================================== Added for curves: getFirstParameter getLastParameter curvatureAt length Modified: normalAt(double u, Base::Vector3d& dir) as it was not working properly.
This commit is contained in:
parent
1bac54e63e
commit
9c10b3219d
|
@ -93,6 +93,7 @@
|
|||
# include <GC_MakeArcOfHyperbola.hxx>
|
||||
# include <GC_MakeLine.hxx>
|
||||
# include <GC_MakeSegment.hxx>
|
||||
# include <GCPnts_AbscissaPoint.hxx>
|
||||
# include <Precision.hxx>
|
||||
# include <GeomAPI_ProjectPointOnCurve.hxx>
|
||||
# include <ShapeConstruct_Curve.hxx>
|
||||
|
@ -375,15 +376,25 @@ Base::Vector3d GeomCurve::secondDerivativeAtParameter(double u) const
|
|||
return Base::Vector3d(vec.X(),vec.Y(),vec.Z());
|
||||
}
|
||||
|
||||
bool GeomCurve::normal(double u, gp_Dir& dir) const
|
||||
bool GeomCurve::normalAt(double u, Base::Vector3d& dir) const
|
||||
{
|
||||
Handle_Geom_Curve c = Handle_Geom_Curve::DownCast(handle());
|
||||
GeomLProp_CLProps prop(c,u,1,Precision::Confusion());
|
||||
if (prop.IsTangentDefined()) {
|
||||
prop.Normal(dir);
|
||||
return true;
|
||||
|
||||
try {
|
||||
if (!c.IsNull()) {
|
||||
GeomLProp_CLProps prop(c,u,2,Precision::Confusion());
|
||||
gp_Dir gdir;
|
||||
prop.Normal(gdir);
|
||||
dir = Base::Vector3d(gdir.X(), gdir.Y(), gdir.Z());
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
catch (Standard_Failure) {
|
||||
Handle_Standard_Failure e = Standard_Failure::Caught();
|
||||
throw Base::RuntimeError(e->GetMessageString());
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -433,6 +444,74 @@ bool GeomCurve::closestParameterToBasicCurve(const Base::Vector3d& point, double
|
|||
}
|
||||
}
|
||||
|
||||
double GeomCurve::getFirstParameter() const
|
||||
{
|
||||
|
||||
Handle_Geom_Curve c = Handle_Geom_Curve::DownCast(handle());
|
||||
|
||||
try {
|
||||
if (!c.IsNull()) {
|
||||
// pending check for RealFirst RealLast in case of infinite curve
|
||||
return c->FirstParameter();
|
||||
}
|
||||
}
|
||||
catch (Standard_Failure) {
|
||||
Handle_Standard_Failure e = Standard_Failure::Caught();
|
||||
throw Base::RuntimeError(e->GetMessageString());
|
||||
}
|
||||
|
||||
}
|
||||
double GeomCurve::getLastParameter() const
|
||||
{
|
||||
|
||||
Handle_Geom_Curve c = Handle_Geom_Curve::DownCast(handle());
|
||||
|
||||
try {
|
||||
if (!c.IsNull()) {
|
||||
// pending check for RealFirst RealLast in case of infinite curve
|
||||
return c->LastParameter();
|
||||
}
|
||||
}
|
||||
catch (Standard_Failure) {
|
||||
Handle_Standard_Failure e = Standard_Failure::Caught();
|
||||
throw Base::RuntimeError(e->GetMessageString());
|
||||
}
|
||||
}
|
||||
|
||||
double GeomCurve::curvatureAt(double u) const
|
||||
{
|
||||
Handle_Geom_Curve c = Handle_Geom_Curve::DownCast(handle());
|
||||
|
||||
try {
|
||||
if (!c.IsNull()) {
|
||||
GeomLProp_CLProps prop(c,u,2,Precision::Confusion());
|
||||
return prop.Curvature();
|
||||
}
|
||||
}
|
||||
catch (Standard_Failure) {
|
||||
Handle_Standard_Failure e = Standard_Failure::Caught();
|
||||
throw Base::RuntimeError(e->GetMessageString());
|
||||
}
|
||||
}
|
||||
|
||||
double GeomCurve::length(double u, double v) const
|
||||
{
|
||||
|
||||
Handle_Geom_Curve c = Handle_Geom_Curve::DownCast(handle());
|
||||
|
||||
try {
|
||||
if (!c.IsNull()) {
|
||||
GeomAdaptor_Curve adaptor(c);
|
||||
return GCPnts_AbscissaPoint::Length(adaptor,u,v,Precision::Confusion());
|
||||
}
|
||||
}
|
||||
catch (Standard_Failure) {
|
||||
Handle_Standard_Failure e = Standard_Failure::Caught();
|
||||
throw Base::RuntimeError(e->GetMessageString());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// -------------------------------------------------
|
||||
|
||||
TYPESYSTEM_SOURCE_ABSTRACT(Part::GeomBoundedCurve, Part::GeomCurve)
|
||||
|
|
|
@ -139,9 +139,13 @@ public:
|
|||
Base::Vector3d pointAtParameter(double u) const;
|
||||
Base::Vector3d firstDerivativeAtParameter(double u) const;
|
||||
Base::Vector3d secondDerivativeAtParameter(double u) const;
|
||||
bool normal(double u, gp_Dir& dir) const;
|
||||
bool closestParameter(const Base::Vector3d& point, double &u) const;
|
||||
bool closestParameterToBasicCurve(const Base::Vector3d& point, double &u) const;
|
||||
double getFirstParameter() const;
|
||||
double getLastParameter() const;
|
||||
double curvatureAt(double u) const;
|
||||
double length(double u, double v) const;
|
||||
bool normalAt(double u, Base::Vector3d& dir) const;
|
||||
};
|
||||
|
||||
class PartExport GeomBoundedCurve : public GeomCurve
|
||||
|
|
Loading…
Reference in New Issue
Block a user