]> SALOME platform Git repositories - modules/geom.git/commitdiff
Salome HOME
0022869: Disable Generate Groups if the path is closed
authorskv <skv@opencascade.com>
Thu, 26 Mar 2015 11:52:11 +0000 (14:52 +0300)
committerskv <skv@opencascade.com>
Thu, 26 Mar 2015 11:52:11 +0000 (14:52 +0300)
src/GenerationGUI/GenerationGUI_PipeDlg.cxx
src/GenerationGUI/GenerationGUI_PipeDlg.h

index 7bc91a8a5f45e25d6bb0cab93a38d6c1c092be48..5474b1e434d306dd6ae80b74bdacfeb932bf1d48 100644 (file)
@@ -35,7 +35,9 @@
 #include <SalomeApp_Application.h>
 #include <LightApp_SelectionMgr.h>
 
+#include <BRep_Tool.hxx>
 #include <TopoDS_Shape.hxx>
+#include <TopoDS_Vertex.hxx>
 #include <TopoDS.hxx>
 #include <TopExp.hxx>
 #include <TopTools_IndexedMapOfShape.hxx>
@@ -217,6 +219,7 @@ void GenerationGUI_PipeDlg::Init()
 
   GroupPoints->PushButton1->click();
   SelectionIntoArgument();
+  updateGenGroup();
 }
 
 //=================================================================================
@@ -286,6 +289,7 @@ void GenerationGUI_PipeDlg::SelectionTypeButtonClicked()
   if ( myEditCurrentArgument == GroupPoints->LineEdit2 ) {
     myEditCurrentArgument->setText("");
     myPath.nullify();
+    updateGenGroup();
   }
   processPreview();
 }
@@ -352,6 +356,7 @@ void GenerationGUI_PipeDlg::SelectionIntoArgument()
       else if ( myBaseObjects.isEmpty() )
         GroupPoints->PushButton1->click();
     }
+    updateGenGroup();
   }
   else if (myEditCurrentArgument == GroupPoints->LineEdit3) {
     myVec = getSelected( TopAbs_EDGE );
@@ -391,6 +396,7 @@ void GenerationGUI_PipeDlg::SelectionIntoArgument()
       QString aName = GEOMBase::GetName( myPath.get() );
       myEditCurrentArgument->setText( aName );
     }
+    updateGenGroup();
   }
 
   processPreview();
@@ -537,7 +543,8 @@ bool GenerationGUI_PipeDlg::execute (ObjectList& objects)
   case 0:
   case 1:
     if (doGroups) {
-      doGroups = myGenGroupCheckGP->isChecked();
+      doGroups = myGenGroupCheckGP->isEnabled() &&
+                 myGenGroupCheckGP->isChecked();
     }
 
     for (int i = 0; i < myBaseObjects.count(); i++) {
@@ -577,7 +584,8 @@ bool GenerationGUI_PipeDlg::execute (ObjectList& objects)
       }
 
       if (doGroups) {
-        doGroups = myGenGroupCheckGMP->isChecked();
+        doGroups = myGenGroupCheckGMP->isEnabled() &&
+                   myGenGroupCheckGMP->isChecked();
       }
 
       aList = anOper->MakePipeWithDifferentSections
@@ -632,7 +640,6 @@ void GenerationGUI_PipeDlg::restoreSubShapes
   QCheckBox *aGenGroupCheck = NULL;
   QLineEdit *aPrefixEdit    = NULL;
 
-
   switch (getConstructorId()) {
   case 0 :
   case 1 :
@@ -712,6 +719,82 @@ void GenerationGUI_PipeDlg::GenGroupClicked(bool isChecked)
   resetGenGroup((QCheckBox *)sender(), isChecked, false);
 }
 
+//=================================================================================
+// function : updateGenGroup
+// purpose  : Update "Generate groups" widgets depending on the path.
+//=================================================================================
+void GenerationGUI_PipeDlg::updateGenGroup()
+{
+  bool isEnable = true;
+
+  if (myPath) {
+    // Check if the path is closed.
+    TopoDS_Shape aShapePath;
+
+    if (GEOMBase::GetShape(myPath.get(), aShapePath) &&
+        aShapePath.IsNull() == Standard_False) {
+      if (aShapePath.Closed()) {
+        // No groups should be generated if the path is closed.
+        isEnable = false;
+      } else {
+        const TopAbs_ShapeEnum aType = aShapePath.ShapeType();
+
+        if (aType == TopAbs_EDGE || aType == TopAbs_WIRE) {
+          // Check if path ends are coinsident.
+          TopoDS_Vertex aV[2];
+
+          if (aType == TopAbs_EDGE) {
+            // Edge
+            TopExp::Vertices(TopoDS::Edge(aShapePath), aV[0], aV[1]);
+          } else {
+            // Wire
+            TopExp::Vertices(TopoDS::Wire(aShapePath), aV[0], aV[1]);
+          }
+
+          if (aV[0].IsNull() == Standard_False &&
+              aV[1].IsNull() == Standard_False) {
+            if (aV[0].IsSame(aV[1])) {
+              // No groups should be generated if the path is closed.
+              isEnable = false;
+            } else {
+              const Standard_Real aTol1 = BRep_Tool::Tolerance(aV[0]);
+              const Standard_Real aTol2 = BRep_Tool::Tolerance(aV[1]);
+              const gp_Pnt        aPnt1 = BRep_Tool::Pnt(aV[0]);
+              const gp_Pnt        aPnt2 = BRep_Tool::Pnt(aV[1]);
+
+              if (aPnt1.Distance(aPnt2) <= aTol1 + aTol2) {
+                // No groups should be generated if the path is closed.
+                isEnable = false;
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+
+  QCheckBox *aGenGroupCheck = NULL;
+
+  switch (getConstructorId()) {
+  case 0 :
+  case 1 :
+    aGenGroupCheck = myGenGroupCheckGP;
+    break;
+  case 2 :
+    aGenGroupCheck = myGenGroupCheckGMP;
+    break;
+  default:
+    break;
+  }
+
+  if (aGenGroupCheck != NULL) {
+    const bool isChecked = aGenGroupCheck->isChecked();
+
+    aGenGroupCheck->setEnabled(isEnable);
+    resetGenGroup(aGenGroupCheck, isEnable && isChecked, false);
+  }
+}
+
 //=================================================================================
 // function : resetGenGroup
 // purpose  : Resets data of "Generate groups" widgets.
index 7af0402b384bf742f0a507ec1a764e84be372e82..3684e5210e7770baed81ec1c18dd4ee0e3682e78 100644 (file)
@@ -62,6 +62,7 @@ protected:
 private:
   void                               Init();
   void                               enterEvent( QEvent* );
+  void                               updateGenGroup();
   void                               resetGenGroup
                                         (QCheckBox *theGenGroup,
                                          const bool isChecked,