]> SALOME platform Git repositories - modules/smesh.git/commitdiff
Salome HOME
Merge branch 'imn/IMACS' of salome:modules/smesh into imn/IMACS
authorrnv <rnv@opencascade.com>
Wed, 4 Oct 2017 07:47:59 +0000 (10:47 +0300)
committerrnv <rnv@opencascade.com>
Wed, 4 Oct 2017 07:47:59 +0000 (10:47 +0300)
src/SMESH/SMESH_MeshEditor.cxx
src/SMESHUtils/SMESH_MeshAlgos.cxx
src/SMESH_I/SMESH_MeshEditor_i.cxx
src/SMESH_SWIG_WITHIHM/libSMESH_Swig.cxx
src/SMESH_SWIG_WITHIHM/libSMESH_Swig.h
src/SMESH_SWIG_WITHIHM/libSMESH_Swig.i

index f9d0348c79d4fa19f71d878b98a8bbe20bbd3f1a..a3d2b226e49a9f2ffb7b73fa9e297d0347c7e835 100644 (file)
@@ -12867,9 +12867,23 @@ namespace // utils for MakePolyLine
 
     bool Extend( const gp_XYZ& plnNorm, const gp_XYZ& plnOrig );
 
+    bool ReachSamePoint( const Path& other );
+
     static void Remove( std::vector< Path > & paths, size_t& i );
   };
 
