--- /dev/null
+// Copyright (C) 2007-2008 CEA/DEN, EDF R&D
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+// ---
+// File : GeomSelectionTools.cxx
+// Authors : Nicolas GEIMER (OCC)
+// ---
+//
+
+
+#include "GeomSelectionTools.h"
+
+#include <LightApp_SelectionMgr.h>
+#include <SalomeApp_Application.h>
+#include <SUIT_Session.h>
+
+#include <SALOME_ListIteratorOfListIO.hxx>
+#include <GEOM_Client.hxx>
+#include <SMESHGUI_Utils.h>
+#include <boost/shared_ptr.hpp>
+#include <GEOMImpl_Types.hxx>
+
+#include <TopoDS.hxx>
+#include <BRep_Tool.hxx>
+#include <Handle_Geom_Surface.hxx>
+#include <BRepAdaptor_Surface.hxx>
+
+#include "utilities.h"
+
+#include "SALOME_LifeCycleCORBA.hxx"
+#include <sstream>
+
+/*!
+ * Constructor
+ * @param aStudy pointer to the Study
+ *
+ */
+GeomSelectionTools::GeomSelectionTools(_PTR(Study) aStudy)
+{
+ myStudy = aStudy;
+}
+
+/*!
+ * Accessor to the Study used by this GeomSelectionTools object
+ * @return The study used by the GeomSelectionTools class
+ */
+_PTR(Study) GeomSelectionTools::getMyStudy()
+{
+ return myStudy;
+}
+
+/*!
+ * Allows to get the Salome Application
+ * @return A LightApp_SelectionMgr Pointer or 0 if it can't get it.
+ */
+SalomeApp_Application* GeomSelectionTools::GetSalomeApplication()
+{
+ SalomeApp_Application* anApp = dynamic_cast<SalomeApp_Application*>( SUIT_Session::session()->activeApplication() );
+ if (anApp)
+ return anApp;
+ else
+ return 0;
+}
+
+/*!
+ * Allows to get the selection manager from LightApp
+ * @return A LightApp_SelectionMgr Pointer or 0 if it can't get it.
+ */
+LightApp_SelectionMgr* GeomSelectionTools::selectionMgr()
+{
+ SalomeApp_Application* anApp = GetSalomeApplication();
+ if (anApp)
+ return dynamic_cast<LightApp_SelectionMgr*>( anApp->selectionMgr() );
+ else
+ return 0;
+}
+
+/*!
+ * Return the list of the selected Salome Interactive Object (SALOME_ListIO*)
+ * @return the list of the selected Salome Interactive Object
+ */
+SALOME_ListIO* GeomSelectionTools::getSelectedSalomeObjects()
+{
+ SALOME_ListIO* selected;
+ LightApp_SelectionMgr* aSel = selectionMgr();
+ aSel->selectedObjects( *selected, NULL, false );
+ return selected;
+}
+
+/*!
+ * Return the first selected Salome Interactive Object (Handle(Salome_InteractiveObject))
+ * @return the first selected Salome Interactive Object
+ */
+Handle(SALOME_InteractiveObject) GeomSelectionTools::getFirstSelectedSalomeObject()
+{
+ SALOME_ListIO selected;
+ LightApp_SelectionMgr* aSel = selectionMgr();
+ aSel->selectedObjects( selected, NULL, false );
+ if (!selected.IsEmpty()){
+ SALOME_ListIteratorOfListIO anIt(selected);
+ Handle(SALOME_InteractiveObject) anIO;
+ anIO = anIt.Value();
+ return anIO;
+ }
+ return NULL;
+}
+
+/*!
+ * Return the entry of the first selected Object
+ * @return the entry of the first selected Object
+ */
+std::string GeomSelectionTools::getFirstSelectedEntry()
+{
+ Handle(SALOME_InteractiveObject) anIO;
+ std::string entry="";
+ anIO=GeomSelectionTools::getFirstSelectedSalomeObject();
+ return GeomSelectionTools::getEntryOfObject(anIO);
+}
+
+/*!
+ * Return the entry of a Salome Interactive Object
+ * @param anIO the Handle of the Salome Interactive Object
+ * @return the entry of the Salome Interactive Object
+ */
+std::string GeomSelectionTools::getEntryOfObject(Handle(SALOME_InteractiveObject) anIO){
+ std::string entry="";
+ _PTR(SObject) aSO = myStudy->FindObjectID(anIO->getEntry());
+ if (aSO){
+ _PTR(SObject) aRefSObj;
+ // If selected object is a reference
+ if ( aSO->ReferencedObject( aRefSObj ))
+ entry = aRefSObj->GetID();
+ // If selected object is a reference is not a reference
+ else
+ entry= anIO->getEntry();
+ }
+ return entry;
+}
+
+/*!
+ * Retrieve the name from the entry of the object
+ * @param entry the entry of the object
+ * @return the name of the object
+ */
+std::string GeomSelectionTools::getNameFromEntry(std::string entry){
+ std::string name = "";
+ _PTR(SObject) aSO = myStudy->FindObjectID(entry);
+ if (aSO){
+ _PTR(SObject) aRefSObj;
+ // If selected object is a reference
+ if ( aSO->ReferencedObject( aRefSObj ))
+ name = aRefSObj->GetName();
+ // If selected object is a reference is not a reference
+ else
+ name = aSO->GetName();
+ }
+ return name;
+}
+
+
+/*!
+ * Retrieve the component type of the first selected object, it manages successfully references.
+ * @return the component type of the first selected object
+ */
+std::string GeomSelectionTools::getFirstSelectedComponentDataType()
+{
+ Handle(SALOME_InteractiveObject) anIO;
+ std::string DataType="";
+ anIO=GeomSelectionTools::getFirstSelectedSalomeObject();
+ _PTR(SObject) aSO = myStudy->FindObjectID(anIO->getEntry());
+ if (aSO){
+ _PTR(SObject) aRefSObj;
+ // If selected object is a reference
+ if ( aSO->ReferencedObject( aRefSObj ))
+ DataType= aRefSObj->GetFatherComponent()->ComponentDataType();
+ // If selected object is a reference is not a reference
+ else
+ DataType=anIO->getComponentDataType();
+ }
+ return DataType;
+}
+
+/*!
+ * Retrieve the shape type from the entry
+ * @return the shape type from the entry, return TopAbs_SHAPE if the object does not define a shape or a group.
+ */
+TopAbs_ShapeEnum GeomSelectionTools::entryToShapeType(std::string entry){
+// MESSAGE("GeomSelectionTools::entryToShapeType"<<entry );
+ TopoDS_Shape S = TopoDS_Shape();
+ TopAbs_ShapeEnum ShapeType = TopAbs_SHAPE;
+ _PTR(SObject) aSO = myStudy->FindObjectID(entry);
+ if (aSO){
+ _PTR(SObject) aRefSObj;
+ GEOM::GEOM_Object_var aShape;
+ // MESSAGE("Got a SO");
+ // If selected object is a reference
+ if ( aSO->ReferencedObject( aRefSObj ))
+ aSO = aRefSObj;
+ // MESSAGE("aSO->GetFatherComponent()->ComponentDataType(): " << aSO->GetFatherComponent()->ComponentDataType());
+ if ( strcmp(aSO->GetFatherComponent()->ComponentDataType().c_str(),"GEOM") == 0)
+ aShape = SMESH::SObjectToInterface<GEOM::GEOM_Object>(aSO);
+ if ( !aShape->_is_nil() ){
+ // MESSAGE("Got the Geom Object ");
+ // MESSAGE("Geom Object Type "<< aShape->GetType());
+ SalomeApp_Application* anApp = GetSalomeApplication();
+ if (anApp) {
+// MESSAGE("Got Application");
+ Engines::Component_var component = anApp->lcc()->FindOrLoad_Component( "FactoryServer","GEOM" );
+ GEOM::GEOM_Gen_var _geomEngine = GEOM::GEOM_Gen::_narrow(component);
+// MESSAGE("Got GEOM engine");
+ // if the Geom Object is a group
+ if (aShape->GetType() == GEOM_GROUP){
+// MESSAGE("It's a group");
+ GEOM::GEOM_IGroupOperations_var aGroupOp = _geomEngine->GetIGroupOperations(myStudy->StudyId());
+ ShapeType= (TopAbs_ShapeEnum)aGroupOp->GetType(aShape);
+ }
+ // if not
+ else {
+ GEOM_Client* aClient = new GEOM_Client();
+ if ( aClient && !_geomEngine->_is_nil() ) {
+// MESSAGE("GEOM client is OK and GEOM engine is not null");
+ S = aClient->GetShape( _geomEngine, aShape );
+ ShapeType=S.ShapeType();
+ }
+ }
+ }
+ }
+ }
+// MESSAGE("ShapeType returned is " << ShapeType);
+ return ShapeType;
+}
+
+/*!
+ * Gives the ShapeType of the first Selected Object, return TopAbs_SHAPE if the first selected object does not define a shape.
+ * @return the ShapeType of the first Selected Object, return TopAbs_SHAPE if the first selected object does not define a shape.
+ */
+TopAbs_ShapeEnum GeomSelectionTools:: getFirstSelectedShapeType()
+{
+ Handle(SALOME_InteractiveObject) anIO;
+ anIO=GeomSelectionTools::getFirstSelectedSalomeObject();
+ return entryToShapeType(anIO->getEntry());
+}
+
+/*!
+ * Print information to std output of the face
+ * and return the OCC type of face: Plane, Cylinder,Cone, Sphere, Torus, BezierSurface,BSplineSurface, SurfaceOfRevolution,SurfaceOfExtrusion, OtherSurface
+ * @param TopoDS_Shape S Face we want information about.
+ * @return the OCC type of face: Plane, Cylinder,Cone, Sphere, Torus, BezierSurface,BSplineSurface, SurfaceOfRevolution,SurfaceOfExtrusion, OtherSurface
+ * return Other_Surface if the selected face is not a face.
+ * Information printed is :
+ * U and V degrees
+ * U and V number of poles
+ * U and V number of knots
+ * U or V is Rational ?
+ *
+ */
+GeomAbs_SurfaceType GeomSelectionTools::getFaceInformation(TopoDS_Shape S)
+{
+ GeomAbs_SurfaceType surf_type=GeomAbs_OtherSurface ;
+ if (!S.IsNull() && S.ShapeType()==TopAbs_FACE){
+ TopoDS_Face f=TopoDS::Face(S);
+ Handle(Geom_Surface) surf = BRep_Tool::Surface(f);
+ BRepAdaptor_Surface surf_adap=BRepAdaptor_Surface::BRepAdaptor_Surface(f);
+
+ /* Global Information */
+ std::cout << "GLOBAL INFORMATION" << std::endl;
+ std::cout << "******************" << std::endl;
+ std::stringstream buffer;
+ buffer << "Degre U : " << surf_adap.UDegree();
+ //conversion nécessaire pour affichage
+ std::cout << buffer.str() << std::endl;
+ std::cout << " Degre V : " << surf_adap.VDegree() << std::endl;
+ std::cout << " Nb Poles U : " << surf_adap.NbUPoles() << std::endl;
+ std::cout << " Nb Poles V : " << surf_adap.NbVPoles() << std::endl;
+ std::cout << " Nb Noeuds U : " << surf_adap.NbUKnots() << std::endl;
+ std::cout << " Nb Noeuds V : " << surf_adap.NbVKnots() << std::endl;
+ std::cout << " U Rationnel ? " << surf_adap.IsURational() << std::endl;
+ std::cout << " V Rationnel ? " << surf_adap.IsVRational() << std::endl;
+
+ surf_type=surf_adap.GetType();
+ }
+ return surf_type;
+}
+
+
+
+
--- /dev/null
+// Copyright (C) 2007-2008 CEA/DEN, EDF R&D
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License.
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+// ---
+// File : GeomSelectionTools.h
+// Authors : Nicolas GEIMER (OCC)
+// ---
+#ifndef _GEOMSELECTIONTOOLS_H_
+#define _GEOMSELECTIONTOOLS_H_
+
+#ifdef WIN32
+# ifdef GeomSelectionTools_EXPORTS
+# define GEOMSELECTIONTOOLS_EXPORT __declspec( dllexport )
+# else
+# define GEOMSELECTIONTOOLS_EXPORT __declspec( dllimport )
+# endif
+#else
+# define GEOMSELECTIONTOOLS_EXPORT
+#endif
+
+#include "SALOMEDSClient.hxx"
+#include "SALOME_InteractiveObject.hxx"
+#include <SALOME_ListIO.hxx>
+#include <SalomeApp_Application.h>
+
+#include <TopoDS_Shape.hxx>
+#include <GeomAbs_SurfaceType.hxx>
+
+class LightApp_SelectionMgr;
+
+
+/*!
+ * The GeomSelectionTools class gives high level tools to select Geom (and other objects)
+ * A specific attention has been given to analyze selected GEOM objects.
+ *
+ * @param myStudy This class is specific to the study !
+ *
+ */
+
+class GEOMSELECTIONTOOLS_EXPORT GeomSelectionTools
+{
+
+private:
+
+ _PTR(Study) myStudy;
+
+public:
+
+ GeomSelectionTools(_PTR(Study));
+ static SalomeApp_Application* GetSalomeApplication();
+ static LightApp_SelectionMgr* selectionMgr();
+ SALOME_ListIO* getSelectedSalomeObjects();
+ Handle(SALOME_InteractiveObject) getFirstSelectedSalomeObject();
+ std::string getFirstSelectedEntry();
+ std::string getEntryOfObject(Handle(SALOME_InteractiveObject));
+ std::string getNameFromEntry(std::string);
+ std::string getFirstSelectedComponentDataType();
+ TopAbs_ShapeEnum getFirstSelectedShapeType();
+ TopAbs_ShapeEnum entryToShapeType(std::string );
+ GeomAbs_SurfaceType getFaceInformation(TopoDS_Shape);
+ _PTR(Study) getMyStudy();
+};
+
+
+#endif // _GEOMSELECTIONTOOLS_H_
+