]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Fix on selection initialization (for revolution axis) and hiding sketch only on apply
authormpv <mpv@opencascade.com>
Fri, 22 May 2015 13:35:04 +0000 (16:35 +0300)
committermpv <mpv@opencascade.com>
Fri, 22 May 2015 13:35:04 +0000 (16:35 +0300)
src/Model/Model_AttributeRefAttr.h
src/Model/Model_AttributeSelection.cpp
src/Model/Model_AttributeSelection.h
src/Model/Model_Update.cpp
src/Model/Model_Update.h

index 66c0870e696a2fc035b2b0b736bd03d496df77c9..49337e695a9e7ebae3b79a944271b6a3d2b72f52 100644 (file)
@@ -43,7 +43,6 @@ class Model_AttributeRefAttr : public ModelAPI_AttributeRefAttr
   /// Returns true if attribute was  initialized by some value
   MODEL_EXPORT virtual bool isInitialized();
 
-
  protected:
   /// Objects are created for features automatically
   MODEL_EXPORT Model_AttributeRefAttr(TDF_Label& theLabel);
index 6ff60d02e363dde45d66a62466e116f72c006518..6061cc03867a390eddd51ef6f0d11ad8479c7fb1 100644 (file)
@@ -166,6 +166,36 @@ std::shared_ptr<GeomAPI_Shape> Model_AttributeSelection::value()
   return aResult;
 }
 
+bool Model_AttributeSelection::isInitialized()
+{
+  if (ModelAPI_AttributeSelection::isInitialized()) { // additional checkings if it is initialized
+    std::shared_ptr<GeomAPI_Shape> aResult;
+    if (myRef.isInitialized()) {
+      TDF_Label aSelLab = selectionLabel();
+      if (aSelLab.IsAttribute(kSIMPLE_REF_ID)) { // it is just reference to shape, not sub-shape
+        ResultPtr aContext = context();
+        if (!aContext.get()) 
+          return false;
+      }
+      if (aSelLab.IsAttribute(kCONSTUCTION_SIMPLE_REF_ID)) { // it is just reference to construction, nothing is in value
+          return false;
+      }
+
+      Handle(TNaming_NamedShape) aSelection;
+      if (selectionLabel().FindAttribute(TNaming_NamedShape::GetID(), aSelection)) {
+        return !aSelection->Get().IsNull();
+      } else { // for simple construction element: just shape of this construction element
+        ResultConstructionPtr aConstr = 
+          std::dynamic_pointer_cast<ModelAPI_ResultConstruction>(context());
+        if (aConstr.get()) {
+          return aConstr->shape().get();
+        }
+      }
+    }
+  }
+  return false;
+}
+
 Model_AttributeSelection::Model_AttributeSelection(TDF_Label& theLabel)
   : myRef(theLabel)
 {
index 19c1a151490126d014cc4931642f3d492bebbe08..1b2f8260155efefa267bca2be85d5bb01b9c2fcf 100644 (file)
@@ -52,6 +52,9 @@ public:
   /// Selects (i.e. creates Naming data structure) of sub-shape specifed by textual name
   MODEL_EXPORT virtual void selectSubShape(const std::string& theType, const std::string& theSubShapeName);
 
+  /// Returns true if attribute was  initialized by some value
+  MODEL_EXPORT virtual bool isInitialized();
+
 protected:
   /// Objects are created for features automatically
   MODEL_EXPORT Model_AttributeSelection(TDF_Label& theLabel);
index 7a8e5277bc898c2da6839497a2dc0d68bba3957f..6fe00ce286f4db1f92a0aee78a64e9af022e244c 100644 (file)
@@ -102,7 +102,7 @@ void Model_Update::processEvent(const std::shared_ptr<Events_Message>& theMessag
     // we don't need the update only on operation start (caused problems in PartSet_Listener::processEvent)
     isOperationChanged = true;
   } else if (theMessage->eventID() == kOpFinishEvent || theMessage->eventID() == kOpAbortEvent) {
-    processOperation(true);
+    processOperation(true, theMessage->eventID() == kOpFinishEvent);
     isOperationChanged = true;
   }
   if (isOperationChanged) {
@@ -131,20 +131,22 @@ void Model_Update::processEvent(const std::shared_ptr<Events_Message>& theMessag
   }
 }
 
-void Model_Update::processOperation(const bool theTotalUpdate)
+void Model_Update::processOperation(const bool theTotalUpdate, const bool theFinish)
 {
-  // the hardcode (DBC asked): hide the sketch referenced by extrusion on apply
-  std::set<std::shared_ptr<ModelAPI_Object> >::iterator aFIter;
-  for(aFIter = myJustCreated.begin(); aFIter != myJustCreated.end(); aFIter++)
-  {
-    FeaturePtr aF = std::dynamic_pointer_cast<ModelAPI_Feature>(*aFIter);
-    if (aF && aF->data().get() && aF->getKind() == "Extrusion") {
-      AttributeSelectionListPtr aBase = aF->selectionList("base");
-      if (aBase.get()) {
-        for(int a = aBase->size() - 1; a >= 0; a--) {
-          ResultPtr aSketchRes = aBase->value(a)->context();
-          if (aSketchRes) {
-            aSketchRes->setDisplayed(false);
+  if (theFinish) {
+    // the hardcode (DBC asked): hide the sketch referenced by extrusion on apply
+    std::set<std::shared_ptr<ModelAPI_Object> >::iterator aFIter;
+    for(aFIter = myJustCreated.begin(); aFIter != myJustCreated.end(); aFIter++)
+    {
+      FeaturePtr aF = std::dynamic_pointer_cast<ModelAPI_Feature>(*aFIter);
+      if (aF && aF->data().get() && aF->getKind() == "Extrusion") {
+        AttributeSelectionListPtr aBase = aF->selectionList("base");
+        if (aBase.get()) {
+          for(int a = aBase->size() - 1; a >= 0; a--) {
+            ResultPtr aSketchRes = aBase->value(a)->context();
+            if (aSketchRes) {
+              aSketchRes->setDisplayed(false);
+            }
           }
         }
       }
index 22fe573b9c061cc39282cd60d6b25f19f81a4e30..9eed59029039bf88b463321f05250b3ed0a973a0 100644 (file)
@@ -55,7 +55,7 @@ protected:
 
   /// On operation start/end/abort the "Just" fileds must be cleared and processed in the right way
   /// \param theTotalUpdate force to updates everything that has been changed in this operation
-  void processOperation(const bool theTotalUpdate);
+  void processOperation(const bool theTotalUpdate, const bool theFinish = false);
 
   /// Performs the feature execution
   /// \returns the status of execution