From f164350387234a94d88d1d1db3795a42f47d48be Mon Sep 17 00:00:00 2001 From: Sergey POKHODENKO Date: Tue, 26 May 2015 12:02:34 +0300 Subject: [PATCH] ParametersPlugin_EvalListener::processEvent() and Model_Update::updateArguments() process Point and Point2D text representation --- src/GeomDataAPI/GeomDataAPI_Point.h | 3 ++ src/GeomDataAPI/GeomDataAPI_Point2D.h | 3 ++ src/Model/Model_Update.cpp | 40 ++++++++++++-- .../ParametersPlugin_EvalListener.cpp | 52 +++++++++++++++++++ 4 files changed, 95 insertions(+), 3 deletions(-) diff --git a/src/GeomDataAPI/GeomDataAPI_Point.h b/src/GeomDataAPI/GeomDataAPI_Point.h index 61eaf4a6b..a940b62cb 100644 --- a/src/GeomDataAPI/GeomDataAPI_Point.h +++ b/src/GeomDataAPI/GeomDataAPI_Point.h @@ -70,4 +70,7 @@ class GeomDataAPI_Point : public ModelAPI_Attribute GEOMDATAAPI_EXPORT virtual ~GeomDataAPI_Point(); }; +//! Pointer on attribute object +typedef std::shared_ptr AttributePointPtr; + #endif diff --git a/src/GeomDataAPI/GeomDataAPI_Point2D.h b/src/GeomDataAPI/GeomDataAPI_Point2D.h index 0dda71058..c693456a9 100644 --- a/src/GeomDataAPI/GeomDataAPI_Point2D.h +++ b/src/GeomDataAPI/GeomDataAPI_Point2D.h @@ -68,4 +68,7 @@ class GeomDataAPI_Point2D : public ModelAPI_Attribute GEOMDATAAPI_EXPORT virtual ~GeomDataAPI_Point2D(); }; +//! Pointer on attribute object +typedef std::shared_ptr AttributePoint2DPtr; + #endif diff --git a/src/Model/Model_Update.cpp b/src/Model/Model_Update.cpp index 17f344c28..e710c5a87 100644 --- a/src/Model/Model_Update.cpp +++ b/src/Model/Model_Update.cpp @@ -23,6 +23,8 @@ #include #include #include +#include +#include #include #include #include @@ -263,11 +265,12 @@ void Model_Update::updateArguments(FeaturePtr theFeature) { if (aState == ModelAPI_StateInvalidArgument) // a chance to be corrected aState = ModelAPI_StateMustBeUpdated; // check the parameters state - std::list aDoubles = - theFeature->data()->attributes(ModelAPI_AttributeDouble::typeId()); + // Double + std::list aDoubles = + theFeature->data()->attributes(ModelAPI_AttributeDouble::typeId()); std::list::iterator aDoubleIter = aDoubles.begin(); for(; aDoubleIter != aDoubles.end(); aDoubleIter++) { - AttributeDoublePtr aDouble = + AttributeDoublePtr aDouble = std::dynamic_pointer_cast(*aDoubleIter); if (aDouble.get() && !aDouble->text().empty()) { if (aDouble->expressionInvalid()) { @@ -275,6 +278,37 @@ void Model_Update::updateArguments(FeaturePtr theFeature) { } } } + // Point + { + std::list anAttributes = + theFeature->data()->attributes(GeomDataAPI_Point::typeId()); + std::list::iterator anIter = anAttributes.begin(); + for(; anIter != anAttributes.end(); anIter++) { + AttributePointPtr aPointAttribute = + std::dynamic_pointer_cast(*anIter); + if (aPointAttribute.get()) { + if ((!aPointAttribute->textX().empty() && aPointAttribute->expressionInvalid(0)) || + (!aPointAttribute->textY().empty() && aPointAttribute->expressionInvalid(1)) || + (!aPointAttribute->textZ().empty() && aPointAttribute->expressionInvalid(2))) + aState = ModelAPI_StateInvalidArgument; + } + } + } + // Point2D + { + std::list anAttributes = + theFeature->data()->attributes(GeomDataAPI_Point2D::typeId()); + std::list::iterator anIter = anAttributes.begin(); + for(; anIter != anAttributes.end(); anIter++) { + AttributePoint2DPtr aPoint2DAttribute = + std::dynamic_pointer_cast(*anIter); + if (aPoint2DAttribute.get()) { + if ((!aPoint2DAttribute->textX().empty() && aPoint2DAttribute->expressionInvalid(0)) || + (!aPoint2DAttribute->textY().empty() && aPoint2DAttribute->expressionInvalid(1))) + aState = ModelAPI_StateInvalidArgument; + } + } + } //if (aState == ModelAPI_StateDone) {// all referenced objects are ready to be used //std::cout<<"Execute feature "<getKind()< #include #include +#include +#include #include #include @@ -39,6 +41,8 @@ void ParametersPlugin_EvalListener::processEvent(const std::shared_ptreventID() == kEvaluationEvent) { std::shared_ptr aMessage = std::dynamic_pointer_cast(theMessage); + + // Double AttributeDoublePtr aDoubleAttribute = std::dynamic_pointer_cast(aMessage->attribute()); if (aDoubleAttribute.get()) { @@ -51,6 +55,54 @@ void ParametersPlugin_EvalListener::processEvent(const std::shared_ptrsetExpressionInvalid(true); } } + + // Point + AttributePointPtr aPointAttribute = + std::dynamic_pointer_cast(aMessage->attribute()); + if (aPointAttribute.get()) { + std::string anError[3]; + double aValue[3] = { + evaluate(aPointAttribute->textX(), anError[0]), + evaluate(aPointAttribute->textY(), anError[1]), + evaluate(aPointAttribute->textZ(), anError[2]) + }; + bool isValid[3] = { + anError[0].empty(), + anError[1].empty(), + anError[2].empty() + }; + aPointAttribute->setExpressionInvalid(0, !isValid[0]); + aPointAttribute->setExpressionInvalid(1, !isValid[1]); + aPointAttribute->setExpressionInvalid(2, !isValid[2]); + + aPointAttribute->setValue( + isValid[0] ? aValue[0] : aPointAttribute->x(), + isValid[1] ? aValue[1] : aPointAttribute->y(), + isValid[2] ? aValue[2] : aPointAttribute->z() + ); + } + + // Point2D + AttributePoint2DPtr aPoint2DAttribute = + std::dynamic_pointer_cast(aMessage->attribute()); + if (aPoint2DAttribute.get()) { + std::string anError[2]; + double aValue[2] = { + evaluate(aPoint2DAttribute->textX(), anError[0]), + evaluate(aPoint2DAttribute->textY(), anError[1]) + }; + bool isValid[2] = { + anError[0].empty(), + anError[1].empty() + }; + aPoint2DAttribute->setExpressionInvalid(0, !isValid[0]); + aPoint2DAttribute->setExpressionInvalid(1, !isValid[1]); + + aPoint2DAttribute->setValue( + isValid[0] ? aValue[0] : aPoint2DAttribute->x(), + isValid[1] ? aValue[1] : aPoint2DAttribute->y() + ); + } } else { Events_Error::send(std::string("ParametersPlugin python interpreter, unhandled message caught: ") + theMessage->eventID().eventText()); -- 2.39.2