Salome HOME
Issue #435: Fix initial positions of base entities of mirror constraint
authorazv <azv@opencascade.com>
Fri, 3 Apr 2015 11:46:48 +0000 (14:46 +0300)
committerazv <azv@opencascade.com>
Fri, 3 Apr 2015 11:59:19 +0000 (14:59 +0300)
src/SketchSolver/SketchSolver_Constraint.cpp
src/SketchSolver/SketchSolver_Group.cpp
src/SketchSolver/SketchSolver_Group.h

index b21b463fb23f629acac0e014122581c6fbee45d5..370bdce0d4e4962f6ac7f2d8635e077c91769383 100644 (file)
@@ -131,8 +131,10 @@ void SketchSolver_Constraint::update(ConstraintPtr theConstraint)
   }
 
   // Value if exists
+  DataPtr aData = myBaseConstraint->data();
+  if (!aData) return;
   AttributeDoublePtr aValueAttr = std::dynamic_pointer_cast<ModelAPI_AttributeDouble>(
-    myBaseConstraint->data()->attribute(SketchPlugin_Constraint::VALUE()));
+    myBaseConstraint->attribute(SketchPlugin_Constraint::VALUE()));
   double aValue = aValueAttr ? aValueAttr->value() : 0.0;
 
   // Update constraint
@@ -295,6 +297,7 @@ Slvs_hEntity SketchSolver_Constraint::changeEntity(AttributePtr theEntity, int&
     if (aResult != SLVS_E_UNKNOWN) {
       Slvs_Entity anEnt = myStorage->getEntity(aResult);
       theType = anEnt.type;
+      myAttributeMap[theEntity] = aResult;
       return aResult;
     }
   }
@@ -388,6 +391,7 @@ Slvs_hEntity SketchSolver_Constraint::changeEntity(FeaturePtr theEntity, int& th
     if (aResult != SLVS_E_UNKNOWN) {
       Slvs_Entity anEnt = myStorage->getEntity(aResult);
       theType = anEnt.type;
+      myFeatureMap[theEntity] = aResult;
       return aResult;
     }
   }
index 620768680fb636fe32d2f4e240432d48da5721a8..2c6d8f5763627c0d5c012814ce687a4d463d6741 100644 (file)
@@ -20,7 +20,6 @@
 #include <GeomDataAPI_Point.h>
 #include <GeomDataAPI_Point2D.h>
 #include <ModelAPI_AttributeDouble.h>
-#include <ModelAPI_AttributeRefList.h>
 #include <ModelAPI_Document.h>
 #include <ModelAPI_Events.h>
 #include <ModelAPI_ResultConstruction.h>
@@ -234,6 +233,12 @@ bool SketchSolver_Group::changeConstraint(
       myTempConstraints.insert(aConstraint);
     }
   }
+  // Fix base features for mirror
+  if (theConstraint->getKind() == SketchPlugin_ConstraintMirror::ID()) {
+    AttributeRefListPtr aRefList = std::dynamic_pointer_cast<ModelAPI_AttributeRefList>(
+        theConstraint->attribute(SketchPlugin_ConstraintMirror::ENTITY_B()));
+    fixFeaturesList(aRefList);
+  }
 
   if (!myFeatureStorage)
     myFeatureStorage = FeatureStoragePtr(new SketchSolver_FeatureStorage);
@@ -270,6 +275,29 @@ void SketchSolver_Group::moveFeature(std::shared_ptr<SketchPlugin_Feature> theFe
   myTempConstraints.insert(aConstraint);
 }
 
+// ============================================================================
+//  Function: fixFeaturesList
+//  Class:    SketchSolver_Group
+//  Purpose:  Apply temporary rigid constraints for the list of features
+// ============================================================================
+void SketchSolver_Group::fixFeaturesList(AttributeRefListPtr theList)
+{
+  std::list<ObjectPtr> aList = theList->list();
+  std::list<ObjectPtr>::iterator anIt = aList.begin();
+  for (; anIt != aList.end(); anIt++) {
+    if (!(*anIt))
+      continue;
+    FeaturePtr aFeature = ModelAPI_Feature::feature(*anIt);
+    SolverConstraintPtr aConstraint =
+        SketchSolver_Builder::getInstance()->createRigidConstraint(aFeature);
+    if (!aConstraint)
+      continue;
+    aConstraint->setGroup(this);
+    aConstraint->setStorage(myStorage);
+    myTempConstraints.insert(aConstraint);
+  }
+}
+
 // ============================================================================
 //  Function: addWorkplane
 //  Class:    SketchSolver_Group
index dceff0581bcc2cf69baa1080e1f6505fed21253e..30d675c636c949733e4c03f39736eef051b32631 100644 (file)
@@ -16,7 +16,7 @@
 #include <SketchPlugin_Constraint.h>
 #include <ModelAPI_Data.h>
 #include <ModelAPI_Feature.h>
-
+#include <ModelAPI_AttributeRefList.h>
 
 #include <memory>
 #include <list>
@@ -148,6 +148,9 @@ private:
    */
   bool addWorkplane(CompositeFeaturePtr theSketch);
 
+  /// \brief Apply temporary rigid constraints for the list of features
+  void fixFeaturesList(AttributeRefListPtr theList);
+
 private:
   Slvs_hGroup myID; ///< Index of the group
   Slvs_hEntity myWorkplaneID; ///< Index of workplane, the group is based on