Salome HOME
Fix for Bug IPAL11293
authorapo <apo@opencascade.com>
Mon, 20 Mar 2006 09:12:43 +0000 (09:12 +0000)
committerapo <apo@opencascade.com>
Mon, 20 Mar 2006 09:12:43 +0000 (09:12 +0000)
   SMESH: application crashes with wrong parameters of extrusion

src/SMESHGUI/SMESHGUI_ExtrusionDlg.cxx
src/SMESHGUI/SMESHGUI_ExtrusionDlg.h
src/SMESH_I/SMESH_MeshEditor_i.cxx

index 7860471d78079611f5090fca23ea01b1785e4cce..4dd94bcf21c55cd4cdd415c7809e0aee2286c93b 100644 (file)
@@ -253,8 +253,13 @@ SMESHGUI_ExtrusionDlg::SMESHGUI_ExtrusionDlg (SMESHGUI* theModule,
   connect(buttonOk, SIGNAL(clicked()),     this, SLOT(ClickOnOk()));
   connect(buttonCancel, SIGNAL(clicked()), this, SLOT(ClickOnCancel()));
   connect(buttonApply, SIGNAL(clicked()),  this, SLOT(ClickOnApply()));
-  connect(GroupConstructors, SIGNAL(clicked(int)), SLOT(ConstructorsClicked(int)));
 
+  // to update state of the Ok & Apply buttons
+  connect(SpinBox_Dx, SIGNAL(valueChanged(double)), SLOT(CheckIsEnable()));
+  connect(SpinBox_Dy, SIGNAL(valueChanged(double)), SLOT(CheckIsEnable()));
+  connect(SpinBox_Dz, SIGNAL(valueChanged(double)), SLOT(CheckIsEnable()));
+
+  connect(GroupConstructors, SIGNAL(clicked(int)), SLOT(ConstructorsClicked(int)));
   connect(SelectElementsButton, SIGNAL (clicked()),            this, SLOT(SetEditCurrentArgument()));
   connect(mySMESHGUI, SIGNAL (SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog()));
   connect(mySelectionMgr, SIGNAL(currentSelectionChanged()),   this, SLOT(SelectionIntoArgument()));
@@ -292,9 +297,6 @@ void SMESHGUI_ExtrusionDlg::Init (bool ResetControls)
   myElementsId = "";
   myNbOkElements = 0;
 
-  buttonOk->setEnabled(false);
-  buttonApply->setEnabled(false);
-
   myActor = 0;
   myMesh = SMESH::SMESH_Mesh::_nil();
 
@@ -307,6 +309,25 @@ void SMESHGUI_ExtrusionDlg::Init (bool ResetControls)
     CheckBoxMesh->setChecked(false);
     onSelectMesh(false);
   }
+
+  CheckIsEnable();
+}
+
+//=================================================================================
+// function : CheckIsEnable()
+// purpose  : Check whether the Ok and Apply buttons should be enabled or not
+//=================================================================================
+void SMESHGUI_ExtrusionDlg::CheckIsEnable()
+{
+  double aX = SpinBox_Dx->GetValue();
+  double aY = SpinBox_Dy->GetValue();
+  double aZ = SpinBox_Dz->GetValue();
+  double aModule = sqrt(aX*aX + aY*aY + aZ*aZ);
+  
+  bool anIsEnable = myNbOkElements > 0 && aModule > 1.0E-38;
+
+  buttonOk->setEnabled(anIsEnable);
+  buttonApply->setEnabled(anIsEnable);
 }
 
 //=================================================================================
@@ -434,9 +455,6 @@ void SMESHGUI_ExtrusionDlg::onTextChange (const QString& theNewText)
   if (send == LineEditElements)
     myNbOkElements = 0;
 
-  buttonOk->setEnabled(false);
-  buttonApply->setEnabled(false);
-
   // hilight entered elements/nodes
   SMDS_Mesh* aMesh = 0;
   if (myActor)
@@ -461,10 +479,7 @@ void SMESHGUI_ExtrusionDlg::onTextChange (const QString& theNewText)
     }
   }
 
-  if (myNbOkElements) {
-    buttonOk->setEnabled(true);
-    buttonApply->setEnabled(true);
-  }
+  CheckIsEnable();
 
   myBusy = false;
 }
