Salome HOME
Roll back the modification, not yet approved
[modules/shaper.git] / src / Model / Model_AttributeSelection.cpp
index b900b181941109b69a79b1878debe87ebb12eff0..a46a49662fd19f0cd6188362d16c69d83dcb42ef 100644 (file)
@@ -15,6 +15,7 @@
 #include <ModelAPI_ResultConstruction.h>
 #include <ModelAPI_ResultPart.h>
 #include <ModelAPI_CompositeFeature.h>
+#include <ModelAPI_Tools.h>
 #include <GeomAPI_Shape.h>
 #include <GeomAPI_PlanarEdges.h>
 #include <Events_Error.h>
@@ -54,6 +55,7 @@
 #include <TopAbs_ShapeEnum.hxx>
 #include <TopoDS_Iterator.hxx>
 #include <TNaming_Iterator.hxx>
+#include <BRep_Builder.hxx>
 using namespace std;
 //#define DEB_NAMING 1
 #ifdef DEB_NAMING
@@ -122,7 +124,6 @@ void Model_AttributeSelection::setValue(const ResultPtr& theContext,
   if (theContext->groupName() == ModelAPI_ResultBody::group()) {
     // do not select the whole shape for body:it is already must be in the data framework
     // equal and null selected objects mean the same: object is equal to context,
-    // TODO: synchronize with GUI later that it must be null always
     if (theContext->shape().get() && 
         (theContext->shape()->isEqual(theSubShape) || !theSubShape.get())) {
       aSelLab.ForgetAllAttributes(true);
@@ -135,15 +136,30 @@ void Model_AttributeSelection::setValue(const ResultPtr& theContext,
       // to sub, so the whole result is selected
       aSelLab.ForgetAllAttributes(true);
       TDataStd_UAttribute::Set(aSelLab, kCONSTUCTION_SIMPLE_REF_ID);
-      // For correct naming selection, put the shape into the naming structure.
-      // It seems sub-shapes are not needed: only this shape is (and can be ) selected.
-      TNaming_Builder aBuilder(aSelLab);
-      aBuilder.Generated(theContext->shape()->impl<TopoDS_Shape>());
-      std::shared_ptr<Model_Document> aMyDoc = 
-        std::dynamic_pointer_cast<Model_Document>(owner()->document());
-      std::string aName = theContext->data()->name();
-      aMyDoc->addNamingName(aSelLab, aName);
-      TDataStd_Name::Set(aSelLab, aName.c_str());
+      ResultConstructionPtr aConstruction = 
+        std::dynamic_pointer_cast<ModelAPI_ResultConstruction>(theContext);
+      if (aConstruction->isInfinite()) {
+        // For correct naming selection, put the shape into the naming structure.
+        // It seems sub-shapes are not needed: only this shape is (and can be ) selected.
+        TNaming_Builder aBuilder(aSelLab);
+        aBuilder.Generated(theContext->shape()->impl<TopoDS_Shape>());
+        std::shared_ptr<Model_Document> aMyDoc = 
+          std::dynamic_pointer_cast<Model_Document>(owner()->document());
+        std::string aName = theContext->data()->name();
+        aMyDoc->addNamingName(aSelLab, aName);
+        TDataStd_Name::Set(aSelLab, aName.c_str());
+      } else {  // for sketch the naming is needed in DS
+        BRep_Builder aCompoundBuilder;
+        TopoDS_Compound aComp;
+        aCompoundBuilder.MakeCompound(aComp);
+        for(int a = 0; a < aConstruction->facesNum(); a++) {
+          TopoDS_Shape aFace = aConstruction->face(a)->impl<TopoDS_Shape>();
+          aCompoundBuilder.Add(aComp, aFace);
+        }
+        std::shared_ptr<GeomAPI_Shape> aShape(new GeomAPI_Shape);
+        aShape->setImpl<TopoDS_Shape>(new TopoDS_Shape(aComp));
+        selectConstruction(theContext, aShape);
+      }
     } else {
       selectConstruction(theContext, theSubShape);
     }
@@ -300,9 +316,32 @@ TDF_LabelMap& Model_AttributeSelection::scope()
     DocumentPtr aMyDoc = owner()->document();
     std::list<std::shared_ptr<ModelAPI_Feature> > allFeatures = aMyDoc->allFeatures();
     std::list<std::shared_ptr<ModelAPI_Feature> >::iterator aFIter = allFeatures.begin();
+    bool aMePassed = false;
+    CompositeFeaturePtr aComposite = 
+      std::dynamic_pointer_cast<ModelAPI_CompositeFeature>(owner());
+    FeaturePtr aFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(owner());
+    CompositeFeaturePtr aCompositeOwner, aCompositeOwnerOwner;
+    if (aFeature.get()) {
+      aCompositeOwner = ModelAPI_Tools::compositeOwner(aFeature);
+      if (aCompositeOwner.get()) {
+         aCompositeOwnerOwner = ModelAPI_Tools::compositeOwner(aCompositeOwner);
+      }
+    }
     for(; aFIter != allFeatures.end(); aFIter++) {
-      if (*aFIter == owner()) break; // the left features are created later
-      if (aFIter->get() && (*aFIter)->data()->isValid()) {
+      if (*aFIter == owner()) {  // the left features are created later (except subs of composite)
+        aMePassed = true;
+        continue;
+      }
+      bool isInScope = !aMePassed;
+      if (!isInScope && aComposite.get()) { // try to add sub-elements of composite if this is composite
+        if (aComposite->isSub(*aFIter))
+          isInScope = true;
+      }
+      // remove the composite-owner of this feature (sketch in extrusion-cut)
+      if (isInScope && (aCompositeOwner == *aFIter || aCompositeOwnerOwner == *aFIter))
+        isInScope = false;
+
+      if (isInScope && aFIter->get() && (*aFIter)->data()->isValid()) {
         TDF_Label aFeatureLab = std::dynamic_pointer_cast<Model_Data>(
           (*aFIter)->data())->label().Father();
         TDF_ChildIDIterator aNSIter(aFeatureLab, TNaming_NamedShape::GetID(), 1);
@@ -352,6 +391,21 @@ bool Model_AttributeSelection::update()
     return setInvalidIfFalse(aSelLab, aContext->shape() && !aContext->shape()->isNull());
   }
   if (aSelLab.IsAttribute(kCONSTUCTION_SIMPLE_REF_ID)) { // it is just reference to construction, not sub-shape
+    // if there is a sketch, the sketch-naming must be updated
+    ResultConstructionPtr aConstruction = 
+      std::dynamic_pointer_cast<ModelAPI_ResultConstruction>(aContext);
+    if (!aConstruction->isInfinite()) {
+      BRep_Builder aCompoundBuilder;
+      TopoDS_Compound aComp;
+      aCompoundBuilder.MakeCompound(aComp);
+      for(int a = 0; a < aConstruction->facesNum(); a++) {
+        TopoDS_Shape aFace = aConstruction->face(a)->impl<TopoDS_Shape>();
+        aCompoundBuilder.Add(aComp, aFace);
+      }
+      std::shared_ptr<GeomAPI_Shape> aShape(new GeomAPI_Shape);
+      aShape->setImpl<TopoDS_Shape>(new TopoDS_Shape(aComp));
+      selectConstruction(aContext, aShape);
+    }
     return setInvalidIfFalse(aSelLab, aContext->shape() && !aContext->shape()->isNull());
   }
 
@@ -718,7 +772,7 @@ void Model_AttributeSelection::selectConstruction(
             if (allCurves.Contains(aCurve)) {
               int anID = aComposite->subFeatureId(a);
               aRefs->Add(anID);
-              if (aShapeType != TopAbs_EDGE) { // face nneds the sub-edges on sub-labels
+              if (aShapeType != TopAbs_EDGE) { // face needs the sub-edges on sub-labels
                 // add edges to sub-label to support naming for edges selection
                 TopExp_Explorer anEdgeExp(aSubShape, TopAbs_EDGE);
                 for(; anEdgeExp.More(); anEdgeExp.Next()) {