1 // SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
3 // Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
24 // File : SMESH_Filter_i.cxx
25 // Author : Alexey Petrov, OCC
29 #include "SMESH_Filter_i.hxx"
31 #include "SMDS_Iterator.hxx"
32 #include "SMDS_MeshElement.hxx"
33 #include "SMDS_MeshNode.hxx"
34 #include "SMDSAbs_ElementType.hxx"
35 #include "SMESH_Gen_i.hxx"
36 #include "SMESHDS_Mesh.hxx"
41 #include <Precision.hxx>
42 #include <TColgp_SequenceOfXYZ.hxx>
43 #include <TColStd_ListOfInteger.hxx>
44 #include <TColStd_MapOfInteger.hxx>
45 #include <TColStd_ListIteratorOfListOfInteger.hxx>
51 static inline double getAngle( const gp_XYZ& P1, const gp_XYZ& P2, const gp_XYZ& P3 )
53 return gp_Vec( P1 - P2 ).Angle( gp_Vec( P3 - P2 ) );
56 static inline double getArea( const gp_XYZ& P1, const gp_XYZ& P2, const gp_XYZ& P3 )
58 gp_Vec aVec1( P2 - P1 );
59 gp_Vec aVec2( P3 - P1 );
60 return ( aVec1 ^ aVec2 ).Magnitude() * 0.5;
63 static inline double getArea( const gp_Pnt& P1, const gp_Pnt& P2, const gp_Pnt& P3 )
65 return getArea( P1.XYZ(), P2.XYZ(), P3.XYZ() );
68 static inline double getDistance( const gp_XYZ& P1, const gp_XYZ& P2 )
70 double aDist = gp_Pnt( P1 ).Distance( gp_Pnt( P2 ) );
74 static int getNbMultiConnection( SMESHDS_Mesh* theMesh, const int theId )
79 const SMDS_MeshElement* anEdge = theMesh->FindElement( theId );
80 if ( anEdge == 0 || anEdge->GetType() != SMDSAbs_Edge || anEdge->NbNodes() != 2 )
83 TColStd_MapOfInteger aMap;
86 SMDS_ElemIteratorPtr anIter = anEdge->nodesIterator();
89 while( anIter->more() )
91 const SMDS_MeshNode* aNode = (SMDS_MeshNode*)anIter->next();
94 SMDS_ElemIteratorPtr anElemIter = aNode->GetInverseElementIterator();
95 while( anElemIter->more() )
97 const SMDS_MeshElement* anElem = anElemIter->next();
98 if ( anElem != 0 && anElem->GetType() != SMDSAbs_Edge )
100 int anId = anElem->GetID();
102 if ( anIter->more() ) // i.e. first node
104 else if ( aMap.Contains( anId ) )
108 // delete anElemIter;
117 using namespace SMESH;
124 Class : NumericalFunctor_i
125 Description : Base class for numerical functors
128 NumericalFunctor_i::NumericalFunctor_i()
129 : SALOME::GenericObj_i( SMESH_Gen_i::GetPOA() )
132 SMESH_Gen_i::GetPOA()->activate_object( this );
135 void NumericalFunctor_i::SetMesh( SMESH_Mesh_ptr theMesh )
137 SMESH_Mesh_i* anImplPtr =
138 dynamic_cast<SMESH_Mesh_i*>( SMESH_Gen_i::GetServant( theMesh ).in() );
139 myMesh = anImplPtr ? anImplPtr->GetImpl().GetMeshDS() : 0;
142 bool NumericalFunctor_i::getPoints( const int theId,
143 TColgp_SequenceOfXYZ& theRes ) const
150 // Get nodes of the face
151 const SMDS_MeshElement* anElem = myMesh->FindElement( theId );
152 if ( anElem == 0 || anElem->GetType() != GetType() )
155 int nbNodes = anElem->NbNodes();
157 SMDS_ElemIteratorPtr anIter = anElem->nodesIterator();
160 while( anIter->more() )
162 const SMDS_MeshNode* aNode = (SMDS_MeshNode*)anIter->next();
164 theRes.Append( gp_XYZ( aNode->X(), aNode->Y(), aNode->Z() ) );
175 Class : SMESH_MinimumAngleFunct
176 Description : Functor for calculation of minimum angle
179 CORBA::Double MinimumAngle_i::GetValue( CORBA::Long theId )
181 TColgp_SequenceOfXYZ P;
182 if ( !getPoints( theId, P ) || P.Length() != 3 && P.Length() != 4 )
187 if ( P.Length() == 3 )
189 double A0 = getAngle( P( 3 ), P( 1 ), P( 2 ) );
190 double A1 = getAngle( P( 1 ), P( 2 ), P( 3 ) );
191 double A2 = getAngle( P( 2 ), P( 3 ), P( 1 ) );
193 aMin = Min( A0, Min( A1, A2 ) );
197 double A0 = getAngle( P( 4 ), P( 1 ), P( 2 ) );
198 double A1 = getAngle( P( 1 ), P( 2 ), P( 3 ) );
199 double A2 = getAngle( P( 2 ), P( 3 ), P( 4 ) );
200 double A3 = getAngle( P( 3 ), P( 4 ), P( 1 ) );
202 aMin = Min( Min( A0, A1 ), Min( A2, A3 ) );
205 return aMin * 180 / PI;
208 int MinimumAngle_i::GetType() const
214 Class : AspectRatio_i
215 Description : Functor for calculating aspect ratio
218 CORBA::Double AspectRatio_i::GetValue( CORBA::Long theId )
220 TColgp_SequenceOfXYZ P;
221 if ( !getPoints( theId, P ) || P.Length() != 3 && P.Length() != 4 )
224 int nbNodes = P.Length();
226 // Compute lengths of the sides
228 double aLen[ nbNodes ];
229 for ( int i = 0; i < nbNodes - 1; i++ )
230 aLen[ i ] = getDistance( P( i + 1 ), P( i + 2 ) );
231 aLen[ nbNodes - 1 ] = getDistance( P( 1 ), P( nbNodes ) );
233 // Compute aspect ratio
237 double aMaxLen = Max( aLen[ 0 ], Max( aLen[ 1 ], aLen[ 2 ] ) );
238 double anArea = getArea( P( 1 ), P( 2 ), P( 3 ) );
239 static double aCoef = sqrt( 3. ) / 4;
241 return anArea != 0 ? aCoef * aMaxLen * aMaxLen / anArea : 0;
245 double aMaxLen = Max( Max( aLen[ 0 ], aLen[ 1 ] ), Max( aLen[ 2 ], aLen[ 3 ] ) );
246 double aMinLen = Min( Min( aLen[ 0 ], aLen[ 1 ] ), Min( aLen[ 2 ], aLen[ 3 ] ) );
248 return aMinLen != 0 ? aMaxLen / aMinLen : 0;
252 int AspectRatio_i::GetType() const
259 Description : Functor for calculating warping
262 CORBA::Double Warping_i::GetValue( CORBA::Long theId )
264 TColgp_SequenceOfXYZ P;
265 if ( !getPoints( theId, P ) || P.Length() != 4 )
268 gp_XYZ G = ( P( 1 ) + P( 2 ) + P( 3 ) + P( 4 ) ) / 4;
270 double A1 = ComputeA( P( 1 ), P( 2 ), P( 3 ), G );
271 double A2 = ComputeA( P( 2 ), P( 3 ), P( 4 ), G );
272 double A3 = ComputeA( P( 3 ), P( 4 ), P( 1 ), G );
273 double A4 = ComputeA( P( 4 ), P( 1 ), P( 2 ), G );
275 return Max( Max( A1, A2 ), Max( A3, A4 ) );
278 double Warping_i::ComputeA( const gp_XYZ& thePnt1,
279 const gp_XYZ& thePnt2,
280 const gp_XYZ& thePnt3,
281 const gp_XYZ& theG ) const
283 double aLen1 = gp_Pnt( thePnt1 ).Distance( gp_Pnt( thePnt2 ) );
284 double aLen2 = gp_Pnt( thePnt2 ).Distance( gp_Pnt( thePnt3 ) );
285 double L = Min( aLen1, aLen2 ) * 0.5;
287 gp_XYZ GI = ( thePnt2 - thePnt1 ) / 2. - theG;
288 gp_XYZ GJ = ( thePnt3 - thePnt2 ) / 2. - theG;
289 gp_XYZ N = GI.Crossed( GJ );
292 double H = gp_Vec( thePnt2 - theG ).Dot( gp_Vec( N ) );
293 return asin( fabs( H / L ) ) * 180 / PI;
296 int Warping_i::GetType() const
303 Description : Functor for calculating taper
306 CORBA::Double Taper_i::GetValue( CORBA::Long theId )
308 TColgp_SequenceOfXYZ P;
309 if ( !getPoints( theId, P ) || P.Length() != 4 )
313 double J1 = getArea( P( 4 ), P( 1 ), P( 2 ) ) / 2;
314 double J2 = getArea( P( 3 ), P( 1 ), P( 2 ) ) / 2;
315 double J3 = getArea( P( 2 ), P( 3 ), P( 4 ) ) / 2;
316 double J4 = getArea( P( 3 ), P( 4 ), P( 1 ) ) / 2;
318 double JA = 0.25 * ( J1 + J2 + J3 + J4 );
320 double T1 = fabs( ( J1 - JA ) / JA );
321 double T2 = fabs( ( J2 - JA ) / JA );
322 double T3 = fabs( ( J3 - JA ) / JA );
323 double T4 = fabs( ( J4 - JA ) / JA );
325 return Max( Max( T1, T2 ), Max( T3, T4 ) );
328 int Taper_i::GetType() const
335 Description : Functor for calculating skew in degrees
338 static inline double skewAngle( const gp_XYZ& p1, const gp_XYZ& p2, const gp_XYZ& p3 )
340 gp_XYZ p12 = ( p2 + p1 ) / 2;
341 gp_XYZ p23 = ( p3 + p2 ) / 2;
342 gp_XYZ p31 = ( p3 + p1 ) / 2;
344 return gp_Vec( p31 - p2 ).Angle( p12 - p23 );
347 CORBA::Double Skew_i::GetValue( CORBA::Long theId )
349 TColgp_SequenceOfXYZ P;
350 if ( !getPoints( theId, P ) || P.Length() != 3 && P.Length() != 4 )
354 static double PI2 = PI / 2;
355 if ( P.Length() == 3 )
357 double A0 = fabs( PI2 - skewAngle( P( 3 ), P( 1 ), P( 2 ) ) );
358 double A1 = fabs( PI2 - skewAngle( P( 1 ), P( 2 ), P( 3 ) ) );
359 double A2 = fabs( PI2 - skewAngle( P( 2 ), P( 3 ), P( 1 ) ) );
361 return Max( A0, Max( A1, A2 ) ) * 180 / PI;
365 gp_XYZ p12 = ( P( 1 ) + P( 2 ) ) / 2;
366 gp_XYZ p23 = ( P( 2 ) + P( 3 ) ) / 2;
367 gp_XYZ p34 = ( P( 3 ) + P( 4 ) ) / 2;
368 gp_XYZ p41 = ( P( 4 ) + P( 1 ) ) / 2;
370 double A = fabs( PI2 - gp_Vec( p34 - p12 ).Angle( p23 - p41 ) );
376 int Skew_i::GetType() const
383 Description : Functor for calculating area
386 CORBA::Double Area_i::GetValue( CORBA::Long theId )
388 TColgp_SequenceOfXYZ P;
389 if ( !getPoints( theId, P ) || P.Length() != 3 && P.Length() != 4 )
392 if ( P.Length() == 3 )
393 return getArea( P( 1 ), P( 2 ), P( 3 ) );
395 return getArea( P( 1 ), P( 2 ), P( 3 ) ) + getArea( P( 1 ), P( 3 ), P( 4 ) );
398 int Area_i::GetType() const
405 Description : Functor for calculating length off edge
408 CORBA::Double Length_i::GetValue( CORBA::Long theId )
410 TColgp_SequenceOfXYZ P;
411 return getPoints( theId, P ) && P.Length() == 2 ? getDistance( P( 1 ), P( 2 ) ) : 0;
414 int Length_i::GetType() const
420 Class : MultiConnection_i
421 Description : Functor for calculating number of faces conneted to the edge
424 CORBA::Double MultiConnection_i::GetValue( CORBA::Long theId )
426 return getNbMultiConnection( myMesh, theId );
429 int MultiConnection_i::GetType() const
440 Description : Base class for all predicates
442 Predicate_i::Predicate_i()
443 : SALOME::GenericObj_i( SMESH_Gen_i::GetPOA() )
445 SMESH_Gen_i::GetPOA()->activate_object( this );
450 Class : FreeBorders_i
451 Description : Predicate for free borders
454 FreeBorders_i::FreeBorders_i()
459 void FreeBorders_i::SetMesh( SMESH_Mesh_ptr theMesh )
461 SMESH_Mesh_i* anImplPtr =
462 dynamic_cast<SMESH_Mesh_i*>( SMESH_Gen_i::GetServant( theMesh ).in() );
463 myMesh = anImplPtr ? anImplPtr->GetImpl().GetMeshDS() : 0;
466 CORBA::Boolean FreeBorders_i::IsSatisfy( CORBA::Long theId )
468 return getNbMultiConnection( myMesh, theId ) == 1;
471 int FreeBorders_i::GetType() const
478 Description : Base class for comparators
481 Comparator_i::Comparator_i()
487 Comparator_i::~Comparator_i()
489 if ( myFunctor != 0 )
490 myFunctor->Destroy();
493 void Comparator_i::SetMesh( SMESH_Mesh_ptr theMesh )
495 if ( myFunctor != 0 )
496 myFunctor->SetMesh( theMesh );
499 void Comparator_i::SetMargin( CORBA::Double theValue )
504 void Comparator_i::SetNumFunctor( NumericalFunctor_ptr theFunct )
506 if ( myFunctor != 0 )
507 myFunctor->Destroy();
509 myFunctor = dynamic_cast<NumericalFunctor_i*>( SMESH_Gen_i::GetServant( theFunct ).in() );
511 if ( myFunctor != 0 )
512 myFunctor->Register();
515 int Comparator_i::GetType() const
517 return myFunctor != 0 ? myFunctor->GetType() : SMDSAbs_All;
522 Description : Comparator "<"
525 CORBA::Boolean LessThan_i::IsSatisfy( CORBA::Long theId )
527 return myFunctor != 0 && myFunctor->GetValue( theId ) < myMargin;
532 Description : Comparator ">"
535 CORBA::Boolean MoreThan_i::IsSatisfy( CORBA::Long theId )
537 return myFunctor != 0 && myFunctor->GetValue( theId ) > myMargin;
542 Description : Comparator "="
544 EqualTo_i::EqualTo_i()
546 myToler = Precision::Confusion();
549 CORBA::Boolean EqualTo_i::IsSatisfy( CORBA::Long theId )
551 return myFunctor != 0 && fabs( myFunctor->GetValue( theId ) - myMargin ) < myToler;
554 void EqualTo_i::SetTolerance( CORBA::Double theToler )
562 Description : Logical NOT predicate
565 LogicalNOT_i::LogicalNOT_i()
570 LogicalNOT_i::~LogicalNOT_i()
573 myPredicate->Destroy();
576 CORBA::Boolean LogicalNOT_i::IsSatisfy( CORBA::Long theId )
578 return myPredicate !=0 && !myPredicate->IsSatisfy( theId );
581 void LogicalNOT_i::SetMesh( SMESH_Mesh_ptr theMesh )
583 if ( myPredicate != 0 )
584 myPredicate->SetMesh( theMesh );
587 void LogicalNOT_i::SetPredicate( Predicate_ptr thePred )
589 if ( myPredicate != 0 )
590 myPredicate->Destroy();
592 myPredicate = dynamic_cast<Predicate_i*>( SMESH_Gen_i::GetServant( thePred ).in() );
594 if ( myPredicate != 0 )
595 myPredicate->Register();
598 int LogicalNOT_i::GetType() const
600 return myPredicate != 0 ? myPredicate->GetType() : SMDSAbs_All;
605 Class : LogicalBinary_i
606 Description : Base class for binary logical predicate
609 LogicalBinary_i::LogicalBinary_i()
614 LogicalBinary_i::~LogicalBinary_i()
616 if ( myPredicate1 != 0 )
617 myPredicate1->Destroy();
619 if ( myPredicate2 != 0 )
620 myPredicate2->Destroy();
623 void LogicalBinary_i::SetMesh( SMESH_Mesh_ptr theMesh )
625 if ( myPredicate1 != 0 )
626 myPredicate1->SetMesh( theMesh );
628 if ( myPredicate2 != 0 )
629 myPredicate2->SetMesh( theMesh );
632 void LogicalBinary_i::SetPredicate1( Predicate_ptr thePredicate )
634 if ( myPredicate1 != 0 )
635 myPredicate1->Destroy();
637 myPredicate1 = dynamic_cast<Predicate_i*>( SMESH_Gen_i::GetServant( thePredicate ).in() );
639 if ( myPredicate1 != 0 )
640 myPredicate1->Register();
643 void LogicalBinary_i::SetPredicate2( Predicate_ptr thePredicate )
645 if ( myPredicate2 != 0 )
646 myPredicate2->Destroy();
648 myPredicate2 = dynamic_cast<Predicate_i*>( SMESH_Gen_i::GetServant( thePredicate ).in() );
650 if ( myPredicate2 != 0 )
651 myPredicate2->Register();
654 int LogicalBinary_i::GetType() const
656 if ( myPredicate1 == 0 || myPredicate2 == 0 )
659 int aType1 = myPredicate1->GetType();
660 int aType2 = myPredicate2->GetType();
662 return aType1 == aType2 ? aType1 : SMDSAbs_All;
667 Description : Logical AND
670 CORBA::Boolean LogicalAND_i::IsSatisfy( CORBA::Long theId )
672 return myPredicate1 != 0 &&
674 myPredicate1->IsSatisfy( theId ) && myPredicate2->IsSatisfy( theId );;
679 Description : Logical OR
682 CORBA::Boolean LogicalOR_i::IsSatisfy( CORBA::Long theId )
684 return myPredicate1 != 0 &&
686 myPredicate1->IsSatisfy( theId ) || myPredicate2->IsSatisfy( theId );
699 Filter_i::~Filter_i()
701 if ( myPredicate != 0 )
702 myPredicate->Destroy();
705 void Filter_i::SetPredicate( Predicate_ptr thePredicate )
707 if ( myPredicate != 0 )
708 myPredicate->Destroy();
710 myPredicate = dynamic_cast<Predicate_i*>( SMESH_Gen_i::GetServant( thePredicate ).in() );
712 if ( myPredicate != 0 )
713 myPredicate->Register();
716 void Filter_i::SetMesh( SMESH_Mesh_ptr theMesh )
718 if ( myPredicate != 0 )
719 myPredicate->SetMesh( theMesh );
722 SMESH::long_array* Filter_i::GetElementsId( SMESH_Mesh_ptr theMesh )
727 SMESH_Mesh_i* anImplPtr =
728 dynamic_cast<SMESH_Mesh_i*>( SMESH_Gen_i::GetServant( theMesh ).in() );
730 TColStd_ListOfInteger aList;
732 if ( anImplPtr != 0 )
734 SMESHDS_Mesh* aMesh = anImplPtr->GetImpl().GetMeshDS();
736 if ( myPredicate != 0 )
738 int aType = myPredicate->GetType();
740 if ( aType == SMDSAbs_Edge )
742 SMDS_EdgeIteratorPtr anIter = aMesh->edgesIterator();
745 while( anIter->more() )
747 const SMDS_MeshElement* anElem = anIter->next();
748 if ( myPredicate->IsSatisfy( anElem->GetID() ) )
749 aList.Append( anElem->GetID() );
754 else if ( aType == SMDSAbs_Face )
756 SMDS_FaceIteratorPtr anIter = aMesh->facesIterator();
759 while( anIter->more() )
761 const SMDS_MeshElement* anElem = anIter->next();
762 if ( myPredicate->IsSatisfy( anElem->GetID() ) )
763 aList.Append( anElem->GetID() );
771 SMESH::long_array_var anArray = new SMESH::long_array;
773 anArray->length( aList.Extent() );
774 TColStd_ListIteratorOfListOfInteger anIter( aList );
776 for( ; anIter.More(); anIter.Next() )
777 anArray[ i++ ] = anIter.Value();
779 return anArray._retn();
786 FilterManager_i::FilterManager_i()
787 : SALOME::GenericObj_i( SMESH_Gen_i::GetPOA() )
789 SMESH_Gen_i::GetPOA()->activate_object( this );
792 MinimumAngle_ptr FilterManager_i::CreateMinimumAngle()
794 SMESH::MinimumAngle_i* aServant = new SMESH::MinimumAngle_i();
795 SMESH::MinimumAngle_var anObj = aServant->_this();
796 return anObj._retn();
800 AspectRatio_ptr FilterManager_i::CreateAspectRatio()
802 SMESH::AspectRatio_i* aServant = new SMESH::AspectRatio_i();
803 SMESH::AspectRatio_var anObj = aServant->_this();
804 return anObj._retn();
808 Warping_ptr FilterManager_i::CreateWarping()
810 SMESH::Warping_i* aServant = new SMESH::Warping_i();
811 SMESH::Warping_var anObj = aServant->_this();
812 return anObj._retn();
816 Taper_ptr FilterManager_i::CreateTaper()
818 SMESH::Taper_i* aServant = new SMESH::Taper_i();
819 SMESH::Taper_var anObj = aServant->_this();
820 return anObj._retn();
824 Skew_ptr FilterManager_i::CreateSkew()
826 SMESH::Skew_i* aServant = new SMESH::Skew_i();
827 SMESH::Skew_var anObj = aServant->_this();
828 return anObj._retn();
832 Area_ptr FilterManager_i::CreateArea()
834 SMESH::Area_i* aServant = new SMESH::Area_i();
835 SMESH::Area_var anObj = aServant->_this();
836 return anObj._retn();
840 Length_ptr FilterManager_i::CreateLength()
842 SMESH::Length_i* aServant = new SMESH::Length_i();
843 SMESH::Length_var anObj = aServant->_this();
844 return anObj._retn();
848 MultiConnection_ptr FilterManager_i::CreateMultiConnection()
850 SMESH::MultiConnection_i* aServant = new SMESH::MultiConnection_i();
851 SMESH::MultiConnection_var anObj = aServant->_this();
852 return anObj._retn();
856 FreeBorders_ptr FilterManager_i::CreateFreeBorders()
858 SMESH::FreeBorders_i* aServant = new SMESH::FreeBorders_i();
859 SMESH::FreeBorders_var anObj = aServant->_this();
860 return anObj._retn();
863 LessThan_ptr FilterManager_i::CreateLessThan()
865 SMESH::LessThan_i* aServant = new SMESH::LessThan_i();
866 SMESH::LessThan_var anObj = aServant->_this();
867 return anObj._retn();
871 MoreThan_ptr FilterManager_i::CreateMoreThan()
873 SMESH::MoreThan_i* aServant = new SMESH::MoreThan_i();
874 SMESH::MoreThan_var anObj = aServant->_this();
875 return anObj._retn();
878 EqualTo_ptr FilterManager_i::CreateEqualTo()
880 SMESH::EqualTo_i* aServant = new SMESH::EqualTo_i();
881 SMESH::EqualTo_var anObj = aServant->_this();
882 return anObj._retn();
886 LogicalNOT_ptr FilterManager_i::CreateLogicalNOT()
888 SMESH::LogicalNOT_i* aServant = new SMESH::LogicalNOT_i();
889 SMESH::LogicalNOT_var anObj = aServant->_this();
890 return anObj._retn();
894 LogicalAND_ptr FilterManager_i::CreateLogicalAND()
896 SMESH::LogicalAND_i* aServant = new SMESH::LogicalAND_i();
897 SMESH::LogicalAND_var anObj = aServant->_this();
898 return anObj._retn();
902 LogicalOR_ptr FilterManager_i::CreateLogicalOR()
904 SMESH::LogicalOR_i* aServant = new SMESH::LogicalOR_i();
905 SMESH::LogicalOR_var anObj = aServant->_this();
906 return anObj._retn();
909 Filter_ptr FilterManager_i::CreateFilter()
911 SMESH::Filter_i* aServant = new SMESH::Filter_i();
912 SMESH::Filter_var anObj = aServant->_this();
913 return anObj._retn();