#include <ModelAPI_Validator.h>
#include <ModuleBase_Definitions.h>
+#include <ModuleBase_Tools.h>
+#include <ModuleBase_IWorkshop.h>
+#include <ModuleBase_ISelection.h>
+
#include <Config_WidgetAPI.h>
#include <PartSet_Tools.h>
#include <XGUI_Workshop.h>
+#include <QComboBox>
+
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);
}
//********************************************************************
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<ModelAPI_Result>(anObject);
+ }
+ else {
+ aResult = std::dynamic_pointer_cast<ModelAPI_Result>(thePrs.object());
+ }
+
+
+ if (myFeature) {
+ // We can not select a result of our feature
+ const std::list<ResultPtr>& aResList = myFeature->results();
+ std::list<ResultPtr>::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<GeomAPI_Shape>(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<SketchPlugin_Feature> aSPFeature =
+ std::dynamic_pointer_cast<SketchPlugin_Feature>(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<ModelAPI_Result>(aSelectedObject);
+
+ DataPtr aData = myFeature->data();
+ AttributeSelectionListPtr aSelectionListAttr =
+ std::dynamic_pointer_cast<ModelAPI_AttributeSelectionList>(aData->attribute(attributeID()));
+
+ aSelectionListAttr->append(aResult, aShape);
+
+ return true;
+}
#include "PartSet.h"
-#include <ModuleBase_WidgetShapeSelector.h>
+#include <ModuleBase_WidgetMultiSelector.h>
+#include <ModuleBase_ViewerPrs.h>
#include <ModelAPI_CompositeFeature.h>
/**
* \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:
/// 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
/// \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