]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Merge branch 'master' into cgt/devCEA
authorClarisse Genrault <clarisse.genrault@cea.fr>
Fri, 13 Jan 2017 13:51:40 +0000 (14:51 +0100)
committerClarisse Genrault <clarisse.genrault@cea.fr>
Fri, 13 Jan 2017 13:51:40 +0000 (14:51 +0100)
src/Model/Model_BodyBuilder.cpp
src/Model/Model_Document.cpp
src/Model/Model_Objects.cpp
src/Model/Model_Objects.h
src/Model/Model_Session.cpp
src/PartSet/PartSet_Validators.cpp
src/PartSet/PartSet_WidgetSketchLabel.cpp
src/PartSet/PartSet_WidgetSketchLabel.h
src/XGUI/XGUI_ActionsMgr.cpp
src/XGUI/XGUI_Selection.cpp

index 2136750ba1dd6d235c3b928bad970039fcdd434f..38d349bd7386b89dd822b2ab45ff9d03d22b4c22 100755 (executable)
@@ -206,43 +206,7 @@ void Model_BodyBuilder::storeModified(const std::shared_ptr<GeomAPI_Shape>& theO
     if (aShapeNew.IsNull())
       return;  // null shape inside
     aBuilder.Modify(aShapeOld, aShapeNew);
-    if (theDecomposeSolidsTag && aShapeNew.ShapeType() == TopAbs_COMPOUND) {
-      // make sub elements as subs
-
-      // register name if it is possible
-      TCollection_AsciiString aName;
-      if(!aBuilder.NamedShape()->IsEmpty()) {
-        Handle(TDataStd_Name) anAttr;
-        if(aBuilder.NamedShape()->Label().FindAttribute(TDataStd_Name::GetID(),anAttr)) {
-          aName = TCollection_AsciiString(anAttr->Get()).ToCString();
-        }
-      }
-
-      TopoDS_Iterator aSubIter(aShapeNew);
-      for(int aTag = theDecomposeSolidsTag; aSubIter.More(); aSubIter.Next()) {
-        const TopoDS_Shape& aShape = aSubIter.Value();
-        Handle(TNaming_NamedShape) aNS = TNaming_Tool::NamedShape(aShape, aShapeLab);
-        if(!aNS.IsNull() && !aNS->IsEmpty()) {
-          // This shape is already in document, don't add it.
-          continue;
-        }
-        TNaming_Builder aSubBuilder(aShapeLab.FindChild(aTag++));
-        aSubBuilder.Generated(aSubIter.Value());
-        if(!aName.IsEmpty()) {
-          TCollection_AsciiString aShapeType = aShape.ShapeType() == TopAbs_EDGE ? "_Edge_" :
-                                               aShape.ShapeType() == TopAbs_FACE ? "_Face_" :
-                                               aShape.ShapeType() == TopAbs_SOLID ? "_Solid_" :
-                                               "_Shape_";
-          std::string aSolidName =
-            (aName + aShapeType + TCollection_AsciiString(aTag - theDecomposeSolidsTag))
-            .ToCString();
-          std::shared_ptr<Model_Document> aDoc =
-            std::dynamic_pointer_cast<Model_Document>(document());
-          aDoc->addNamingName(aSubBuilder.NamedShape()->Label(), aSolidName);
-          TDataStd_Name::Set(aSubBuilder.NamedShape()->Label(), aSolidName.c_str());
-        }
-      }
-    } else if(!aBuilder.NamedShape()->IsEmpty()) {
+    if(!aBuilder.NamedShape()->IsEmpty()) {
       Handle(TDataStd_Name) anAttr;
       if(aBuilder.NamedShape()->Label().FindAttribute(TDataStd_Name::GetID(),anAttr)) {
         std::string aName (TCollection_AsciiString(anAttr->Get()).ToCString());
index 2afecb39cd95f5bf52190e1406dbd35a83f3c6ce..d54b83130c5e2af0431b3f204618b608ad11436f 100755 (executable)
@@ -726,7 +726,7 @@ void Model_Document::abortOperation()
   for (; aSubIter != aSubs.end(); aSubIter++)
     subDoc(*aSubIter)->abortOperation();
   // references may be changed because they are set in attributes on the fly
-  myObjs->synchronizeFeatures(aDeltaLabels, true, false, isRoot());
+  myObjs->synchronizeFeatures(aDeltaLabels, true, false, false, isRoot());
 }
 
 bool Model_Document::isOperation() const
@@ -793,7 +793,7 @@ void Model_Document::undoInternal(const bool theWithSubs, const bool theSynchron
   }
   // after undo of all sub-documents to avoid updates on not-modified data (issue 370)
   if (theSynchronize) {
-    myObjs->synchronizeFeatures(aDeltaLabels, true, false, isRoot());
+    myObjs->synchronizeFeatures(aDeltaLabels, true, false, false, isRoot());
     // update the current features status
     setCurrentFeature(currentFeature(false), false);
   }
@@ -840,7 +840,7 @@ void Model_Document::redo()
     subDoc(*aSubIter)->redo();
 
   // after redo of all sub-documents to avoid updates on not-modified data (issue 370)
-  myObjs->synchronizeFeatures(aDeltaLabels, true, false, isRoot());
+  myObjs->synchronizeFeatures(aDeltaLabels, true, false, false, isRoot());
   // update the current features status
   setCurrentFeature(currentFeature(false), false);
 }
index 164b088207d493e5e0fbef70db6dc2017b05da16..f0ebc884c6dae7d99123843e29196f0f92374249 100644 (file)
@@ -55,7 +55,7 @@ void Model_Objects::setOwner(DocumentPtr theDoc)
   myDoc = theDoc;
   // update all fields and recreate features and result objects if needed
   TDF_LabelList aNoUpdated;
-  synchronizeFeatures(aNoUpdated, true, true, true);
+  synchronizeFeatures(aNoUpdated, true, true, true, true);
   myHistory.clear();
 }
 
@@ -612,7 +612,7 @@ std::shared_ptr<ModelAPI_Feature> Model_Objects::featureById(const int theId)
 
 void Model_Objects::synchronizeFeatures(
   const TDF_LabelList& theUpdated, const bool theUpdateReferences,
-  const bool theOpen, const bool theFlush)
+  const bool theExecuteFeatures, const bool theOpen, const bool theFlush)
 {
   Model_Document* anOwner = std::dynamic_pointer_cast<Model_Document>(myDoc).get();
   if (!anOwner) // this may happen on creation of document: nothing there, so nothing to synchronize
@@ -750,7 +750,7 @@ void Model_Objects::synchronizeFeatures(
     myHistory.clear();
   }
 
-  if (theOpen)
+  if (theExecuteFeatures)
     anOwner->executeFeatures() = false;
   aLoop->activateFlushes(isActive);
 
@@ -764,7 +764,7 @@ void Model_Objects::synchronizeFeatures(
     aLoop->flush(aRedispEvent);
     aLoop->flush(aToHideEvent);
   }
-  if (theOpen)
+  if (theExecuteFeatures)
     anOwner->executeFeatures() = true;
 }
 
