#include <TColStd_MapOfTransient.hxx>
#include <TColStd_MapIteratorOfMapOfTransient.hxx>
+#include <Events_Loop.h>
+#include <ModelAPI_Events.h>
+
#include <set>
const int MOUSE_SENSITIVITY_IN_PIXEL = 10; ///< defines the local context mouse selection sensitivity
return myResult2AISObjectMap.contains(theObject);
}
-void XGUI_Displayer::display(ObjectPtr theObject, bool theUpdateViewer)
+bool XGUI_Displayer::display(ObjectPtr theObject, bool theUpdateViewer)
{
+ bool aDisplayed = false;
if (isVisible(theObject)) {
#ifdef DEBUG_COMPOSILID_DISPLAY
ResultCompSolidPtr aCompsolidResult = std::dynamic_pointer_cast<ModelAPI_ResultCompSolid>(theObject);
}
else
#endif
- redisplay(theObject, theUpdateViewer);
+ aDisplayed = redisplay(theObject, theUpdateViewer);
} else {
AISObjectPtr anAIS;
-
GeomPresentablePtr aPrs = std::dynamic_pointer_cast<GeomAPI_IPresentable>(theObject);
bool isShading = false;
if (aPrs.get() != NULL) {
}
}
if (anAIS)
- display(theObject, anAIS, isShading, theUpdateViewer);
+ aDisplayed = display(theObject, anAIS, isShading, theUpdateViewer);
}
+ return aDisplayed;
}
bool canBeShaded(Handle(AIS_InteractiveObject) theAIS)
return false;
}
-void XGUI_Displayer::display(ObjectPtr theObject, AISObjectPtr theAIS,
+bool XGUI_Displayer::display(ObjectPtr theObject, AISObjectPtr theAIS,
bool isShading, bool theUpdateViewer)
{
+ bool aDisplayed = false;
+
Handle(AIS_InteractiveContext) aContext = AISContext();
if (aContext.IsNull())
- return;
+ return aDisplayed;
Handle(AIS_InteractiveObject) anAISIO = theAIS->impl<Handle(AIS_InteractiveObject)>();
if (!anAISIO.IsNull()) {
anAISIO->Attributes()->SetFaceBoundaryDraw( Standard_True );
anAISIO->SetDisplayMode(aDispMode);
aContext->Display(anAISIO, aDispMode, 0, false, true, AIS_DS_Displayed);
+ aDisplayed = 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) {
+ aContext->SetSelectionSensitivity(anAISIO,
+ myActiveSelectionModes.value(aModeIdx), anAISIO->Width() + 2);
+ }
+ }
+ }
if (theUpdateViewer)
updateViewer();
+
+ return aDisplayed;
}
-void XGUI_Displayer::erase(ObjectPtr theObject, const bool theUpdateViewer)
+bool XGUI_Displayer::erase(ObjectPtr theObject, const bool theUpdateViewer)
{
+ bool aErased = false;
if (!isVisible(theObject))
- return;
+ return aErased;
Handle(AIS_InteractiveContext) aContext = AISContext();
if (aContext.IsNull())
- return;
+ return aErased;
AISObjectPtr anObject = myResult2AISObjectMap[theObject];
if (anObject) {
Handle(AIS_InteractiveObject) anAIS = anObject->impl<Handle(AIS_InteractiveObject)>();
if (!anAIS.IsNull()) {
emit beforeObjectErase(theObject, anObject);
aContext->Remove(anAIS, theUpdateViewer);
+ aErased = true;
}
}
myResult2AISObjectMap.remove(theObject);
qDebug(QString("erase object: %1").arg(aPtrStr.str().c_str()).toStdString().c_str());
qDebug(getResult2AISObjectMapInfo().c_str());
#endif
+ return aErased;
}
-void XGUI_Displayer::redisplay(ObjectPtr theObject, bool theUpdateViewer)
+bool XGUI_Displayer::redisplay(ObjectPtr theObject, bool theUpdateViewer)
{
+ bool aRedisplayed = false;
if (!isVisible(theObject))
- return;
+ return aRedisplayed;
AISObjectPtr aAISObj = getAISObject(theObject);
Handle(AIS_InteractiveObject) aAISIO = aAISObj->impl<Handle(AIS_InteractiveObject)>();
if (aPrs) {
AISObjectPtr aAIS_Obj = aPrs->getAISObject(aAISObj);
if (!aAIS_Obj) {
- erase(theObject, theUpdateViewer);
- return;
+ aRedisplayed = erase(theObject, theUpdateViewer);
+ return aRedisplayed;
}
if (aAIS_Obj != aAISObj) {
appendResultObject(theObject, aAIS_Obj);
aAISIO = aAIS_Obj->impl<Handle(AIS_InteractiveObject)>();
}
- if (!aAISIO.IsNull()) {
- Handle(AIS_InteractiveContext) aContext = AISContext();
- if (aContext.IsNull())
- return;
+ Handle(AIS_InteractiveContext) aContext = AISContext();
+ if (!aAISIO.IsNull() && !aContext.IsNull()) {
// Check that the visualized shape is the same and the redisplay is not necessary
// Redisplay of AIS object leads to this object selection compute and the selection
// in the browser is lost
-
// this check is not necessary anymore because the selection store/restore is realized
// before and after the values modification.
// Moreother, this check avoids customize and redisplay presentation if the presentable
#endif
if (!isEqualShapes || isCustomized) {
aContext->Redisplay(aAISIO, false);
+ aRedisplayed = true;
#ifdef DEBUG_FEATURE_REDISPLAY
qDebug(" Redisplay happens");
#endif
updateViewer();
}
}
+ return aRedisplayed;
+}
+
+void XGUI_Displayer::redisplayObjects()
+{
+ // redisplay objects visualized in the viewer
+ static Events_ID EVENT_DISP = Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY);
+ static const ModelAPI_EventCreator* aECreator = ModelAPI_EventCreator::get();
+ QObjectPtrList aDisplayed = myWorkshop->displayer()->displayedObjects();
+ QObjectPtrList::const_iterator anIt = aDisplayed.begin(), aLast = aDisplayed.end();
+ for (; anIt != aLast; anIt++) {
+ aECreator->sendUpdated(*anIt, EVENT_DISP);
+ }
+ Events_Loop::loop()->flush(EVENT_DISP);
}
void XGUI_Displayer::deactivate(ObjectPtr theObject, const bool theUpdateViewer)
}
}
+void XGUI_Displayer::deactivateObjects(const QObjectPtrList& theObjList,
+ const bool theUpdateViewer)
+{
+ QObjectPtrList::const_iterator anIt = theObjList.begin(), aLast = theObjList.end();
+ for (; anIt != aLast; anIt++) {
+ deactivate(*anIt, false);
+ }
+ if (theUpdateViewer)
+ updateViewer();
+}
+
void XGUI_Displayer::getModesOfActivation(ObjectPtr theObject, QIntList& theModes)
{
if (!isVisible(theObject))
}
}
-void XGUI_Displayer::eraseAll(const bool theUpdateViewer)
+bool XGUI_Displayer::eraseAll(const bool theUpdateViewer)
{
+ bool aErased = false;
Handle(AIS_InteractiveContext) aContext = AISContext();
if (!aContext.IsNull()) {
foreach (ObjectPtr aObj, myResult2AISObjectMap.keys()) {
if (!anIO.IsNull()) {
emit beforeObjectErase(aObj, aAISObj);
aContext->Remove(anIO, false);
+ aErased = true;
}
}
if (theUpdateViewer)
qDebug("eraseAll");
qDebug(getResult2AISObjectMapInfo().c_str());
#endif
+ return aErased;
}
void XGUI_Displayer::deactivateTrihedron() const
return myAndFilter;
}
-void XGUI_Displayer::displayAIS(AISObjectPtr theAIS, const bool toActivateInSelectionModes,
+bool XGUI_Displayer::displayAIS(AISObjectPtr theAIS, const bool toActivateInSelectionModes,
bool theUpdateViewer)
{
+ bool aDisplayed = false;
Handle(AIS_InteractiveContext) aContext = AISContext();
if (aContext.IsNull())
- return;
+ return aDisplayed;
Handle(AIS_InteractiveObject) anAISIO = theAIS->impl<Handle(AIS_InteractiveObject)>();
if (!anAISIO.IsNull()) {
aContext->Display(anAISIO, 0/*wireframe*/, 0, theUpdateViewer, true, AIS_DS_Displayed);
+ aDisplayed = true;
aContext->Deactivate(anAISIO);
aContext->Load(anAISIO);
if (toActivateInSelectionModes) {
}
}
}
+ return aDisplayed;
}
-void XGUI_Displayer::eraseAIS(AISObjectPtr theAIS, const bool theUpdateViewer)
+bool XGUI_Displayer::eraseAIS(AISObjectPtr theAIS, const bool theUpdateViewer)
{
+ bool aErased = false;
Handle(AIS_InteractiveContext) aContext = AISContext();
if (aContext.IsNull())
- return;
+ return aErased;
Handle(AIS_InteractiveObject) anAISIO = theAIS->impl<Handle(AIS_InteractiveObject)>();
if (!anAISIO.IsNull() && aContext->IsDisplayed(anAISIO)) {
aContext->Remove(anAISIO, theUpdateViewer);
+ aErased = true;
}
+ return aErased;
}
return (XGUI_Displayer::DisplayMode) aAISIO->DisplayMode();
}
+void XGUI_Displayer::deactivateSelectionFilters()
+{
+ Handle(AIS_InteractiveContext) aContext = AISContext();
+ if (!myAndFilter.IsNull() && !aContext.IsNull()) {
+ bool aFound = false;
+ const SelectMgr_ListOfFilter& aFilters = aContext->Filters();
+ SelectMgr_ListIteratorOfListOfFilter anIt(aFilters);
+ for (; anIt.More() && !aFound; anIt.Next()) {
+ Handle(SelectMgr_Filter) aFilter = anIt.Value();
+ aFound = aFilter == myAndFilter;
+ }
+ if (aFound) {
+ aContext->RemoveFilter(myAndFilter);
+ myAndFilter.Nullify();
+ }
+ }
+}
+
void XGUI_Displayer::addSelectionFilter(const Handle(SelectMgr_Filter)& theFilter)
{
Handle(AIS_InteractiveContext) aContext = AISContext();
}
bool isCustomized = aCustomPrs.get() &&
aCustomPrs->customisePresentation(aResult, anAISObj, myCustomPrs);
- myWorkshop->module()->customizeObject(theObject);
return isCustomized;
}