#include <ModelAPI_ResultConstruction.h>
+#include <GeomValidators_Tools.h>
+
#include <TopoDS_Iterator.hxx>
ModuleBase_WidgetSelector::ModuleBase_WidgetSelector(QWidget* theParent,
{
}
-//TODO: nds stabilization hotfix
-void ModuleBase_WidgetSelector::disconnectSignals()
-{
- disconnect(myWorkshop, SIGNAL(selectionChanged()), this, SLOT(onSelectionChanged()));
-}
-
//********************************************************************
void ModuleBase_WidgetSelector::getGeomSelection(const ModuleBase_ViewerPrs& thePrs,
ObjectPtr& theObject,
QList<ModuleBase_ViewerPrs> aSelected = getFilteredSelected();
- bool isDone = setSelection(aSelected, false);
+ bool isDone = setSelection(aSelected, true/*false*/);
+ // "false" flag should be used here, it connects to the #26658 OCC bug, when the user click in
+ // the same place repeatedly without mouse moved. In the case validation by filters is not
+ // perfromed, so an invalid object is selected. E.g. distance constraint, selection of a point.
+ // the 3rd click in the same point allow using this point.
emit valuesChanged();
// 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.
bool aValid = false;
GeomShapePtr aShape = theShape;
+
+ QIntList aShapeTypes = getShapeTypes();
+ if (aShapeTypes.empty()) {
+ aValid = true;
+ return aValid;
+ }
+ // when the SHAPE type is provided by XML, the hole result shape can be selected.
+ if (!aShape.get() && aShapeTypes.contains(TopAbs_SHAPE)) {
+ aValid = true;
+ return aValid;
+ }
+
if (!aShape.get() && theResult.get()) {
if (theResult.get())
aShape = theResult->shape();
// for compounds check sub-shapes: it may be compound of needed type:
// Booleans may produce compounds of Solids
if (aShapeType == TopAbs_COMPOUND) {
- for(TopoDS_Iterator aSubs(aTopoShape); aSubs.More(); aSubs.Next()) {
- if (!aSubs.Value().IsNull()) {
- TopAbs_ShapeEnum aSubType = aSubs.Value().ShapeType();
- if (aSubType == TopAbs_COMPOUND) { // compound of compound(s)
- aShapeType = TopAbs_COMPOUND;
- break;
- }
- if (aShapeType == TopAbs_COMPOUND) {
- aShapeType = aSubType;
- } else if (aShapeType != aSubType) { // compound of shapes of different types
- aShapeType = TopAbs_COMPOUND;
- break;
- }
- }
- }
+ aShapeType = GeomValidators_Tools::getCompoundSubType(aTopoShape);
}
}
- QIntList aShapeTypes = getShapeTypes();
QIntList::const_iterator anIt = aShapeTypes.begin(), aLast = aShapeTypes.end();
for (; anIt != aLast; anIt++) {
if (aShapeType == *anIt)