From 84225b751a787c62f42feb5a9a85353147e744c1 Mon Sep 17 00:00:00 2001 From: nds Date: Fri, 17 Apr 2015 10:44:11 +0300 Subject: [PATCH] Mirror for external objects. --- .../ModuleBase_WidgetMultiSelector.h | 2 +- src/PartSet/PartSet_WidgetMultiSelector.cpp | 103 +++++++++++++++++- src/PartSet/PartSet_WidgetMultiSelector.h | 20 +++- src/SketchPlugin/plugin-Sketch.xml | 7 +- 4 files changed, 122 insertions(+), 10 deletions(-) diff --git a/src/ModuleBase/ModuleBase_WidgetMultiSelector.h b/src/ModuleBase/ModuleBase_WidgetMultiSelector.h index 5f2bf3498..9fc28310e 100644 --- a/src/ModuleBase/ModuleBase_WidgetMultiSelector.h +++ b/src/ModuleBase/ModuleBase_WidgetMultiSelector.h @@ -115,7 +115,7 @@ protected slots: /// Start shape selection void activateShapeSelection(); - private: + protected: /// Update selection list void updateSelectionList(AttributeSelectionListPtr); diff --git a/src/PartSet/PartSet_WidgetMultiSelector.cpp b/src/PartSet/PartSet_WidgetMultiSelector.cpp index c59c6919e..1c046be78 100644 --- a/src/PartSet/PartSet_WidgetMultiSelector.cpp +++ b/src/PartSet/PartSet_WidgetMultiSelector.cpp @@ -11,6 +11,10 @@ #include #include +#include +#include +#include + #include #include @@ -21,11 +25,13 @@ #include +#include + PartSet_WidgetMultiSelector::PartSet_WidgetMultiSelector(QWidget* theParent, ModuleBase_IWorkshop* theWorkshop, const Config_WidgetAPI* theData, const std::string& theParentId) -: ModuleBase_WidgetShapeSelector(theParent, theWorkshop, theData, theParentId) +: ModuleBase_WidgetMultiSelector(theParent, theWorkshop, theData, theParentId) { myExternalObjectMgr = new PartSet_ExternalObjectsMgr(theData->getProperty("use_external"), false); } @@ -38,6 +44,99 @@ PartSet_WidgetMultiSelector::~PartSet_WidgetMultiSelector() //******************************************************************** void PartSet_WidgetMultiSelector::restoreAttributeValue(const bool theValid) { - ModuleBase_WidgetShapeSelector::restoreAttributeValue(theValid); + ModuleBase_WidgetMultiSelector::restoreAttributeValue(theValid); myExternalObjectMgr->removeExternal(sketch(), myFeature); } + +//******************************************************************** +bool PartSet_WidgetMultiSelector::setSelectionCustom(const ModuleBase_ViewerPrs& thePrs) +{ + TopoDS_Shape aShape = thePrs.shape(); + if ((myTypeCombo->count() > 1) && (!aShape.IsNull())) { + TopAbs_ShapeEnum aType = ModuleBase_Tools::shapeType(myTypeCombo->currentText()); + if (aShape.ShapeType() != aType) + return false; + } + ResultPtr aResult; + if (!thePrs.owner().IsNull()) { + ObjectPtr anObject = myWorkshop->selection()->getSelectableObject(thePrs.owner()); + aResult = std::dynamic_pointer_cast(anObject); + } + else { + aResult = std::dynamic_pointer_cast(thePrs.object()); + } + + + if (myFeature) { + // We can not select a result of our feature + const std::list& aResList = myFeature->results(); + std::list::const_iterator aIt; + bool isSkipSelf = false; + for (aIt = aResList.cbegin(); aIt != aResList.cend(); ++aIt) { + if ((*aIt) == aResult) { + isSkipSelf = true; + break; + } + } + if(isSkipSelf) + return false; + } + + GeomShapePtr aGShape = GeomShapePtr(); + const TopoDS_Shape& aTDSShape = thePrs.shape(); + // if only result is selected, an empty shape is set to the model + if (aTDSShape.IsNull()) { + //aSelectionListAttr->append(aResult, GeomShapePtr()); + } + else { + aGShape = std::shared_ptr(new GeomAPI_Shape()); + //GeomShapePtr aShape(new GeomAPI_Shape()); + aGShape->setImpl(new TopoDS_Shape(aTDSShape)); + // We can not select a result of our feature + if (aGShape->isEqual(aResult->shape())) { + //aSelectionListAttr->append(aResult, GeomShapePtr()); + aGShape = GeomShapePtr(); + } + else { + //aSelectionListAttr->append(aResult, aShape); + } + } + + setObject(aResult, aGShape); + return true; +} + +//******************************************************************** +bool PartSet_WidgetMultiSelector::setObject(const ObjectPtr& theSelectedObject, + const GeomShapePtr& theShape) +{ + ObjectPtr aSelectedObject = theSelectedObject; + GeomShapePtr aShape = theShape; + + FeaturePtr aSelectedFeature = ModelAPI_Feature::feature(aSelectedObject); + //if (aSelectedFeature == myFeature) // In order to avoid selection of the same object + // return false; + + // Do check using of external feature + std::shared_ptr aSPFeature = + std::dynamic_pointer_cast(aSelectedFeature); + + // Do check that we can use external feature + if ((aSPFeature.get() != NULL) && aSPFeature->isExternal() && (!myExternalObjectMgr->useExternal())) + return false; + + if (aSPFeature.get() == NULL && aShape.get() != NULL && !aShape->isNull() && myExternalObjectMgr->useExternal()) { + aSelectedObject = myExternalObjectMgr->externalObject(theSelectedObject, theShape, sketch()); + } + + + ResultPtr aResult = std::dynamic_pointer_cast(aSelectedObject); + + DataPtr aData = myFeature->data(); + AttributeSelectionListPtr aSelectionListAttr = + std::dynamic_pointer_cast(aData->attribute(attributeID())); + + aSelectionListAttr->append(aResult, aShape); + + return true; +} diff --git a/src/PartSet/PartSet_WidgetMultiSelector.h b/src/PartSet/PartSet_WidgetMultiSelector.h index db5d40859..0bb999f08 100644 --- a/src/PartSet/PartSet_WidgetMultiSelector.h +++ b/src/PartSet/PartSet_WidgetMultiSelector.h @@ -10,7 +10,8 @@ #include "PartSet.h" -#include +#include +#include #include @@ -18,10 +19,10 @@ class PartSet_ExternalObjectsMgr; /** * \ingroup Modules -* Customosation of ModuleBase_WidgetShapeSelector in order to provide -* working with sketch specific objects. +* Customosation of ModuleBase_WidgetMultiSelector in order to provide +* working with sketch specific objects and creation of external objects. */ -class PARTSET_EXPORT PartSet_WidgetMultiSelector: public ModuleBase_WidgetShapeSelector +class PARTSET_EXPORT PartSet_WidgetMultiSelector: public ModuleBase_WidgetMultiSelector { Q_OBJECT public: @@ -42,6 +43,10 @@ Q_OBJECT /// Retrurns installed sketcher CompositeFeaturePtr sketch() const { return mySketch; } + /// Fills the attribute with the value of the selected owner + /// \param theOwner a selected owner + virtual bool setSelectionCustom(const ModuleBase_ViewerPrs& thePrs); + protected: /// Creates a backup of the current values of the attribute /// It should be realized in the specific widget because of different @@ -49,6 +54,13 @@ protected: /// \param theValid a boolean flag, if restore happens for valid parameters void restoreAttributeValue(const bool theValid); + /// Store the values to the model attribute of the widget. It casts this attribute to + /// the specific type and set the given values + /// \param theSelectedObject an object + /// \param theShape a selected shape, which is used in the selection attribute + /// \return true if it is succeed + bool setObject(const ObjectPtr& theSelectedObject, const GeomShapePtr& theShape); + protected: PartSet_ExternalObjectsMgr* myExternalObjectMgr; /// Pointer to a sketch diff --git a/src/SketchPlugin/plugin-Sketch.xml b/src/SketchPlugin/plugin-Sketch.xml index 0e828bbee..87f4cf324 100644 --- a/src/SketchPlugin/plugin-Sketch.xml +++ b/src/SketchPlugin/plugin-Sketch.xml @@ -246,12 +246,13 @@ label="Mirror line" tooltip="Select mirror line" shape_types="edge"> - + type_choice="Edges" + use_external="true"> - + -- 2.39.2