Salome HOME
Merge from BR_Dev_For_4_0 branch (from tag mergeto_BR_QT4_Dev_07Jul08)
authorvsr <vsr@opencascade.com>
Tue, 22 Jul 2008 09:10:35 +0000 (09:10 +0000)
committervsr <vsr@opencascade.com>
Tue, 22 Jul 2008 09:10:35 +0000 (09:10 +0000)
43 files changed:
doc/salome/gui/Makefile.am
doc/salome/gui/SMESH/doxyfile.in
doc/salome/gui/SMESH/doxyfile_py.in
doc/salome/gui/SMESH/images/buildcompound.png
doc/salome/gui/SMESH/input/building_compounds.doc
doc/salome/gui/SMESH/input/smeshpy_interface.doc
idl/SMESH_Gen.idl
idl/SMESH_Mesh.idl
src/SMDS/SMDS_MeshInfo.hxx
src/SMDS/SMDS_MeshNode.cxx
src/SMDS/SMDS_MeshNode.hxx
src/SMESH/SMESH_Block.cxx
src/SMESH/SMESH_MeshEditor.cxx
src/SMESH/SMESH_OctreeNode.hxx
src/SMESH/SMESH_Pattern.cxx
src/SMESH/SMESH_Pattern.hxx
src/SMESH/SMESH_subMesh.cxx
src/SMESHGUI/Makefile.am
src/SMESHGUI/SMESHGUI.cxx
src/SMESHGUI/SMESHGUI_BuildCompoundDlg.cxx
src/SMESHGUI/SMESHGUI_BuildCompoundDlg.h
src/SMESHGUI/SMESHGUI_ExtrusionAlongPathDlg.cxx
src/SMESHGUI/SMESHGUI_ExtrusionAlongPathDlg.h
src/SMESHGUI/SMESHGUI_FileInfoDlg.cxx [new file with mode: 0644]
src/SMESHGUI/SMESHGUI_FileInfoDlg.h [new file with mode: 0644]
src/SMESHGUI/SMESHGUI_RevolutionDlg.cxx
src/SMESHGUI/SMESHGUI_RevolutionDlg.h
src/SMESHGUI/SMESHGUI_Selection.cxx
src/SMESHGUI/SMESHGUI_Selection.h
src/SMESHGUI/SMESH_msg_en.ts
src/SMESH_I/SMESH_2smeshpy.cxx
src/SMESH_I/SMESH_Gen_i.cxx
src/SMESH_I/SMESH_Gen_i.hxx
src/SMESH_I/SMESH_MeshEditor_i.cxx
src/SMESH_I/SMESH_Mesh_i.cxx
src/SMESH_I/SMESH_Mesh_i.hxx
src/SMESH_SWIG/smeshDC.py
src/StdMeshers/StdMeshers_Distribution.hxx
src/StdMeshers/StdMeshers_FaceSide.cxx
src/StdMeshers/StdMeshers_MEFISTO_2D.cxx
src/StdMeshers/StdMeshers_MEFISTO_2D.hxx
src/StdMeshers/StdMeshers_Penta_3D.cxx
src/StdMeshers/StdMeshers_ProjectionUtils.cxx

index e7c5dc8ae64c8ee0633a31f198b7be7894ce7f65..66ce3648ef1f7709880262fa8c29ec88d52903c6 100644 (file)
@@ -27,12 +27,23 @@ EXTRA_DIST+=SMESH
 
 doxygen=@DOXYGEN@
 
+# Below command replaces "smeshDC" by "smesh" except cases
+# "ssmeshDC", "1smeshDC" and "esmeshDC" (these sequences
+# can be found in file names and must not be replaces):
+#
+# sed 's/\([^s1e]\)smeshDC\|^smeshDC/\1smesh/g' $${filen} > ./tmp;
+#
 usr_docs:
        cd ./SMESH; \
        echo "Processing smeshDC.py file: "; \
        $(doxygen) ./doxyfile_py; \
-       sed 's|../../../share/salome|$(top_srcdir)|' ./doxyfile > ./doxyfile1; \
-       mv -f doxyfile1 doxyfile; \
+       cd ./smeshpy_doc; \
+       filesl=`find .`; \
+       for filen in $${filesl}; do \
+         sed 's/\([^s1e]\)smeshDC\|^smeshDC/\1smesh/g' $${filen} > ./tmp; \
+         mv -f tmp $${filen}; \
+       done; \
+       cd ..; \
        echo "Running doxygen in directory: "`pwd`; \
        $(doxygen) ./doxyfile;
 
index 37ef2d45fa52f6136d2df38ac2966229c743f721..3aea83cc5e690d6bc73701a6befae0d61cbb33f8 100755 (executable)
@@ -19,7 +19,7 @@ WARNINGS          = YES
 INPUT             = @srcdir@/input               
 FILE_PATTERNS     = *.doc
 IMAGE_PATH        = @srcdir@/images
-EXAMPLE_PATH      = ../../../share/salome/src/SMESH_SWIG
+EXAMPLE_PATH      = @top_srcdir@/src/SMESH_SWIG
 #---------------------------------------------------------------------------
 #HTML related options
 #---------------------------------------------------------------------------
index ff847e50e6c1d8ee4e27b413d06fed5726e4b77b..617584ed91523dabc58ee6a3e11d63df3a608060 100755 (executable)
@@ -7,7 +7,7 @@ CREATE_SUBDIRS    = NO
 OUTPUT_LANGUAGE   = English
 USE_WINDOWS_ENCODING   = NO
 BRIEF_MEMBER_DESC      = YES
-REPEAT_BRIEF           = NO
+REPEAT_BRIEF           = YES
 ALWAYS_DETAILED_SEC    = YES
 INLINE_INHERITED_MEMB  = YES
 FULL_PATH_NAMES        = NO
@@ -38,7 +38,7 @@ HIDE_FRIEND_COMPOUNDS  = NO
 HIDE_IN_BODY_DOCS      = NO
 INTERNAL_DOCS          = YES
 CASE_SENSE_NAMES       = YES
-HIDE_SCOPE_NAMES       = NO
+HIDE_SCOPE_NAMES       = YES
 SHOW_INCLUDE_FILES     = YES
 INLINE_INFO            = YES
 SORT_MEMBER_DOCS       = NO
@@ -81,6 +81,7 @@ INPUT             = @top_srcdir@/src/SMESH_SWIG
 FILE_PATTERNS     = smeshDC.py
 IMAGE_PATH        = @srcdir@/images
 RECURSIVE         = NO
+EXAMPLE_PATH      = @top_srcdir@/src/SMESH_SWIG
 
 #---------------------------------------------------------------------------
 #HTML related options
@@ -107,19 +108,26 @@ GENERATE_RTF      = NO
 #---------------------------------------------------------------------------
 # Configuration options related to the dot tool   
 #---------------------------------------------------------------------------
-CLASS_DIAGRAMS         = YES
+#CLASS_DIAGRAMS         = YES
+CLASS_DIAGRAMS         = NO
 HIDE_UNDOC_RELATIONS   = NO
-HAVE_DOT               = YES
-CLASS_GRAPH            = YES
+#HAVE_DOT               = YES
+HAVE_DOT               = NO
+#CLASS_GRAPH            = YES
+CLASS_GRAPH            = NO
 COLLABORATION_GRAPH    = NO
 GROUP_GRAPHS           = NO
 UML_LOOK               = NO
-TEMPLATE_RELATIONS     = YES
-INCLUDE_GRAPH          = YES
+#TEMPLATE_RELATIONS     = YES
+#INCLUDE_GRAPH          = YES
+TEMPLATE_RELATIONS     = NO
+INCLUDE_GRAPH          = NO
 INCLUDED_BY_GRAPH      = NO
 CALL_GRAPH             = NO
-GRAPHICAL_HIERARCHY    = YES
-DIRECTORY_GRAPH        = YES
+#GRAPHICAL_HIERARCHY    = YES
+#DIRECTORY_GRAPH        = YES
+GRAPHICAL_HIERARCHY    = NO
+DIRECTORY_GRAPH        = NO
 DOT_IMAGE_FORMAT       = jpg
 DOT_PATH               = 
 DOTFILE_DIRS           = 
index 79a6073f2976063b2faba4b60743127f94f086a1..1a5bea1666949ed8f290ad976a047604ec02e0c2 100755 (executable)
Binary files a/doc/salome/gui/SMESH/images/buildcompound.png and b/doc/salome/gui/SMESH/images/buildcompound.png differ
index 5905565d54f36f5612ad92109f987f6cf0da1526..d42f38866d56bdc1565126936a268bf7e1f02648 100644 (file)
@@ -34,6 +34,12 @@ become the elements of Group1 on the Compound_Mesh, or</li>
 becomes Group1_2. See \ref grouping_elements_page "Creating Groups"
 for more information about groups.</li>
 </ul>
+<li><b>Create common groups for initial meshes</b> checkbox permits to
+automatically create groups of all elements of the same type
+(nodes, edges, faces and volumes) for the resulting mesh from the
+elements
+of the initial meshes.
+</li>
 <li>You can simply unite meshes or choose to <b>Merge coincident nodes
 and elements</b>, in which case it is possible to define the \b Tolerance
 for this operation.</li>
@@ -43,4 +49,4 @@ for this operation.</li>
 
 \image html image160.gif
 
-*/
\ No newline at end of file
+*/
index 4fbf3d3b567efb134ab2a0e56f1a7694acbb446e..6e2b421c9cb107e098ed6ae22ba0d967ffe5607d 100644 (file)
@@ -5,6 +5,37 @@
 \n Python package smesh defines several classes, destined for easy and
 clear mesh creation and edition (see the \ref introduction_to_mesh_python_page "example").
 
-\n Also, please see \ref smeshDC "documentation for smesh.py"
+\n Please draw your attention to the below notes before address to
+the \ref smeshDC "documentation for smesh.py"
 
-*/
\ No newline at end of file
+\n 1. The main page of the \ref smeshDC "documentation for smesh.py"
+      contains a list of data structures and a list of functions,
+      provided by the package smesh.py. The first item in the data
+      structures list (\ref smeshDC::smeshDC "class smesh") also
+      represents documentation for methods of the package smesh.py itself.
+
+\n 2. Package smesh.py gives interface to create and manage
+      meshes. Please, use it to create an empty mesh or to import
+      it from data file.
+
+\n 3. Once you have created a mesh, you can manage it via its own
+      methods. See \ref smeshDC::Mesh "class Mesh" documentation for
+      them (it is also accessible by the second item "class Mesh" in the
+      data structures list).
+
+\n 4. Class Mesh allows to assign algorithms to a mesh.
+\n \t Please note, that there are always available some algorithms,
+      included in standard Salome installation:
+         - REGULAR(1D), COMPOSITE(1D), MEFISTO(2D), Quadrangle(2D), Hexa(3D), etc.
+
+\n Also there are some algorithms, which can be installed optionally,
+\n some of them are based on open-source meshers:
+         - NETGEN(1D-2D,2D,1D-2D-3D,3D),
+
+\n others are based on commercial meshers:
+         - GHS3D(3D).
+
+\n \t To add hypotheses, please use interfaces, provided by the
+      assigned algorithms.
+
+*/
index 96083e18958e35982a4c12e99cbba8321a3cbbe5..362bea45a493255f74ce43b2814f4def7e9b5168 100644 (file)
@@ -275,6 +275,20 @@ module SMESH
                           in double     theMergeTolerance)
       raises ( SALOME::SALOME_Exception );
 
+    /*!
+     * Concatenate the given meshes into one mesh.
+     * Union groups with the same name and type if
+     * theUniteIdenticalGroups flag is true.
+     * Merge coincident nodes and elements if 
+     * theMergeNodesAndElements flag is true.
+     * Create the groups of all elements from initial meshes.
+     */
+    SMESH_Mesh ConcatenateWithGroups(in mesh_array theMeshesArray, 
+                                    in boolean    theUniteIdenticalGroups, 
+                                     in boolean    theMergeNodesAndElements, 
+                                     in double     theMergeTolerance)
+      raises ( SALOME::SALOME_Exception );
+
     /*!
      * \brief Return id of object, registered in current study context
      *
index b041641778cfb967434d1d1f09b43b07b1afa524..fd70cc9f5031c19f70714fce2667e28069310c17 100644 (file)
@@ -625,6 +625,8 @@ module SMESH
      */
     double_array BaryCenter(in long id);
 
+    /*! Gets information about imported MED file */
+    SALOME_MED::MedFileInfo GetMEDFileInfo();
   };
 
   interface SMESH_subMesh : SALOME::GenericObj, SMESH_IDSource
index a7694837b67b9c6f69586ced9ac3512ea82a3c0e..8f541c26728a6c60304f27132e49380773792167 100644 (file)
@@ -2,6 +2,7 @@
 // Created   : Mon Sep 24 18:32:41 2007
 // Author    : Edward AGAPOV (eap)
 
+using namespace std;
 
 #ifndef SMDS_MeshInfo_HeaderFile
 #define SMDS_MeshInfo_HeaderFile
index b7a1cb117ed5544bdc711316938ccecb25327bc5..587aee90a86284144296f898755b476f326607d5 100644 (file)
@@ -246,7 +246,7 @@ bool SMDS_MeshNode::emptyInverseElements()
  */
 //================================================================================
 
