#include <ModuleBase_Tools.h>
#include <ModuleBase_IModule.h>
#include <ModuleBase_ViewerPrs.h>
+#include <ModuleBase_Preferences.h>
#include <GeomAPI_Shape.h>
#include <GeomAPI_IPresentable.h>
#include <GeomAPI_ICustomPrs.h>
+#include <SUIT_ResourceMgr.h>
+
#include <AIS_InteractiveContext.hxx>
#include <AIS_LocalContext.hxx>
#include <AIS_ListOfInteractive.hxx>
//#define DEBUG_OCCT_SHAPE_SELECTION
+#define WORKAROUND_UNTIL_27523_IS_FIXED
+
void displayedObjects(const Handle(AIS_InteractiveContext)& theAIS, AIS_ListOfInteractive& theList)
{
// Get from null point
bool isShading = false;
if (aPrs.get() != NULL) {
anAIS = aPrs->getAISObject(anAIS);
+ if (anAIS.get()) {
+ // correct deviation coefficient for
+ Handle(AIS_InteractiveObject) anAISPrs = anAIS->impl<Handle(AIS_InteractiveObject)>();
+ if (!anAISPrs.IsNull()) {
+ Handle(AIS_Shape) aShapePrs = Handle(AIS_Shape)::DownCast(anAISPrs);
+ if (!aShapePrs.IsNull()) {
+ TopoDS_Shape aShape = aShapePrs->Shape();
+ if (!aShape.IsNull())
+ ModuleBase_Tools::setDefaultDeviationCoefficient(aShape, anAISPrs->Attributes());
+ }
+ }
+ }
} else {
ResultPtr aResult = std::dynamic_pointer_cast<ModelAPI_Result>(theObject);
if (aResult.get() != NULL) {
Handle(AIS_InteractiveObject) anAISPrs = myWorkshop->module()->createPresentation(aResult);
if (anAISPrs.IsNull())
anAISPrs = new ModuleBase_ResultPrs(aResult);
+ else {
+ Handle(AIS_Shape) aShapePrs = Handle(AIS_Shape)::DownCast(anAISPrs);
+ if (!aShapePrs.IsNull())
+ ModuleBase_Tools::setPointBallHighlighting((AIS_Shape*) aShapePrs.Access());
+ }
anAIS->setImpl(new Handle(AIS_InteractiveObject)(anAISPrs));
//anAIS->createShape(aShapePtr);
isShading = true;
emit objectDisplayed(theObject, theAIS);
activate(anAISIO, myActiveSelectionModes, theUpdateViewer);
- // the fix from VPA for more suitable selection of sketcher lines
- if(anAISIO->Width() > 1) {
- for(int aModeIdx = 0; aModeIdx < myActiveSelectionModes.length(); ++aModeIdx) {
- int aMode = myActiveSelectionModes.value(aModeIdx);
- double aPrecision = (aMode == getSelectionMode(TopAbs_VERTEX))? 20 :
- (anAISIO->Width() + 2);
- aContext->SetSelectionSensitivity(anAISIO, aMode, aPrecision);
- }
- }
}
if (theUpdateViewer)
updateViewer();
if (!anAIS.IsNull()) {
emit beforeObjectErase(theObject, anObject);
aContext->Remove(anAIS, false/*update viewer*/);
+ ModuleBase_Tools::selectionInfo(aContext, "XGUI_Displayer::erase -- Remove");
aErased = true;
}
}
if (aNeedToRestoreSelection)
myWorkshop->module()->storeSelection();
+#ifdef WORKAROUND_UNTIL_27523_IS_FIXED
+ if (!myActiveSelectionModes.contains(0))
+ aContext->Activate(aAISIO, 0);
+#endif
+
aContext->Redisplay(aAISIO, false);
+#ifdef WORKAROUND_UNTIL_27523_IS_FIXED
+ if (!myActiveSelectionModes.contains(0))
+ aContext->Deactivate(aAISIO, 0);
+#endif
+
+ ModuleBase_Tools::selectionInfo(aContext, "XGUI_Displayer::redisplay -- Redisplay");
+
if (aNeedToRestoreSelection)
myWorkshop->module()->restoreSelection();
deactivateAIS(anAIS);
// the selection from the previous activation modes should be cleared manually (#26172)
aContext->LocalContext()->ClearOutdatedSelection(anAIS, true);
+ ModuleBase_Tools::selectionInfo(aContext, "XGUI_Displayer::deactivate -- ClearOutdatedSelection");
if (theUpdateViewer)
updateViewer();
}
if (activate(anAISIO, myActiveSelectionModes, false))
isActivationChanged = true;
}
- if (!aTrihedron.IsNull()) {
- foreach(int aMode, myActiveSelectionModes)
- aContext->SetSelectionSensitivity(aTrihedron, aMode, 20);
- }
- // VSV It seems that there is no necessity to update viewer on activation
- //if (theUpdateViewer && isActivationChanged)
- // updateViewer();
}
bool XGUI_Displayer::isActive(ObjectPtr theObject) const
}
if (!aShapesToBeSelected.IsEmpty())
XGUI_Displayer::AddOrRemoveSelectedShapes(aContext, aShapesToBeSelected);
- } else {
+ } else { // it seems the next code is obsolete as the context is always opened in SHAPER
aContext->UnhilightCurrents(false);
aContext->ClearCurrents(false);
foreach (ModuleBase_ViewerPrsPtr aPrs, theValues) {
}
}
}
+ ModuleBase_Tools::selectionInfo(aContext, "XGUI_Displayer::setSelected -- AddOrRemoveSelected/UnhilightCurrents(no local context)");
if (theUpdateViewer)
updateViewer();
}
if (theUpdateViewer)
updateViewer();
}
+ ModuleBase_Tools::selectionInfo(aContext, "XGUI_Displayer::eraseAll -- Remove");
myResult2AISObjectMap.clear();
#ifdef DEBUG_DISPLAY
qDebug("eraseAll");
{
if (!theObject.IsNull()) {
theContext->Deactivate(theObject);
+ ModuleBase_Tools::selectionInfo(theContext, "XGUI_Displayer::deactivateObject -- Deactivate");
//if (theClear) {
//theObject->ClearSelected();
// theContext->LocalContext()->ClearOutdatedSelection(theObject, true);
{
Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext();
if (!aContext.IsNull()) {
- aContext->Activate(theIO, theMode, false);
+ if (myWorkshop->module()) {
+ int aMode = (theMode > 8)? theMode : AIS_Shape::SelectionType(theMode);
+ aContext->Activate(theIO, theMode, false);
+ } else
+ aContext->Activate(theIO, theMode, false);
+
+ // the fix from VPA for more suitable selection of sketcher lines
+ double aPrecision = theIO->Width() + 2;
+ if (theMode == getSelectionMode(TopAbs_VERTEX))
+ aPrecision = ModuleBase_Preferences::resourceMgr()->doubleValue("Viewer", "point-selection-sensitivity", 20);
+ else if ((theMode == getSelectionMode(TopAbs_EDGE)) || (theMode == getSelectionMode(TopAbs_WIRE)))
+ aPrecision = theIO->Width() +
+ ModuleBase_Preferences::resourceMgr()->doubleValue("Viewer", "edge-selection-sensitivity", 2);
+ aContext->SetSelectionSensitivity(theIO, theMode, aPrecision);
+
+ ModuleBase_Tools::selectionInfo(aContext, "XGUI_Displayer::activateAIS -- Activate");
#ifdef DEBUG_ACTIVATE_AIS
ObjectPtr anObject = getObject(theIO);
if (!aContext.IsNull()) {
if (theMode == -1)
aContext->Deactivate(theIO);
- else
+ else
aContext->Deactivate(theIO, theMode);
-
+ ModuleBase_Tools::selectionInfo(aContext, "XGUI_Displayer::deactivateAIS -- Deactivate");
+
#ifdef DEBUG_DEACTIVATE_AIS
ObjectPtr anObject = getObject(theIO);
anInfo.append(ModuleBase_Tools::objectInfo((*anIt)));
Handle(AIS_InteractiveObject) anAISIO = theAIS->impl<Handle(AIS_InteractiveObject)>();
if (!anAISIO.IsNull() && aContext->IsDisplayed(anAISIO)) {
aContext->Remove(anAISIO, false/*update viewer*/);
+ ModuleBase_Tools::selectionInfo(aContext, "XGUI_Displayer::eraseAIS -- Remove");
aErased = true;
}
}
bool isDeactivated = false;
for (; itr.More(); itr.Next() ) {
Standard_Integer aMode = itr.Value();
+ int aShapeMode = (aMode > 8)? aMode : AIS_Shape::SelectionType(aMode);
if (!theModes.contains(aMode)) {
deactivateAIS(theIO, aMode);
isDeactivated = true;
// the selection from the previous activation modes should be cleared manually (#26172)
theIO->ClearSelected();
aContext->LocalContext()->ClearOutdatedSelection(theIO, true);
+ ModuleBase_Tools::selectionInfo(aContext, "XGUI_Displayer::activate -- ClearSelected/ClearOutdatedSelection");
// For performance issues
//if (theUpdateViewer)
// updateViewer();