index af366689b81557d544219a97d764fc0d39750002..9b7b6bda3026b45366e8c8d393826d30ccc26720 100644 (file)
@@ -148,10 +148,12 @@ class Model_Objects
   //! Synchronizes myFeatures list with the updated document
   //! \param theUpdated list of labels that are marked as modified, so featrues must be also
   //! \param theUpdateReferences causes the update of back-references
+  //! \param theExecuteFeatures requires re-execute modified persistent features
+  //!            (not needed on undo/redo/abort/open)
   //! \param theOpen - on open nothing must be reexecuted, except not persistent results
   //! \param theFlush makes flush all events in the end of all modifications of this method
   void synchronizeFeatures(const TDF_LabelList& theUpdated, const bool theUpdateReferences,
-    const bool theOpen, const bool theFlush);
+    const bool theOpen, const bool theExecuteFeatures, const bool theFlush);
   //! Synchronizes the BackReferences list in Data of Features and Results
   void synchronizeBackRefs();
 
index 9d13485f3d8a1fed152f50aef9875fab175c676a..7081ebd418b4cdbfb0dee22917dec9040c1f5d4d 100644 (file)
@@ -266,7 +266,7 @@ void Model_Session::setActiveDocument(
         bool aWasChecked = myCheckTransactions;
         setCheckTransactions(false);
         TDF_LabelList anEmptyUpdated;
-        aDoc->objects()->synchronizeFeatures(anEmptyUpdated, true, true, true);
+        aDoc->objects()->synchronizeFeatures(anEmptyUpdated, true, true, false, true);
         if (aWasChecked)
             setCheckTransactions(true);
       }