+  //================================================================================
+  /*!
+   * \brief Return true if this Path meats another
+   */
+  //================================================================================
+
+  bool Path::ReachSamePoint( const Path& other )
+  {
+    return ( mySrcPntInd != other.mySrcPntInd &&
+             myFace == other.myFace );
+  }
+
   //================================================================================
   /*!
    * \brief Remove a path from a vector
@@ -12884,12 +12898,15 @@ namespace // utils for MakePolyLine
       if ( i < j )
       {
         paths[ i ].myPoints.swap( paths[ j ].myPoints );
-        paths[ i ].myFace     = paths[ j ].myFace;
-        paths[ i ].myNodeInd1 = paths[ j ].myNodeInd1;
-        paths[ i ].myNodeInd2 = paths[ j ].myNodeInd2;
-        paths[ i ].myNode1    = paths[ j ].myNode1;
-        paths[ i ].myNode2    = paths[ j ].myNode2;
-        paths[ i ].myLength   = paths[ j ].myLength;
+        paths[ i ].myLength    = paths[ j ].myLength;
+        paths[ i ].mySrcPntInd = paths[ j ].mySrcPntInd;
+        paths[ i ].myFace      = paths[ j ].myFace;
+        paths[ i ].myNode1     = paths[ j ].myNode1;
+        paths[ i ].myNode2     = paths[ j ].myNode2;
+        paths[ i ].myNodeInd1  = paths[ j ].myNodeInd1;
+        paths[ i ].myNodeInd2  = paths[ j ].myNodeInd2;
+        paths[ i ].myDot1      = paths[ j ].myDot1;
+        paths[ i ].myDot2      = paths[ j ].myDot2;
       }
     }
     paths.pop_back();
@@ -13056,7 +13073,7 @@ namespace // utils for MakePolyLine
       if ( polySeg.myNode2[1] ) p2 = 0.5 * ( p2 + SMESH_NodeXYZ( polySeg.myNode2[1] ));
 
       gp_XYZ plnNorm = ( p1 - p2 ) ^ polySeg.myVector.XYZ();
-      gp_XYZ plnOrig = SMESH_NodeXYZ( polySeg.myNode1[0] );
+      gp_XYZ plnOrig = p2;
 
       // find paths connecting the 2 end points of polySeg
 
@@ -13139,9 +13156,7 @@ namespace // utils for MakePolyLine
           // join paths that reach same point
           for ( size_t j = 0; j < paths.size(); ++j )
           {
-            if ( i != j &&
-                 paths[i].myFace == paths[j].myFace &&
-                 paths[i].mySrcPntInd != paths[j].mySrcPntInd )
+            if ( i != j && paths[i].ReachSamePoint( paths[j] ))
             {
               double   distLast = ( paths[i].myPoints.back() - paths[j].myPoints.back() ).Modulus();
               double fullLength = ( paths[i].myLength + paths[j].myLength + distLast );
@@ -13194,6 +13209,7 @@ void SMESH_MeshEditor::MakePolyLine( TListOfPolySegments&   theSegments,
   // get cutting planes
 
   std::vector< bool > isVectorOK( theSegments.size(), true );
+  const double planarCoef = 0.333; // plane height in planar case
 
   for ( size_t iSeg = 0; iSeg < theSegments.size(); ++iSeg )
   {
@@ -13216,8 +13232,16 @@ void SMESH_MeshEditor::MakePolyLine( TListOfPolySegments&   theSegments,
       if ( polySeg.myMidProjPoint.Distance( pMid ) < Precision::Confusion() )
       {
         SMESH_MeshAlgos::FaceNormal( face, const_cast< gp_XYZ& >( polySeg.myVector.XYZ() ));
-        polySeg.myMidProjPoint = pMid + polySeg.myVector.XYZ();
+        polySeg.myMidProjPoint = pMid + polySeg.myVector.XYZ() * ( p1 - p2 ).Modulus() * planarCoef;
       }
+      else
+      {
+        polySeg.myVector = polySeg.myMidProjPoint.XYZ() - pMid;
+      }
+    }
+    else
+    {
+      polySeg.myVector = plnNorm ^ ( p1 - p2 );
     }
   }
 
@@ -13265,21 +13289,24 @@ void SMESH_MeshEditor::MakePolyLine( TListOfPolySegments&   theSegments,
 
     // return a vector
 
+    gp_XYZ pMid = 0.5 * ( path.myPoints[0] + path.myPoints.back() );
     if ( isVectorOK[ iSeg ])
     {
       // find the most distance point of a path
       double maxDist = 0;
       for ( size_t iP = 1; iP < path.myPoints.size(); ++iP )
       {
-        double dist = theSegments[iSeg].myVector * ( path.myPoints[iP] - path.myPoints[0] );
+        double dist = Abs( theSegments[iSeg].myVector * ( path.myPoints[iP] - path.myPoints[0] ));
         if ( dist > maxDist )
         {
           maxDist = dist;
           theSegments[iSeg].myMidProjPoint = path.myPoints[iP];
         }
       }
+      if ( maxDist < Precision::Confusion() ) // planar case
+        theSegments[iSeg].myMidProjPoint =
+          pMid + theSegments[iSeg].myVector.XYZ().Normalized() * path.myLength * planarCoef;
     }
-    gp_XYZ pMid = 0.5 * ( path.myPoints[0] + path.myPoints.back() );
     theSegments[iSeg].myVector = gp_Vec( pMid, theSegments[iSeg].myMidProjPoint );
   }
 
index 8e03e4e679e6ecdd6bf67c4f0366e01f59e34e3e..4bcfc1d97ac42121e6d072fbf0723c15f237efdb 100644 (file)
@@ -1641,7 +1641,7 @@ double SMESH_MeshAlgos::GetDistance( const SMDS_MeshFace* face,
   case POS_RIGHT:
   {
     // point is inside the face
-    double distToFacePlane = tmpPnt.Y();
+    double distToFacePlane = Abs( tmpPnt.Y() );
     if ( closestPnt )
     {
       if ( distToFacePlane < std::numeric_limits<double>::min() ) {
@@ -1653,7 +1653,7 @@ double SMESH_MeshAlgos::GetDistance( const SMDS_MeshFace* face,
         *closestPnt = tmpPnt;
       }
     }
-    return Abs( distToFacePlane );
+    return distToFacePlane;
   }
   case POS_VERTEX:
   {
index 7ef2f4633a874324b8ad4062caaabf77b36ef40d..5e4c7fd65660432881fdc4315637b60abb28495d 100644 (file)
@@ -6864,12 +6864,14 @@ void SMESH_MeshEditor_i::MakePolyLine(SMESH::ListOfPolySegments& theSegments,
   initData(/*deleteSearchers=*/false);
 
   SMESHDS_Group* groupDS = 0;