@@ -490,8 +505,6 @@ void SMESHGUI_ExtrusionDlg::SelectionIntoArgument()
 
   myEditCurrentArgument->setText(aString);
   myNbOkElements = 0;
-  buttonOk->setEnabled(false);
-  buttonApply->setEnabled(false);
   myBusy = false;
 
   // get selected mesh
@@ -593,10 +606,7 @@ void SMESHGUI_ExtrusionDlg::SelectionIntoArgument()
   myBusy = false;
 
   // OK
-  if (myNbOkElements) {
-    buttonOk->setEnabled(true);
-    buttonApply->setEnabled(true);
-  }
+  CheckIsEnable();
 }
 
 //=================================================================================
index 935a2716c81d2ff44b06fb35a8711d6564dc5693..0c0d6778ada35d102981c9028e60ed8ceb18d6ea 100644 (file)
@@ -114,6 +114,7 @@ private:
 
 private slots:
   void ConstructorsClicked (int);
+  void CheckIsEnable();
   void ClickOnOk();
   bool ClickOnApply();
   void ClickOnCancel();
index d852584403a3a2b87fca8881f2fa45d47a27c040..b6371d7160e94ee224574f582a4d139798835a66 100644 (file)
@@ -37,6 +37,7 @@
 #include "SMESH_Gen_i.hxx"
 #include "SMESH_Filter_i.hxx"
 #include "SMESH_PythonDump.hxx"
+#include "CASCatch.hxx"
 
 #include "utilities.h"
 
@@ -920,28 +921,33 @@ void SMESH_MeshEditor_i::ExtrusionSweep(const SMESH::long_array & theIDsOfElemen
                                         const SMESH::DirStruct &  theStepVector,
                                         CORBA::Long               theNbOfSteps)
 {
-  SMESHDS_Mesh* aMesh = GetMeshDS();
-
-  set<const SMDS_MeshElement*> elements;
-  for (int i = 0; i < theIDsOfElements.length(); i++)
-  {
-    CORBA::Long index = theIDsOfElements[i];
-    const SMDS_MeshElement * elem = aMesh->FindElement(index);
-    if ( elem )
-      elements.insert( elem );
-  }
-  const SMESH::PointStruct * P = &theStepVector.PS;
-  gp_Vec stepVec( P->x, P->y, P->z );
+  CASCatch_TRY {   
+    SMESHDS_Mesh* aMesh = GetMeshDS();
+    
+    set<const SMDS_MeshElement*> elements;
+    for (int i = 0; i < theIDsOfElements.length(); i++)
+    {
+      CORBA::Long index = theIDsOfElements[i];
+      const SMDS_MeshElement * elem = aMesh->FindElement(index);
+      if ( elem )
+       elements.insert( elem );
+    }
+    const SMESH::PointStruct * P = &theStepVector.PS;
+    gp_Vec stepVec( P->x, P->y, P->z );
+    
+    TElemOfElemListMap aHystory;
+    ::SMESH_MeshEditor anEditor( _myMesh );
+    anEditor.ExtrusionSweep (elements, stepVec, theNbOfSteps, aHystory);
 
-  ::SMESH_MeshEditor anEditor( _myMesh );
-  //anEditor.ExtrusionSweep (elements, stepVec, theNbOfSteps);
-  TElemOfElemListMap aHystory;
-  anEditor.ExtrusionSweep (elements, stepVec, theNbOfSteps, aHystory);
+    // Update Python script
+    TPythonDump() << "stepVector = " << theStepVector;
+    TPythonDump() << this << ".ExtrusionSweep( "
+                 << theIDsOfElements << ", stepVector, " << theNbOfSteps << " )";
 
-  // Update Python script
-  TPythonDump() << "stepVector = " << theStepVector;
-  TPythonDump() << this << ".ExtrusionSweep( "
-                << theIDsOfElements << ", stepVector, " << theNbOfSteps << " )";
+  }CASCatch_CATCH(Standard_Failure) {
+    Handle(Standard_Failure) aFail = Standard_Failure::Caught();          
+    INFOS( "SMESH_MeshEditor_i::ExtrusionSweep fails - "<< aFail->GetMessageString() );
+  }
 }