mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-07-20 12:45:50 +03:00
318 lines
11 KiB
C++
Executable File
318 lines
11 KiB
C++
Executable File
// File: NIS_Drawer.cxx
|
|
// Created: 06.07.07 22:15
|
|
// Author: Alexander GRIGORIEV
|
|
// Copyright: Open Cascade 2007
|
|
|
|
#include <NIS_Drawer.hxx>
|
|
#include <NIS_InteractiveContext.hxx>
|
|
#include <NIS_InteractiveObject.hxx>
|
|
#include <TColStd_MapIteratorOfPackedMapOfInteger.hxx>
|
|
#include <Standard_TypeMismatch.hxx>
|
|
#include <Standard_NoSuchObject.hxx>
|
|
|
|
IMPLEMENT_STANDARD_HANDLE (NIS_Drawer, Standard_Transient)
|
|
IMPLEMENT_STANDARD_RTTIEXT (NIS_Drawer, Standard_Transient)
|
|
|
|
//=======================================================================
|
|
//function : NIS_Drawer
|
|
//purpose : Destructor
|
|
//=======================================================================
|
|
|
|
NIS_Drawer::~NIS_Drawer ()
|
|
{
|
|
NCollection_List<NIS_DrawList*>::Iterator anIter (myLists);
|
|
for (; anIter.More(); anIter.Next())
|
|
delete anIter.Value();
|
|
}
|
|
|
|
//=======================================================================
|
|
//function : Assign
|
|
//purpose :
|
|
//=======================================================================
|
|
|
|
void NIS_Drawer::Assign (const Handle_NIS_Drawer& theOther)
|
|
{
|
|
if (theOther->IsKind(DynamicType()) == Standard_False)
|
|
Standard_TypeMismatch::Raise ("NIS_Drawer::Assign");
|
|
}
|
|
|
|
//=======================================================================
|
|
//function : HashCode
|
|
//purpose :
|
|
//=======================================================================
|
|
|
|
Standard_Integer NIS_Drawer::HashCode(const Standard_Integer theN) const
|
|
{
|
|
return ::HashCode (DynamicType(), theN);
|
|
}
|
|
|
|
//=======================================================================
|
|
//function : IsEqual
|
|
//purpose :
|
|
//=======================================================================
|
|
|
|
Standard_Boolean NIS_Drawer::IsEqual (const Handle_NIS_Drawer& theOther) const
|
|
{
|
|
Standard_Boolean aResult (Standard_False);
|
|
if (theOther.IsNull() == Standard_False)
|
|
if (DynamicType() == theOther->DynamicType())
|
|
aResult = (myMapID.Extent() < 2048);
|
|
return aResult;
|
|
}
|
|
|
|
//=======================================================================
|
|
//function : BeforeDraw
|
|
//purpose : Called before Draw(), once per group of interactive objects.
|
|
//=======================================================================
|
|
|
|
void NIS_Drawer::BeforeDraw (const DrawType, const NIS_DrawList&)
|
|
{
|
|
}
|
|
|
|
//=======================================================================
|
|
//function : AfterDraw
|
|
//purpose : Called after Draw(), once per group of interactive objects.
|
|
//=======================================================================
|
|
|
|
void NIS_Drawer::AfterDraw (const DrawType, const NIS_DrawList&)
|
|
{
|
|
}
|
|
|
|
//=======================================================================
|
|
//function : redraw
|
|
//purpose :
|
|
//=======================================================================
|
|
|
|
void NIS_Drawer::redraw (const DrawType theType,
|
|
const Handle_NIS_View& theView)
|
|
{
|
|
if (myCtx &&
|
|
myMapID.IsEmpty() == Standard_False &&
|
|
theView.IsNull() == Standard_False)
|
|
{
|
|
NCollection_List<NIS_DrawList*>::Iterator anIter (myLists);
|
|
for (; anIter.More(); anIter.Next()) {
|
|
NIS_DrawList& aDrawList = * anIter.ChangeValue();
|
|
if (aDrawList.GetView() == theView) {
|
|
if (aDrawList.IsUpdated(theType)) {
|
|
aDrawList.BeginPrepare(theType);
|
|
prepareList (theType, aDrawList);
|
|
aDrawList.EndPrepare(theType);
|
|
}
|
|
aDrawList.Call(theType);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//=======================================================================
|
|
//function : SetUpdated
|
|
//purpose :
|
|
//=======================================================================
|
|
|
|
void NIS_Drawer::SetUpdated (const DrawType theType) const
|
|
{
|
|
NCollection_List<NIS_DrawList*>::Iterator anIter (myLists);
|
|
for (; anIter.More(); anIter.Next()) {
|
|
NIS_DrawList& aDrawList = * anIter.ChangeValue();
|
|
aDrawList.SetUpdated (theType);
|
|
}
|
|
const_cast<Bnd_B3f&>(myBox).Clear();
|
|
}
|
|
|
|
//=======================================================================
|
|
//function : SetUpdated
|
|
//purpose :
|
|
//=======================================================================
|
|
|
|
void NIS_Drawer::SetUpdated (const DrawType theType1,
|
|
const DrawType theType2) const
|
|
{
|
|
NCollection_List<NIS_DrawList*>::Iterator anIter (myLists);
|
|
for (; anIter.More(); anIter.Next()) {
|
|
NIS_DrawList& aDrawList = * anIter.ChangeValue();
|
|
aDrawList.SetUpdated (theType1);
|
|
aDrawList.SetUpdated (theType2);
|
|
}
|
|
const_cast<Bnd_B3f&>(myBox).Clear();
|
|
}
|
|
|
|
//=======================================================================
|
|
//function : SetUpdated
|
|
//purpose :
|
|
//=======================================================================
|
|
|
|
|
|
void NIS_Drawer::SetUpdated (const DrawType theType1,
|
|
const DrawType theType2,
|
|
const DrawType theType3) const
|
|
{
|
|
NCollection_List<NIS_DrawList*>::Iterator anIter (myLists);
|
|
for (; anIter.More(); anIter.Next()) {
|
|
NIS_DrawList& aDrawList = * anIter.ChangeValue();
|
|
aDrawList.SetUpdated (theType1);
|
|
aDrawList.SetUpdated (theType2);
|
|
aDrawList.SetUpdated (theType3);
|
|
}
|
|
const_cast<Bnd_B3f&>(myBox).Clear();
|
|
}
|
|
|
|
//=======================================================================
|
|
//function : SetDynamicHilighted
|
|
//purpose :
|
|
//=======================================================================
|
|
|
|
void NIS_Drawer::SetDynamicHilighted
|
|
(const Standard_Boolean isHilighted,
|
|
const Handle_NIS_InteractiveObject& theObj,
|
|
const Handle_NIS_View& theView)
|
|
{
|
|
if (myCtx && theObj.IsNull() == Standard_False) {
|
|
NCollection_List<NIS_DrawList*>::Iterator anIter (myLists);
|
|
if (theView.IsNull()) {
|
|
for (; anIter.More(); anIter.Next()) {
|
|
NIS_DrawList& aDrawList = * anIter.ChangeValue();
|
|
aDrawList.SetDynHilighted (isHilighted, theObj);
|
|
aDrawList.SetUpdated (Draw_DynHilighted);
|
|
}
|
|
theObj->myIsDynHilighted = isHilighted;
|
|
} else
|
|
for (; anIter.More(); anIter.Next()) {
|
|
NIS_DrawList& aDrawList = * anIter.ChangeValue();
|
|
if (aDrawList.GetView() == theView) {
|
|
aDrawList.SetDynHilighted (isHilighted, theObj);
|
|
theObj->myIsDynHilighted = isHilighted;
|
|
aDrawList.SetUpdated (Draw_DynHilighted);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//=======================================================================
|
|
//function : removeObject
|
|
//purpose :
|
|
//=======================================================================
|
|
|
|
void NIS_Drawer::removeObject (const NIS_InteractiveObject * theObj,
|
|
const Standard_Boolean isUpdateViews)
|
|
{
|
|
const Standard_Integer anID = theObj->ID();
|
|
myMapID.Remove (anID);
|
|
// Stop dynamic hilighting if it has been activated
|
|
if (theObj->IsDynHilighted())
|
|
SetDynamicHilighted (Standard_False, theObj);
|
|
// Set Updated for the draw type.
|
|
if (theObj->IsHidden() == Standard_False && isUpdateViews)
|
|
SetUpdated (theObj->DrawType());
|
|
}
|
|
|
|
//=======================================================================
|
|
//function : addObject
|
|
//purpose :
|
|
//=======================================================================
|
|
|
|
void NIS_Drawer::addObject (const NIS_InteractiveObject * theObj,
|
|
const Standard_Boolean isUpdateViews)
|
|
{
|
|
myMapID.Add (theObj->ID());
|
|
|
|
// Fill the drawer (if new) with DrawList instances for available Views.
|
|
if ( myLists.IsEmpty())
|
|
{
|
|
NCollection_List<Handle_NIS_View>::Iterator anIter (GetContext()->myViews);
|
|
for (; anIter.More(); anIter.Next())
|
|
myLists.Append (createDefaultList(anIter.Value()));
|
|
}
|
|
|
|
if (theObj->IsHidden() == Standard_False && isUpdateViews)
|
|
SetUpdated (theObj->DrawType());
|
|
}
|
|
|
|
//=======================================================================
|
|
//function : GetBox
|
|
//purpose :
|
|
//=======================================================================
|
|
|
|
const Bnd_B3f& NIS_Drawer::GetBox (const NIS_View * pView) const
|
|
{
|
|
if (myBox.IsVoid()) {
|
|
if (myCtx) {
|
|
TColStd_MapIteratorOfPackedMapOfInteger anIter;
|
|
if (pView == 0L)
|
|
anIter.Initialize (myMapID);
|
|
else {
|
|
NCollection_List<NIS_DrawList*>::Iterator anIterL (myLists);
|
|
for (; anIterL.More(); anIterL.Next()) {
|
|
NIS_DrawList& aDrawList = * anIterL.ChangeValue();
|
|
if (aDrawList.GetView().operator->() == pView)
|
|
break;
|
|
}
|
|
if (anIterL.More())
|
|
anIter.Initialize (myMapID);
|
|
}
|
|
|
|
for (; anIter.More(); anIter.Next()) {
|
|
const Handle(NIS_InteractiveObject)& anObj =
|
|
myCtx->GetObject(anIter.Key());
|
|
if (anObj.IsNull() == Standard_False)
|
|
if (anObj->IsHidden() == Standard_False)
|
|
const_cast<Bnd_B3f&>(myBox).Add (anObj->GetBox());
|
|
}
|
|
}
|
|
}
|
|
return myBox;
|
|
}
|
|
|
|
|
|
//=======================================================================
|
|
//function : prepareList
|
|
//purpose :
|
|
//=======================================================================
|
|
void NIS_Drawer::prepareList( const NIS_Drawer::DrawType theType,
|
|
const NIS_DrawList& theDrawList )
|
|
{
|
|
if (!myCtx)
|
|
return;
|
|
|
|
// Dynamic hilighting is treated in a separate loop because the hilighted
|
|
// instances are contained in the special list rather than in the Context
|
|
if (theType == NIS_Drawer::Draw_DynHilighted) {
|
|
NCollection_List<Handle_NIS_InteractiveObject>::Iterator
|
|
anIter (theDrawList.DynHilightedList());
|
|
for (; anIter.More(); anIter.Next())
|
|
{
|
|
BeforeDraw (theType, theDrawList);
|
|
Draw (anIter.Value(), NIS_Drawer::Draw_DynHilighted, theDrawList);
|
|
AfterDraw (theType, theDrawList);
|
|
}
|
|
} else {
|
|
// The common part of two maps (objects for this draw type & objects in
|
|
// the current Drawer) is used for updating the presentation.
|
|
TColStd_PackedMapOfInteger mapObj;
|
|
mapObj.Intersection (myCtx->myMapObjects[theType&0x3], myMapID);
|
|
TColStd_MapIteratorOfPackedMapOfInteger anIter (mapObj);
|
|
if (anIter.More()) {
|
|
BeforeDraw (theType, theDrawList);
|
|
for (; anIter.More(); anIter.Next()) {
|
|
const Handle(NIS_InteractiveObject)& anObj =
|
|
myCtx->GetObject(anIter.Key());
|
|
if (anObj.IsNull() == Standard_False)
|
|
if (anObj->IsHidden() == Standard_False)
|
|
Draw (anObj, theType, theDrawList);
|
|
}
|
|
AfterDraw (theType, theDrawList);
|
|
}
|
|
}
|
|
}
|
|
|
|
//=======================================================================
|
|
//function : createDefaultList
|
|
//purpose :
|
|
//=======================================================================
|
|
NIS_DrawList* NIS_Drawer::createDefaultList
|
|
(const Handle_NIS_View& theView) const
|
|
{
|
|
return new NIS_DrawList( theView );
|
|
}
|