]> SALOME platform Git repositories - modules/geom.git/commitdiff
Salome HOME
added debug messages only
authormbs <martin.bernhard@opencascade.com>
Mon, 6 Mar 2023 19:12:23 +0000 (19:12 +0000)
committermbs <martin.bernhard@opencascade.com>
Mon, 27 Mar 2023 10:42:48 +0000 (11:42 +0100)
src/GEOMGUI/GEOMGUI_OCCSelector.cxx
src/GEOMGUI/GEOMGUI_Selection.cxx
src/GEOMGUI/GEOM_Displayer.cxx
src/GEOMGUI/GeometryGUI.cxx
src/GEOMGUI/MBDebug.h [new file with mode: 0644]
src/GEOMGUI/MBOCC.h [new file with mode: 0644]

index d967d6752ab31ca87a08a6faabaaf03476492136..bad30b4cec45b909969a9468e6aa17fb4ac702a8 100644 (file)
 
 #include <Basics_OCCTVersion.hxx>
 
+//---------------------------------------------------------
+#define USE_DEBUG
+//#define MB_IGNORE_QT
+#define MBCLASSNAME "GEOMGUI_OCCSelector"
+#include "MBDebug.h"
+//---------------------------------------------------------
+
 //================================================================
 // Function : GEOMGUI_OCCSelector
 // Purpose  :
@@ -59,6 +66,7 @@
 GEOMGUI_OCCSelector::GEOMGUI_OCCSelector( OCCViewer_Viewer* viewer, SUIT_SelectionMgr* mgr )
 : LightApp_OCCSelector( viewer, mgr )
 {
+  DBG_FUN();
 }
 
 //================================================================