-int SMDS_MeshNode::NbInverseNodes(SMDSAbs_ElementType type) const
+int SMDS_MeshNode::NbInverseElements(SMDSAbs_ElementType type) const
 {
   if ( type == SMDSAbs_All )
     return myInverseElements.Extent();
index d195fbdfdef8b91326cda458ad31f764c8a9d508..585f59bf9a699a128bace23c425a26a72772a612 100644 (file)
@@ -47,7 +47,7 @@ class SMDS_EXPORT SMDS_MeshNode:public SMDS_MeshElement
        void ClearInverseElements();
        bool emptyInverseElements();
        SMDS_ElemIteratorPtr GetInverseElementIterator(SMDSAbs_ElementType type=SMDSAbs_All) const;
-        int NbInverseNodes(SMDSAbs_ElementType type=SMDSAbs_All) const;
+        int NbInverseElements(SMDSAbs_ElementType type=SMDSAbs_All) const;
        void SetPosition(const SMDS_PositionPtr& aPos);
        const SMDS_PositionPtr& GetPosition() const;
        SMDSAbs_ElementType GetType() const;
index 6a50ff019aec097c8d8ed8dd7219f64d4b85b733..59d48a9786386d0c0642aacbb1bf9069e764dce6 100644 (file)
@@ -21,6 +21,8 @@
 // Created   : Mon Aug  2 10:30:00 2004
 // Author    : Edward AGAPOV (eap)
 
+using namespace std;
+
 #include "SMESH_Block.hxx"
 
 #include <BRepAdaptor_Curve.hxx>
index b858c372f1249ad88d97ff39fb0c5659a2cc07d2..6b94beafec3f1c7521983523b0b8147c6593db9f 100644 (file)
@@ -6871,7 +6871,7 @@ int SMESH_MeshEditor::removeQuadElem(SMESHDS_SubMesh *    theSm,
       vector<const SMDS_MeshNode*>::iterator nIt = mediumNodes.begin();
       for ( ; nIt != mediumNodes.end(); ++nIt ) {
         const SMDS_MeshNode* n = *nIt;
-        if ( n->NbInverseNodes() == 0 ) {
+        if ( n->NbInverseElements() == 0 ) {
           if ( n->GetPosition()->GetShapeId() != theShapeID )
             meshDS->RemoveFreeNode( n, meshDS->MeshElements
                                     ( n->GetPosition()->GetShapeId() ));
index 62cddf68844523f2ae4341455fa9788fa55bf73f..5a553027a05acf2a07a2f736a7c8263ecfebce60 100644 (file)
@@ -27,6 +27,8 @@
 // Author    : Nicolas Geimer & Aurélien Motteux  (OCC)
 // Module    : SMESH
 
+using namespace std;
+
 #ifndef _SMESH_OCTREENODE_HXX_
 #define _SMESH_OCTREENODE_HXX_
 
index 4d3fe36f66134b9c85272dfa79b695d1b099c94c..1ab83c71e927aa94cf2a3864683deeacdaeffa2d 100644 (file)
@@ -21,6 +21,8 @@
 // Created   : Mon Aug  2 10:30:00 2004
 // Author    : Edward AGAPOV (eap)
 
+using namespace std;
+
 #include "SMESH_Pattern.hxx"
 
 #include <BRepAdaptor_Curve.hxx>
index 2746f15cc0c74c085b6a38b6a6c1767aa1236cd5..d5288bb1db909aec3a0d0782c090c626892d6f78 100644 (file)
@@ -21,6 +21,8 @@
 // Created   : Mon Aug  2 10:30:00 2004
 // Author    : Edward AGAPOV (eap)
 
+using namespace std;
+
 #ifndef SMESH_Pattern_HeaderFile
 #define SMESH_Pattern_HeaderFile
 
index bbb5fa96a45e3c7f8c7e2da6dcaf1b826d6c1252..3a1c9fa0db92a3a399bc0a27412a672fec34f677 100644 (file)
@@ -1195,7 +1195,7 @@ static void cleanSubMesh( SMESH_subMesh * subMesh )
       while (itn->more()) {
         const SMDS_MeshNode * node = itn->next();
         //MESSAGE( " RM node: "<<node->GetID());
-        if ( node->NbInverseNodes() == 0 )
+        if ( node->NbInverseElements() == 0 )
           meshDS->RemoveFreeNode(node, subMeshDS);
         else // for StdMeshers_CompositeSegment_1D: node in one submesh, edge in another
           meshDS->RemoveNode(node);
index 5cddef78495c7052ea8e5403ab06bd18e8d40a49..6e451fb7d03a810d4731f6d5db853cd25fce435e 100644 (file)
@@ -99,7 +99,8 @@ dist_libSMESH_la_SOURCES = \
        SMESHGUI_BuildCompoundDlg.cxx \
        SMESHGUI_ComputeDlg.cxx \
        SMESHGUI_MakeNodeAtPointDlg.cxx \
-       SMESHGUI_MeshEditPreview.cxx
+       SMESHGUI_MeshEditPreview.cxx \
+       SMESHGUI_FileInfoDlg.cxx
 
 MOC_FILES = \
        SMESHGUI_moc.cxx \
@@ -149,7 +150,8 @@ MOC_FILES = \
        SMESHGUI_ConvToQuadOp_moc.cxx \
        SMESHGUI_BuildCompoundDlg_moc.cxx \
        SMESHGUI_ComputeDlg_moc.cxx \
-       SMESHGUI_MakeNodeAtPointDlg_moc.cxx
+       SMESHGUI_MakeNodeAtPointDlg_moc.cxx \
+       SMESHGUI_FileInfoDlg_moc.cxx
 
 nodist_libSMESH_la_SOURCES= \
        $(MOC_FILES)
index 59c93d31a7b4b1473d12141c83610402c01a9045..f079274914a8a9db06341682dbd6831dadc58741 100644 (file)
@@ -65,6 +65,7 @@
 #include "SMESHGUI_MakeNodeAtPointDlg.h"
 #include "SMESHGUI_BuildCompoundDlg.h"
 #include "SMESHGUI_ComputeDlg.h"
+#include "SMESHGUI_FileInfoDlg.h"
 
 #include "SMESHGUI_Utils.h"
 #include "SMESHGUI_MeshUtils.h"
 // IDL includes
 #include <SALOMEconfig.h>
 #include CORBA_CLIENT_HEADER(SALOMEDS_Attributes)
-#include CORBA_SERVER_HEADER(SMESH_MeshEditor)
+#include CORBA_CLIENT_HEADER(SMESH_MeshEditor)
 
 // Qt includes
 // #define      INCLUDE_MENUITEM_DEF // VSR commented ????????
@@ -1263,6 +1264,25 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
       break;
     }
 
+  case 150:    //MED FILE INFORMATION
+    {
+      SALOME_ListIO selected;
+      LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
+      if( aSel )
+        aSel->selectedObjects( selected );
+      if( selected.Extent() )
+      {
+        Handle(SALOME_InteractiveObject) anIObject = selected.First();
+        SMESH::SMESH_Mesh_var aMesh = SMESH::IObjectToInterface<SMESH::SMESH_Mesh>(anIObject);
+        if ( !aMesh->_is_nil() )
+        {
+          SMESHGUI_FileInfoDlg dlg( desktop(), aMesh->GetMEDFileInfo() );
+          dlg.exec();
+        }
+      }
+      break;
+    }
+
   case 122:                                    // EXPORT MED
   case 121:
   case 123:
@@ -2409,6 +2429,7 @@ void SMESHGUI::initialize( CAM_Application* app )
   createSMESHAction(  125, "EXPORT_MED" );
   createSMESHAction(  126, "EXPORT_UNV" );
   createSMESHAction(  141, "EXPORT_STL" );
+  createSMESHAction(  150, "FILE_INFO" );
   createSMESHAction(   33, "DELETE",          "ICON_DELETE", Qt::Key_Delete );
   createSMESHAction( 5105, "SEL_FILTER_LIB" );
   createSMESHAction(  701, "COMPUTE",         "ICON_COMPUTE" );
@@ -2740,6 +2761,7 @@ void SMESHGUI::initialize( CAM_Application* app )
 
   // popup for object browser
 
+  createPopupItem( 150, OB, mesh, "&& selcount=1 && isImported" );      // FILE INFORMATION
   createPopupItem( 704, OB, mesh, "&& isComputable");      // EDIT_MESHSUBMESH
   createPopupItem( 704, OB, subMesh, "&& isComputable" );  // EDIT_MESHSUBMESH
   createPopupItem( 803, OB, group );                       // EDIT_GROUP
index 6bfeddee0194c78eb61a3381c2c90779f288c265..dcfaa7e1b676d6df902a0dab43da5b362784d08c 100644 (file)
@@ -123,12 +123,15 @@ SMESHGUI_BuildCompoundDlg::SMESHGUI_BuildCompoundDlg( SMESHGUI* theModule )
   TextLabelMeshes = new QLabel(tr("MESHES"), GroupArgs);
   SelectButton = new QPushButton(GroupArgs);
   SelectButton->setIcon(image1);
+  SelectButton->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
   LineEditMeshes = new QLineEdit(GroupArgs);
   LineEditMeshes->setReadOnly(true);
 
   TextLabelUnion = new QLabel(tr("PROCESSING_IDENTICAL_GROUPS"), GroupArgs);
   ComboBoxUnion = new QComboBox(GroupArgs);
 
+  CheckBoxCommon = new QCheckBox(tr("CREATE_COMMON_GROUPS"), GroupArgs);
+
   CheckBoxMerge = new QCheckBox(tr("MERGE_NODES_AND_ELEMENTS"), GroupArgs);
 
   TextLabelTol = new QLabel(tr("SMESH_TOLERANCE"), GroupArgs);
@@ -141,9 +144,10 @@ SMESHGUI_BuildCompoundDlg::SMESHGUI_BuildCompoundDlg( SMESHGUI* theModule )
   GroupArgsLayout->addWidget(LineEditMeshes,  0, 2, 1, 2);
   GroupArgsLayout->addWidget(TextLabelUnion,  1, 0, 1, 3); 
   GroupArgsLayout->addWidget(ComboBoxUnion,   1, 3);
-  GroupArgsLayout->addWidget(CheckBoxMerge,   2, 0, 1, 4);
-  GroupArgsLayout->addWidget(TextLabelTol,    3, 0, 1, 2);
-  GroupArgsLayout->addWidget(SpinBoxTol,      3, 2, 1, 2);
+  GroupArgsLayout->addWidget(CheckBoxCommon,  2, 0, 1, 4);
+  GroupArgsLayout->addWidget(CheckBoxMerge,   3, 0, 1, 4);
+  GroupArgsLayout->addWidget(TextLabelTol,    4, 0, 1, 2);
+  GroupArgsLayout->addWidget(SpinBoxTol,      4, 2, 1, 2);
 
   /***************************************************************/
   GroupButtons = new QGroupBox(this);
@@ -287,12 +291,18 @@ bool SMESHGUI_BuildCompoundDlg::ClickOnApply()
 
       SMESH::SMESH_Gen_var aSMESHGen = SMESHGUI::GetSMESHGen();
       // concatenate meshes
-      SMESH::SMESH_Mesh_var aCompoundMesh = 
-       aSMESHGen->Concatenate(myMeshArray, 
-                              !(ComboBoxUnion->currentIndex()), 
-                              CheckBoxMerge->isChecked(), 
-                              SpinBoxTol->GetValue());
-      
+      SMESH::SMESH_Mesh_var aCompoundMesh;
+      if(CheckBoxCommon->isChecked())
+       aCompoundMesh = aSMESHGen->ConcatenateWithGroups(myMeshArray, 
+                                                        !(ComboBoxUnion->currentIndex()), 
+                                                        CheckBoxMerge->isChecked(), 
+                                                        SpinBoxTol->GetValue());
+      else
+       aCompoundMesh = aSMESHGen->Concatenate(myMeshArray, 
+                                              !(ComboBoxUnion->currentIndex()), 
+                                              CheckBoxMerge->isChecked(), 
+                                              SpinBoxTol->GetValue());
+     
       SMESH::SetName( SMESH::FindSObject( aCompoundMesh ), LineEditName->text() );
       mySMESHGUI->updateObjBrowser();
     } catch(...) {
index f71222064b544ee119b919712cb9e05fc2846b85..a05fd5fe34ab74aefa4e72b46034ef98bab5bb70 100644 (file)
@@ -100,6 +100,7 @@ private:
   QLineEdit*              LineEditMeshes;
   QLabel*                 TextLabelUnion;
   QComboBox*              ComboBoxUnion;
+  QCheckBox*              CheckBoxCommon;
   QCheckBox*              CheckBoxMerge;
   QLabel*                 TextLabelTol;
   SMESHGUI_SpinBox*       SpinBoxTol;
index b0656be9e24384ffe6f43786ce346e800b93ddb6..435a7f4c28f67b1825b75d0acaab164787a3fd7c 100644 (file)
@@ -253,11 +253,14 @@ SMESHGUI_ExtrusionAlongPathDlg::SMESHGUI_ExtrusionAlongPathDlg( SMESHGUI* theMod
 
   AngleSpin = new SMESHGUI_SpinBox(AnglesGrp);
 
+  LinearAnglesCheck = new QCheckBox(tr("LINEAR_ANGLES"), AnglesGrp);
+
   // layouting
   AnglesGrpLayout->addWidget(AnglesList,        0, 0, 4, 1);
   AnglesGrpLayout->addWidget(AddAngleButton,    0, 1);
   AnglesGrpLayout->addWidget(RemoveAngleButton, 2, 1);
   AnglesGrpLayout->addWidget(AngleSpin,         0, 2);
+  AnglesGrpLayout->addWidget(LinearAnglesCheck, 4, 0);
   AnglesGrpLayout->setRowMinimumHeight(1, 10);
   AnglesGrpLayout->setRowStretch(3, 10);
 
@@ -581,17 +584,20 @@ bool SMESHGUI_ExtrusionAlongPathDlg::ClickOnApply()
   try {
     SUIT_OverrideCursor wc;
     SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor();
+    if ( LinearAnglesCheck->isChecked() )
+      anAngles = aMeshEditor->LinearAnglesVariation( myPathMesh, myPathShape, anAngles );
+
     SMESH::SMESH_MeshEditor::Extrusion_Error retVal;
     if ( MakeGroupsCheck->isEnabled() && MakeGroupsCheck->isChecked() )
       SMESH::ListOfGroups_var groups = 
-        aMeshEditor->ExtrusionAlongPathMakeGroups(anElementsId.inout(), myPathMesh,
+        aMeshEditor->ExtrusionAlongPathMakeGroups(anElementsId, myPathMesh,
                                                   myPathShape, aNodeStart,
-                                                  AnglesGrp->isChecked(), anAngles.inout(),
+                                                  AnglesGrp->isChecked(), anAngles,
                                                   BasePointGrp->isChecked(), aBasePoint, retVal);
     else
-      retVal = aMeshEditor->ExtrusionAlongPath(anElementsId.inout(), myPathMesh,
+      retVal = aMeshEditor->ExtrusionAlongPath(anElementsId, myPathMesh,
                                                myPathShape, aNodeStart,
-                                               AnglesGrp->isChecked(), anAngles.inout(),
+                                               AnglesGrp->isChecked(), anAngles,
                                                BasePointGrp->isChecked(), aBasePoint);
 
     //wc.stop();
index 82e019157ddf57ba29232ad2f32584985fc883bc..6885b738e25e7acadcea5ed41e88e42107d215a1 100644 (file)
@@ -113,6 +113,7 @@ private:
   QLineEdit*                PathShapeLineEdit;
   QToolButton*              SelectStartPointButton;
   QLineEdit*                StartPointLineEdit;
+  QCheckBox*                LinearAnglesCheck;
   QGroupBox*                AnglesGrp;
   QListWidget*              AnglesList;
   QToolButton*              AddAngleButton;
diff --git a/src/SMESHGUI/SMESHGUI_FileInfoDlg.cxx b/src/SMESHGUI/SMESHGUI_FileInfoDlg.cxx
new file mode 100644 (file)
index 0000000..110b57a
--- /dev/null
@@ -0,0 +1,77 @@
+// SMESH SMESHGUI : GUI for SMESH component
+//
+// Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS 
+//
+// This library is free software; you can redistribute it and/or 
+// modify it under the terms of the GNU Lesser General Public 
+// License as published by the Free Software Foundation; either 
+// version 2.1 of the License. 
+//
+// This library is distributed in the hope that it will be useful, 
+// but WITHOUT ANY WARRANTY; without even the implied warranty of 
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public 
+// License along with this library; if not, write to the Free Software 
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+// File   : SMESHGUI_FileInfoDlg.cxx
+// Author : Alexandre SOLOVYOV, Open CASCADE S.A.S. (alexander.solovyov@opencascade.com)
+//
+
+#include "SMESHGUI_FileInfoDlg.h"
+
+#include <MED_Common.hxx>
+
+#include <QGridLayout>
+#include <QLabel>
+#include <QLineEdit>
+
+SMESHGUI_FileInfoDlg::SMESHGUI_FileInfoDlg( QWidget* parent, SALOME_MED::MedFileInfo* inf )
+  : QtxDialog( parent, true, true, QtxDialog::OK )
+{
+  setWindowTitle( tr( "CAPTION" ) );
+  setSizeGripEnabled( true );
+  
+  QLineEdit* fname = new QLineEdit( mainFrame() );
+  fname->setReadOnly( true );
+  QLineEdit* fsize = new QLineEdit( mainFrame() );
+  fsize->setReadOnly( true );
+  QLineEdit* medversion = new QLineEdit( mainFrame() );
+  medversion->setReadOnly( true );
+  fname->setMinimumWidth( 300 );
+  
+  QGridLayout* lay = new QGridLayout( mainFrame() );
+  lay->setMargin( 5 ); lay->setSpacing( 5 );
+  lay->addWidget( new QLabel( tr( "FILE_NAME" ), mainFrame() ), 0, 0 );
+  lay->addWidget( fname, 0, 1 );
+  lay->addWidget( new QLabel( tr( "FILE_SIZE" ), mainFrame() ), 1, 0 );
+  lay->addWidget( fsize, 1, 1 );
+  lay->addWidget( new QLabel( tr( "MED_VERSION" ), mainFrame() ), 2, 0 );
+  lay->addWidget( medversion, 2, 1 );
+
+  fname->setText( (char*)inf->fileName );
+  fname->home( false );
+  fsize->setText( QString::number( inf->fileSize ) );
+
+  QString version;
+  if( inf->major>=0 )
+  {
+    version = QString::number( inf->major );
+    if( inf->minor>=0 )
+    {
+      version += "." + QString::number( inf->minor );
+      if( inf->release>=0 )
+        version += "." + QString::number( inf->release );
+    }
+  }
+  medversion->setText( version );
+}
+
+SMESHGUI_FileInfoDlg::~SMESHGUI_FileInfoDlg()
+{
+}
diff --git a/src/SMESHGUI/SMESHGUI_FileInfoDlg.h b/src/SMESHGUI/SMESHGUI_FileInfoDlg.h
new file mode 100644 (file)
index 0000000..c6c1138
--- /dev/null
@@ -0,0 +1,43 @@
+// SMESH SMESHGUI : GUI for SMESH component
+//
+// Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS 
+//
+// This library is free software; you can redistribute it and/or 
+// modify it under the terms of the GNU Lesser General Public 
+// License as published by the Free Software Foundation; either 
+// version 2.1 of the License. 
+//
+// This library is distributed in the hope that it will be useful, 
+// but WITHOUT ANY WARRANTY; without even the implied warranty of 
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public 
+// License along with this library; if not, write to the Free Software 
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+// File   : SMESHGUI_FileInfoDlg.h
+// Author : Alexandre SOLOVYOV, Open CASCADE S.A.S. (alexander.solovyov@opencascade.com)
+//
+
+#ifndef SMESHGUI_FILEINFODLG_H
+#define SMESHGUI_FILEINFODLG_H
+
+#include <QtxDialog.h>
+
+#include <SALOMEconfig.h>
+#include CORBA_CLIENT_HEADER(MED)
+
+class SMESHGUI_FileInfoDlg : public QtxDialog
+{
+  Q_OBJECT
+
+public:
+  SMESHGUI_FileInfoDlg( QWidget*, SALOME_MED::MedFileInfo* );
+  virtual ~SMESHGUI_FileInfoDlg();
+};
+
+#endif // SMESHGUI_FILEINFODLG_H
index 6e7587fe975347650e4355fd1f8b200c6b62d8e2..037a355b0ece5ec03301c28db88027c92afc2606 100644 (file)
@@ -32,6 +32,7 @@
 #include "SMESHGUI_VTKUtils.h"
 #include "SMESHGUI_MeshUtils.h"
 #include "SMESHGUI_IdValidator.h"
+#include "SMESHGUI_MeshEditPreview.h"
 
 #include <SMESH_Actor.h>
 #include <SMESH_TypeFilter.hxx>
 
 #include <LightApp_Application.h>
 #include <LightApp_SelectionMgr.h>
+#include <SalomeApp_Application.h>
 
 #include <SVTK_ViewWindow.h>
 #include <SVTK_Selector.h>
 #include <SALOME_ListIO.hxx>
+#include <VTKViewer_CellLocationsArray.h>
 
 // OCCT includes
 #include <TColStd_MapOfInteger.hxx>
@@ -87,6 +90,8 @@ SMESHGUI_RevolutionDlg::SMESHGUI_RevolutionDlg( SMESHGUI* theModule )
     mySMESHGUI( theModule ),
     mySelectionMgr( SMESH::GetSelectionMgr( theModule ) )
 {
+  mySimulation = new SMESHGUI_MeshEditPreview(SMESH::GetViewWindow( mySMESHGUI ));
+
   SUIT_ResourceMgr* mgr = SMESH::GetResourceMgr( mySMESHGUI );
   QPixmap image0 ( mgr->loadPixmap("SMESH", tr("ICON_DLG_EDGE")));
   QPixmap image1 ( mgr->loadPixmap("SMESH", tr("ICON_DLG_TRIANGLE")));
@@ -187,18 +192,38 @@ SMESHGUI_RevolutionDlg::SMESHGUI_RevolutionDlg( SMESHGUI* theModule )
   GroupAxisLayout->addWidget(TextLabelDZ,        1, 6);
   GroupAxisLayout->addWidget(SpinBox_DZ,         1, 7);
 
-  // Controls for angle defining
-  TextLabelAngle = new QLabel(tr("SMESH_ANGLE"), GroupArguments);
-  SpinBox_Angle = new SMESHGUI_SpinBox(GroupArguments);
+  // Controls for angle defining & number of steps defining
+  GroupAngleBox = new QGroupBox(tr("SMESH_ANGLE"), GroupArguments);
+  GroupAngle = new QButtonGroup(GroupAngleBox);
+  QGridLayout* GroupAngleLayout = new QGridLayout(GroupAngleBox);
+  GroupAngleLayout->setSpacing(6);
+  GroupAngleLayout->setMargin(11);
+
+  RadioButton3 = new QRadioButton(tr("ANGLE_BY_STEP"), GroupAngleBox);
+  RadioButton4 = new QRadioButton(tr("TOTAL_ANGLE"),   GroupAngleBox);
+  GroupAngle->addButton(RadioButton3, 0);
+  GroupAngle->addButton(RadioButton4, 1);
+
+  TextLabelAngle = new QLabel(tr("SMESH_ANGLE"), GroupAngleBox);
+  SpinBox_Angle = new SMESHGUI_SpinBox(GroupAngleBox);
 
-  // Controls for nb. steps defining
-  TextLabelNbSteps = new QLabel(tr("SMESH_NUMBEROFSTEPS"), GroupArguments);
-  SpinBox_NbSteps = new QSpinBox(GroupArguments);
+  TextLabelNbSteps = new QLabel(tr("SMESH_NUMBEROFSTEPS"), GroupAngleBox);
+  SpinBox_NbSteps = new QSpinBox(GroupAngleBox);
+
+  GroupAngleLayout->addWidget(RadioButton3,     0, 0);
+  GroupAngleLayout->addWidget(RadioButton4,     0, 1);
+  GroupAngleLayout->addWidget(TextLabelAngle,   1, 0);
+  GroupAngleLayout->addWidget(SpinBox_Angle,    1, 1);
+  GroupAngleLayout->addWidget(TextLabelNbSteps, 2, 0);
+  GroupAngleLayout->addWidget(SpinBox_NbSteps,  2, 1);
 
   // Controls for tolerance defining
   TextLabelTolerance = new QLabel(tr("SMESH_TOLERANCE"), GroupArguments);
   SpinBox_Tolerance = new SMESHGUI_SpinBox(GroupArguments);
 
+  // Control for mesh preview
+  CheckBoxPreview = new QCheckBox(tr("PREVIEW"), GroupArguments);
+
   // CheckBox for groups generation
   MakeGroupsCheck = new QCheckBox(tr("SMESH_MAKE_GROUPS"), GroupArguments);
   MakeGroupsCheck->setChecked(true);
@@ -208,12 +233,10 @@ SMESHGUI_RevolutionDlg::SMESHGUI_RevolutionDlg( SMESHGUI* theModule )
   GroupArgumentsLayout->addWidget(LineEditElements,     0, 2);
   GroupArgumentsLayout->addWidget(CheckBoxMesh,         1, 0, 1, 3);
   GroupArgumentsLayout->addWidget(GroupAxis,            2, 0, 1, 3);
-  GroupArgumentsLayout->addWidget(TextLabelAngle,       3, 0, 1, 2);
-  GroupArgumentsLayout->addWidget(SpinBox_Angle,        3, 2);
-  GroupArgumentsLayout->addWidget(TextLabelNbSteps,     4, 0, 1, 2);
-  GroupArgumentsLayout->addWidget(SpinBox_NbSteps,      4, 2);
-  GroupArgumentsLayout->addWidget(TextLabelTolerance,   5, 0, 1, 2);
-  GroupArgumentsLayout->addWidget(SpinBox_Tolerance,    5, 2);
+  GroupArgumentsLayout->addWidget(GroupAngleBox,        3, 0, 1, 3);
+  GroupArgumentsLayout->addWidget(TextLabelTolerance,   4, 0, 1, 2);
+  GroupArgumentsLayout->addWidget(SpinBox_Tolerance,    4, 2);
+  GroupArgumentsLayout->addWidget(CheckBoxPreview,      5, 0, 1, 3);
   GroupArgumentsLayout->addWidget(MakeGroupsCheck,      6, 0, 1, 3);
 
   /***************************************************************/
@@ -253,6 +276,8 @@ SMESHGUI_RevolutionDlg::SMESHGUI_RevolutionDlg( SMESHGUI* theModule )
   SpinBox_DY->RangeStepAndValidator(COORD_MIN, COORD_MAX, 10.0, 3);
   SpinBox_DZ->RangeStepAndValidator(COORD_MIN, COORD_MAX, 10.0, 3);
 
+  RadioButton3->setChecked(true);
+
   SpinBox_Angle->RangeStepAndValidator(COORD_MIN, COORD_MAX, 5.0, 3);
 
   SpinBox_NbSteps->setRange(1, 999999);
@@ -291,6 +316,10 @@ SMESHGUI_RevolutionDlg::SMESHGUI_RevolutionDlg( SMESHGUI* theModule )
   connect(SelectPointButton,    SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
   connect(SelectVectorButton,   SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
 
+  connect(SpinBox_X,  SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation()));
+  connect(SpinBox_Y,  SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation()));
+  connect(SpinBox_Z,  SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation()));
+
   connect(SpinBox_DX, SIGNAL(valueChanged(double)), this, SLOT(onVectorChanged()));
   connect(SpinBox_DY, SIGNAL(valueChanged(double)), this, SLOT(onVectorChanged()));
   connect(SpinBox_DZ, SIGNAL(valueChanged(double)), this, SLOT(onVectorChanged()));
@@ -302,6 +331,12 @@ SMESHGUI_RevolutionDlg::SMESHGUI_RevolutionDlg( SMESHGUI* theModule )
   connect(LineEditElements, SIGNAL(textChanged(const QString&)),   SLOT(onTextChange(const QString&)));
   connect(CheckBoxMesh,     SIGNAL(toggled(bool)),                 SLOT(onSelectMesh(bool)));
 
+  connect(GroupAngle,        SIGNAL(buttonClicked(int)),   this, SLOT(toDisplaySimulation()));
+  connect(SpinBox_Angle,     SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation()));
+  connect(SpinBox_NbSteps,   SIGNAL(valueChanged(int)),    this, SLOT(toDisplaySimulation()));
+  connect(SpinBox_Tolerance, SIGNAL(valueChanged(double)), this, SLOT(toDisplaySimulation()));
+  connect(CheckBoxPreview,   SIGNAL(toggled(bool)),        this, SLOT(onDisplaySimulation(bool)));
+
   ConstructorsClicked(0);
   SelectionIntoArgument();
 }
@@ -312,7 +347,7 @@ SMESHGUI_RevolutionDlg::SMESHGUI_RevolutionDlg( SMESHGUI* theModule )
 //=================================================================================
 SMESHGUI_RevolutionDlg::~SMESHGUI_RevolutionDlg()
 {
-  // no need to delete child widgets, Qt does it all for us
+  delete mySimulation;
 }
 
 //=================================================================================
@@ -345,6 +380,8 @@ void SMESHGUI_RevolutionDlg::Init (bool ResetControls)
 
     CheckBoxMesh->setChecked(false);
     onSelectMesh(false);
+    CheckBoxPreview->setChecked(false);
+    onDisplaySimulation(false);
   }
 }
 
@@ -354,7 +391,17 @@ void SMESHGUI_RevolutionDlg::Init (bool ResetControls)
 //=================================================================================
 void SMESHGUI_RevolutionDlg::ConstructorsClicked (int constructorId)
 {
-  disconnect(mySelectionMgr, 0, this, 0);
+  //disconnect(mySelectionMgr, 0, this, 0);
+
+  SALOME_ListIO io;
+  mySelectionMgr->selectedObjects( io );
+  SALOME_ListIO aList;
+  mySelectionMgr->setSelectedObjects( aList );
+//   LineEditElements->clear();
+  myNbOkElements = 0;
+  buttonApply->setEnabled(false);
+  buttonOk->setEnabled(false);
+  mySimulation->SetVisibility(false);
 
   Selection_Mode aSelMode = ActorSelection;
 
@@ -389,7 +436,8 @@ void SMESHGUI_RevolutionDlg::ConstructorsClicked (int constructorId)
   if (CheckBoxMesh->isChecked())
     onSelectMesh(true);
 
-  connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
+  //connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
+  mySelectionMgr->setSelectedObjects( io );
 }
 
 //=================================================================================
@@ -423,6 +471,9 @@ void SMESHGUI_RevolutionDlg::ClickOnApply()
     long aNbSteps = (long)SpinBox_NbSteps->value();
     double aTolerance = SpinBox_Tolerance->GetValue();
 
+    if ( GroupAngle->checkedId() == 1 )
+      anAngle = anAngle/aNbSteps;
+
     try {
       SUIT_OverrideCursor aWaitCursor;
       SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor();
@@ -544,6 +595,7 @@ void SMESHGUI_RevolutionDlg::onTextChange (const QString& theNewText)
     buttonOk->setEnabled(true);
     buttonApply->setEnabled(true);
   }
+  onDisplaySimulation(true);
 
   myBusy = false;
 }
@@ -714,6 +766,8 @@ void SMESHGUI_RevolutionDlg::SelectionIntoArgument()
     buttonOk->setEnabled(true);
     buttonApply->setEnabled(true);
   }
+
+  onDisplaySimulation(true);
 }
 
 //=================================================================================
@@ -729,6 +783,7 @@ void SMESHGUI_RevolutionDlg::SetEditCurrentArgument()
   mySelectionMgr->clearFilters();
 
   if (send == SelectElementsButton) {
+    mySimulation->SetVisibility(false);
     myEditCurrentArgument = (QWidget*)LineEditElements;
     SMESH::SetPointRepresentation(false);
     if (CheckBoxMesh->isChecked()) {
@@ -842,6 +897,7 @@ void SMESHGUI_RevolutionDlg::onSelectMesh (bool toSelectMesh)
 
   if (myEditCurrentArgument != LineEditElements) {
     LineEditElements->clear();
+    mySimulation->SetVisibility(false);
     return;
   }
 
@@ -870,6 +926,7 @@ void SMESHGUI_RevolutionDlg::onSelectMesh (bool toSelectMesh)
     LineEditElements->setReadOnly(false);
     LineEditElements->setValidator(myIdValidator);
     onTextChange(LineEditElements->text());
+    mySimulation->SetVisibility(false);
   }
 
   SelectionIntoArgument();
@@ -908,6 +965,7 @@ void SMESHGUI_RevolutionDlg::onVectorChanged()
     buttonOk->setEnabled(false);
     buttonApply->setEnabled(false);
   }
+  onDisplaySimulation(true);
 }
 
 //=================================================================================
@@ -925,3 +983,71 @@ void SMESHGUI_RevolutionDlg::keyPressEvent( QKeyEvent* e )
     ClickOnHelp();
   }
 }
