Path.Area: added python abort() to abort lengthy operation
This commit is contained in:
parent
6f862fe4a1
commit
e66f4c5d6f
|
@ -108,6 +108,8 @@ CAreaConfig::~CAreaConfig() {
|
||||||
|
|
||||||
TYPESYSTEM_SOURCE(Path::Area, Base::BaseClass);
|
TYPESYSTEM_SOURCE(Path::Area, Base::BaseClass);
|
||||||
|
|
||||||
|
bool Area::s_aborting;
|
||||||
|
|
||||||
Area::Area(const AreaParams *params)
|
Area::Area(const AreaParams *params)
|
||||||
:myHaveFace(false)
|
:myHaveFace(false)
|
||||||
,myHaveSolid(false)
|
,myHaveSolid(false)
|
||||||
|
|
|
@ -44,6 +44,10 @@
|
||||||
str << "Path.Area: " << _msg;\
|
str << "Path.Area: " << _msg;\
|
||||||
Base::Console()._l("%s\n",str.str().c_str());\
|
Base::Console()._l("%s\n",str.str().c_str());\
|
||||||
qApp->sendPostedEvents();\
|
qApp->sendPostedEvents();\
|
||||||
|
if(Area::aborted()) {\
|
||||||
|
Area::abort(false);\
|
||||||
|
throw Base::AbortException("operation aborted");\
|
||||||
|
}\
|
||||||
}while(0)
|
}while(0)
|
||||||
|
|
||||||
#define AREA_LOG(_msg) _AREA_LOG(Log,_msg)
|
#define AREA_LOG(_msg) _AREA_LOG(Log,_msg)
|
||||||
|
@ -195,6 +199,7 @@ protected:
|
||||||
bool myHaveSolid;
|
bool myHaveSolid;
|
||||||
bool myShapeDone;
|
bool myShapeDone;
|
||||||
int mySkippedShapes;
|
int mySkippedShapes;
|
||||||
|
static bool s_aborting;
|
||||||
|
|
||||||
/** Called internally to combine children shapes for further processing */
|
/** Called internally to combine children shapes for further processing */
|
||||||
void build();
|
void build();
|
||||||
|
@ -432,6 +437,14 @@ public:
|
||||||
const AreaParams *params=NULL, const gp_Pnt *pstart=NULL, gp_Pnt *pend=NULL,
|
const AreaParams *params=NULL, const gp_Pnt *pstart=NULL, gp_Pnt *pend=NULL,
|
||||||
PARAM_ARGS_DEF(PARAM_FARG,AREA_PARAMS_PATH));
|
PARAM_ARGS_DEF(PARAM_FARG,AREA_PARAMS_PATH));
|
||||||
|
|
||||||
|
static void abort(bool aborting) {
|
||||||
|
s_aborting = aborting;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool aborted() {
|
||||||
|
return s_aborting;
|
||||||
|
}
|
||||||
|
|
||||||
PARAM_ENUM_DECLARE(AREA_PARAMS_PATH)
|
PARAM_ENUM_DECLARE(AREA_PARAMS_PATH)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -77,6 +77,13 @@ same algorithm</UserDocu>
|
||||||
<UserDocu>Get current algorithm parameters as a dictionary.</UserDocu>
|
<UserDocu>Get current algorithm parameters as a dictionary.</UserDocu>
|
||||||
</Documentation>
|
</Documentation>
|
||||||
</Methode>
|
</Methode>
|
||||||
|
<Methode Name="abort" Keyword="true">
|
||||||
|
<Documentation>
|
||||||
|
<UserDocu>abort(aborting=True): Static method to abort any ongoing operation\n
|
||||||
|
To ensure no stray abortion is left in the previous operaion, it is advised to manually
|
||||||
|
clear the aborting flag by calling abort(False) before starting a new operation. </UserDocu>
|
||||||
|
</Documentation>
|
||||||
|
</Methode>
|
||||||
<Attribute Name="Sections" ReadOnly="true">
|
<Attribute Name="Sections" ReadOnly="true">
|
||||||
<Documentation>
|
<Documentation>
|
||||||
<UserDocu>List of sections in this area.</UserDocu>
|
<UserDocu>List of sections in this area.</UserDocu>
|
||||||
|
|
|
@ -100,10 +100,23 @@ static const AreaDoc myDocs[] = {
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
struct AreaPyDoc {
|
static PyObject * abortArea(PyObject *, PyObject *args, PyObject *kwd) {
|
||||||
AreaPyDoc() {
|
static char *kwlist[] = {"aborting", NULL};
|
||||||
|
PyObject *pObj = Py_True;
|
||||||
|
if (!PyArg_ParseTupleAndKeywords(args,kwd,"|O",kwlist,&pObj))
|
||||||
|
return 0;
|
||||||
|
Area::abort(PyObject_IsTrue(pObj));
|
||||||
|
return Py_None;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct AreaPyModifier {
|
||||||
|
AreaPyModifier() {
|
||||||
for(PyMethodDef &method : Path::AreaPy::Methods) {
|
for(PyMethodDef &method : Path::AreaPy::Methods) {
|
||||||
if(!method.ml_name) continue;
|
if(!method.ml_name) continue;
|
||||||
|
if(std::strcmp(method.ml_name,"abort")==0) {
|
||||||
|
method.ml_meth = (PyCFunction)abortArea;
|
||||||
|
method.ml_flags |= METH_STATIC;
|
||||||
|
}
|
||||||
for(const AreaDoc &doc : myDocs) {
|
for(const AreaDoc &doc : myDocs) {
|
||||||
if(std::strcmp(method.ml_name,doc.name)==0) {
|
if(std::strcmp(method.ml_name,doc.name)==0) {
|
||||||
method.ml_doc = doc.doc;
|
method.ml_doc = doc.doc;
|
||||||
|
@ -114,7 +127,7 @@ struct AreaPyDoc {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
static AreaPyDoc doc;
|
static AreaPyModifier mod;
|
||||||
|
|
||||||
namespace Part {
|
namespace Part {
|
||||||
extern PartExport Py::Object shape2pyshape(const TopoDS_Shape &shape);
|
extern PartExport Py::Object shape2pyshape(const TopoDS_Shape &shape);
|
||||||
|
@ -376,6 +389,10 @@ PyObject* AreaPy::getParams(PyObject *args)
|
||||||
return dict;
|
return dict;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PyObject* AreaPy::abort(PyObject *, PyObject *) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
PyObject* AreaPy::getParamsDesc(PyObject *args, PyObject *keywds)
|
PyObject* AreaPy::getParamsDesc(PyObject *args, PyObject *keywds)
|
||||||
{
|
{
|
||||||
PyObject *pcObj = Py_True;
|
PyObject *pcObj = Py_True;
|
||||||
|
@ -424,5 +441,3 @@ int AreaPy::setCustomAttributes(const char* /*attr*/, PyObject* /*obj*/)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user