@@ -329,7 +329,7 @@ std::shared_ptr<ModelAPI_Document> Model_Session::copy(
   TDF_CopyTool::Copy(aDS, aRT);
 
   TDF_LabelList anEmptyUpdated;
-  aNew->objects()->synchronizeFeatures(anEmptyUpdated, true, true, true);
+  aNew->objects()->synchronizeFeatures(anEmptyUpdated, true, true, true, true);
   return aNew;
 }
 
index b45f59e439a84773d00ac47018a27ea490e28b5f..e415933371b447a04b8bd58e0ba4fb38cd5b57fd 100755 (executable)
@@ -196,7 +196,19 @@ bool PartSet_RigidSelection::isValid(const ModuleBase_ISelection* theSelection,
   } else {
     QList<ModuleBase_ViewerPrsPtr> aList =
       theSelection->getSelected(ModuleBase_ISelection::Viewer);
-    return (aList.count() == 1);
+    int aCount = 0;
+    foreach (ModuleBase_ViewerPrsPtr aPrs, aList) {
+      ObjectPtr aObj = aPrs->object();
+      if (aObj.get()) {
+        FeaturePtr aFeature = ModelAPI_Feature::feature(aObj);
+        if (aFeature.get()) {
+          CompositeFeaturePtr aComp = ModelAPI_Tools::compositeOwner(aFeature);
+          if (aComp.get() && (aComp->getKind() == SketchPlugin_Sketch::ID()))
+            aCount++;
+        }
+      }
+    }
+    return (aCount == 1);
   }
 }
 