+
+//=================================================================================
+// function : toDisplaySimulation()
+// purpose  :
+//=================================================================================
+void SMESHGUI_RevolutionDlg::toDisplaySimulation()
+{
+  onDisplaySimulation(true);
+}
+
+//=================================================================================
+// function : onDisplaySimulation()
+// purpose  :
+//=================================================================================
+void SMESHGUI_RevolutionDlg::onDisplaySimulation(bool toDisplayPreview)
+{
+  if (CheckBoxPreview->isChecked() && toDisplayPreview)
+  {
+    //display preview
+    if (myNbOkElements && IsAxisOk())
+    {
+      QStringList aListElementsId = myElementsId.split(" ", QString::SkipEmptyParts);
+      
+      SMESH::long_array_var anElementsId = new SMESH::long_array;
+      
+      anElementsId->length(aListElementsId.count());
+      for (int i = 0; i < aListElementsId.count(); i++)
+       anElementsId[i] = aListElementsId[i].toInt();
+      
+      SMESH::AxisStruct anAxis;
+      
+      anAxis.x =  SpinBox_X->GetValue();
+      anAxis.y =  SpinBox_Y->GetValue();
+      anAxis.z =  SpinBox_Z->GetValue();
+      anAxis.vx = SpinBox_DX->GetValue();
+      anAxis.vy = SpinBox_DY->GetValue();
+      anAxis.vz = SpinBox_DZ->GetValue();
+      
+      double anAngle = (SpinBox_Angle->GetValue())*PI/180;
+      long aNbSteps = (long)SpinBox_NbSteps->value();
+      double aTolerance = SpinBox_Tolerance->GetValue();
+      
+      if (GroupAngle->checkedId() == 1)
+       anAngle = anAngle/aNbSteps;
+      
+      try {
+       SUIT_OverrideCursor aWaitCursor;
+       SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditPreviewer();
+       aMeshEditor->RotationSweep(anElementsId.inout(), 
+                                  anAxis, 
+                                  anAngle, 
+                                  aNbSteps, 
+                                  aTolerance);
+       SMESH::MeshPreviewStruct_var aMeshPreviewStruct = aMeshEditor->GetPreviewData();
+       mySimulation->SetData(aMeshPreviewStruct._retn());
+      } catch (...) {}
+    }
+    else
+    {
+      mySimulation->SetVisibility(false);
+    }
+  }
+  else
+  {
+    //erase preview
+    mySimulation->SetVisibility(false);
+  }
+}
index 098cf7a189a3802feda1290cc0e5c71c332a8ff0..206d737ebdc049adf882c840b8e70f9edc7e0643 100644 (file)
@@ -51,6 +51,8 @@ class SMESH_Actor;
 class SVTK_Selector;
 class LightApp_SelectionMgr;
 class SMESH_LogicalFilter;
+class SALOME_Actor;
+class SMESHGUI_MeshEditPreview;
 
 //=================================================================================
 // class    : SMESHGUI_RevolutionDlg
@@ -65,83 +67,92 @@ public:
   ~SMESHGUI_RevolutionDlg();
 
 private:
-  void                    Init( bool = true);
-  void                    closeEvent( QCloseEvent* );
-  void                    enterEvent( QEvent* );           /* mouse enter the QWidget */
-  void                    hideEvent( QHideEvent* );        /* ESC key */
-  void                    keyPressEvent( QKeyEvent* );
-  int                     GetConstructorId();
-  bool                    IsAxisOk();
+  void                      Init( bool = true);
+  void                      closeEvent( QCloseEvent* );
+  void                      enterEvent( QEvent* );           /* mouse enter the QWidget */
+  void                      hideEvent( QHideEvent* );        /* ESC key */
+  void                      keyPressEvent( QKeyEvent* );
+  int                       GetConstructorId();
+  bool                      IsAxisOk();
   
-  SMESHGUI*               mySMESHGUI;              /* Current SMESHGUI object */
-  SMESHGUI_IdValidator*   myIdValidator;
-  LightApp_SelectionMgr*  mySelectionMgr;          /* User shape selection */
-  int                     myNbOkElements;          /* to check when elements are defined */
-  QString                 myElementsId;
-  QWidget*                myEditCurrentArgument;   /* Current  argument */
-  SVTK_Selector*          mySelector;
+  SMESHGUI*                 mySMESHGUI;              /* Current SMESHGUI object */
+  SMESHGUI_IdValidator*     myIdValidator;
+  LightApp_SelectionMgr*    mySelectionMgr;          /* User shape selection */
+  int                       myNbOkElements;          /* to check when elements are defined */
+  QString                   myElementsId;
+  QWidget*                  myEditCurrentArgument;   /* Current  argument */
+  SVTK_Selector*            mySelector;
   
-  bool                    myBusy;
-  SMESH::SMESH_Mesh_var   myMesh;
-  SMESH_Actor*            myActor;
-  SMESH_LogicalFilter*    myMeshOrSubMeshOrGroupFilter;
+  bool                      myBusy;
+  SMESH::SMESH_Mesh_var     myMesh;
+  SMESH_Actor*              myActor;
+  SMESH_LogicalFilter*      myMeshOrSubMeshOrGroupFilter;
+  SMESHGUI_MeshEditPreview* mySimulation;
+  SALOME_Actor*             myPreviewActor;
 
-  QGroupBox*              ConstructorsBox;
-  QButtonGroup*           GroupConstructors;
-  QRadioButton*           RadioButton1;
-  QRadioButton*           RadioButton2;
-  QGroupBox*              GroupButtons;
-  QPushButton*            buttonOk;
-  QPushButton*            buttonCancel;
-  QPushButton*            buttonApply;
-  QPushButton*            buttonHelp;
-  QGroupBox*              GroupArguments;
-  QGroupBox*              GroupAxis;
-  QLabel*                 TextLabelElements;
-  QPushButton*            SelectElementsButton;
-  QLineEdit*              LineEditElements;
-  QCheckBox*              CheckBoxMesh;
-  QCheckBox*              MakeGroupsCheck;
+  QGroupBox*                ConstructorsBox;
+  QButtonGroup*             GroupConstructors;
+  QRadioButton*             RadioButton1;
+  QRadioButton*             RadioButton2;
+  QGroupBox*                GroupButtons;
+  QPushButton*              buttonOk;
+  QPushButton*              buttonCancel;
+  QPushButton*              buttonApply;
+  QPushButton*              buttonHelp;
+  QGroupBox*                GroupArguments;
+  QGroupBox*                GroupAxis;
+  QLabel*                   TextLabelElements;
+  QPushButton*              SelectElementsButton;
+  QLineEdit*                LineEditElements;
+  QCheckBox*                CheckBoxMesh;
+  QCheckBox*                MakeGroupsCheck;
+  QGroupBox*                GroupAngleBox;
+  QButtonGroup*             GroupAngle;
+  QRadioButton*             RadioButton3;
+  QRadioButton*             RadioButton4;
+  QCheckBox*                CheckBoxPreview;
   
-  QLabel*                 TextLabelPoint;
-  QPushButton*            SelectPointButton;
-  QLabel*                 TextLabelX;
-  SMESHGUI_SpinBox*       SpinBox_X;
-  QLabel*                 TextLabelY;
-  SMESHGUI_SpinBox*       SpinBox_Y;
-  QLabel*                 TextLabelZ;
-  SMESHGUI_SpinBox*       SpinBox_Z;
-  QLabel*                 TextLabelVector;
-  QPushButton*            SelectVectorButton;
-  QLabel*                 TextLabelDX;
-  SMESHGUI_SpinBox*       SpinBox_DX;
-  QLabel*                 TextLabelDY;
-  SMESHGUI_SpinBox*       SpinBox_DY;
-  QLabel*                 TextLabelDZ;
-  SMESHGUI_SpinBox*       SpinBox_DZ;
+  QLabel*                   TextLabelPoint;
+  QPushButton*              SelectPointButton;
+  QLabel*                   TextLabelX;
+  SMESHGUI_SpinBox*         SpinBox_X;
+  QLabel*                   TextLabelY;
+  SMESHGUI_SpinBox*         SpinBox_Y;
+  QLabel*                   TextLabelZ;
+  SMESHGUI_SpinBox*         SpinBox_Z;
+  QLabel*                   TextLabelVector;
+  QPushButton*              SelectVectorButton;
+  QLabel*                   TextLabelDX;
+  SMESHGUI_SpinBox*         SpinBox_DX;
+  QLabel*                   TextLabelDY;
+  SMESHGUI_SpinBox*         SpinBox_DY;
+  QLabel*                   TextLabelDZ;
+  SMESHGUI_SpinBox*         SpinBox_DZ;
   
