+
+bool SketchPlugin_SketchFeatureValidator::isValid(const AttributePtr& theAttribute,
+ const std::list<std::string>& theArguments,
+ Events_InfoMessage& theError) const
+{
+ if (theAttribute->attributeType() != ModelAPI_AttributeRefAttr::typeId()) {
+ theError = "The attribute with the %1 type is not processed";
+ theError.arg(theAttribute->attributeType());
+ return false;
+ }
+
+ // check the attribute refers to a sketch feature
+ AttributeRefAttrPtr aRefAttr =
+ std::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(theAttribute);
+ bool isSketchFeature = aRefAttr->isObject();
+ if (isSketchFeature) {
+ FeaturePtr aFeature = ModelAPI_Feature::feature(aRefAttr->object());
+ isSketchFeature = aFeature.get() != NULL;
+ if (isSketchFeature) {
+ std::shared_ptr<SketchPlugin_Feature> aSketchFeature =
+ std::dynamic_pointer_cast<SketchPlugin_Feature>(aFeature);
+ isSketchFeature = aSketchFeature.get() != NULL;
+ }
+ }
+
+ if (isSketchFeature)
+ return true;
+
+ theError = "The object selected is not a sketch feature";
+ return false;
+}
+
+bool SketchPlugin_MultiRotationAngleValidator::isValid(const AttributePtr& theAttribute,
+ const std::list<std::string>& theArguments,
+ Events_InfoMessage& theError) const
+{
+ if (theAttribute->attributeType() != ModelAPI_AttributeDouble::typeId()) {
+ theError = "The attribute with the %1 type is not processed";
+ theError.arg(theAttribute->attributeType());
+ return false;
+ }
+
+ AttributeDoublePtr anAngleAttr =
+ std::dynamic_pointer_cast<ModelAPI_AttributeDouble>(theAttribute);
+
+ FeaturePtr aMultiRotation = ModelAPI_Feature::feature(theAttribute->owner());
+ AttributeStringPtr anAngleType =
+ aMultiRotation->string(SketchPlugin_MultiRotation::ANGLE_TYPE());
+ AttributeIntegerPtr aNbCopies =
+ aMultiRotation->integer(SketchPlugin_MultiRotation::NUMBER_OF_OBJECTS_ID());
+
+ if (anAngleType->value() != "FullAngle")
+ {
+ double aFullAngleValue = anAngleAttr->value() * (aNbCopies->value() - 1);
+ if (aFullAngleValue < -1.e-7 || aFullAngleValue > 359.9999999)
+ {
+ theError = "Rotation single angle should produce full angle less than 360 degree";
+ return false;
+ }
+ }
+ else
+ {
+ double aFullAngleValue = anAngleAttr->value();
+ if (aFullAngleValue < -1.e-7 || aFullAngleValue > 360.0000001)
+ {
+ theError = "Rotation full angle should be in range [0, 360]";
+ return false;
+ }
+ }
+
+ return true;
+}