@@ -67,6 +75,7 @@ GEOMGUI_OCCSelector::GEOMGUI_OCCSelector( OCCViewer_Viewer* viewer, SUIT_Selecti
 //================================================================
 GEOMGUI_OCCSelector::~GEOMGUI_OCCSelector()
 {
+  DBG_FUN();
 }
 
 //================================================================
@@ -75,6 +84,7 @@ GEOMGUI_OCCSelector::~GEOMGUI_OCCSelector()
 //================================================================
 void GEOMGUI_OCCSelector::getSelection( SUIT_DataOwnerPtrList& aList ) const
 {
+  DBG_FUN();
   OCCViewer_Viewer* vw = viewer();
   if (!vw)
     return;
@@ -177,6 +187,7 @@ static void getEntityOwners( const Handle(AIS_InteractiveObject)& theObj,
 //================================================================
 void GEOMGUI_OCCSelector::setSelection( const SUIT_DataOwnerPtrList& aList )
 {
+  DBG_FUN();
   OCCViewer_Viewer* vw = viewer();
   if ( !vw || !vw->isSelectionEnabled())
     return;
index 2b11f63fe45d3b8a79362297d92d95920854aa63..ad8a0c939a738b499a1a25d486901ad5d4c60a58 100644 (file)
 // VTK Includes
 #include <vtkActorCollection.h>
 
+//---------------------------------------------------------
+#define USE_DEBUG
+//#define MB_IGNORE_QT
+#define MBCLASSNAME "GEOMGUI_Selection"
+#include "MBDebug.h"
+//---------------------------------------------------------
+
 #define OCC_DISPLAY_MODE_TO_STRING( str, dm ) { \
     if ( dm == AIS_WireFrame ) \
       str = QString( "Wireframe" ); \
 GEOMGUI_Selection::GEOMGUI_Selection()
 : LightApp_Selection()
 {
+  DBG_FUN();
 }
 
 GEOMGUI_Selection::~GEOMGUI_Selection()
 {
+  DBG_FUN();
 }
 
 void GEOMGUI_Selection::init( const QString& context, LightApp_SelectionMgr* selMgr )
 {
+  DBG_FUN();
+  ARG(context);
   LightApp_Selection::init( context, selMgr );
 
   myObjects.resize( count() );
@@ -144,6 +155,8 @@ void GEOMGUI_Selection::init( const QString& context, LightApp_SelectionMgr* sel
 //QVariant GEOMGUI_Selection::contextParameter( const QString& p ) const
 QVariant GEOMGUI_Selection::parameter( const QString& p ) const
 {
+  DBG_FUN();
+  ARG(p);
   QVariant v;
   if ( p == "isOCC" )
     v = activeViewType() == OCCViewer_Viewer::Type();
@@ -163,6 +176,9 @@ QVariant GEOMGUI_Selection::parameter( const QString& p ) const
 //QVariant GEOMGUI_Selection::objectParameter( const int idx, const QString& p ) const
 QVariant GEOMGUI_Selection::parameter( const int idx, const QString& p ) const
 {
+  DBG_FUN();
+  ARG(idx);
+  ARG(p);
   QVariant v;
   if ( p == "type" )
     v = typeName( idx );
@@ -217,6 +233,7 @@ QVariant GEOMGUI_Selection::parameter( const int idx, const QString& p ) const
 // the method to skip temporary objects from selection (called from LightApp)
 bool GEOMGUI_Selection::processOwner( const LightApp_DataOwner* theOwner )
 {
+  DBG_FUN();
   if ( theOwner->entry().contains( GEOMGUI_AnnotationMgr::GetEntrySeparator() ) ) {
     myAnnotationEntries.append( theOwner->entry() );
   }
index cc78136fe4ce7ca1664512abc597d5c79fc2d2eb..f2cc7547dd3b0d8198e71f32595a7ea5a4b3ed58 100644 (file)
 #include <Image_SupportedFormats.hxx>
 #endif
 
+//---------------------------------------------------------
+#define USE_DEBUG
+//#define MB_IGNORE_QT
+#define MBCLASSNAME "GEOM_Displayer"
+#include "MBDebug.h"
+#include "MBOCC.h"
+//---------------------------------------------------------
+
 // If the next macro is defined, autocolor feature works for all sub-shapes;
 // if it is undefined, autocolor feature works for groups only
 #define GENERAL_AUTOCOLOR
@@ -360,6 +368,8 @@ bool GEOM_Displayer::isCompoundOfVertices( const TopoDS_Shape& theShape )
 //================================================================
 SUIT_SelectionFilter* GEOM_Displayer::getFilter( const int theMode )
 {
+  DBG_FUN();
+  ARG(theMode);
   SUIT_SelectionFilter* aFilter;
 
   int aTopAbsMode = getTopAbsMode( theMode );
@@ -396,6 +406,7 @@ SUIT_SelectionFilter* GEOM_Displayer::getFilter( const int theMode )
 //================================================================
 SUIT_SelectionFilter* GEOM_Displayer::getComplexFilter( const QList<int>* aSubShapes)
 {
+  DBG_FUN();
   GEOM_CompoundFilter* aFilter = 0;
 
   if(aSubShapes != NULL ) {
@@ -473,6 +484,7 @@ static std::string getName( GEOM::GEOM_BaseObject_ptr object )
 GEOM_Displayer::GEOM_Displayer()
   : myUpdateColorScale(true), myIsRedisplayed( false )
 {
+  DBG_FUN();
   SUIT_Session* session = SUIT_Session::session();
   myApp = dynamic_cast<SalomeApp_Application*>( session->activeApplication() );
 
@@ -530,6 +542,7 @@ GEOM_Displayer::GEOM_Displayer()
 //=================================================================
 GEOM_Displayer::~GEOM_Displayer()
 {
+  DBG_FUN();
 }
 
 //=================================================================
@@ -542,6 +555,7 @@ void GEOM_Displayer::Display( const Handle(SALOME_InteractiveObject)& theIO,
                              const bool updateViewer,
                              SALOME_View* theViewFrame )
 {
+  DBG_FUN();
   SALOME_View* vf = theViewFrame ? theViewFrame : GetActiveView();
   if ( vf )
   {
@@ -570,6 +584,7 @@ void GEOM_Displayer::Display( const Handle(SALOME_InteractiveObject)& theIO,
 //=================================================================
 void GEOM_Displayer::Display( GEOM::GEOM_BaseObject_ptr theObj, const bool updateViewer )
 {
+  DBG_FUN();
   if ( theObj->_is_nil() )
     return;
 
@@ -591,6 +606,7 @@ void GEOM_Displayer::Erase( const Handle(SALOME_InteractiveObject)& theIO,
                             const bool updateViewer,
                             SALOME_View* theViewFrame )
 {
+  DBG_FUN();
   if ( theIO.IsNull() )
     return;
 
@@ -620,6 +636,7 @@ void GEOM_Displayer::Erase( GEOM::GEOM_BaseObject_ptr theObj,
                             const bool updateViewer,
                             SALOME_View* theViewFrame)
 {
+  DBG_FUN();
   std::string entry = getEntry( theObj );
   if ( entry != "" )
   {
@@ -639,6 +656,7 @@ void GEOM_Displayer::Redisplay( const Handle(SALOME_InteractiveObject)& theIO,
                                 const bool updateViewer,
                                 const bool checkActiveViewer )
 {
+  DBG_FUN();
   bool aRedisplayed = myIsRedisplayed;
   myIsRedisplayed = true;
   // Remove the object permanently (<forced> == true)
@@ -684,6 +702,7 @@ void GEOM_Displayer::Redisplay( const Handle(SALOME_InteractiveObject)& theIO,
                                 const bool theUpdateViewer,
                                 SALOME_View* theViewFrame )
 {
+  DBG_FUN();
   SALOME_View* vf = theViewFrame ? theViewFrame : GetActiveView();
   if ( !vf )
   {
@@ -717,6 +736,7 @@ void GEOM_Displayer::Redisplay( const Handle(SALOME_InteractiveObject)& theIO,
 //=================================================================
 void GEOM_Displayer::Display( const SALOME_ListIO& theIOList, const bool updateViewer )
 {
+  DBG_FUN();
   SALOME_ListIteratorOfListIO Iter( theIOList );
   for ( ; Iter.More(); Iter.Next() ) {
     Display( Iter.Value(), false );
@@ -727,6 +747,8 @@ void GEOM_Displayer::Display( const SALOME_ListIO& theIOList, const bool updateV
 
 void GEOM_Displayer::UpdateVisibility( SALOME_View* v, const SALOME_Prs* p, bool on )
 {
+  DBG_FUN();
+  ARG(on);
   SalomeApp_Study* aStudy = getStudy();
   int vId = -1;
   if ( v ) vId = getViewManagerId( v );
@@ -762,6 +784,7 @@ QColor GEOM_Displayer::colorFromResources( const QString& property, const QColor
 
 void GEOM_Displayer::updateShapeProperties( const Handle(GEOM_AISShape)& AISShape, bool create )
 {
+  DBG_FUN();
   // check that shape is not null
   if ( AISShape.IsNull() ) return;
   
@@ -1042,6 +1065,7 @@ void GEOM_Displayer::updateShapeProperties( const Handle(GEOM_AISShape)& AISShap
 
 void GEOM_Displayer::updateActorProperties( GEOM_Actor* actor, bool create )
 {
+  DBG_FUN();
   // check that actor is not null
   if ( !actor ) return;
   
@@ -1222,6 +1246,7 @@ void GEOM_Displayer::updateDimensions( const Handle(SALOME_InteractiveObject)& t
                                        SALOME_OCCPrs* thePrs,
                                        const gp_Ax3& theShapeLCS )
 {
+  DBG_FUN();
   SalomeApp_Study* aStudy = getStudy();
   if ( !aStudy )
   {
@@ -1401,6 +1426,7 @@ void GEOM_Displayer::Erase( const SALOME_ListIO& theIOList,
                             const bool forced,
                             const bool updateViewer )
 {
+  DBG_FUN();
   SALOME_ListIteratorOfListIO Iter( theIOList );
   for ( ; Iter.More(); Iter.Next() )
     Erase( Iter.Value(), forced, false );
@@ -1419,6 +1445,7 @@ void GEOM_Displayer::Redisplay( const SALOME_ListIO& theIOList,
                                 const bool updateViewer,
                                 const bool checkActiveViewer )
 {
+  DBG_FUN();
   SALOME_ListIteratorOfListIO Iter( theIOList );
   for ( ; Iter.More(); Iter.Next() )
     Redisplay( Iter.Value(), false, checkActiveViewer );
@@ -1437,6 +1464,7 @@ void GEOM_Displayer::Redisplay( const SALOME_ListIO& theIOList,
                                 const bool theUpdateViewer,
                                 SALOME_View* theViewFrame )
 {
+  DBG_FUN();
   SALOME_ListIteratorOfListIO anIter( theIOList );
   for ( ; anIter.More(); anIter.Next() )
   {
@@ -1458,6 +1486,7 @@ void GEOM_Displayer::Redisplay( const SALOME_ListIO& theIOList,
 //=================================================================
 void GEOM_Displayer::Update( SALOME_OCCPrs* prs )
 {
+  DBG_FUN();
   SOCC_Prs* occPrs = dynamic_cast<SOCC_Prs*>( prs );
   SalomeApp_Study* study = getStudy();
 
@@ -1593,6 +1622,7 @@ void GEOM_Displayer::Update( SALOME_OCCPrs* prs )
 //=================================================================
 void GEOM_Displayer::Update( SALOME_VTKPrs* prs )
 {
+  DBG_FUN();
   SVTK_Prs* vtkPrs = dynamic_cast<SVTK_Prs*>( prs );
   SalomeApp_Study* study = getStudy();
 
@@ -1696,6 +1726,7 @@ void GEOM_Displayer::Update( SALOME_VTKPrs* prs )
 //=================================================================
 SALOME_Prs* GEOM_Displayer::BuildPrs( GEOM::GEOM_Object_ptr theObj )
 {
+  DBG_FUN();
   if ( theObj->_is_nil() )
     return 0;
 
@@ -1725,6 +1756,7 @@ SALOME_Prs* GEOM_Displayer::BuildPrs( GEOM::GEOM_Object_ptr theObj )
 //=================================================================
 SALOME_Prs* GEOM_Displayer::BuildPrs( const TopoDS_Shape& theShape )
 {
+  DBG_FUN();
   myViewFrame = GetActiveView();
   if ( theShape.IsNull() || myViewFrame == 0 )
     return 0;
@@ -1753,6 +1785,8 @@ SALOME_Prs* GEOM_Displayer::BuildPrs( const TopoDS_Shape& theShape )
 SALOME_Prs* GEOM_Displayer::buildPresentation( const QString& entry,
                                                SALOME_View* theViewFrame )
 {
+  DBG_FUN();
+  ARG(entry);
   SALOME_Prs* prs = 0;
   internalReset();
 
@@ -1832,6 +1866,9 @@ SALOME_Prs* GEOM_Displayer::buildSubshapePresentation(const TopoDS_Shape& aShape
                                                       const QString& entry,
                                                       SALOME_View* theViewFrame)
 {
+  DBG_FUN();
+  ARG(aShape);
+  ARG(entry);
   SALOME_Prs* prs = 0;
   internalReset();
 
@@ -1867,6 +1904,7 @@ SALOME_Prs* GEOM_Displayer::buildSubshapePresentation(const TopoDS_Shape& aShape
 //=================================================================
 void GEOM_Displayer::internalReset()
 {
+  DBG_FUN();
   myIO.Nullify();
   myShape.Nullify();
 
@@ -1887,6 +1925,7 @@ void GEOM_Displayer::internalReset()
 //=================================================================
 void GEOM_Displayer::LocalSelection( const Handle(SALOME_InteractiveObject)& theIO, const std::list<int> modes )
 {
+  DBG_FUN();
   SUIT_Session* session = SUIT_Session::session();
   SalomeApp_Application* app = dynamic_cast<SalomeApp_Application*>( session->activeApplication() );
   if ( !app )
@@ -1916,6 +1955,7 @@ void GEOM_Displayer::LocalSelection( const Handle(SALOME_InteractiveObject)& the
 //=================================================================
 void GEOM_Displayer::LocalSelection( const Handle(SALOME_InteractiveObject)& theIO, const int theMode )
 {
+  DBG_FUN();
   std::list<int> modes;
   modes.push_back( theMode );
   LocalSelection( theIO, modes );
@@ -1930,6 +1970,9 @@ void GEOM_Displayer::LocalSelection( const Handle(SALOME_InteractiveObject)& the
 //=================================================================
 void GEOM_Displayer::GlobalSelection( const int theMode, const bool update )
 {
+  DBG_FUN();
+  ARG(theMode);
+  ARG(update);
   TColStd_MapOfInteger aModes;
   aModes.Add( theMode );
   GlobalSelection( aModes, update );
@@ -1945,6 +1988,7 @@ void GEOM_Displayer::GlobalSelection( const int theMode, const bool update )
 void GEOM_Displayer::GlobalSelection( const TColStd_MapOfInteger& theModes,
                                       const bool update, const QList<int>* theSubShapes )
 {
+  DBG_FUN();
   SUIT_Session* session = SUIT_Session::session();
   SalomeApp_Application* app = dynamic_cast<SalomeApp_Application*>( session->activeApplication() );
   if ( !app )
@@ -2036,6 +2080,7 @@ void GEOM_Displayer::GlobalSelection( const TColStd_MapOfInteger& theModes,
 //=================================================================
 void GEOM_Displayer::LocalSelection( const SALOME_ListIO& theIOList, const std::list<int> modes )
 {
+  DBG_FUN();
   SALOME_ListIteratorOfListIO Iter( theIOList );
   for ( ; Iter.More(); Iter.Next() )
     LocalSelection( Iter.Value(), modes );
@@ -2050,6 +2095,8 @@ void GEOM_Displayer::LocalSelection( const SALOME_ListIO& theIOList, const std::
 //=================================================================
 void GEOM_Displayer::LocalSelection( const SALOME_ListIO& theIOList, const int theMode )
 {
+  DBG_FUN();
+  ARG(theMode);
   std::list<int> modes;
   modes.push_back( theMode );
   LocalSelection( theIOList, modes );
@@ -2064,6 +2111,7 @@ void GEOM_Displayer::LocalSelection( const SALOME_ListIO& theIOList, const int t
 //=================================================================
 void GEOM_Displayer::BeforeDisplay( SALOME_View* v, const SALOME_OCCPrs* )
 {
+  DBG_FUN();
   SOCC_Viewer* vf = dynamic_cast<SOCC_Viewer*>( v );
   if ( vf )
   {
@@ -2078,6 +2126,7 @@ void GEOM_Displayer::BeforeDisplay( SALOME_View* v, const SALOME_OCCPrs* )
 
 void GEOM_Displayer::AfterDisplay( SALOME_View* v, const SALOME_OCCPrs* p )
 {
+  DBG_FUN();
   UpdateColorScale();
 
   // visualize annotations for displayed presentation
@@ -2095,12 +2144,14 @@ void GEOM_Displayer::AfterDisplay( SALOME_View* v, const SALOME_OCCPrs* p )
 
 void GEOM_Displayer::BeforeErase( SALOME_View* v, const SALOME_OCCPrs* p )
 {
+  DBG_FUN();
   LightApp_Displayer::BeforeErase( v, p );
   releaseTextures( p );
 }
 
 void GEOM_Displayer::AfterErase( SALOME_View* v, const SALOME_OCCPrs* p )
 {
+  DBG_FUN();
   LightApp_Displayer::AfterErase( v, p );
   UpdateColorScale();
 
@@ -2123,6 +2174,8 @@ void GEOM_Displayer::AfterErase( SALOME_View* v, const SALOME_OCCPrs* p )
 //=================================================================
 void GEOM_Displayer::SetColor( const int color )
 {
+  DBG_FUN();
+  ARG2(color,DWORD);
   if ( color == -1 )
     UnsetColor();
   else
@@ -2159,6 +2212,7 @@ void GEOM_Displayer::UnsetColor()
 //=================================================================
 double GEOM_Displayer::SetTransparency( const double transparency )
 {
+  DBG_FUN();
   double prevTransparency = myTransparency;
   myTransparency = transparency;
   return prevTransparency;
@@ -2325,6 +2379,7 @@ bool GEOM_Displayer::ToActivate() const
 //=================================================================
 void GEOM_Displayer::clearTemporary( LightApp_SelectionMgr* theSelMgr )
 {
+  DBG_FUN();
   SALOME_ListIO selected, toSelect;
   theSelMgr->selectedObjects( selected );
 
@@ -2339,11 +2394,14 @@ void GEOM_Displayer::clearTemporary( LightApp_SelectionMgr* theSelMgr )
 
 void GEOM_Displayer::SetName( const char* theName )
 {
+  DBG_FUN();
+  ARG(theName);
   myName = theName;
 }
 
 void GEOM_Displayer::UnsetName()
 {
+  DBG_FUN();
   myName = "";
 }
 
@@ -2359,6 +2417,8 @@ void GEOM_Displayer::setIO( const Handle(SALOME_InteractiveObject)& theIO )
 
 void GEOM_Displayer::setShape( const TopoDS_Shape& theShape )
 {
+  DBG_FUN();
+  ARG(theShape);
   myShape = theShape;
 }
 
@@ -2369,6 +2429,7 @@ void GEOM_Displayer::setFieldStepInfo( const GEOM::field_data_type theFieldDataT
                                        const double theFieldStepRangeMin,
                                        const double theFieldStepRangeMax )
 {
+  DBG_FUN();
   myFieldDataType = theFieldDataType;
   myFieldDimension = theFieldDimension;
   myFieldStepData = theFieldStepData;
@@ -2379,17 +2440,25 @@ void GEOM_Displayer::setFieldStepInfo( const GEOM::field_data_type theFieldDataT
 
 bool GEOM_Displayer::canBeDisplayed( const QString& entry, const QString& viewer_type ) const
 {
+  MSGEL(".....GEOM_Displayer: [" << entry.toStdString() << "] can be displayed in \"" << viewer_type.toStdString() << "\"?");
   _PTR(SObject) anObj = getStudy()->studyDS()->FindObjectID( (const char*)entry.toUtf8() );
   //if ( ! GeometryGUI::IsInGeomComponent( anObj )) return false;
-  GEOM::GEOM_Object_var aGeomObj = GEOM::GEOM_Object::_narrow(GeometryGUI::ClientSObjectToObject(anObj)); // enable displaying of GEOM objects
-  GEOM::GEOM_FieldStep_var aFieldStepObj = GEOM::GEOM_FieldStep::_narrow(GeometryGUI::ClientSObjectToObject(anObj)); // enable displaying of GEOM field steps
-  GEOM::GEOM_Gen_var aCompObj = GEOM::GEOM_Gen::_narrow(GeometryGUI::ClientSObjectToObject(anObj)); // enable displaying of whole GEOM component
-  return ( !CORBA::is_nil( aGeomObj ) || !CORBA::is_nil( aFieldStepObj ) || !CORBA::is_nil( aCompObj ) ) &&
+  CORBA::Object_var anOrbObj = GeometryGUI::ClientSObjectToObject(anObj);
+  bool isCorbaObj = (!CORBA::is_nil(anOrbObj));
+  GEOM::GEOM_Object_var aGeomObj = GEOM::GEOM_Object::_narrow(anOrbObj); // enable displaying of GEOM objects
+  GEOM::GEOM_FieldStep_var aFieldStepObj = GEOM::GEOM_FieldStep::_narrow(anOrbObj); // enable displaying of GEOM field steps
+  GEOM::GEOM_Gen_var aCompObj = GEOM::GEOM_Gen::_narrow(anOrbObj); // enable displaying of whole GEOM component
+  bool isGeomObj = (!CORBA::is_nil( aGeomObj ) || !CORBA::is_nil( aFieldStepObj ) || !CORBA::is_nil( aCompObj ));
+  bool ret = ( isGeomObj ) &&
          (viewer_type == SOCC_Viewer::Type() || viewer_type == SVTK_Viewer::Type());
+  MSGEL("..... --> isCorbaObj=" << YesNo(isCorbaObj) << ", isGeomObj=" << YesNo(isGeomObj) << ", canBeDisp=" << YesNo(ret));
+  return ret;
 }
 
 int GEOM_Displayer::SetDisplayMode( const int theMode )
 {
+  DBG_FUN();
+  ARG(theMode);
   int aPrevMode = myDisplayMode;
   if ( theMode != -1 ) {
     myDisplayMode = theMode;
@@ -2408,6 +2477,7 @@ int GEOM_Displayer::GetDisplayMode() const
 
 int GEOM_Displayer::UnsetDisplayMode()
 {
+  DBG_FUN();
   int aPrevMode = myDisplayMode;
   SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
   myDisplayMode = resMgr->integerValue( "Geometry", "display_mode", 0 );
@@ -2743,6 +2813,7 @@ SALOMEDS::Color GEOM_Displayer::getColor(GEOM::GEOM_Object_var theGeomObject, bo
 void GEOM_Displayer::EraseWithChildren(const Handle(SALOME_InteractiveObject)& theIO,
                                        const bool eraseOnlyChildren)
 {
+  DBG_FUN();
   LightApp_DataObject* parent = getStudy()->findObjectByEntry(theIO->getEntry());
 
   if( !parent)
@@ -2976,6 +3047,7 @@ QList<QVariant> GEOM_Displayer::groupFieldData( const QList<QVariant>& theFieldS
 
 void GEOM_Displayer::UpdateColorScale() 
 {
+  DBG_FUN();
   if ( !myUpdateColorScale )
     return;
 
@@ -3055,6 +3127,7 @@ void GEOM_Displayer::UpdateColorScale()
 
 bool GEOM_Displayer::SetUpdateColorScale( bool toUpdate ) // IPAL54049
 {
+  DBG_FUN();
   bool previous = myUpdateColorScale;
   myUpdateColorScale = toUpdate;
   if ( myUpdateColorScale && !previous )
index e6724c4fb5b5b0b09d90783a5668178366065663..fda1342bfa61714927205363db63fb28e5e43092 100644 (file)
 #include "GEOM_version.h"
 #include "GEOMImpl_Types.hxx" // dangerous hxx (defines short-name macros) - include after all
 
+//---------------------------------------------------------
+#define USE_DEBUG
+//#define MB_IGNORE_QT
+#define MBCLASSNAME "GeometryGUI"
+#include "MBDebug.h"
+//---------------------------------------------------------
+
 extern "C" {
   Standard_EXPORT CAM_Module* createModule() {
+    DBG_FUNC();
     return new GeometryGUI();
   }
 
@@ -146,6 +154,7 @@ GEOM::GEOM_Gen_var GeometryGUI::myComponentGeom = GEOM::GEOM_Gen::_nil();
 
 GEOM::GEOM_Gen_var GeometryGUI::GetGeomGen()
 {
+  DBG_FUNC();
   // Bug 12290: exception in Mesh GUI on GEOMBase::GetShape() if Geometry GUI hasn't been loaded
   if (CORBA::is_nil(myComponentGeom))
     InitGeomGen();
@@ -154,6 +163,7 @@ GEOM::GEOM_Gen_var GeometryGUI::GetGeomGen()
 
 bool GeometryGUI::InitGeomGen()
 {
+  DBG_FUNC();
   GeometryGUI aGG;
   if ( CORBA::is_nil( myComponentGeom ) ) return false;
   return true;
@@ -219,6 +229,7 @@ void GeometryGUI::Modified (bool theIsUpdateActions)
 //=======================================================================
 GeometryGUI::GeometryGUI() : SalomeApp_Module( "GEOM" )
 {
+  DBG_FUN();
   if ( CORBA::is_nil( myComponentGeom ) )
   {
     SALOME_NamingService_Abstract *ns = SalomeApp_Application::namingService();
@@ -250,6 +261,7 @@ GeometryGUI::GeometryGUI() : SalomeApp_Module( "GEOM" )
 //=======================================================================
 GeometryGUI::~GeometryGUI()
 {
+  DBG_FUN();
   while (!myOCCSelectors.isEmpty())
     delete myOCCSelectors.takeFirst();
 
@@ -266,6 +278,8 @@ GeometryGUI::~GeometryGUI()
 typedef GEOMGUI* (*LibraryGUI)( GeometryGUI* );
 GEOMGUI* GeometryGUI::getLibrary( const QString& libraryName )
 {
+  DBG_FUN();
+  ARG(libraryName);
   if ( !myGUIMap.contains( libraryName ) ) {
     // try to load library if it is not loaded yet
 #if defined(WIN32)
@@ -316,6 +330,8 @@ GEOMGUI* GeometryGUI::getLibrary( const QString& libraryName )
 typedef GEOMPluginGUI* (*PluginLibraryGUI)( GeometryGUI* );
 GEOMPluginGUI* GeometryGUI::getPluginLibrary( const QString& libraryName )
 {
+  DBG_FUN();
+  ARG(libraryName);
   if ( !myGUIMap.contains( libraryName ) ) {
     // try to load library if it is not loaded yet
 
@@ -366,6 +382,7 @@ GEOMPluginGUI* GeometryGUI::getPluginLibrary( const QString& libraryName )
 //=======================================================================
 void GeometryGUI::ActiveWorkingPlane()
 {
+  DBG_FUN();
   gp_Dir DZ = myWorkingPlane.Direction();
   gp_Dir DY = myWorkingPlane.YDirection();
 
@@ -423,6 +440,7 @@ GEOMGUI_TextTreeWdg* GeometryGUI::GetTextTreeWdg() const
 //=======================================================================
 void GeometryGUI::SetActiveDialogBox( QDialog* aDlg )
 {
+  DBG_FUN();
   myActiveDialogBox = (QDialog*)aDlg;
 }
 
@@ -460,6 +478,7 @@ void GeometryGUI::EmitSignalDefaultStepValueChanged(double newVal)
 //=======================================================================
 void GeometryGUI::OnGUIEvent()
 {
+  DBG_FUN();
   const QObject* obj = sender();
   if ( !obj || !obj->inherits( "QAction" ) )
     return;
@@ -474,6 +493,8 @@ void GeometryGUI::OnGUIEvent()
 //=======================================================================
 void GeometryGUI::OnGUIEvent( int id, const QVariant& theParam )
 {
+  DBG_FUN();
+  ARG(id);
   SUIT_Application* anApp = application();
   if (!anApp) return;
   SUIT_Desktop* desk = anApp->desktop();
@@ -487,6 +508,7 @@ void GeometryGUI::OnGUIEvent( int id, const QVariant& theParam )
 #else
   bool ViewDep = 0;
 #endif
+  MSGEL("....Flags: " << X_(ViewOCC) << " " << X_(ViewVTK) << " " << X_(ViewDep));
   // if current viewframe is not of OCC and not of VTK type - return immediately
   // fix for IPAL8958 - allow some commands to execute even when NO viewer is active (rename for example)
   QList<int> NotViewerDependentCommands;
@@ -808,6 +830,7 @@ void GeometryGUI::OnGUIEvent( int id, const QVariant& theParam )
 //=================================================================================
 bool GeometryGUI::activateOperation( int actionId )
 {
+  DBG_FUN();
   OnGUIEvent(actionId);
   return true;
 }
@@ -818,6 +841,8 @@ bool GeometryGUI::activateOperation( int actionId )
 //=================================================================================
 bool GeometryGUI::activateOperation( const QString& actionId )
 {
+  DBG_FUN();
+  ARG(actionId);
   bool isOk = false;
 
   int id = actionId.toInt(&isOk);
@@ -833,6 +858,9 @@ bool GeometryGUI::activateOperation( const QString& actionId )
 //=================================================================================
 bool GeometryGUI::activateOperation( const QString& actionId, const QString& plugin )
 {
+  DBG_FUN();
+  ARG(actionId);
+  ARG(plugin);
   bool isOk = false;
 
   QString pluginLib = plugin;
@@ -908,6 +936,9 @@ void GeometryGUI::OnMousePress( SUIT_ViewWindow* w, QMouseEvent* e )
 void GeometryGUI::createGeomAction( const int id, const QString& label, const QString& icolabel,
                                     const int accel, const bool toggle, const QString& shortcutAction )
 {
+  DBG_FUN();
+  ARG(id);
+  ARG(label);
   SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
   QPixmap icon = icolabel.isEmpty() ? resMgr->loadPixmap( "GEOM", tr( (QString( "ICO_" )+label).toLatin1().constData() ), false )
                                     : resMgr->loadPixmap( "GEOM", tr( icolabel.toLatin1().constData() ) );
@@ -929,6 +960,7 @@ void GeometryGUI::createGeomAction( const int id, const QString& label, const QS
 //=======================================================================
 void GeometryGUI::createOriginAndBaseVectors()
 {
+  DBG_FUN();
   SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( application()->activeStudy() );
   bool aLocked = (_PTR(AttributeStudyProperties)(appStudy->studyDS()->GetProperties()))->IsLocked();
   if ( aLocked ) {
@@ -968,6 +1000,7 @@ void GeometryGUI::createOriginAndBaseVectors()
 //=======================================================================
 void GeometryGUI::initialize( CAM_Application* app )
 {
+  DBG_FUN();
   SalomeApp_Module::initialize( app );
 
   // ----- create actions --------------
@@ -1771,6 +1804,7 @@ void GeometryGUI::initialize( CAM_Application* app )
 //=======================================================================
 void GeometryGUI::addPluginActions()
 {
+  DBG_FUN();
   // Resource manager
   SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
   if (!resMgr) return;
@@ -1861,6 +1895,7 @@ namespace
 //=======================================================================
 bool GeometryGUI::activateModule( SUIT_Study* study )
 {
+  DBG_FUN();
   // Fill in: Help Panel
   SalomeApp_Application* app = dynamic_cast<SalomeApp_Application*>( application() ); 
   app->infoPanel()->setTitle(tr("INFO_WELCOME_TO_GEOM"));
@@ -2007,6 +2042,7 @@ bool GeometryGUI::activateModule( SUIT_Study* study )
 //=======================================================================
 bool GeometryGUI::deactivateModule( SUIT_Study* study )
 {
+  DBG_FUN();
   QMenu* viewMenu = menuMgr()->findMenu( STD_Application::MenuViewId );
   if ( viewMenu )
     disconnect( viewMenu, SIGNAL( aboutToShow() ), this, SLOT( onViewAboutToShow() ) );
@@ -2057,6 +2093,7 @@ bool GeometryGUI::deactivateModule( SUIT_Study* study )
 //=======================================================================
 void GeometryGUI::onWindowActivated( SUIT_ViewWindow* win )
 {
+  DBG_FUN();
   if ( !win )
     return;
 
@@ -2101,6 +2138,8 @@ void GeometryGUI::viewManagers( QStringList& lst ) const
 
 void GeometryGUI::onViewManagerAdded( SUIT_ViewManager* vm )
 {
+  DBG_FUN();
+  if (vm) { SHOW(vm->getType()); }
   if ( vm && vm->getType() == OCCViewer_Viewer::Type() )
   {
     qDebug( "connect" );
@@ -2139,6 +2178,8 @@ void GeometryGUI::onViewManagerAdded( SUIT_ViewManager* vm )
 
 void GeometryGUI::onViewManagerRemoved( SUIT_ViewManager* vm )
 {
+  DBG_FUN();
+  if (vm) { SHOW(vm->getType()); }
   SUIT_ViewModel* viewer = vm->getViewModel();
   if ( vm->getType() == OCCViewer_Viewer::Type() )
   {
@@ -2176,6 +2217,7 @@ void GeometryGUI::onViewManagerRemoved( SUIT_ViewManager* vm )
 
 void GeometryGUI::updateCreationInfo()
 {
+  DBG_FUN();
   if ( myCreationInfoWdg )
     myCreationInfoWdg->clear();
 
@@ -2225,6 +2267,7 @@ void GeometryGUI::updateCreationInfo()
 
 void GeometryGUI::onAutoBringToFront()
 {
+  DBG_FUN();
   bool isAutoBringToFront = SUIT_Session::session()->resourceMgr()->booleanValue( "Geometry", "auto_bring_to_front", "false" );
   if( !isAutoBringToFront )
     return;
@@ -2314,11 +2357,14 @@ Handle(TColStd_HArray1OfByte) GeometryGUI::getTexture (int theId, int& theWidth,
 
 LightApp_Selection* GeometryGUI::createSelection() const
 {
+  DBG_FUN();
   return new GEOMGUI_Selection();
 }
 
 void GeometryGUI::contextMenuPopup( const QString& client, QMenu* menu, QString& title )
 {
+  DBG_FUN();
+  ARG(client);
   SalomeApp_Module::contextMenuPopup( client, menu, title );
   SALOME_ListIO lst;
   getApp()->selectionMgr()->selectedObjects( lst );
@@ -2378,12 +2424,15 @@ void GeometryGUI::contextMenuPopup( const QString& client, QMenu* menu, QString&
 
 void GeometryGUI::OnSetMaterial(const QString& theName)
 {
+  DBG_FUN();
+  ARG(theName);
   OnGUIEvent( GEOMOp::OpPredefMaterial, QVariant( theName ) );
 }
 
 
 void GeometryGUI::createPreferences()
 {
+  DBG_FUN();
   SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
 
   int tabId = addPreference( tr( "PREF_TAB_SETTINGS" ) );
@@ -2942,6 +2991,7 @@ void GeometryGUI::preferencesChanged( const QString& section, const QString& par
 
 LightApp_Displayer* GeometryGUI::displayer()
 {
+  DBG_FUN();
   if ( !myDisplayer )
     myDisplayer = new GEOM_Displayer();
   return myDisplayer;
@@ -2949,6 +2999,8 @@ LightApp_Displayer* GeometryGUI::displayer()
 
 void GeometryGUI::setLocalSelectionMode(const int mode)
 {
+  DBG_FUN();
+  ARG(mode);
   myLocalSelectionMode = mode;
 }
 
@@ -2968,6 +3020,7 @@ const char gDigitsSep = ':'; // character used to separate numeric parameter val
  */
 void GeometryGUI::storeVisualParameters (int savePoint)
 {
+  DBG_FUN();
   SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>(application()->activeStudy());
   if ( !appStudy || !appStudy->studyDS() )
     return;
@@ -3167,6 +3220,7 @@ void GeometryGUI::storeVisualParameters (int savePoint)
  */
 void GeometryGUI::restoreVisualParameters (int savePoint)
 {
+  DBG_FUN();
   SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>(application()->activeStudy());
   if (!appStudy || !appStudy->studyDS())
     return;
@@ -3357,6 +3411,7 @@ void GeometryGUI::restoreVisualParameters (int savePoint)
 // Compute current name mode of the viewer
 void UpdateNameMode( SalomeApp_Application* app )
 {
+  DBG_FUNC();
   bool isMode = false;
   SalomeApp_Study* aStudy = dynamic_cast< SalomeApp_Study* >( app->activeStudy() );
   SUIT_ViewWindow* viewWindow = app->desktop()->activeWindow();
@@ -3381,6 +3436,7 @@ void UpdateNameMode( SalomeApp_Application* app )
 
 void GeometryGUI::onViewAboutToShow()
 {
+  DBG_FUN();
   SUIT_ViewWindow* window = application()->desktop()->activeWindow();
   QAction* a = action( GEOMOp::OpSwitchVectors );
   QAction* aVerticesAction = action( GEOMOp::OpSwitchVertices );
@@ -3425,6 +3481,8 @@ QAction* GeometryGUI::getAction(const int id) {
 */
 void GeometryGUI::message(const QString& msg)
 {
+  DBG_FUNC();
+  ARG(msg);
   // dispatch message
   QStringList data = msg.split("/");
   const int nbStrings = data.count();
@@ -3456,6 +3514,7 @@ void GeometryGUI::message(const QString& msg)
 */
 void GeometryGUI::ClearShapeBuffer( GEOM::GEOM_Object_ptr theObj )
 {
+  DBG_FUNC();
   if ( CORBA::is_nil( theObj ) )
     return;
 
@@ -3555,6 +3614,9 @@ bool GeometryGUI::renameAllowed( const QString& entry) const {
 */
 bool GeometryGUI::renameObject( const QString& entry, const QString& name)
 {
+  DBG_FUN();
+  ARG(entry);
+  ARG(name);
   bool result = false;
 
   SalomeApp_Application* app =
@@ -3596,6 +3658,7 @@ bool GeometryGUI::renameObject( const QString& entry, const QString& name)
 
 void GeometryGUI::updateMaterials()
 {
+  DBG_FUN();
   LightApp_Preferences* pref = preferences();
   if ( pref ) {
     QStringList materials = Material_ResourceMgr::resourceMgr()->materials();
@@ -3705,6 +3768,7 @@ bool GeometryGUI::isDropAccepted( const SUIT_DataObject* where ) const
 void GeometryGUI::dropObjects( const DataObjectList& what, SUIT_DataObject* where,
                                const int row, Qt::DropAction action )
 {
+  DBG_FUN();
   if (action != Qt::CopyAction && action != Qt::MoveAction)
     return; // unsupported action
 
diff --git a/src/GEOMGUI/MBDebug.h b/src/GEOMGUI/MBDebug.h
new file mode 100644 (file)
index 0000000..5a8ab72
--- /dev/null
@@ -0,0 +1,245 @@
+#ifndef MBDebug_HeaderFile\r
+#define MBDebug_HeaderFile\r
+\r
+//---------------------------------------------------------------\r
+// Usage of the logging facilities:\r
+//\r
+//  (1) At the beginning of each class file to be debugged, there\r
+//      should be a static string variable defined with the name\r
+//      of the class. Then, include the "MBDebug.h" header file.\r
+//\r
+//      //---------------------------------------------------------\r
+//      #define USE_DEBUG\r
+//      //#define MB_IGNORE_QT\r
+//      #define MBCLASSNAME "ClassName"\r
+//      #include "MBDebug.h"\r
+//      //---------------------------------------------------------\r
+//\r
+//  (2) At the beginning of each class method, call the DBG_FUN\r
+//      macro.\r
+//\r
+//      int ClassName::MyMethod(int x)\r
+//      {\r
+//        DBG_FUN();\r
+//        ...\r
+//      }\r
+//\r
+//      NOTE: For static methods, call the DBG_FUNC() macro!!\r
+//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\r
+//  This debugging/logging class is a "header-only" solution and\r
+//  does NOT require any additional implementation (.cpp) file!\r
+//---------------------------------------------------------------\r
+\r
+#include <iostream>\r
+#include <string>\r
+#include <locale>\r
+#include <codecvt>\r
+#include <list>\r
+#include <map>\r
+#include <set>\r
+#include <vector>\r
+#ifndef MB_IGNORE_QT\r
+# include <qstring.h>\r
+#endif\r
+\r
+//---------------------------------------------------------------\r
+//     Set the debug flags dependent on the preprocessor definitions\r
+//---------------------------------------------------------------\r
+#ifdef USE_DEBUG\r
+#      define MBS_DEBUG_FLAG           MBDebug::DF_DEBUG\r
+#else\r
+#      define MBS_DEBUG_FLAG           0\r
+#endif /*DEBUG*/ \r
+\r
+#define        MBS_DBG_FLAGS                   (MBS_DEBUG_FLAG)\r
+\r
+\r
+//---------------------------------------------------------------\r
+//     Define the global debug macros\r
+//---------------------------------------------------------------\r
+#define DLOG                                                   MBDebug::LogPrint()\r
+#define RETURN(var)                            { RET(var); return (var); }\r
+\r
+#ifdef USE_DEBUG\r
+\r
+# define DBG_FUN()                             MBDebug _dbg(MBCLASSNAME, __FUNCTION__, MBS_DBG_FLAGS, (void*)this)\r
+# define DBG_FUNC()                            MBDebug _dbg(MBCLASSNAME, __FUNCTION__, MBS_DBG_FLAGS)\r
+# define DBG_FUNB(blk)         MBDebug _dbg(MBCLASSNAME, blk, MBS_DBG_FLAGS)\r
+#      define MSGEL(txt)                               MBDebug::LogPrint() << txt << std::endl\r
+#      define PRINT(txt)                               MBDebug::LogPrint() << txt\r
+#      define SHOW2(var,typ)           DumpVar(#var,(typ)(var))\r
+#      define SHOW(var)                                DumpVar(#var,var)\r
+#      define ARG(var)                                 do { PRINT("in:"); DumpVar(#var,var); } while (0)\r
+#      define ARG2(var,typ)            do { PRINT("in:"); DumpVar(#var,(typ)(var)); } while (0)\r
+#      define RET(var)                                 do { PRINT("out:"); DumpVar(#var,var); } while (0)\r
+#      define MSG(txt)                                 MBDebug::LogPrint() << txt\r
+\r
+#else  /*!USE_DEBUG*/ \r
+\r
+#      define DBG_FUN()\r
+#      define DBG_FUNC()\r
+#      define DBG_FUNB(blk)\r
+#      define MSGEL(txt)\r
+#      define PRINT(txt)\r
+#      define SHOW2(var,typ)\r
+#      define SHOW(var)\r
+#      define ARG(var)\r
+#      define ARG2(var,typ)\r
+#      define RET(var)\r
+#      define MSG(txt)\r
+\r
+#endif /*USE_DEBUG*/ \r
+\r
+\r
+//---------------------------------------------------------------\r
+//     Declare the debugging and profiling class\r
+//---------------------------------------------------------------\r
+class MBDebug\r
+{\r
+public:\r
+       enum {\r
+               DF_NONE                 = 0x00,         // no debug\r
+               DF_DEBUG                = 0x01          // debug a function\r
+       };\r
+\r
+       MBDebug(const char* aClassName, const char* aFuncName, const short aFlag, void* aThis=NULL)\r
+       :mClassName(aClassName),mFuncName(aFuncName),mThis(aThis),mFlags((unsigned char)aFlag)\r
+  {\r
+       if (mFlags & (DF_DEBUG))\r
+       {\r
+               std::cout << "{ENTER: " << mClassName + "::" + mFuncName;\r
+               if (mThis) std::cout << "(this=" << mThis << ")";\r
+               std::cout << std::endl;\r
+       }\r
+  }\r
+       virtual ~MBDebug()\r
+  {\r
+       if (mFlags & (DF_DEBUG))\r
+               std::cout << "}LEAVE: " << mClassName << "::" << mFuncName << std::endl;\r
+  }\r
+\r
+       // Log file output management\r
+       static std::ostream&    LogPrint()      { return std::cout; }\r
+\r
+private:\r
+       std::string                     mClassName;     // Name of class to be debugged\r
+       std::string                     mFuncName;      // Name of function to be debugged\r
+       void*                           mThis;            // The "this" pointer to the class being debugged\r
+       unsigned char           mFlags;                 // Debug mode flags\r
+};\r
+\r
+\r
+\r
+#define YesNo(b)       (b ? "Yes" : "No")\r
+#define X_(b)      (b ? "[x] " #b : "[ ] " #b)\r
+\r
+\r
+\r
+inline std::string w2s(std::wstring ws)\r
+{\r
+       using convert_typeX = std::codecvt_utf8<wchar_t>;\r
+       std::wstring_convert<convert_typeX, wchar_t> converterX;\r
+       return(converterX.to_bytes(ws));\r
+}\r
+\r
+// Primitive types\r
+inline void DumpVar(const char *szName, char value)\r
+{\r
+       DLOG << "[chr]: " << szName << "='" << value << "'" << std::endl;\r
+}\r
+\r
+inline void DumpVar(const char *szName, bool value)\r
+{\r
+       DLOG << "[bool]: " << szName << "=" << (value ? "true" : "false") << std::endl;\r
+}\r
+\r
+inline void DumpVar(const char *szName, short value)\r
+{\r
+       DLOG  << "[shrt]: " << szName << "=" << value << std::endl;\r
+}\r
+\r
+inline void DumpVar(const char *szName, int value)\r
+{\r
+       DLOG << "[int]: " << szName << "=" << value << std::endl;\r
+}\r
+\r
+inline void DumpVar(const char *szName, long value)\r
+{\r
+       DLOG << "[long]: " << szName << "=" << value << std::endl;\r
+}\r
+\r
+inline void DumpVar(const char *szName, double value)\r
+{\r
+       DLOG << "[dbl]: " << szName << "=" << value << std::endl;\r
+}\r
+\r
+inline void DumpVar(const char *szName, unsigned char value)\r
+{\r
+       DLOG << "[byte]: " << szName << "=0x" << std::hex << value << std::dec << std::endl;\r
+}\r
+\r
+inline void DumpVar(const char *szName, unsigned short value)\r
+{\r
+       DLOG << "[word]: " << szName << "=0x" << std::hex << value << std::dec << std::endl;\r
+}\r
+\r
+inline void DumpVar(const char *szName, unsigned int value)\r
+{\r
+       DLOG << "[uint]: " << szName << "=0x" << std::hex << value << std::dec << std::endl;\r
+}\r
+\r
+inline void DumpVar(const char *szName, unsigned long value)\r
+{\r
+       DLOG << "[dword]: " << szName << "=0x" << std::hex << value << std::dec << std::endl;\r
+}\r
+\r
+inline void DumpVar(const char *szName, const char* value)\r
+{\r
+       DLOG << "[str]: " << szName << "=\"" << (value ? value : "") << "\"" << std::endl;\r
+}\r
+\r
+inline void DumpVar(const char *szName, const std::string &value)\r
+{\r
+       DLOG << "[Str]: " << szName << "=\"" << value << "\"" << std::endl;\r
+}\r
+\r
+inline void DumpVar(const char *szName, const std::wstring &value)\r
+{\r
+       DLOG << "[WStr]: " << szName << "=\"" << w2s(value) << "\"" << std::endl;\r
+}\r
+\r
+#ifndef MB_IGNORE_QT\r
+inline void DumpVar(const char *szName, const QString &value)\r
+{\r
+       DLOG << "[QStr]: " << szName << "=\"" << value.toStdString() << "\"" << std::endl;\r
+}\r
+#endif\r
+\r
+inline void DumpVar(const char *szName, const void* value)\r
+{\r
+       DLOG << "[ptr]: " << szName << "=" << value << std::endl;\r
+}\r
+\r
+\r
+// Collection of primitive types\r
+inline void DumpVar(const char *szName, const std::set<int> &values)\r
+{\r
+       DLOG << "[intSet]: " << szName << "={" << values.size() << "}[";\r
+       bool bFirst = true;\r
+       for (auto it=values.cbegin(); it!=values.cend(); ++it)\r
+               DLOG << (bFirst ? "" : ",") << *it;\r
+       DLOG << "]" << std::endl;\r
+}\r
+\r
+inline void DumpVar(const char *szName, const std::list<bool>& values)\r
+{\r
+       DLOG << "[boolList]: " << szName << "={" << values.size() << "}[";\r
+       bool bFirst = true;\r
+       for (auto it=values.cbegin(); it!=values.cend(); ++it)\r
+               DLOG << (bFirst ? "" : ",") << (*it ? "Y" : "N");\r
+       DLOG << "]" << std::endl;\r
+}\r
+\r
+\r
+#endif // MBDebug_HeaderFile\r
+\r
diff --git a/src/GEOMGUI/MBOCC.h b/src/GEOMGUI/MBOCC.h
new file mode 100644 (file)
index 0000000..4561248
--- /dev/null
@@ -0,0 +1,436 @@
+#ifndef MBOCC_H\r
+#define MBOCC_H\r
+\r
+#include <iostream>\r
+#include <locale>\r
+#include <codecvt>\r
+#include <chrono>\r
+\r
+#include <TDataStd_AsciiString.hxx>\r
+#include <TDataStd_BooleanArray.hxx>\r
+#include <TDataStd_BooleanList.hxx>\r
+#include <TDataStd_ByteArray.hxx>\r
+#include <TDataStd_Comment.hxx>\r
+#include <TDataStd_ExtStringArray.hxx>\r
+#include <TDataStd_ExtStringList.hxx>\r
+#include <TDataStd_Integer.hxx>\r
+#include <TDataStd_IntegerArray.hxx>\r
+#include <TDataStd_IntegerList.hxx>\r
+#include <TDataStd_Name.hxx>\r
+#include <TDataStd_Real.hxx>\r
+#include <TDataStd_RealArray.hxx>\r
+#include <TDataStd_RealList.hxx>\r
+#include <TDataStd_ReferenceArray.hxx>\r
+#include <TDataStd_ReferenceList.hxx>\r
+#include <TDataStd_Relation.hxx>\r
+#include <TDataStd_UAttribute.hxx>\r
+#include <TDataStd_Variable.hxx>\r
+#include <TDF_AttributeIterator.hxx>\r
+#include <TDF_ChildIterator.hxx>\r
+#include <TDF_ChildIDIterator.hxx>\r
+#include <TDF_Reference.hxx>\r
+#include <TDF_TagSource.hxx>\r
+#include <TDF_Tool.hxx>\r
+#include <TNaming_NamedShape.hxx>\r
+#include <TNaming_Iterator.hxx>\r
+#include <BRepTools.hxx>\r
+#include <TopoDS_Shape.hxx>\r
+#include <TopExp_Explorer.hxx>\r
+\r
+\r
+\r
+//--------------------------------------------------------------------------\r
+// Function declarations\r
+//--------------------------------------------------------------------------\r
+static std::string ShapeTypeStr(const TopoDS_Shape shp);\r
+static std::string EvolutionStr(const TNaming_Evolution evol);\r
+\r
+static void DumpEvolution(Handle(TNaming_NamedShape) aNS);\r
+static void DumpShapeHistory(const TDF_Label& theLabel, const TopoDS_Shape& theShape);\r
+\r
+static void DumpVar(const char *szName, Handle(TNaming_NamedShape) aNS);\r
+static void DumpVar(const char *szName, Handle(TDF_Attribute) aAttr);\r
+static void DumpVar(const char *szName, const TDF_Label &lbl);\r
+static void DumpVar(const char *szName, const TopoDS_Shape &aShape);\r
+\r
+\r
+\r
+\r
+\r
+//==========================================================================\r
+static std::string ShapeTypeStr(const TopoDS_Shape shp) {\r
+       if (shp.IsNull())\r
+               return "null";\r
+\r
+       switch (shp.ShapeType()) {\r
+               case TopAbs_COMPOUND:   return "COMPOUND";\r
+               case TopAbs_COMPSOLID:  return "COMPSOLID";\r
+               case TopAbs_SOLID:              return "SOLID";\r
+               case TopAbs_SHELL:              return "SHELL";\r
+               case TopAbs_FACE:               return "FACE";\r
+               case TopAbs_WIRE:               return "WIRE";\r
+               case TopAbs_EDGE:               return "EDGE";\r
+               case TopAbs_VERTEX:     return "VERTEX";\r
+               case TopAbs_SHAPE:              return "SHAPE";\r
+       }\r
+       return "??";\r
+}\r
+\r
+//==========================================================================\r
+static std::string EvolutionStr(const TNaming_Evolution evol) {\r
+       switch (evol) {\r
+               case TNaming_PRIMITIVE: return "PRIMITIVE";\r
+               case TNaming_GENERATED: return "GENERATED";\r
+               case TNaming_MODIFY:    return "MODIFY";\r
+               case TNaming_DELETE:    return "DELETE";\r
+               case TNaming_REPLACE:   return "REPLACE";\r
+               case TNaming_SELECTED:  return "SELECTED";\r
+       }\r
+       return "??";\r
+}\r
+\r
+//==========================================================================\r
+static void SaveShape(const TopoDS_Shape &shp, const char* szFileName) {\r
+       std::string fn("/home/bernhard/brep/");\r
+       std::chrono::high_resolution_clock::time_point now_t = std::chrono::high_resolution_clock::now();\r
+       unsigned long long now_c = *((unsigned long long*)&now_t);\r
+       fn = fn + std::to_string(now_c) + "_" + szFileName + ".brep";\r
+       MSGEL("...saving shape \"" << szFileName << "\"to [" << fn << "]");\r
+       BRepTools::Write(shp, fn.c_str());\r
+}\r
+\r
+//==========================================================================\r
+static void DumpChildren(const TDF_Label& aLabel) {\r
+       TDF_ChildIterator it;\r
+       //TCollection_AsciiString as;\r
+       for     (it.Initialize(aLabel); it.More(); it.Next()) {\r
+               SHOW(it.Value());\r
+               DumpChildren(it.Value());\r
+               // TDF_Tool::Entry(it.Value(),as);\r
+               // MSGEL("* [Label]: child=" << as.ToCString());\r
+       }\r
+ }\r
+\r
+//==========================================================================\r
+static void DumpShapeHistory(const TDF_Label& theLabel, const TopoDS_Shape& theShape)\r
+{\r
+  SHOW(theLabel);\r
+  SHOW(theShape);\r
+  DLOG << "{-------ShapeHistory-------------------------" << std::endl;\r
+  TopoDS_Shape anOldShape; // old shape in the pair old shape->theShape in the named shape\r
+  TopoDS_Shape aShapeContainer; // old shape of the shape that contains theShape as sub-element\r
+  Handle(TNaming_NamedShape) aCandidatInThis, aCandidatContainer;\r
+  // use child and this label (the lowest priority)\r
+  TDF_ChildIDIterator aNSIter(theLabel, TNaming_NamedShape::GetID(), Standard_True);\r
+  bool aUseThis = !aNSIter.More();\r
+  while(anOldShape.IsNull() && (aNSIter.More() || aUseThis)) {\r
+    Handle(TNaming_NamedShape) aNS;\r
+    if (aUseThis) {\r
+      if (!theLabel.FindAttribute(TNaming_NamedShape::GetID(), aNS))\r
+        break;\r
+    } else {\r
+      aNS = Handle(TNaming_NamedShape)::DownCast(aNSIter.Value());\r
+    }\r
+    for(TNaming_Iterator aShapesIter(aNS); aShapesIter.More(); aShapesIter.Next()) {\r
+      if (aShapesIter.Evolution() == TNaming_SELECTED || aShapesIter.Evolution() == TNaming_DELETE)\r
+        continue; // don't use the selection evolution\r
+\r
+      if (aShapesIter.NewShape().IsSame(theShape)) { // found the original shape\r
+        aCandidatInThis = aNS;\r
+        if (aCandidatInThis->Evolution() == TNaming_MODIFY) {\r
+          anOldShape = aShapesIter.OldShape();\r
+          MSG("* modified from: "); SHOW(anOldShape);\r
+        }\r
+        // otherwise may we searching for another item of this shape with longer history\r
+        if (!anOldShape.IsNull())\r
+          break;\r
+      }\r
+      // check that the shape contains theShape as sub-shape to fill container\r
+      if (aShapesIter.NewShape().ShapeType() < theShape.ShapeType() && aCandidatContainer.IsNull()) {\r
+        TopExp_Explorer anExp(aShapesIter.NewShape(), theShape.ShapeType());\r
+        for(; anExp.More(); anExp.Next()) {\r
+          if (theShape.IsSame(anExp.Current())) {\r
+            aCandidatContainer = aNS;\r
+            aShapeContainer = aShapesIter.NewShape();\r
+          }\r
+        }\r
+      }\r
+    }\r
+    // iterate to the next label or to the body label in the end\r
+    if (!aUseThis)\r
+      aNSIter.Next();\r
+    if (!aNSIter.More()) {\r
+      if (aUseThis)\r
+        break;\r
+      aUseThis = true;\r
+    }\r
+  }\r
+  DLOG << "}--------------------------------------------" << std::endl;\r
+}\r
+\r
+\r
+\r
+//==========================================================================\r
+static void DumpEvolution(Handle(TNaming_NamedShape) aNS) {\r
+  DLOG << "{";\r
+  // TNaming_Iterator iterates in reversed way than it was put in Builder, so, keep it in container\r
+  // and iterate from end to begin\r
+  NCollection_List<TopoDS_Shape> aOlds;\r
+  NCollection_List<TopoDS_Shape> aNews;\r
+  NCollection_List<TNaming_Evolution> aEvol;\r
+  for (TNaming_Iterator anIt(aNS); anIt.More(); anIt.Next()) {\r
+    aOlds.Prepend(anIt.OldShape());\r
+    aNews.Prepend(anIt.NewShape());\r
+    aEvol.Prepend(anIt.Evolution());\r
+  }\r
+  NCollection_List<TopoDS_Shape>::Iterator aOldIter(aOlds);\r
+  NCollection_List<TopoDS_Shape>::Iterator aNewIter(aNews);\r
+  NCollection_List<TNaming_Evolution>::Iterator aEvolIter(aEvol);\r
+  for(; aOldIter.More(); aOldIter.Next(), aNewIter.Next(), aEvolIter.Next()) {\r
+    switch (aEvolIter.Value()) {\r
+    case TNaming_PRIMITIVE :\r
+      DLOG << "  * primitive " << ShapeTypeStr(aNewIter.Value()) << std::endl;\r
+      break;\r
+    case TNaming_GENERATED :\r
+      DLOG << "  * generated from " << ShapeTypeStr(aOldIter.Value()) << " to " << ShapeTypeStr(aNewIter.Value()) << std::endl;\r
+      break;\r
+    case TNaming_MODIFY :\r
+      DLOG << "  * modified from " << ShapeTypeStr(aOldIter.Value()) << " to " << ShapeTypeStr(aNewIter.Value()) << std::endl;\r
+      break;\r
+    case TNaming_DELETE :\r
+      DLOG << "  * deleted " << ShapeTypeStr(aOldIter.Value()) << std::endl;\r
+      break;\r
+    case TNaming_SELECTED :\r
+      DLOG << "  * selected in " << ShapeTypeStr(aNewIter.Value()) << " a(n) " << ShapeTypeStr(aOldIter.Value()) << std::endl;\r
+      break;\r
+    default:\r
+      break;\r
+    }\r
+  }\r
+  DLOG << "}" << std::endl;\r
+}\r
+\r
+//==========================================================================\r
+static void DumpVar(const char *szName, Handle(TNaming_NamedShape) aNS) {\r
+       if (aNS.IsNull()) {\r
+               DLOG << "[NamShp]: " << szName << "=Null" << std::endl;\r
+               return;\r
+       }\r
+       DLOG << "[NamShp]: " << szName << " vers=" << aNS->Version() << " Evol=[" << EvolutionStr(aNS->Evolution()) << "] Shape=\"" << ShapeTypeStr(aNS->Get()) << "\"" << std::endl;\r
+  //DumpEvolution(aNS);\r
+}\r
+\r
+//==========================================================================\r
+static void DumpVar(const char *szName, Handle(TDF_Attribute) attr) {\r
+       if (attr.IsNull()) {\r
+               DLOG << "[TDFAttr]: " << szName << "=Null" << std::endl;\r
+               return;\r
+       }\r
+       int trans = attr->Transaction();\r
+       std::string state(" state=[");\r
+       state = state + (attr->IsValid() ? "valid" : "invalid");\r
+       state = state + "|" + (attr->IsNew() ? "new" : "old");\r
+       state = state + "|" + (attr->IsForgotten() ? "forgot" : "known") + "]";\r
+       Handle(TDataStd_AsciiString) aAS = Handle(TDataStd_AsciiString)::DownCast(attr);\r
+       if (!aAS.IsNull()) {\r
+               DLOG << "[TDFAttr_AscStr]: " << szName << "=\"" << aAS->Get() << "\"" << " trans=" << trans << state << std::endl;\r
+               return;\r
+       }\r
+       Handle(TDataStd_BooleanArray) aBoolArr = Handle(TDataStd_BooleanArray)::DownCast(attr);\r
+       if (!aBoolArr.IsNull()) {\r
+               DLOG << "[TDFAttr_BoolArr]: " << szName << "=" << aBoolArr->Length() << " [";\r
+               if (aBoolArr->Length() > 0) {\r
+                       for (int i=aBoolArr->Lower(); i<=aBoolArr->Upper(); i++) {\r
+                               DLOG << (i == aBoolArr->Lower() ? "" : ",") << YesNo(aBoolArr->Value(i));\r
+                       }\r
+               }\r
+               DLOG << "]" << " trans=" << trans << state << std::endl;\r
+               return;\r
+       }\r
+       Handle(TDataStd_BooleanList) aBoolLst = Handle(TDataStd_BooleanList)::DownCast(attr);\r
+       if (!aBoolLst.IsNull()) {\r
+               const TDataStd_ListOfByte& lst = aBoolLst->List();\r
+               DLOG << "[TDFAttr_BoolLst]: " << szName << "=" << lst.Size() << " [";\r
+               if (!lst.IsEmpty()) {\r
+                       for (auto b=lst.cbegin(); b!=lst.cend(); ++b) {\r
+                               DLOG << (b == lst.cbegin() ? "" : ",") << YesNo(*b);\r
+                       }\r
+               }\r
+               DLOG << "]" << " trans=" << trans << state << std::endl;\r
+               return;\r
+       }\r
+       Handle(TDataStd_Comment) aCmt = Handle(TDataStd_Comment)::DownCast(attr);\r
+       if (!aCmt.IsNull()) {\r
+               DLOG << "[TDFAttr_Comment]: " << szName << "=\"" << aCmt->Get() << "\"" << " trans=" << trans << state << std::endl;\r
+               return;\r
+       }\r
+       Handle(TDataStd_ExtStringList) aESLst = Handle(TDataStd_ExtStringList)::DownCast(attr);\r
+       if (!aESLst.IsNull()) {\r
+               const TDataStd_ListOfExtendedString& lst = aESLst->List();\r
+               DLOG << "[TDFAttr_ExStrLst]: " << szName << "=" << lst.Size() << " [";\r
+               if (!lst.IsEmpty()) {\r
+                       for (auto str=lst.cbegin(); str!=lst.cend(); ++str) {\r
+                               //std::wstring ws((wchar_t*)(*str).ToExtString());\r
+                               DLOG << (str == lst.cbegin() ? "" : ",") << "\"" << *str << "\"";\r
+                       }\r
+               }\r
+               DLOG << "]" << " trans=" << trans << state << std::endl;\r
+               return;\r
+       }\r
+       Handle(TDataStd_Integer) aInt = Handle(TDataStd_Integer)::DownCast(attr);\r
+       if (!aInt.IsNull()) {\r
+               DLOG << "[TDFAttr_Int]: " << szName << "=" << aInt->Get() << " trans=" << trans << state << std::endl;\r
+               return;\r
+       }\r
+       Handle(TDataStd_IntegerArray) aIntArr = Handle(TDataStd_IntegerArray)::DownCast(attr);\r
+       if (!aIntArr.IsNull()) {\r
+               DLOG << "[TDFAttr_IntArr]: " << szName << "=" << aIntArr->Length() << " [";\r
+               if (aIntArr->Length() > 0) {\r
+                       for (int i=aIntArr->Lower(); i<=aIntArr->Upper(); i++) {\r
+                               DLOG << (i == aIntArr->Lower() ? "" : ",") << aIntArr->Value(i);\r
+                       }\r
+               }\r
+               DLOG << "]" << " trans=" << trans << state << std::endl;\r
+               return;\r
+       }\r
+\r
+       Handle(TDataStd_Name) aNam = Handle(TDataStd_Name)::DownCast(attr);\r
+       if (!aNam.IsNull()) {\r
+               DLOG << "[TDFAttr_Name]: " << szName << "=\"" << aNam->Get() << "\"" << " trans=" << trans << state << std::endl;\r
+               return;\r
+       }\r
+       Handle(TNaming_NamedShape) aNS = Handle(TNaming_NamedShape)::DownCast(attr);\r
+       if (!aNS.IsNull()) { \r
+               DLOG << "[TDFAttr_NamShp]: " << szName << "=\"" << ShapeTypeStr(aNS->Get()) << "\" trans=" << trans << state << std::endl;\r
+               DLOG << aNS;\r
+               TNaming_Iterator it(aNS);\r
+               for (; it.More(); it.Next()) {\r
+                       MSGEL("[NamShp]: child: Modif=" << YesNo(it.IsModification()) << " Evol=[" << EvolutionStr(it.Evolution()) << "] Old=\"" << ShapeTypeStr(it.OldShape()) << "\" New=\""<< ShapeTypeStr(it.NewShape()) << "\"");\r
+               }\r
+    //SHOW(aNS);\r
+               return;\r
+       }\r
+       Handle(TDataStd_Real) aReal = Handle(TDataStd_Real)::DownCast(attr);\r
+       if (!aReal.IsNull()) {\r
+               DLOG << "[TDFAttr_Real]: " << szName << "=" << aReal->Get() << " trans=" << trans << state << std::endl;\r
+               return;\r
+       }\r
+       Handle(TDF_Reference) aRef = Handle(TDF_Reference)::DownCast(attr);\r
+       if (!aRef.IsNull()) {\r
+               TCollection_AsciiString entry;\r
+               TDF_Tool::Entry(aRef->Get(), entry);\r
+               DLOG << "[TDFAttr_Ref]: " << szName << "=" << entry << " trans=" << trans << state << std::endl;\r
+               return;\r
+       }\r
+       Handle(TDataStd_ReferenceArray) aRefArr = Handle(TDataStd_ReferenceArray)::DownCast(attr);\r
+       if (!aRefArr.IsNull()) {\r
+               DLOG << "[TDFAttr_RefArr]: " << szName << "=" << aRefArr->Length() << " [";\r
+               if (aRefArr->Length() > 0) {\r
+                       TCollection_AsciiString entry;\r
+                       for (int i=aRefArr->Lower(); i<=aRefArr->Upper(); i++) {\r
+                               TDF_Tool::Entry(aRefArr->Value(i), entry);\r
+                               DLOG << (i == aRefArr->Lower() ? "" : ",") << entry;\r
+                       }\r
+               }\r
+               DLOG << "]" << " trans=" << trans << state << std::endl;\r
+               return;\r
+       }\r
+       Handle(TDataStd_ReferenceList) aRefLst = Handle(TDataStd_ReferenceList)::DownCast(attr);\r
+       if (!aRefLst.IsNull()) {\r
+               const TDF_LabelList& lst = aRefLst->List();\r
+               DLOG << "[TDFAttr_RefLst]: " << szName << "=" << lst.Size() << " [";\r
+               if (!lst.IsEmpty()) {\r
+                       TCollection_AsciiString entry;\r
+                       for (auto ref=lst.cbegin(); ref!=lst.cend(); ++ref) {\r
+                               TDF_Tool::Entry(*ref, entry);\r
+                               DLOG << (ref == lst.cbegin() ? "" : ",") << entry;\r
+                       }\r
+               }\r
+               DLOG << "]" << " trans=" << trans << state << std::endl;\r
+               return;\r
+       }\r
+       Handle(TDF_TagSource) aTS = Handle(TDF_TagSource)::DownCast(attr);\r
+       if (!aTS.IsNull()) {\r
+               DLOG << "[TDFAttr_TagSrc]: " << szName << "=" << aTS->Get() << " trans=" << trans << state << std::endl;\r
+               return;\r
+       }\r
+       Handle(TDataStd_UAttribute) aUA = Handle(TDataStd_UAttribute)::DownCast(attr);\r
+       if (!aUA.IsNull()) {\r
+               DLOG << "[TDFAttr_UAttr]: " << szName << "= trans=" << trans << state << std::endl;\r
+               return;\r
+       }\r
+  DLOG << "[" << attr->DynamicType()->Name() << "]" << attr << std::endl;\r
+}\r
+\r
+//==========================================================================\r
+static void DumpVar(const char *szName, const TDF_Label &lbl) {\r
+       try {\r
+               if (lbl.IsNull()) {\r
+                       DLOG << "[Label]: " << szName << "=Null" << std::endl;\r
+               } else {\r
+                       TCollection_AsciiString entry; TDF_Tool::Entry(lbl, entry);\r
+                       std::string imp = (lbl.IsImported() ? "import" : "noimp");\r
+                       std::string modif = (lbl.MayBeModified() ? "modif" : "nomodif");\r
+                       int nAttr = (lbl.HasAttribute() ? lbl.NbAttributes() : 0);\r
+                       int nChild = (lbl.HasChild() ? lbl.NbChildren() : 0);\r
+      DLOG << "[Label]: " << szName << "={" << entry << " state=[" << imp << "|" << modif << "] nAttr=" << nAttr << " nChild=" << nChild << (nChild > 0 || nAttr > 0 ? "" : "}") << std::endl;\r
+                       if (nAttr > 0) {\r
+                               // Dump all attributes\r
+                               for (TDF_AttributeIterator itr(lbl); itr.More(); itr.Next()) {\r
+                                       Handle(TDF_Attribute) attr = itr.Value();\r
+                                       SHOW(attr);\r
+                               }\r
+                       }\r
+                       if (nChild > 0) {\r
+                               TDF_Label child;\r
+                               for     (TDF_ChildIterator it(lbl); it.More(); it.Next()) {\r
+                                       child = it.Value();\r
+                                       SHOW(child);\r
+                               }\r
+                       }\r
+                       if (nAttr > 0 || nChild > 0) {\r
+                               MSGEL("}");\r
+                       }\r
+               }\r
+       }\r
+       catch (...) { }\r
+}\r
+\r
+//==========================================================================\r
+static void DumpVar(const char *szName, const TopoDS_Shape &aShape) {\r
+       if (aShape.IsNull()) {\r
+               DLOG << "[TopShp]: " << szName << "=Null" << std::endl;\r
+       } else {\r
+               std::string typ = ShapeTypeStr(aShape);\r
+               DLOG << "[TopShp]: " << szName << "=" << aShape.TShape().get() << " ShapeType=" << typ;\r
+               if (aShape.ShapeType() == TopAbs_COMPOUND) {\r
+      int children[TopAbs_SHAPE+1] = {0};\r
+      int nbChild = 0;\r
+      for (TopoDS_Iterator Iter(aShape); Iter.More(); Iter.Next()) {\r
+        if (!Iter.Value().IsNull()) {\r
+          children[(int)Iter.Value().ShapeType()]++;\r
+          nbChild++;\r
+        }\r
+      }\r
+                       DLOG << " NumChild=" << nbChild;\r
+      if (nbChild > 0) {\r
+        bool bFirst = true;\r
+        DLOG << " (";\r
+        for (int i=TopAbs_COMPOUND; i<TopAbs_SHAPE; i++) {\r
+          if (children[i] > 0) {\r
+            if (!bFirst) DLOG << ", ";\r
+            DLOG << children[i] << " " << TopAbs::ShapeTypeToString((TopAbs_ShapeEnum)i);\r
+            bFirst = false;\r
+          }\r
+        }\r
+        DLOG << ")";\r
+      }\r
+               }\r
+    else if (aShape.ShapeType() == TopAbs_COMPSOLID) {\r
+                       DLOG << " NumChild=" << aShape.NbChildren();\r
+               }\r
+               DLOG << std::endl;\r
+       }\r
+}\r
+\r
+#endif // MBOCC_H
\ No newline at end of file