-  QLabel*                 TextLabelAngle;
-  SMESHGUI_SpinBox*       SpinBox_Angle;
-  QLabel*                 TextLabelNbSteps;
-  QSpinBox*               SpinBox_NbSteps;
-  QLabel*                 TextLabelTolerance;
-  SMESHGUI_SpinBox*       SpinBox_Tolerance;
+  QLabel*                   TextLabelAngle;
+  SMESHGUI_SpinBox*         SpinBox_Angle;
+  QLabel*                   TextLabelNbSteps;
+  QSpinBox*                 SpinBox_NbSteps;
+  QLabel*                   TextLabelTolerance;
+  SMESHGUI_SpinBox*         SpinBox_Tolerance;
   
-  QString                 myHelpFileName;
+  QString                   myHelpFileName;
   
 private slots:
-  void                    ConstructorsClicked( int );
-  void                    ClickOnOk();
-  void                    ClickOnCancel();
-  void                    ClickOnApply();
-  void                    ClickOnHelp();
-  void                    SetEditCurrentArgument();
-  void                    SelectionIntoArgument();
-  void                    DeactivateActiveDialog();
-  void                    ActivateThisDialog();
-  void                    onTextChange( const QString& );
-  void                    onSelectMesh( bool );
-  void                    onVectorChanged();
+  void                      ConstructorsClicked( int );
+  void                      ClickOnOk();
+  void                      ClickOnCancel();
+  void                      ClickOnApply();
+  void                      ClickOnHelp();
+  void                      SetEditCurrentArgument();
+  void                      SelectionIntoArgument();
+  void                      DeactivateActiveDialog();
+  void                      ActivateThisDialog();
+  void                      onTextChange( const QString& );
+  void                      onSelectMesh( bool );
+  void                      onVectorChanged();
+  void                      toDisplaySimulation();
+  void                      onDisplaySimulation( bool );
 };
 
 #endif // SMESHGUI_REVOLUTIONDLG_H
index af48b3008e2d087d65f155771ef455b55775acf7..6ec33b7ce98b5baa7f0c675c9703a640b00a5ddd 100644 (file)
@@ -114,6 +114,8 @@ QVariant SMESHGUI_Selection::parameter( const int ind, const QString& p ) const
   else if ( p=="displayMode" )   val = QVariant( displayMode( ind ) );
   else if ( p=="isComputable" )  val = QVariant( isComputable( ind ) );
   else if ( p=="hasReference" )  val = QVariant( hasReference( ind ) );
+  else if ( p=="isImported" )    val = QVariant( isImported( ind ) );
+
 
   if( val.isValid() )
     return val;
@@ -486,3 +488,20 @@ QString SMESHGUI_Selection::typeName( const int t )
     return "Unknown";
   }
 }
+
+bool SMESHGUI_Selection::isImported( const int ind ) const
+{
+  QString e = entry( ind );
+  _PTR(SObject) SO = SMESH::GetActiveStudyDocument()->FindObjectID( e.toLatin1().constData() );
+  bool res = false;
+  if( SO )
+  {
+    SMESH::SMESH_Mesh_var aMesh = SMESH::SMESH_Mesh::_narrow( SMESH::SObjectToObject( SO ) );
+    if( !aMesh->_is_nil() )
+    {
+      SALOME_MED::MedFileInfo* inf = aMesh->GetMEDFileInfo();
+      res = strlen( (char*)inf->fileName ) > 0;
+    }
+  }
+  return res;
+}
index 2b77aaf3fc90ad35406d762ec726d5deec3bea7e..4d1ba4a636f93df5238fe4b115bc3d75e13f5e56 100644 (file)
@@ -70,6 +70,8 @@ public:
   static int              type( const QString&, _PTR(Study) );
   static QString          typeName( const int );
 
+  bool                    isImported( const int ) const;
+
 private:
   QStringList             myTypes;
   QList<SMESH_Actor*>     myActors;
index ecad9b6c914e7d21254786d6a6a2759082644e8f..80b0c61061a1bfaad0e0cf0e8bafcf2d267087af 100644 (file)
@@ -2727,6 +2727,10 @@ Consider saving your work before application crash</translation>
             <source>WARP_ELEMENTS</source>
             <translation>Warping</translation>
         </message>
+        <message>
+            <source>MEN_FILE_INFO</source>
+            <translation>MED file information</translation>
+        </message>
     </context>
     <context>
         <name>SMESHGUI</name>
@@ -4093,7 +4097,7 @@ It is impossible to read point coordinates from file</translation>
         <name>SMESHGUI_RevolutionDlg</name>
         <message>
             <source>ANGLE_BY_STEP</source>
-            <translation>Use Angle by Step</translation>
+            <translation>Angle by Step</translation>
         </message>
         <message>
             <source>PREVIEW</source>
@@ -4113,7 +4117,7 @@ It is impossible to read point coordinates from file</translation>
         </message>
         <message>
             <source>TOTAL_ANGLE</source>
-            <translation>Use Total Angle</translation>
+            <translation>Total Angle</translation>
         </message>
     </context>
     <context>
@@ -4308,4 +4312,23 @@ It is impossible to read point coordinates from file</translation>
             <translation>Gravity center</translation>
         </message>
     </context>
+    <context>
+        <name>SMESHGUI_FileInfoDlg</name>
+        <message>
+            <source>CAPTION</source>
+            <translation>File information</translation>
+        </message>
+        <message>
+            <source>FILE_NAME</source>
+            <translation>File name</translation>
+        </message>
+        <message>
+            <source>FILE_SIZE</source>
+            <translation>File size (bytes)</translation>
+        </message>
+        <message>
+            <source>MED_VERSION</source>
+            <translation>MED version</translation>
+        </message>
+    </context>
 </TS>
index f933abfb709f24d771961ac160ccce74ddef6d9b..c9d70e0bf315b236e860f33e6dd4314d11dc1e28 100644 (file)
@@ -338,7 +338,8 @@ void _pyGen::Process( const Handle(_pyCommand)& theCommand )
   }
 
   // Concatenate( [mesh1, ...], ... )
-  if ( theCommand->GetMethod() == "Concatenate" )
+  if ( theCommand->GetMethod() == "Concatenate" ||
+       theCommand->GetMethod() == "ConcatenateWithGroups")
   {
     AddMeshAccessorMethod( theCommand );
   }
index f05003b01e792dca700248e5fe9373e074bbe896..a27316fa37e4694b02afde3fb3fc2468c32a1d4e 100644 (file)
@@ -1418,6 +1418,52 @@ SMESH::SMESH_Mesh_ptr SMESH_Gen_i::Concatenate(const SMESH::mesh_array& theMeshe
                                               CORBA::Boolean           theMergeNodesAndElements, 
                                               CORBA::Double            theMergeTolerance)
   throw ( SALOME::SALOME_Exception )