index e87806f74e8e236579e55c4ae75a7aafc7561495..a45de9121931cd880672d529b3d5531343add30a 100644 (file)
@@ -259,7 +259,6 @@ void PartSet_WidgetSketchLabel::updateByPlaneSelected(const ModuleBase_ViewerPrs
   // 2. if the planes were displayed, change the view projection
   const GeomShapePtr& aShape = thePrs->shape();
   std::shared_ptr<GeomAPI_Shape> aGShape;
-  std::shared_ptr<GeomAPI_Shape> aBaseShape;
 
   DataPtr aData = feature()->data();
   AttributeSelectionPtr aSelAttr = std::dynamic_pointer_cast<ModelAPI_AttributeSelection>
@@ -268,20 +267,33 @@ void PartSet_WidgetSketchLabel::updateByPlaneSelected(const ModuleBase_ViewerPrs
   // selection happens in OCC viewer
   if (aShape.get() && !aShape->isNull()) {
     aGShape = aShape;
-
-    if (aSelAttr && aSelAttr->context()) {
-      aBaseShape = aSelAttr->context()->shape();
-    }
   }
   else { // selection happens in OCC viewer(on body) of in the OB browser
     if (aSelAttr) {
       aGShape = aSelAttr->value();
     }
   }
+  // If the selected object is a sketch then use its plane
+  std::shared_ptr<GeomAPI_Pln> aPlane;
+  ObjectPtr aObj = thePrs->object();
+  if (aObj.get()) {
+    FeaturePtr aFeature = ModelAPI_Feature::feature(aObj);
+    if (aFeature.get() && (aFeature != feature())) {
+      if (aFeature->getKind() == SketchPlugin_Sketch::ID()) {
+        CompositeFeaturePtr aSketch =
+          std::dynamic_pointer_cast<ModelAPI_CompositeFeature>(aFeature);
+        aPlane = PartSet_Tools::sketchPlane(aSketch);
+      }
+    }
+  }
   if (aGShape.get() != NULL) {
     // get plane parameters
-    std::shared_ptr<GeomAPI_Face> aFace(new GeomAPI_Face(aGShape));
-    std::shared_ptr<GeomAPI_Pln> aPlane = aFace->getPlane();
+    if (!aPlane.get()) {
+      std::shared_ptr<GeomAPI_Face> aFace(new GeomAPI_Face(aGShape));
+      aPlane = aFace->getPlane();
+    }
+    if (!aPlane.get())
+      return;
     std::shared_ptr<GeomAPI_Dir> aDir = aPlane->direction();
     gp_XYZ aXYZ = aDir->impl<gp_Dir>().XYZ();
     double aTwist = 0.0;
@@ -378,7 +390,7 @@ void PartSet_WidgetSketchLabel::restoreAttributeValue(const AttributePtr& theAtt
 
 bool PartSet_WidgetSketchLabel::setSelectionCustom(const ModuleBase_ViewerPrsPtr& thePrs)
 {
-  return fillSketchPlaneBySelection(feature(), thePrs);
+  return fillSketchPlaneBySelection(thePrs);
 }
 
 bool PartSet_WidgetSketchLabel::canFillSketch(const ModuleBase_ViewerPrsPtr& thePrs)
@@ -411,16 +423,27 @@ bool PartSet_WidgetSketchLabel::canFillSketch(const ModuleBase_ViewerPrsPtr& the
   return aCanFillSketch;
 }
 
-bool PartSet_WidgetSketchLabel::fillSketchPlaneBySelection(const FeaturePtr& theFeature,
-                                                           const ModuleBase_ViewerPrsPtr& thePrs)
+bool PartSet_WidgetSketchLabel::fillSketchPlaneBySelection(const ModuleBase_ViewerPrsPtr& thePrs)
 {
   bool isOwnerSet = false;
 
   const GeomShapePtr& aShape = thePrs->shape();
   std::shared_ptr<GeomAPI_Dir> aDir;
 
-  if (thePrs->object() && (theFeature != thePrs->object())) {
-    DataPtr aData = theFeature->data();
+  if (thePrs->object() && (feature() != thePrs->object())) {
+    FeaturePtr aFeature = ModelAPI_Feature::feature(thePrs->object());
+    if (aFeature.get() && (aFeature != feature())) {
+      if (aFeature->getKind() == SketchPlugin_Sketch::ID()) {
+        CompositeFeaturePtr aSketch =
+          std::dynamic_pointer_cast<ModelAPI_CompositeFeature>(aFeature);
+        std::shared_ptr<GeomAPI_Pln> aPlane = PartSet_Tools::sketchPlane(aSketch);
+        if (aPlane.get()) {
+          aDir = setSketchPlane(aPlane);
+          return aDir.get();
+        }
+      }
+    }
+    DataPtr aData = feature()->data();
     AttributeSelectionPtr aSelAttr =
       std::dynamic_pointer_cast<ModelAPI_AttributeSelection>
       (aData->attribute(SketchPlugin_SketchEntity::EXTERNAL_ID()));
@@ -443,7 +466,7 @@ bool PartSet_WidgetSketchLabel::fillSketchPlaneBySelection(const FeaturePtr& the
   }
   else if (aShape.get() && !aShape->isNull()) {
     const TopoDS_Shape& aTDShape = aShape->impl<TopoDS_Shape>();
-    aDir = setSketchPlane(theFeature, aTDShape);
+    aDir = setSketchPlane(aTDShape);
     isOwnerSet = aDir.get();
   }
   return isOwnerSet;
@@ -476,9 +499,6 @@ void PartSet_WidgetSketchLabel::activateCustom()
 
   activateSelection(true);
 
-  //myLabel->setText(myText);
-  //myLabel->setToolTip(myTooltip);
-
   connect(XGUI_Tools::workshop(myWorkshop)->selector(), SIGNAL(selectionChanged()),
           this, SLOT(onSelectionChanged()));
   activateFilters(true);
@@ -514,8 +534,8 @@ void PartSet_WidgetSketchLabel::activateSelection(bool toActivate)
 }
 
 
-std::shared_ptr<GeomAPI_Dir> PartSet_WidgetSketchLabel::setSketchPlane(const FeaturePtr& theFeature,
-                                                                       const TopoDS_Shape& theShape)
+std::shared_ptr<GeomAPI_Dir>
+  PartSet_WidgetSketchLabel::setSketchPlane(const TopoDS_Shape& theShape)
 {
   if (theShape.IsNull())
     return std::shared_ptr<GeomAPI_Dir>();
@@ -524,18 +544,21 @@ std::shared_ptr<GeomAPI_Dir> PartSet_WidgetSketchLabel::setSketchPlane(const Fea
   std::shared_ptr<GeomAPI_Shape> aGShape(new GeomAPI_Shape);
   aGShape->setImpl(new TopoDS_Shape(theShape));
 
-
-
   // get plane parameters
   std::shared_ptr<GeomAPI_Face> aFace(new GeomAPI_Face(aGShape));
   std::shared_ptr<GeomAPI_Pln> aPlane = aFace->getPlane();
   if (!aPlane.get())
     return std::shared_ptr<GeomAPI_Dir>();
+  return setSketchPlane(aPlane);
+}
 
+std::shared_ptr<GeomAPI_Dir>
+  PartSet_WidgetSketchLabel::setSketchPlane(std::shared_ptr<GeomAPI_Pln> thePlane)
+{
   // set plane parameters to feature
-  std::shared_ptr<ModelAPI_Data> aData = theFeature->data();
+  std::shared_ptr<ModelAPI_Data> aData = feature()->data();
   double anA, aB, aC, aD;
-  aPlane->coefficients(anA, aB, aC, aD);
+  thePlane->coefficients(anA, aB, aC, aD);
 
   // calculate attributes of the sketch
   std::shared_ptr<GeomAPI_Dir> aNormDir(new GeomAPI_Dir(anA, aB, aC));
@@ -560,7 +583,7 @@ std::shared_ptr<GeomAPI_Dir> PartSet_WidgetSketchLabel::setSketchPlane(const Fea
   std::shared_ptr<GeomDataAPI_Dir> aDirX = std::dynamic_pointer_cast<GeomDataAPI_Dir>(
       aData->attribute(SketchPlugin_Sketch::DIRX_ID()));
   aDirX->setValue(aXDir);
-  std::shared_ptr<GeomAPI_Dir> aDir = aPlane->direction();
+  std::shared_ptr<GeomAPI_Dir> aDir = thePlane->direction();
   return aDir;
 }
 
index b4606e57af194d664e0b7a5d4baf850695388e07..a89a6167d39d90f22e0567c633e9e97f1c7e8451 100644 (file)
@@ -78,12 +78,6 @@ public:
   /// \param thePrs a presentation
   static bool canFillSketch(const std::shared_ptr<ModuleBase_ViewerPrs>& thePrs);
 
-  /// Set sketch plane from selected object
-  /// \param theFeature a feature of sketch
-  /// \param thePrs a presentation
-  static bool fillSketchPlaneBySelection(const FeaturePtr& theFeature,
-                                         const std::shared_ptr<ModuleBase_ViewerPrs>& thePrs);
-
 signals:
   /// Signal on plane selection
   void planeSelected(const std::shared_ptr<GeomAPI_Pln>& thePln);
@@ -153,6 +147,11 @@ protected:
   /// \param thePrs a selected presentation
   void updateByPlaneSelected(const std::shared_ptr<ModuleBase_ViewerPrs>& thePrs);
 
+  /// Set sketch plane from selected object
+  /// \param theFeature a feature of sketch
+  /// \param thePrs a presentation
+  bool fillSketchPlaneBySelection(const std::shared_ptr<ModuleBase_ViewerPrs>& thePrs);
+
  protected:
   /// Activate or deactivate selection
   void activateSelection(bool toActivate);
@@ -171,9 +170,11 @@ protected:
  private:
   /// Set sketch plane by shape
   /// \param theShape a planar face
-  static std::shared_ptr<GeomAPI_Dir> setSketchPlane(const FeaturePtr& theFeature,
-                                                     const TopoDS_Shape& theShape);
+  std::shared_ptr<GeomAPI_Dir> setSketchPlane(const TopoDS_Shape& theShape);
 
+  /// Set sketch plane
+  /// \param thePlane a plane
+  std::shared_ptr<GeomAPI_Dir> setSketchPlane(std::shared_ptr<GeomAPI_Pln> thePlane);
 
 private:
   /// class to show/hide preview planes
index 26e33d3e2cc51f542871b3880c4f26c80aafcf1a..b86390dda0be144e41f554fb743d31eb8d3a36ed 100644 (file)
@@ -101,7 +101,8 @@ void XGUI_ActionsMgr::updateCommandsStatus()
 {
   setAllEnabled();
   XGUI_Selection* aSelection = myWorkshop->selector()->selection();
-  if (aSelection->getSelected(ModuleBase_ISelection::Viewer).size() > 0)
+  //if (aSelection->getSelected(ModuleBase_ISelection::Viewer).size() > 0)
+  if (aSelection->getSelected().size() > 0)
     updateOnViewSelection();
 
   FeaturePtr anActiveFeature = FeaturePtr();
index 56019f8aac06b357162b8a007bef65c445402dbc..36849ab9eb47bbb99184d0d0edfc513b1bf78fae 100644 (file)
@@ -273,7 +273,9 @@ QList<ModuleBase_ViewerPrsPtr> XGUI_Selection::getHighlighted() const
 
 QObjectPtrList XGUI_Selection::selectedObjects() const
 {
-  return myWorkshop->objectBrowser()->selectedObjects();
+  if (myWorkshop->objectBrowser())
+    return myWorkshop->objectBrowser()->selectedObjects();
+  return QObjectPtrList();
 }
 
 void XGUI_Selection::setSelectedObjects( const QObjectPtrList& theObjects ) const