diff --git a/doc/salome/gui/GEOM/images/geomimport_reopen.png b/doc/salome/gui/GEOM/images/geomimport_reopen.png
new file mode 100644
index 000000000..9d6745db4
Binary files /dev/null and b/doc/salome/gui/GEOM/images/geomimport_reopen.png differ
diff --git a/doc/salome/gui/GEOM/input/import_export.doc b/doc/salome/gui/GEOM/input/import_export.doc
index 8a5219ebe..25eb1ae67 100644
--- a/doc/salome/gui/GEOM/input/import_export.doc
+++ b/doc/salome/gui/GEOM/input/import_export.doc
@@ -22,6 +22,14 @@ Select the required file and click \b Open. Your file will be imported in
the module and its contents (geometrical object) will be displayed in
the Object Browser.
+\note You can re-open ones imported shape from the initial file, if
+the file has been changed on disk. Use for that item
+Reload From Disk from context menu of imported
+shape. Reloaded shape will have the same representation parameters
+like before this operation.
+
+\image html geomimport_reopen.png
+
\n To export geometrical objects into a BREP, IGES, STEP
file:
diff --git a/idl/GEOM_Gen.idl b/idl/GEOM_Gen.idl
index c130973fb..38f10ca6e 100644
--- a/idl/GEOM_Gen.idl
+++ b/idl/GEOM_Gen.idl
@@ -792,6 +792,13 @@ module GEOM
GEOM_Object PositionShapeCopy (in GEOM_Object theObject,
in GEOM_Object theStartLCS,
in GEOM_Object theEndLCS);
+
+ /*!
+ * Recompute the shape from its arguments.
+ * \param theObject The object to be recomputed.
+ * \return theObject.
+ */
+ GEOM_Object RecomputeObject (in GEOM_Object theObject);
};
/*!
diff --git a/src/GEOMGUI/GEOM_msg_en.po b/src/GEOMGUI/GEOM_msg_en.po
index 20cd3b673..43c6e908a 100644
--- a/src/GEOMGUI/GEOM_msg_en.po
+++ b/src/GEOMGUI/GEOM_msg_en.po
@@ -2482,6 +2482,12 @@ msgstr "Edit"
msgid "STB_GROUP_EDIT"
msgstr "Edit a group"
+msgid "MEN_RELOAD_IMPORTED"
+msgstr "Reload From Disk"
+
+msgid "STB_RELOAD_IMPORTED"
+msgstr "Reload imported shape from its original place on disk"
+
msgid "MEN_BLOCKS"
msgstr "Blocks"
diff --git a/src/GEOMGUI/GeometryGUI.cxx b/src/GEOMGUI/GeometryGUI.cxx
index 2b95749ba..d1ffd70c2 100644
--- a/src/GEOMGUI/GeometryGUI.cxx
+++ b/src/GEOMGUI/GeometryGUI.cxx
@@ -71,6 +71,7 @@
#include
#include
+#include "GEOMImpl_Types.hxx"
extern "C" {
Standard_EXPORT CAM_Module* createModule() {
@@ -488,7 +489,8 @@ void GeometryGUI::OnGUIEvent( int id )
id == 5025 || // MENU TRANSFORMATION - SCALE
id == 5026 || // MENU TRANSFORMATION - OFFSET
id == 5027 || // MENU TRANSFORMATION - MULTI-TRANSLATION
- id == 5028 ) { // MENU TRANSFORMATION - MULTI-ROTATION
+ id == 5028 || // MENU TRANSFORMATION - MULTI-ROTATION
+ id == 5029 ) { // CONTEXT(POPUP) MENU - RELOAD_IMPORTED
#ifndef WNT
library = getLibrary( "libTransformationGUI.so" );
#else
@@ -825,6 +827,7 @@ void GeometryGUI::initialize( CAM_Application* app )
createGeomAction( 5026, "OFFSET" );
createGeomAction( 5027, "MUL_TRANSLATION" );
createGeomAction( 5028, "MUL_ROTATION" );
+ createGeomAction( 5029, "RELOAD_IMPORTED" );
createGeomAction( 503, "PARTITION" );
createGeomAction( 504, "ARCHIMEDE" );
@@ -1722,13 +1725,23 @@ void GeometryGUI::contextMenuPopup( const QString& client, QPopupMenu* menu, QSt
SalomeApp_Module::contextMenuPopup( client, menu, title );
SALOME_ListIO lst;
getApp()->selectionMgr()->selectedObjects( lst );
- if ( ( client == "OCCViewer" || client == "VTKViewer" ) && lst.Extent() == 1 ) {
+
+ if (lst.Extent() == 1) {
Handle(SALOME_InteractiveObject) io = lst.First();
- SalomeApp_Study* appStudy = dynamic_cast( application()->activeStudy() );
+ SalomeApp_Study* appStudy = dynamic_cast(application()->activeStudy());
_PTR(Study) study = appStudy->studyDS();
- _PTR(SObject) obj = study->FindObjectID( io->getEntry() );
- if ( obj )
- title = QString( obj->GetName().c_str() );
+ _PTR(SObject) aSObj = study->FindObjectID(io->getEntry());
+ if (aSObj) {
+ // Set context menu title
+ if (client == "OCCViewer" || client == "VTKViewer")
+ title = QString(aSObj->GetName().c_str());
+
+ // Reload imported shape
+ CORBA::Object_var anObj = GeometryGUI::ClientSObjectToObject(aSObj);
+ GEOM::GEOM_Object_var aGeomObj = GEOM::GEOM_Object::_narrow(anObj);
+ if (!CORBA::is_nil(aGeomObj) && aGeomObj->GetType() == GEOM_IMPORT)
+ action(5029)->addTo(menu);
+ }
}
}
diff --git a/src/GEOM_I/GEOM_ITransformOperations_i.cc b/src/GEOM_I/GEOM_ITransformOperations_i.cc
index 1dff38932..338e901eb 100644
--- a/src/GEOM_I/GEOM_ITransformOperations_i.cc
+++ b/src/GEOM_I/GEOM_ITransformOperations_i.cc
@@ -1252,3 +1252,39 @@ GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::RotateThreePointsCopy
return GetObject(anObject);
}
+
+//=============================================================================
+/*!
+ * RecomputeObject
+ */
+//=============================================================================
+GEOM::GEOM_Object_ptr GEOM_ITransformOperations_i::RecomputeObject
+ (GEOM::GEOM_Object_ptr theObject)
+{
+ //Set a not done flag
+ GetOperations()->SetNotDone();
+ GEOM::GEOM_Object_var aGEOMObject;
+
+ if (theObject == NULL) return aGEOMObject._retn();
+
+ //check if the object is a subshape
+ //if (!theObject->IsMainShape()) {
+ // GetOperations()->SetErrorCode(SUBSHAPE_ERROR);
+ // return aGEOMObject._retn();
+ //}
+
+ aGEOMObject = GEOM::GEOM_Object::_duplicate(theObject);
+
+ //Get the object itself
+ CORBA::String_var anEntry = theObject->GetEntry();
+ Handle(GEOM_Object) anObject =
+ GetOperations()->GetEngine()->GetObject(theObject->GetStudyID(), anEntry);
+ if (anObject.IsNull()) return aGEOMObject._retn();
+
+ //Perform the recomputation
+ Handle(GEOM_Function) aLastFunction = anObject->GetLastFunction();
+ if (aLastFunction.IsNull()) return aGEOMObject._retn();
+ GetOperations()->GetSolver()->ComputeFunction(aLastFunction);
+
+ return aGEOMObject._retn();
+}
diff --git a/src/GEOM_I/GEOM_ITransformOperations_i.hh b/src/GEOM_I/GEOM_ITransformOperations_i.hh
index 848e5077b..ccfdc50e1 100644
--- a/src/GEOM_I/GEOM_ITransformOperations_i.hh
+++ b/src/GEOM_I/GEOM_ITransformOperations_i.hh
@@ -151,6 +151,7 @@ class GEOM_I_EXPORT GEOM_ITransformOperations_i :
GEOM::GEOM_Object_ptr thePoint1,
GEOM::GEOM_Object_ptr thePoint2);
+ GEOM::GEOM_Object_ptr RecomputeObject (GEOM::GEOM_Object_ptr theObject);
::GEOMImpl_ITransformOperations* GetOperations() { return (::GEOMImpl_ITransformOperations*)GetImpl(); }
};
diff --git a/src/TransformationGUI/TransformationGUI.cxx b/src/TransformationGUI/TransformationGUI.cxx
index eb69c9037..1c5cfe1c8 100644
--- a/src/TransformationGUI/TransformationGUI.cxx
+++ b/src/TransformationGUI/TransformationGUI.cxx
@@ -27,12 +27,18 @@
// $Header$
#include "TransformationGUI.h"
+
+#include
#include "GeometryGUI.h"
-#include "SUIT_Session.h"
-#include "SUIT_Desktop.h"
-
-#include "SalomeApp_Application.h"
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
#include "TransformationGUI_MultiTranslationDlg.h" // Method MULTI TRANSLATION
#include "TransformationGUI_MultiRotationDlg.h" // Method MULTI ROTATION
@@ -100,6 +106,60 @@ bool TransformationGUI::OnGUIEvent(int theCommandID, SUIT_Desktop* parent)
case 5028: // MULTI ROTATION
aDlg = new TransformationGUI_MultiRotationDlg( getGeometryGUI(), parent, "" );
break;
+ case 5029: // RELOAD IMPORTED SHAPE
+ {
+ LightApp_SelectionMgr* aSelMgr = app->selectionMgr();
+ SALOME_ListIO aSelList;
+ aSelMgr->selectedObjects(aSelList);
+ if (aSelList.Extent() == 1) {
+ Standard_Boolean testResult = Standard_False;
+ GEOM::GEOM_Object_var aGeomObj =
+ GEOMBase::ConvertIOinGEOMObject(aSelList.First(), testResult);
+ if (testResult) {
+ SalomeApp_Study* anAppStudy = dynamic_cast(app->activeStudy());
+ GEOM::GEOM_ITransformOperations_var anOp =
+ GeometryGUI::GetGeomGen()->GetITransformOperations(anAppStudy->id());
+ if (!anOp->_is_nil()) {
+ anOp->RecomputeObject(aGeomObj);
+ GEOM_Displayer aDisp (anAppStudy);
+ //aDisp.Redisplay(aSelList.First());
+ //aDisp.Display(aSelList.First());
+ Handle(SALOME_InteractiveObject) theIO = aSelList.First();
+ SUIT_Desktop* desk = app->desktop();
+ QPtrList wnds = desk->windows();
+ SUIT_ViewWindow* wnd;
+ for ( wnd = wnds.first(); wnd; wnd = wnds.next() )
+ {
+ SUIT_ViewManager* vman = wnd->getViewManager();
+ if ( vman )
+ {
+ SUIT_ViewModel* vmodel = vman->getViewModel();
+ if ( vmodel )
+ {
+ SALOME_View* view = dynamic_cast(vmodel);
+ if ( view )
+ {
+ //if (view->isVisible(theIO) || view == GetActiveView())
+ if (view->isVisible(theIO))
+ {
+ //SALOME_Prs* prs = view->CreatePrs( theIO->getEntry() );
+ //if ( prs ) {
+ // prs->Update(&aDisp);
+ // view->Repaint();
+ //}
+ aDisp.Erase(theIO, false, false, view);
+ aDisp.Display(theIO, true, view);
+ }
+ }
+ }
+ }
+ }
+ // ? Redisplay subshapes ?
+ }
+ }
+ }
+ }
+ break;
default:
app->putInfo(tr("GEOM_PRP_COMMAND").arg(theCommandID));
break;