X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_Workshop.cpp;h=5ed8b452746280f8ad6c2b3f5301cc0e4d51ba3a;hb=eb860f799eab680975365d8ce18cec6e04a6f391;hp=28b7699ec29957bd6f281521c2e315fbff1d1cb3;hpb=4bccf0ccd2f13dca7b9d16c59f427dea91c289fa;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_Workshop.cpp b/src/XGUI/XGUI_Workshop.cpp index 28b7699ec..5ed8b4527 100644 --- a/src/XGUI/XGUI_Workshop.cpp +++ b/src/XGUI/XGUI_Workshop.cpp @@ -66,6 +66,7 @@ #include #include #include +#include #include #include #include @@ -86,7 +87,11 @@ #include #include +#include +#include + #include +#include #include #include @@ -98,7 +103,6 @@ #include #include #include -#include #include #include #include @@ -167,6 +171,7 @@ 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 @@ -182,6 +187,8 @@ static QString MyFilter2(QObject::tr("CAD Builder files (*.cadbld)")); static QString MyExtension(".cadbld"); #endif +static QString MyImportPartFilter(QObject::tr("Part files (*.shaperpart);;All files (*.*)")); + //****************************************************** XGUI_Workshop::XGUI_Workshop(XGUI_SalomeConnector* theConnector) @@ -273,6 +280,9 @@ XGUI_Workshop::XGUI_Workshop(XGUI_SalomeConnector* theConnector) connect(myEventsListener, SIGNAL(errorOccurred(std::shared_ptr)), myErrorDlg, SLOT(addError(std::shared_ptr))); + 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); if (ModuleBase_Preferences::resourceMgr()->booleanValue("Viewer", "edge-selection", true)) @@ -329,6 +339,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 @@ -453,6 +472,19 @@ 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())); + salomeConnector()->addDesktopMenuSeparator("MEN_DESK_FILE"); + #else // File commands group AppElements_MenuGroupPanel* aGroup = myMainWindow->menuObject()->generalPage(); @@ -659,12 +691,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(); @@ -745,6 +776,12 @@ void XGUI_Workshop::fillPropertyPanel(ModuleBase_Operation* theOperation) #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); } //****************************************************** @@ -826,6 +863,11 @@ void XGUI_Workshop::onOperationStopped(ModuleBase_Operation* theOperation) } } activateObjectsSelection(anObjects); + + if (Config_PropManager::boolean("Windows", "use_hide_faces_panel")) { + if (!theOperation->isHideFacesVisible()) + myFacesPanel->hide(); + } } //****************************************************** @@ -1002,6 +1044,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(); @@ -1035,8 +1079,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(); @@ -1044,6 +1087,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(); } } @@ -1167,7 +1219,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(); @@ -1226,6 +1279,26 @@ void XGUI_Workshop::onWidgetObjectUpdated() myDisplayer->updateViewer(); } +//****************************************************** +void XGUI_Workshop::onImportPart() +{ + if (abortAllOperations()) { + ModuleBase_OperationFeature* anImportPartOp = dynamic_cast( + module()->createOperation(ExchangePlugin_ImportPart::ID())); + operationMgr()->startOperation(anImportPartOp); + } +} + +//****************************************************** +void XGUI_Workshop::onExportPart() +{ + if (abortAllOperations()) { + ModuleBase_OperationFeature* anExportPartOp = dynamic_cast( + module()->createOperation(ExchangePlugin_ExportPart::ID())); + operationMgr()->startOperation(anExportPartOp); + } +} + //****************************************************** ModuleBase_IModule* XGUI_Workshop::loadModule(const QString& theModule) { @@ -1426,14 +1499,14 @@ void XGUI_Workshop::createDockWidgets() 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); @@ -1509,7 +1582,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()"); } //****************************************************** @@ -1568,8 +1641,8 @@ 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 == "DEFLECTION_CMD") @@ -1781,6 +1854,7 @@ void XGUI_Workshop::deleteObjects() // allow the module to delete objects, do nothing if it has succeed if (aModule->deleteObjects()) { updateCommandStatus(); + myDisplayer->updateViewer(); return; } @@ -1826,7 +1900,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); @@ -1983,7 +2057,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 @@ -2026,7 +2100,7 @@ bool compareFeature(const FeaturePtr& theF1, const FeaturePtr& theF2) { DocumentPtr aDoc = theF1->document(); return aDoc->index(theF1) < aDoc->index(theF2); } -void XGUI_Workshop::moveObjects() +void XGUI_Workshop::moveObjects(const bool theSplit) { if (!abortAllOperations()) return; @@ -2043,7 +2117,7 @@ void XGUI_Workshop::moveObjects() if (!XGUI_Tools::canRemoveOrRename(desktop(), aFeatures)) return; - QString anActionId = "MOVE_CMD"; + QString anActionId = theSplit ? "MOVE_CMD" : "MOVE_SPLIT_CMD"; QString aDescription = contextMenuMgr()->action(anActionId)->text(); aMgr->startOperation(aDescription.toStdString()); @@ -2059,11 +2133,12 @@ void XGUI_Workshop::moveObjects() 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(); } //************************************************************** @@ -2263,9 +2338,28 @@ void setColor(ResultPtr theResult, const std::vector& theColor) aColorAttr->setValue(1, theColor[1]); aColorAttr->setValue(2, theColor[2]); } - static const Events_ID kRedisplayEvent = - Events_Loop::loop()->eventByName(EVENT_OBJECT_TO_REDISPLAY); - ModelAPI_EventCreator::get()->sendUpdated(theResult, kRedisplayEvent); +} + +//************************************************************** +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); + } + } + 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(); + } } //************************************************************** @@ -2280,6 +2374,8 @@ void XGUI_Workshop::changeColor(const QObjectPtrList& theObjects) ResultPtr aResult = std::dynamic_pointer_cast(anObject); if (aResult.get()) { ModelAPI_Tools::getColor(aResult, aColor); + if (aColor.empty()) + getDefaultColor(aResult, false, aColor); } else { // TODO: remove the obtaining a color from the AIS object @@ -2331,8 +2427,10 @@ void XGUI_Workshop::changeColor(const QObjectPtrList& theObjects) setColor(aResult, !isRandomColor ? aColorResult : aDlg->getRandomColor()); } } + Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY)); aMgr->finishOperation(); updateCommandStatus(); + myViewerProxy->update(); } //************************************************************** @@ -2342,11 +2440,9 @@ void setDeflection(ResultPtr theResult, const double theDeflection) return; AttributeDoublePtr aDeflectionAttr = theResult->data()->real(ModelAPI_Result::DEFLECTION_ID()); - if (aDeflectionAttr.get() != NULL) + if (aDeflectionAttr.get() != NULL) { aDeflectionAttr->setValue(theDeflection); - static const Events_ID kRedisplayEvent = - Events_Loop::loop()->eventByName(EVENT_OBJECT_TO_REDISPLAY); - ModelAPI_EventCreator::get()->sendUpdated(theResult, kRedisplayEvent); + } } //************************************************************** @@ -2356,11 +2452,9 @@ void setTransparency(ResultPtr theResult, double theTransparency) return; AttributeDoublePtr anAttribute = theResult->data()->real(ModelAPI_Result::TRANSPARENCY_ID()); - if (anAttribute.get() != NULL) + if (anAttribute.get() != NULL) { anAttribute->setValue(theTransparency); - static const Events_ID kRedisplayEvent = - Events_Loop::loop()->eventByName(EVENT_OBJECT_TO_REDISPLAY); - ModelAPI_EventCreator::get()->sendUpdated(theResult, kRedisplayEvent); + } } //************************************************************** @@ -2373,7 +2467,8 @@ 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++) { + std::list::iterator aRes; + for(aRes = allRes.begin(); aRes != allRes.end(); aRes++) { setTransparency(*aRes, theTransparency); } } @@ -2382,6 +2477,34 @@ void setTransparency(double theTransparency, const QObjectPtrList& theObjects) } } +//************************************************************** +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) { @@ -2393,6 +2516,8 @@ void XGUI_Workshop::changeDeflection(const QObjectPtrList& theObjects) ResultPtr aResult = std::dynamic_pointer_cast(anObject); if (aResult.get()) { aDeflection = ModelAPI_Tools::getDeflection(aResult); + if (aDeflection < 0) + aDeflection = getDefaultDeflection(aResult); } else { // TODO: remove the obtaining a property from the AIS object @@ -2441,10 +2566,17 @@ void XGUI_Workshop::changeDeflection(const QObjectPtrList& theObjects) 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) { @@ -2456,6 +2588,8 @@ void XGUI_Workshop::changeTransparency(const QObjectPtrList& theObjects) ResultPtr aResult = std::dynamic_pointer_cast(anObject); if (aResult.get()) { aCurrentValue = ModelAPI_Tools::getTransparency(aResult); + if (aCurrentValue < 0) + aCurrentValue = getDefaultTransparency(aResult); } if (aCurrentValue > 0) break; @@ -2502,7 +2636,11 @@ void XGUI_Workshop::onTransparencyValueChanged() 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); + + myViewerProxy->update(); }