-// Copyright (C) 2014-20xx CEA/DEN, EDF R&D -->
-
-// File: XGUI_Displayer.cpp
-// Created: 20 Apr 2014
-// Author: Natalia ERMOLAEVA
+// Copyright (C) 2014-2017 CEA/DEN, EDF R&D
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or
+// email : webmaster.salome@opencascade.com<mailto:webmaster.salome@opencascade.com>
+//
#include "XGUI_Displayer.h"
#include "XGUI_Workshop.h"
#include <AppElements_Viewer.h>
#endif
-#ifdef VINSPECTOR
-#include <VInspectorAPI_PluginMgr.h>
-#include <VInspectorAPI_Communicator.h>
-#include <AppElements_MainWindow.h>
-static bool VInspector_FirstCall = true;
-#endif
-
#include <ModelAPI_Document.h>
#include <ModelAPI_Data.h>
#include <ModelAPI_Object.h>
#include <AIS_Shape.hxx>
#include <AIS_Dimension.hxx>
#include <AIS_Trihedron.hxx>
+#ifdef BEFORE_TRIHEDRON_PATCH
#include <AIS_Axis.hxx>
#include <AIS_Plane.hxx>
#include <AIS_Point.hxx>
+#endif
#include <AIS_Selection.hxx>
#include <TColStd_ListIteratorOfListOfInteger.hxx>
#include <SelectMgr_ListOfFilter.hxx>
#include <TColStd_MapOfTransient.hxx>
#include <TColStd_MapIteratorOfMapOfTransient.hxx>
-#ifdef VINSPECTOR
-#include <VInspectorAPI_CallBack.h>
+#ifdef TINSPECTOR
+#include <VInspectorAPI_CallBack.hxx>
#endif
#include <Events_Loop.h>
//#define DEBUG_OCCT_SHAPE_SELECTION
-//#define DEBUG_OCCT_26172
+#define CLEAR_OUTDATED_SELECTION_BEFORE_REDISPLAY
void displayedObjects(const Handle(AIS_InteractiveContext)& theAIS, AIS_ListOfInteractive& theList)
{
return anInfo.join(theSeparator);
}
+void deselectPresentation(const Handle(AIS_InteractiveObject) theObject,
+ const Handle(AIS_InteractiveContext)& theContext)
+{
+ NCollection_List<Handle(SelectBasics_EntityOwner)> aResultOwners;
+
+ for (theContext->InitSelected(); theContext->MoreSelected(); theContext->NextSelected()) {
+ Handle(SelectMgr_EntityOwner) anOwner = theContext->SelectedOwner();
+ if (anOwner.IsNull()) // TODO: check why it is possible
+ continue;
+ if (anOwner->Selectable() == theObject && anOwner->IsSelected())
+ aResultOwners.Append(anOwner);
+ }
+ NCollection_List<Handle(SelectBasics_EntityOwner)>::Iterator anOwnersIt (aResultOwners);
+ Handle(SelectMgr_EntityOwner) anOwner;
+ for (; anOwnersIt.More(); anOwnersIt.Next()) {
+ anOwner = Handle(SelectMgr_EntityOwner)::DownCast(anOwnersIt.Value());
+ if (!anOwner.IsNull())
+ theContext->AddOrRemoveSelected(anOwner, false);
+ }
+}
+
XGUI_Displayer::XGUI_Displayer(XGUI_Workshop* theWorkshop)
: myWorkshop(theWorkshop), myNeedUpdate(false),
myIsTrihedronActive(true), myViewerBlockedRecursiveCount(0),
myIsFirstAISContextUse(true)
{
- #ifdef VINSPECTOR
- myCommunicator = 0;
- #endif
myCustomPrs = std::shared_ptr<GeomAPI_ICustomPrs>(new XGUI_CustomPrs(theWorkshop));
}
anAISIO->Attributes()->SetFaceBoundaryDraw( Standard_True );
anAISIO->SetDisplayMode(aDispMode);
aContext->Display(anAISIO, aDispMode, 0, false, true, AIS_DS_Displayed);
- #ifdef VINSPECTOR
+ #ifdef TINSPECTOR
if (getCallBack()) getCallBack()->Display(anAISIO);
#endif
aDisplayed = true;
if (!anAIS.IsNull()) {
emit beforeObjectErase(theObject, anObject);
aContext->Remove(anAIS, false/*update viewer*/);
- #ifdef VINSPECTOR
+ #ifdef TINSPECTOR
if (getCallBack()) getCallBack()->Remove(anAIS);
#endif
aErased = true;
if (aNeedToRestoreSelection)
myWorkshop->module()->storeSelection();
+#ifdef CLEAR_OUTDATED_SELECTION_BEFORE_REDISPLAY
+ deselectPresentation(aAISIO, aContext);
+#endif
aContext->Redisplay(aAISIO, false);
- #ifdef VINSPECTOR
+ #ifdef TINSPECTOR
if (getCallBack()) getCallBack()->Redisplay(aAISIO);
#endif
Handle(AIS_InteractiveObject) anAIS = anObj->impl<Handle(AIS_InteractiveObject)>();
deactivateAIS(anAIS);
+ // the selection from the previous activation modes should be cleared manually (#26172)
+#ifndef CLEAR_OUTDATED_SELECTION_BEFORE_REDISPLAY
+ deselectPresentation(anAIS, aContext);
+#endif
if (theUpdateViewer)
updateViewer();
}
TColStd_ListOfInteger aModes;
aContext->ActivatedModes(anAIS, aModes);
- #ifdef VINSPECTOR
+ #ifdef TINSPECTOR
if (getCallBack()) getCallBack()->ActivatedModes(anAIS, aModes);
#endif
return;
aContext->UnhilightSelected(false);
aContext->ClearSelected(false);
- #ifdef VINSPECTOR
+ #ifdef TINSPECTOR
if (getCallBack()) getCallBack()->ClearSelected();
#endif
NCollection_DataMap<TopoDS_Shape, NCollection_Map<Handle(AIS_InteractiveObject)>>
// problem 2: IO is not specified, so the first found owner is selected, as a result
// it might belong to another result
aContext->AddOrRemoveSelected(aShape, false);
- #ifdef VINSPECTOR
+ #ifdef TINSPECTOR
if (getCallBack()) getCallBack()->AddOrRemoveSelected(aShape);
#endif
#else
//aContext->SetSelected(anAIS, false);
// The selection in the context was cleared, so the method sets the objects are selected
aContext->AddOrRemoveSelected(anAIS, false);
- #ifdef VINSPECTOR
+ #ifdef TINSPECTOR
if (getCallBack()) getCallBack()->AddOrRemoveSelected(anAIS);
#endif
}
{
Handle(AIS_InteractiveContext) aContext = AISContext();
if (!aContext.IsNull()) {
- aContext->UnhilightCurrents(false);
+ aContext->UnhilightSelected(false);//UnhilightCurrents(false);
aContext->ClearSelected(theUpdateViewer);
- #ifdef VINSPECTOR
+ #ifdef TINSPECTOR
if (getCallBack()) getCallBack()->ClearSelected();
#endif
}
if (!anIO.IsNull()) {
emit beforeObjectErase(aObj, aAISObj);
aContext->Remove(anIO, false/*update viewer*/);
- #ifdef VINSPECTOR
+ #ifdef TINSPECTOR
if (getCallBack()) getCallBack()->Remove(anIO);
#endif
aErased = true;
void deactivateObject(Handle(AIS_InteractiveContext) theContext,
Handle(AIS_InteractiveObject) theObject
-#ifdef VINSPECTOR
- , VInspectorAPI_CallBack* theCallBack
+#ifdef TINSPECTOR
+ , Handle(VInspectorAPI_CallBack) theCallBack
#endif
)
{
if (!theObject.IsNull()) {
theContext->Deactivate(theObject);
- #ifdef VINSPECTOR
+ #ifdef TINSPECTOR
if (theCallBack) theCallBack->Deactivate(theObject);
#endif
}
if (!aTrihedron.IsNull() && aContext->IsDisplayed(aTrihedron)) {
Handle(AIS_Trihedron) aTrie = Handle(AIS_Trihedron)::DownCast(aTrihedron);
deactivateObject(aContext, aTrie
- #ifdef VINSPECTOR
+ #ifdef TINSPECTOR
, getCallBack()
#endif
);
/// #1136 hidden axis are selected in sketch
+#ifdef BEFORE_TRIHEDRON_PATCH
deactivateObject(aContext, aTrie->XAxis()
- #ifdef VINSPECTOR
+ #ifdef TINSPECTOR
, getCallBack()
#endif
);
deactivateObject(aContext, aTrie->YAxis()
- #ifdef VINSPECTOR
+ #ifdef TINSPECTOR
, getCallBack()
#endif
);
deactivateObject(aContext, aTrie->Axis()
- #ifdef VINSPECTOR
+ #ifdef TINSPECTOR
, getCallBack()
#endif
);
deactivateObject(aContext, aTrie->Position()
- #ifdef VINSPECTOR
+ #ifdef TINSPECTOR
, getCallBack()
#endif
);
deactivateObject(aContext, aTrie->XYPlane()
- #ifdef VINSPECTOR
+ #ifdef TINSPECTOR
, getCallBack()
#endif
);
deactivateObject(aContext, aTrie->XZPlane()
- #ifdef VINSPECTOR
+ #ifdef TINSPECTOR
, getCallBack()
#endif
);
deactivateObject(aContext, aTrie->YZPlane()
- #ifdef VINSPECTOR
+ #ifdef TINSPECTOR
, getCallBack()
#endif
);
-
+#endif
if (theUpdateViewer)
updateViewer();
}
{
Handle(AIS_InteractiveContext) aContext = AISContext();
if (!aContext.IsNull() && isUpdateEnabled()) {
- myWorkshop->viewer()->Zfitall();
+ //myWorkshop->viewer()->Zfitall();
aContext->UpdateCurrentViewer();
} else {
myNeedUpdate = true;
aContext->Activate(theIO, theMode, false);
} else
aContext->Activate(theIO, theMode, false);
- #ifdef VINSPECTOR
+ #ifdef TINSPECTOR
if (getCallBack()) getCallBack()->Activate(theIO, theMode);
#endif
if (!aContext.IsNull()) {
if (theMode == -1) {
aContext->Deactivate(theIO);
- #ifdef VINSPECTOR
+ #ifdef TINSPECTOR
if (getCallBack()) getCallBack()->Deactivate(theIO);
#endif
}
else {
aContext->Deactivate(theIO, theMode);
- #ifdef VINSPECTOR
+ #ifdef TINSPECTOR
if (getCallBack()) getCallBack()->Deactivate(theIO, theMode);
#endif
}
{
Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext();
if (!aContext.IsNull() && myIsFirstAISContextUse/*&& !aContext->HasOpenedContext()*/) {
-#ifdef VINSPECTOR
- if (VInspector_FirstCall) {
- XGUI_Displayer* aDisplayer = (XGUI_Displayer*)this;
- VInspectorAPI_Communicator* aCommunicator = VInspectorAPI_PluginMgr::activateVInspector(
- "VInspector.dll", aContext);
- aDisplayer->setCommunicator(aCommunicator);
- #ifndef HAVE_SALOME
- AppElements_Viewer* aViewer = myWorkshop->mainWindow()->viewer();
- if (aViewer)
- aViewer->setCallBack(aCommunicator->getCallBack());
- #endif
- VInspector_FirstCall = false;
- }
-#endif
XGUI_Displayer* aDisplayer = (XGUI_Displayer*)this;
aDisplayer->myIsFirstAISContextUse = false;
//aContext->OpenLocalContext();
}
bool XGUI_Displayer::displayAIS(AISObjectPtr theAIS, const bool toActivateInSelectionModes,
- bool theUpdateViewer)
+ const Standard_Integer theDisplayMode, bool theUpdateViewer)
{
bool aDisplayed = false;
Handle(AIS_InteractiveContext) aContext = AISContext();
Handle(AIS_InteractiveObject) anAISIO = theAIS->impl<Handle(AIS_InteractiveObject)>();
if (!aContext.IsNull() && !anAISIO.IsNull()) {
- aContext->Display(anAISIO, 0/*wireframe*/, 0, false/*update viewer*/, true, AIS_DS_Displayed);
- #ifdef VINSPECTOR
+ aContext->Display(anAISIO, theDisplayMode, 0, false/*update viewer*/, true, AIS_DS_Displayed);
+ #ifdef TINSPECTOR
if (getCallBack()) getCallBack()->Display(anAISIO);
#endif
aDisplayed = true;
aContext->Deactivate(anAISIO);
- #ifdef VINSPECTOR
+ #ifdef TINSPECTOR
if (getCallBack()) getCallBack()->Deactivate(anAISIO);
#endif
aContext->Load(anAISIO);
- #ifdef VINSPECTOR
+ #ifdef TINSPECTOR
if (getCallBack()) getCallBack()->Load(anAISIO);
#endif
if (toActivateInSelectionModes) {
Handle(AIS_InteractiveObject) anAISIO = theAIS->impl<Handle(AIS_InteractiveObject)>();
if (!anAISIO.IsNull() && aContext->IsDisplayed(anAISIO)) {
aContext->Remove(anAISIO, false/*update viewer*/);
- #ifdef VINSPECTOR
+ #ifdef TINSPECTOR
if (getCallBack()) getCallBack()->Remove(anAISIO);
#endif
aErased = true;
// The result is the selection of the first IO is lost.
TColStd_ListOfInteger aTColModes;
aContext->ActivatedModes(theIO, aTColModes);
- #ifdef VINSPECTOR
+ #ifdef TINSPECTOR
if (getCallBack()) getCallBack()->ActivatedModes(theIO, aTColModes);
#endif
TColStd_ListIteratorOfListOfInteger itr( aTColModes );
}
}
if (isDeactivated) {
-#ifdef DEBUG_OCCT_26172
// the selection from the previous activation modes should be cleared manually (#26172)
- theIO->ClearSelected();
- #ifdef VINSPECTOR
- if (getCallBack()) getCallBack()->ClearSelected(theIO);
- #endif
+ //theIO->ClearSelected();
+ //#ifdef TINSPECTOR
+ //if (getCallBack()) getCallBack()->ClearSelected(theIO);
+ //#endif
+#ifndef CLEAR_OUTDATED_SELECTION_BEFORE_REDISPLAY
+ deselectPresentation(theIO, aContext);
#endif
// For performance issues
//if (theUpdateViewer)
aContext->SelectionManager()->Load(theIO);
}
- #ifdef VINSPECTOR
+ #ifdef TINSPECTOR
if (getCallBack()) getCallBack()->Load(theIO);
#endif
}
}
bool isCustomized = aCustomPrs.get() &&
aCustomPrs->customisePresentation(aResult, anAISObj, myCustomPrs);
+ isCustomized = myWorkshop->module()->afterCustomisePresentation(aResult, anAISObj, myCustomPrs)
+ || isCustomized;
return isCustomized;
}
ResultPtr aResult = std::dynamic_pointer_cast<ModelAPI_Result>(theObject);
if (aResult.get()) {
AISObjectPtr aAISObj = getAISObject(aResult);
+ if (aAISObj.get() == NULL) {
+ // if result is a result of a composite feature, it is visualized by visualization of
+ // composite children, so we should get one of this presentations
+ ResultCompSolidPtr aCompSolid = std::dynamic_pointer_cast<ModelAPI_ResultCompSolid>(aResult);
+ if (aCompSolid.get() && aCompSolid->numberOfSubs() > 0) {
+ aAISObj = getAISObject(aCompSolid->subResult(0));
+ }
+ }
if (aAISObj.get() != NULL) {
Handle(AIS_InteractiveObject) anAIS = aAISObj->impl<Handle(AIS_InteractiveObject)>();
if (!anAIS.IsNull() && !thePresentations.Contains(anAIS))
Standard_True /* update viewer*/,
Standard_False /* allow decomposition */,
AIS_DS_Displayed /* xdisplay status */);
- #ifdef VINSPECTOR
+ #ifdef TINSPECTOR
if (getCallBack()) getCallBack()->Display(aTrihedron);
#endif
} else {
deactivateTrihedron(false);
- aContext->Erase(aTrihedron);
- #ifdef VINSPECTOR
+ aContext->Erase(aTrihedron, Standard_True);
+ #ifdef TINSPECTOR
if (getCallBack()) getCallBack()->Remove(aTrihedron);
#endif
}
return aModes;
}
-#ifdef VINSPECTOR
-void XGUI_Displayer::setCommunicator(VInspectorAPI_Communicator* theCommunicator)
-{
- myCommunicator = theCommunicator;
-}
-
-void XGUI_Displayer::setVInspectorVisible(const bool theVisible)
-{
- if (myCommunicator)
- myCommunicator->setVisible(true);
-}
-
-VInspectorAPI_CallBack* XGUI_Displayer::getCallBack() const
-{
- return myCommunicator ? myCommunicator->getCallBack() : NULL;
-}
-#endif
-
void XGUI_Displayer::AddOrRemoveSelectedShapes(Handle(AIS_InteractiveContext) theContext,
const NCollection_DataMap<TopoDS_Shape,
NCollection_Map<Handle(AIS_InteractiveObject)>>& theShapesToBeSelected)
{
+ NCollection_Map<Handle(AIS_InteractiveObject)> aCompsolidPresentations;
+ NCollection_Map<Handle(AIS_InteractiveObject)> aSelectedPresentations;
+
NCollection_List<Handle(SelectBasics_EntityOwner)> anActiveOwners;
theContext->MainSelector()->ActiveOwners(anActiveOwners);
NCollection_List<Handle(SelectBasics_EntityOwner)>::Iterator anOwnersIt (anActiveOwners);
Handle(StdSelect_BRepOwner) BROwnr = Handle(StdSelect_BRepOwner)::DownCast(anOwner);
if (!BROwnr.IsNull() && BROwnr->HasShape()) {
const TopoDS_Shape& aShape = BROwnr->Shape();
- if (!aShape.IsNull() && theShapesToBeSelected.IsBound(aShape)) {
- Handle(AIS_InteractiveObject) anOwnerPresentation =
- Handle(AIS_InteractiveObject)::DownCast(anOwner->Selectable());
- NCollection_Map<Handle(AIS_InteractiveObject)> aPresentations =
- theShapesToBeSelected.Find(aShape);
- if (aPresentations.Contains(anOwnerPresentation)) {
- theContext->AddOrRemoveSelected(anOwner);
- anOwner->SetSelected (Standard_True);
+ if (aShape.IsNull())
+ continue;
+
+ Handle(ModuleBase_BRepOwner) aCustomOwner = Handle(ModuleBase_BRepOwner)::DownCast(anOwner);
+
+ NCollection_DataMap<TopoDS_Shape, NCollection_Map<Handle(AIS_InteractiveObject)> >
+ ::Iterator aShapeIt(theShapesToBeSelected);
+ for (; aShapeIt.More(); aShapeIt.Next()) {
+ const TopoDS_Shape& aParameterShape = aShapeIt.Key();
+ // isSame should be used here as it does not check orientation of shapes
+ // despite on isEqual of shapes or IsBound for shape in QMap. Orientation is
+ // different for Edges shapes in model shape and owner even if this is the same shape
+ if (aParameterShape.IsSame(aShape)) {
+ Handle(AIS_InteractiveObject) anOwnerPresentation =
+ Handle(AIS_InteractiveObject)::DownCast(anOwner->Selectable());
+ NCollection_Map<Handle(AIS_InteractiveObject)> aPresentations =
+ theShapesToBeSelected.Find(aParameterShape);
+ if (aPresentations.Contains(anOwnerPresentation)) {
+ theContext->AddOrRemoveSelected(anOwner, Standard_False);
+ anOwner->SetSelected (Standard_True);
+ // collect selected presentations to do not select them if compsolid is selected
+ if (!aSelectedPresentations.Contains(anOwnerPresentation))
+ aSelectedPresentations.Add(anOwnerPresentation);
+ }
+ }
+ else if (!aCustomOwner.IsNull()) { // CompSolid processing #2219
+ // shape of owner is compound, but shape to be selected is compsolid, so
+ // we need to compare shape to AIS presentation of owner(rule of the owner creation)
+ Handle(AIS_Shape) anOwnerPresentation =
+ Handle(AIS_Shape)::DownCast(anOwner->Selectable());
+ const TopoDS_Shape& aPresentationShape = anOwnerPresentation->Shape();
+ if (aParameterShape.IsSame(anOwnerPresentation->Shape()) &&
+ !aCompsolidPresentations.Contains(anOwnerPresentation))
+ aCompsolidPresentations.Add(anOwnerPresentation);
}
}
}
}
+ // select CompSolid presentations if their owners was not selected yet
+ NCollection_Map<Handle(AIS_InteractiveObject)>::Iterator anIt (aCompsolidPresentations);
+ for (; anIt.More(); anIt.Next()) {
+ if (aSelectedPresentations.Contains(anIt.Value()))
+ continue;
+ theContext->AddOrRemoveSelected(anIt.Value(), Standard_False);
+ }
}