The selection is obtained from the entity owner instead of getting it from the viewer context.
public:
/// Returns a list of viewer selected presentations
- /// \param theShapeTypeToSkip the shapes with this type will be skipped during the result list build
/// \return list of presentations
- virtual QList<ModuleBase_ViewerPrs> getSelected(int theShapeTypeToSkip = -1) const = 0;
+ virtual QList<ModuleBase_ViewerPrs> getSelected() const = 0;
/// Returns a list of viewer highlited presentations
- /// \param theShapeTypeToSkip the shapes with this type will be skipped during the result list build
/// \return list of presentations
- virtual QList<ModuleBase_ViewerPrs> getHighlighted(int theShapeTypeToSkip = -1) const = 0;
+ virtual QList<ModuleBase_ViewerPrs> getHighlighted() const = 0;
/**
* Returns list of features currently selected in object browser
return false;
}
+//********************************************************************
+void ModuleBase_WidgetMultiSelector::backupAttributeValue(const bool isBackup)
+{
+
+}
+
+//********************************************************************
+void ModuleBase_WidgetMultiSelector::setSelection(const Handle_SelectMgr_EntityOwner& theOwner)
+{
+
+}
+
//********************************************************************
QList<QWidget*> ModuleBase_WidgetMultiSelector::getControls() const
{
/// \return True in success
virtual bool storeValueCustom() const;
+ /// Creates a backup of the current values of the attribute
+ /// It should be realized in the specific widget because of different
+ /// parameters of the current attribute
+ /// \param isBackup a boolean flag, if true, store values from the attribute
+ /// to backup, otherwise set the backed up values to the attribute
+ virtual void backupAttributeValue(const bool isBackup);
+
+ /// Fills the attribute with the value of the selected owner
+ /// \param theOwner a selected owner
+ virtual void setSelection(const Handle_SelectMgr_EntityOwner& theOwner);
+
/// Set current shape type for selection
void setCurrentShapeType(const TopAbs_ShapeEnum theShapeType);
activateSelection(true);
}
+//********************************************************************
+void ModuleBase_WidgetShapeSelector::backupAttributeValue(const bool isBackup)
+{
+ DataPtr aData = myFeature->data();
+ AttributePtr anAttribute = myFeature->attribute(attributeID());
+
+ if (isBackup) {
+ myObject = getObject(anAttribute);
+ myShape = getShape();
+ myRefAttribute = NULL;
+ myIsObject = false;
+ AttributeRefAttrPtr aRefAttr = aData->refattr(attributeID());
+ if (aRefAttr) {
+ myIsObject = aRefAttr->isObject();
+ myRefAttribute = aRefAttr->attr();
+ }
+ }
+ else {
+ storeAttributeValues(myObject, myShape);
+ AttributeRefAttrPtr aRefAttr = aData->refattr(attributeID());
+ if (aRefAttr) {
+ if (myIsObject)
+ aRefAttr->setObject(myObject);
+ else
+ aRefAttr->setAttr(myRefAttribute);
+ }
+ }
+}
+
+//********************************************************************
+void ModuleBase_WidgetShapeSelector::setSelection(const Handle_SelectMgr_EntityOwner& theOwner)
+{
+
+}
+
//********************************************************************
void ModuleBase_WidgetShapeSelector::deactivate()
{
AttributePtr anAttribute = myFeature->attribute(attributeID());
// 1. make a backup of the previous attribute values
- ObjectPtr aPrevObject = getObject(anAttribute);
- GeomShapePtr aPrevShape = getShape();
- AttributePtr aPrevAttribute;
- bool aPrevIsObject = false;
- AttributeRefAttrPtr aRefAttr = aData->refattr(attributeID());
- if (aRefAttr) {
- aPrevIsObject = aRefAttr->isObject();
- aPrevAttribute = aRefAttr->attr();
- }
-
+ backupAttributeValue(true);
// 2. store the current values, disable the model's update
aData->blockSendAttributeUpdated(true);
- storeAttributeValues(theObj, theShape);
// 3. check the acceptability of the current values
std::list<ModelAPI_Validator*>::iterator aValidator = aValidators.begin();
}
// 4. if the values are not valid, restore the previous values to the attribute
- storeAttributeValues(aPrevObject, aPrevShape);
- if (aRefAttr) {
- if (aPrevIsObject)
- aRefAttr->setObject(aPrevObject);
- else
- aRefAttr->setAttr(aPrevAttribute);
- }
+ backupAttributeValue(false);
// 5. enable the model's update
aData->blockSendAttributeUpdated(false);
- //updateObject(myFeature);
- //return aValid;
-
- if (!aValid)
- return false;
-
-/* // Check the acceptability of the object as attribute
- std::list<ModelAPI_Validator*>::iterator aValidator = aValidators.begin();
- std::list<std::list<std::string> >::iterator aArgs = anArguments.begin();
- for (; aValidator != aValidators.end(); aValidator++, aArgs++) {
- const ModelAPI_RefAttrValidator* aAttrValidator =
- dynamic_cast<const ModelAPI_RefAttrValidator*>(*aValidator);
- if (aAttrValidator) {
- //if (!aAttrValidator->isValid(myFeature, *aArgs, theObj)) {
- // return false;
- //}
- }
- else {
- const ModelAPI_ShapeValidator* aShapeValidator =
- dynamic_cast<const ModelAPI_ShapeValidator*>(*aValidator);
- if (aShapeValidator) {
- DataPtr aData = myFeature->data();
- AttributeSelectionPtr aSelectAttr = aData->selection(attributeID());
- if (!aShapeValidator->isValid(myFeature, *aArgs, theObj, aSelectAttr, theShape)) {
- return false;
- }
- }
- }
- }*/
- return true;
+ return aValid;
}
/// The methiod called when widget is activated
virtual void activateCustom();
+ /// Creates a backup of the current values of the attribute
+ /// It should be realized in the specific widget because of different
+ /// parameters of the current attribute
+ /// \param isBackup a boolean flag, if true, store values from the attribute
+ /// to backup, otherwise set the backed up values to the attribute
+ virtual void backupAttributeValue(const bool isBackup);
+
+ /// Fills the attribute with the value of the selected owner
+ /// \param theOwner a selected owner
+ virtual void setSelection(const Handle_SelectMgr_EntityOwner& theOwner);
+
/// Computes and updates name of selected object in the widget
void updateSelectionName();
/// Active/inactive flag
bool myIsActive;
+
+ /// backup parameters of the model attribute. The class processes three types of attribute:
+ /// Reference, RefAttr and Selection. Depending on the attribute type, only the attribute parameter
+ /// values are reserved in the backup
+ /// An attribute object
+ ObjectPtr myObject;
+ /// An attribute shape
+ GeomShapePtr myShape;
+ /// A reference of the attribute
+ AttributePtr myRefAttribute;
+ /// A boolean value whether refAttr uses reference of object
+ bool myIsObject;
};
#endif
{
backupAttributeValue(true);
- setValue(theOwner);
+ setSelection(theOwner);
bool aValid = isValidAttribute();
+
backupAttributeValue(false);
return aValid;
const bool toActivate) const
{
ModuleBase_IViewer* aViewer = theWorkshop->viewer();
- /*
+/*
Handle(SelectMgr_Filter) aSelFilter = theWorkshop->validatorFilter();
if (toActivate)
aViewer->addSelectionFilter(aSelFilter);
else
- aViewer->removeSelectionFilter(aSelFilter);*/
-
+ aViewer->removeSelectionFilter(aSelFilter);
+*/
// apply filters loaded from the XML definition of the widget
ModuleBase_FilterFactory* aFactory = theWorkshop->selectionFilters();
SelectMgr_ListOfFilter aFactoryFilters;
/// parameters of the current attribute
/// \param isBackup a boolean flag, if true, store values from the attribute
/// to backup, otherwise set the backed up values to the attribute
- virtual void backupAttributeValue(const bool isBackup) {}//= 0;
+ virtual void backupAttributeValue(const bool isBackup) = 0;
/// Fills the attribute with the value of the selected owner
/// \param theOwner a selected owner
- virtual void setValue(const Handle_SelectMgr_EntityOwner& theOwner) {}//= 0;
+ virtual void setSelection(const Handle_SelectMgr_EntityOwner& theOwner) = 0;
/// Checks the current attibute in all attribute validators
// \return true if all validators return that the attribute is valid
#include <AIS_InteractiveContext.hxx>
#include <SelectMgr_Selection.hxx>
+#include <SelectMgr_EntityOwner.hxx>
+
#include <SelectBasics_SensitiveEntity.hxx>
#include <TColStd_ListIteratorOfListOfInteger.hxx>
+#include <StdSelect_BRepOwner.hxx>
#include <set>
{
}
-QList<ModuleBase_ViewerPrs> XGUI_Selection::getSelected(int theShapeTypeToSkip) const
+QList<ModuleBase_ViewerPrs> XGUI_Selection::getSelected() const
{
QList<long> aSelectedIds; // Remember of selected address in order to avoid duplicates
if (aContext->HasOpenedContext()) {
for (aContext->InitSelected(); aContext->MoreSelected(); aContext->NextSelected()) {
ModuleBase_ViewerPrs aPrs;
- Handle(AIS_InteractiveObject) anIO = aContext->SelectedInteractive();
- if (aSelectedIds.contains((long)anIO.Access()))
+ Handle(SelectMgr_EntityOwner) anOwner = aContext->SelectedOwner();
+
+ if (aSelectedIds.contains((long)anOwner.Access()))
continue;
-
- aSelectedIds.append((long)anIO.Access());
- aPrs.setInteractive(anIO);
+ aSelectedIds.append((long)anOwner.Access());
+
+ fillPresentation(aPrs, anOwner);
- ObjectPtr aFeature = aDisplayer->getObject(anIO);
- // we should not check the appearance of this feature because there can be some selected shapes
- // for one feature
- TopoDS_Shape aShape = aContext->SelectedShape();
- if (!aShape.IsNull() && (aShape.ShapeType() != theShapeTypeToSkip))
- aPrs.setShape(aShape);
- Handle(SelectMgr_EntityOwner) anOwner = aContext->SelectedOwner();
- aPrs.setOwner(anOwner);
- aPrs.setFeature(aFeature);
aPresentations.append(aPrs);
}
- } else {
+ }
+ /* else {
for (aContext->InitCurrent(); aContext->MoreCurrent(); aContext->NextCurrent()) {
ModuleBase_ViewerPrs aPrs;
Handle(AIS_InteractiveObject) anIO = aContext->Current();
aPrs.setFeature(aFeature);
aPresentations.append(aPrs);
}
- }
+ }*/
return aPresentations;
}
-QList<ModuleBase_ViewerPrs> XGUI_Selection::getHighlighted(int theShapeTypeToSkip) const
+void XGUI_Selection::fillPresentation(ModuleBase_ViewerPrs& thePrs,
+ const Handle(SelectMgr_EntityOwner)& theOwner) const
+{
+ thePrs.setOwner(theOwner);
+
+ Handle(AIS_InteractiveObject) anIO =
+ Handle(AIS_InteractiveObject)::DownCast(theOwner->Selectable());
+ thePrs.setInteractive(anIO);
+
+ // we should not check the appearance of this feature because there can be some selected shapes
+ // for one feature
+ Handle(StdSelect_BRepOwner) aBRO = Handle(StdSelect_BRepOwner)::DownCast(theOwner);
+ if( !aBRO.IsNull() ) {
+ // the located method is called in the context to obtain the shape by the SelectedShape() method,
+ // so the shape is located by the same rules
+ TopoDS_Shape aShape = aBRO->Shape().Located (aBRO->Location() * aBRO->Shape().Location());
+ if (!aShape.IsNull())
+ thePrs.setShape(aShape);
+ }
+
+ XGUI_Displayer* aDisplayer = myWorkshop->displayer();
+ ObjectPtr aFeature = aDisplayer->getObject(anIO);
+ thePrs.setFeature(aFeature);
+}
+
+QList<ModuleBase_ViewerPrs> XGUI_Selection::getHighlighted() const
{
QList<long> aSelectedIds; // Remember of selected address in order to avoid duplicates
QList<ModuleBase_ViewerPrs> aPresentations;
aPrs.setFeature(aResult);
if (aContext->HasOpenedContext()) {
TopoDS_Shape aShape = aContext->DetectedShape();
- if (!aShape.IsNull() && aShape.ShapeType() != theShapeTypeToSkip)
+ if (!aShape.IsNull())
aPrs.setShape(aShape);
}
aPresentations.push_back(aPrs);
#include <SelectMgr_IndexedMapOfOwner.hxx>
class XGUI_Workshop;
+class Handle_SelectMgr_EntityOwner;
/**
* \ingroup GUI
XGUI_Selection(XGUI_Workshop* theWorkshop);
/// Returns a list of viewer selected presentations
- /// \param theShapeTypeToSkip the shapes with this type will be skipped during the result list build
/// \return list of presentations
- virtual QList<ModuleBase_ViewerPrs> getSelected(int theShapeTypeToSkip = -1) const;
+ virtual QList<ModuleBase_ViewerPrs> getSelected() const;
+
+ /// Fills the viewer presentation parameters by the parameters from the owner
+ /// \param thePrs a container for selection
+ /// \param theOwner a selection owner
+ void fillPresentation(ModuleBase_ViewerPrs& thePrs, const Handle_SelectMgr_EntityOwner& theOwner) const;
/// Returns a list of viewer highlited presentations
- /// \param theShapeTypeToSkip the shapes with this type will be skipped during the result list build
/// \return list of presentations
- virtual QList<ModuleBase_ViewerPrs> getHighlighted(int theShapeTypeToSkip = -1) const;
+ virtual QList<ModuleBase_ViewerPrs> getHighlighted() const;
/**
* Returns list of currently selected objects in object browser