diff --git a/src/Mod/Part/App/ArcPy.xml b/src/Mod/Part/App/ArcPy.xml
index 833b23453b..0e09e690d0 100644
--- a/src/Mod/Part/App/ArcPy.xml
+++ b/src/Mod/Part/App/ArcPy.xml
@@ -29,5 +29,12 @@
const Geom_Ellipse & value(void) const {return *getGeom_EllipsePtr();}
-->
+
+
+
+ Re-trims this curve to the provided parameter range ([Float=First, Float=Last])
+
+
+
diff --git a/src/Mod/Part/App/ArcPyImp.cpp b/src/Mod/Part/App/ArcPyImp.cpp
index 5e324a2691..bd6f217269 100644
--- a/src/Mod/Part/App/ArcPyImp.cpp
+++ b/src/Mod/Part/App/ArcPyImp.cpp
@@ -197,6 +197,31 @@ int ArcPy::PyInit(PyObject* args, PyObject* /*kwd*/)
return -1;
}
+PyObject* ArcPy::setParameterRange(PyObject * args)
+{
+ Handle(Geom_Geometry) g = getGeomTrimmedCurvePtr()->handle();
+ Handle(Geom_TrimmedCurve) c = Handle(Geom_TrimmedCurve)::DownCast(g);
+ try {
+ if (!c.IsNull()) {
+ double u,v;
+ u=c->FirstParameter();
+ v=c->LastParameter();
+ if (!PyArg_ParseTuple(args, "|dd", &u,&v))
+ return 0;
+ getGeomTrimmedCurvePtr()->setRange(u,v);
+ Py_Return;
+ }
+ }
+ catch (Base::CADKernelError& e) {
+ PyErr_SetString(PartExceptionOCCError, e.what());
+ return 0;
+ }
+
+ PyErr_SetString(PartExceptionOCCError, "Geometry is not a trimmed curve");
+ return 0;
+}
+
+
PyObject *ArcPy::getCustomAttributes(const char* /*attr*/) const
{
return 0;
@@ -204,5 +229,5 @@ PyObject *ArcPy::getCustomAttributes(const char* /*attr*/) const
int ArcPy::setCustomAttributes(const char* /*attr*/, PyObject* /*obj*/)
{
- return 0;
+ return 0;
}
diff --git a/src/Mod/Part/App/Geometry.cpp b/src/Mod/Part/App/Geometry.cpp
index 29a6427528..c206bfb636 100644
--- a/src/Mod/Part/App/Geometry.cpp
+++ b/src/Mod/Part/App/Geometry.cpp
@@ -1549,6 +1549,25 @@ bool GeomTrimmedCurve::intersectBasisCurves( const GeomTrimmedCurve * c,
}
+void GeomTrimmedCurve::getRange(double& u, double& v) const
+{
+ Handle(Geom_TrimmedCurve) curve = Handle(Geom_TrimmedCurve)::DownCast(handle());
+ u = curve->FirstParameter();
+ v = curve->LastParameter();
+}
+
+void GeomTrimmedCurve::setRange(double u, double v)
+{
+ try {
+ Handle(Geom_TrimmedCurve) curve = Handle(Geom_TrimmedCurve)::DownCast(handle());
+
+ curve->SetTrim(u, v);
+ }
+ catch (Standard_Failure& e) {
+ THROWM(Base::CADKernelError,e.GetMessageString())
+ }
+}
+
// -------------------------------------------------
TYPESYSTEM_SOURCE_ABSTRACT(Part::GeomArcOfConic,Part::GeomTrimmedCurve)
diff --git a/src/Mod/Part/App/Geometry.h b/src/Mod/Part/App/Geometry.h
index b414a7b4b7..d86cd869e8 100644
--- a/src/Mod/Part/App/Geometry.h
+++ b/src/Mod/Part/App/Geometry.h
@@ -101,9 +101,9 @@ protected:
protected:
Geometry();
-
+
protected:
- boost::uuids::uuid tag;
+ boost::uuids::uuid tag;
private:
Geometry(const Geometry&);
@@ -172,12 +172,12 @@ public:
double curvatureAt(double u) const;
double length(double u, double v) const;
bool normalAt(double u, Base::Vector3d& dir) const;
- bool intersect(GeomCurve * c,
- std::vector>& points,
+ bool intersect(GeomCurve * c,
+ std::vector>& points,
double tol = Precision::Confusion()) const;
-
+
void reverse(void);
-
+
protected:
static bool intersect(const Handle(Geom_Curve) c, const Handle(Geom_Curve) c2,
std::vector>& points,
@@ -228,11 +228,11 @@ class PartExport GeomBSplineCurve : public GeomBoundedCurve
public:
GeomBSplineCurve();
GeomBSplineCurve(const Handle(Geom_BSplineCurve)&);
-
+
GeomBSplineCurve( const std::vector& poles, const std::vector& weights,
const std::vector& knots, const std::vector& multiplicities,
int degree, bool periodic=false, bool checkrational = true);
-
+
virtual ~GeomBSplineCurve();
virtual Geometry *copy(void) const;
@@ -353,10 +353,13 @@ public:
void setHandle(const Handle(Geom_TrimmedCurve)&);
const Handle(Geom_Geometry)& handle() const;
- bool intersectBasisCurves( const GeomTrimmedCurve * c,
- std::vector>& points,
+ bool intersectBasisCurves( const GeomTrimmedCurve * c,
+ std::vector>& points,
double tol = Precision::Confusion()) const;
-
+
+ virtual void getRange(double& u, double& v) const;
+ virtual void setRange(double u, double v);
+
protected:
Handle(Geom_TrimmedCurve) myCurve;
};
@@ -395,6 +398,9 @@ public:
virtual void getRange(double& u, double& v, bool emulateCCWXY) const = 0;
virtual void setRange(double u, double v, bool emulateCCWXY) = 0;
+ inline virtual void getRange(double& u, double& v) const { getRange(u,v,false);};
+ inline virtual void setRange(double u, double v) { setRange(u,v,false);};
+
bool isReversed() const;
double getAngleXU(void) const;
void setAngleXU(double angle);
@@ -429,7 +435,7 @@ public:
virtual GeomBSplineCurve* toNurbs(double first, double last) const;
const Handle(Geom_Geometry)& handle() const;
-
+
void setHandle(const Handle(Geom_Circle)&);
private:
@@ -537,7 +543,7 @@ public:
GeomHyperbola(const Handle(Geom_Hyperbola)&);
virtual ~GeomHyperbola();
virtual Geometry *copy(void) const;
-
+
double getMajorRadius(void) const;
void setMajorRadius(double Radius);
double getMinorRadius(void) const;
@@ -598,7 +604,7 @@ public:
GeomParabola(const Handle(Geom_Parabola)&);
virtual ~GeomParabola();
virtual Geometry *copy(void) const;
-
+
double getFocal(void) const;
void setFocal(double length);
@@ -628,9 +634,9 @@ public:
double getFocal(void) const;
void setFocal(double length);
-
+
Base::Vector3d getFocus(void) const;
-
+
virtual void getRange(double& u, double& v, bool emulateCCWXY) const;
virtual void setRange(double u, double v, bool emulateCCWXY);
@@ -687,7 +693,7 @@ public:
Base::Vector3d getStartPoint() const;
Base::Vector3d getEndPoint() const;
- void setPoints(const Base::Vector3d& p1,
+ void setPoints(const Base::Vector3d& p1,
const Base::Vector3d& p2);
// Persistence implementer ---------------------
@@ -1038,7 +1044,7 @@ private:
// Helper functions for fillet tools
-PartExport
+PartExport
bool find2DLinesIntersection(const Base::Vector3d &orig1, const Base::Vector3d &dir1,
const Base::Vector3d &orig2, const Base::Vector3d &dir2,
Base::Vector3d &point);