// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
-#include <Standard_NotImplemented.hxx>
-
-#include <AIS_ConnectedInteractive.ixx>
-#include <SelectMgr_EntityOwner.hxx>
-#include <Select3D_SensitiveEntity.hxx>
-#include <Geom_Transformation.hxx>
-
-#include <PrsMgr_ModedPresentation.hxx>
-#include <PrsMgr_Presentation.hxx>
-
-#include <StdSelect_BRepOwner.hxx>
-
-#include <StdSelect.hxx>
-#include <TopTools_IndexedMapOfShape.hxx>
-#include <TopTools_OrientedShapeMapHasher.hxx>
+#include <AIS_ConnectedInteractive.hxx>
#include <AIS_InteractiveContext.hxx>
+#include <AIS_Shape.hxx>
#include <BRepTools.hxx>
+#include <NCollection_DataMap.hxx>
#include <Precision.hxx>
-#include <AIS_Drawer.hxx>
-#include <TopAbs_ShapeEnum.hxx>
+#include <Prs3d_Drawer.hxx>
+#include <Prs3d_Presentation.hxx>
+#include <Select3D_SensitiveEntity.hxx>
+#include <SelectMgr_EntityOwner.hxx>
+#include <SelectMgr_Selection.hxx>
+#include <Standard_NotImplemented.hxx>
#include <Standard_ProgramError.hxx>
-#include <StdPrs_WFDeflectionShape.hxx>
+#include <Standard_Type.hxx>
#include <StdPrs_HLRPolyShape.hxx>
-#include <Prs3d_Drawer.hxx>
-
-#include <AIS_Shape.hxx>
-
-#include <NCollection_DataMap.hxx>
+#include <StdPrs_WFShape.hxx>
+#include <StdSelect.hxx>
+#include <StdSelect_BRepOwner.hxx>
+#include <TopAbs_ShapeEnum.hxx>
+#include <TopoDS_Shape.hxx>
+#include <TopTools_IndexedMapOfShape.hxx>
+#include <TopTools_OrientedShapeMapHasher.hxx>
+IMPLEMENT_STANDARD_RTTIEXT(AIS_ConnectedInteractive,AIS_InteractiveObject)
//=======================================================================
//function : AIS_ConnectedInteractive
AIS_ConnectedInteractive::AIS_ConnectedInteractive(const PrsMgr_TypeOfPresentation3d aTypeOfPresentation3d):
AIS_InteractiveObject(aTypeOfPresentation3d)
{
- SetHilightMode(0);
+ //
}
//=======================================================================
-//function : Type
-//purpose :
-//=======================================================================
-AIS_KindOfInteractive AIS_ConnectedInteractive::Type() const
-{
- return AIS_KOI_Object;
-}
-
-Standard_Integer AIS_ConnectedInteractive::Signature() const
-{
- return 0;
-}
-
-
-//=======================================================================
-//function : Connect
-//purpose :
+//function : connect
+//purpose :
//=======================================================================
-void AIS_ConnectedInteractive::Connect (const Handle(AIS_InteractiveObject)& theAnotherObj)
+void AIS_ConnectedInteractive::connect (const Handle(AIS_InteractiveObject)& theAnotherObj,
+ const Handle(TopLoc_Datum3D)& theLocation)
{
- if (myReference == theAnotherObj) return;
+ if (myReference == theAnotherObj)
+ {
+ setLocalTransformation (theLocation);
+ return;
+ }
Handle(AIS_ConnectedInteractive) aConnected = Handle(AIS_ConnectedInteractive)::DownCast (theAnotherObj);
if (!aConnected.IsNull())
}
else
{
- Standard_ProgramError::Raise ("AIS_ConnectedInteractive::Connect() - object without own presentation can not be connected");
+ throw Standard_ProgramError("AIS_ConnectedInteractive::Connect() - object without own presentation can not be connected");
}
if (!myReference.IsNull())
{
+ if (myReference->HasInteractiveContext()
+ && myReference->GetContext()->DisplayStatus (myReference) != AIS_DS_None)
+ {
+ myReference.Nullify();
+ throw Standard_ProgramError("AIS_ConnectedInteractive::Connect() - connected object should NOT be displayed in context");
+ }
myTypeOfPresentation3d = myReference->TypeOfPresentation3d();
}
-
- theAnotherObj->AddChild (this);
+ setLocalTransformation (theLocation);
}
-//=======================================================================
-//function : Connect
-//purpose :
-//=======================================================================
-void AIS_ConnectedInteractive::Connect (const Handle(AIS_InteractiveObject)& theAnotherObj,
- const gp_Trsf& theLocation)
-{
- Connect (theAnotherObj);
-
- SetLocalTransformation (theLocation);
-}
-
-
//=======================================================================
//function : Disconnect
//purpose :
void AIS_ConnectedInteractive::Disconnect()
{
- for(Standard_Integer aPrsIter = 1; aPrsIter <= myPresentations.Length(); ++aPrsIter)
+ for (PrsMgr_Presentations::Iterator aPrsIter (myPresentations); aPrsIter.More(); aPrsIter.Next())
{
- const Handle(PrsMgr_Presentation)& aPrs = myPresentations (aPrsIter).Presentation();
+ const Handle(PrsMgr_Presentation)& aPrs = aPrsIter.Value();
if (!aPrs.IsNull())
{
- aPrs->Presentation()->DisconnectAll (Graphic3d_TOC_DESCENDANT);
+ aPrs->DisconnectAll (Graphic3d_TOC_DESCENDANT);
}
}
}
if (HasConnection())
{
thePrs->Clear (Standard_False);
- thePrs->RemoveAll();
+ thePrs->DisconnectAll (Graphic3d_TOC_DESCENDANT);
if (!myReference->HasInteractiveContext())
{
}
//=======================================================================
-//function : Compute
+//function : computeHLR
//purpose :
//=======================================================================
-void AIS_ConnectedInteractive::Compute (const Handle(Prs3d_Projector)& theProjector,
- const Handle(Geom_Transformation)& theTransformation,
- const Handle(Prs3d_Presentation)& thePresentation)
+void AIS_ConnectedInteractive::computeHLR (const Handle(Graphic3d_Camera)& theProjector,
+ const Handle(TopLoc_Datum3D)& theTransformation,
+ const Handle(Prs3d_Presentation)& thePresentation)
{
- updateShape (Standard_False);
+ const bool hasTrsf = !theTransformation.IsNull()
+ && theTransformation->Form() != gp_Identity;
+ updateShape (!hasTrsf);
if (myShape.IsNull())
{
return;
}
- const TopLoc_Location& aLocation = myShape.Location();
- TopoDS_Shape aShape = myShape.Located (TopLoc_Location (theTransformation->Trsf()) * aLocation);
- Compute (theProjector, thePresentation, aShape);
-}
-
-//=======================================================================
-//function : Compute
-//purpose :
-//=======================================================================
-void AIS_ConnectedInteractive::Compute(const Handle(Prs3d_Projector)& aProjector, const Handle(Prs3d_Presentation)& aPresentation)
-{
- updateShape (Standard_True);
- Compute (aProjector, aPresentation, myShape);
-}
-
-//=======================================================================
-//function : Compute
-//purpose :
-//=======================================================================
-void AIS_ConnectedInteractive::Compute (const Handle(Prs3d_Projector)& theProjector,
- const Handle(Prs3d_Presentation)& thePresentation,
- const TopoDS_Shape& theShape)
-{
- if (myShape.IsNull())
+ if (hasTrsf)
{
- return;
+ const TopLoc_Location& aLocation = myShape.Location();
+ TopoDS_Shape aShape = myShape.Located (TopLoc_Location (theTransformation->Trsf()) * aLocation);
+ AIS_Shape::computeHlrPresentation (theProjector, thePresentation, aShape, myDrawer);
}
-
- switch (theShape.ShapeType())
+ else
{
- case TopAbs_VERTEX:
- case TopAbs_EDGE:
- case TopAbs_WIRE:
- {
- thePresentation->SetDisplayPriority (4);
- StdPrs_WFDeflectionShape::Add (thePresentation, theShape, myDrawer);
- break;
- }
- default:
- {
- Handle(Prs3d_Drawer) aDefaultDrawer = GetContext()->DefaultDrawer();
- if (aDefaultDrawer->DrawHiddenLine())
- {
- myDrawer->EnableDrawHiddenLine();
- }
- else
- {
- myDrawer->DisableDrawHiddenLine();
- }
-
- Aspect_TypeOfDeflection aPrevDeflection = aDefaultDrawer->TypeOfDeflection();
- aDefaultDrawer->SetTypeOfDeflection(Aspect_TOD_RELATIVE);
-
- // process HLRAngle and HLRDeviationCoefficient()
- Standard_Real aPrevAngle = myDrawer->HLRAngle();
- Standard_Real aNewAngle = aDefaultDrawer->HLRAngle();
- if (Abs (aNewAngle - aPrevAngle) > Precision::Angular())
- {
- BRepTools::Clean (theShape);
- }
-
- myDrawer->SetHLRAngle (aNewAngle);
- myDrawer->SetHLRDeviationCoefficient (aDefaultDrawer->HLRDeviationCoefficient());
- StdPrs_HLRPolyShape::Add (thePresentation, theShape, myDrawer, theProjector);
- aDefaultDrawer->SetTypeOfDeflection (aPrevDeflection);
- }
+ AIS_Shape::computeHlrPresentation (theProjector, thePresentation, myShape, myDrawer);
}
}
if (!myReference->HasSelection (theMode))
{
- myReference->UpdateSelection (theMode);
+ myReference->RecomputePrimitives (theMode);
}
const Handle(SelectMgr_Selection)& TheRefSel = myReference->Selection (theMode);
Handle(SelectMgr_EntityOwner) anOwner = new SelectMgr_EntityOwner (this);
- Handle(Select3D_SensitiveEntity) aSensitive, aNewSensitive;
-
+
+ TopLoc_Location aLocation (Transformation());
+ anOwner->SetLocation (aLocation);
+
if (TheRefSel->IsEmpty())
{
- myReference->UpdateSelection (theMode);
+ myReference->RecomputePrimitives (theMode);
}
- for (TheRefSel->Init(); TheRefSel->More(); TheRefSel->Next())
+ for (NCollection_Vector<Handle(SelectMgr_SensitiveEntity)>::Iterator aSelEntIter (TheRefSel->Entities()); aSelEntIter.More(); aSelEntIter.Next())
{
- aSensitive = Handle(Select3D_SensitiveEntity)::DownCast (TheRefSel->Sensitive());
- if (!aSensitive.IsNull())
+ if (const Handle(Select3D_SensitiveEntity)& aSensitive = aSelEntIter.Value()->BaseSensitive())
{
- TopLoc_Location aLocation (Transformation());
// Get the copy of SE3D
- aNewSensitive = aSensitive->GetConnected (aLocation);
-
- aNewSensitive->Set(anOwner);
- // In case if SE3D caches some location-dependent data
- // that must be updated after setting OWN
- aNewSensitive->SetLocation (aLocation);
-
- theSelection->Add (aNewSensitive);
+ if (Handle(Select3D_SensitiveEntity) aNewSensitive = aSensitive->GetConnected())
+ {
+ aNewSensitive->Set(anOwner);
+ theSelection->Add (aNewSensitive);
+ }
}
}
}
Shapes2EntitiesMap;
if (!myReference->HasSelection (theMode))
- myReference->UpdateSelection (theMode);
-
- const Handle(SelectMgr_Selection)& aRefSel = myReference->Selection (theMode);
+ {
+ myReference->RecomputePrimitives (theMode);
+ }
+ const Handle(SelectMgr_Selection)& aRefSel = myReference->Selection (theMode);
if (aRefSel->IsEmpty() || aRefSel->UpdateStatus() == SelectMgr_TOU_Full)
{
- myReference->UpdateSelection (theMode);
+ myReference->RecomputePrimitives (theMode);
}
-
- Handle(StdSelect_BRepOwner) anOwner;
- TopLoc_Location aDummyLoc;
- Handle(Select3D_SensitiveEntity) aSE, aNewSE;
+ // Fill in the map of subshapes and corresponding sensitive entities associated with aMode
Shapes2EntitiesMap aShapes2EntitiesMap;
-
- SensitiveList aSEList;
- TopoDS_Shape aSubShape;
-
- // Fill in the map of subshapes and corresponding
- // sensitive entities associated with aMode
- for (aRefSel->Init(); aRefSel->More(); aRefSel->Next())
+ for (NCollection_Vector<Handle(SelectMgr_SensitiveEntity)>::Iterator aSelEntIter (aRefSel->Entities()); aSelEntIter.More(); aSelEntIter.Next())
{
- aSE = Handle(Select3D_SensitiveEntity)::DownCast (aRefSel->Sensitive());
- if(!aSE.IsNull())
+ if (const Handle(Select3D_SensitiveEntity)& aSE = aSelEntIter.Value()->BaseSensitive())
{
- anOwner = Handle(StdSelect_BRepOwner)::DownCast (aSE->OwnerId());
- if(!anOwner.IsNull())
+ if (Handle(StdSelect_BRepOwner) anOwner = Handle(StdSelect_BRepOwner)::DownCast (aSE->OwnerId()))
{
- aSubShape = anOwner->Shape();
+ const TopoDS_Shape& aSubShape = anOwner->Shape();
if(!aShapes2EntitiesMap.IsBound (aSubShape))
{
- aShapes2EntitiesMap.Bind (aSubShape, aSEList);
+ aShapes2EntitiesMap.Bind (aSubShape, SensitiveList());
}
aShapes2EntitiesMap (aSubShape).Append (aSE);
}
// Fill in selection from aShapes2EntitiesMap
for (Shapes2EntitiesMap::Iterator aMapIt (aShapes2EntitiesMap); aMapIt.More(); aMapIt.Next())
{
- aSEList = aMapIt.Value();
- anOwner = new StdSelect_BRepOwner (aMapIt.Key(),
- this,
- aSEList.First()->OwnerId()->Priority(),
- Standard_True);
-
+ const SensitiveList& aSEList = aMapIt.Value();
+ Handle(StdSelect_BRepOwner) anOwner = new StdSelect_BRepOwner (aMapIt.Key(), this, aSEList.First()->OwnerId()->Priority(), Standard_True);
+ anOwner->SetLocation (Transformation());
for (SensitiveList::Iterator aListIt (aSEList); aListIt.More(); aListIt.Next())
- {
- aSE = aListIt.Value();
-
- TopLoc_Location aLocation (Transformation());
- aNewSE = aSE->GetConnected (aDummyLoc);
- aNewSE->Set (anOwner);
- // In case if aSE caches some location-dependent data
- // that must be updated after setting anOwner
- aNewSE->SetLocation (aLocation);
-
- theSelection->Add (aNewSE);
+ {
+ if (Handle(Select3D_SensitiveEntity) aNewSE = aListIt.Value()->GetConnected())
+ {
+ aNewSE->Set (anOwner);
+ theSelection->Add (aNewSE);
+ }
}
}