Salome HOME
Merge branch 'Dev_1.1.0' of newgeom:newgeom into Dev_1.1.0
authornds <natalia.donis@opencascade.com>
Fri, 27 Mar 2015 07:42:07 +0000 (10:42 +0300)
committernds <natalia.donis@opencascade.com>
Fri, 27 Mar 2015 07:42:07 +0000 (10:42 +0300)
Conflicts:
src/SketchPlugin/SketchPlugin_Validators.cpp

1  2 
src/SketchPlugin/SketchPlugin_Validators.cpp

index 32a0b30b57cc3028c1311c8b1c5935d5c46841c8,a613620761710efe89c4f014b9fc02deff3c3bac..befd4cb150b94ab6e378c2abc979beb568d33e2a
@@@ -60,3 -64,76 +64,72 @@@ bool SketchPlugin_DistanceAttrValidator
    }
    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;
+ }
 -