+{
+  return ConcatenateCommon(theMeshesArray,
+                          theUniteIdenticalGroups,
+                          theMergeNodesAndElements,
+                          theMergeTolerance,
+                          false);
+}
+
+//================================================================================
+/*!
+ *  SMESH_Gen_i::ConcatenateWithGroups
+ *
+ *  Concatenate the given meshes into one mesh
+ *  Create the groups of all elements from initial meshes
+ */
+//================================================================================
+
+SMESH::SMESH_Mesh_ptr
+SMESH_Gen_i::ConcatenateWithGroups(const SMESH::mesh_array& theMeshesArray,
+                                  CORBA::Boolean           theUniteIdenticalGroups, 
+                                   CORBA::Boolean           theMergeNodesAndElements, 
+                                   CORBA::Double            theMergeTolerance)
+  throw ( SALOME::SALOME_Exception )
+{
+  return ConcatenateCommon(theMeshesArray,
+                           theUniteIdenticalGroups,
+                           theMergeNodesAndElements,
+                           theMergeTolerance,
+                          true);
+}
+
+//================================================================================
+/*!
+ *  SMESH_Gen_i::ConcatenateCommon
+ *
+ *  Concatenate the given meshes into one mesh
+ */
+//================================================================================
+
+SMESH::SMESH_Mesh_ptr
+SMESH_Gen_i::ConcatenateCommon(const SMESH::mesh_array& theMeshesArray,
+                              CORBA::Boolean           theUniteIdenticalGroups, 
+                               CORBA::Boolean           theMergeNodesAndElements, 
+                               CORBA::Double            theMergeTolerance,
+                              CORBA::Boolean           theCommonGroups)
+  throw ( SALOME::SALOME_Exception )
 {
   typedef map<int, int> TIDsMap;
   typedef list<SMESH::SMESH_Group_var> TListOfNewGroups;
@@ -1458,6 +1504,23 @@ SMESH::SMESH_Mesh_ptr SMESH_Gen_i::Concatenate(const SMESH::mesh_array& theMeshe
            const SMDS_MeshElement* aNewElem = 0;
            int anElemNbNodes = 0;
 
+           int anNbNodes   = 0;
+           int anNbEdges   = 0;
+           int anNbFaces   = 0;
+           int anNbVolumes = 0;
+
+           SMESH::long_array_var anIDsNodes   = new SMESH::long_array();
+           SMESH::long_array_var anIDsEdges   = new SMESH::long_array();
+           SMESH::long_array_var anIDsFaces   = new SMESH::long_array();
+           SMESH::long_array_var anIDsVolumes = new SMESH::long_array();
+
+           if( theCommonGroups ) {
+             anIDsNodes->length(   anInitMeshDS->NbNodes()   );
+             anIDsEdges->length(   anInitMeshDS->NbEdges()   );
+             anIDsFaces->length(   anInitMeshDS->NbFaces()   );
+             anIDsVolumes->length( anInitMeshDS->NbVolumes() );
+           }
+
            for ( int j = 0; itElems->more(); j++) {
              anElem = itElems->next();
              SMDSAbs_ElementType anElemType = anElem->GetType();
@@ -1474,6 +1537,8 @@ SMESH::SMESH_Mesh_ptr SMESH_Gen_i::Concatenate(const SMESH::mesh_array& theMeshe
                if ( nodesMap.find(aNode->GetID()) == nodesMap.end() ) {
                  aNewNode = aNewMeshDS->AddNode(aNode->X(), aNode->Y(), aNode->Z());
                  nodesMap.insert( make_pair(aNode->GetID(), aNewNode->GetID()) );
+                 if( theCommonGroups )
+                   anIDsNodes[anNbNodes++] = aNewNode->GetID();
                }
                else
                  aNewNode = aNewMeshDS->FindNode( nodesMap.find(aNode->GetID())->second );
@@ -1489,6 +1554,8 @@ SMESH::SMESH_Mesh_ptr SMESH_Gen_i::Concatenate(const SMESH::mesh_array& theMeshe
                    aNewElem = aNewMeshDS->AddPolyhedralVolume(aNodesArray, 
                                                               aVolume->GetQuanities());
                    elemsMap.insert(make_pair(anElem->GetID(), aNewElem->GetID()));
+                   if( theCommonGroups )
+                     anIDsVolumes[anNbVolumes++] = aNewElem->GetID();
                  }
                }
              else {
@@ -1497,6 +1564,14 @@ SMESH::SMESH_Mesh_ptr SMESH_Gen_i::Concatenate(const SMESH::mesh_array& theMeshe
                                                 anElemType,
                                                 anElem->IsPoly());
                elemsMap.insert(make_pair(anElem->GetID(), aNewElem->GetID()));
+               if( theCommonGroups ) {
+                 if( anElemType == SMDSAbs_Edge )
+                   anIDsEdges[anNbEdges++] = aNewElem->GetID();
+                 else if( anElemType == SMDSAbs_Face )
+                   anIDsFaces[anNbFaces++] = aNewElem->GetID();
+                 else if( anElemType == SMDSAbs_Volume )
+                   anIDsVolumes[anNbVolumes++] = aNewElem->GetID();
+               }
              } 
            }//elems loop
            
@@ -1507,12 +1582,81 @@ SMESH::SMESH_Mesh_ptr SMESH_Gen_i::Concatenate(const SMESH::mesh_array& theMeshe
            SMESH::long_array_var anInitIDs = new SMESH::long_array();
            SMESH::long_array_var anNewIDs = new SMESH::long_array();
            SMESH::SMESH_Group_var aNewGroup;
+
+           SMESH::ElementType aGroupType;
+           CORBA::String_var aGroupName;
+           if ( theCommonGroups ) {
+             for(aGroupType=SMESH::NODE;aGroupType<=SMESH::VOLUME;aGroupType=(SMESH::ElementType)(aGroupType+1)) {
+               string str = "Gr";
+               SALOMEDS::SObject_var aMeshSObj = ObjectToSObject( myCurrentStudy, anInitMesh );
+               if(aMeshSObj)
+                 str += aMeshSObj->GetName();
+               str += "_";
+
+               int anLen = 0;
+
+               switch(aGroupType) {
+               case SMESH::NODE:
+                 str += "Nodes";
+                 anIDsNodes->length(anNbNodes);
+                 anLen = anNbNodes;
+                 break;
+               case SMESH::EDGE:
+                 str += "Edges";
+                 anIDsEdges->length(anNbEdges);
+                 anLen = anNbEdges;
+                 break;
+               case SMESH::FACE:
+                 str += "Faces";
+                 anIDsFaces->length(anNbFaces);
+                 anLen = anNbFaces;
+                 break;
+               case SMESH::VOLUME:
+                 str += "Volumes";
+                 anIDsVolumes->length(anNbVolumes);
+                 anLen = anNbVolumes;
+                 break;
+               default:
+                 break;
+               }
+
+               if(anLen) {
+                 aGroupName = str.c_str();
+
+                 // add a new group in the mesh
+                 aNewGroup = aNewImpl->CreateGroup(aGroupType, aGroupName);
+
+                 switch(aGroupType) {
+                 case SMESH::NODE:
+                   aNewGroup->Add( anIDsNodes );
+                   break;
+                 case SMESH::EDGE:
+                   aNewGroup->Add( anIDsEdges );
+                   break;
+                 case SMESH::FACE:
+                   aNewGroup->Add( anIDsFaces );
+                   break;
+                 case SMESH::VOLUME:
+                   aNewGroup->Add( anIDsVolumes );
+                   break;
+                 default:
+                   break;
+                 }
+               
+                 aListOfNewGroups.clear();
+                 aListOfNewGroups.push_back(aNewGroup);
+                 aGroupsMap.insert(make_pair( make_pair(aGroupName, aGroupType), aListOfNewGroups ));
+               }
+             }
+           }
+
+           // check that current group name and type don't have identical ones in union mesh
            for (int i = 0; i < aListOfGroups->length(); i++) {
              aGroup = aListOfGroups[i];
              aListOfNewGroups.clear();
-             SMESH::ElementType aGroupType = aGroup->GetType();
-             CORBA::String_var aGroupName = aGroup->GetName();
-             
+             aGroupType = aGroup->GetType();
+             aGroupName = aGroup->GetName();
+
              TGroupsMap::iterator anIter = aGroupsMap.find(make_pair(aGroupName, aGroupType));
 
              // convert a list of IDs
@@ -1579,7 +1723,11 @@ SMESH::SMESH_Mesh_ptr SMESH_Gen_i::Concatenate(const SMESH::mesh_array& theMeshe
   }
   
   // Update Python script
-  aPythonDump << aNewMesh << " = " << this << ".Concatenate(";
+  aPythonDump << aNewMesh << " = " << this;
+  if( !theCommonGroups )
+    aPythonDump << ".Concatenate(";
+  else
+    aPythonDump << ".ConcatenateWithGroups(";
   aPythonDump << "[";
   for ( int i = 0; i < theMeshesArray.length(); i++) {
     if (i > 0) aPythonDump << ", ";
@@ -1587,7 +1735,7 @@ SMESH::SMESH_Mesh_ptr SMESH_Gen_i::Concatenate(const SMESH::mesh_array& theMeshe
   }
   aPythonDump << "], ";
   aPythonDump << theUniteIdenticalGroups << ", "
-              << theMergeNodesAndElements << ", "
+             << theMergeNodesAndElements << ", "
               << theMergeTolerance << ")";
 
   return aNewMesh._retn();
index d97b6fbf92ff41b3ba3671240e07f32b919e445e..f8d43bb9bd1dfda5871b4476fda0db1c25c88751 100644 (file)
@@ -259,6 +259,14 @@ public:
                                                   CORBA::Long            theElementID)
     throw ( SALOME::SALOME_Exception );
 
+  // Concatenate the given meshes into one mesh
+  SMESH::SMESH_Mesh_ptr ConcatenateCommon(const SMESH::mesh_array& theMeshesArray, 
+                                         CORBA::Boolean           theUniteIdenticalGroups, 
+                                         CORBA::Boolean           theMergeNodesAndElements, 
+                                         CORBA::Double            theMergeTolerance,
+                                         CORBA::Boolean           theCommonGroups)
+    throw ( SALOME::SALOME_Exception );
+
   // Concatenate the given meshes into one mesh
   SMESH::SMESH_Mesh_ptr Concatenate(const SMESH::mesh_array& theMeshesArray, 
                                    CORBA::Boolean           theUniteIdenticalGroups, 
@@ -266,6 +274,13 @@ public:
                                    CORBA::Double            theMergeTolerance)
     throw ( SALOME::SALOME_Exception );
 
+  // Concatenate the given meshes into one mesh
+  // Create the groups of all elements from initial meshes
+  SMESH::SMESH_Mesh_ptr ConcatenateWithGroups(const SMESH::mesh_array& theMeshesArray, 
+                                             CORBA::Boolean           theUniteIdenticalGroups, 
+                                             CORBA::Boolean           theMergeNodesAndElements, 
+                                             CORBA::Double            theMergeTolerance)
+    throw ( SALOME::SALOME_Exception );
 
   // ****************************************************
   // Interface inherited methods (from SALOMEDS::Driver)
index c9f00811c2ba18111b6b757fcf8933d8c2a206c1..507b3a23f96e8bad8650dfbc6b0abbbef1ddf055 100644 (file)
@@ -2089,6 +2089,57 @@ SMESH_MeshEditor_i::LinearAnglesVariation(SMESH::SMESH_Mesh_ptr       thePathMes
                                           const SMESH::double_array & theAngles)
 {
   SMESH::double_array_var aResult = new SMESH::double_array();
+  int nbAngles = theAngles.length();
+  if ( nbAngles > 0 && !thePathMesh->_is_nil() && !thePathShape->_is_nil() )
+  {
+    SMESH_Mesh_i* aMeshImp = SMESH::DownCast<SMESH_Mesh_i*>( thePathMesh );
+    TopoDS_Shape aShape = SMESH_Gen_i::GetSMESHGen()->GeomObjectToShape( thePathShape );
+    SMESH_subMesh* aSubMesh = aMeshImp->GetImpl().GetSubMesh( aShape );
+    if ( !aSubMesh || !aSubMesh->GetSubMeshDS())
+      return aResult._retn();
+    int nbSteps = aSubMesh->GetSubMeshDS()->NbElements();
+    if ( nbSteps == nbAngles )
+    {
+      aResult.inout() = theAngles;
+    }
+    else
+    {
+      aResult->length( nbSteps );
+      double rAn2St = double( nbAngles ) / double( nbSteps );
+      double angPrev = 0, angle;
+      for ( int iSt = 0; iSt < nbSteps; ++iSt )
+      {
+        double angCur = rAn2St * ( iSt+1 );
+        double angCurFloor  = floor( angCur );
+        double angPrevFloor = floor( angPrev );
+        if ( angPrevFloor == angCurFloor )
+          angle = rAn2St * theAngles[ int( angCurFloor ) ];
+        else
+        {
+          int iP = int( angPrevFloor );
+          double angPrevCeil = ceil(angPrev);
+          angle = ( angPrevCeil - angPrev ) * theAngles[ iP ];
+          
+          int iC = int( angCurFloor );
+          if ( iC < nbAngles )
+            angle += ( angCur - angCurFloor ) * theAngles[ iC ];
+
+          iP = int( angPrevCeil );
+          while ( iC-- > iP )
+            angle += theAngles[ iC ];
+        }
+        aResult[ iSt ] = angle;
+        angPrev = angCur;
+      }
+    }
+  }
+  // Update Python script
+  TPythonDump() << "rotAngles = " << theAngles;
+  TPythonDump() << "rotAngles = " << this << ".LinearAnglesVariation( "
+                << thePathMesh  << ", "
+                << thePathShape << ", "
+                << "rotAngles )";
+
   return aResult._retn();
 }
 
index a52c3b0c2cef3fe7d61804767797881e9f545ba3..3bc02f9bfaa10c82d747052bdc8f997a7c4027fc 100644 (file)
@@ -240,6 +240,7 @@ SMESH_Mesh_i::ImportMEDFile( const char* theFileName, const char* theMeshName )
     THROW_SALOME_CORBA_EXCEPTION("ImportMEDFile(): unknown exception", SALOME::BAD_PARAM);
   }
 
+  myFile = theFileName;
   CreateGroupServants();
 
   return ConvertDriverMEDReadStatus(status);
@@ -2479,3 +2480,28 @@ SMESH::ListOfGroups* SMESH_Mesh_i::GetGroups(const list<int>& groupIDs) const
   aList->length( nbGroups );
   return aList._retn();
 }
+
+//=============================================================================
+/*!
+ * \brief Return information about imported file
+ */
+//=============================================================================
+SALOME_MED::MedFileInfo* SMESH_Mesh_i::GetMEDFileInfo()
+{
+  SALOME_MED::MedFileInfo_var res = new SALOME_MED::MedFileInfo();
+
+  const char* name = myFile.c_str();
+  res->fileName = name;
+  res->fileSize = 0;//myFileInfo.size();
+  int major, minor, release;
+  if( !MED::getMEDVersion( name, major, minor, release ) )
+  {
+    major = -1;
+    minor = -1;
+    release = -1;
+  }
+  res->major = major;
+  res->minor = minor;
+  res->release = release;
+  return res._retn();
+}
index 54842e09dba1a62fb0a0816954a4d9260e6f6ab3..c4d4a7277542a1879cdc168b5b867e86b3d65c36 100644 (file)
@@ -436,6 +436,10 @@ public:
    */
   SMESH::double_array* BaryCenter(CORBA::Long id);
 
+  /*!
+   * Returns information about imported MED file
+   */
+  virtual SALOME_MED::MedFileInfo* GetMEDFileInfo();
 
   std::map<int, SMESH_subMesh_i*> _mapSubMesh_i; //NRI
   std::map<int, ::SMESH_subMesh*> _mapSubMesh;   //NRI
@@ -450,6 +454,7 @@ private:
   std::map<int, SMESH::SMESH_subMesh_ptr>    _mapSubMeshIor;
   std::map<int, SMESH::SMESH_GroupBase_ptr>  _mapGroups;
   std::map<int, SMESH::SMESH_Hypothesis_ptr> _mapHypo;
+  string myFile;
 };
 
 #endif
index f4a2940886fe9f83775350fe92b39c676b4732c7..a5560ba044bdcd2a0e7193a22568762df402530d 100644 (file)
  \brief Module smesh
 """
 
+## \package smeshDC
+#  To get started, please look at smeshDC::smeshDC documentation for general services of smesh package.
+#  You can find the smeshDC::smeshDC documentation also by the first
+#  item in the Data Structures list on this page.
+#  See also the list of Data Structures and the list of Functions
+#  for other classes and methods of smesh python interface.
+
+
 import salome
 import geompyDC
 
@@ -97,7 +105,7 @@ def GetName(obj):
         attr = sobj.FindAttribute("AttributeName")[1]
         return attr.Value()
 
-    ## Sets name to object
+## Sets name to object
 def SetName(obj, name):
     ior  = salome.orb.object_to_string(obj)
     sobj = salome.myStudy.FindObjectIOR(ior)
@@ -105,7 +113,7 @@ def SetName(obj, name):
         attr = sobj.FindAttribute("AttributeName")[1]
         attr.SetValue(name)
 
-    ## Print error message if a hypothesis was not assigned.
+## Print error message if a hypothesis was not assigned.
 def TreatHypoStatus(status, hypName, geomName, isAlgo):
     if isAlgo:
         hypType = "algorithm"
@@ -142,18 +150,35 @@ def TreatHypoStatus(status, hypName, geomName, isAlgo):
         print hypName, "was not assigned to",geomName,":", reason
         pass
 
+## Convert angle in degrees to radians
+def DegreesToRadians(AngleInDegrees):
+    from math import pi
+    return AngleInDegrees * pi / 180.0
+
+## Methods of package smesh.py: general services of MESH component.
+#
+#  This class has been designed to provide general services of the MESH component.
+#  All methods of this class are accessible directly from the smesh.py package.
+#  Use these methods to create an empty mesh, to import mesh from a file,
+#  and also to create patterns and filtering criteria.
 class smeshDC(SMESH._objref_SMESH_Gen):
 
+    ## To set current study and Geometry component
     def init_smesh(self,theStudy,geompyD):
         self.geompyD=geompyD
         self.SetGeomEngine(geompyD)
         self.SetCurrentStudy(theStudy)
 
+    ## Create an empty Mesh. This mesh can have underlying geometry.
+    #  @param obj Geometrical object to build the mesh on. If not defined,
+    #             the mesh will not have underlying geometry.
+    #  @param name A name for the new mesh.
+    #  @return instance of Mesh class.
     def Mesh(self, obj=0, name=0):
       return Mesh(self,self.geompyD,obj,name)
 
     ## Returns long value from enumeration
-    #  Uses for SMESH.FunctorType enumeration
+    #  To be used for SMESH.FunctorType enumeration
     def EnumToLong(self,theItem):
         return theItem._v
 
@@ -258,15 +283,16 @@ class smeshDC(SMESH._objref_SMESH_Gen):
         return aMesh
 
     ## From SMESH_Gen interface
+    #  @return list of integer values
     def GetSubShapesId( self, theMainObject, theListOfSubObjects ):
         return SMESH._objref_SMESH_Gen.GetSubShapesId(self,theMainObject, theListOfSubObjects)
 
     ## From SMESH_Gen interface. Creates pattern
+    # @return an instance of SMESH_Pattern
     def GetPattern(self):
         return SMESH._objref_SMESH_Gen.GetPattern(self)
 
 
-
     # Filtering. Auxiliary functions:
     # ------------------------------
 
@@ -426,8 +452,11 @@ omniORB.registerObjref(SMESH._objref_SMESH_Gen._NP_RepositoryId, smeshDC)
 
 ## Class to define a mesh
 #
-#  The class contains mesh shape, SMESH_Mesh, SMESH_MeshEditor
-#  More details.
+#  This class allows to define and manage a mesh.
+#  It has a set of methods to build a mesh on the given geometry, including definition of sub-meshes.
+#  Also it has methods to define groups of mesh elements, to modify a mesh (by addition of
+#  new nodes and elements and by changind of existing entities), to take information
+#  about a mesh and to export a mesh into different formats.
 class Mesh:
 
     geom = 0
@@ -436,7 +465,7 @@ class Mesh:
 
     ## Constructor
     #
-    #  Creates mesh on the shape \a geom(or the empty mesh if geom equal to 0),
+    #  Creates mesh on the shape \a obj (or the empty mesh if obj is equal to 0),
     #  sets GUI name of this mesh to \a name.
     #  @param obj Shape to be meshed or SMESH_Mesh object
     #  @param name Study name of the mesh
@@ -460,30 +489,32 @@ class Mesh:
 
         self.editor = self.mesh.GetMeshEditor()
 
-    ## Method that inits the Mesh object from SMESH_Mesh interface
+    ## Method that inits the Mesh object from instance of SMESH_Mesh interface
     #  @param theMesh is SMESH_Mesh object
     def SetMesh(self, theMesh):
         self.mesh = theMesh
         self.geom = self.mesh.GetShapeToMesh()
 
-    ## Method that returns the mesh
+    ## Method that returns the mesh, that is instance of SMESH_Mesh interface
     #  @return SMESH_Mesh object
     def GetMesh(self):
         return self.mesh
 
     ## Get mesh name
+    #  @return name of the mesh as a string
     def GetName(self):
         name = GetName(self.GetMesh())
         return name
 
     ## Set name to mesh
+    #  @param name a new name for the mesh
     def SetName(self, name):
         SetName(self.GetMesh(), name)
 
-    ## Get the subMesh object associated to a subShape. The subMesh object
-    #  gives access to nodes and elements IDs.
-    #  \n SubMesh will be used instead of SubShape in a next idl version to
-    #  adress a specific subMesh...
+    ## Get the subMesh object associated to \a theSubObject geometrical object.
+    #  The subMesh object gives access to nodes and elements IDs.
+    #  @param theSubObject A geometrical object (shape)
+    #  @return object of type SMESH_SubMesh, representing part of mesh, which lays on the given shape
     def GetSubMesh(self, theSubObject, name):
         submesh = self.mesh.GetSubMesh(theSubObject, name)
         return submesh
@@ -494,19 +525,18 @@ class Mesh:
         return self.geom
 
     ## Method that associates given shape to the mesh(entails the mesh recreation)
-    #  @param geom shape to be meshed(GEOM_Object)
+    #  @param geom shape to be meshed (GEOM_Object)
     def SetShape(self, geom):
         self.mesh = self.smeshpyD.CreateMesh(geom)
 
     ## Return true if hypotheses are defined well
-    #  @param theMesh is an instance of Mesh class
     #  @param theSubObject subshape of a mesh shape
+    #  @return True or False
     def IsReadyToCompute(self, theSubObject):
         return self.smeshpyD.IsReadyToCompute(self.mesh, theSubObject)
 
-    ## Return errors of hypotheses definintion
-    #  error list is empty if everything is OK
-    #  @param theMesh is an instance of Mesh class
+    ## Return errors of hypotheses definition.
+    #  Errors list is empty if everything is OK.
     #  @param theSubObject subshape of a mesh shape
     #  @return a list of errors
     def GetAlgoState(self, theSubObject):
@@ -515,14 +545,14 @@ class Mesh:
     ## Return geometrical object the given element is built on.
     #  The returned geometrical object, if not nil, is either found in the
     #  study or is published by this method with the given name
-    #  @param theMesh is an instance of Mesh class
     #  @param theElementID an id of the mesh element
     #  @param theGeomName user defined name of geometrical object
     #  @return GEOM::GEOM_Object instance
     def GetGeometryByMeshElement(self, theElementID, theGeomName):
         return self.smeshpyD.GetGeometryByMeshElement( self.mesh, theElementID, theGeomName )
 
-    ## Returns mesh dimension depending on shape one
+    ## Returns mesh dimension depending on that of the underlying shape
+    #  @return mesh dimension as an integer value [0,3]
     def MeshDimension(self):
         shells = self.geompyD.SubShapeAllIDs( self.geom, geompyDC.ShapeType["SHELL"] )
         if len( shells ) > 0 :
@@ -536,11 +566,15 @@ class Mesh:
         pass
 
     ## Creates a segment discretization 1D algorithm.
-    #  If the optional \a algo parameter is not sets, this algorithm is REGULAR.
-    #  If the optional \a geom parameter is not sets, this algorithm is global.
-    #  \n Otherwise, this algorithm define a submesh based on \a geom subshape.
-    #  @param algo values are smesh.REGULAR or smesh.PYTHON for discretization via python function
+    #  If the optional \a algo parameter is not set, this algorithm is REGULAR.
+    #  \n If the optional \a geom parameter is not set, this algorithm is global.
+    #  Otherwise, this algorithm define a submesh based on \a geom subshape.
+    #  @param algo type of desired algorithm. Possible values are:
+    #     - smesh.REGULAR,
+    #     - smesh.PYTHON for discretization via python function,
+    #     - smesh.COMPOSITE for meshing a set of edges on one face side as a whole.
     #  @param geom If defined, subshape to be meshed
+    #  @return instance of Mesh_Segment or Mesh_Segment_Python, or Mesh_CompositeSegment class
     def Segment(self, algo=REGULAR, geom=0):
         ## if Segment(geom) is called by mistake
         if isinstance( algo, geompyDC.GEOM._objref_GEOM_Object):
@@ -581,20 +615,22 @@ class Mesh:
     ## Creates a triangle 2D algorithm for faces.
     #  If the optional \a geom parameter is not sets, this algorithm is global.
     #  \n Otherwise, this algorithm define a submesh based on \a geom subshape.
-    #  @param algo values are: smesh.MEFISTO || smesh.NETGEN_1D2D || smesh.NETGEN_2D
-    #  @param geom If defined, subshape to be meshed
+    #  @param algo values are: smesh.MEFISTO || smesh.NETGEN_1D2D || smesh.NETGEN_2D || smesh.BLSURF
+    #  @param geom If defined, subshape to be meshed (GEOM_Object)
+    #  @return an instance of Mesh_Triangle algorithm
     def Triangle(self, algo=MEFISTO, geom=0):
         ## if Triangle(geom) is called by mistake
-        if ( isinstance( algo, geompyDC.GEOM._objref_GEOM_Object)):
+        if (isinstance(algo, geompyDC.GEOM._objref_GEOM_Object)):
             geom = algo
             algo = MEFISTO
 
-        return Mesh_Triangle(self,  algo, geom)
+        return Mesh_Triangle(self, algo, geom)
 
     ## Creates a quadrangle 2D algorithm for faces.
     #  If the optional \a geom parameter is not sets, this algorithm is global.
     #  \n Otherwise, this algorithm define a submesh based on \a geom subshape.
-    #  @param geom If defined, subshape to be meshed
+    #  @param geom If defined, subshape to be meshed (GEOM_Object)
+    #  @return an instance of Mesh_Quadrangle algorithm
     def Quadrangle(self, geom=0):
         return Mesh_Quadrangle(self,  geom)
 
@@ -603,7 +639,8 @@ class Mesh:
     #  If the optional \a geom parameter is not sets, this algorithm is global.
     #  \n Otherwise, this algorithm define a submesh based on \a geom subshape.
     #  @param algo values are: smesh.NETGEN, smesh.GHS3D, smesh.FULL_NETGEN
-    #  @param geom If defined, subshape to be meshed
+    #  @param geom If defined, subshape to be meshed (GEOM_Object)
+    #  @return an instance of Mesh_Tetrahedron algorithm
     def Tetrahedron(self, algo=NETGEN, geom=0):
         ## if Tetrahedron(geom) is called by mistake
         if ( isinstance( algo, geompyDC.GEOM._objref_GEOM_Object)):
@@ -615,9 +652,9 @@ class Mesh:
     ## Creates a hexahedron 3D algorithm for solids.
     #  If the optional \a geom parameter is not sets, this algorithm is global.
     #  \n Otherwise, this algorithm define a submesh based on \a geom subshape.
-    #  @param geom If defined, subshape to be meshed
-    ## def Hexahedron(self, geom=0):
-    ##     return Mesh_Hexahedron(self,  geom)
+    #  @param algo possible values are: smesh.Hexa, smesh.Hexotic
+    #  @param geom If defined, subshape to be meshed (GEOM_Object)
+    #  @return an instance of Mesh_Hexahedron algorithm
     def Hexahedron(self, algo=Hexa, geom=0):
         ## if Hexahedron(geom, algo) or Hexahedron(geom) is called by mistake
         if ( isinstance(algo, geompyDC.GEOM._objref_GEOM_Object) ):
@@ -626,6 +663,7 @@ class Mesh:
         return Mesh_Hexahedron(self, algo, geom)
 
     ## Deprecated, only for compatibility!
+    #  @return an instance of Mesh_Netgen algorithm
     def Netgen(self, is3D, geom=0):
         return Mesh_Netgen(self,  is3D, geom)
 
@@ -633,6 +671,7 @@ class Mesh:
     #  If the optional \a geom parameter is not sets, this algorithm is global.
     #  Otherwise, this algorithm define a submesh based on \a geom subshape.
     #  @param geom If defined, subshape to be meshed
+    #  @return an instance of Mesh_Projection1D algorithm
     def Projection1D(self, geom=0):
         return Mesh_Projection1D(self,  geom)
 
@@ -640,6 +679,7 @@ class Mesh:
     #  If the optional \a geom parameter is not sets, this algorithm is global.
     #  Otherwise, this algorithm define a submesh based on \a geom subshape.
     #  @param geom If defined, subshape to be meshed
+    #  @return an instance of Mesh_Projection2D algorithm
     def Projection2D(self, geom=0):
         return Mesh_Projection2D(self,  geom)
 
@@ -647,6 +687,7 @@ class Mesh:
     #  If the optional \a geom parameter is not sets, this algorithm is global.
     #  Otherwise, this algorithm define a submesh based on \a geom subshape.
     #  @param geom If defined, subshape to be meshed
+    #  @return an instance of Mesh_Projection3D algorithm
     def Projection3D(self, geom=0):
         return Mesh_Projection3D(self,  geom)
 
@@ -654,6 +695,7 @@ class Mesh:
     #  If the optional \a geom parameter is not sets, this algorithm is global.
     #  Otherwise, this algorithm define a submesh based on \a geom subshape.
     #  @param geom If defined, subshape to be meshed
+    #  @return an instance of Mesh_Prism3D or Mesh_RadialPrism3D algorithm
     def Prism(self, geom=0):
         shape = geom
         if shape==0:
@@ -665,6 +707,7 @@ class Mesh:
         return Mesh_RadialPrism3D(self,  geom)
 
     ## Compute the mesh and return the status of the computation
+    #  @return True or False
     def Compute(self, geom=0):
         if geom == 0 or not isinstance(geom, geompyDC.GEOM._objref_GEOM_Object):
             if self.geom == 0:
@@ -732,6 +775,7 @@ class Mesh:
 
     ## Compute tetrahedral mesh using AutomaticLength + MEFISTO + NETGEN
     #  The parameter \a fineness [0,-1] defines mesh fineness
+    #  @return True or False
     def AutomaticTetrahedralization(self, fineness=0):
         dim = self.MeshDimension()
         # assign hypotheses
@@ -747,6 +791,7 @@ class Mesh:
 
     ## Compute hexahedral mesh using AutomaticLength + Quadrangle + Hexahedron
     #  The parameter \a fineness [0,-1] defines mesh fineness
+    #  @return True or False
     def AutomaticHexahedralization(self, fineness=0):
         dim = self.MeshDimension()
         # assign hypotheses
@@ -763,6 +808,7 @@ class Mesh:
     ## Assign hypothesis
     #  @param hyp is a hypothesis to assign
     #  @param geom is subhape of mesh geometry
+    #  @return SMESH.Hypothesis_Status
     def AddHypothesis(self, hyp, geom=0):
         if isinstance( hyp, Mesh_Algorithm ):
             hyp = hyp.GetAlgorithm()
@@ -778,6 +824,7 @@ class Mesh:
     ## Unassign hypothesis
     #  @param hyp is a hypothesis to unassign
     #  @param geom is subhape of mesh geometry
+    #  @return SMESH.Hypothesis_Status
     def RemoveHypothesis(self, hyp, geom=0):
         if isinstance( hyp, Mesh_Algorithm ):
             hyp = hyp.GetAlgorithm()
@@ -790,6 +837,7 @@ class Mesh:
 
     ## Get the list of hypothesis added on a geom
     #  @param geom is subhape of mesh geometry
+    #  @return sequence of SMESH_Hypothesis
     def GetHypothesisList(self, geom):
         return self.mesh.GetHypothesisList( geom )
 
@@ -984,14 +1032,17 @@ class Mesh:
         self.mesh.RemoveGroupWithContents(group)
 
     ## Get the list of groups existing in the mesh
+    #  @return sequence of SMESH_GroupBase
     def GetGroups(self):
         return self.mesh.GetGroups()
 
     ## Get number of groups existing in the mesh
+    #  @return quantity of groups as an integer value
     def NbGroups(self):
         return self.mesh.NbGroups()
 
     ## Get the list of names of groups existing in the mesh
+    #  @return list of strings
     def GetGroupNames(self):
         groups = self.GetGroups()
         names = []
@@ -1002,18 +1053,21 @@ class Mesh:
     ## Union of two groups
     #  New group is created. All mesh elements that are
     #  present in initial groups are added to the new one
+    #  @return an instance of SMESH_Group
     def UnionGroups(self, group1, group2, name):
         return self.mesh.UnionGroups(group1, group2, name)
 
     ## Intersection of two groups
     #  New group is created. All mesh elements that are
     #  present in both initial groups are added to the new one.
+    #  @return an instance of SMESH_Group
     def IntersectGroups(self, group1, group2, name):
         return self.mesh.IntersectGroups(group1, group2, name)
 
     ## Cut of two groups
     #  New group is created. All mesh elements that are present in
     #  main group but do not present in tool group are added to the new one
+    #  @return an instance of SMESH_Group
     def CutGroups(self, mainGroup, toolGroup, name):
         return self.mesh.CutGroups(mainGroup, toolGroup, name)
 
@@ -1037,30 +1091,39 @@ class Mesh:
     def ClearLog(self):
         self.mesh.ClearLog()
 
-    def SetAutoColor(self, color):
-        self.mesh.SetAutoColor(color)
+    ## Toggle auto color mode on the object.
+    #  @param theAutoColor flag which toggles auto color mode.
+    def SetAutoColor(self, theAutoColor):
+        self.mesh.SetAutoColor(theAutoColor)
 
+    ## Get flag of object auto color mode.
+    #  @return True or False
     def GetAutoColor(self):
         return self.mesh.GetAutoColor()
 
     ## Get the internal Id
+    #  @return integer value, which is the internal Id of the mesh
     def GetId(self):
         return self.mesh.GetId()
 
     ## Get the study Id
+    #  @return integer value, which is the study Id of the mesh
     def GetStudyId(self):
         return self.mesh.GetStudyId()
 
     ## Check group names for duplications.
     #  Consider maximum group name length stored in MED file.
+    #  @return True or False
     def HasDuplicatedGroupNamesMED(self):
         return self.mesh.HasDuplicatedGroupNamesMED()
 
-    ## Obtain instance of SMESH_MeshEditor
+    ## Obtain mesh editor tool
+    #  @return an instance of SMESH_MeshEditor
     def GetMeshEditor(self):
         return self.mesh.GetMeshEditor()
 
     ## Get MED Mesh
+    #  @return an instance of SALOME_MED::MESH
     def GetMEDMesh(self):
         return self.mesh.GetMEDMesh()
 
@@ -1069,125 +1132,151 @@ class Mesh:
     # ------------------------------------
 
     ## Returns number of nodes in mesh
+    #  @return an integer value
     def NbNodes(self):
         return self.mesh.NbNodes()
 
     ## Returns number of elements in mesh
+    #  @return an integer value
     def NbElements(self):
         return self.mesh.NbElements()
 
     ## Returns number of edges in mesh
+    #  @return an integer value
     def NbEdges(self):
         return self.mesh.NbEdges()
 
     ## Returns number of edges with given order in mesh
     #  @param elementOrder is order of elements:
-    #  ORDER_ANY, ORDER_LINEAR or ORDER_QUADRATIC
+    #         ORDER_ANY, ORDER_LINEAR or ORDER_QUADRATIC
+    #  @return an integer value
     def NbEdgesOfOrder(self, elementOrder):
         return self.mesh.NbEdgesOfOrder(elementOrder)
 
     ## Returns number of faces in mesh
+    #  @return an integer value
     def NbFaces(self):
         return self.mesh.NbFaces()
 
     ## Returns number of faces with given order in mesh
     #  @param elementOrder is order of elements:
-    #  ORDER_ANY, ORDER_LINEAR or ORDER_QUADRATIC
+    #         ORDER_ANY, ORDER_LINEAR or ORDER_QUADRATIC
+    #  @return an integer value
     def NbFacesOfOrder(self, elementOrder):
         return self.mesh.NbFacesOfOrder(elementOrder)
 
     ## Returns number of triangles in mesh
+    #  @return an integer value
     def NbTriangles(self):
         return self.mesh.NbTriangles()
 
     ## Returns number of triangles with given order in mesh
     #  @param elementOrder is order of elements:
-    #  ORDER_ANY, ORDER_LINEAR or ORDER_QUADRATIC
+    #         ORDER_ANY, ORDER_LINEAR or ORDER_QUADRATIC
+    #  @return an integer value
     def NbTrianglesOfOrder(self, elementOrder):
         return self.mesh.NbTrianglesOfOrder(elementOrder)
 
     ## Returns number of quadrangles in mesh
+    #  @return an integer value
     def NbQuadrangles(self):
         return self.mesh.NbQuadrangles()
 
     ## Returns number of quadrangles with given order in mesh
     #  @param elementOrder is order of elements:
-    #  ORDER_ANY, ORDER_LINEAR or ORDER_QUADRATIC
+    #         ORDER_ANY, ORDER_LINEAR or ORDER_QUADRATIC
+    #  @return an integer value
     def NbQuadranglesOfOrder(self, elementOrder):
         return self.mesh.NbQuadranglesOfOrder(elementOrder)
 
     ## Returns number of polygons in mesh
+    #  @return an integer value
     def NbPolygons(self):
         return self.mesh.NbPolygons()
 
     ## Returns number of volumes in mesh
+    #  @return an integer value
     def NbVolumes(self):
         return self.mesh.NbVolumes()
 
     ## Returns number of volumes with given order in mesh
     #  @param elementOrder is order of elements:
-    #  ORDER_ANY, ORDER_LINEAR or ORDER_QUADRATIC
+    #         ORDER_ANY, ORDER_LINEAR or ORDER_QUADRATIC
+    #  @return an integer value
     def NbVolumesOfOrder(self, elementOrder):
         return self.mesh.NbVolumesOfOrder(elementOrder)
 
     ## Returns number of tetrahedrons in mesh
+    #  @return an integer value
     def NbTetras(self):
         return self.mesh.NbTetras()
 
     ## Returns number of tetrahedrons with given order in mesh
     #  @param elementOrder is order of elements:
-    #  ORDER_ANY, ORDER_LINEAR or ORDER_QUADRATIC
+    #         ORDER_ANY, ORDER_LINEAR or ORDER_QUADRATIC
+    #  @return an integer value
     def NbTetrasOfOrder(self, elementOrder):
         return self.mesh.NbTetrasOfOrder(elementOrder)
 
     ## Returns number of hexahedrons in mesh
+    #  @return an integer value
     def NbHexas(self):
         return self.mesh.NbHexas()
 
     ## Returns number of hexahedrons with given order in mesh
     #  @param elementOrder is order of elements:
-    #  ORDER_ANY, ORDER_LINEAR or ORDER_QUADRATIC
+    #         ORDER_ANY, ORDER_LINEAR or ORDER_QUADRATIC
+    #  @return an integer value
     def NbHexasOfOrder(self, elementOrder):
         return self.mesh.NbHexasOfOrder(elementOrder)
 
     ## Returns number of pyramids in mesh
+    #  @return an integer value
     def NbPyramids(self):
         return self.mesh.NbPyramids()
 
     ## Returns number of pyramids with given order in mesh
     #  @param elementOrder is order of elements:
-    #  ORDER_ANY, ORDER_LINEAR or ORDER_QUADRATIC
+    #         ORDER_ANY, ORDER_LINEAR or ORDER_QUADRATIC
+    #  @return an integer value
     def NbPyramidsOfOrder(self, elementOrder):
         return self.mesh.NbPyramidsOfOrder(elementOrder)
 
     ## Returns number of prisms in mesh
+    #  @return an integer value
     def NbPrisms(self):
         return self.mesh.NbPrisms()
 
     ## Returns number of prisms with given order in mesh
     #  @param elementOrder is order of elements:
-    #  ORDER_ANY, ORDER_LINEAR or ORDER_QUADRATIC
+    #         ORDER_ANY, ORDER_LINEAR or ORDER_QUADRATIC
+    #  @return an integer value
     def NbPrismsOfOrder(self, elementOrder):
         return self.mesh.NbPrismsOfOrder(elementOrder)
 
     ## Returns number of polyhedrons in mesh
+    #  @return an integer value
     def NbPolyhedrons(self):
         return self.mesh.NbPolyhedrons()
 
     ## Returns number of submeshes in mesh
+    #  @return an integer value
     def NbSubMesh(self):
         return self.mesh.NbSubMesh()
 
     ## Returns list of mesh elements ids
+    #  @return list of integer values
     def GetElementsId(self):
         return self.mesh.GetElementsId()
 
     ## Returns list of ids of mesh elements with given type
     #  @param elementType is required type of elements
+    #  @return list of integer values
     def GetElementsByType(self, elementType):
         return self.mesh.GetElementsByType(elementType)
 
     ## Returns list of mesh nodes ids
+    #  @return list of integer values
     def GetNodesId(self):
         return self.mesh.GetNodesId()
 
@@ -1195,12 +1284,14 @@ class Mesh:
     # ------------------------------------
 
     ## Returns type of mesh element
+    #  @return value from SMESH::ElementType enumeration
     def GetElementType(self, id, iselem):
         return self.mesh.GetElementType(id, iselem)
 
     ## Returns list of submesh elements ids
     #  @param Shape is geom object(subshape) IOR
-    #  Shape must be subshape of a ShapeToMesh()
+    #         Shape must be subshape of a ShapeToMesh()
+    #  @return list of integer values
     def GetSubMeshElementsId(self, Shape):
         if ( isinstance( Shape, geompyDC.GEOM._objref_GEOM_Object)):
             ShapeID = Shape.GetSubShapeIndices()[0]
@@ -1210,7 +1301,8 @@ class Mesh:
 
     ## Returns list of submesh nodes ids
     #  @param Shape is geom object(subshape) IOR
-    #  Shape must be subshape of a ShapeToMesh()
+    #         Shape must be subshape of a ShapeToMesh()
+    #  @return list of integer values
     def GetSubMeshNodesId(self, Shape, all):
         if ( isinstance( Shape, geompyDC.GEOM._objref_GEOM_Object)):
             ShapeID = Shape.GetSubShapeIndices()[0]
@@ -1220,7 +1312,8 @@ class Mesh:
 
     ## Returns list of ids of submesh elements with given type
     #  @param Shape is geom object(subshape) IOR
-    #  Shape must be subshape of a ShapeToMesh()
+    #         Shape must be subshape of a ShapeToMesh()
+    #  @return list of integer values
     def GetSubMeshElementType(self, Shape):
         if ( isinstance( Shape, geompyDC.GEOM._objref_GEOM_Object)):
             ShapeID = Shape.GetSubShapeIndices()[0]
@@ -1229,6 +1322,7 @@ class Mesh:
         return self.mesh.GetSubMeshElementType(ShapeID)
 
     ## Get mesh description
+    #  @return string value
     def Dump(self):
         return self.mesh.Dump()
 
@@ -1236,13 +1330,15 @@ class Mesh:
     # Get information about nodes and elements of mesh by its ids:
     # -----------------------------------------------------------
 
-    ## Get XYZ coordinates of node as list of double
+    ## Get XYZ coordinates of node
     #  \n If there is not node for given ID - returns empty list
+    #  @return a list of double precision values
     def GetNodeXYZ(self, id):
         return self.mesh.GetNodeXYZ(id)
 
     ## For given node returns list of IDs of inverse elements
     #  \n If there is not node for given ID - returns empty list
+    #  @return list of integer values
     def GetNodeInverseElements(self, id):
         return self.mesh.GetNodeInverseElements(id)
 
@@ -1253,37 +1349,40 @@ class Mesh:
 
     ## If given element is node returns IDs of shape from position
     #  \n If there is not node for given ID - returns -1
+    #  @return integer value
     def GetShapeID(self, id):
         return self.mesh.GetShapeID(id)
 
     ## For given element returns ID of result shape after
     #  FindShape() from SMESH_MeshEditor
     #  \n If there is not element for given ID - returns -1
+    #  @return integer value
     def GetShapeIDForElem(self,id):
         return self.mesh.GetShapeIDForElem(id)
 
     ## Returns number of nodes for given element
     #  \n If there is not element for given ID - returns -1
+    #  @return integer value
     def GetElemNbNodes(self, id):
         return self.mesh.GetElemNbNodes(id)
 
     ## Returns ID of node by given index for given element
     #  \n If there is not element for given ID - returns -1
     #  \n If there is not node for given index - returns -2
+    #  @return integer value
     def GetElemNode(self, id, index):
         return self.mesh.GetElemNode(id, index)
 
     ## Returns IDs of nodes of given element
+    #  @return list of integer values
     def GetElemNodes(self, id):
         return self.mesh.GetElemNodes(id)
 
-    ## Returns true if given node is medium node
-    #  in given quadratic element
+    ## Returns true if given node is medium node in given quadratic element
     def IsMediumNode(self, elementID, nodeID):
         return self.mesh.IsMediumNode(elementID, nodeID)
 
-    ## Returns true if given node is medium node
-    #  in one of quadratic elements
+    ## Returns true if given node is medium node in one of quadratic elements
     def IsMediumNodeOfAnyElem(self, nodeID, elementType):
         return self.mesh.IsMediumNodeOfAnyElem(nodeID, elementType)
 
@@ -1304,8 +1403,8 @@ class Mesh:
         return self.mesh.IsQuadratic(id)
 
     ## Returns XYZ coordinates of bary center for given element
-    #  as list of double
     #  \n If there is not element for given ID - returns empty list
+    #  @return a list of three double values
     def BaryCenter(self, id):
         return self.mesh.BaryCenter(id)
 
@@ -1315,38 +1414,44 @@ class Mesh:
 
     ## Removes elements from mesh by ids
     #  @param IDsOfElements is list of ids of elements to remove
+    #  @return True or False
     def RemoveElements(self, IDsOfElements):
         return self.editor.RemoveElements(IDsOfElements)
 
     ## Removes nodes from mesh by ids
     #  @param IDsOfNodes is list of ids of nodes to remove
+    #  @return True or False
     def RemoveNodes(self, IDsOfNodes):
         return self.editor.RemoveNodes(IDsOfNodes)
 
     ## Add node to mesh by coordinates
+    #  @return Id of the new node
     def AddNode(self, x, y, z):
         return self.editor.AddNode( x, y, z)
 
 
-    ## Create edge both similar and quadratic (this is determed
+    ## Create edge either linear or quadratic (this is determined
     #  by number of given nodes).
     #  @param IdsOfNodes List of node IDs for creation of element.
     #  Needed order of nodes in this list corresponds to description
     #  of MED. \n This description is located by the following link:
     #  http://www.salome-platform.org/salome2/web_med_internet/logiciels/medV2.2.2_doc_html/html/modele_de_donnees.html#3.
+    #  @return Id of the new edge
     def AddEdge(self, IDsOfNodes):
         return self.editor.AddEdge(IDsOfNodes)
 
-    ## Create face both similar and quadratic (this is determed
+    ## Create face either linear or quadratic (this is determined
     #  by number of given nodes).
     #  @param IdsOfNodes List of node IDs for creation of element.
     #  Needed order of nodes in this list corresponds to description
     #  of MED. \n This description is located by the following link:
     #  http://www.salome-platform.org/salome2/web_med_internet/logiciels/medV2.2.2_doc_html/html/modele_de_donnees.html#3.
+    #  @return Id of the new face
     def AddFace(self, IDsOfNodes):
         return self.editor.AddFace(IDsOfNodes)
 
     ## Add polygonal face to mesh by list of nodes ids
+    #  @return Id of the new face
     def AddPolygonalFace(self, IdsOfNodes):
         return self.editor.AddPolygonalFace(IdsOfNodes)
 
@@ -1356,6 +1461,7 @@ class Mesh:
     #  Needed order of nodes in this list corresponds to description
     #  of MED. \n This description is located by the following link:
     #  http://www.salome-platform.org/salome2/web_med_internet/logiciels/medV2.2.2_doc_html/html/modele_de_donnees.html#3.
+    #  @return Id of the new volumic element
     def AddVolume(self, IDsOfNodes):
         return self.editor.AddVolume(IDsOfNodes)
 
@@ -1363,6 +1469,7 @@ class Mesh:
     #  @param IdsOfNodes List of node IDs for volume creation face by face.
     #  @param Quantities List of integer values, Quantities[i]
     #         gives quantity of nodes in face number i.
+    #  @return Id of the new volumic element
     def AddPolyhedralVolume (self, IdsOfNodes, Quantities):
         return self.editor.AddPolyhedralVolume(IdsOfNodes, Quantities)
 
@@ -1371,6 +1478,7 @@ class Mesh:
     #
     #  Note:  The created volume will refer only to nodes
     #         of the given faces, not to the faces itself.
+    #  @return Id of the new volumic element
     def AddPolyhedralVolumeByFaces (self, IdsOfFaces):
         return self.editor.AddPolyhedralVolumeByFaces(IdsOfFaces)
 
@@ -1460,6 +1568,7 @@ class Mesh:
     #  @param x new X coordinate
     #  @param y new Y coordinate
     #  @param z new Z coordinate
+    #  @return True if succeed else False
     def MoveNode(self, NodeID, x, y, z):
         return self.editor.MoveNode(NodeID, x, y, z)
 
@@ -1498,6 +1607,7 @@ class Mesh:
 
     ## Reorient elements by ids
     #  @param IDsOfElements if undefined reorient all mesh elements
+    #  @return True if succeed else False
     def Reorient(self, IDsOfElements=None):
         if IDsOfElements == None:
             IDsOfElements = self.GetElementsId()
@@ -1505,6 +1615,7 @@ class Mesh:
 
     ## Reorient all elements of the object
     #  @param theObject is mesh, submesh or group
+    #  @return True if succeed else False
     def ReorientObject(self, theObject):
         if ( isinstance( theObject, Mesh )):
             theObject = theObject.GetMesh()
@@ -1544,6 +1655,7 @@ class Mesh:
     ## Split quadrangles into triangles.
     #  @param theObject object to taking list of elements from, is mesh, submesh or group
     #  @param theCriterion  is FT_...; used to choose a diagonal for splitting.
+    #  @return TRUE in case of success, FALSE otherwise.
     def QuadToTriObject (self, theObject, theCriterion):
         if ( isinstance( theObject, Mesh )):
             theObject = theObject.GetMesh()
@@ -1560,6 +1672,7 @@ class Mesh:
 
     ## Split quadrangles into triangles.
     #  @param theObject is object to taking list of elements from, is mesh, submesh or group
+    #  @return TRUE in case of success, FALSE otherwise.
     def SplitQuadObject (self, theObject, Diag13):
         if ( isinstance( theObject, Mesh )):
             theObject = theObject.GetMesh()
@@ -1573,7 +1686,7 @@ class Mesh:
     def BestSplit (self, IDOfQuad, theCriterion):
         return self.editor.BestSplit(IDOfQuad, self.smeshpyD.GetFunctor(theCriterion))
 
-    ## Split quafrangle faces near triangular facets of volumes
+    ## Split quadrangle faces near triangular facets of volumes
     #
     def SplitQuadsNearTriangularFacets(self):
         faces_array = self.GetElementsByType(SMESH.FACE)
@@ -1719,6 +1832,7 @@ class Mesh:
     #  @param MaxNbOfIterations maximum number of iterations
     #  @param MaxAspectRatio varies in range [1.0, inf]
     #  @param Method is Laplacian(LAPLACIAN_SMOOTH) or Centroidal(CENTROIDAL_SMOOTH)
+    #  @return TRUE in case of success, FALSE otherwise.
     def Smooth(self, IDsOfElements, IDsOfFixedNodes,
                MaxNbOfIterations, MaxAspectRatio, Method):
         if IDsOfElements == []:
@@ -1733,6 +1847,7 @@ class Mesh:
     #  @param MaxNbOfIterations maximum number of iterations
     #  @param MaxAspectRatio varies in range [1.0, inf]
     #  @param Method is Laplacian(LAPLACIAN_SMOOTH) or Centroidal(CENTROIDAL_SMOOTH)
+    #  @return TRUE in case of success, FALSE otherwise.
     def SmoothObject(self, theObject, IDsOfFixedNodes,
                      MaxNbOfIterations, MaxxAspectRatio, Method):
         if ( isinstance( theObject, Mesh )):
@@ -1747,6 +1862,7 @@ class Mesh:
     #  @param MaxNbOfIterations maximum number of iterations
     #  @param MaxAspectRatio varies in range [1.0, inf]
     #  @param Method is Laplacian(LAPLACIAN_SMOOTH) or Centroidal(CENTROIDAL_SMOOTH)
+    #  @return TRUE in case of success, FALSE otherwise.
     def SmoothParametric(self, IDsOfElements, IDsOfFixedNodes,
                          MaxNbOfIterations, MaxAspectRatio, Method):
         if IDsOfElements == []:
@@ -1761,6 +1877,7 @@ class Mesh:
     #  @param MaxNbOfIterations maximum number of iterations
     #  @param MaxAspectRatio varies in range [1.0, inf]
     #  @param Method is Laplacian(LAPLACIAN_SMOOTH) or Centroidal(CENTROIDAL_SMOOTH)
+    #  @return TRUE in case of success, FALSE otherwise.
     def SmoothParametricObject(self, theObject, IDsOfFixedNodes,
                                MaxNbOfIterations, MaxAspectRatio, Method):
         if ( isinstance( theObject, Mesh )):
@@ -1776,6 +1893,7 @@ class Mesh:
     ## Converts all mesh from quadratic to ordinary ones,
     #  deletes old quadratic elements, \n replacing
     #  them with ordinary mesh elements with the same id.
+    #  @return TRUE in case of success, FALSE otherwise.
     def ConvertFromQuadratic(self):
         return self.editor.ConvertFromQuadratic()
 
@@ -1794,11 +1912,17 @@ class Mesh:
     #  @param NbOfSteps number of steps
     #  @param Tolerance tolerance
     #  @param MakeGroups to generate new groups from existing ones
-    def RotationSweep(self, IDsOfElements, Axix, AngleInRadians, NbOfSteps, Tolerance, MakeGroups=False):
+    #  @param TotalAngle gives meaning of AngleInRadians: if True then it is an anglular size
+    #  of all steps, else - size of each step
+    #  @return list of created groups (SMESH_GroupBase) if MakeGroups=True, empty list otherwise
+    def RotationSweep(self, IDsOfElements, Axix, AngleInRadians, NbOfSteps, Tolerance,
+                      MakeGroups=False, TotalAngle=False):
         if IDsOfElements == []:
             IDsOfElements = self.GetElementsId()
         if ( isinstance( Axix, geompyDC.GEOM._objref_GEOM_Object)):
             Axix = self.smeshpyD.GetAxisStruct(Axix)
+        if TotalAngle and NbOfSteps:
+            AngleInRadians /= NbOfSteps
         if MakeGroups:
             return self.editor.RotationSweepMakeGroups(IDsOfElements, Axix,
                                                        AngleInRadians, NbOfSteps, Tolerance)
@@ -1812,11 +1936,17 @@ class Mesh:
     #  @param NbOfSteps number of steps
     #  @param Tolerance tolerance
     #  @param MakeGroups to generate new groups from existing ones
-    def RotationSweepObject(self, theObject, Axix, AngleInRadians, NbOfSteps, Tolerance, MakeGroups=False):
+    #  @param TotalAngle gives meaning of AngleInRadians: if True then it is an anglular size
+    #  of all steps, else - size of each step
+    #  @return list of created groups (SMESH_GroupBase) if MakeGroups=True, empty list otherwise
+    def RotationSweepObject(self, theObject, Axix, AngleInRadians, NbOfSteps, Tolerance,
+                            MakeGroups=False, TotalAngle=False):
         if ( isinstance( theObject, Mesh )):
             theObject = theObject.GetMesh()
         if ( isinstance( Axix, geompyDC.GEOM._objref_GEOM_Object)):
             Axix = self.smeshpyD.GetAxisStruct(Axix)
+        if TotalAngle and NbOfSteps:
+            AngleInRadians /= NbOfSteps
         if MakeGroups:
             return self.editor.RotationSweepObjectMakeGroups(theObject, Axix, AngleInRadians,
                                                              NbOfSteps, Tolerance)
@@ -1828,6 +1958,7 @@ class Mesh:
     #  @param StepVector vector, defining the direction and value of extrusion
     #  @param NbOfSteps the number of steps
     #  @param MakeGroups to generate new groups from existing ones
+    #  @return list of created groups (SMESH_GroupBase) if MakeGroups=True, empty list otherwise
     def ExtrusionSweep(self, IDsOfElements, StepVector, NbOfSteps, MakeGroups=False):
         if IDsOfElements == []:
             IDsOfElements = self.GetElementsId()
@@ -1846,6 +1977,7 @@ class Mesh:
     #  @param SewTolerance uses for comparing locations of nodes if flag
     #         EXTRUSION_FLAG_SEW is set
     #  @param MakeGroups to generate new groups from existing ones
+    #  @return list of created groups (SMESH_GroupBase) if MakeGroups=True, empty list otherwise
     def AdvancedExtrusion(self, IDsOfElements, StepVector, NbOfSteps, ExtrFlags, SewTolerance, MakeGroups=False):
         if ( isinstance( StepVector, geompyDC.GEOM._objref_GEOM_Object)):
             StepVector = self.smeshpyD.GetDirStruct(StepVector)
@@ -1861,6 +1993,7 @@ class Mesh:
     #  @param StepVector vector, defining the direction and value of extrusion
     #  @param NbOfSteps the number of steps
     #  @param MakeGroups to generate new groups from existing ones
+    #  @return list of created groups (SMESH_GroupBase) if MakeGroups=True, empty list otherwise
     def ExtrusionSweepObject(self, theObject, StepVector, NbOfSteps, MakeGroups=False):
         if ( isinstance( theObject, Mesh )):
             theObject = theObject.GetMesh()
@@ -1876,6 +2009,7 @@ class Mesh:
     #  @param StepVector vector, defining the direction and value of extrusion
     #  @param NbOfSteps the number of steps
     #  @param MakeGroups to generate new groups from existing ones
+    #  @return list of created groups (SMESH_GroupBase) if MakeGroups=True, empty list otherwise
     def ExtrusionSweepObject1D(self, theObject, StepVector, NbOfSteps, MakeGroups=False):
         if ( isinstance( theObject, Mesh )):
             theObject = theObject.GetMesh()
@@ -1891,6 +2025,7 @@ class Mesh:
     #  @param StepVector vector, defining the direction and value of extrusion
     #  @param NbOfSteps the number of steps
     #  @param MakeGroups to generate new groups from existing ones
+    #  @return list of created groups (SMESH_GroupBase) if MakeGroups=True, empty list otherwise
     def ExtrusionSweepObject2D(self, theObject, StepVector, NbOfSteps, MakeGroups=False):
         if ( isinstance( theObject, Mesh )):
             theObject = theObject.GetMesh()
@@ -1914,6 +2049,8 @@ class Mesh:
     #         User can specify any point as the Base Point and the shape will be rotated with respect to this point.
     #  @param MakeGroups to generate new groups from existing ones
     #  @param LinearVariation makes compute rotation angles as linear variation of given Angles along path steps
+    #  @return list of created groups (SMESH_GroupBase) and SMESH::Extrusion_Error if MakeGroups=True,
+    #          only SMESH::Extrusion_Error otherwise
     def ExtrusionAlongPath(self, IDsOfElements, PathMesh, PathShape, NodeStart,
                            HasAngles, Angles, HasRefPoint, RefPoint,
                            MakeGroups=False, LinearVariation=False):
@@ -1922,11 +2059,16 @@ class Mesh:
         if ( isinstance( RefPoint, geompyDC.GEOM._objref_GEOM_Object)):
             RefPoint = self.smeshpyD.GetPointStruct(RefPoint)
             pass
+        if ( isinstance( PathMesh, Mesh )):
+            PathMesh = PathMesh.GetMesh()
+        if HasAngles and Angles and LinearVariation:
+            Angles = self.editor.LinearAnglesVariation( PathMesh, PathShape, Angles )
+            pass
         if MakeGroups:
-            return self.editor.ExtrusionAlongPathMakeGroups(IDsOfElements, PathMesh.GetMesh(),
+            return self.editor.ExtrusionAlongPathMakeGroups(IDsOfElements, PathMesh,
                                                             PathShape, NodeStart, HasAngles,
                                                             Angles, HasRefPoint, RefPoint)
-        return self.editor.ExtrusionAlongPath(IDsOfElements, PathMesh.GetMesh(), PathShape,
+        return self.editor.ExtrusionAlongPath(IDsOfElements, PathMesh, PathShape,
                                               NodeStart, HasAngles, Angles, HasRefPoint, RefPoint)
 
     ## Generate new elements by extrusion of the elements belong to object
@@ -1942,6 +2084,8 @@ class Mesh:
     #         User can specify any point as the Base Point and the shape will be rotated with respect to this point.
     #  @param MakeGroups to generate new groups from existing ones
     #  @param LinearVariation makes compute rotation angles as linear variation of given Angles along path steps
+    #  @return list of created groups (SMESH_GroupBase) and SMESH::Extrusion_Error if MakeGroups=True,
+    #          only SMESH::Extrusion_Error otherwise
     def ExtrusionAlongPathObject(self, theObject, PathMesh, PathShape, NodeStart,
                                  HasAngles, Angles, HasRefPoint, RefPoint,
                                  MakeGroups=False, LinearVariation=False):
@@ -1949,11 +2093,16 @@ class Mesh:
             theObject = theObject.GetMesh()
         if ( isinstance( RefPoint, geompyDC.GEOM._objref_GEOM_Object)):
             RefPoint = self.smeshpyD.GetPointStruct(RefPoint)
+        if ( isinstance( PathMesh, Mesh )):
+            PathMesh = PathMesh.GetMesh()
+        if HasAngles and Angles and LinearVariation:
+            Angles = self.editor.LinearAnglesVariation( PathMesh, PathShape, Angles )
+            pass
         if MakeGroups:
-            return self.editor.ExtrusionAlongPathObjectMakeGroups(theObject, PathMesh.GetMesh(),
+            return self.editor.ExtrusionAlongPathObjectMakeGroups(theObject, PathMesh,
                                                                   PathShape, NodeStart, HasAngles,
                                                                   Angles, HasRefPoint, RefPoint)
-        return self.editor.ExtrusionAlongPathObject(theObject, PathMesh.GetMesh(), PathShape,
+        return self.editor.ExtrusionAlongPathObject(theObject, PathMesh, PathShape,
                                                     NodeStart, HasAngles, Angles, HasRefPoint,
                                                     RefPoint)
 
@@ -1964,6 +2113,7 @@ class Mesh:
     #  If the Mirror is geom object this parameter is unnecessary
     #  @param Copy allows to copy element(Copy is 1) or to replace with its mirroring(Copy is 0)
     #  @param MakeGroups to generate new groups from existing ones (if Copy)
+    #  @return list of created groups (SMESH_GroupBase) if MakeGroups=True, empty list otherwise
     def Mirror(self, IDsOfElements, Mirror, theMirrorType, Copy=0, MakeGroups=False):
         if IDsOfElements == []:
             IDsOfElements = self.GetElementsId()
@@ -1981,6 +2131,7 @@ class Mesh:
     #  If the Mirror is geom object this parameter is unnecessary
     #  @param MakeGroups to generate new groups from existing ones
     #  @param NewMeshName is a name of new mesh to create
+    #  @return instance of Mesh class
     def MirrorMakeMesh(self, IDsOfElements, Mirror, theMirrorType, MakeGroups=0, NewMeshName=""):
         if IDsOfElements == []:
             IDsOfElements = self.GetElementsId()
@@ -1997,6 +2148,7 @@ class Mesh:
     #  If the Mirror is geom object this parameter is unnecessary
     #  @param Copy allows to copy element(Copy is 1) or to replace with its mirroring(Copy is 0)
     #  @param MakeGroups to generate new groups from existing ones (if Copy)
+    #  @return list of created groups (SMESH_GroupBase) if MakeGroups=True, empty list otherwise
     def MirrorObject (self, theObject, Mirror, theMirrorType, Copy=0, MakeGroups=False):
         if ( isinstance( theObject, Mesh )):
             theObject = theObject.GetMesh()
@@ -2014,6 +2166,7 @@ class Mesh:
     #  If the Mirror is geom object this parameter is unnecessary
     #  @param MakeGroups to generate new groups from existing ones
     #  @param NewMeshName is a name of new mesh to create
+    #  @return instance of Mesh class
     def MirrorObjectMakeMesh (self, theObject, Mirror, theMirrorType,MakeGroups=0, NewMeshName=""):
         if ( isinstance( theObject, Mesh )):
             theObject = theObject.GetMesh()
@@ -2028,6 +2181,7 @@ class Mesh:
     #  @param Vector direction of translation(DirStruct or vector)
     #  @param Copy allows to copy the translated elements
     #  @param MakeGroups to generate new groups from existing ones (if Copy)
+    #  @return list of created groups (SMESH_GroupBase) if MakeGroups=True, empty list otherwise
     def Translate(self, IDsOfElements, Vector, Copy, MakeGroups=False):
         if IDsOfElements == []:
             IDsOfElements = self.GetElementsId()
@@ -2043,6 +2197,7 @@ class Mesh:
     #  @param Vector direction of translation(DirStruct or vector)
     #  @param MakeGroups to generate new groups from existing ones
     #  @param NewMeshName is a name of new mesh to create
+    #  @return instance of Mesh class
     def TranslateMakeMesh(self, IDsOfElements, Vector, MakeGroups=False, NewMeshName=""):
         if IDsOfElements == []:
             IDsOfElements = self.GetElementsId()
@@ -2056,6 +2211,7 @@ class Mesh:
     #  @param Vector direction of translation(DirStruct or geom vector)
     #  @param Copy allows to copy the translated elements
     #  @param MakeGroups to generate new groups from existing ones (if Copy)
+    #  @return list of created groups (SMESH_GroupBase) if MakeGroups=True, empty list otherwise
     def TranslateObject(self, theObject, Vector, Copy, MakeGroups=False):
         if ( isinstance( theObject, Mesh )):
             theObject = theObject.GetMesh()
@@ -2071,6 +2227,7 @@ class Mesh:
     #  @param Vector direction of translation(DirStruct or geom vector)
     #  @param MakeGroups to generate new groups from existing ones
     #  @param NewMeshName is a name of new mesh to create
+    #  @return instance of Mesh class
     def TranslateObjectMakeMesh(self, theObject, Vector, MakeGroups=False, NewMeshName=""):
         if (isinstance(theObject, Mesh)):
             theObject = theObject.GetMesh()
@@ -2085,6 +2242,7 @@ class Mesh:
     #  @param AngleInRadians angle of rotation(in radians)
     #  @param Copy allows to copy the rotated elements
     #  @param MakeGroups to generate new groups from existing ones (if Copy)
+    #  @return list of created groups (SMESH_GroupBase) if MakeGroups=True, empty list otherwise
     def Rotate (self, IDsOfElements, Axis, AngleInRadians, Copy, MakeGroups=False):
         if IDsOfElements == []:
             IDsOfElements = self.GetElementsId()
@@ -2101,6 +2259,7 @@ class Mesh:
     #  @param AngleInRadians angle of rotation(in radians)
     #  @param MakeGroups to generate new groups from existing ones
     #  @param NewMeshName is a name of new mesh to create
+    #  @return instance of Mesh class
     def RotateMakeMesh (self, IDsOfElements, Axis, AngleInRadians, MakeGroups=0, NewMeshName=""):
         if IDsOfElements == []:
             IDsOfElements = self.GetElementsId()
@@ -2116,6 +2275,7 @@ class Mesh:
     #  @param AngleInRadians angle of rotation(in radians)
     #  @param Copy allows to copy the rotated elements
     #  @param MakeGroups to generate new groups from existing ones (if Copy)
+    #  @return list of created groups (SMESH_GroupBase) if MakeGroups=True, empty list otherwise
     def RotateObject (self, theObject, Axis, AngleInRadians, Copy, MakeGroups=False):
         if (isinstance(theObject, Mesh)):
             theObject = theObject.GetMesh()
@@ -2132,6 +2292,7 @@ class Mesh:
     #  @param AngleInRadians angle of rotation(in radians)
     #  @param MakeGroups to generate new groups from existing ones
     #  @param NewMeshName is a name of new mesh to create
+    #  @return instance of Mesh class
     def RotateObjectMakeMesh(self, theObject, Axis, AngleInRadians, MakeGroups=0,NewMeshName=""):
         if (isinstance( theObject, Mesh )):
             theObject = theObject.GetMesh()
@@ -2143,19 +2304,19 @@ class Mesh:
 
     ## Find group of nodes close to each other within Tolerance.
     #  @param Tolerance tolerance value
-    #  @param list of group of nodes
+    #  @return list of group of nodes
     def FindCoincidentNodes (self, Tolerance):
         return self.editor.FindCoincidentNodes(Tolerance)
 
     ## Find group of nodes close to each other within Tolerance.
     #  @param Tolerance tolerance value
     #  @param SubMeshOrGroup SubMesh or Group
-    #  @param list of group of nodes
+    #  @return list of group of nodes
     def FindCoincidentNodesOnPart (self, SubMeshOrGroup, Tolerance):
         return self.editor.FindCoincidentNodesOnPart(SubMeshOrGroup, Tolerance)
 
     ## Merge nodes
-    #  @param list of group of nodes
+    #  @param GroupsOfNodes list of group of nodes
     def MergeNodes (self, GroupsOfNodes):
         self.editor.MergeNodes(GroupsOfNodes)
 
@@ -2175,6 +2336,7 @@ class Mesh:
         self.editor.MergeEqualElements()
 
     ## Sew free borders
+    #  @return SMESH::Sew_Error
     def SewFreeBorders (self, FirstNodeID1, SecondNodeID1, LastNodeID1,
                         FirstNodeID2, SecondNodeID2, LastNodeID2,
                         CreatePolygons, CreatePolyedrs):
@@ -2183,12 +2345,14 @@ class Mesh:
                                           CreatePolygons, CreatePolyedrs)
 
     ## Sew conform free borders
+    #  @return SMESH::Sew_Error
     def SewConformFreeBorders (self, FirstNodeID1, SecondNodeID1, LastNodeID1,
                                FirstNodeID2, SecondNodeID2):
         return self.editor.SewConformFreeBorders(FirstNodeID1, SecondNodeID1, LastNodeID1,
                                                  FirstNodeID2, SecondNodeID2)
 
     ## Sew border to side
+    #  @return SMESH::Sew_Error
     def SewBorderToSide (self, FirstNodeIDOnFreeBorder, SecondNodeIDOnFreeBorder, LastNodeIDOnFreeBorder,
                          FirstNodeIDOnSide, LastNodeIDOnSide, CreatePolygons, CreatePolyedrs):
         return self.editor.SewBorderToSide(FirstNodeIDOnFreeBorder, SecondNodeIDOnFreeBorder, LastNodeIDOnFreeBorder,
@@ -2200,6 +2364,7 @@ class Mesh:
     #  equal and they should have similar node connectivity.
     #  The nodes to merge should belong to sides borders and
     #  the first node should be linked to the second.
+    #  @return SMESH::Sew_Error
     def SewSideElements (self, IDsOfSide1Elements, IDsOfSide2Elements,
                          NodeID1OfSide1ToMerge, NodeID1OfSide2ToMerge,
                          NodeID2OfSide1ToMerge, NodeID2OfSide2ToMerge):
@@ -2217,12 +2382,14 @@ class Mesh:
     ## If during last operation of MeshEditor some nodes were
     #  created this method returns list of its IDs, \n
     #  if new nodes not created - returns empty list
+    #  @return list of integer values (can be empty)
     def GetLastCreatedNodes(self):
         return self.editor.GetLastCreatedNodes()
 
     ## If during last operation of MeshEditor some elements were
     #  created this method returns list of its IDs, \n
     #  if new elements not creared - returns empty list
+    #  @return list of integer values (can be empty)
     def GetLastCreatedElems(self):
         return self.editor.GetLastCreatedElems()
 
@@ -2243,6 +2410,7 @@ class Mesh_Algorithm:
 
     ## Find hypothesis in study by its type name and parameters.
     #  Find only those hypothesis, which was created in smeshpyD engine.
+    #  @return SMESH.SMESH_Hypothesis
     def FindHypothesis (self, hypname, args, CompareMethod, smeshpyD):
         study = smeshpyD.GetCurrentStudy()
         #to do: find component by smeshpyD object, not by its data type
@@ -2284,6 +2452,7 @@ class Mesh_Algorithm:
 
     ## Find algorithm in study by its type name.
     #  Find only those algorithm, which was created in smeshpyD engine.
+    #  @return SMESH.SMESH_Algo
     def FindAlgorithm (self, algoname, smeshpyD):
         study = smeshpyD.GetCurrentStudy()
         #to do: find component by smeshpyD object, not by its data type
@@ -2438,6 +2607,7 @@ class Mesh_Segment(Mesh_Algorithm):
     #               p=0.5 means rounding of (edge_length / l) to the nearest integer,
     #               p=1 means rounding of (edge_length / l) to the lower integer.
     #           Default value is 1e-07.
+    #  @return an instance of StdMeshers_LocalLength hypothesis
     def LocalLength(self, l, UseExisting=0, p=1e-07):
         hyp = self.Hypothesis("LocalLength", [l,p], UseExisting=UseExisting,
                               CompareMethod=self.CompareLocalLength)
@@ -2445,6 +2615,7 @@ class Mesh_Segment(Mesh_Algorithm):
         hyp.SetPrecision(p)
         return hyp
 
+    ## Private method
     ## Check if the given "LocalLength" hypothesis has the same parameters as given arguments
     def CompareLocalLength(self, hyp, args):
         if IsEqual(hyp.GetLength(), args[0]):
@@ -2456,6 +2627,7 @@ class Mesh_Segment(Mesh_Algorithm):
     #  @param s for the scale factor (optional)
     #  @param UseExisting if ==true - search existing hypothesis created with
     #                     same parameters, else (default) - create new
+    #  @return an instance of StdMeshers_NumberOfSegments hypothesis
     def NumberOfSegments(self, n, s=[], UseExisting=0):
         if s == []:
             hyp = self.Hypothesis("NumberOfSegments", [n], UseExisting=UseExisting,
@@ -2468,6 +2640,7 @@ class Mesh_Segment(Mesh_Algorithm):
         hyp.SetNumberOfSegments(n)
         return hyp
 
+    ## Private method
     ## Check if the given "NumberOfSegments" hypothesis has the same parameters as given arguments
     def CompareNumberOfSegments(self, hyp, args):
         if hyp.GetNumberOfSegments() == args[0]:
@@ -2484,6 +2657,7 @@ class Mesh_Segment(Mesh_Algorithm):
     #  @param end   for the length of the last  segment
     #  @param UseExisting if ==true - search existing hypothesis created with
     #                     same parameters, else (default) - create new
+    #  @return an instance of StdMeshers_Arithmetic1D hypothesis
     def Arithmetic1D(self, start, end, UseExisting=0):
         hyp = self.Hypothesis("Arithmetic1D", [start, end], UseExisting=UseExisting,
                               CompareMethod=self.CompareArithmetic1D)
@@ -2491,6 +2665,7 @@ class Mesh_Segment(Mesh_Algorithm):
         hyp.SetLength(end  , 0)
         return hyp
 
+    ## Private method
     ## Check if the given "Arithmetic1D" hypothesis has the same parameters as given arguments
     def CompareArithmetic1D(self, hyp, args):
         if IsEqual(hyp.GetLength(1), args[0]):
@@ -2503,6 +2678,7 @@ class Mesh_Segment(Mesh_Algorithm):
     #  @param end   for the length of the last  segment
     #  @param UseExisting if ==true - search existing hypothesis created with
     #                     same parameters, else (default) - create new
+    #  @return an instance of StdMeshers_StartEndLength hypothesis
     def StartEndLength(self, start, end, UseExisting=0):
         hyp = self.Hypothesis("StartEndLength", [start, end], UseExisting=UseExisting,
                               CompareMethod=self.CompareStartEndLength)
@@ -3077,7 +3253,6 @@ class Mesh_Netgen(Mesh_Algorithm):
 #
 #  More details.
 class Mesh_Projection1D(Mesh_Algorithm):
-
     ## Private constructor.
     def __init__(self, mesh, geom=0):
         Mesh_Algorithm.__init__(self)
@@ -3122,7 +3297,6 @@ class Mesh_Projection2D(Mesh_Algorithm):
     def __init__(self, mesh, geom=0):
         Mesh_Algorithm.__init__(self)
         self.Create(mesh, geom, "Projection_2D")
-
     ## Define "Source Face" hypothesis, specifying a meshed face to
     #  take a mesh pattern from, and optionally association of vertices
     #  between the source face and a target one (where a hipothesis is assigned to)
index 124e4e8bc44e740d45b884a2f3c7e2bc749dc2a8..830fa0b1e8e0a1ea830d89834e76564999480233 100644 (file)
@@ -29,6 +29,8 @@
 #ifndef _STD_MESHERS_DISTRIBUTION_HXX_
 #define _STD_MESHERS_DISTRIBUTION_HXX_
 
+using namespace std;
+
 #include "SMESH_StdMeshers.hxx"
 
 #include <vector>
index 5850cb74ea5523b2b9922e542490b845c7488303..eccc3f5afd625e80f53836c09c7fdc3a9a1168c0 100644 (file)
@@ -44,6 +44,7 @@
 #include <BRep_Builder.hxx>
 #include <BRep_Tool.hxx>
 #include <TopExp.hxx>
+#include <TopExp_Explorer.hxx>
 #include <TopoDS_Face.hxx>
 #include <TopoDS_Vertex.hxx>
 #include <TopoDS_Wire.hxx>
@@ -505,12 +506,20 @@ TSideVector StdMeshers_FaceSide::GetFaceWires(const TopoDS_Face& theFace,
         return TSideVector(0);
       }
     }
+    // find out side orientation, which is important if there are several wires (PAL19080) 
+    bool isForward = true;
+    if ( nbWires > 1 ) {
+      TopExp_Explorer e( theFace, TopAbs_EDGE );
+      while ( ! e.Current().IsSame( wireEdges.back() ))
+        e.Next();
+      isForward = ( e.Current().Orientation() == wireEdges.back().Orientation() );
+    }
+
     StdMeshers_FaceSide* wire = new StdMeshers_FaceSide( theFace, wireEdges, &theMesh,
-                                                         true, theIgnoreMediumNodes);
+                                                         isForward, theIgnoreMediumNodes);
     wires[ iW ] = StdMeshers_FaceSidePtr( wire );
     from = to;
   }
   return wires;
 }
 
-
index 7b76b35455e95acc1fba4b4cfcb831cb2a266415..6307f167ebeacbe09a4f816af3f7ccfccc01f4a3 100644 (file)
@@ -113,6 +113,8 @@ bool StdMeshers_MEFISTO_2D::CheckHypothesis
 {
   _hypMaxElementArea = NULL;
   _hypLengthFromEdges = NULL;
+  _edgeLength = 0;
+  _maxElementArea = 0;
 
   list <const SMESHDS_Hypothesis * >::const_iterator itl;
   const SMESHDS_Hypothesis *theHyp;
@@ -121,8 +123,8 @@ bool StdMeshers_MEFISTO_2D::CheckHypothesis
   int nbHyp = hyps.size();
   if (!nbHyp)
   {
-    aStatus = SMESH_Hypothesis::HYP_MISSING;
-    return false;  // can't work with no hypothesis
+    aStatus = SMESH_Hypothesis::HYP_OK; //SMESH_Hypothesis::HYP_MISSING;
+    return true;  // (PAL13464) can work with no hypothesis, LengthFromEdges is default one
   }
 
   itl = hyps.begin();
@@ -137,7 +139,6 @@ bool StdMeshers_MEFISTO_2D::CheckHypothesis
     _hypMaxElementArea = static_cast<const StdMeshers_MaxElementArea *>(theHyp);
     ASSERT(_hypMaxElementArea);
     _maxElementArea = _hypMaxElementArea->GetMaxArea();
-    _edgeLength = 0;
     isOk = true;
     aStatus = SMESH_Hypothesis::HYP_OK;
   }
@@ -146,8 +147,6 @@ bool StdMeshers_MEFISTO_2D::CheckHypothesis
   {
     _hypLengthFromEdges = static_cast<const StdMeshers_LengthFromEdges *>(theHyp);
     ASSERT(_hypLengthFromEdges);
-    _edgeLength = 0;
-    _maxElementArea = 0;
     isOk = true;
     aStatus = SMESH_Hypothesis::HYP_OK;
   }
@@ -201,7 +200,7 @@ bool StdMeshers_MEFISTO_2D::Compute(SMESH_Mesh & aMesh, const TopoDS_Shape & aSh
                  SMESH_Comment("Too few segments: ")<<wires[0]->NbSegments());
 
   // compute average edge length
-  if (_hypLengthFromEdges)
+  if (!_hypMaxElementArea)
   {
     _edgeLength = 0;
     int nbSegments = 0;
@@ -215,7 +214,7 @@ bool StdMeshers_MEFISTO_2D::Compute(SMESH_Mesh & aMesh, const TopoDS_Shape & aSh
       _edgeLength /= nbSegments;
   }
 
-  if (_hypLengthFromEdges && _edgeLength < DBL_MIN )
+  if (/*_hypLengthFromEdges &&*/ _edgeLength < DBL_MIN )
     _edgeLength = 100;
 
   Z nblf;                 //nombre de lignes fermees (enveloppe en tete)
index bc229bd2c61554b012fc8042d4e1aea49a844849..8ca0b72b8dc02ec278c5c929dc76ddb757bce4d7 100644 (file)
@@ -83,7 +83,7 @@ protected:
 
   std::list<const SMDS_MeshNode*> myNodesOnCommonV;
 
-  SMESH_MesherHelper* myTool; // toll for working with quadratic elements
+  SMESH_MesherHelper* myTool; // tool for working with quadratic elements
 };
 
 #endif
index 4030cdfce3c7b8f362c41277f6b01bd2f30e45e8..8f3d233a280a14363d6cb214dc7d3b323891111b 100644 (file)
@@ -24,6 +24,8 @@
 //  File   : StdMeshers_Penta_3D.cxx
 //  Module : SMESH
 
+using namespace std;
+
 #include "StdMeshers_Penta_3D.hxx"
 
 #include "utilities.h"
index 3e143481a8183b2ee5368d6528e74ca05e53b5df..3b69a201f4612ce648f92389c883be8da7489828 100644 (file)
@@ -25,6 +25,7 @@
 // Created   : Fri Oct 27 10:24:28 2006
 // Author    : Edward AGAPOV (eap)
 
+using namespace std;
 
 #include "StdMeshers_ProjectionUtils.hxx"