From f435fe5c8210fd6b1f0c4e1ab62e91babc0cfd28 Mon Sep 17 00:00:00 2001 From: eap Date: Fri, 7 Aug 2020 12:14:55 +0300 Subject: [PATCH] Enable simultaneous usage of several StdMeshersGUI_SubShapeSelectorWdg's Add SMESH_Gen_i::CountInPyDump(text) which is useful for defining uniquely named variables in dump python scripts --- src/SMESH_I/SMESH_Gen_i.hxx | 2 + src/SMESH_I/SMESH_PythonDump.cxx | 56 ++++++++++++++++++- .../StdMeshersGUI_SubShapeSelectorWdg.cxx | 26 +++++++-- .../StdMeshersGUI_SubShapeSelectorWdg.h | 14 ++++- 4 files changed, 92 insertions(+), 6 deletions(-) diff --git a/src/SMESH_I/SMESH_Gen_i.hxx b/src/SMESH_I/SMESH_Gen_i.hxx index 895f745fc..d6cb5b130 100644 --- a/src/SMESH_I/SMESH_Gen_i.hxx +++ b/src/SMESH_I/SMESH_Gen_i.hxx @@ -494,6 +494,8 @@ public: void CleanPythonTrace(); + static int CountInPyDump(const TCollection_AsciiString& text); + // ***************************************** // Internal methods // ***************************************** diff --git a/src/SMESH_I/SMESH_PythonDump.cxx b/src/SMESH_I/SMESH_PythonDump.cxx index 04a0fc9a8..e1c3002c0 100644 --- a/src/SMESH_I/SMESH_PythonDump.cxx +++ b/src/SMESH_I/SMESH_PythonDump.cxx @@ -40,6 +40,8 @@ #include #include +#include + #ifdef _DEBUG_ static int MYDEBUG = 0; #else @@ -77,7 +79,7 @@ namespace SMESH TCollection_AsciiString aCollection(Standard_CString(aString.c_str())); if(!aCollection.IsEmpty()) { - const std::string & objEntry = SMESH_Gen_i::GetSMESHGen()->GetLastObjEntry(); + const std::string & objEntry = aSMESHGen->GetLastObjEntry(); if ( !objEntry.empty() ) aCollection += (TVar::ObjPrefix() + objEntry ).c_str(); aSMESHGen->AddToPythonScript(aCollection); @@ -1388,3 +1390,55 @@ void SMESH_Gen_i::CleanPythonTrace() myPythonScript->Clear(); } } + +//================================================================================ +/*! + * \brief Count inclusions of a string in a raw Python dump script + */ +//================================================================================ + +int SMESH_Gen_i::CountInPyDump(const TCollection_AsciiString& theText) +{ + int count = 0; + + SALOMEDS::Study_var aStudy = getStudyServant(); + if ( CORBA::is_nil( aStudy )) + return count; + + SMESH_Gen_i* me = GetSMESHGen(); + CORBA::String_var compDataType = me->ComponentDataType(); + SALOMEDS::SObject_wrap aSO = aStudy->FindComponent( compDataType.in() ); + if ( CORBA::is_nil( aSO )) + return count; + + // Trace saved in the study + SALOMEDS::GenericAttribute_wrap attr; + if ( aSO->FindAttribute( attr.inout(), "AttributePythonObject" )) + { + SALOMEDS::AttributePythonObject_var pyAttr = + SALOMEDS::AttributePythonObject::_narrow( attr ); + CORBA::String_var script = pyAttr->GetObject(); + for ( const char * scriptPos = script.in(); true; ++scriptPos ) + if (( scriptPos = strstr( scriptPos, theText.ToCString() ))) + ++count; + else + break; + } + + // New python commands + if ( !me->myPythonScript.IsNull() ) + { + const int nbLines = me->myPythonScript->Length(); + for ( int i = 1; i <= nbLines; ++i ) + { + const TCollection_AsciiString& line = me->myPythonScript->Value( i ); + for ( int loc = 1; loc <= line.Length(); ++loc ) + if (( loc = line.Location( theText, loc, line.Length() ))) + ++count; + else + break; + } + } + + return count; +} diff --git a/src/StdMeshersGUI/StdMeshersGUI_SubShapeSelectorWdg.cxx b/src/StdMeshersGUI/StdMeshersGUI_SubShapeSelectorWdg.cxx index 54560d8fc..31db0a7be 100644 --- a/src/StdMeshersGUI/StdMeshersGUI_SubShapeSelectorWdg.cxx +++ b/src/StdMeshersGUI/StdMeshersGUI_SubShapeSelectorWdg.cxx @@ -74,7 +74,8 @@ StdMeshersGUI_SubShapeSelectorWdg ::StdMeshersGUI_SubShapeSelectorWdg( QWidget * parent, TopAbs_ShapeEnum subShType, const bool toShowList, - const bool toShowActivateBtn ): + const bool toShowActivateBtn, + const int minListWidth ): QWidget( parent ), myMaxSize( -1 ), myPreviewActor( 0 ) @@ -93,8 +94,8 @@ StdMeshersGUI_SubShapeSelectorWdg myAddButton = new QPushButton( tr( "SMESH_BUT_ADD" ), this ); myRemoveButton = new QPushButton( tr( "SMESH_BUT_REMOVE" ), this ); myListWidget->setSelectionMode( QListWidget::ExtendedSelection ); - myListWidget->setMinimumWidth(300); - myListWidget->setWrapping(true); + myListWidget->setMinimumWidth( minListWidth ); + myListWidget->setWrapping( true ); myActivateButton->setCheckable( true ); } else @@ -254,6 +255,20 @@ void StdMeshersGUI_SubShapeSelectorWdg::ShowPreview( bool visible) } } +//================================================================================ +/*! + * \brief Connect selection slots + * \param other - another StdMeshersGUI_ObjectReferenceParamWdg + */ +//================================================================================ + +void StdMeshersGUI_SubShapeSelectorWdg:: +AvoidSimultaneousSelection ( StdMeshersGUI_SubShapeSelectorWdg* other) +{ + connect(other, SIGNAL(selectionActivated()), this, SLOT(deactivateSelection())); + connect(this, SIGNAL(selectionActivated()), other, SLOT(deactivateSelection())); +} + //================================================================================ /*! * \brief Connect/disconnect to change of selection @@ -275,7 +290,7 @@ void StdMeshersGUI_SubShapeSelectorWdg::ActivateSelection( bool toActivate ) if ( toActivate ) { - connect( mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(selectionIntoArgument())); + connect( mySelectionMgr, SIGNAL(currentSelectionChanged()), SLOT(selectionIntoArgument())); } else { @@ -284,6 +299,9 @@ void StdMeshersGUI_SubShapeSelectorWdg::ActivateSelection( bool toActivate ) if ( sender() == myActivateButton ) ShowPreview( toActivate ); + + if ( toActivate ) + emit selectionActivated(); } //================================================================================ diff --git a/src/StdMeshersGUI/StdMeshersGUI_SubShapeSelectorWdg.h b/src/StdMeshersGUI/StdMeshersGUI_SubShapeSelectorWdg.h index 3f3d3bf12..9c4f14b35 100644 --- a/src/StdMeshersGUI/StdMeshersGUI_SubShapeSelectorWdg.h +++ b/src/StdMeshersGUI/StdMeshersGUI_SubShapeSelectorWdg.h @@ -53,7 +53,8 @@ public: StdMeshersGUI_SubShapeSelectorWdg( QWidget* parent = 0, TopAbs_ShapeEnum subShType = TopAbs_EDGE, const bool toShowList = true, - const bool toShowSelectBtn = false); + const bool toShowSelectBtn = false, + const int minListWidth=300); ~StdMeshersGUI_SubShapeSelectorWdg(); SMESH::long_array_var GetListOfIDs(); @@ -82,12 +83,23 @@ public: SMESH_PreviewActorsCollection* GetActorCollection() { return myPreviewActor; } void ClearSelected(); + void AvoidSimultaneousSelection( StdMeshersGUI_SubShapeSelectorWdg* other); + public slots: + void ActivateSelection( bool ); + void deactivateSelection() { ActivateSelection( false ); } signals: void selectionChanged(); // in the list void shapeSelected(); // globally + /*! + * \brief Emitted when selection is activated + * + * Useful to deactivate one Object Reference param widget when an other + * one is activated + */ + void selectionActivated(); private: void updateState(); -- 2.30.2