1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-06 18:26:22 +03:00
occt/samples/mfc/standard/Common/ISession2D/ISession2D_InteractiveContext.cpp
2012-03-05 19:23:40 +04:00

462 lines
16 KiB
C++
Executable File

// File: ISession2D_InteractiveContext.cxx
// Created: Thu Jul 10 18:53:50 1997
// Author: David Enjolras
// <den@zodiax.paris3.matra-dtv.fr>
#include "stdafx.h"
#include <OCC_MainFrame.h>// use for Message Bar
#include "ISession2D_InteractiveContext.h"
#include <SelectMgr_EntityOwner.hxx>
#include <PrsMgr_PresentationManager2d.hxx>
#include <SelectMgr_SelectionManager.hxx>
#include <StdSelect_TextProjector2d.hxx>
IMPLEMENT_STANDARD_HANDLE(ISession2D_InteractiveContext,MMgt_TShared)
IMPLEMENT_STANDARD_RTTIEXT(ISession2D_InteractiveContext,MMgt_TShared)
#include "ISession2D_ObjectOwner.h"
#include "TColStd_MapIteratorOfMapOfTransient.hxx"
ISession2D_InteractiveContext::ISession2D_InteractiveContext()
{
}
ISession2D_InteractiveContext::ISession2D_InteractiveContext(const Handle(V2d_Viewer)& aViewer)
{
Initialize(aViewer);
}
void ISession2D_InteractiveContext::Initialize(const Handle(V2d_Viewer)& aViewer)
{
ASSERT(!aViewer.IsNull());
myViewer = aViewer;
myPrsmgr = new PrsMgr_PresentationManager2d(myViewer->View());
mySelectionManager = new SelectMgr_SelectionManager();
mySelector = new StdSelect_ViewerSelector2d();
mySelector->Set(3);
// set Sensitivity very very important for SensitiveCurve !!
mySelector->SetSensitivity (0.5); // en mm
mySelectionManager->Add(mySelector);
myHilightColorIndex = 5; // for dynamic highlight
IsAreasDisplayed = Standard_False;
myPrsmgr->SetHighlightColor(8); // For Static highlight
}
void ISession2D_InteractiveContext::Display (const Handle(AIS_InteractiveObject)& anObject,
const Standard_Boolean Redraw )
{
ASSERT(!anObject.IsNull());
myObjects.Add(anObject);
Standard_Integer DispMode ,HiMode,SelMode;
GetDefModes(anObject,DispMode ,HiMode,SelMode);
myPrsmgr->Display(anObject,DispMode);
mySelectionManager->Load(anObject,mySelector);
mySelectionManager->Activate(anObject,SelMode,mySelector);
if (Redraw) myViewer->Update();
}
void ISession2D_InteractiveContext::Display (const Handle(AIS_InteractiveObject)& anObject,
const Standard_Integer aDisplayMode,
const Standard_Integer aSelectionMode,
const Standard_Boolean Redraw )
{
ASSERT(!anObject.IsNull());
myObjects.Add(anObject);
ASSERT(anObject->AcceptDisplayMode(aDisplayMode));
anObject->SetDisplayMode(aDisplayMode);
anObject->SetSelectionMode(aSelectionMode);
myObjects.Add(anObject);
myPrsmgr->Display(anObject,aDisplayMode);
mySelectionManager->Load(anObject,mySelector);
mySelectionManager->Activate(anObject,aSelectionMode,mySelector);
if (Redraw) myViewer->Update();
}
void ISession2D_InteractiveContext::Erase (const Handle(AIS_InteractiveObject)& anObject,
const Standard_Boolean Redraw )
{
ASSERT(!myPrsmgr.IsNull());
ASSERT(!anObject.IsNull());
ASSERT(myObjects.Contains(anObject));
Standard_Integer DispMode ,HiMode,SelMode;
GetDefModes(anObject,DispMode ,HiMode,SelMode);
myPrsmgr->Erase(anObject,DispMode);
mySelectionManager->Deactivate(anObject,mySelector);
if (Redraw) myViewer->Update();
}
void ISession2D_InteractiveContext::DisplayAll(const Standard_Boolean Redraw )
{
ASSERT(!myPrsmgr.IsNull());
TColStd_MapIteratorOfMapOfTransient It(myObjects);
for(;It.More();It.Next()){
Handle(AIS_InteractiveObject) anObject = Handle(AIS_InteractiveObject)::DownCast(It.Key());
Standard_Integer DispMode ,HiMode,SelMode;
GetDefModes(anObject,DispMode ,HiMode,SelMode);
myPrsmgr->Display(anObject,DispMode);
mySelectionManager->Load(anObject,mySelector);
mySelectionManager->Activate(anObject,HiMode,mySelector);
}
if (Redraw) myViewer->Update();
}
void ISession2D_InteractiveContext::EraseAll (const Standard_Boolean Redraw )
{
ASSERT(!myPrsmgr.IsNull());
TColStd_MapIteratorOfMapOfTransient It(myObjects);
for(;It.More();It.Next()){
Handle(AIS_InteractiveObject) anObject = Handle(AIS_InteractiveObject)::DownCast(It.Key());
Standard_Integer DispMode ,HiMode,SelMode;
GetDefModes(anObject,DispMode ,HiMode,SelMode);
myPrsmgr->Erase(anObject,DispMode);
mySelectionManager->Deactivate(anObject,mySelector);
}
if (Redraw) myViewer->Update();
}
Standard_Boolean ISession2D_InteractiveContext::IsDisplayed(const Handle(AIS_InteractiveObject)& anObject,
const Standard_Integer aMode)
{
ASSERT(!myPrsmgr.IsNull());
ASSERT(!anObject.IsNull());
return myPrsmgr->IsDisplayed(anObject,aMode);
}
void ISession2D_InteractiveContext::Redisplay(const Handle(AIS_InteractiveObject)& anObject,
const Standard_Boolean Redraw,
const Standard_Boolean allmodes)
{
ASSERT(!myPrsmgr.IsNull());
ASSERT(!anObject.IsNull());
ASSERT(myObjects.Contains(anObject));
Standard_Integer DispMode ,HiMode,SelMode;
GetDefModes(anObject,DispMode ,HiMode,SelMode);
myPrsmgr->Update(anObject,DispMode);
// WARNING : IMPLEMENTATION IS NOT FINISH !!!!!!!!
// NEED TO UPDATE THE OTHER MODES, AND SELECTION !!!!!
// mySelectionManager->Load(anObject,mySelector);
// mySelectionManager->Activate(anObject,SelMode,mySelector);
if (Redraw) myViewer->Update();
}
void ISession2D_InteractiveContext::Clear (const Handle(AIS_InteractiveObject)& anObject,
const Standard_Boolean Redraw)
{
ASSERT(!myPrsmgr.IsNull());
ASSERT(!anObject.IsNull());
ASSERT(myObjects.Contains(anObject));
Standard_Failure::Raise("NotYetImplemented");
}
void ISession2D_InteractiveContext::Remove (const Handle(AIS_InteractiveObject)& anObject,
const Standard_Boolean Redraw)
{
ASSERT(!myPrsmgr.IsNull());
ASSERT(!anObject.IsNull());
ASSERT(myObjects.Contains(anObject));
Erase(anObject,Redraw);
myObjects.Remove(anObject);
}
void ISession2D_InteractiveContext::Highlight (const Handle(AIS_InteractiveObject)& anObject,
const Standard_Boolean Redraw)
{
ASSERT(!myPrsmgr.IsNull());
ASSERT(!anObject.IsNull());
ASSERT(myObjects.Contains(anObject));
Standard_Integer DispMode ,HiMode,SelMode;
GetDefModes(anObject,DispMode ,HiMode,SelMode);
myPrsmgr->Highlight(anObject,HiMode);
if(Redraw) myViewer->Update();
}
void ISession2D_InteractiveContext::Unhighlight (const Handle(AIS_InteractiveObject)& anObject,
const Standard_Boolean Redraw)
{
ASSERT(!myPrsmgr.IsNull());
ASSERT(!anObject.IsNull());
ASSERT(myObjects.Contains(anObject));
Standard_Integer DispMode ,HiMode,SelMode;
GetDefModes(anObject,DispMode ,HiMode,SelMode);
myPrsmgr->Unhighlight(anObject,HiMode);
if(Redraw) myViewer->Update();
}
Standard_Boolean ISession2D_InteractiveContext::IsHilighted(const Handle(AIS_InteractiveObject)& anObject)
{
ASSERT(!myPrsmgr.IsNull());
ASSERT(!anObject.IsNull());
ASSERT(myObjects.Contains(anObject));
Standard_Integer DispMode ,HiMode,SelMode;
GetDefModes(anObject,DispMode ,HiMode,SelMode);
return myPrsmgr->IsHighlighted(anObject,HiMode);
}
Standard_Boolean ISession2D_InteractiveContext::NewProjector(const Handle(V2d_View)& aView,
Handle(Select2D_Projector)& NewProjector) // out parameter.
{
// to be changed : here we build a new projector each time.
// or we have to define a new one only if we change :
// the View
// the view zoom factor
// the view panning
// the fonts changes.
NewProjector = new StdSelect_TextProjector2d(aView);
return Standard_True;
}
// Manage Detected : update The Display
/*private*/ void ISession2D_InteractiveContext::ManageDetected(TColStd_MapOfTransient& aNewMapOfDetectedOwner)
{
Standard_Boolean NeedRedraw = Standard_False;
//======================================================================
// Treatement on the old Selection :
// for each owner :
// if the object is decomposed : Unhighlight the Owner,
// else Unhighlight the Object,except if selected
//======================================================================
TColStd_MapIteratorOfMapOfTransient anIterator(myMapOfDetectedOwner);
for (;anIterator.More();
anIterator.Next())
{
// for all owner :
Handle(ISession2D_ObjectOwner) TheOwner =
Handle(ISession2D_ObjectOwner)::DownCast(anIterator.Key());
Handle(AIS_InteractiveObject) TheObject =
Handle(AIS_InteractiveObject)::DownCast(TheOwner->Selectable());
// if the owner is not still detected
if (!aNewMapOfDetectedOwner.Contains(TheOwner))
{
NeedRedraw = Standard_True;
// if the corresponding object is a Shape and is not Decomposed
Handle(AIS_Shape) anAISShape = Handle(AIS_Shape)::DownCast(TheObject);
Standard_Boolean TreatementOnCompleteObject = Standard_True;
if (!anAISShape.IsNull())
if (anAISShape->AcceptShapeDecomposition() && anAISShape->HasSelectionMode())
TreatementOnCompleteObject = Standard_False;
if(TreatementOnCompleteObject)
{
// if the corresponding object is not Selected
if (!myMapOfSelectedOwner.Contains(TheOwner))
{
Standard_Integer DispMode ,HiMode,SelMode;
GetDefModes(TheObject,DispMode ,HiMode,SelMode);
if ( myPrsmgr->IsHighlighted(TheObject))
myPrsmgr->Unhighlight(TheObject,HiMode);
}
}
else
{
// UnHighlight the old detected Owner,
TheOwner->Unhilight(myPrsmgr);
}
}
}
//======================================================================
// Treatement on the New Selection
//======================================================================
anIterator.Initialize(aNewMapOfDetectedOwner);
if (!anIterator.More()) ((OCC_MainFrame*)AfxGetMainWnd())->SetStatusMessage("Nothing Detected");
for (;anIterator.More();
anIterator.Next())
{
// for all owner :
Handle(ISession2D_ObjectOwner) TheOwner =
Handle(ISession2D_ObjectOwner)::DownCast(anIterator.Key());
// update the message bar
((OCC_MainFrame*)AfxGetMainWnd())->SetStatusMessage(TheOwner->DumpMessage().ToCString());
Handle(AIS_InteractiveObject) TheObject =
Handle(AIS_InteractiveObject)::DownCast(TheOwner->Selectable());
// if the owner is not alwraidy detected
if (!myMapOfDetectedOwner.Contains(TheOwner))
{
NeedRedraw = Standard_True;
// if the corresponding object is a Shape and is not Decomposed
Handle(AIS_Shape) anAISShape = Handle(AIS_Shape)::DownCast(TheObject);
Standard_Boolean TreatementOnCompleteObject = Standard_True;
if (!anAISShape.IsNull())
if (anAISShape->AcceptShapeDecomposition() && anAISShape->HasSelectionMode())
TreatementOnCompleteObject = Standard_False;
if(TreatementOnCompleteObject)
{
// if the corresponding object is not Selected
if (!myMapOfSelectedOwner.Contains(TheOwner))
{
Standard_Integer DispMode ,HiMode,SelMode;
GetDefModes(TheObject,DispMode ,HiMode,SelMode);
if (!myPrsmgr->IsHighlighted(TheObject))
myPrsmgr->ColorHighlight(TheObject,myHilightColorIndex,HiMode);
}
}
else
{
// The Object Is Decomposed --> Specific Treatement on the owner
TheOwner->Hilight(myPrsmgr);
}
}
}
//======================================================================
// set the new detected map
//======================================================================
// set The new detected Owner
myMapOfDetectedOwner = aNewMapOfDetectedOwner;
if (NeedRedraw) myViewer->Update();
}
void ISession2D_InteractiveContext::Move(const Standard_Integer x1,
const Standard_Integer y1,
const Handle(V2d_View)& aView)
{
Handle(Select2D_Projector) aProjector;
if (NewProjector(aView,aProjector)) // if we need a new projector
mySelector->Set(aProjector);
mySelector->Pick(x1,y1,aView);
TColStd_MapOfTransient aNewMapOfDetectedOwner;
mySelector->Init();
if(mySelector->More())
{
Handle(SelectMgr_EntityOwner) aOwner = mySelector->OnePicked();
ASSERT(aOwner->IsKind(STANDARD_TYPE(ISession2D_ObjectOwner)));
Handle(ISession2D_ObjectOwner) aNewDetectedObjectOwner =
Handle(ISession2D_ObjectOwner)::DownCast(aOwner);
aNewMapOfDetectedOwner.Add(aNewDetectedObjectOwner);
}
ManageDetected(aNewMapOfDetectedOwner);
}
void ISession2D_InteractiveContext::Move(const Standard_Integer x1,
const Standard_Integer y1,
const Standard_Integer x2,
const Standard_Integer y2,
const Handle(V2d_View)& aView)
{
Handle(Select2D_Projector) aProjector;
if (NewProjector(aView,aProjector)) // if we need a new projector
mySelector->Set(aProjector);
mySelector->Pick(x1,y1,x2,y2,aView);
TColStd_MapOfTransient aNewMapOfDetectedOwner;
for(mySelector->Init();mySelector->More();mySelector->Next())
{
Handle(SelectMgr_EntityOwner) aOwner = mySelector->Picked();
ASSERT(aOwner->IsKind(STANDARD_TYPE(ISession2D_ObjectOwner)));
Handle(ISession2D_ObjectOwner) aNewDetectedObjectOwner =
Handle(ISession2D_ObjectOwner)::DownCast(aOwner);
aNewMapOfDetectedOwner.Add(aNewDetectedObjectOwner);
}
ManageDetected(aNewMapOfDetectedOwner);
}
void ISession2D_InteractiveContext::Pick(const Standard_Boolean MultiSelection)// = Standard_False
{
// We have a Map of all the seletected owners : myMapOfSelectedOwner;
// if we are not in MultiSelection.
// UnHighLight and keep out the map all the last selected objects
if (!MultiSelection)
{
TColStd_MapIteratorOfMapOfTransient anIterator(myMapOfSelectedOwner);
for (;anIterator.More();
anIterator.Next())
{
Handle(ISession2D_ObjectOwner) TheOwner =
Handle(ISession2D_ObjectOwner)::DownCast(anIterator.Key());
Handle(AIS_InteractiveObject) TheObject =
Handle(AIS_InteractiveObject)::DownCast(TheOwner->Selectable());
// UnHighLight The Last Selected ObjectObject.
Unhighlight(TheObject, // Object
Standard_False); // Redraw
}
myMapOfSelectedOwner.Clear();
}
TColStd_MapIteratorOfMapOfTransient anIterator(myMapOfDetectedOwner);
for (;anIterator.More();
anIterator.Next())
{
// for all owner :
Handle(ISession2D_ObjectOwner) TheOwner =
Handle(ISession2D_ObjectOwner)::DownCast(anIterator.Key());
myMapOfSelectedOwner.Add(TheOwner);
Handle(AIS_InteractiveObject) TheObject =
Handle(AIS_InteractiveObject)::DownCast(TheOwner->Selectable());
Highlight(TheObject, // Object
Standard_False); // Redraw
}
myViewer->Update();
}
//=======================================================================
//function : GetDefModes
//purpose :
//=======================================================================
void ISession2D_InteractiveContext::GetDefModes(const Handle(AIS_InteractiveObject)& anObject,
Standard_Integer& DispMode,
Standard_Integer& HiMode,
Standard_Integer& SelMode)
{
DispMode = anObject->HasDisplayMode() ? anObject->DisplayMode() :
anObject->DefaultDisplayMode();
HiMode = anObject->HasHilightMode()? anObject->HilightMode():DispMode;
SelMode = anObject->HasSelectionMode()? anObject->SelectionMode() :
0;
}
void ISession2D_InteractiveContext::DisplayAreas()
{
if (IsAreasDisplayed) return;
myViewer->InitActiveViews();
while(myViewer->MoreActiveViews())
{
Handle(V2d_View) aView = myViewer->ActiveView();
mySelector->DisplayAreas(aView);
myViewer->NextActiveViews();
}
myViewer->Update();
IsAreasDisplayed= Standard_True;
}
void ISession2D_InteractiveContext::ClearAreas()
{
if (!IsAreasDisplayed) return;
mySelector->ClearAreas();
myViewer->Update();
IsAreasDisplayed= Standard_False;
}