#include "SketchPlugin_Validators.h"
#include "SketchPlugin_ConstraintDistance.h"
+#include "SketchPlugin_ConstraintCoincidence.h"
+#include "SketchPlugin_Line.h"
+#include "SketchPlugin_Arc.h"
+
#include <ModelAPI_Data.h>
#include <ModelAPI_Validator.h>
#include <ModelAPI_AttributeDouble.h>
}
return false;
}
+bool SketchPlugin_TangentAttrValidator::isValid(
+ const AttributePtr& theAttribute, const std::list<std::string>& theArguments ) const
+{
+ // there is a check whether the feature contains a point and a linear edge or two point values
+ std::string aParamA = theArguments.front();
+ SessionPtr aMgr = ModelAPI_Session::get();
+ ModelAPI_ValidatorsFactory* aFactory = aMgr->validators();
+
+ FeaturePtr aFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(theAttribute->owner());
+ AttributeRefAttrPtr aRefAttr = std::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(theAttribute);
+ if (!aRefAttr)
+ return false;
+
+ bool isObject = aRefAttr->isObject();
+ ObjectPtr anObject = aRefAttr->object();
+ if (isObject && anObject) {
+ FeaturePtr aRefFea = ModelAPI_Feature::feature(anObject);
+
+ AttributeRefAttrPtr aOtherAttr = aFeature->data()->refattr(aParamA);
+ ObjectPtr aOtherObject = aOtherAttr->object();
+ FeaturePtr aOtherFea = ModelAPI_Feature::feature(aOtherObject);
+
+ if (aRefFea->getKind() == SketchPlugin_Line::ID()) {
+ if (aOtherFea->getKind() != SketchPlugin_Arc::ID())
+ return false;
+ } else if (aRefFea->getKind() == SketchPlugin_Arc::ID()) {
+ if (aOtherFea->getKind() != SketchPlugin_Line::ID())
+ return false;
+ } else
+ return false;
+
+ // check that both have coincidence
+ FeaturePtr aConstrFeature;
+ std::set<FeaturePtr> aCoinList;
+ const std::set<std::shared_ptr<ModelAPI_Attribute>>& aRefsList = aRefFea->data()->refsToMe();
+ std::set<std::shared_ptr<ModelAPI_Attribute>>::const_iterator aIt;
+ for (aIt = aRefsList.cbegin(); aIt != aRefsList.cend(); ++aIt) {
+ std::shared_ptr<ModelAPI_Attribute> aAttr = (*aIt);
+ aConstrFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(aAttr->owner());
+ if (aConstrFeature->getKind() == SketchPlugin_ConstraintCoincidence::ID()) {
+ AttributeRefAttrPtr aRAttr = std::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(aAttr);
+ AttributePtr aAR = aRAttr->attr();
+ if (aAR->id() != SketchPlugin_Arc::CENTER_ID()) // ignore constraint to center of arc
+ aCoinList.insert(aConstrFeature);
+ }
+ }
+ // if there is no coincidence then it is not valid
+ if (aCoinList.size() == 0)
+ return false;
+
+ // find that coincedence is the same
+ const std::set<std::shared_ptr<ModelAPI_Attribute>>& aOtherList = aOtherFea->data()->refsToMe();
+ std::set<FeaturePtr>::const_iterator aCoinsIt;
+ for (aIt = aOtherList.cbegin(); aIt != aOtherList.cend(); ++aIt) {
+ std::shared_ptr<ModelAPI_Attribute> aAttr = (*aIt);
+ aConstrFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(aAttr->owner());
+ aCoinsIt = aCoinList.find(aConstrFeature);
+ if (aCoinsIt != aCoinList.end()) {
+ AttributeRefAttrPtr aRAttr = std::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(aAttr);
+ AttributePtr aAR = aRAttr->attr();
+ if (aAR->id() != SketchPlugin_Arc::CENTER_ID())
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
+
virtual bool isValid(const AttributePtr& theAttribute,
const std::list<std::string>& theArguments) const;
};
-// virtual bool isValid(const AttributePtr& theAttribute,
-// const std::list<std::string>& theArguments) const;
-//
-// //! Returns true if object is good for the feature attribute
-// virtual bool isValid(const FeaturePtr& theFeature, const std::list<std::string>& theArguments,
-// const ObjectPtr& theObject, const GeomShapePtr& theShape) const;
-//
-// //! Returns true if the attribute is good for the feature attribute
-// virtual bool isValid(const FeaturePtr& theFeature, const std::list<std::string>& theArguments,
-// const AttributePtr& theAttribute) const;
-//};
-// commented in v1.0.2, master:
-/**\class SketchPlugin_DifferentObjectsValidator
+
+/**\class SketchPlugin_TangentAttrValidator
* \ingroup Validators
+ * \brief Validator for the tangent constraint input.
*
- * Check that there is no same object was already selected in the feature.
- * For an example: to avoid perpendicularity on line and the same line.
+ * It just checks that distance is greater than zero.
*/
-// Use PartSet_DifferentObjectsValidator instead
-//class SketchPlugin_DifferentObjectsValidator : public ModelAPI_RefAttrValidator
-//{
-// public:
-// //! returns true if attribute is valid
-// //! \param theAttribute the checked attribute
-// //! \param theArguments arguments of the attribute
-// virtual bool isValid(
-// const AttributePtr& theAttribute, const std::list<std::string>& theArguments) const;
-// //! Returns true if object is good for the feature attribute
-// virtual bool isValid(const FeaturePtr& theFeature, const std::list<std::string>& theArguments,
-// const ObjectPtr& theObject) const;
-// //! Returns true if the attribute is good for the feature attribute
-// virtual bool isValid(const FeaturePtr& theFeature, const std::list<std::string>& theArguments,
-// const AttributePtr& theAttribute) const;
-//};
-// ======= end of todo
+class SketchPlugin_TangentAttrValidator : public ModelAPI_AttributeValidator
+{
+ public:
+ //! returns true if attribute is valid
+ //! \param theAttribute the checked attribute
+ //! \param theArguments arguments of the attribute
+ virtual bool isValid(const AttributePtr& theAttribute,
+ const std::list<std::string>& theArguments) const;
+};
+
#endif