1 // Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 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.salome-platform.org/ or email : webmaster.salome@opencascade.com
23 // File : SMESH_NumberFilter.cxx
26 #include "SMESH_NumberFilter.hxx"
28 #include "GEOM_Client.hxx"
29 #include "GeometryGUI.h"
31 #include "SUIT_Application.h"
32 #include "SUIT_Session.h"
34 #include "SalomeApp_Study.h"
35 #include "LightApp_DataOwner.h"
37 #include "SALOME_InteractiveObject.hxx"
38 #include "SALOMEDSClient_SObject.hxx"
39 #include "SALOMEDS_SObject.hxx"
41 #include <TopExp_Explorer.hxx>
42 #include <TopTools_IndexedMapOfShape.hxx>
46 * Class : SMESH_NumberFilter
47 * Description : Filter for geom objects.
48 * Filter geom objects by number of subshapes of the given type
51 //=======================================================================
52 // name : SMESH_NumberFilter::SMESH_NumberFilter
53 // Purpose : Constructor
54 //=======================================================================
55 SMESH_NumberFilter::SMESH_NumberFilter (const char* theKind,
56 const TopAbs_ShapeEnum theSubShapeType,
58 const TopAbs_ShapeEnum theShapeType,
59 GEOM::GEOM_Object_ptr theMainObj,
60 const bool theIsClosedOnly)
62 myKind = (char*)theKind;
63 mySubShapeType = theSubShapeType;
65 myIsClosedOnly = theIsClosedOnly;
66 myShapeTypes.Add(theShapeType);
67 myMainObj = GEOM::GEOM_Object::_duplicate(theMainObj);
70 //=======================================================================
71 // name : SMESH_NumberFilter::SMESH_NumberFilter
72 // Purpose : Constructor
73 //=======================================================================
74 SMESH_NumberFilter::SMESH_NumberFilter (const char* theKind,
75 const TopAbs_ShapeEnum theSubShapeType,
77 const TColStd_MapOfInteger& theShapeTypes,
78 GEOM::GEOM_Object_ptr theMainObj,
79 const bool theIsClosedOnly )
81 myKind = (char*)theKind;
82 mySubShapeType = theSubShapeType;
84 myIsClosedOnly = theIsClosedOnly;
85 myShapeTypes = theShapeTypes;
86 myMainObj = GEOM::GEOM_Object::_duplicate(theMainObj);
89 SMESH_NumberFilter::~SMESH_NumberFilter()
93 //=======================================================================
94 // name : SMESH_NumberFilter::SMESH_NumberFilter
95 // Purpose : Verify validity of entry object
96 //=======================================================================
97 bool SMESH_NumberFilter::isOk (const SUIT_DataOwner* theDataOwner) const
102 // Get geom object from IO
103 GEOM::GEOM_Object_var aGeomObj = getGeom(theDataOwner);
104 if (aGeomObj->_is_nil())
107 // Get shape from geom object and verify its parameters
108 GEOM_Client aGeomClient;
109 if ( CORBA::is_nil( GeometryGUI::GetGeomGen() ) && !GeometryGUI::InitGeomGen() )
111 TopoDS_Shape aShape = aGeomClient.GetShape(GeometryGUI::GetGeomGen(), aGeomObj);
112 if (aShape.IsNull() ||
113 !myShapeTypes.Contains(aShape.ShapeType()))
116 if (myIsClosedOnly && aShape.ShapeType() == TopAbs_SHELL && !aShape.Closed())
119 // Verify whether shape of entry object is sub-shape of myMainObj
120 if (!myMainObj->_is_nil()) {
121 TopoDS_Shape aMainShape = aGeomClient.GetShape(GeometryGUI::GetGeomGen(), myMainObj);
122 if (aMainShape.IsNull())
125 bool isFound = false;
126 TopAbs_ShapeEnum aShapeType = aShape.ShapeType();
127 TopExp_Explorer anExp (aMainShape, aShapeType);
128 for (; anExp.More(); anExp.Next()) {
129 if (anExp.Current() == aShape) {
138 // Verify number of sub-shapes
139 if (mySubShapeType == TopAbs_SHAPE);
142 TopTools_IndexedMapOfShape aMap;
143 TopExp::MapShapes(aShape, mySubShapeType, aMap);
146 return myNumber == aMap.Extent(); // given number
148 return aMap.Extent(); // at least one?
151 //=======================================================================
152 // name : SMESH_NumberFilter::getGeom
153 // Purpose : Retrieve geom object from SALOME_InteractiveObject
154 //=======================================================================
155 GEOM::GEOM_Object_ptr SMESH_NumberFilter::getGeom
156 (const SUIT_DataOwner* theDataOwner, const bool extractReference ) const
158 const LightApp_DataOwner* owner =
159 dynamic_cast<const LightApp_DataOwner*>(theDataOwner);
160 SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>
161 (SUIT_Session::session()->activeApplication()->activeStudy());
163 GEOM::GEOM_Object_var anObj;
165 if (!owner || !appStudy)
166 return GEOM::GEOM_Object::_nil();
168 _PTR(Study) study = appStudy->studyDS();
169 QString entry = owner->entry();
171 _PTR(SObject) aSO( study->FindObjectID( entry.toLatin1().data() ) ), aRefSO;
172 if( extractReference && aSO && aSO->ReferencedObject( aRefSO ) )
176 return GEOM::GEOM_Object::_nil();
178 CORBA::Object_var anObject = _CAST(SObject,aSO)->GetObject();
179 anObj = GEOM::GEOM_Object::_narrow(anObject);
180 if (!CORBA::is_nil(anObj))
181 return anObj._retn();
183 // Get geom object corresponding to the mesh
184 if ( myKind == "SMESH" ) {
185 _PTR(ChildIterator) anIter = study->NewChildIterator(aSO);
186 for (; anIter->More(); anIter->Next()) {
187 _PTR(SObject) aSO = anIter->Value();
190 _PTR(SObject) aRefSO;
192 if (aSO->ReferencedObject(aRefSO))
198 anObject = _CAST(SObject,anObj)->GetObject();
199 GEOM::GEOM_Object_var aMeshShape = GEOM::GEOM_Object::_narrow(anObject);
201 if (!aMeshShape->_is_nil())
202 return aMeshShape._retn();
206 return GEOM::GEOM_Object::_nil();
209 void SMESH_NumberFilter::SetSubShapeType (const TopAbs_ShapeEnum theSubShapeType)
211 mySubShapeType = theSubShapeType;
214 void SMESH_NumberFilter::SetNumber (const int theNumber)
216 myNumber = theNumber;
219 void SMESH_NumberFilter::SetClosedOnly (const bool theIsClosedOnly)
221 myIsClosedOnly = theIsClosedOnly;
224 void SMESH_NumberFilter::SetShapeType (const TopAbs_ShapeEnum theShapeType)
226 myShapeTypes.Add( theShapeType );
229 void SMESH_NumberFilter::SetMainShape (GEOM::GEOM_Object_ptr theMainObj)
231 myMainObj = GEOM::GEOM_Object::_duplicate(theMainObj);