#include <list>
#include <string>
-typedef QMap<QString, TopAbs_ShapeEnum> ShapeTypes;
-static ShapeTypes MyShapeTypes;
-
-TopAbs_ShapeEnum ModuleBase_WidgetShapeSelector::shapeType(const QString& theType)
-{
- if (MyShapeTypes.count() == 0) {
- MyShapeTypes["face"] = TopAbs_FACE;
- MyShapeTypes["faces"] = TopAbs_FACE;
- MyShapeTypes["vertex"] = TopAbs_VERTEX;
- MyShapeTypes["vertices"] = TopAbs_VERTEX;
- MyShapeTypes["wire"] = TopAbs_WIRE;
- MyShapeTypes["edge"] = TopAbs_EDGE;
- MyShapeTypes["edges"] = TopAbs_EDGE;
- MyShapeTypes["shell"] = TopAbs_SHELL;
- MyShapeTypes["solid"] = TopAbs_SOLID;
- MyShapeTypes["solids"] = TopAbs_SOLID;
- }
- QString aType = theType.toLower();
- if (MyShapeTypes.contains(aType))
- return MyShapeTypes[aType];
- Events_Error::send("Shape type defined in XML is not implemented!");
- return TopAbs_SHAPE;
-}
ModuleBase_WidgetShapeSelector::ModuleBase_WidgetShapeSelector(QWidget* theParent,
ModuleBase_IWorkshop* theWorkshop,
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);
}
//********************************************************************
} else {
AttributeSelectionPtr aSelectAttr = aData->selection(attributeID());
ResultPtr aResult = std::dynamic_pointer_cast<ModelAPI_Result>(theSelectedObject);
- if (aSelectAttr) {
+ if (aSelectAttr.get() != NULL) {
aSelectAttr->setValue(aResult, theShape);
isChanged = true;
}
return isChanged;
}
+//********************************************************************
+QList<ModuleBase_ViewerPrs> ModuleBase_WidgetShapeSelector::getCurrentSelection() const
+{
+ 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);
+ }
+ return aSelected;
+}
+
//********************************************************************
void ModuleBase_WidgetShapeSelector::clearAttribute()
{
//********************************************************************
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
{
TopoDS_Shape aShape = theShape->impl<TopoDS_Shape>();
foreach (QString aType, myShapeTypes) {
- if (aShape.ShapeType() == shapeType(aType))
+ if (aShape.ShapeType() == ModuleBase_Tools::shapeType(aType))
return true;
}
return false;
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(shapeType(aType));
+ aList.append(ModuleBase_Tools::shapeType(aType));
}
myWorkshop->activateSubShapesSelection(aList);
} 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
+ myWorkshop->setSelected(getCurrentSelection());
+
+ activateFilters(myWorkshop, true);
}
//********************************************************************
void ModuleBase_WidgetShapeSelector::deactivate()
{
activateSelection(false);
+ activateFilters(myWorkshop, false);
disconnect(myWorkshop, SIGNAL(selectionChanged()), this, SLOT(onSelectionChanged()));
}