X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_Workshop.cpp;h=799f5c00f172d71a5e96d06d435cd5b7b6381204;hb=845faaf1f35a4054431eb57656ab52b5c1d6655a;hp=2a4f57be2429682bd006a8093f124ec76f917d86;hpb=b748001d9b82eb04ddc955df60675dad06497705;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_Workshop.cpp b/src/XGUI/XGUI_Workshop.cpp old mode 100755 new mode 100644 index 2a4f57be2..799f5c00f --- a/src/XGUI/XGUI_Workshop.cpp +++ b/src/XGUI/XGUI_Workshop.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2017 CEA/DEN, EDF R&D +// Copyright (C) 2014-2019 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 @@ -12,10 +12,9 @@ // // 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 +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // -// See http://www.salome-platform.org/ or -// email : webmaster.salome@opencascade.com +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // #include "XGUI_Workshop.h" @@ -46,7 +45,6 @@ #include "XGUI_Tools.h" #include "XGUI_ViewerProxy.h" #include "XGUI_WorkshopListener.h" -#include #include #include #include @@ -68,6 +66,7 @@ #include #include #include +#include #include #include #include @@ -80,6 +79,8 @@ #include #include #include +#include +#include //#include @@ -87,6 +88,13 @@ #include #include +#include +#include +#include + +#include +#include + #include #include #include @@ -97,12 +105,12 @@ #include #include #include -#include #include #include #include #include #include +#include #include #include @@ -138,6 +146,9 @@ #include #include #include +#include +#include +#include #include @@ -165,13 +176,23 @@ static Handle(VInspector_CallBack) MyVCallBack; //#define DEBUG_WITH_MESSAGE_REPORT QString XGUI_Workshop::MOVE_TO_END_COMMAND = QObject::tr("Move to the end"); +QString XGUI_Workshop::MOVE_TO_END_SPLIT_COMMAND = QObject::tr("Move to the end and split"); //#define DEBUG_DELETE //#define DEBUG_FEATURE_NAME //#define DEBUG_CLEAN_HISTORY +#ifdef HAVE_SALOME +static QString MyFilter(QObject::tr("SHAPER files (*.shaper *.cadbld)")); +static QString MyFilter2(QObject::tr("SHAPER files (*.shaper)")); +static QString MyExtension(".shaper"); +#else +static QString MyFilter(QObject::tr("CAD Builder files (*.cadbld);;All files (*.*)")); +static QString MyFilter2(QObject::tr("CAD Builder files (*.cadbld)")); +static QString MyExtension(".cadbld"); +#endif -static QString MyFilter(QObject::tr("OpenParts files (*.opp)")); +static QString MyImportPartFilter(QObject::tr("Part files (*.shaperpart);;All files (*.*)")); //****************************************************** @@ -210,7 +231,15 @@ XGUI_Workshop::XGUI_Workshop(XGUI_SalomeConnector* theConnector) // Load translations QStringList aLangs; aLangs << "*_en.ts"; // load by default eng translations + + /// If version of OCCT is 7.4.0 or more then it means that + /// this is version of SALOME older then 9.4.0 +#if OCC_VERSION_HEX >= 0x070400 + QString aCurrLang = aResMgr->language(); +#else QString aCurrLang = aResMgr->stringValue("language", "language", "en"); +#endif + if(aCurrLang != "en") { aLangs << "*_" + aCurrLang + ".ts"; // then replace with translated files } @@ -258,27 +287,14 @@ XGUI_Workshop::XGUI_Workshop(XGUI_SalomeConnector* theConnector) #ifndef HAVE_SALOME connect(myMainWindow, SIGNAL(exitKeySequence()), SLOT(onExit())); - onTrihedronVisibilityChanged(true); + myDisplayer->displayTrihedron(true); #endif connect(myEventsListener, SIGNAL(errorOccurred(std::shared_ptr)), myErrorDlg, SLOT(addError(std::shared_ptr))); - //Config_PropManager::registerProp("Visualization", "object_default_color", "Object color", - // Config_Prop::Color, "225,225,225"); - - Config_PropManager::registerProp("Visualization", "result_body_color", "Result color", - Config_Prop::Color, ModelAPI_ResultBody::DEFAULT_COLOR()); - Config_PropManager::registerProp("Visualization", "result_group_color", "Group color", - Config_Prop::Color, ModelAPI_ResultGroup::DEFAULT_COLOR()); - Config_PropManager::registerProp("Visualization", "result_construction_color", - "Construction color", - Config_Prop::Color, - ModelAPI_ResultConstruction::DEFAULT_COLOR()); - Config_PropManager::registerProp("Visualization", "result_part_color", "Part color", - Config_Prop::Color, ModelAPI_ResultPart::DEFAULT_COLOR()); - Config_PropManager::registerProp("Visualization", "result_field_color", "Field color", - Config_Prop::Color, ModelAPI_ResultField::DEFAULT_COLOR()); + Config_PropManager::registerProp("Visualization", "selection_color", "Selection color", + Config_Prop::Color, "255,255,255"); if (ModuleBase_Preferences::resourceMgr()->booleanValue("Viewer", "face-selection", true)) myViewerSelMode.append(TopAbs_FACE); @@ -303,6 +319,8 @@ XGUI_Workshop::~XGUI_Workshop(void) delete myDisplayer; delete myDataModelXMLReader; + delete mySelectionActivate; + delete myMenuMgr; clearTemporaryDir(); } @@ -334,6 +352,15 @@ void XGUI_Workshop::startApplication() // Calling of loadCustomProps before activating module is required // by Config_PropManger to restore user-defined path to plugins ModuleBase_Preferences::loadCustomProps(); + std::vector aColor; + try { + aColor = Config_PropManager::color("Visualization", "selection_color"); + } + catch (...) { + } + if (aColor.size() == 3) + myDisplayer->setSelectionColor(aColor); + createModule(); #ifndef HAVE_SALOME @@ -433,13 +460,13 @@ void XGUI_Workshop::initMenu() salomeConnector()->addDesktopMenuSeparator("MEN_DESK_EDIT"); - aAction = salomeConnector()->addDesktopCommand("AUTOCOMPUTE_CMD", tr("Block auto-apply"), - tr("Blocks immediate apply of modifications"), - QIcon(":pictures/autoapply.png"), QKeySequence(), - true, "MEN_DESK_EDIT"); - salomeConnector()->addActionInToolbar( aAction, aToolBarTitle ); + //aAction = salomeConnector()->addDesktopCommand("AUTOCOMPUTE_CMD", tr("Auto rebuild"), + // tr("Blocks immediate apply of modifications"), + // QIcon(":pictures/autoapply.png"), QKeySequence(), + // false, "MEN_DESK_EDIT"); + //salomeConnector()->addActionInToolbar( aAction, aToolBarTitle ); - connect(aAction, SIGNAL(toggled(bool)), this, SLOT(onAutoApply(bool))); + //connect(aAction, SIGNAL(triggered(bool)), this, SLOT(onAutoApply())); salomeConnector()->addDesktopMenuSeparator("MEN_DESK_EDIT"); @@ -458,6 +485,26 @@ void XGUI_Workshop::initMenu() connect(aAction, SIGNAL(triggered(bool)), this, SLOT(onOpen())); salomeConnector()->addDesktopMenuSeparator("MEN_DESK_FILE"); + aAction = salomeConnector()->addDesktopCommand("EXPORT_PART_CMD", tr("Export part..."), + tr("Export a part of the current document into a file"), + QIcon(), QKeySequence(), + false, "MEN_DESK_FILE"); + connect(aAction, SIGNAL(triggered(bool)), this, SLOT(onExportPart())); + + aAction = salomeConnector()->addDesktopCommand("IMPORT_PART_CMD", tr("Import part..."), + tr("Import structure of a part"), + QIcon(), QKeySequence(), + false, "MEN_DESK_FILE"); + connect(aAction, SIGNAL(triggered(bool)), this, SLOT(onImportPart())); + + aAction = salomeConnector()->addDesktopCommand("IMPORT_SHAPE_CMD", tr("Import shape..."), + tr("Import shape from a file"), + ModuleBase_IconFactory::loadIcon("icons/Exchange/import.png"), + QKeySequence(), false, "MEN_DESK_FILE"); + connect(aAction, SIGNAL(triggered(bool)), this, SLOT(onImportShape())); + + salomeConnector()->addDesktopMenuSeparator("MEN_DESK_FILE"); + #else // File commands group AppElements_MenuGroupPanel* aGroup = myMainWindow->menuObject()->generalPage(); @@ -499,7 +546,7 @@ void XGUI_Workshop::initMenu() aCommand = aGroup->addFeature("AUTOCOMPUTE_CMD", tr("Auto rebuild"), tr("Blocks immediate apply of modifications"), QIcon(":pictures/autoapply_start.png"), QKeySequence()); - //aCommand->setChecked(ModelAPI_Session::get()->isAutoUpdateBlocked()); + aCommand->setChecked(ModelAPI_Session::get()->isAutoUpdateBlocked()); aCommand->connectTo(this, SLOT(onAutoApply())); aCommand = aGroup->addFeature("PREF_CMD", tr("Preferences"), tr("Edit preferences"), @@ -612,7 +659,7 @@ void XGUI_Workshop::onHelpActionClicked() "salome" + aSep + "gui" + aSep + "SHAPER"; } #else - QString aDir(getenv("OPENPARTS_ROOT_DIR")); + QString aDir(getenv("CADBUILDER_ROOT_DIR")); aDocDir = aDir + aSep + "doc" + aSep + "gui"; #endif QString aFileName = aDocDir + aSep + aHelpPage; @@ -664,12 +711,11 @@ void XGUI_Workshop::fillPropertyPanel(ModuleBase_Operation* theOperation) if (!aFOperation) return; - showPanel(myPropertyPanel); myPropertyPanel->cleanContent(); QList aWidgets; - if (!module()->createWidgets(theOperation, aWidgets)) { - QString aXmlRepr = aFOperation->getDescription()->xmlRepresentation(); + QString aXmlRepr = aFOperation->getDescription()->xmlRepresentation(); + if (!module()->createWidgets(aFOperation->feature(), aXmlRepr, aWidgets)) { ModuleBase_WidgetFactory aFactory(aXmlRepr.toStdString(), myModuleConnector); aFactory.createWidget(myPropertyPanel->contentWidget()); aWidgets = aFactory.getModelWidgets(); @@ -740,15 +786,22 @@ void XGUI_Workshop::fillPropertyPanel(ModuleBase_Operation* theOperation) myModule->propertyPanelDefined(theOperation); #ifndef DEBUG_FEATURE_NAME - myPropertyPanel->setWindowTitle(theOperation->getDescription()->description()); + myPropertyPanel->setWindowTitle(ModuleBase_Tools::translate("workshop", + theOperation->getDescription()->description().toStdString())); #else std::string aFeatureName = aFeature->name(); myPropertyPanel->setWindowTitle(QString("%1: %2") - .arg(theOperation->getDescription()->description()) - .arg(aFeatureName.c_str())); + .arg(translate(theOperation->getDescription()->description())) + .arg(translate(aFeatureName.c_str()))); #endif myErrorMgr->setPropertyPanel(myPropertyPanel); + if (Config_PropManager::boolean("Windows", "use_hide_faces_panel")) { + theOperation->setHideFacesVisible(myFacesPanel->isVisible()); + if (aFeatureInfo.get() && aFeatureInfo->isHideFacesPanel() && !myFacesPanel->isVisible()) + myFacesPanel->show(); + } + showPanel(myPropertyPanel); } //****************************************************** @@ -781,6 +834,12 @@ void XGUI_Workshop::onOperationResumed(ModuleBase_Operation* theOperation) if (theOperation->getDescription()->hasXmlRepresentation()) { //!< No need for property panel fillPropertyPanel(theOperation); connectToPropertyPanel(true); + ModuleBase_OperationFeature* aFOperation = dynamic_cast + (theOperation); + if (aFOperation) + myPropertyPanel->updateApplyPlusButton(aFOperation->feature()); + else + myPropertyPanel->updateApplyPlusButton(FeaturePtr()); } updateCommandStatus(); @@ -824,6 +883,11 @@ void XGUI_Workshop::onOperationStopped(ModuleBase_Operation* theOperation) } } activateObjectsSelection(anObjects); + + if (Config_PropManager::boolean("Windows", "use_hide_faces_panel")) { + if (!theOperation->isHideFacesVisible()) + myFacesPanel->close(); + } } //****************************************************** @@ -908,7 +972,6 @@ void XGUI_Workshop::onOpen() //save current file before close if modified SessionPtr aSession = ModelAPI_Session::get(); if (aSession->isModified()) { - //TODO(sbh): re-launch the app? int anAnswer = QMessageBox::question( desktop(), tr("Save current file"), tr("The document is modified, save before opening another?"), @@ -922,7 +985,11 @@ void XGUI_Workshop::onOpen() } //show file dialog, check if readable and open - QString aFile = QFileDialog::getOpenFileName(desktop(), tr("Open file"), QString(), MyFilter); + qreal aRatio = ModuleBase_Tools::currentPixelRatio(); + // If the ratio is > 1 (HD screen) then QT has a bug in + // displaying of system open file dialog (too small) + QString aFile = QFileDialog::getOpenFileName(desktop(), tr("Open file"), QString(), MyFilter, + Q_NULLPTR, ((aRatio > 1)? QFileDialog::DontUseNativeDialog : QFileDialog::Options())); if (!aFile.isNull()) openFile(aFile); } @@ -947,7 +1014,8 @@ void XGUI_Workshop::openFile(const QString& theDirectory) aSession->closeAll(); clearTemporaryDir(); - XGUI_CompressFiles::uncompress(myCurrentFile, myTmpDir.path()); + if (!XGUI_CompressFiles::uncompress(myCurrentFile, myTmpDir.path())) + return; aSession->load(myTmpDir.path().toLatin1().constData()); myObjectBrowser->rebuildDataTree(); @@ -996,6 +1064,8 @@ void XGUI_Workshop::onNew() QMdiSubWindow* aWnd = myMainWindow->viewer()->createView(); aWnd->showMaximized(); updateCommandStatus(); + PyConsole_Console* aConsole = myMainWindow->pythonConsole(); + connect(aConsole, SIGNAL(scriptLoaded()), SLOT(updateCommandStatus())); #endif myContextMenuMgr->connectViewer(); QApplication::restoreOverrideCursor(); @@ -1029,8 +1099,7 @@ void XGUI_Workshop::onPreferences() ModuleBase_Preferences::editPreferences(aModif); if (aModif.size() > 0) { QString aSection; - foreach (ModuleBase_Pref aPref, aModif) - { + foreach (ModuleBase_Pref aPref, aModif) { aSection = aPref.first; if (aSection == ModuleBase_Preferences::VIEWER_SECTION) { myMainWindow->viewer()->updateFromResources(); @@ -1038,6 +1107,15 @@ void XGUI_Workshop::onPreferences() myMainWindow->menuObject()->updateFromResources(); } } + std::vector aColor; + try { + aColor = Config_PropManager::color("Visualization", "selection_color"); + } + catch (...) { + } + if (aColor.size() == 3) + displayer()->setSelectionColor(aColor); + displayer()->redisplayObjects(); } } @@ -1047,8 +1125,10 @@ void XGUI_Workshop::onPreferences() void XGUI_Workshop::onTrihedronVisibilityChanged(bool theState) { XGUI_Displayer* aDisplayer = displayer(); - if (aDisplayer) + if (aDisplayer) { aDisplayer->displayTrihedron(theState); + aDisplayer->updateViewer(); + } } //****************************************************** @@ -1064,14 +1144,23 @@ bool XGUI_Workshop::onSave() aMgr->blockAutoUpdate(false); std::list aFiles; - saveDocument(myTmpDir.path(), aFiles); - XGUI_CompressFiles::compress(myCurrentFile, aFiles); + // issue #2899: create a temporary directory, save and then remove it +#ifdef HAVE_SALOME + std::string aTmpDir = XGUI_Tools::getTmpDirByEnv("SALOME_TMP_DIR"); +#else + std::string aTmpDir = XGUI_Tools::getTmpDirByEnv(""); +#endif + saveDocument(QString(aTmpDir.c_str()), aFiles); + bool aResult = XGUI_CompressFiles::compress(myCurrentFile, aFiles); + XGUI_Tools::removeTemporaryFiles(aTmpDir, aFiles); - updateCommandStatus(); + if (aResult) { + updateCommandStatus(); #ifndef HAVE_SALOME myMainWindow->setModifiedState(false); #endif - return true; + } + return aResult; } //****************************************************** @@ -1079,13 +1168,20 @@ bool XGUI_Workshop::onSaveAs() { if(!myOperationMgr->abortAllOperations(XGUI_OperationMgr::XGUI_InformationMessage)) return false; -#ifndef HAVE_SALOME + qreal aRatio = ModuleBase_Tools::currentPixelRatio(); myCurrentFile = QFileDialog::getSaveFileName(desktop(), tr("Select name to save file..."), - QString(), MyFilter); + QString(), MyFilter2, + Q_NULLPTR, ((aRatio > 1) ? QFileDialog::DontUseNativeDialog : QFileDialog::Options())); if (!myCurrentFile.isNull()) { + if (!myCurrentFile.endsWith(MyExtension)) { + myCurrentFile += MyExtension; + } + } + else + return false; +#ifndef HAVE_SALOME myMainWindow->setCurrentDir(myCurrentFile, false); myMainWindow->setModifiedState(false); - } #endif return onSave(); } @@ -1143,7 +1239,8 @@ void XGUI_Workshop::processUndoRedo(const ModuleBase_ActionType theActionType, i else aMgr->redo(); - if (QString((*aIt).c_str()) == MOVE_TO_END_COMMAND) + if (QString((*aIt).c_str()) == MOVE_TO_END_COMMAND || + QString((*aIt).c_str()) == MOVE_TO_END_SPLIT_COMMAND) myObjectBrowser->rebuildDataTree(); } operationMgr()->updateApplyOfOperations(); @@ -1199,6 +1296,40 @@ void XGUI_Workshop::onValuesChanged() void XGUI_Workshop::onWidgetObjectUpdated() { operationMgr()->onValidateOperation(); + myDisplayer->updateViewer(); +} + +//****************************************************** +void XGUI_Workshop::onImportPart() +{ + if (abortAllOperations()) { + ModuleBase_OperationFeature* anImportPartOp = dynamic_cast( + module()->createOperation(ExchangePlugin_ImportPart::ID())); + myPropertyPanel->updateApplyPlusButton(anImportPartOp->feature()); + operationMgr()->startOperation(anImportPartOp); + } +} + +//****************************************************** +void XGUI_Workshop::onImportShape() +{ + if (abortAllOperations()) { + ModuleBase_OperationFeature* anImportOp = dynamic_cast( + module()->createOperation(ExchangePlugin_Import::ID())); + myPropertyPanel->updateApplyPlusButton(anImportOp->feature()); + operationMgr()->startOperation(anImportOp); + } +} + +//****************************************************** +void XGUI_Workshop::onExportPart() +{ + if (abortAllOperations()) { + ModuleBase_OperationFeature* anExportPartOp = dynamic_cast( + module()->createOperation(ExchangePlugin_ExportPart::ID())); + myPropertyPanel->updateApplyPlusButton(anExportPartOp->feature()); + operationMgr()->startOperation(anExportPartOp); + } } //****************************************************** @@ -1316,7 +1447,6 @@ void XGUI_Workshop::updateCommandStatus() aCmd->setEnabled(myModule->canRedo()); } else if (aId == "AUTOCOMPUTE_CMD") { - //aCmd->setChecked(aMgr->isAutoUpdateBlocked()); aCmd->setIcon(aMgr->isAutoUpdateBlocked() ? QIcon(":pictures/autoapply_stop.png") : QIcon(":pictures/autoapply_start.png")); @@ -1367,8 +1497,7 @@ QDockWidget* XGUI_Workshop::createObjectBrowser(QWidget* theParent) { QDockWidget* aObjDock = new QDockWidget(theParent); aObjDock->setAllowedAreas(Qt::LeftDockWidgetArea | - Qt::RightDockWidgetArea | - Qt::BottomDockWidgetArea); + Qt::RightDockWidgetArea); aObjDock->setWindowTitle(tr("Object browser")); aObjDock->setStyleSheet( "::title { position: relative; padding-left: 5px; text-align: left center }"); @@ -1376,6 +1505,9 @@ QDockWidget* XGUI_Workshop::createObjectBrowser(QWidget* theParent) myObjectBrowser->initialize(myModule->rootNode()); myModule->customizeObjectBrowser(myObjectBrowser); aObjDock->setWidget(myObjectBrowser); + aObjDock->setObjectName("Object browser"); + + connect(myObjectBrowser, SIGNAL(sizeChanged()), SLOT(onDockSizeChanged())); myContextMenuMgr->connectObjectBrowser(); return aObjDock; @@ -1396,19 +1528,19 @@ void XGUI_Workshop::createDockWidgets() myPropertyPanel->setupActions(myActionsMgr); myPropertyPanel->setAllowedAreas(Qt::LeftDockWidgetArea | - Qt::RightDockWidgetArea | - Qt::BottomDockWidgetArea); + Qt::RightDockWidgetArea); aDesktop->addDockWidget(Qt::LeftDockWidgetArea, myPropertyPanel); + hidePanel(myPropertyPanel); ///addSelector(new XGUI_FacesPanelSelector(myFacesPanel)); myFacesPanel->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea | Qt::BottomDockWidgetArea); connect(myFacesPanel, SIGNAL(closed()), myFacesPanel, SLOT(onClosed())); - myInspectionPanel = new XGUI_InspectionPanel(aDesktop, mySelector); + myInspectionPanel = new XGUI_InspectionPanel(aDesktop, this); myInspectionPanel->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea); aDesktop->addDockWidget(Qt::RightDockWidgetArea, myInspectionPanel); @@ -1484,7 +1616,7 @@ void XGUI_Workshop::showPanel(QDockWidget* theDockWidget) // 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::setFocus(theDockWidget, "XGUI_Workshop::showPanel()"); + //ModuleBase_Tools::setFocus(theDockWidget, "XGUI_Workshop::showPanel()"); } //****************************************************** @@ -1500,7 +1632,7 @@ void XGUI_Workshop::hidePanel(QDockWidget* theDockWidget) // the property panel is active window of the desktop, when it is // hidden, it is undefined which window becomes active. By this reason // it is defined to perform the desktop as the active window. - // in SALOME mode, workstack made the PyConsole the active window, + // in SALOME mode, work-stack made the PyConsole the active window, // set the focus on it. As a result, shortcuts of the application, like // are processed by this console. For example Undo actions. // It is possible that this code is to be moved to SHAPER package @@ -1543,16 +1675,16 @@ void XGUI_Workshop::onContextMenuCommand(const QString& theId, bool isChecked) deleteObjects(); else if (theId == "CLEAN_HISTORY_CMD") cleanHistory(); - else if (theId == "MOVE_CMD") - moveObjects(); + else if (theId == "MOVE_CMD" || theId == "MOVE_SPLIT_CMD") + moveObjects(theId == "MOVE_SPLIT_CMD"); else if (theId == "COLOR_CMD") changeColor(aObjects); + else if (theId == "ISOLINES_CMD") + changeIsoLines(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); @@ -1610,6 +1742,10 @@ void XGUI_Workshop::onContextMenuCommand(const QString& theId, bool isChecked) highlightResults(aObjects); } else if (theId == "SHOW_FEATURE_CMD") { highlightFeature(aObjects); + } else if (theId == "SET_VIEW_NORMAL_CMD") { + setNormalView(); + } else if (theId == "SET_VIEW_INVERTEDNORMAL_CMD") { + setNormalView(true); } #ifdef TINSPECTOR else if (theId == "TINSPECTOR_VIEW") { @@ -1754,10 +1890,14 @@ void XGUI_Workshop::deleteObjects() // allow the module to delete objects, do nothing if it has succeed if (aModule->deleteObjects()) { updateCommandStatus(); + myDisplayer->updateViewer(); return; } QObjectPtrList anObjects = mySelector->selection()->selectedObjects(); + if (anObjects.isEmpty()) + return; + if (!abortAllOperations()) return; @@ -1769,9 +1909,24 @@ void XGUI_Workshop::deleteObjects() bool hasFolder = false; ModuleBase_Tools::checkObjects(anObjects, hasResult, hasFeature, hasParameter, hasCompositeOwner, hasResultInHistory, hasFolder); - if (!(hasFeature || hasParameter || hasFolder)) + if (!(hasResult || hasFeature || hasParameter || hasFolder)) return; + // Remove from the list non-deletable objects: infinite constructions which are not in history + bool notDelete = true; + QObjectPtrList::iterator aIt; + for (aIt = anObjects.begin(); aIt != anObjects.end(); aIt++) { + ObjectPtr aObj = (*aIt); + ResultConstructionPtr aConstr = std::dynamic_pointer_cast(aObj); + FeaturePtr aFeature = ModelAPI_Feature::feature(aObj); + if (aFeature) { + notDelete = (!aFeature->isInHistory()) && aConstr->isInfinite(); + if (notDelete) { + anObjects.removeAll(aObj); + aIt--; + } + } + } // delete objects std::map > aReferences; std::set aFeatures; @@ -1784,7 +1939,7 @@ void XGUI_Workshop::deleteObjects() bool aDone = false; QString aDescription = contextMenuMgr()->action("DELETE_CMD")->text() + " %1"; aDescription = aDescription.arg(XGUI_Tools::unionOfObjectNames(anObjects, ", ")); - ModuleBase_OperationAction* anOpAction = new ModuleBase_OperationAction(aDescription, module()); + ModuleBase_Operation* anOpAction = new ModuleBase_Operation(aDescription, module()); operationMgr()->startOperation(anOpAction); @@ -1810,11 +1965,25 @@ void XGUI_Workshop::deleteObjects() } } } + // remove results selected + std::list aResults; + for(QObjectPtrList::const_iterator anIt = anObjects.begin(); anIt != anObjects.end(); anIt++) { + ResultPtr aRes = std::dynamic_pointer_cast(*anIt); + if (aRes.get() && aRes->data()->isValid() && !aRes->data()->isDeleted() && + aRes->groupName() != ModelAPI_ResultGroup::group() && // don't remove groups and fields + aRes->groupName() != ModelAPI_ResultField::group()) // because they are badly selected + aResults.push_back(aRes); + } + if (!aResults.empty()) { + ModelAPI_Tools::removeResults(aResults); + } if (aDone) operationMgr()->commitOperation(); else operationMgr()->abortOperation(operationMgr()->currentOperation()); + + myDisplayer->updateViewer(); } //************************************************************** @@ -1864,11 +2033,11 @@ void XGUI_Workshop::cleanHistory() ModelAPI_Tools::findAllReferences(aFeatures, aReferences, true, false); // find for each object whether all reference values are in the map as key, that means that there // is no other reference in the model to this object, so it might be removed by cleaning history - // sk_1(ext_1, vertex_1) + (sk_3, bool_1) - cann't be deleted, dependency to bool_1 - // ext_1(bool_1, sk_3) - cann't be deleted, dependency to bool_1 + // sk_1(ext_1, vertex_1) + (sk_3, bool_1) - can't be deleted, dependency to bool_1 + // ext_1(bool_1, sk_3) - can't be deleted, dependency to bool_1 // vertex_1() - // sk_2(ext_2) + (bool_1) - cann't be deleted, dependency to bool_1 - // ext_2(bool_1) - cann't be deleted, dependency to bool_1 + // sk_2(ext_2) + (bool_1) - can't be deleted, dependency to bool_1 + // ext_2(bool_1) - can't be deleted, dependency to bool_1 // sk_3() // Information: bool_1 is not selected std::set anUnusedObjects; @@ -1908,7 +2077,8 @@ void XGUI_Workshop::cleanHistory() QString anUnusedNames = aNames.join(", "); QString anActionId = "CLEAN_HISTORY_CMD"; - QString aDescription = contextMenuMgr()->action(anActionId)->text(); + QString aDescription = ModuleBase_Tools::translate("workshop", + contextMenuMgr()->action(anActionId)->text().toStdString()); QMessageBox aMessageBox(desktop()); aMessageBox.setWindowTitle(aDescription); @@ -1926,7 +2096,7 @@ void XGUI_Workshop::cleanHistory() // 1. start operation aDescription += "by deleting of " + aDescription.arg(XGUI_Tools::unionOfObjectNames(anObjects, ", ")); - ModuleBase_OperationAction* anOpAction = new ModuleBase_OperationAction(aDescription, module()); + ModuleBase_Operation* anOpAction = new ModuleBase_Operation(aDescription, module()); operationMgr()->startOperation(anOpAction); // WORKAROUND, should be done before each object remove, if it presents in XGUI_DataModel tree @@ -1965,17 +2135,17 @@ void XGUI_Workshop::cleanHistory() } //************************************************************** -void XGUI_Workshop::moveObjects() +bool compareFeature(const FeaturePtr& theF1, const FeaturePtr& theF2) { + DocumentPtr aDoc = theF1->document(); + return aDoc->index(theF1) < aDoc->index(theF2); +} +void XGUI_Workshop::moveObjects(const bool theSplit) { if (!abortAllOperations()) return; SessionPtr aMgr = ModelAPI_Session::get(); - QString anActionId = "MOVE_CMD"; - QString aDescription = contextMenuMgr()->action(anActionId)->text(); - aMgr->startOperation(aDescription.toStdString()); - QObjectPtrList anObjects = mySelector->selection()->selectedObjects(); // It is necessary to clear selection in order to avoid selection changed event during // moving and negative consequences connected with processing of already moved items @@ -1986,18 +2156,28 @@ void XGUI_Workshop::moveObjects() if (!XGUI_Tools::canRemoveOrRename(desktop(), aFeatures)) return; + QString anActionId = theSplit ? "MOVE_CMD" : "MOVE_SPLIT_CMD"; + QString aDescription = contextMenuMgr()->action(anActionId)->text(); + aMgr->startOperation(aDescription.toStdString()); + + // Sort features by index in document + std::list aFList(aFeatures.begin(), aFeatures.end()); + aFList.sort(compareFeature); + DocumentPtr anActiveDocument = aMgr->activeDocument(); FeaturePtr aCurrentFeature = anActiveDocument->currentFeature(true); - std::set::const_iterator anIt = aFeatures.begin(), aLast = aFeatures.end(); + std::list::const_iterator anIt = aFList.begin(), aLast = aFList.end(); for (; anIt != aLast; anIt++) { FeaturePtr aFeature = *anIt; if (!aFeature.get() || !myModule->canApplyAction(aFeature, anActionId)) continue; - anActiveDocument->moveFeature(aFeature, aCurrentFeature); + anActiveDocument->moveFeature(aFeature, aCurrentFeature, theSplit); aCurrentFeature = anActiveDocument->currentFeature(true); } aMgr->finishOperation(); + updateCommandStatus(); + myViewerProxy->update(); } //************************************************************** @@ -2167,11 +2347,8 @@ bool XGUI_Workshop::canBeShaded(const ObjectPtr& theObject) const bool XGUI_Workshop::canChangeProperty(const QString& theActionName) const { if (theActionName == "COLOR_CMD" || - theActionName == "DEFLECTION_CMD" -#ifdef USE_TRANSPARENCY - || theActionName == "TRANSPARENCY_CMD" -#endif - ) { + theActionName == "DEFLECTION_CMD" || + theActionName == "TRANSPARENCY_CMD") { QObjectPtrList aObjects = mySelector->selection()->selectedObjects(); std::set aTypes; @@ -2185,20 +2362,26 @@ bool XGUI_Workshop::canChangeProperty(const QString& theActionName) const return false; } -//****************************************************** -void setColor(ResultPtr theResult, const std::vector& theColor) -{ - if (!theResult.get()) - return; - AttributeIntArrayPtr aColorAttr = theResult->data()->intArray(ModelAPI_Result::COLOR_ID()); - if (aColorAttr.get() != NULL) { - if (!aColorAttr->size()) { - aColorAttr->setSize(3); +//************************************************************** +void getDefaultColor(ObjectPtr theObject, const bool isEmptyColorValid, + std::vector& theColor) +{ + theColor.clear(); + // get default color from the preferences manager for the given result + if (theColor.empty()) { + std::string aSection, aName, aDefault; + theObject->colorConfigInfo(aSection, aName, aDefault); + if (!aSection.empty() && !aName.empty()) { + theColor = Config_PropManager::color(aSection, aName); } - aColorAttr->setValue(0, theColor[0]); - aColorAttr->setValue(1, theColor[1]); - aColorAttr->setValue(2, theColor[2]); + } + if (!isEmptyColorValid && theColor.empty()) { + // all AIS objects, where the color is not set, are in black. + // The color should be defined in XML or set in the attribute + theColor = Config_PropManager::color("Visualization", "object_default_color"); + Events_InfoMessage("XGUI_CustomPrs", + "A default color is not defined in the preferences for this kind of result").send(); } } @@ -2213,7 +2396,9 @@ void XGUI_Workshop::changeColor(const QObjectPtrList& theObjects) foreach(ObjectPtr anObject, theObjects) { ResultPtr aResult = std::dynamic_pointer_cast(anObject); if (aResult.get()) { - XGUI_CustomPrs::getResultColor(aResult, aColor); + ModelAPI_Tools::getColor(aResult, aColor); + if (aColor.empty()) + getDefaultColor(aResult, false, aColor); } else { // TODO: remove the obtaining a color from the AIS object @@ -2259,36 +2444,16 @@ void XGUI_Workshop::changeColor(const QObjectPtrList& theObjects) std::list allRes; ModelAPI_Tools::allSubs(aBodyResult, allRes); for(std::list::iterator aRes = allRes.begin(); aRes != allRes.end(); aRes++) { - setColor(*aRes, !isRandomColor ? aColorResult : aDlg->getRandomColor()); + ModelAPI_Tools::setColor(*aRes, !isRandomColor ? aColorResult : aDlg->getRandomColor()); } } - setColor(aResult, !isRandomColor ? aColorResult : aDlg->getRandomColor()); + ModelAPI_Tools::setColor(aResult, !isRandomColor ? aColorResult : aDlg->getRandomColor()); } } + Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY)); aMgr->finishOperation(); updateCommandStatus(); -} - -//************************************************************** -void setDeflection(ResultPtr theResult, const double theDeflection) -{ - if (!theResult.get()) - return; - - AttributeDoublePtr aDeflectionAttr = theResult->data()->real(ModelAPI_Result::DEFLECTION_ID()); - if (aDeflectionAttr.get() != NULL) - 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); + myViewerProxy->update(); } //************************************************************** @@ -2301,15 +2466,44 @@ void setTransparency(double theTransparency, const QObjectPtrList& theObjects) if (aBodyResult.get() != NULL) { // change property for all sub-solids std::list allRes; ModelAPI_Tools::allSubs(aBodyResult, allRes); - for(std::list::iterator aRes = allRes.begin(); aRes != allRes.end(); aRes++) { - setTransparency(*aRes, theTransparency); + std::list::iterator aRes; + for(aRes = allRes.begin(); aRes != allRes.end(); aRes++) { + ModelAPI_Tools::setTransparency(*aRes, theTransparency); } } - setTransparency(aResult, theTransparency); + ModelAPI_Tools::setTransparency(aResult, theTransparency); } } } +//************************************************************** +double getDefaultDeflection(const ObjectPtr& theObject) +{ + double aDeflection = -1; + ResultPtr aResult = std::dynamic_pointer_cast(theObject); + if (aResult.get()) { + bool isConstruction = false; + + std::string aResultGroup = aResult->groupName(); + if (aResultGroup == ModelAPI_ResultConstruction::group()) + isConstruction = true; + else if (aResultGroup == ModelAPI_ResultBody::group()) { + GeomShapePtr aGeomShape = aResult->shape(); + if (aGeomShape.get()) { + // if the shape could not be exploded on faces, it contains only wires, edges, and vertices + // correction of deviation for them should not influence to the application performance + GeomAPI_ShapeExplorer anExp(aGeomShape, GeomAPI_Shape::FACE); + isConstruction = !anExp.more(); + } + } + if (isConstruction) + aDeflection = Config_PropManager::real("Visualization", "construction_deflection"); + else + aDeflection = Config_PropManager::real("Visualization", "body_deflection"); + } + return aDeflection; +} + //************************************************************** void XGUI_Workshop::changeDeflection(const QObjectPtrList& theObjects) { @@ -2320,7 +2514,9 @@ void XGUI_Workshop::changeDeflection(const QObjectPtrList& theObjects) foreach(ObjectPtr anObject, theObjects) { ResultPtr aResult = std::dynamic_pointer_cast(anObject); if (aResult.get()) { - aDeflection = XGUI_CustomPrs::getResultDeflection(aResult); + aDeflection = ModelAPI_Tools::getDeflection(aResult); + if (aDeflection < 0) + aDeflection = getDefaultDeflection(aResult); } else { // TODO: remove the obtaining a property from the AIS object @@ -2363,16 +2559,23 @@ void XGUI_Workshop::changeDeflection(const QObjectPtrList& theObjects) std::list allRes; ModelAPI_Tools::allSubs(aBodyResult, allRes); for(std::list::iterator aRes = allRes.begin(); aRes != allRes.end(); aRes++) { - setDeflection(*aRes, aDeflection); + ModelAPI_Tools::setDeflection(*aRes, aDeflection); } } - setDeflection(aResult, aDeflection); + ModelAPI_Tools::setDeflection(aResult, aDeflection); } } + Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY)); aMgr->finishOperation(); updateCommandStatus(); } +//************************************************************** +double getDefaultTransparency(const ResultPtr& theResult) +{ + return Config_PropManager::integer("Visualization", "shaper_default_transparency") / 100.; +} + //************************************************************** void XGUI_Workshop::changeTransparency(const QObjectPtrList& theObjects) { @@ -2383,17 +2586,9 @@ void XGUI_Workshop::changeTransparency(const QObjectPtrList& theObjects) 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(); - } + aCurrentValue = ModelAPI_Tools::getTransparency(aResult); + if (aCurrentValue < 0) + aCurrentValue = getDefaultTransparency(aResult); } if (aCurrentValue > 0) break; @@ -2402,16 +2597,14 @@ void XGUI_Workshop::changeTransparency(const QObjectPtrList& theObjects) return; if (!abortAllOperations()) - return; + return; // 2. show the dialog to change the value XGUI_PropertyDialog* aDlg = new XGUI_PropertyDialog(desktop()); - aDlg->setWindowTitle("Transparency"); + aDlg->setWindowTitle(tr("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); @@ -2420,16 +2613,16 @@ void XGUI_Workshop::changeTransparency(const QObjectPtrList& theObjects) 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); + if (aDlg->exec() == QDialog::Accepted) { + // 4. set the value to all results + aCurrentValue = aTransparencyWidget->getValue(); + setTransparency(aCurrentValue, theObjects); + aMgr->finishOperation(); + } else { + aMgr->abortOperation(); + Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY)); + } - aMgr->finishOperation(); updateCommandStatus(); } @@ -2437,31 +2630,18 @@ void XGUI_Workshop::changeTransparency(const QObjectPtrList& theObjects) void XGUI_Workshop::onTransparencyValueChanged() { XGUI_TransparencyWidget* aTransparencyWidget = (XGUI_TransparencyWidget*)sender(); - if (!aTransparencyWidget || !aTransparencyWidget->isPreviewNeeded()) + if (!aTransparencyWidget) return; QObjectPtrList anObjects = mySelector->selection()->selectedObjects(); setTransparency(aTransparencyWidget->getValue(), anObjects); - Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY)); -} + static const Events_ID kRedisplayEvent = + Events_Loop::loop()->eventByName(EVENT_OBJECT_TO_REDISPLAY); + Events_Loop::loop()->flush(kRedisplayEvent); -//************************************************************** -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)); + myViewerProxy->update(); } -//************************************************************** -#define SET_DISPLAY_GROUP(aGroupName, aDisplay) \ -for (int i = 0; i < aDoc->size(aGroupName); i++) { \ - aDoc->object(aGroupName, i)->setDisplayed(aDisplay); \ -} //****************************************************** void XGUI_Workshop::showObjects(const QObjectPtrList& theList, bool isVisible) @@ -2480,6 +2660,9 @@ void XGUI_Workshop::showObjects(const QObjectPtrList& theList, bool isVisible) } Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY)); myObjectBrowser->updateAllIndexes(); + + updateColorScaleVisibility(); + displayer()->updateViewer(); } //************************************************************** @@ -2519,6 +2702,79 @@ void XGUI_Workshop::showOnlyObjects(const QObjectPtrList& theList) // Necessary for update icons in ObjectBrowser on Linux myObjectBrowser->updateAllIndexes(); + updateColorScaleVisibility(); + displayer()->updateViewer(); +} + + +//************************************************************** +void XGUI_Workshop::updateColorScaleVisibility() +{ + QObjectPtrList aObjects = mySelector->selection()->selectedObjects(); + viewer()->setColorScaleShown(false); + if (aObjects.size() == 1) { + FieldStepPtr aStep = + std::dynamic_pointer_cast(aObjects.first()); + if (aStep.get() && myDisplayer->isVisible(aStep)) { + AISObjectPtr aAisPtr = myDisplayer->getAISObject(aStep); + Handle(AIS_InteractiveObject) aIO = aAisPtr->impl(); + ModuleBase_IStepPrs* aPrs = dynamic_cast(aIO.get()); + if (aPrs) { + ModelAPI_AttributeTables::ValueType aType = aPrs->dataType(); + if ((aType == ModelAPI_AttributeTables::DOUBLE) || + (aType == ModelAPI_AttributeTables::INTEGER) || + (aType == ModelAPI_AttributeTables::BOOLEAN)) { + myViewerProxy->setupColorScale(); + if (aType == ModelAPI_AttributeTables::BOOLEAN) { + myViewerProxy->setColorScaleIntervals(2); + myViewerProxy->setColorScaleRange(0., 1.); + } + else { + double aMin, aMax; + aPrs->dataRange(aMin, aMax); + myViewerProxy->setColorScaleRange(aMin, aMax); + } + myViewerProxy->setColorScaleTitle(aStep->name().c_str()); + myViewerProxy->setColorScaleShown(true); + } + } + } + } +} + + +//************************************************************** +void XGUI_Workshop::setNormalView(bool toInvert) +{ + QList aPrsList = + mySelector->selection()->getSelected(ModuleBase_ISelection::Viewer); + GeomShapePtr aPlanarFace; + foreach(ModuleBase_ViewerPrsPtr aPrs, aPrsList) { + GeomShapePtr aShape = aPrs->shape(); + if (aShape.get() && aShape->isPlanar()) { + aPlanarFace = aShape; + break; + } + } + if (aPlanarFace.get()) { + GeomFacePtr aFace(new GeomAPI_Face(aPlanarFace)); + GeomPlanePtr aPlane = aFace->getPlane(); + GeomDirPtr aNormal = aPlane->direction(); + if (toInvert) + aNormal->reverse(); + GeomPointPtr aPos = aPlane->location(); + + double aXmin, aYmin, aZmin, aXmax, aYmax, aZmax; + aFace->computeSize(aXmin, aYmin, aZmin, aXmax, aYmax, aZmax); + + Handle(V3d_View) aView = myViewerProxy->activeView(); + double aScale = aView->Scale(); + aView->SetAt(aPos->x(), aPos->y(), aPos->z()); + aView->SetProj(aNormal->x(), aNormal->y(), aNormal->z()); + Bnd_Box aBox; + aBox.Update(aXmin, aYmin, aZmin, aXmax, aYmax, aZmax); + aView->FitAll(aBox); + } } //************************************************************** @@ -2655,34 +2911,66 @@ void XGUI_Workshop::synchronizeViewer() aDocs.append(aMgr->moduleDocument()); 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); + synchronizeGroupInViewer(aDoc, false); } } //****************************************************** void XGUI_Workshop::synchronizeGroupInViewer(const DocumentPtr& theDoc, - const std::string& theGroup, bool theUpdateViewer) { - ObjectPtr aObj; - int aSize = theDoc->size(theGroup); + FeaturePtr aFeature; + ResultPtr aRes; + int aSize = theDoc->numInternalFeatures(); for (int i = 0; i < aSize; i++) { - aObj = theDoc->object(theGroup, i); - if (aObj->isDisplayed()) { - // Hide the presentation with an empty shape. But isDisplayed state of the object should not - // be changed to the object becomes visible when the shape becomes not empty - ResultPtr aRes = std::dynamic_pointer_cast(aObj); - if (aRes.get() && (!aRes->shape().get() || aRes->shape()->isNull())) - continue; - myDisplayer->display(aObj, false); + aFeature = theDoc->internalFeature(i); + if (!aFeature.get()) + continue; + const std::list& aResults = aFeature->results(); + std::list::const_iterator aIt; + aFeature->setDisplayed(false); + for (aIt = aResults.cbegin(); aIt != aResults.cend(); aIt++) { + aRes = (*aIt); + if (aRes->isDisplayed() && !aRes->isConcealed()) { + // Hide the presentation with an empty shape. But isDisplayed state of the object should not + // be changed to the object becomes visible when the shape becomes not empty + if (!aRes->shape().get() || aRes->shape()->isNull()) + continue; + ResultBodyPtr aResBody = std::dynamic_pointer_cast(aRes); + if (aResBody.get()) + synchronizeResultTree(aResBody, false); + else { + if (aRes->isInHistory()) { + if (aRes->isDisplayed()) + myDisplayer->display(aRes, false); + else + myDisplayer->erase(aRes, false); + } + else + aRes->setDisplayed(false); + } + } } } if (theUpdateViewer) myDisplayer->updateViewer(); } + +void XGUI_Workshop::synchronizeResultTree(const ResultBodyPtr& theRes, bool theUpdateViewer) +{ + if (theRes->numberOfSubs() > 0) + for (int i = 0; i < theRes->numberOfSubs(); i++) { + ResultBodyPtr aRes = theRes->subResult(i); + if (aRes.get()) + synchronizeResultTree(aRes, theUpdateViewer); + } + else { + if (theRes->isDisplayed()) + myDisplayer->display(theRes, theUpdateViewer); + else + myDisplayer->erase(theRes, theUpdateViewer); + } +} #endif //****************************************************** @@ -2707,9 +2995,7 @@ void XGUI_Workshop::highlightResults(const QObjectPtrList& theObjects) } if (aSelList.count() > theObjects.count()) { // if something was found - bool aBlocked = objectBrowser()->blockSignals(true); objectBrowser()->setObjectsSelected(aSelList); - objectBrowser()->blockSignals(aBlocked); objectBrowser()->ensureVisible(aNewSel.first()); } if (aHasHidden) @@ -2736,9 +3022,7 @@ void XGUI_Workshop::highlightFeature(const QObjectPtrList& theObjects) } if (aSelList.count() > theObjects.count()) { // if something was found - bool aBlocked = objectBrowser()->blockSignals(true); objectBrowser()->setObjectsSelected(aSelList); - objectBrowser()->blockSignals(aBlocked); objectBrowser()->ensureVisible(aNewSel.first()); } } @@ -2828,16 +3112,16 @@ void XGUI_Workshop::updateAutoComputeState() SessionPtr aMgr = ModelAPI_Session::get(); bool isComputeBlocked = aMgr->isAutoUpdateBlocked(); #ifdef HAVE_SALOME - QAction* aUpdateCmd; - QList aCommands = mySalomeConnector->commandList(); - foreach(QAction* aCmd, aCommands) { - if (aCmd->data().toString() == "AUTOCOMPUTE_CMD") { - aUpdateCmd = aCmd; - break; - } - } - aUpdateCmd->setIcon(isComputeBlocked? QIcon(":pictures/autoapply_stop.png") : - QIcon(":pictures/autoapply_start.png")); +// QAction* aUpdateCmd; +// QList aCommands = mySalomeConnector->commandList(); +// foreach(QAction* aCmd, aCommands) { +// if (aCmd->data().toString() == "AUTOCOMPUTE_CMD") { +// aUpdateCmd = aCmd; +// break; +// } +// } +// aUpdateCmd->setIcon(isComputeBlocked? QIcon(":pictures/autoapply_stop.png") : +// QIcon(":pictures/autoapply_start.png")); #else AppElements_MainMenu* aMenuBar = myMainWindow->menuObject(); AppElements_Command* aUpdateCmd = aMenuBar->feature("AUTOCOMPUTE_CMD"); @@ -2857,4 +3141,83 @@ void XGUI_Workshop::clearTemporaryDir() aDir.remove(aFile); } } +} + + +void XGUI_Workshop::onDockSizeChanged() +{ + QDockWidget* aDockWgt = dynamic_cast(myObjectBrowser->parentWidget()); + int aObWidth = aDockWgt->size().width(); + if (myPropertyPanel->width() != aObWidth) { + QList aWgtList; + aWgtList << myPropertyPanel << aDockWgt; + QList aSizeList; + aSizeList << aObWidth << aObWidth; + desktop()->resizeDocks(aWgtList, aSizeList, Qt::Horizontal); + disconnect(myObjectBrowser, SIGNAL(sizeChanged()), this, SLOT(onDockSizeChanged())); + } +} + +void XGUI_Workshop::deactivateCurrentSelector() +{ + myActiveControlMgr->deactivateSelector(myActiveControlMgr->activeSelector()); +} + +void XGUI_Workshop::changeIsoLines(const QObjectPtrList& theObjects) +{ + if (theObjects.isEmpty()) + return; + + std::vector aValues; + if (theObjects.size() == 1) { + ResultPtr aRes = std::dynamic_pointer_cast(theObjects.first()); + if (aRes.get()) + ModelAPI_Tools::getIsoLines(aRes, aValues); + else + return; + } + if (aValues.size() == 0) { + aValues.push_back(1); + aValues.push_back(1); + } + + if (!abortAllOperations()) + return; + + QDialog aDlg; + aDlg.setWindowTitle(tr("Number of Iso-lines")); + QFormLayout* aLayout = new QFormLayout(&aDlg); + + QSpinBox* aUNb = new QSpinBox(&aDlg); + aUNb->setValue(aValues[0]); + aLayout->addRow("U:", aUNb); + + QSpinBox* aVNb = new QSpinBox(&aDlg); + aVNb->setValue(aValues[1]); + aLayout->addRow("V:", aVNb); + + QDialogButtonBox* aButtons = + new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, Qt::Horizontal, &aDlg); + connect(aButtons, SIGNAL(accepted()), &aDlg, SLOT(accept())); + connect(aButtons, SIGNAL(rejected()), &aDlg, SLOT(reject())); + aLayout->addRow(aButtons); + + if (aDlg.exec() == QDialog::Accepted) { + SessionPtr aMgr = ModelAPI_Session::get(); + QString aDescription = contextMenuMgr()->action("ISOLINES_CMD")->text(); + aMgr->startOperation(aDescription.toStdString()); + + aValues[0] = aUNb->value(); + aValues[1] = aVNb->value(); + ResultPtr aRes; + foreach(ObjectPtr aObj, theObjects) { + aRes = std::dynamic_pointer_cast(aObj); + if (aRes.get()) { + ModelAPI_Tools::setIsoLines(aRes, aValues); + } + } + Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY)); + aMgr->finishOperation(); + updateCommandStatus(); + } } \ No newline at end of file