From d2cb1dde43baaa219e72a0de8c60ae8f166445af Mon Sep 17 00:00:00 2001 From: vsv Date: Tue, 10 Jun 2014 10:01:57 +0400 Subject: [PATCH] Define selection type for selection control --- src/ConstructionPlugin/extrusion_widget.xml | 3 +- src/ModuleBase/CMakeLists.txt | 5 +- src/ModuleBase/ModuleBase_WidgetFactory.cpp | 4 +- ...dget.cpp => ModuleBase_WidgetSelector.cpp} | 85 +++++++++++++++---- ...orWidget.h => ModuleBase_WidgetSelector.h} | 20 +++-- src/XGUI/XGUI_Workshop.cpp | 8 +- 6 files changed, 95 insertions(+), 30 deletions(-) rename src/ModuleBase/{ModuleBase_SelectorWidget.cpp => ModuleBase_WidgetSelector.cpp} (69%) rename src/ModuleBase/{ModuleBase_SelectorWidget.h => ModuleBase_WidgetSelector.h} (77%) diff --git a/src/ConstructionPlugin/extrusion_widget.xml b/src/ConstructionPlugin/extrusion_widget.xml index f368a68cd..c0069ca67 100644 --- a/src/ConstructionPlugin/extrusion_widget.xml +++ b/src/ConstructionPlugin/extrusion_widget.xml @@ -3,7 +3,8 @@ label="Select a face" icon=":icons/sketch.png" tooltip="Select a face for extrusion" - activate="true" + activate="true" + shape_types="face" /> diff --git a/src/ModuleBase/CMakeLists.txt b/src/ModuleBase/CMakeLists.txt index 4593a68fe..b56c21791 100644 --- a/src/ModuleBase/CMakeLists.txt +++ b/src/ModuleBase/CMakeLists.txt @@ -12,7 +12,7 @@ SET(PROJECT_HEADERS ModuleBase_WidgetFactory.h ModuleBase_WidgetPoint2D.h ModuleBase_WidgetSwitch.h - ModuleBase_SelectorWidget.h + ModuleBase_WidgetSelector.h ModuleBase_IWorkshop.h ) @@ -26,7 +26,7 @@ SET(PROJECT_SOURCES ModuleBase_WidgetFactory.cpp ModuleBase_WidgetPoint2D.cpp ModuleBase_WidgetSwitch.cpp - ModuleBase_SelectorWidget.cpp + ModuleBase_WidgetSelector.cpp ) SET(PROJECT_LIBRARIES @@ -54,6 +54,7 @@ INCLUDE_DIRECTORIES( ${CMAKE_SOURCE_DIR}/src/Model ${CMAKE_SOURCE_DIR}/src/ModelAPI ${CMAKE_SOURCE_DIR}/src/GeomDataAPI + ${CMAKE_SOURCE_DIR}/src/GeomAPI ) ADD_DEFINITIONS(-DMODULEBASE_EXPORTS ${CAS_DEFINITIONS}) diff --git a/src/ModuleBase/ModuleBase_WidgetFactory.cpp b/src/ModuleBase/ModuleBase_WidgetFactory.cpp index 4c011a454..e52d5b2d4 100644 --- a/src/ModuleBase/ModuleBase_WidgetFactory.cpp +++ b/src/ModuleBase/ModuleBase_WidgetFactory.cpp @@ -11,7 +11,7 @@ #include #include #include -#include +#include #include #include @@ -191,7 +191,7 @@ QString ModuleBase_WidgetFactory::qs(const std::string& theStdString) const QWidget* ModuleBase_WidgetFactory::selectorControl(QWidget* theParent) { - ModuleBase_SelectorWidget* aSelector = new ModuleBase_SelectorWidget(theParent, myWorkshop, myWidgetApi); + ModuleBase_WidgetSelector* aSelector = new ModuleBase_WidgetSelector(theParent, myWorkshop, myWidgetApi); QObject::connect(aSelector, SIGNAL(valuesChanged()), myOperation, SLOT(storeCustomValue())); diff --git a/src/ModuleBase/ModuleBase_SelectorWidget.cpp b/src/ModuleBase/ModuleBase_WidgetSelector.cpp similarity index 69% rename from src/ModuleBase/ModuleBase_SelectorWidget.cpp rename to src/ModuleBase/ModuleBase_WidgetSelector.cpp index f3f19b152..df7b431fb 100644 --- a/src/ModuleBase/ModuleBase_SelectorWidget.cpp +++ b/src/ModuleBase/ModuleBase_WidgetSelector.cpp @@ -1,9 +1,9 @@ -// File: ModuleBase_SelectorWidget.h +// File: ModuleBase_WidgetSelector.h // Created: 2 June 2014 // Author: Vitaly Smetannikov -#include "ModuleBase_SelectorWidget.h" +#include "ModuleBase_WidgetSelector.h" #include "ModuleBase_IWorkshop.h" #include @@ -14,6 +14,11 @@ #include #include +#include + +#include +#include + #include #include #include @@ -24,7 +29,28 @@ #include -ModuleBase_SelectorWidget::ModuleBase_SelectorWidget(QWidget* theParent, +typedef QMap ShapeTypes; +static ShapeTypes MyShapeTypes; + +TopAbs_ShapeEnum ModuleBase_WidgetSelector::shapeType(const QString& theType) +{ + if (MyShapeTypes.count() == 0) { + MyShapeTypes["face"] = TopAbs_FACE; + MyShapeTypes["vertex"] = TopAbs_VERTEX; + MyShapeTypes["wire"] = TopAbs_WIRE; + MyShapeTypes["edge"] = TopAbs_EDGE; + MyShapeTypes["shell"] = TopAbs_SHELL; + MyShapeTypes["solid"] = TopAbs_SOLID; + } + if (MyShapeTypes.contains(theType)) + return MyShapeTypes[theType]; + throw std::invalid_argument("Shape type defined in XML is not implemented!"); +} + + + + +ModuleBase_WidgetSelector::ModuleBase_WidgetSelector(QWidget* theParent, ModuleBase_IWorkshop* theWorkshop, const Config_WidgetAPI* theData) : ModuleBase_ModelWidget(theParent, theData), myWorkshop(theWorkshop), myActivateOnStart(false) @@ -60,15 +86,18 @@ ModuleBase_SelectorWidget::ModuleBase_SelectorWidget(QWidget* theParent, if (!aActivateTxt.isNull()) { myActivateOnStart = (aActivateTxt == "true"); } + + std::string aTypes = theData->getProperty("shape_types"); + myShapeTypes = QString(aTypes.c_str()).split(','); } //******************************************************************** -ModuleBase_SelectorWidget::~ModuleBase_SelectorWidget() +ModuleBase_WidgetSelector::~ModuleBase_WidgetSelector() { } //******************************************************************** -bool ModuleBase_SelectorWidget::storeValue(FeaturePtr theFeature) const +bool ModuleBase_WidgetSelector::storeValue(FeaturePtr theFeature) const { DataPtr aData = theFeature->data(); boost::shared_ptr aRef = @@ -83,7 +112,7 @@ bool ModuleBase_SelectorWidget::storeValue(FeaturePtr theFeature) const } //******************************************************************** -bool ModuleBase_SelectorWidget::restoreValue(FeaturePtr theFeature) +bool ModuleBase_WidgetSelector::restoreValue(FeaturePtr theFeature) { DataPtr aData = theFeature->data(); boost::shared_ptr aRef = aData->reference(attributeID()); @@ -97,7 +126,7 @@ bool ModuleBase_SelectorWidget::restoreValue(FeaturePtr theFeature) } //******************************************************************** -QList ModuleBase_SelectorWidget::getControls() const +QList ModuleBase_WidgetSelector::getControls() const { QList aControls; aControls.append(myLabel); @@ -107,7 +136,7 @@ QList ModuleBase_SelectorWidget::getControls() const } //******************************************************************** -void ModuleBase_SelectorWidget::onSelectionChanged() +void ModuleBase_WidgetSelector::onSelectionChanged() { QList aFeatures = myWorkshop->selectedFeatures(); if (aFeatures.size() > 0) { @@ -117,10 +146,8 @@ void ModuleBase_SelectorWidget::onSelectionChanged() if (mySelectedFeature && aFeature && mySelectedFeature->isSame(aFeature)) return; - // TODO: Check that the selection corresponds to selection type - // TODO: Use the feature kind definition like SKETCH_KIND instead of the direct text - if (aFeature->getKind().compare("Sketch") != 0) - return; + // Check that the selection corresponds to selection type + if (!isAccepted(aFeature)) return; mySelectedFeature = aFeature; if (mySelectedFeature) { @@ -135,7 +162,31 @@ void ModuleBase_SelectorWidget::onSelectionChanged() } //******************************************************************** -void ModuleBase_SelectorWidget::updateSelectionName() +bool ModuleBase_WidgetSelector::isAccepted(const FeaturePtr theFeature) const +{ + boost::shared_ptr aShapePtr = theFeature->data()->shape(); + if (!aShapePtr) return false; + TopoDS_Shape aShape = aShapePtr->impl(); + if (aShape.IsNull()) return false; + + TopAbs_ShapeEnum aShapeType = aShape.ShapeType(); + if (aShapeType == TopAbs_COMPOUND) { + foreach (QString aType, myShapeTypes) { + TopExp_Explorer aEx(aShape, shapeType(aType)); + if (aEx.More()) + return true; + } + } else { + foreach (QString aType, myShapeTypes) { + if (shapeType(aType) == aShapeType) + return true; + } + } + return false; +} + +//******************************************************************** +void ModuleBase_WidgetSelector::updateSelectionName() { if (mySelectedFeature) { std::string aName; @@ -150,7 +201,7 @@ void ModuleBase_SelectorWidget::updateSelectionName() } //******************************************************************** -bool ModuleBase_SelectorWidget::eventFilter(QObject* theObj, QEvent* theEvent) +bool ModuleBase_WidgetSelector::eventFilter(QObject* theObj, QEvent* theEvent) { if (theObj == myTextLine) { if (theEvent->type() == QEvent::Polish) { @@ -162,7 +213,7 @@ bool ModuleBase_SelectorWidget::eventFilter(QObject* theObj, QEvent* theEvent) } //******************************************************************** -void ModuleBase_SelectorWidget::enableOthersControls(bool toEnable) const +void ModuleBase_WidgetSelector::enableOthersControls(bool toEnable) const { QWidget* aParent = myContainer->parentWidget(); QList aChldList = aParent->findChildren(); @@ -173,7 +224,7 @@ void ModuleBase_SelectorWidget::enableOthersControls(bool toEnable) const } //******************************************************************** -void ModuleBase_SelectorWidget::activateSelection(bool toActivate) +void ModuleBase_WidgetSelector::activateSelection(bool toActivate) { enableOthersControls(!toActivate); myTextLine->setEnabled(toActivate); @@ -187,7 +238,7 @@ void ModuleBase_SelectorWidget::activateSelection(bool toActivate) } //******************************************************************** -void ModuleBase_SelectorWidget::raisePanel() const +void ModuleBase_WidgetSelector::raisePanel() const { QWidget* aParent = myContainer->parentWidget(); QWidget* aLastPanel = 0; diff --git a/src/ModuleBase/ModuleBase_SelectorWidget.h b/src/ModuleBase/ModuleBase_WidgetSelector.h similarity index 77% rename from src/ModuleBase/ModuleBase_SelectorWidget.h rename to src/ModuleBase/ModuleBase_WidgetSelector.h index 48e3984ff..0d411f3b7 100644 --- a/src/ModuleBase/ModuleBase_SelectorWidget.h +++ b/src/ModuleBase/ModuleBase_WidgetSelector.h @@ -1,15 +1,19 @@ -// File: ModuleBase_SelectorWidget.h +// File: ModuleBase_WidgetSelector.h // Created: 2 June 2014 // Author: Vitaly Smetannikov -#ifndef ModuleBase_SelectorWidget_H -#define ModuleBase_SelectorWidget_H +#ifndef ModuleBase_WidgetSelector_H +#define ModuleBase_WidgetSelector_H #include "ModuleBase.h" #include "ModuleBase_ModelWidget.h" #include +#include + +#include + class Config_WidgetAPI; class QWidget; @@ -18,15 +22,15 @@ class QLineEdit; class QToolButton; class ModuleBase_IWorkshop; -class MODULEBASE_EXPORT ModuleBase_SelectorWidget: public ModuleBase_ModelWidget +class MODULEBASE_EXPORT ModuleBase_WidgetSelector: public ModuleBase_ModelWidget { Q_OBJECT public: - ModuleBase_SelectorWidget(QWidget* theParent, + ModuleBase_WidgetSelector(QWidget* theParent, ModuleBase_IWorkshop* theWorkshop, const Config_WidgetAPI* theData); - virtual ~ModuleBase_SelectorWidget(); + virtual ~ModuleBase_WidgetSelector(); /// Saves the internal parameters to the given feature /// \param theFeature a model feature to be changed @@ -62,6 +66,9 @@ private: void enableOthersControls(bool toEnable) const; void updateSelectionName(); void raisePanel() const; + bool isAccepted(const FeaturePtr theFeature) const; + + static TopAbs_ShapeEnum shapeType(const QString& theType); QWidget* myContainer; QLabel* myLabel; @@ -73,6 +80,7 @@ private: bool myActivateOnStart; FeaturePtr mySelectedFeature; + QStringList myShapeTypes; }; #endif \ No newline at end of file diff --git a/src/XGUI/XGUI_Workshop.cpp b/src/XGUI/XGUI_Workshop.cpp index f038d3133..3ff0a0046 100644 --- a/src/XGUI/XGUI_Workshop.cpp +++ b/src/XGUI/XGUI_Workshop.cpp @@ -269,8 +269,12 @@ void XGUI_Workshop::processEvent(const Events_Message* theMessage) std::set::const_iterator aIt; for (aIt = aFeatures.begin(); aIt != aFeatures.end(); ++aIt) { FeaturePtr aFeature = (*aIt); - if (aFeature->getKind() != PARTSET_PART_KIND) - myDisplayer->redisplay(aFeature, false); + if (aFeature->getKind() != PARTSET_PART_KIND) { + if (myDisplayer->isVisible(aFeature)) + myDisplayer->redisplay(aFeature, false); + else + myDisplayer->display(aFeature, false); + } } myDisplayer->updateViewer(); } -- 2.39.2