The reason is the plane deselection in the extrusion operation.
This leads to a modification in selection behavior e.g for sketch parallel constraint. After the first line is selected, the second control gets the focus, it is empty, so, the selection in the viewer is also empty. So, the first object is not selected anymore and the user can not see it.
#include "ModuleBase.h"
#include "ModuleBase_Definitions.h"
#include <ModuleBase_FilterValidated.h>
+#include <ModuleBase_ViewerPrs.h>
#include <ModelAPI_Object.h>
#include <GeomAPI_AISObject.h>
//! Select features clearing previous selection.
//! If the list is empty then selection will be cleared
- virtual void setSelected(const QObjectPtrList& theFeatures) = 0;
+ virtual void setSelected(const QList<ModuleBase_ViewerPrs>& theValues) = 0;
signals:
/// Signal selection chaged.
ModuleBase_WidgetMultiSelector::~ModuleBase_WidgetMultiSelector()
{
activateShapeSelection(false);
+ activateFilters(myWorkshop, false);
}
//********************************************************************
Qt::UniqueConnection);
activateShapeSelection(true);
-
- QObjectPtrList anObjects;
+ QList<ModuleBase_ViewerPrs> aSelected;
// Restore selection in the viewer by the attribute selection list
if(myFeature) {
DataPtr aData = myFeature->data();
for (int i = 0; i < aListAttr->size(); i++) {
AttributeSelectionPtr anAttr = aListAttr->value(i);
ResultPtr anObject = anAttr->context();
- if (anObject.get())
- anObjects.append(anObject);
+ if (anObject.get()) {
+ TopoDS_Shape aShape;
+ std::shared_ptr<GeomAPI_Shape> aShapePtr = anAttr->value();
+ if (aShapePtr.get()) {
+ aShape = aShapePtr->impl<TopoDS_Shape>();
+ }
+ aSelected.append(ModuleBase_ViewerPrs(anObject, aShape, NULL));
+ }
}
}
}
- myWorkshop->setSelected(anObjects);
+ myWorkshop->setSelected(aSelected);
+
+ activateFilters(myWorkshop, true);
}
//********************************************************************
{
disconnect(myWorkshop, SIGNAL(selectionChanged()), this, SLOT(onSelectionChanged()));
activateShapeSelection(false);
+ activateFilters(myWorkshop, false);
}
//********************************************************************
void ModuleBase_WidgetMultiSelector::onSelectionTypeChanged()
{
activateShapeSelection(true);
- QObjectPtrList anEmptyList;
+ activateFilters(myWorkshop, true);
+ QList<ModuleBase_ViewerPrs> anEmptyList;
// This method will call Selection changed event which will call onSelectionChanged
// To clear mySelection, myListControl and storeValue()
// So, we don't need to call it
TopAbs_ShapeEnum aRefType = ModuleBase_Tools::shapeType(aShapeTypeName);
if(aRefType == theShapeType && idx != myTypeCombo->currentIndex()) {
activateShapeSelection(false);
+ activateFilters(myWorkshop, false);
bool isBlocked = myTypeCombo->blockSignals(true);
myTypeCombo->setCurrentIndex(idx);
myTypeCombo->blockSignals(isBlocked);
+
activateShapeSelection(true);
+ activateFilters(myWorkshop, true);
break;
}
}
} else {
myWorkshop->deactivateSubShapesSelection();
}
-
- activateFilters(myWorkshop, isActivated);
}
//********************************************************************
const Config_WidgetAPI* theData,
const std::string& theParentId)
: ModuleBase_WidgetValidated(theParent, theData, theParentId),
- myWorkshop(theWorkshop), myIsActive(false)
+ myWorkshop(theWorkshop)
{
QFormLayout* aLayout = new QFormLayout(this);
ModuleBase_Tools::adjustMargins(aLayout);
ModuleBase_WidgetShapeSelector::~ModuleBase_WidgetShapeSelector()
{
activateSelection(false);
+ activateFilters(myWorkshop, false);
}
//********************************************************************
//********************************************************************
void ModuleBase_WidgetShapeSelector::onSelectionChanged()
{
- // In order to make reselection possible
- // TODO: check with MPV clearAttribute();
+ // In order to make reselection possible, set empty object and shape should be done
+ setObject(ObjectPtr(), std::shared_ptr<GeomAPI_Shape>(new GeomAPI_Shape()));
+ bool aHasObject = false;
QList<ModuleBase_ViewerPrs> aSelectedPrs = getSelectedEntitiesOrObjects(myWorkshop->selection());
- if (aSelectedPrs.empty())
- return;
- ModuleBase_ViewerPrs aPrs = aSelectedPrs.first();
- if (aPrs.isEmpty() || !isValidSelection(aPrs))
- return;
-
- if (!aPrs.isEmpty() && isValidSelection(aPrs)) {
- setSelectionCustom(aPrs);
- // the updateObject method should be called to flush the updated sigal. The workshop listens it,
- // calls validators for the feature and, as a result, updates the Apply button state.
- updateObject(myFeature);
- //if (theObj) {
- // raisePanel();
- //}
- //updateSelectionName();
- //emit valuesChanged();
- emit focusOutWidget(this);
+ if (!aSelectedPrs.empty()) {
+ ModuleBase_ViewerPrs aPrs = aSelectedPrs.first();
+ if (!aPrs.isEmpty() && isValidSelection(aPrs)) {
+ setSelectionCustom(aPrs);
+ aHasObject = true;
+ }
}
-
+ // the updateObject method should be called to flush the updated sigal. The workshop listens it,
+ // calls validators for the feature and, as a result, updates the Apply button state.
+ updateObject(myFeature);
+ // the widget loses the focus only if the selected object is set
+ if (aHasObject)
+ emit focusOutWidget(this);
}
-//********************************************************************
-//bool ModuleBase_WidgetShapeSelector::acceptObjectShape(const ObjectPtr theResult) const
-//{
-// ResultPtr aResult = std::dynamic_pointer_cast<ModelAPI_Result>(theResult);
-//
-// // Check that the shape of necessary type
-// std::shared_ptr<GeomAPI_Shape> aShapePtr = ModelAPI_Tools::shape(aResult);
-// if (!aShapePtr)
-// return false;
-// TopoDS_Shape aShape = aShapePtr->impl<TopoDS_Shape>();
-// 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;
-//}
-
//********************************************************************
bool ModuleBase_WidgetShapeSelector::acceptSubShape(std::shared_ptr<GeomAPI_Shape> theShape) const
{
myTextLine->setText(QString::fromStdString(aName.str()));
}
}
- else if (myIsActive) {
+ else {
myTextLine->setText("");
}
}
//********************************************************************
void ModuleBase_WidgetShapeSelector::activateSelection(bool toActivate)
{
- if (myIsActive == toActivate)
- return;
- myIsActive = toActivate;
updateSelectionName();
- if (myIsActive) {
+ if (toActivate) {
QIntList aList;
foreach (QString aType, myShapeTypes) {
aList.append(ModuleBase_Tools::shapeType(aType));
} else {
myWorkshop->deactivateSubShapesSelection();
}
-
- activateFilters(myWorkshop, myIsActive);
}
//********************************************************************
{
connect(myWorkshop, SIGNAL(selectionChanged()), this, SLOT(onSelectionChanged()));
activateSelection(true);
+ // Restore selection in the viewer by the attribute selection list
+ QList<ModuleBase_ViewerPrs> aSelected;
+ if(myFeature) {
+ DataPtr aData = myFeature->data();
+ AttributePtr anAttribute = myFeature->attribute(attributeID());
+
+ ObjectPtr anObject = GeomValidators_Tools::getObject(anAttribute);
+ TopoDS_Shape aShape;
+ std::shared_ptr<GeomAPI_Shape> aShapePtr = getShape();
+ if (aShapePtr.get()) {
+ aShape = aShapePtr->impl<TopoDS_Shape>();
+ }
+ ModuleBase_ViewerPrs aPrs(anObject, aShape, NULL);
+ aSelected.append(aPrs);
+ }
+ myWorkshop->setSelected(aSelected);
+
+ activateFilters(myWorkshop, true);
}
//********************************************************************
void ModuleBase_WidgetShapeSelector::deactivate()
{
activateSelection(false);
+ activateFilters(myWorkshop, false);
disconnect(myWorkshop, SIGNAL(selectionChanged()), this, SLOT(onSelectionChanged()));
}
/// List of accepting shapes types
QStringList myShapeTypes;
- /// 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
// test case is - preselection for distance operation, which contains two points selected on lines
if (aPntAttr)
aRefAttr->setAttr(aPntAttr);
- else if (theSelectedObject)
+ else
aRefAttr->setObject(theSelectedObject);
}
}
updateViewer();
}
+void XGUI_Displayer::setSelected(const QList<ModuleBase_ViewerPrs>& theValues, bool isUpdateViewer)
+{
+ Handle(AIS_InteractiveContext) aContext = AISContext();
+ if (aContext.IsNull())
+ return;
+ if (aContext->HasOpenedContext()) {
+ aContext->UnhilightSelected();
+ aContext->ClearSelected();
+ //if (aSelected.size() > 0) {
+ foreach (ModuleBase_ViewerPrs aPrs, theValues) {
+ // if (isValidSelection(aPrs)) {
+ //foreach(ObjectPtr aResult, theResults) {
+ ObjectPtr anObject = aPrs.object();
+ ResultPtr aResult = std::dynamic_pointer_cast<ModelAPI_Result>(anObject);
+ if (aResult.get() && isVisible(aResult)) {
+ AISObjectPtr anObj = myResult2AISObjectMap[aResult];
+ Handle(AIS_InteractiveObject) anAIS = anObj->impl<Handle(AIS_InteractiveObject)>();
+ if (!anAIS.IsNull()) {
+ const TopoDS_Shape& aShape = aPrs.shape();
+ if (!aShape.IsNull()) {
+ aContext->AddOrRemoveSelected(aShape, false);
+ }
+ else {
+ // The methods are replaced in order to provide multi-selection, e.g. restore selection
+ // by activating multi selector widget. It also gives an advantage that the multi
+ // selection in OB gives multi-selection in the viewer
+ //aContext->SetSelected(anAIS, false);
+ // The selection in the context was cleared, so the method sets the objects are selected
+ aContext->AddOrRemoveSelected(anAIS, false);
+ }
+ }
+ }
+ }
+ } else {
+ aContext->UnhilightCurrents();
+ aContext->ClearCurrents();
+ //foreach(ObjectPtr aResult, theResults) {
+ foreach (ModuleBase_ViewerPrs aPrs, theValues) {
+ ObjectPtr anObject = aPrs.object();
+ ResultPtr aResult = std::dynamic_pointer_cast<ModelAPI_Result>(anObject);
+ if (aResult.get() && isVisible(aResult)) {
+ AISObjectPtr anObj = myResult2AISObjectMap[aResult];
+ Handle(AIS_InteractiveObject) anAIS = anObj->impl<Handle(AIS_InteractiveObject)>();
+ if (!anAIS.IsNull())
+ aContext->SetCurrentObject(anAIS, false);
+ }
+ }
+ }
+ if (isUpdateViewer)
+ updateViewer();
+}
void XGUI_Displayer::clearSelected()
{
*/
void setSelected(const QObjectPtrList& theFeatures, bool isUpdateViewer = true);
+ void setSelected(const QList<ModuleBase_ViewerPrs>& theValues, bool isUpdateViewer = true);
+
/// Unselect all objects
void clearSelected();
return aDisp->getObject(theAIS);
}
-void XGUI_ModuleConnector::setSelected(const QObjectPtrList& theFeatures)
+void XGUI_ModuleConnector::setSelected(const QList<ModuleBase_ViewerPrs>& theValues)
{
XGUI_Displayer* aDisp = myWorkshop->displayer();
- if (theFeatures.isEmpty()) {
+ if (theValues.isEmpty()) {
myWorkshop->selector()->clearSelection();
} else {
- aDisp->setSelected(theFeatures);
+ aDisp->setSelected(theValues);
}
}
//! Select features clearing previous selection.
//! If the list is empty then selection will be cleared
- virtual void setSelected(const QObjectPtrList& theFeatures);
+ virtual void setSelected(const QList<ModuleBase_ViewerPrs>& theValues);
//! Returns workshop
XGUI_Workshop* workshop() const { return myWorkshop; }