X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_Workshop.cpp;h=f332c4aad16f9df7ae45c715d8eaa112bdcb6854;hb=116001f1015b8567ac4426e3a13c8cb8a0b32052;hp=6892cfc6e86a8b41ad2b5460b4e1009e173b06f7;hpb=220e6dcfe4036a1758c1ed5280c386bd7d278bf4;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_Workshop.cpp b/src/XGUI/XGUI_Workshop.cpp index 6892cfc6e..f332c4aad 100755 --- a/src/XGUI/XGUI_Workshop.cpp +++ b/src/XGUI/XGUI_Workshop.cpp @@ -24,6 +24,7 @@ #include #include #include +#include #ifndef HAVE_SALOME #include @@ -46,6 +47,7 @@ #include #include #include +#include #include #include #include @@ -57,7 +59,6 @@ #include #include -#include #include #include #include @@ -79,12 +80,19 @@ #include #include #include -#include #include #include +#include +#include #include +#include +#ifdef BEFORE_TRIHEDRON_PATCH +#include +#include +#endif + #include #include #include @@ -102,6 +110,16 @@ #include +#ifdef TINSPECTOR +#include +#include +#include +#include +static TInspector_Communicator* MyTCommunicator; +static Handle(VInspector_CallBack) MyVCallBack; + +#endif + #ifdef _DEBUG #include #include @@ -136,25 +154,34 @@ XGUI_Workshop::XGUI_Workshop(XGUI_SalomeConnector* theConnector) // Has to be defined first in order to get errors and messages from other components myEventsListener = new XGUI_WorkshopListener(aWorkshop); + SUIT_ResourceMgr* aResMgr = ModuleBase_Preferences::resourceMgr(); #ifndef HAVE_SALOME myMainWindow = new AppElements_MainWindow(); - SUIT_ResourceMgr* aResMgr = ModuleBase_Preferences::resourceMgr(); bool aCloc = aResMgr->booleanValue("language", "locale", true); if (aCloc) QLocale::setDefault( QLocale::c() ); - else + else QLocale::setDefault( QLocale::system() ); #endif QString aPath = Config_XMLReader::pluginConfigFile().c_str(); QDir aDir(aPath); // Load translations - QStringList aFilters; - aFilters << "*_en.ts"; - QStringList aTsFiles = aDir.entryList(aFilters, QDir::Files); - foreach(QString aFileName, aTsFiles) { - Config_Translator::load(aFileName.toStdString()); + QStringList aLangs; + aLangs << "*_en.ts"; // load by default eng translations + QString aCurrLang = aResMgr->stringValue("language", "language", "en"); + if(aCurrLang != "en") { + aLangs << "*_" + aCurrLang + ".ts"; // then replace with translated files + } + + foreach(QString aLang, aLangs) { + QStringList aFilters; + aFilters << aLang; + QStringList aTsFiles = aDir.entryList(aFilters, QDir::Files); + foreach(QString aFileName, aTsFiles) { + Config_Translator::load(aFileName.toStdString()); + } } myDataModelXMLReader = new Config_DataModelReader(); @@ -183,9 +210,9 @@ XGUI_Workshop::XGUI_Workshop(XGUI_SalomeConnector* theConnector) SLOT(onOperationResumed(ModuleBase_Operation*))); connect(myOperationMgr, SIGNAL(operationStopped(ModuleBase_Operation*)), SLOT(onOperationStopped(ModuleBase_Operation*))); - connect(myOperationMgr, SIGNAL(operationCommitted(ModuleBase_Operation*)), + connect(myOperationMgr, SIGNAL(operationCommitted(ModuleBase_Operation*)), SLOT(onOperationCommitted(ModuleBase_Operation*))); - connect(myOperationMgr, SIGNAL(operationAborted(ModuleBase_Operation*)), + connect(myOperationMgr, SIGNAL(operationAborted(ModuleBase_Operation*)), SLOT(onOperationAborted(ModuleBase_Operation*))); #ifndef HAVE_SALOME @@ -203,16 +230,14 @@ XGUI_Workshop::XGUI_Workshop(XGUI_SalomeConnector* theConnector) 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_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", "body_deflection", "Body deflection coefficient", - Config_Prop::Double, ModelAPI_ResultBody::DEFAULT_DEFLECTION());//"0.001"); - - Config_PropManager::registerProp("Visualization", "construction_deflection", "Construction deflection coefficient", - Config_Prop::Double, ModelAPI_ResultConstruction::DEFAULT_DEFLECTION());//"0.0001"); + 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); @@ -263,7 +288,7 @@ void XGUI_Workshop::startApplication() myMainWindow->show(); updateCommandStatus(); #endif - + onNew(); myViewerProxy->connectViewProxy(); @@ -306,6 +331,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(); } @@ -320,7 +363,8 @@ void XGUI_Workshop::initMenu() QAction* aAction = salomeConnector()->addDesktopCommand("UNDO_CMD", tr("Undo"), tr("Undo last command"), QIcon(":pictures/undo.png"), - QKeySequence::Undo, false, "MEN_DESK_EDIT"); + QKeySequence::Undo, false, + "MEN_DESK_EDIT"); QString aToolBarTitle = tr( "INF_DESK_TOOLBAR_STANDARD" ); salomeConnector()->addActionInToolbar( aAction,aToolBarTitle ); @@ -336,7 +380,8 @@ void XGUI_Workshop::initMenu() addHistoryMenu(aAction, SIGNAL(updateRedoHistory(const QList&)), SLOT(onRedo(int))); salomeConnector()->addDesktopMenuSeparator("MEN_DESK_EDIT"); - //aAction = salomeConnector()->addDesktopCommand("REBUILD_CMD", tr("Rebuild"), tr("Rebuild data objects"), + //aAction = salomeConnector()->addDesktopCommand("REBUILD_CMD", tr("Rebuild"), + // tr("Rebuild data objects"), // QIcon(":pictures/rebuild.png"), QKeySequence(), // false, "MEN_DESK_EDIT"); //salomeConnector()->addActionInToolbar( aAction, aToolBarTitle ); @@ -344,12 +389,14 @@ void XGUI_Workshop::initMenu() //connect(aAction, SIGNAL(triggered(bool)), this, SLOT(onRebuild())); //salomeConnector()->addDesktopMenuSeparator("MEN_DESK_EDIT"); - aAction = salomeConnector()->addDesktopCommand("SAVEAS_CMD", tr("Export native..."), tr("Export the current document into a native file"), + aAction = salomeConnector()->addDesktopCommand("SAVEAS_CMD", tr("Export native..."), + tr("Export the current document into a native file"), QIcon(), QKeySequence(), false, "MEN_DESK_FILE"); connect(aAction, SIGNAL(triggered(bool)), this, SLOT(onSaveAs())); - aAction = salomeConnector()->addDesktopCommand("OPEN_CMD", tr("Import native..."), tr("Import native file"), + aAction = salomeConnector()->addDesktopCommand("OPEN_CMD", tr("Import native..."), + tr("Import native file"), QIcon(), QKeySequence(), false, "MEN_DESK_FILE"); connect(aAction, SIGNAL(triggered(bool)), this, SLOT(onOpen())); @@ -485,7 +532,7 @@ bool XGUI_Workshop::isFeatureOfNested(const FeaturePtr& theFeature) XGUI_SalomeConnector* aSalomeConnector = salomeConnector(); if (aSalomeConnector->isFeatureOfNested(actionsMgr()->action(aFeatureKind.c_str()))) aHasNested = true; -#else +#else AppElements_MainMenu* aMenuBar = mainWindow()->menuObject(); AppElements_Command* aCommand = aMenuBar->feature(aFeatureKind.c_str()); if (aCommand && aCommand->button()->additionalButtonWidget()) @@ -496,7 +543,8 @@ bool XGUI_Workshop::isFeatureOfNested(const FeaturePtr& theFeature) void XGUI_Workshop::fillPropertyPanel(ModuleBase_Operation* theOperation) { - ModuleBase_OperationFeature* aFOperation = dynamic_cast(theOperation); + ModuleBase_OperationFeature* aFOperation = + dynamic_cast(theOperation); if (!aFOperation) return; @@ -518,7 +566,8 @@ void XGUI_Workshop::fillPropertyPanel(ModuleBase_Operation* theOperation) if (!aWidget->attributeID().empty() && !aFeature->attribute(aWidget->attributeID()).get()) { std::string anErrorMsg = "The feature '%1' has no attribute '%2' used by widget '%3'."; Events_InfoMessage("XGUI_Workshop", anErrorMsg) - .arg(aFeatureKind).arg(aWidget->attributeID()).arg(aWidget->metaObject()->className()).send(); + .arg(aFeatureKind).arg(aWidget->attributeID()) + .arg(aWidget->metaObject()->className()).send(); myPropertyPanel->cleanContent(); return; } @@ -537,13 +586,25 @@ void XGUI_Workshop::fillPropertyPanel(ModuleBase_Operation* theOperation) 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 @@ -561,8 +622,9 @@ void XGUI_Workshop::fillPropertyPanel(ModuleBase_Operation* theOperation) myPropertyPanel->setWindowTitle(theOperation->getDescription()->description()); #else std::string aFeatureName = aFeature->name(); - myPropertyPanel->setWindowTitle(QString("%1: %2").arg(theOperation->getDescription()->description()) - .arg(aFeatureName.c_str())); + myPropertyPanel->setWindowTitle(QString("%1: %2") + .arg(theOperation->getDescription()->description()) + .arg(aFeatureName.c_str())); #endif myErrorMgr->setPropertyPanel(myPropertyPanel); @@ -656,7 +718,8 @@ void XGUI_Workshop::onOperationAborted(ModuleBase_Operation* theOperation) void XGUI_Workshop::setGrantedFeatures(ModuleBase_Operation* theOperation) { - ModuleBase_OperationFeature* aFOperation = dynamic_cast(theOperation); + ModuleBase_OperationFeature* aFOperation = + dynamic_cast(theOperation); if (!aFOperation) return; @@ -683,7 +746,16 @@ void XGUI_Workshop::saveDocument(const QString& theName, std::list& { QApplication::restoreOverrideCursor(); SessionPtr aMgr = ModelAPI_Session::get(); + + std::list aDocList = aMgr->allOpenedDocuments(); + std::list::const_iterator aIt; + for (aIt = aDocList.cbegin(); aIt != aDocList.cend(); aIt++) { + std::list aState = myObjectBrowser->getStateForDoc(*aIt); + (*aIt)->storeNodesState(aState); + } + aMgr->save(theName.toLatin1().constData(), theFileNames); + QApplication::restoreOverrideCursor(); } @@ -746,10 +818,18 @@ 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()); myObjectBrowser->rebuildDataTree(); + + // Open first level of data tree + DocumentPtr aRootDoc = aSession->moduleDocument(); + std::list aStates; + aRootDoc->restoreNodesState(aStates); + myObjectBrowser->setStateForDoc(aRootDoc, aStates); + updateCommandStatus(); #ifndef HAVE_SALOME myMainWindow->setCurrentDir(myCurrentDir, true); @@ -852,7 +932,7 @@ bool XGUI_Workshop::onSaveAs() QFileDialog dialog(desktop()); dialog.setWindowTitle(tr("Select directory to save files...")); dialog.setFileMode(QFileDialog::Directory); - dialog.setFilter(tr("Directories (*)")); + dialog.setFilter(QDir::AllDirs); dialog.setOptions(QFileDialog::HideNameFilterDetails | QFileDialog::ShowDirsOnly); dialog.setViewMode(QFileDialog::Detail); @@ -865,7 +945,8 @@ bool XGUI_Workshop::onSaveAs() if (aDir.exists() && !aDir.entryInfoList(QDir::NoDotAndDotDot | QDir::AllEntries).isEmpty()) { int answer = QMessageBox::question( desktop(), - //: Title of the dialog which asks user if he wants to save study in existing non-empty folder + // Title of the dialog which asks user if he wants to save study + // in existing non-empty folder tr("Save"), tr("The directory already contains some files, save anyway?"), QMessageBox::Save | QMessageBox::Cancel); @@ -909,8 +990,8 @@ void XGUI_Workshop::onRedo(int theTimes) { // 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 until - // redo of all possible objects happens + // each created result. After a redisplay signal is flushed. So, the viewer update is blocked + // until redo of all possible objects happens bool isUpdateEnabled = myDisplayer->enableUpdateViewer(false); objectBrowser()->treeView()->setCurrentIndex(QModelIndex()); @@ -1130,7 +1211,9 @@ void XGUI_Workshop::updateHistory() QDockWidget* XGUI_Workshop::createObjectBrowser(QWidget* theParent) { QDockWidget* aObjDock = new QDockWidget(theParent); - aObjDock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea | Qt::BottomDockWidgetArea); + aObjDock->setAllowedAreas(Qt::LeftDockWidgetArea | + Qt::RightDockWidgetArea | + Qt::BottomDockWidgetArea); aObjDock->setWindowTitle(tr("Object browser")); aObjDock->setStyleSheet( "::title { position: relative; padding-left: 5px; text-align: left center }"); @@ -1155,7 +1238,9 @@ void XGUI_Workshop::createDockWidgets() aDesktop->addDockWidget(Qt::LeftDockWidgetArea, aObjDock); myPropertyPanel = new XGUI_PropertyPanel(aDesktop, myOperationMgr); myPropertyPanel->setupActions(myActionsMgr); - myPropertyPanel->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea | Qt::BottomDockWidgetArea); + myPropertyPanel->setAllowedAreas(Qt::LeftDockWidgetArea | + Qt::RightDockWidgetArea | + Qt::BottomDockWidgetArea); aDesktop->addDockWidget(Qt::LeftDockWidgetArea, myPropertyPanel); hidePropertyPanel(); ///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); else if (theId == "WIREFRAME_CMD") setDisplayMode(aObjects, XGUI_Displayer::Wireframe); else if (theId == "HIDEALL_CMD") { +#ifdef HAVE_SALOME + //issue #2159 Hide all incomplete behavior + viewer()->eraseAll(); +#else QObjectPtrList aList = myDisplayer->displayedObjects(); foreach (ObjectPtr aObj, aList) { if (module()->canEraseObject(aObj)) aObj->setDisplayed(false); } Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY)); +#endif + updateCommandStatus(); } else if (theId == "SELECT_VERTEX_CMD") { setViewerSelectionMode(TopAbs_VERTEX); } else if (theId == "SELECT_EDGE_CMD") { @@ -1291,6 +1386,41 @@ void XGUI_Workshop::onContextMenuCommand(const QString& theId, bool isChecked) } else if (theId == "SHOW_FEATURE_CMD") { highlightFeature(aObjects); } +#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("SMBrowser"); // custom plugin to view ModelAPI + + MyTCommunicator->init(aParameters); + MyTCommunicator->Activate("SMBrowser"); // to have button in TInspector + MyTCommunicator->Activate("TKVInspector"); // to have filled callback by model + MyTCommunicator->Activate("TKDFBrowser"); + } + MyTCommunicator->setVisible(true); + } + } +#endif } //************************************************************** @@ -1335,7 +1465,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; @@ -1408,13 +1540,14 @@ void XGUI_Workshop::cleanHistory() anInfo.append(aFeature->name().c_str()); } QString anInfoStr = anInfo.join(";\t"); - qDebug(QString("cleanHistory for: [%1] - %2").arg(aFeatures.size()).arg(anInfoStr).toStdString().c_str()); + qDebug(QString("cleanHistory for: [%1] - %2"). + arg(aFeatures.size()).arg(anInfoStr).toStdString().c_str()); #endif std::map > aReferences; 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 + // 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 // vertex_1() @@ -1428,7 +1561,8 @@ void XGUI_Workshop::cleanHistory() for (; aMainIt != aMainLast; aMainIt++) { FeaturePtr aMainListFeature = aMainIt->first; std::set aMainRefList = aMainIt->second; - std::set::const_iterator aRefIt = aMainRefList.begin(), aRefLast = aMainRefList.end(); + std::set::const_iterator aRefIt = aMainRefList.begin(), + aRefLast = aMainRefList.end(); bool aFeatureOutOfTheList = false; for (; aRefIt != aRefLast && !aFeatureOutOfTheList; aRefIt++) { FeaturePtr aRefFeature = *aRefIt; @@ -1444,7 +1578,8 @@ void XGUI_Workshop::cleanHistory() FeaturePtr aFeature = *aFIt; anInfo.append(aFeature->name().c_str()); } - qDebug(QString("unused objects: [%1] - %2").arg(anInfo.size()).arg(anInfo.join(";\t")).toStdString().c_str()); + qDebug(QString("unused objects: [%1] - %2"). + arg(anInfo.size()).arg(anInfo.join(";\t")).toStdString().c_str()); #endif // warn about the references remove, break the delete operation if the user chose it @@ -1465,14 +1600,16 @@ void XGUI_Workshop::cleanHistory() aMessageBox.setStandardButtons(QMessageBox::No | QMessageBox::Yes); aMessageBox.setDefaultButton(QMessageBox::No); - QString aText = QString(tr("Unused features are the following: %1.\nThese features will be deleted.\nWould you like to continue?") - .arg(anUnusedNames)); + const char* aKeyStr = "Unused features are the following: " + "%1.\nThese features will be deleted.\nWould you like to continue?"; + QString aText = QString(tr(aKeyStr).arg(anUnusedNames)); aMessageBox.setText(aText); if (aMessageBox.exec() == QMessageBox::No) return; // 1. start operation - aDescription += "by deleting of " + aDescription.arg(XGUI_Tools::unionOfObjectNames(anObjects, ", ")); + aDescription += "by deleting of " + + aDescription.arg(XGUI_Tools::unionOfObjectNames(anObjects, ", ")); ModuleBase_OperationAction* anOpAction = new ModuleBase_OperationAction(aDescription, module()); operationMgr()->startOperation(anOpAction); @@ -1610,15 +1747,18 @@ std::list toCurrentFeatures(const ObjectPtr& theObject) DocumentPtr aDocument = theObject->document(); std::list anAllFeatures = allFeatures(aDocument); // find the object iterator - std::list::iterator aObjectIt = std::find(anAllFeatures.begin(), anAllFeatures.end(), theObject); + std::list::iterator aObjectIt = + std::find(anAllFeatures.begin(), anAllFeatures.end(), theObject); if (aObjectIt == anAllFeatures.end()) return aResult; // find the current feature iterator - std::list::iterator aCurrentIt = std::find(anAllFeatures.begin(), anAllFeatures.end(), aDocument->currentFeature(true)); + std::list::iterator aCurrentIt = + std::find(anAllFeatures.begin(), anAllFeatures.end(), aDocument->currentFeature(true)); if (aCurrentIt == anAllFeatures.end()) return aResult; // check the right order - if (std::distance(aObjectIt, anAllFeatures.end()) <= std::distance(aCurrentIt, anAllFeatures.end())) + if (std::distance(aObjectIt, anAllFeatures.end()) <= + std::distance(aCurrentIt, anAllFeatures.end())) return aResult; // exclude the object std::advance(aObjectIt, 1); @@ -1649,14 +1789,14 @@ bool XGUI_Workshop::canMoveFeature() QObjectPtrList::const_iterator anIt = aObjects.begin(), aLast = aObjects.end(); for (; anIt != aLast && aCanMove; anIt++) { ObjectPtr aObject = *anIt; - // 1. Get features placed between selected and current in the document + // 1. Get features placed between selected and current in the document std::list aFeaturesBetween = toCurrentFeatures(aObject); // if aFeaturesBetween is empty it means wrong order or aObject is the current feature if (aFeaturesBetween.empty()) aCanMove = false; else { std::set aPlacedFeatures(aFeaturesBetween.begin(), aFeaturesBetween.end()); - // 2. Get all reference features to the selected object in the document + // 2. Get all reference features to the selected object in the document std::set aRefFeatures; ModuleBase_Tools::refsToFeatureInFeatureDocument(aObject, aRefFeatures); @@ -1728,7 +1868,7 @@ void XGUI_Workshop::changeColor(const QObjectPtrList& theObjects) AttributeIntArrayPtr aColorAttr; // 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 + // The objects are iterated until a first valid color is found std::vector aColor; foreach(ObjectPtr anObject, theObjects) { ResultPtr aResult = std::dynamic_pointer_cast(anObject); @@ -1753,7 +1893,7 @@ void XGUI_Workshop::changeColor(const QObjectPtrList& theObjects) return; if (!abortAllOperations()) - return; + return; // 2. show the dialog to change the value XGUI_ColorDialog* aDlg = new XGUI_ColorDialog(desktop()); aDlg->setColor(aColor); @@ -1774,10 +1914,12 @@ void XGUI_Workshop::changeColor(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); + ResultCompSolidPtr aCompsolidResult = + std::dynamic_pointer_cast(aResult); if (aCompsolidResult.get() != NULL) { // change colors for all sub-solids for(int i = 0; i < aCompsolidResult->numberOfSubs(); i++) { - setColor(aCompsolidResult->subResult(i), !isRandomColor ? aColorResult : aDlg->getRandomColor()); + setColor(aCompsolidResult->subResult(i), !isRandomColor ? aColorResult : + aDlg->getRandomColor()); } } setColor(aResult, !isRandomColor ? aColorResult : aDlg->getRandomColor()); @@ -1817,7 +1959,7 @@ 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 + // The objects are iterated until a first valid color is found double aDeflection = -1; foreach(ObjectPtr anObject, theObjects) { ResultPtr aResult = std::dynamic_pointer_cast(anObject); @@ -1841,7 +1983,7 @@ void XGUI_Workshop::changeDeflection(const QObjectPtrList& theObjects) return; if (!abortAllOperations()) - return; + return; // 2. show the dialog to change the value XGUI_DeflectionDialog* aDlg = new XGUI_DeflectionDialog(desktop()); aDlg->setDeflection(aDeflection); @@ -1860,7 +2002,8 @@ void XGUI_Workshop::changeDeflection(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); + ResultCompSolidPtr aCompsolidResult = + std::dynamic_pointer_cast(aResult); if (aCompsolidResult.get() != NULL) { // change colors for all sub-solids for(int i = 0; i < aCompsolidResult->numberOfSubs(); i++) { setDeflection(aCompsolidResult->subResult(i), aDeflection); @@ -1881,17 +2024,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)); } @@ -1908,20 +2041,9 @@ void XGUI_Workshop::showOnlyObjects(const QObjectPtrList& theList) // 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)); - } @@ -1944,7 +2066,7 @@ void XGUI_Workshop::displayDocumentResults(DocumentPtr theDoc) //************************************************************** void XGUI_Workshop::displayGroupResults(DocumentPtr theDoc, std::string theGroup) { - for (int i = 0; i < theDoc->size(theGroup); i++) + for (int i = 0; i < theDoc->size(theGroup); i++) theDoc->object(theGroup, i)->setDisplayed(true); //displayObject(theDoc->object(theGroup, i)); Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY)); @@ -1976,14 +2098,20 @@ void XGUI_Workshop::closeDocument() anOperation->abort(); anOperation = operationMgr()->currentOperation(); } - myDisplayer->closeLocalContexts(); + //myDisplayer->closeLocalContexts(); myDisplayer->eraseAll(); objectBrowser()->clearContent(); module()->closeDocument(); + // data model need not process the document's signals about objects modifications as + // the document is closed + //bool isBlocked = objectBrowser()->dataModel()->blockEventsProcessing(true); + SessionPtr aMgr = ModelAPI_Session::get(); aMgr->closeAll(); + + //objectBrowser()->dataModel()->blockEventsProcessing(isBlocked); } void XGUI_Workshop::addHistoryMenu(QObject* theObject, const char* theSignal, const char* theSlot) @@ -2039,16 +2167,20 @@ 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, - const std::string& theGroup, +void XGUI_Workshop::synchronizeGroupInViewer(const DocumentPtr& theDoc, + const std::string& theGroup, bool theUpdateViewer) { ObjectPtr aObj; @@ -2072,7 +2204,6 @@ void XGUI_Workshop::highlightResults(const QObjectPtrList& theObjects) { FeaturePtr aFeature; QObjectPtrList aSelList = theObjects; - std::list aResList; bool aHasHidden = false; foreach(ObjectPtr aObj, theObjects) { aFeature = std::dynamic_pointer_cast(aObj); @@ -2080,7 +2211,7 @@ void XGUI_Workshop::highlightResults(const QObjectPtrList& theObjects) std::list aResults; ModelAPI_Tools::allResults(aFeature, aResults); std::list >::const_iterator aIt; - for(aIt = aResList.cbegin(); aIt != aResList.cend(); aIt++) { + for(aIt = aResults.cbegin(); aIt != aResults.cend(); aIt++) { aHasHidden |= (*aIt)->isConcealed(); aSelList.append(*aIt); } @@ -2092,8 +2223,8 @@ void XGUI_Workshop::highlightResults(const QObjectPtrList& theObjects) objectBrowser()->setObjectsSelected(aSelList); objectBrowser()->blockSignals(aBlocked); } - if (aHasHidden) - QMessageBox::information(desktop(), tr("Find results"), + if (aHasHidden) + QMessageBox::information(desktop(), tr("Find results"), tr("Results not found"), QMessageBox::Ok); }