+  SMESHDS_Mesh*   meshDS = getMeshDS();
   if ( myIsPreviewMode ) // copy faces to the tmp mesh
   {
     TPreviewMesh * tmpMesh = getPreviewMesh( SMDSAbs_Edge );
     SMDS_ElemIteratorPtr faceIt = getMeshDS()->elementsIterator( SMDSAbs_Face );
     while ( faceIt->more() )
       tmpMesh->Copy( faceIt->next() );
+    meshDS = tmpMesh->GetMeshDS();
   }
   else if ( theGroupName[0] ) // find/create a group of segments
   {
@@ -6898,10 +6900,10 @@ void SMESH_MeshEditor_i::MakePolyLine(SMESH::ListOfPolySegments& theSegments,
   {
     SMESH::PolySegment&               segIn = theSegments[ i ];
     ::SMESH_MeshEditor::PolySegment& segOut = segments[ i ];
-    segOut.myNode1[0] = getMeshDS()->FindNode( segIn.node1ID1 );
-    segOut.myNode2[0] = getMeshDS()->FindNode( segIn.node1ID2 );
-    segOut.myNode1[1] = getMeshDS()->FindNode( segIn.node2ID1 );
-    segOut.myNode2[1] = getMeshDS()->FindNode( segIn.node2ID2 );
+    segOut.myNode1[0] = meshDS->FindNode( segIn.node1ID1 );
+    segOut.myNode2[0] = meshDS->FindNode( segIn.node1ID2 );
+    segOut.myNode1[1] = meshDS->FindNode( segIn.node2ID1 );
+    segOut.myNode2[1] = meshDS->FindNode( segIn.node2ID2 );
     segOut.myVector.SetCoord( segIn.vector.PS.x,
                               segIn.vector.PS.y,
                               segIn.vector.PS.z );
index f9527fbb8c7c8a2d47cab26d33240d5354f03b59..f8a61b76644f80cf43f82c62d3b3275818768bb8 100644 (file)
@@ -684,6 +684,25 @@ void SMESH_Swig::EraseActor( const char* Mesh_Entry, const bool allViewers )
   ProcessVoidEvent(new TEvent(Mesh_Entry, allViewers));
 }
 
+void SMESH_Swig::UpdateActor( const char* Mesh_Entry ) {
+  class TEvent: public SALOME_Event
+  {
+  private:
+    const char* _entry;
+  public:
+    TEvent( const char* Mesh_Entry ) {
+      _entry = Mesh_Entry;
+    }
+    virtual void Execute() {
+      Handle(SALOME_InteractiveObject) anIO = new SALOME_InteractiveObject
+        ( _entry, "SMESH", "" );
+      SMESH::Update( anIO, true );
+    }
+  };
+
+  ProcessVoidEvent( new TEvent(Mesh_Entry) );
+}
+
 void SMESH_Swig::SetName(const char* theEntry,
                          const char* theName)
 {
index f6cde69485b393271817ac8114656b37d31a96ed..654c3e699c200ba8e0fdec51d6d9d1c0f6dafa8b 100644 (file)
@@ -89,6 +89,8 @@ public:
 
   void                       EraseActor( const char*, const bool allViewers = false );
 
+  void                       UpdateActor( const char* Mesh_Entry );
+
   /*!
    * \brief Set mesh icon according to compute status
     * \param Mesh_Entry - entry of a mesh
index 5f66f9f21011d7b066c187bc43bc681de1c238bf..aecaf8e0a7ba56862aa57e49f4ee676c82aa5c2e 100644 (file)
@@ -101,6 +101,11 @@ class SMESH_Swig
 
   void CreateAndDisplayActor( const char* Mesh_Entry );
   void EraseActor( const char* Mesh_Entry, const bool allViewers = false );
+  void UpdateActor( const char* Mesh_Entry );
+
+  void setSelectionMode( SelectionMode selectionMode);
+  std::vector<int> getSelected( const char* Mesh_Entry );
+  std::vector<std::pair<int,int> > getSelectedEdgeOfCell( const char* Mesh_Entry );
 
   void setSelectionMode( SelectionMode selectionMode);
   std::vector<int> getSelected( const char* Mesh_Entry );