X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_Workshop.cpp;h=cc6ea32c57c10494b7dc5871e416069066f7c044;hb=82e5b8212960f00bb388f60650cd464696ef464d;hp=a742061bf9bbaf51d6c98bc8135c7b458141ebb6;hpb=3807f99c22ab4c24456410a31144cbdefe39a8c9;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_Workshop.cpp b/src/XGUI/XGUI_Workshop.cpp index a742061bf..cc6ea32c5 100755 --- a/src/XGUI/XGUI_Workshop.cpp +++ b/src/XGUI/XGUI_Workshop.cpp @@ -1,12 +1,30 @@ -// Copyright (C) 2014-20xx CEA/DEN, EDF R&D --> +// Copyright (C) 2014-2017 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, or (at your option) any later version. +// +// 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 +// -//#include "XGUI_Constants.h" #include "XGUI_Workshop.h" #include "XGUI_ActionsMgr.h" #include "XGUI_MenuMgr.h" #include "XGUI_ColorDialog.h" #include "XGUI_DeflectionDialog.h" +#include "XGUI_TransparencyWidget.h" #include "XGUI_ContextMenuMgr.h" #include "XGUI_Displayer.h" #include "XGUI_ErrorDialog.h" @@ -15,6 +33,7 @@ #include "XGUI_ObjectsBrowser.h" #include "XGUI_OperationMgr.h" #include "XGUI_PropertyPanel.h" +#include "XGUI_PropertyDialog.h" #include "XGUI_SalomeConnector.h" #include "XGUI_Selection.h" #include "XGUI_SelectionMgr.h" @@ -47,6 +66,7 @@ #include #include #include +#include #include #include #include @@ -58,7 +78,6 @@ #include #include -#include #include #include #include @@ -80,12 +99,19 @@ #include #include #include -#include #include #include +#include +#include #include +#include +#ifdef BEFORE_TRIHEDRON_PATCH +#include +#include +#endif + #include #include #include @@ -103,10 +129,14 @@ #include -#ifdef DFBROWSER +#ifdef TINSPECTOR #include -#include -static bool DFBrowser_FirstCall = true; +#include +#include +#include +static TInspector_Communicator* MyTCommunicator; +static Handle(VInspector_CallBack) MyVCallBack; + #endif #ifdef _DEBUG @@ -225,16 +255,8 @@ XGUI_Workshop::XGUI_Workshop(XGUI_SalomeConnector* theConnector) ModelAPI_ResultConstruction::DEFAULT_COLOR()); Config_PropManager::registerProp("Visualization", "result_part_color", "Part color", Config_Prop::Color, ModelAPI_ResultPart::DEFAULT_COLOR()); - - Config_PropManager::registerProp("Visualization", "body_deflection", - "Body deflection coefficient", - Config_Prop::Double, - ModelAPI_ResultBody::DEFAULT_DEFLECTION()); - - Config_PropManager::registerProp("Visualization", "construction_deflection", - "Construction deflection coefficient", - Config_Prop::Double, - ModelAPI_ResultConstruction::DEFAULT_DEFLECTION()); + Config_PropManager::registerProp("Visualization", "result_field_color", "Field color", + Config_Prop::Color, ModelAPI_ResultField::DEFAULT_COLOR()); if (ModuleBase_Preferences::resourceMgr()->booleanValue("Viewer", "face-selection", true)) myViewerSelMode.append(TopAbs_FACE); @@ -273,7 +295,15 @@ void XGUI_Workshop::startApplication() Config_PropManager::registerProp("Plugins", "default_path", "Default Path", Config_Prop::Directory, ""); + std::string aDir = getenv(QString("%1Resources").arg( + ModuleBase_Preferences::resourceMgr()->appName()).toLatin1()); + Config_PropManager::registerProp("Plugins", "import_initial_path", "Import initial directory", + Config_Prop::Directory, aDir); +#ifdef _DEBUG + Config_PropManager::registerProp("Plugins", "create_part_by_start", "Create Part by Start", + Config_Prop::Boolean, "false"); +#endif registerValidators(); // Calling of loadCustomProps before activating module is required @@ -293,6 +323,13 @@ void XGUI_Workshop::startApplication() SLOT(onTrihedronVisibilityChanged(bool))); emit applicationStarted(); + +#ifdef _DEBUG + bool aNewPart = Config_PropManager::boolean("Plugins", "create_part_by_start"); + if (aNewPart) { + module()->launchOperation("Part", false); // PartSetPlugin_Part::ID() + } +#endif } void XGUI_Workshop::activateModule() @@ -328,6 +365,24 @@ void XGUI_Workshop::deactivateModule() XGUI_Displayer* aDisplayer = displayer(); QObjectPtrList aDisplayed = aDisplayer->displayedObjects(); aDisplayer->deactivateObjects(aDisplayed, true); + Handle(AIS_InteractiveContext) aContext = viewer()->AISContext(); + Handle(AIS_Trihedron) aTrihedron = Handle(AIS_Trihedron)::DownCast(aDisplayer->getTrihedron()); + /// deactivate trihedron in selection modes + TColStd_ListOfInteger aTColModes; + aContext->ActivatedModes(aTrihedron, aTColModes); + TColStd_ListIteratorOfListOfInteger itr( aTColModes ); + for (; itr.More(); itr.Next() ) { + Standard_Integer aMode = itr.Value(); + aContext->Deactivate(aTrihedron, aMode); + } +#ifdef BEFORE_TRIHEDRON_PATCH + /// Trihedron problem: objects stayed in the viewer, should be removed manually + /// otherwise in SALOME happens crash by HideAll in the viewer + aContext->Remove(aTrihedron->Position(), true); + aContext->Remove(aTrihedron->Axis(), true); + aContext->Remove(aTrihedron->XAxis(), true); + aContext->Remove(aTrihedron->YAxis(), true); +#endif myOperationMgr->deactivate(); } @@ -470,7 +525,7 @@ void XGUI_Workshop::onAcceptActionClicked() (anOperationMgr->currentOperation()); if (aFOperation) { //if (errorMgr()->canProcessClick(anAction, aFOperation->feature())) - myOperationMgr->onCommitOperation(); + myOperationMgr->commitOperation(); } } } @@ -562,17 +617,26 @@ void XGUI_Workshop::fillPropertyPanel(ModuleBase_Operation* theOperation) aWidget->restoreValue(); aWidget->enableFocusProcessing(); } - ModuleBase_Tools::flushUpdated(aFeature); - // update visible state of Preview button + std::shared_ptr aFeatureInfo; #ifdef HAVE_SALOME - bool anIsAutoPreview = - mySalomeConnector->featureInfo(aFeatureKind.c_str())->isAutoPreview(); + aFeatureInfo = mySalomeConnector->featureInfo(aFeatureKind.c_str()); #else AppElements_MainMenu* aMenuBar = mainWindow()->menuObject(); AppElements_Command* aCommand = aMenuBar->feature(aFeatureKind.c_str()); - bool anIsAutoPreview = aCommand && aCommand->featureMessage()->isAutoPreview(); + if (aCommand) + aFeatureInfo = aCommand->featureMessage(); #endif + bool anIsAutoPreview = true; + if (aFeatureInfo.get()) + anIsAutoPreview = aFeatureInfo->isAutoPreview(); + else { + std::string aXmlCfg, aDescription; + module()->getXMLRepresentation(aFeatureKind, aXmlCfg, aDescription); + ModuleBase_WidgetFactory aFactory(aXmlCfg, moduleConnector()); + anIsAutoPreview = aFactory.widgetAPI()->getBooleanAttribute(FEATURE_AUTO_PREVIEW, true); + } + if (!anIsAutoPreview) { myPropertyPanel->findButton(PROP_PANEL_PREVIEW)->setVisible(true); // send signal about preview should not be computed automatically, click on preview @@ -581,6 +645,10 @@ void XGUI_Workshop::fillPropertyPanel(ModuleBase_Operation* theOperation) new Events_Message(Events_Loop::eventByName(EVENT_PREVIEW_BLOCKED))); Events_Loop::loop()->send(aMsg); } + // if update happens after preview is blocked, it does nothing when blocked + // it improves performance for valid objects on feature start + ModuleBase_Tools::flushUpdated(aFeature); + myPropertyPanel->setModelWidgets(aWidgets); aFOperation->setPropertyPanel(myPropertyPanel); @@ -786,6 +854,7 @@ void XGUI_Workshop::openDirectory(const QString& theDirectory) } QApplication::setOverrideCursor(Qt::WaitCursor); + module()->closeDocument(); SessionPtr aSession = ModelAPI_Session::get(); aSession->closeAll(); aSession->load(myCurrentDir.toLatin1().constData()); @@ -801,6 +870,22 @@ void XGUI_Workshop::openDirectory(const QString& theDirectory) #ifndef HAVE_SALOME myMainWindow->setCurrentDir(myCurrentDir, true); #endif + +#ifdef _DEBUG + bool aNewPart = Config_PropManager::boolean("Plugins", "create_part_by_start"); + if (aNewPart) { + + DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument(); + int aSize = aRootDoc->size(ModelAPI_ResultPart::group()); + if (aSize > 0 ) { + ObjectPtr aObject = aRootDoc->object(ModelAPI_ResultPart::group(), 0); + ResultPartPtr aPart = std::dynamic_pointer_cast(aObject); + if (aPart.get()) + aPart->activate(); + } + } +#endif + QApplication::restoreOverrideCursor(); } @@ -877,7 +962,7 @@ void XGUI_Workshop::onTrihedronVisibilityChanged(bool theState) //****************************************************** bool XGUI_Workshop::onSave() { - if(!abortAllOperations()) + if(!myOperationMgr->abortAllOperations(XGUI_OperationMgr::XGUI_InformationMessage)) return false; if (myCurrentDir.isEmpty()) { return onSaveAs(); @@ -894,7 +979,7 @@ bool XGUI_Workshop::onSave() //****************************************************** bool XGUI_Workshop::onSaveAs() { - if(!abortAllOperations()) + if(!myOperationMgr->abortAllOperations(XGUI_OperationMgr::XGUI_InformationMessage)) return false; QFileDialog dialog(desktop()); dialog.setWindowTitle(tr("Select directory to save files...")); @@ -932,6 +1017,10 @@ bool XGUI_Workshop::onSaveAs() //****************************************************** void XGUI_Workshop::onUndo(int theTimes) { + ModuleBase_ModelWidget* anActiveWidget = myOperationMgr->activeWidget(); + if (anActiveWidget && anActiveWidget->processAction(ActionUndo)) + return; + objectBrowser()->treeView()->setCurrentIndex(QModelIndex()); SessionPtr aMgr = ModelAPI_Session::get(); std::list aUndoList = aMgr->undoList(); @@ -955,6 +1044,10 @@ void XGUI_Workshop::onUndo(int theTimes) //****************************************************** void XGUI_Workshop::onRedo(int theTimes) { + ModuleBase_ModelWidget* anActiveWidget = myOperationMgr->activeWidget(); + if (anActiveWidget && anActiveWidget->processAction(ActionRedo)) + return; + // the viewer update should be blocked in order to avoid the features blinking. For the created // feature a results are created, the flush of the created signal caused the viewer redisplay for // each created result. After a redisplay signal is flushed. So, the viewer update is blocked @@ -1004,13 +1097,13 @@ void XGUI_Workshop::onRedo(int theTimes) //****************************************************** void XGUI_Workshop::onWidgetStateChanged(int thePreviousState) { - ModuleBase_ModelWidget* anActiveWidget = 0; - ModuleBase_Operation* anOperation = myOperationMgr->currentOperation(); - if (anOperation) { - ModuleBase_IPropertyPanel* aPanel = anOperation->propertyPanel(); - if (aPanel) - anActiveWidget = aPanel->activeWidget(); - } + ModuleBase_ModelWidget* anActiveWidget = myOperationMgr->activeWidget(); + //ModuleBase_Operation* anOperation = myOperationMgr->currentOperation(); + //if (anOperation) { + // ModuleBase_IPropertyPanel* aPanel = anOperation->propertyPanel(); + // if (aPanel) + // anActiveWidget = aPanel->activeWidget(); + //} if (anActiveWidget) operationMgr()->onValidateOperation(); @@ -1139,10 +1232,24 @@ void XGUI_Workshop::updateCommandStatus() if (aMgr->hasModuleDocument()) { foreach(QAction* aCmd, aCommands) { QString aId = aCmd->data().toString(); - if (aId == "UNDO_CMD") - aCmd->setEnabled(myModule->canUndo()); - else if (aId == "REDO_CMD") - aCmd->setEnabled(myModule->canRedo()); + if (aId == "UNDO_CMD") { + bool isActionEnabled = false; + // if ultimate is true -> using result of operation only, or using OR combination + ModuleBase_ModelWidget* anActiveWidget = myOperationMgr->activeWidget(); + if (anActiveWidget && anActiveWidget->canProcessAction(ActionUndo, isActionEnabled)) + aCmd->setEnabled(isActionEnabled); + else + aCmd->setEnabled(myModule->canUndo()); + } + else if (aId == "REDO_CMD") { + bool isActionEnabled = false; + // if ultimate is true -> using result of operation only, or using OR combination + ModuleBase_ModelWidget* anActiveWidget = myOperationMgr->activeWidget(); + if (anActiveWidget && anActiveWidget->canProcessAction(ActionRedo, isActionEnabled)) + aCmd->setEnabled(isActionEnabled); + else + aCmd->setEnabled(myModule->canRedo()); + } else // Enable all commands aCmd->setEnabled(true); @@ -1184,7 +1291,7 @@ QDockWidget* XGUI_Workshop::createObjectBrowser(QWidget* theParent) aObjDock->setWindowTitle(tr("Object browser")); aObjDock->setStyleSheet( "::title { position: relative; padding-left: 5px; text-align: left center }"); - myObjectBrowser = new XGUI_ObjectsBrowser(aObjDock); + myObjectBrowser = new XGUI_ObjectsBrowser(aObjDock, this); myObjectBrowser->setXMLReader(myDataModelXMLReader); myModule->customizeObjectBrowser(myObjectBrowser); aObjDock->setWidget(myObjectBrowser); @@ -1242,7 +1349,6 @@ void XGUI_Workshop::showPropertyPanel() // in order to operation manager could process key events of the panel. // otherwise they are ignored. It happens only if the same(activateWindow) is // not happened by property panel activation(e.g. resume operation of Sketch) - ModuleBase_Tools::activateWindow(myPropertyPanel, "XGUI_Workshop::showPropertyPanel()"); ModuleBase_Tools::setFocus(myPropertyPanel, "XGUI_Workshop::showPropertyPanel()"); } @@ -1262,7 +1368,6 @@ void XGUI_Workshop::hidePropertyPanel() // are processed by this console. For example Undo actions. // It is possible that this code is to be moved to SHAPER package QMainWindow* aDesktop = desktop(); - ModuleBase_Tools::activateWindow(aDesktop, "XGUI_Workshop::hidePropertyPanel()"); ModuleBase_Tools::setFocus(aDesktop, "XGUI_Workshop::showPropertyPanel()"); } @@ -1306,15 +1411,23 @@ void XGUI_Workshop::onContextMenuCommand(const QString& theId, bool isChecked) changeColor(aObjects); else if (theId == "DEFLECTION_CMD") changeDeflection(aObjects); +#ifdef USE_TRANSPARENCY + else if (theId == "TRANSPARENCY_CMD") + changeTransparency(aObjects); +#endif else if (theId == "SHOW_CMD") { showObjects(aObjects, true); mySelector->updateSelectionBy(ModuleBase_ISelection::Browser); + updateCommandStatus(); } - else if (theId == "HIDE_CMD") + else if (theId == "HIDE_CMD") { showObjects(aObjects, false); + updateCommandStatus(); + } else if (theId == "SHOW_ONLY_CMD") { showOnlyObjects(aObjects); mySelector->updateSelectionBy(ModuleBase_ISelection::Browser); + updateCommandStatus(); } else if (theId == "SHADING_CMD") setDisplayMode(aObjects, XGUI_Displayer::Shading); @@ -1327,6 +1440,11 @@ void XGUI_Workshop::onContextMenuCommand(const QString& theId, bool isChecked) aObj->setDisplayed(false); } Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY)); +#ifdef HAVE_SALOME + //issue #2159 Hide all incomplete behavior + viewer()->eraseAll(); +#endif + updateCommandStatus(); } else if (theId == "SELECT_VERTEX_CMD") { setViewerSelectionMode(TopAbs_VERTEX); } else if (theId == "SELECT_EDGE_CMD") { @@ -1343,20 +1461,42 @@ void XGUI_Workshop::onContextMenuCommand(const QString& theId, bool isChecked) } else if (theId == "SHOW_FEATURE_CMD") { highlightFeature(aObjects); } -#ifdef VINSPECTOR - else if (theId == "VINSPECTOR_VIEW") { - displayer()->setVInspectorVisible(true); - } -#endif -#ifdef DFBROWSER - else if (theId == "DFBROWSER_VIEW") { - if (DFBrowser_FirstCall) { - Handle(CDF_Application) anApplication = CDF_Session::CurrentSession()->CurrentApplication(); - - DFBrowserAPI_Communicator* aCommunicator = - DFBrowserAPI_Communicator::loadPluginLibrary("DFBrowser.dll"); - aCommunicator->setApplication(anApplication); - DFBrowser_FirstCall = false; +#ifdef TINSPECTOR + else if (theId == "TINSPECTOR_VIEW") { + Handle(CDF_Application) anApplication = CDF_Session::CurrentSession()->CurrentApplication(); + if (!anApplication.IsNull()) + { + if (!MyTCommunicator) + { + MyTCommunicator = new TInspector_Communicator(); + + NCollection_List aParameters; + aParameters.Append(anApplication); + Handle(AIS_InteractiveContext) aContext = viewer()->AISContext(); + if (!aContext.IsNull()) + aParameters.Append(aContext); + + MyVCallBack = new VInspector_CallBack(); + myDisplayer->setCallBack(MyVCallBack); + #ifndef HAVE_SALOME + AppElements_Viewer* aViewer = mainWindow()->viewer(); + if (aViewer) + aViewer->setCallBack(MyVCallBack); + #endif + aParameters.Append(MyVCallBack); + + MyTCommunicator->RegisterPlugin("TKDFBrowser"); + MyTCommunicator->RegisterPlugin("TKShapeView"); + MyTCommunicator->RegisterPlugin("TKVInspector"); + MyTCommunicator->RegisterPlugin("SMBrowser"); // custom plugin to view ModelAPI + //MyTCommunicator->RegisterPlugin("TKSMBrowser"); // custom plugin to view ModelAPI + + MyTCommunicator->Init(aParameters); + MyTCommunicator->Activate("TKSMBrowser"); // to have button in TInspector + MyTCommunicator->Activate("TKVInspector"); // to have filled callback by model + MyTCommunicator->Activate("TKDFBrowser"); + } + MyTCommunicator->SetVisible(true); } } #endif @@ -1404,7 +1544,9 @@ void XGUI_Workshop::deleteObjects() bool hasFeature = false; bool hasParameter = false; bool hasCompositeOwner = false; - ModuleBase_Tools::checkObjects(anObjects, hasResult, hasFeature, hasParameter, hasCompositeOwner); + bool hasResultInHistory = false; + ModuleBase_Tools::checkObjects(anObjects, hasResult, hasFeature, hasParameter, hasCompositeOwner, + hasResultInHistory); if (!(hasFeature || hasParameter)) return; @@ -1770,17 +1912,25 @@ bool XGUI_Workshop::canBeShaded(const ObjectPtr& theObject) const } //************************************************************** -bool XGUI_Workshop::canChangeColor() const +bool XGUI_Workshop::canChangeProperty(const QString& theActionName) const { - QObjectPtrList aObjects = mySelector->selection()->selectedObjects(); + if (theActionName == "COLOR_CMD" || + theActionName == "DEFLECTION_CMD" +#ifdef USE_TRANSPARENCY + || theActionName == "TRANSPARENCY_CMD" +#endif + ) { + QObjectPtrList aObjects = mySelector->selection()->selectedObjects(); - std::set aTypes; - aTypes.insert(ModelAPI_ResultGroup::group()); - aTypes.insert(ModelAPI_ResultConstruction::group()); - aTypes.insert(ModelAPI_ResultBody::group()); - aTypes.insert(ModelAPI_ResultPart::group()); + std::set aTypes; + aTypes.insert(ModelAPI_ResultGroup::group()); + aTypes.insert(ModelAPI_ResultConstruction::group()); + aTypes.insert(ModelAPI_ResultBody::group()); + aTypes.insert(ModelAPI_ResultPart::group()); - return hasResults(aObjects, aTypes); + return hasResults(aObjects, aTypes); + } + return false; } void setColor(ResultPtr theResult, const std::vector& theColor) @@ -1867,19 +2017,6 @@ void XGUI_Workshop::changeColor(const QObjectPtrList& theObjects) } //************************************************************** -bool XGUI_Workshop::canChangeDeflection() const -{ - QObjectPtrList aObjects = mySelector->selection()->selectedObjects(); - - std::set aTypes; - aTypes.insert(ModelAPI_ResultGroup::group()); - aTypes.insert(ModelAPI_ResultConstruction::group()); - aTypes.insert(ModelAPI_ResultBody::group()); - aTypes.insert(ModelAPI_ResultPart::group()); - - return hasResults(aObjects, aTypes); -} - void setDeflection(ResultPtr theResult, const double theDeflection) { if (!theResult.get()) @@ -1890,13 +2027,41 @@ void setDeflection(ResultPtr theResult, const double theDeflection) aDeflectionAttr->setValue(theDeflection); } +//************************************************************** +void setTransparency(ResultPtr theResult, double theTransparency) +{ + if (!theResult.get()) + return; + + AttributeDoublePtr anAttribute = theResult->data()->real(ModelAPI_Result::TRANSPARENCY_ID()); + if (anAttribute.get() != NULL) + anAttribute->setValue(theTransparency); +} + +//************************************************************** +void setTransparency(double theTransparency, const QObjectPtrList& theObjects) +{ + foreach(ObjectPtr anObj, theObjects) { + ResultPtr aResult = std::dynamic_pointer_cast(anObj); + if (aResult.get() != NULL) { + ResultCompSolidPtr aCompsolidResult = + std::dynamic_pointer_cast(aResult); + if (aCompsolidResult.get() != NULL) { // change property for all sub-solids + for(int i = 0; i < aCompsolidResult->numberOfSubs(); i++) { + setTransparency(aCompsolidResult->subResult(i), theTransparency); + } + } + setTransparency(aResult, theTransparency); + } + } +} //************************************************************** void XGUI_Workshop::changeDeflection(const QObjectPtrList& theObjects) { AttributeDoublePtr aDoubleAttr; - // 1. find the current color of the object. This is a color of AIS presentation - // The objects are iterated until a first valid color is found + // 1. find the current property of the object. This is a property of AIS presentation + // The objects are iterated until a first valid property is found double aDeflection = -1; foreach(ObjectPtr anObject, theObjects) { ResultPtr aResult = std::dynamic_pointer_cast(anObject); @@ -1904,9 +2069,9 @@ void XGUI_Workshop::changeDeflection(const QObjectPtrList& theObjects) aDeflection = XGUI_CustomPrs::getResultDeflection(aResult); } else { - // TODO: remove the obtaining a color from the AIS object + // TODO: remove the obtaining a property from the AIS object // this does not happen never because: - // 1. The color can be changed only on results + // 1. The property can be changed only on results // 2. The result can be not visualized in the viewer(e.g. Origin Construction) AISObjectPtr anAISObj = myDisplayer->getAISObject(anObject); if (anAISObj.get()) { @@ -1941,7 +2106,7 @@ void XGUI_Workshop::changeDeflection(const QObjectPtrList& theObjects) if (aResult.get() != NULL) { ResultCompSolidPtr aCompsolidResult = std::dynamic_pointer_cast(aResult); - if (aCompsolidResult.get() != NULL) { // change colors for all sub-solids + if (aCompsolidResult.get() != NULL) { // change property for all sub-solids for(int i = 0; i < aCompsolidResult->numberOfSubs(); i++) { setDeflection(aCompsolidResult->subResult(i), aDeflection); } @@ -1953,6 +2118,90 @@ void XGUI_Workshop::changeDeflection(const QObjectPtrList& theObjects) updateCommandStatus(); } +//************************************************************** +void XGUI_Workshop::changeTransparency(const QObjectPtrList& theObjects) +{ + AttributeDoublePtr aDoubleAttr; + // 1. find the current property of the object. This is a property of AIS presentation + // The objects are iterated until a first valid property is found + double aCurrentValue = -1; + foreach(ObjectPtr anObject, theObjects) { + ResultPtr aResult = std::dynamic_pointer_cast(anObject); + if (aResult.get()) { + aCurrentValue = XGUI_CustomPrs::getResultTransparency(aResult); + } + else { + // TODO: remove the obtaining a property from the AIS object + // this does not happen never because: + // 1. The property can be changed only on results + // 2. The result can be not visualized in the viewer(e.g. Origin Construction) + AISObjectPtr anAISObj = myDisplayer->getAISObject(anObject); + if (anAISObj.get()) { + aCurrentValue = anAISObj->getDeflection(); + } + } + if (aCurrentValue > 0) + break; + } + if (aCurrentValue < 0) + return; + + if (!abortAllOperations()) + return; + + // 2. show the dialog to change the value + XGUI_PropertyDialog* aDlg = new XGUI_PropertyDialog(desktop()); + aDlg->setWindowTitle("Transparency"); + XGUI_TransparencyWidget* aTransparencyWidget = new XGUI_TransparencyWidget(aDlg); + connect(aTransparencyWidget, SIGNAL(transparencyValueChanged()), + this, SLOT(onTransparencyValueChanged())); + connect(aTransparencyWidget, SIGNAL(previewStateChanged()), + this, SLOT(onPreviewStateChanged())); + aDlg->setContent(aTransparencyWidget); + aTransparencyWidget->setValue(aCurrentValue); + + // 3. abort the previous operation and start a new one + SessionPtr aMgr = ModelAPI_Session::get(); + QString aDescription = contextMenuMgr()->action("TRANSPARENCY_CMD")->text(); + aMgr->startOperation(aDescription.toStdString()); + + aDlg->move(QCursor::pos()); + bool isDone = aDlg->exec() == QDialog::Accepted; + if (!isDone) + return; + + // 4. set the value to all results + aCurrentValue = aTransparencyWidget->getValue(); + setTransparency(aCurrentValue, theObjects); + + aMgr->finishOperation(); + updateCommandStatus(); +} + +//************************************************************** +void XGUI_Workshop::onTransparencyValueChanged() +{ + XGUI_TransparencyWidget* aTransparencyWidget = (XGUI_TransparencyWidget*)sender(); + if (!aTransparencyWidget || !aTransparencyWidget->isPreviewNeeded()) + return; + + QObjectPtrList anObjects = mySelector->selection()->selectedObjects(); + setTransparency(aTransparencyWidget->getValue(), anObjects); + Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY)); +} + +//************************************************************** +void XGUI_Workshop::onPreviewStateChanged() +{ + XGUI_TransparencyWidget* aTransparencyWidget = (XGUI_TransparencyWidget*)sender(); + if (!aTransparencyWidget || !aTransparencyWidget->isPreviewNeeded()) + return; + + QObjectPtrList anObjects = mySelector->selection()->selectedObjects(); + setTransparency(aTransparencyWidget->getValue(), anObjects); + Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY)); +} + //************************************************************** #define SET_DISPLAY_GROUP(aGroupName, aDisplay) \ for (int i = 0; i < aDoc->size(aGroupName); i++) { \ @@ -1961,17 +2210,7 @@ for (int i = 0; i < aDoc->size(aGroupName); i++) { \ void XGUI_Workshop::showObjects(const QObjectPtrList& theList, bool isVisible) { foreach (ObjectPtr aObj, theList) { - /* - ResultPartPtr aPartRes = std::dynamic_pointer_cast(aObj); - if (aPartRes) { - DocumentPtr aDoc = aPartRes->partDoc(); - SET_DISPLAY_GROUP(ModelAPI_ResultBody::group(), isVisible) - SET_DISPLAY_GROUP(ModelAPI_ResultConstruction::group(), isVisible) - SET_DISPLAY_GROUP(ModelAPI_ResultGroup::group(), isVisible) - } else { - */ - aObj->setDisplayed(isVisible); - //} + aObj->setDisplayed(isVisible); } Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY)); } @@ -1985,23 +2224,20 @@ void XGUI_Workshop::showOnlyObjects(const QObjectPtrList& theList) if (module()->canEraseObject(aObj)) aObj->setDisplayed(false); } + //Do not use eraseAll if you didn't send Redisplay event: + //all objects are erased from viewer, but considered as displayed in displayer + // Problem in bug 2218 + Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY)); +#ifdef HAVE_SALOME + //issue #2159 Hide all incomplete behavior + viewer()->eraseAll(); +#endif // Show only objects from the list foreach (ObjectPtr aObj, theList) { - /* - ResultPartPtr aPartRes = std::dynamic_pointer_cast(aObj); - if (aPartRes) { - DocumentPtr aDoc = aPartRes->partDoc(); - SET_DISPLAY_GROUP(ModelAPI_ResultBody::group(), true) - SET_DISPLAY_GROUP(ModelAPI_ResultConstruction::group(), true) - SET_DISPLAY_GROUP(ModelAPI_ResultGroup::group(), true) - } else { - */ - aObj->setDisplayed(true); - //} + aObj->setDisplayed(true); } Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY)); - } @@ -2061,6 +2297,9 @@ void XGUI_Workshop::closeDocument() objectBrowser()->clearContent(); module()->closeDocument(); + // we need to clear viewer (with created filters) to do not have problems in 2nd SALOME study + module()->clearViewer(); + // data model need not process the document's signals about objects modifications as // the document is closed @@ -2125,12 +2364,16 @@ void XGUI_Workshop::setStatusBarMessage(const QString& theMessage) void XGUI_Workshop::synchronizeViewer() { SessionPtr aMgr = ModelAPI_Session::get(); - DocumentPtr aDoc = aMgr->activeDocument(); + QList aDocs; + aDocs.append(aMgr->activeDocument()); + aDocs.append(aMgr->moduleDocument()); - synchronizeGroupInViewer(aDoc, ModelAPI_ResultConstruction::group(), false); - synchronizeGroupInViewer(aDoc, ModelAPI_ResultBody::group(), false); - synchronizeGroupInViewer(aDoc, ModelAPI_ResultPart::group(), false); - synchronizeGroupInViewer(aDoc, ModelAPI_ResultGroup::group(), false); + foreach(DocumentPtr aDoc, aDocs) { + synchronizeGroupInViewer(aDoc, ModelAPI_ResultConstruction::group(), false); + synchronizeGroupInViewer(aDoc, ModelAPI_ResultBody::group(), false); + synchronizeGroupInViewer(aDoc, ModelAPI_ResultPart::group(), false); + synchronizeGroupInViewer(aDoc, ModelAPI_ResultGroup::group(), false); + } } void XGUI_Workshop::synchronizeGroupInViewer(const DocumentPtr& theDoc,