+//================================================================================
+/*!
+ * \brief Return iterator on inverse elements of a node that may be a proxy one
+ */
+//================================================================================
+
+SMDS_ElemIteratorPtr SMESH_ProxyMesh::GetInverseElementIterator(const SMDS_MeshNode* node,
+ SMDSAbs_ElementType type) const
+{
+ typedef std::vector< const SMDS_MeshElement* > TElemVec;
+ TElemVec *elemVecPtr;
+
+ TNodeElemVecMap& inverseElements = const_cast< TNodeElemVecMap& >( _inverseElements );
+ if ( inverseElements.IsEmpty() && NbProxySubMeshes() > 0 )
+ {
+ TElemVec elemVec;
+ for ( size_t i = 0; i < _subMeshes.size(); ++i )
+ if ( _subMeshes[i] )
+ for ( size_t j = 0; j < _subMeshes[i]->_elements.size(); ++j )
+ {
+ const SMDS_MeshElement* e = _subMeshes[i]->_elements[j];
+ for ( SMDS_NodeIteratorPtr nIt = e->nodeIterator(); nIt->more(); )
+ {
+ const SMDS_MeshNode* n = nIt->next();
+ elemVecPtr = inverseElements.ChangeSeek( n );
+ if ( !elemVecPtr )
+ elemVecPtr = inverseElements.Bound( n, elemVec );
+ elemVecPtr->push_back( e );
+ }
+ }
+ }
+
+ SMDS_ElemIteratorPtr iter = node->GetInverseElementIterator( type );
+
+ if (( elemVecPtr = inverseElements.ChangeSeek( node )))
+ {
+ if ( iter->more() )
+ iter = boost::make_shared< TUniqueIterator >( *elemVecPtr, iter );
+ else
+ iter = boost::make_shared< SMDS_ElementVectorIterator> ( elemVecPtr->begin(),
+ elemVecPtr->end() );
+ }
+
+ return iter;
+}
+
+//================================================================================
+/*!
+ * \brief Check if a FACE has prisms on its both sides
+ * \param [in] smFace - sub-mesh of the FACE. NOT a proxy sub-mesh!
+ * \return bool - true if there are prisms on the two sides
+ */
+//================================================================================
+
+bool SMESH_ProxyMesh::HasPrismsOnTwoSides( SMESHDS_SubMesh* smFace )
+{
+ if ( !smFace || smFace->NbElements() == 0 )
+ return false;
+
+ SMDS_ElemIteratorPtr faces = smFace->GetElements();
+ while ( faces->more() )
+ {
+ const SMDS_MeshElement* f = faces->next();
+ std::vector<const SMDS_MeshNode*> fNodes( f->begin_nodes(), f->end_nodes() );
+ std::vector<const SMDS_MeshElement*> vols;
+ if ( SMDS_Mesh::GetElementsByNodes( fNodes, vols, SMDSAbs_Volume ) < 2 )
+ return false;
+ return ( vols[0]->NbCornerNodes() == 2 * f->NbCornerNodes() &&
+ vols[1]->NbCornerNodes() == 2 * f->NbCornerNodes() );
+ }
+ return false;
+}
+
+//================================================================================
+/*!
+ * \brief SubMesh Constructor
+ */
+//================================================================================
+
+SMESH_ProxyMesh::SubMesh::SubMesh( const SMDS_Mesh* mesh, int index )
+ : SMESHDS_SubMesh( static_cast<const SMESHDS_Mesh*>( mesh ), index ),
+ _n2n(0)
+{
+}
+