+ //================================================================================
+ /*!
+ * \brief Return true if it's possible to make a loop over corner2Sides starting
+ * from the startSide
+ */
+ //================================================================================
+
+ bool isClosedChainOfSides( _BlockSide* startSide,
+ map< const SMDS_MeshNode*, list< _BlockSide* > > & corner2Sides )
+ {
+ // get start and end nodes
+ const SMDS_MeshNode *n1 = 0, *n2 = 0, *n;
+ for ( int y = 0; y < 2; ++y )
+ for ( int x = 0; x < 2; ++x )
+ {
+ n = startSide->getCornerNode(x,y);
+ if ( !corner2Sides.count( n )) continue;
+ if ( n1 )
+ n2 = n;
+ else
+ n1 = n;
+ }
+ if ( !n2 ) return false;
+
+ map< const SMDS_MeshNode*, list< _BlockSide* > >::iterator
+ c2sides = corner2Sides.find( n1 );
+ if ( c2sides == corner2Sides.end() ) return false;
+
+ int nbChainLinks = 1;
+ n = n1;
+ _BlockSide* prevSide = startSide;
+ while ( n != n2 )
+ {
+ // get the next side sharing n
+ list< _BlockSide* > & sides = c2sides->second;
+ _BlockSide* nextSide = ( sides.back() == prevSide ? sides.front() : sides.back() );
+ if ( nextSide == prevSide ) return false;
+
+ // find the next corner of the nextSide being in corner2Sides
+ n1 = n;
+ n = 0;
+ for ( int y = 0; y < 2 && !n; ++y )
+ for ( int x = 0; x < 2; ++x )
+ {
+ n = nextSide->getCornerNode(x,y);
+ c2sides = corner2Sides.find( n );
+ if ( n == n1 || c2sides == corner2Sides.end() )
+ n = 0;
+ else
+ break;
+ }
+ if ( !n ) return false;
+
+ prevSide = nextSide;
+ nbChainLinks++;
+ }
+
+ return ( n == n2 && nbChainLinks == NB_QUAD_SIDES );
+ }
+