-SMDS_Position *SMDS_MeshNode::GetPosition()
-{
- return myPosition;
-}
-
-const SMDS_Position *SMDS_MeshNode::GetPosition() const
-{
- return myPosition;
-}
-/**
-*/
-SMDS_Iterator<const SMDS_MeshElement*> * SMDS_MeshNode::
- GetInverseElementIterator() const
-{
- class SMDS_InverseElementIterator:public SMDS_Iterator<const SMDS_MeshElement*>
- {
- const set<const SMDS_MeshElement*>& mySet;
- set<const SMDS_MeshElement*>::iterator myIterator;
- public:
- SMDS_InverseElementIterator(const set<const SMDS_MeshElement*>& s):mySet(s)
- {
- myIterator=mySet.begin();
- }
-
- bool more()
- {
- return myIterator!=mySet.end();
- }
-
- const SMDS_MeshElement* next()
- {
- const SMDS_MeshElement* current=*myIterator;
- myIterator++;
- return current;
- }
- };
- return new SMDS_InverseElementIterator(myInverseElements);
-}
-
-SMDS_Iterator<const SMDS_MeshElement *> * SMDS_MeshNode::
- elementsIterator(SMDSAbs_ElementType type) const
-{
- // Same as GetInverseElementIterator but the create iterator only return
- // wanted type elements.
- class MyIterator:public SMDS_Iterator<const SMDS_MeshElement*>
- {
- set<const SMDS_MeshElement*> mySet;
- set<const SMDS_MeshElement*>::iterator myIterator;
- public:
- MyIterator(SMDSAbs_ElementType type,
- const set<const SMDS_MeshElement*>& s)
- {
- const SMDS_MeshElement * e;
- bool toInsert;
- set<const SMDS_MeshElement*>::iterator it=s.begin();
- while(it!=s.end())
- {
- e=*it;
- switch(type)
- {
- case SMDSAbs_Edge: toInsert=true; break;
- case SMDSAbs_Face: toInsert=(e->GetType()!=SMDSAbs_Edge); break;
- case SMDSAbs_Volume: toInsert=(e->GetType()==SMDSAbs_Volume); break;
- }
- if(toInsert) mySet.insert(e);
- it++;
- }
- myIterator=mySet.begin();
- }
-
- bool more()
- {
- return myIterator!=mySet.end();
- }
-
- const SMDS_MeshElement* next()
- {
- const SMDS_MeshElement* current=*myIterator;
- myIterator++;
- return current;
- }
- };
-
- if(type==SMDSAbs_Node)
- return SMDS_MeshElement::elementsIterator(SMDSAbs_Node);
- else
- return new SMDS_IteratorOfElements(this,type,
- new MyIterator(type, myInverseElements));
-}
-
-int SMDS_MeshNode::NbNodes() const
-{
- return 1;
+ //=======================================================================
+ /*!
+ * \brief Iterator on a node
+ */
+ //=======================================================================
+
+ template< class ELEM_ITERATOR >
+ struct Iterator : public ELEM_ITERATOR
+ {
+ typedef typename ELEM_ITERATOR::value_type element_type;
+ const SMDS_MeshNode* myNode;
+
+ Iterator( const SMDS_MeshNode* n ): myNode( n ) {}
+
+ virtual bool more()
+ {
+ return myNode;
+ }
+ virtual element_type next()
+ {
+ element_type res = static_cast<element_type>( myNode );
+ myNode = 0;
+ return res;
+ }
+ };
+}
+
+SMDS_ElemIteratorPtr SMDS_MeshNode::GetInverseElementIterator(SMDSAbs_ElementType type) const
+{
+ if ( GetMesh()->NbElements() > 0 ) // avoid building links
+ {
+ vtkCellLinks::Link& l = getGrid()->GetLinks()->GetLink( GetVtkID() );
+ return boost::make_shared< InverseIterator >( GetMesh(), l.cells, l.ncells, type );
+ }
+ else
+ {
+ return boost::make_shared< InverseIterator >();
+ }
+}
+
+SMDS_ElemIteratorPtr SMDS_MeshNode::nodesIterator() const
+{
+ return boost::make_shared< Iterator< SMDS_ElemIterator > >( this );
+}
+
+SMDS_NodeIteratorPtr SMDS_MeshNode::nodeIterator() const
+{
+ return boost::make_shared< Iterator< SMDS_NodeIterator > >( this );
+}
+
+const SMDS_MeshNode* SMDS_MeshNode::GetNode(const int ind) const
+{
+ return ind == 0 ? this : 0;
+}
+
+double* SMDS_MeshNode::getCoord() const
+{
+ return getGrid()->GetPoint( GetVtkID() );