mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-08-09 13:22:24 +03:00
0031220: Visualization - remove internal field of viewer selector in context
- Removed myMainSel field from AIS_InteractiveContext and obtained this value from mgrSelector. - Moved SelectMgr_ViewerSelector3d implementation into SelectMgr_ViewerSelector to get rid of redundant separation and extra DownCast's. - Declared SelectMgr_ViewerSelector3d as deprecated.
This commit is contained in:
@@ -67,5 +67,4 @@ SelectMgr_ViewClipRange.cxx
|
||||
SelectMgr_ViewClipRange.hxx
|
||||
SelectMgr_ViewerSelector.cxx
|
||||
SelectMgr_ViewerSelector.hxx
|
||||
SelectMgr_ViewerSelector3d.cxx
|
||||
SelectMgr_ViewerSelector3d.hxx
|
||||
|
@@ -23,7 +23,7 @@
|
||||
class SelectMgr_ViewerSelector;
|
||||
|
||||
//! Abstract class for filling pixel with color.
|
||||
//! This is internal tool for SelectMgr_ViewerSelector3d::ToPixMap().
|
||||
//! This is internal tool for SelectMgr_ViewerSelector::ToPixMap().
|
||||
class SelectMgr_SelectionImageFiller : public Standard_Transient
|
||||
{
|
||||
public:
|
||||
|
@@ -23,14 +23,17 @@
|
||||
#include <Precision.hxx>
|
||||
#include <Select3D_SensitiveEntity.hxx>
|
||||
#include <SelectBasics_PickResult.hxx>
|
||||
#include <SelectMgr.hxx>
|
||||
#include <SelectMgr_EntityOwner.hxx>
|
||||
#include <SelectMgr_FrustumBuilder.hxx>
|
||||
#include <SelectMgr_SortCriterion.hxx>
|
||||
#include <SelectMgr_SelectionImageFiller.hxx>
|
||||
#include <SelectMgr_SensitiveEntitySet.hxx>
|
||||
#include <SelectMgr_SortCriterion.hxx>
|
||||
#include <TColStd_Array1OfInteger.hxx>
|
||||
#include <TCollection_AsciiString.hxx>
|
||||
#include <TColStd_HArray1OfInteger.hxx>
|
||||
#include <TColStd_ListOfInteger.hxx>
|
||||
#include <V3d_View.hxx>
|
||||
|
||||
#include <algorithm>
|
||||
|
||||
@@ -297,6 +300,30 @@ void SelectMgr_ViewerSelector::checkOverlap (const Handle(Select3D_SensitiveEnti
|
||||
}
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
// Function: updateZLayers
|
||||
// Purpose :
|
||||
//=======================================================================
|
||||
void SelectMgr_ViewerSelector::updateZLayers (const Handle(V3d_View)& theView)
|
||||
{
|
||||
myZLayerOrderMap.Clear();
|
||||
TColStd_SequenceOfInteger aZLayers;
|
||||
theView->Viewer()->GetAllZLayers (aZLayers);
|
||||
Standard_Integer aPos = 0;
|
||||
Standard_Boolean isPrevDepthWrite = true;
|
||||
for (TColStd_SequenceOfInteger::Iterator aLayerIter (aZLayers); aLayerIter.More(); aLayerIter.Next())
|
||||
{
|
||||
Graphic3d_ZLayerSettings aSettings = theView->Viewer()->ZLayerSettings (aLayerIter.Value());
|
||||
if (aSettings.ToClearDepth()
|
||||
|| isPrevDepthWrite != aSettings.ToEnableDepthWrite())
|
||||
{
|
||||
++aPos;
|
||||
}
|
||||
isPrevDepthWrite = aSettings.ToEnableDepthWrite();
|
||||
myZLayerOrderMap.Bind (aLayerIter.Value(), aPos);
|
||||
}
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
// function: computeFrustum
|
||||
// purpose :
|
||||
@@ -1125,6 +1152,208 @@ void SelectMgr_ViewerSelector::AllowOverlapDetection (const Standard_Boolean the
|
||||
mySelectingVolumeMgr.AllowOverlapDetection (theIsToAllow);
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
// Function: Pick
|
||||
// Purpose :
|
||||
//=======================================================================
|
||||
void SelectMgr_ViewerSelector::Pick (const Standard_Integer theXPix,
|
||||
const Standard_Integer theYPix,
|
||||
const Handle(V3d_View)& theView)
|
||||
{
|
||||
updateZLayers (theView);
|
||||
|
||||
gp_Pnt2d aMousePos (static_cast<Standard_Real> (theXPix),
|
||||
static_cast<Standard_Real> (theYPix));
|
||||
mySelectingVolumeMgr.InitPointSelectingVolume (aMousePos);
|
||||
|
||||
mySelectingVolumeMgr.SetPixelTolerance (myTolerances.Tolerance());
|
||||
mySelectingVolumeMgr.SetCamera (theView->Camera());
|
||||
Standard_Integer aWidth = 0, aHeight = 0;
|
||||
theView->Window()->Size (aWidth, aHeight);
|
||||
mySelectingVolumeMgr.SetWindowSize (aWidth, aHeight);
|
||||
|
||||
mySelectingVolumeMgr.BuildSelectingVolume();
|
||||
mySelectingVolumeMgr.SetViewClipping (theView->ClipPlanes(), Handle(Graphic3d_SequenceOfHClipPlane)(), NULL);
|
||||
|
||||
TraverseSensitives();
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
// Function: Pick
|
||||
// Purpose :
|
||||
//=======================================================================
|
||||
void SelectMgr_ViewerSelector::Pick (const Standard_Integer theXPMin,
|
||||
const Standard_Integer theYPMin,
|
||||
const Standard_Integer theXPMax,
|
||||
const Standard_Integer theYPMax,
|
||||
const Handle(V3d_View)& theView)
|
||||
{
|
||||
updateZLayers (theView);
|
||||
|
||||
gp_Pnt2d aMinMousePos (static_cast<Standard_Real> (theXPMin),
|
||||
static_cast<Standard_Real> (theYPMin));
|
||||
gp_Pnt2d aMaxMousePos (static_cast<Standard_Real> (theXPMax),
|
||||
static_cast<Standard_Real> (theYPMax));
|
||||
mySelectingVolumeMgr.InitBoxSelectingVolume (aMinMousePos,
|
||||
aMaxMousePos);
|
||||
|
||||
mySelectingVolumeMgr.SetCamera (theView->Camera());
|
||||
Standard_Integer aWidth = 0, aHeight = 0;
|
||||
theView->Window()->Size (aWidth, aHeight);
|
||||
mySelectingVolumeMgr.SetWindowSize (aWidth, aHeight);
|
||||
|
||||
mySelectingVolumeMgr.BuildSelectingVolume();
|
||||
mySelectingVolumeMgr.SetViewClipping (theView->ClipPlanes(), Handle(Graphic3d_SequenceOfHClipPlane)(), NULL);
|
||||
TraverseSensitives();
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
// Function: Pick
|
||||
// Purpose : Selection using a polyline
|
||||
//=======================================================================
|
||||
void SelectMgr_ViewerSelector::Pick (const TColgp_Array1OfPnt2d& thePolyline,
|
||||
const Handle(V3d_View)& theView)
|
||||
{
|
||||
updateZLayers (theView);
|
||||
|
||||
mySelectingVolumeMgr.InitPolylineSelectingVolume (thePolyline);
|
||||
mySelectingVolumeMgr.SetCamera (theView->Camera());
|
||||
Standard_Integer aWidth = 0, aHeight = 0;
|
||||
theView->Window()->Size (aWidth, aHeight);
|
||||
mySelectingVolumeMgr.SetWindowSize (aWidth, aHeight);
|
||||
mySelectingVolumeMgr.BuildSelectingVolume();
|
||||
mySelectingVolumeMgr.SetViewClipping (theView->ClipPlanes(), Handle(Graphic3d_SequenceOfHClipPlane)(), NULL);
|
||||
|
||||
TraverseSensitives();
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
// Function: Pick
|
||||
// Purpose :
|
||||
//=======================================================================
|
||||
void SelectMgr_ViewerSelector::Pick (const gp_Ax1& theAxis,
|
||||
const Handle(V3d_View)& theView)
|
||||
{
|
||||
updateZLayers (theView);
|
||||
|
||||
mySelectingVolumeMgr.InitAxisSelectingVolume (theAxis);
|
||||
mySelectingVolumeMgr.BuildSelectingVolume();
|
||||
mySelectingVolumeMgr.SetViewClipping (theView->ClipPlanes(), Handle(Graphic3d_SequenceOfHClipPlane)(), NULL);
|
||||
|
||||
TraverseSensitives();
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : ToPixMap
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
Standard_Boolean SelectMgr_ViewerSelector::ToPixMap (Image_PixMap& theImage,
|
||||
const Handle(V3d_View)& theView,
|
||||
const StdSelect_TypeOfSelectionImage theType,
|
||||
const Standard_Integer thePickedIndex)
|
||||
{
|
||||
if (theImage.IsEmpty())
|
||||
{
|
||||
throw Standard_ProgramError ("SelectMgr_ViewerSelector::ToPixMap() has been called with empty image");
|
||||
}
|
||||
|
||||
Handle(SelectMgr_SelectionImageFiller) aFiller = SelectMgr_SelectionImageFiller::CreateFiller (theImage, this, theType);
|
||||
if (aFiller.IsNull())
|
||||
{
|
||||
return Standard_False;
|
||||
}
|
||||
|
||||
const Standard_Integer aSizeX = static_cast<Standard_Integer> (theImage.SizeX());
|
||||
const Standard_Integer aSizeY = static_cast<Standard_Integer> (theImage.SizeY());
|
||||
for (Standard_Integer aRowIter = 0; aRowIter < aSizeY; ++aRowIter)
|
||||
{
|
||||
for (Standard_Integer aColIter = 0; aColIter < aSizeX; ++aColIter)
|
||||
{
|
||||
Pick (aColIter, aRowIter, theView);
|
||||
aFiller->Fill (aColIter, aRowIter, thePickedIndex);
|
||||
}
|
||||
}
|
||||
aFiller->Flush();
|
||||
return Standard_True;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
// Function: DisplaySensitive.
|
||||
// Purpose : Display active primitives.
|
||||
//=======================================================================
|
||||
void SelectMgr_ViewerSelector::DisplaySensitive (const Handle(V3d_View)& theView)
|
||||
{
|
||||
for (SelectMgr_SelectableObjectSet::Iterator aSelectableIt (mySelectableObjects); aSelectableIt.More(); aSelectableIt.Next())
|
||||
{
|
||||
Handle(Graphic3d_Structure) aStruct = new Graphic3d_Structure (theView->Viewer()->StructureManager());
|
||||
const Handle (SelectMgr_SelectableObject)& anObj = aSelectableIt.Value();
|
||||
for (SelectMgr_SequenceOfSelection::Iterator aSelIter (anObj->Selections()); aSelIter.More(); aSelIter.Next())
|
||||
{
|
||||
if (aSelIter.Value()->GetSelectionState() == SelectMgr_SOS_Activated)
|
||||
{
|
||||
SelectMgr::ComputeSensitivePrs (aStruct, aSelIter.Value(), anObj->Transformation(), anObj->TransformPersistence());
|
||||
}
|
||||
}
|
||||
|
||||
myStructs.Append (aStruct);
|
||||
}
|
||||
|
||||
for (Graphic3d_SequenceOfStructure::Iterator aStructIter (myStructs); aStructIter.More(); aStructIter.Next())
|
||||
{
|
||||
Handle(Graphic3d_Structure)& aStruct = aStructIter.ChangeValue();
|
||||
aStruct->SetDisplayPriority (10);
|
||||
aStruct->Display();
|
||||
}
|
||||
|
||||
theView->Update();
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
// Function: ClearSensitive
|
||||
// Purpose :
|
||||
//=======================================================================
|
||||
void SelectMgr_ViewerSelector::ClearSensitive (const Handle(V3d_View)& theView)
|
||||
{
|
||||
for (Graphic3d_SequenceOfStructure::Iterator aStructIter (myStructs); aStructIter.More(); aStructIter.Next())
|
||||
{
|
||||
const Handle(Graphic3d_Structure)& aPrs = aStructIter.ChangeValue();
|
||||
aPrs->Erase();
|
||||
aPrs->Clear();
|
||||
aPrs->Remove();
|
||||
}
|
||||
myStructs.Clear();
|
||||
|
||||
if (!theView.IsNull())
|
||||
{
|
||||
theView->Update();
|
||||
}
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : DisplaySenstive
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
void SelectMgr_ViewerSelector::DisplaySensitive (const Handle(SelectMgr_Selection)& theSel,
|
||||
const gp_Trsf& theTrsf,
|
||||
const Handle(V3d_View)& theView,
|
||||
const Standard_Boolean theToClearOthers)
|
||||
{
|
||||
if (theToClearOthers)
|
||||
{
|
||||
ClearSensitive (theView);
|
||||
}
|
||||
|
||||
Handle(Graphic3d_Structure) aStruct = new Graphic3d_Structure (theView->Viewer()->StructureManager());
|
||||
|
||||
SelectMgr::ComputeSensitivePrs (aStruct, theSel, theTrsf, Handle(Graphic3d_TransformPers)());
|
||||
|
||||
myStructs.Append (aStruct);
|
||||
myStructs.Last()->SetDisplayPriority (10);
|
||||
myStructs.Last()->Display();
|
||||
|
||||
theView->Update();
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : DumpJson
|
||||
//purpose :
|
||||
@@ -1159,6 +1388,13 @@ void SelectMgr_ViewerSelector::DumpJson (Standard_OStream& theOStream, Standard_
|
||||
|
||||
OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsLeftChildQueuedFirst)
|
||||
OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myMapOfObjectSensitives.Extent())
|
||||
|
||||
OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myStructs.Length())
|
||||
for (Graphic3d_SequenceOfStructure::Iterator aStructsIt (myStructs); aStructsIt.More(); aStructsIt.Next())
|
||||
{
|
||||
const Handle(Graphic3d_Structure)& aStructure = aStructsIt.Value();
|
||||
OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, aStructure)
|
||||
}
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
|
@@ -17,12 +17,11 @@
|
||||
#ifndef _SelectMgr_ViewerSelector_HeaderFile
|
||||
#define _SelectMgr_ViewerSelector_HeaderFile
|
||||
|
||||
#include <Standard_Transient.hxx>
|
||||
#include <Graphic3d_SequenceOfStructure.hxx>
|
||||
#include <NCollection_DataMap.hxx>
|
||||
#include <OSD_Chronometer.hxx>
|
||||
#include <TColStd_SequenceOfInteger.hxx>
|
||||
#include <TColStd_HArray1OfInteger.hxx>
|
||||
#include <Select3D_BVHBuilder3d.hxx>
|
||||
#include <SelectMgr_BVHThreadPool.hxx>
|
||||
#include <SelectMgr_IndexedDataMapOfOwnerCriterion.hxx>
|
||||
#include <SelectMgr_SelectingVolumeManager.hxx>
|
||||
#include <SelectMgr_Selection.hxx>
|
||||
@@ -31,13 +30,20 @@
|
||||
#include <SelectMgr_StateOfSelection.hxx>
|
||||
#include <SelectMgr_ToleranceMap.hxx>
|
||||
#include <SelectMgr_TypeOfDepthTolerance.hxx>
|
||||
#include <SelectMgr_ViewerSelector.hxx>
|
||||
#include <Standard_OStream.hxx>
|
||||
#include <SelectMgr_BVHThreadPool.hxx>
|
||||
#include <Standard_Transient.hxx>
|
||||
#include <StdSelect_TypeOfSelectionImage.hxx>
|
||||
#include <TColStd_HArray1OfInteger.hxx>
|
||||
#include <TColStd_SequenceOfInteger.hxx>
|
||||
|
||||
class Graphic3d_Structure;
|
||||
class Graphic3d_TransformPers;
|
||||
class SelectMgr_SelectionManager;
|
||||
class SelectMgr_SensitiveEntitySet;
|
||||
class SelectMgr_EntityOwner;
|
||||
class Select3D_SensitiveEntity;
|
||||
class V3d_View;
|
||||
|
||||
// resolve name collisions with X11 headers
|
||||
#ifdef Status
|
||||
@@ -84,6 +90,9 @@ class SelectMgr_ViewerSelector : public Standard_Transient
|
||||
friend class SelectMgr_SelectionManager;
|
||||
public:
|
||||
|
||||
//! Constructs an empty selector object.
|
||||
Standard_EXPORT SelectMgr_ViewerSelector();
|
||||
|
||||
//! Returns custom pixel tolerance value.
|
||||
Standard_Integer CustomPixelTolerance() const { return myTolerances.CustomTolerance(); }
|
||||
|
||||
@@ -244,6 +253,57 @@ public:
|
||||
//! mark both included and overlapped entities as matched
|
||||
Standard_EXPORT void AllowOverlapDetection (const Standard_Boolean theIsToAllow);
|
||||
|
||||
public:
|
||||
|
||||
//! Picks the sensitive entity at the pixel coordinates of
|
||||
//! the mouse <theXPix> and <theYPix>. The selector looks for touched areas and owners.
|
||||
Standard_EXPORT void Pick (const Standard_Integer theXPix,
|
||||
const Standard_Integer theYPix,
|
||||
const Handle(V3d_View)& theView);
|
||||
|
||||
//! Picks the sensitive entity according to the minimum
|
||||
//! and maximum pixel values <theXPMin>, <theYPMin>, <theXPMax>
|
||||
//! and <theYPMax> defining a 2D area for selection in the 3D view aView.
|
||||
Standard_EXPORT void Pick (const Standard_Integer theXPMin,
|
||||
const Standard_Integer theYPMin,
|
||||
const Standard_Integer theXPMax,
|
||||
const Standard_Integer theYPMax,
|
||||
const Handle(V3d_View)& theView);
|
||||
|
||||
//! pick action - input pixel values for polyline selection for selection.
|
||||
Standard_EXPORT void Pick (const TColgp_Array1OfPnt2d& thePolyline,
|
||||
const Handle(V3d_View)& theView);
|
||||
|
||||
//! Picks the sensitive entity according to the input axis.
|
||||
//! This is geometric intersection 3D objects by axis
|
||||
//! (camera parameters are ignored and objects with transform persistance are skipped).
|
||||
Standard_EXPORT void Pick (const gp_Ax1& theAxis,
|
||||
const Handle(V3d_View)& theView);
|
||||
|
||||
//! Dump of detection results into image.
|
||||
//! This method performs axis picking for each pixel in the image
|
||||
//! and generates a color depending on picking results and selection image type.
|
||||
//! @param theImage result image, should be initialized
|
||||
//! @param theView 3D view defining camera position
|
||||
//! @param theType type of image to define
|
||||
//! @param thePickedIndex index of picked entity (1 means topmost)
|
||||
Standard_EXPORT Standard_Boolean ToPixMap (Image_PixMap& theImage,
|
||||
const Handle(V3d_View)& theView,
|
||||
const StdSelect_TypeOfSelectionImage theType,
|
||||
const Standard_Integer thePickedIndex = 1);
|
||||
|
||||
public:
|
||||
|
||||
//! Displays sensitives in view <theView>.
|
||||
Standard_EXPORT void DisplaySensitive (const Handle(V3d_View)& theView);
|
||||
|
||||
Standard_EXPORT void ClearSensitive (const Handle(V3d_View)& theView);
|
||||
|
||||
Standard_EXPORT void DisplaySensitive (const Handle(SelectMgr_Selection)& theSel,
|
||||
const gp_Trsf& theTrsf,
|
||||
const Handle(V3d_View)& theView,
|
||||
const Standard_Boolean theToClearOthers = Standard_True);
|
||||
|
||||
//! Dumps the content of me into the stream
|
||||
Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const;
|
||||
|
||||
@@ -266,8 +326,6 @@ public:
|
||||
|
||||
protected:
|
||||
|
||||
Standard_EXPORT SelectMgr_ViewerSelector();
|
||||
|
||||
//! Traverses BVH containing all added selectable objects and
|
||||
//! finds candidates for further search of overlap
|
||||
Standard_EXPORT void TraverseSensitives();
|
||||
@@ -292,6 +350,9 @@ protected:
|
||||
const gp_GTrsf& theInversedTrsf,
|
||||
SelectMgr_SelectingVolumeManager& theMgr);
|
||||
|
||||
//! Update z-layers order map.
|
||||
Standard_EXPORT void updateZLayers (const Handle(V3d_View)& theView);
|
||||
|
||||
private:
|
||||
|
||||
//! Checks if the entity given requires to scale current selecting frustum
|
||||
@@ -349,6 +410,8 @@ protected:
|
||||
Standard_Boolean myIsLeftChildQueuedFirst;
|
||||
SelectMgr_MapOfObjectSensitives myMapOfObjectSensitives;
|
||||
|
||||
Graphic3d_SequenceOfStructure myStructs; //!< list of debug presentations
|
||||
|
||||
};
|
||||
|
||||
DEFINE_STANDARD_HANDLE(SelectMgr_ViewerSelector, Standard_Transient)
|
||||
|
@@ -1,283 +0,0 @@
|
||||
// Created on: 1995-03-15
|
||||
// Created by: Robert COUBLANC
|
||||
// Copyright (c) 1995-1999 Matra Datavision
|
||||
// Copyright (c) 1999-2014 OPEN CASCADE SAS
|
||||
//
|
||||
// This file is part of Open CASCADE Technology software library.
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or modify it under
|
||||
// the terms of the GNU Lesser General Public License version 2.1 as published
|
||||
// by the Free Software Foundation, with special exception defined in the file
|
||||
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
|
||||
// distribution for complete text of the license and disclaimer of any warranty.
|
||||
//
|
||||
// Alternatively, this file may be used under the terms of Open CASCADE
|
||||
// commercial license or contractual agreement.
|
||||
|
||||
#include <SelectMgr_ViewerSelector3d.hxx>
|
||||
|
||||
#include <Graphic3d_SequenceOfHClipPlane.hxx>
|
||||
#include <Graphic3d_Structure.hxx>
|
||||
#include <math_BullardGenerator.hxx>
|
||||
#include <Quantity_ColorHasher.hxx>
|
||||
#include <TColgp_Array1OfPnt2d.hxx>
|
||||
#include <SelectMgr.hxx>
|
||||
#include <SelectMgr_EntityOwner.hxx>
|
||||
#include <SelectMgr_SelectableObject.hxx>
|
||||
#include <SelectMgr_Selection.hxx>
|
||||
#include <SelectMgr_SelectionImageFiller.hxx>
|
||||
#include <V3d_View.hxx>
|
||||
#include <V3d_Viewer.hxx>
|
||||
|
||||
IMPLEMENT_STANDARD_RTTIEXT(SelectMgr_ViewerSelector3d, SelectMgr_ViewerSelector)
|
||||
|
||||
//=======================================================================
|
||||
// Function : Constructor
|
||||
// Purpose :
|
||||
//=======================================================================
|
||||
SelectMgr_ViewerSelector3d::SelectMgr_ViewerSelector3d()
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
// Function: Pick
|
||||
// Purpose :
|
||||
//=======================================================================
|
||||
void SelectMgr_ViewerSelector3d::Pick (const Standard_Integer theXPix,
|
||||
const Standard_Integer theYPix,
|
||||
const Handle(V3d_View)& theView)
|
||||
{
|
||||
updateZLayers (theView);
|
||||
|
||||
gp_Pnt2d aMousePos (static_cast<Standard_Real> (theXPix),
|
||||
static_cast<Standard_Real> (theYPix));
|
||||
mySelectingVolumeMgr.InitPointSelectingVolume (aMousePos);
|
||||
|
||||
mySelectingVolumeMgr.SetPixelTolerance (myTolerances.Tolerance());
|
||||
mySelectingVolumeMgr.SetCamera (theView->Camera());
|
||||
Standard_Integer aWidth = 0, aHeight = 0;
|
||||
theView->Window()->Size (aWidth, aHeight);
|
||||
mySelectingVolumeMgr.SetWindowSize (aWidth, aHeight);
|
||||
|
||||
mySelectingVolumeMgr.BuildSelectingVolume();
|
||||
mySelectingVolumeMgr.SetViewClipping (theView->ClipPlanes(), Handle(Graphic3d_SequenceOfHClipPlane)(), NULL);
|
||||
|
||||
TraverseSensitives();
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
// Function: Pick
|
||||
// Purpose :
|
||||
//=======================================================================
|
||||
void SelectMgr_ViewerSelector3d::Pick (const Standard_Integer theXPMin,
|
||||
const Standard_Integer theYPMin,
|
||||
const Standard_Integer theXPMax,
|
||||
const Standard_Integer theYPMax,
|
||||
const Handle(V3d_View)& theView)
|
||||
{
|
||||
updateZLayers (theView);
|
||||
|
||||
gp_Pnt2d aMinMousePos (static_cast<Standard_Real> (theXPMin),
|
||||
static_cast<Standard_Real> (theYPMin));
|
||||
gp_Pnt2d aMaxMousePos (static_cast<Standard_Real> (theXPMax),
|
||||
static_cast<Standard_Real> (theYPMax));
|
||||
mySelectingVolumeMgr.InitBoxSelectingVolume (aMinMousePos,
|
||||
aMaxMousePos);
|
||||
|
||||
mySelectingVolumeMgr.SetCamera (theView->Camera());
|
||||
Standard_Integer aWidth = 0, aHeight = 0;
|
||||
theView->Window()->Size (aWidth, aHeight);
|
||||
mySelectingVolumeMgr.SetWindowSize (aWidth, aHeight);
|
||||
|
||||
mySelectingVolumeMgr.BuildSelectingVolume();
|
||||
mySelectingVolumeMgr.SetViewClipping (theView->ClipPlanes(), Handle(Graphic3d_SequenceOfHClipPlane)(), NULL);
|
||||
TraverseSensitives();
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
// Function: Pick
|
||||
// Purpose : Selection using a polyline
|
||||
//=======================================================================
|
||||
void SelectMgr_ViewerSelector3d::Pick (const TColgp_Array1OfPnt2d& thePolyline,
|
||||
const Handle(V3d_View)& theView)
|
||||
{
|
||||
updateZLayers (theView);
|
||||
|
||||
mySelectingVolumeMgr.InitPolylineSelectingVolume (thePolyline);
|
||||
mySelectingVolumeMgr.SetCamera (theView->Camera());
|
||||
Standard_Integer aWidth = 0, aHeight = 0;
|
||||
theView->Window()->Size (aWidth, aHeight);
|
||||
mySelectingVolumeMgr.SetWindowSize (aWidth, aHeight);
|
||||
mySelectingVolumeMgr.BuildSelectingVolume();
|
||||
mySelectingVolumeMgr.SetViewClipping (theView->ClipPlanes(), Handle(Graphic3d_SequenceOfHClipPlane)(), NULL);
|
||||
|
||||
TraverseSensitives();
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
// Function: Pick
|
||||
// Purpose :
|
||||
//=======================================================================
|
||||
void SelectMgr_ViewerSelector3d::Pick (const gp_Ax1& theAxis,
|
||||
const Handle(V3d_View)& theView)
|
||||
{
|
||||
updateZLayers (theView);
|
||||
|
||||
mySelectingVolumeMgr.InitAxisSelectingVolume (theAxis);
|
||||
mySelectingVolumeMgr.BuildSelectingVolume();
|
||||
mySelectingVolumeMgr.SetViewClipping (theView->ClipPlanes(), Handle(Graphic3d_SequenceOfHClipPlane)(), NULL);
|
||||
|
||||
TraverseSensitives();
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
// Function: DisplaySensitive.
|
||||
// Purpose : Display active primitives.
|
||||
//=======================================================================
|
||||
void SelectMgr_ViewerSelector3d::DisplaySensitive (const Handle(V3d_View)& theView)
|
||||
{
|
||||
for (SelectMgr_SelectableObjectSet::Iterator aSelectableIt (mySelectableObjects); aSelectableIt.More(); aSelectableIt.Next())
|
||||
{
|
||||
Handle(Graphic3d_Structure) aStruct = new Graphic3d_Structure (theView->Viewer()->StructureManager());
|
||||
const Handle (SelectMgr_SelectableObject)& anObj = aSelectableIt.Value();
|
||||
for (SelectMgr_SequenceOfSelection::Iterator aSelIter (anObj->Selections()); aSelIter.More(); aSelIter.Next())
|
||||
{
|
||||
if (aSelIter.Value()->GetSelectionState() == SelectMgr_SOS_Activated)
|
||||
{
|
||||
SelectMgr::ComputeSensitivePrs (aStruct, aSelIter.Value(), anObj->Transformation(), anObj->TransformPersistence());
|
||||
}
|
||||
}
|
||||
|
||||
myStructs.Append (aStruct);
|
||||
}
|
||||
|
||||
for (Graphic3d_SequenceOfStructure::Iterator aStructIter (myStructs); aStructIter.More(); aStructIter.Next())
|
||||
{
|
||||
Handle(Graphic3d_Structure)& aStruct = aStructIter.ChangeValue();
|
||||
aStruct->SetDisplayPriority (10);
|
||||
aStruct->Display();
|
||||
}
|
||||
|
||||
theView->Update();
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
// Function: ClearSensitive
|
||||
// Purpose :
|
||||
//=======================================================================
|
||||
void SelectMgr_ViewerSelector3d::ClearSensitive (const Handle(V3d_View)& theView)
|
||||
{
|
||||
for (Graphic3d_SequenceOfStructure::Iterator aStructIter (myStructs); aStructIter.More(); aStructIter.Next())
|
||||
{
|
||||
const Handle(Graphic3d_Structure)& aPrs = aStructIter.ChangeValue();
|
||||
aPrs->Erase();
|
||||
aPrs->Clear();
|
||||
aPrs->Remove();
|
||||
}
|
||||
myStructs.Clear();
|
||||
|
||||
if (!theView.IsNull())
|
||||
{
|
||||
theView->Update();
|
||||
}
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : DisplaySenstive
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
void SelectMgr_ViewerSelector3d::DisplaySensitive (const Handle(SelectMgr_Selection)& theSel,
|
||||
const gp_Trsf& theTrsf,
|
||||
const Handle(V3d_View)& theView,
|
||||
const Standard_Boolean theToClearOthers)
|
||||
{
|
||||
if (theToClearOthers)
|
||||
{
|
||||
ClearSensitive (theView);
|
||||
}
|
||||
|
||||
Handle(Graphic3d_Structure) aStruct = new Graphic3d_Structure (theView->Viewer()->StructureManager());
|
||||
|
||||
SelectMgr::ComputeSensitivePrs (aStruct, theSel, theTrsf, Handle(Graphic3d_TransformPers)());
|
||||
|
||||
myStructs.Append (aStruct);
|
||||
myStructs.Last()->SetDisplayPriority (10);
|
||||
myStructs.Last()->Display();
|
||||
|
||||
theView->Update();
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
// Function: updateZLayers
|
||||
// Purpose :
|
||||
//=======================================================================
|
||||
void SelectMgr_ViewerSelector3d::updateZLayers (const Handle(V3d_View)& theView)
|
||||
{
|
||||
myZLayerOrderMap.Clear();
|
||||
TColStd_SequenceOfInteger aZLayers;
|
||||
theView->Viewer()->GetAllZLayers (aZLayers);
|
||||
Standard_Integer aPos = 0;
|
||||
Standard_Boolean isPrevDepthWrite = true;
|
||||
for (TColStd_SequenceOfInteger::Iterator aLayerIter (aZLayers); aLayerIter.More(); aLayerIter.Next())
|
||||
{
|
||||
Graphic3d_ZLayerSettings aSettings = theView->Viewer()->ZLayerSettings (aLayerIter.Value());
|
||||
if (aSettings.ToClearDepth()
|
||||
|| isPrevDepthWrite != aSettings.ToEnableDepthWrite())
|
||||
{
|
||||
++aPos;
|
||||
}
|
||||
isPrevDepthWrite = aSettings.ToEnableDepthWrite();
|
||||
myZLayerOrderMap.Bind (aLayerIter.Value(), aPos);
|
||||
}
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : ToPixMap
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
Standard_Boolean SelectMgr_ViewerSelector3d::ToPixMap (Image_PixMap& theImage,
|
||||
const Handle(V3d_View)& theView,
|
||||
const StdSelect_TypeOfSelectionImage theType,
|
||||
const Standard_Integer thePickedIndex)
|
||||
{
|
||||
if (theImage.IsEmpty())
|
||||
{
|
||||
throw Standard_ProgramError("SelectMgr_ViewerSelector3d::ToPixMap() has been called with empty image");
|
||||
}
|
||||
|
||||
Handle(SelectMgr_SelectionImageFiller) aFiller = SelectMgr_SelectionImageFiller::CreateFiller (theImage, this, theType);
|
||||
if (aFiller.IsNull())
|
||||
{
|
||||
return Standard_False;
|
||||
}
|
||||
|
||||
const Standard_Integer aSizeX = static_cast<Standard_Integer> (theImage.SizeX());
|
||||
const Standard_Integer aSizeY = static_cast<Standard_Integer> (theImage.SizeY());
|
||||
for (Standard_Integer aRowIter = 0; aRowIter < aSizeY; ++aRowIter)
|
||||
{
|
||||
for (Standard_Integer aColIter = 0; aColIter < aSizeX; ++aColIter)
|
||||
{
|
||||
Pick (aColIter, aRowIter, theView);
|
||||
aFiller->Fill (aColIter, aRowIter, thePickedIndex);
|
||||
}
|
||||
}
|
||||
aFiller->Flush();
|
||||
return Standard_True;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : DumpJson
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
void SelectMgr_ViewerSelector3d::DumpJson (Standard_OStream& theOStream, Standard_Integer) const
|
||||
{
|
||||
OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream)
|
||||
|
||||
OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myStructs.Length())
|
||||
for (Graphic3d_SequenceOfStructure::Iterator aStructsIt (myStructs); aStructsIt.More(); aStructsIt.Next())
|
||||
{
|
||||
const Handle(Graphic3d_Structure)& aStructure = aStructsIt.Value();
|
||||
OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, aStructure)
|
||||
}
|
||||
}
|
@@ -17,86 +17,9 @@
|
||||
#ifndef _SelectMgr_ViewerSelector3d_HeaderFile
|
||||
#define _SelectMgr_ViewerSelector3d_HeaderFile
|
||||
|
||||
#include <Graphic3d_SequenceOfStructure.hxx>
|
||||
#include <SelectMgr_ViewerSelector.hxx>
|
||||
#include <SelectMgr_Selection.hxx>
|
||||
#include <StdSelect_TypeOfSelectionImage.hxx>
|
||||
|
||||
class Graphic3d_Structure;
|
||||
class Graphic3d_TransformPers;
|
||||
class V3d_View;
|
||||
|
||||
//! Selector Usable by Viewers from V3d
|
||||
class SelectMgr_ViewerSelector3d : public SelectMgr_ViewerSelector
|
||||
{
|
||||
DEFINE_STANDARD_RTTIEXT(SelectMgr_ViewerSelector3d, SelectMgr_ViewerSelector)
|
||||
public:
|
||||
|
||||
//! Constructs an empty 3D selector object.
|
||||
Standard_EXPORT SelectMgr_ViewerSelector3d();
|
||||
|
||||
//! Picks the sensitive entity at the pixel coordinates of
|
||||
//! the mouse <theXPix> and <theYPix>. The selector looks for touched areas and owners.
|
||||
Standard_EXPORT void Pick (const Standard_Integer theXPix,
|
||||
const Standard_Integer theYPix,
|
||||
const Handle(V3d_View)& theView);
|
||||
|
||||
//! Picks the sensitive entity according to the minimum
|
||||
//! and maximum pixel values <theXPMin>, <theYPMin>, <theXPMax>
|
||||
//! and <theYPMax> defining a 2D area for selection in the 3D view aView.
|
||||
Standard_EXPORT void Pick (const Standard_Integer theXPMin,
|
||||
const Standard_Integer theYPMin,
|
||||
const Standard_Integer theXPMax,
|
||||
const Standard_Integer theYPMax,
|
||||
const Handle(V3d_View)& theView);
|
||||
|
||||
//! pick action - input pixel values for polyline selection for selection.
|
||||
Standard_EXPORT void Pick (const TColgp_Array1OfPnt2d& thePolyline,
|
||||
const Handle(V3d_View)& theView);
|
||||
|
||||
//! Picks the sensitive entity according to the input axis.
|
||||
//! This is geometric intersection 3D objects by axis
|
||||
//! (camera parameters are ignored and objects with transform persistance are skipped).
|
||||
Standard_EXPORT void Pick (const gp_Ax1& theAxis,
|
||||
const Handle(V3d_View)& theView);
|
||||
|
||||
//! Dump of detection results into image.
|
||||
//! This method performs axis picking for each pixel in the image
|
||||
//! and generates a color depending on picking results and selection image type.
|
||||
//! @param theImage result image, should be initialized
|
||||
//! @param theView 3D view defining camera position
|
||||
//! @param theType type of image to define
|
||||
//! @param thePickedIndex index of picked entity (1 means topmost)
|
||||
Standard_EXPORT Standard_Boolean ToPixMap (Image_PixMap& theImage,
|
||||
const Handle(V3d_View)& theView,
|
||||
const StdSelect_TypeOfSelectionImage theType,
|
||||
const Standard_Integer thePickedIndex = 1);
|
||||
|
||||
public:
|
||||
|
||||
//! Displays sensitives in view <theView>.
|
||||
Standard_EXPORT void DisplaySensitive (const Handle(V3d_View)& theView);
|
||||
|
||||
Standard_EXPORT void ClearSensitive (const Handle(V3d_View)& theView);
|
||||
|
||||
Standard_EXPORT void DisplaySensitive (const Handle(SelectMgr_Selection)& theSel,
|
||||
const gp_Trsf& theTrsf,
|
||||
const Handle(V3d_View)& theView,
|
||||
const Standard_Boolean theToClearOthers = Standard_True);
|
||||
|
||||
//! Dumps the content of me into the stream
|
||||
Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const;
|
||||
|
||||
protected:
|
||||
|
||||
//! Update z-layers order map.
|
||||
Standard_EXPORT void updateZLayers (const Handle(V3d_View)& theView);
|
||||
|
||||
protected:
|
||||
|
||||
Graphic3d_SequenceOfStructure myStructs; //!< list of debug presentations
|
||||
};
|
||||
|
||||
DEFINE_STANDARD_HANDLE(SelectMgr_ViewerSelector3d, SelectMgr_ViewerSelector)
|
||||
Standard_DEPRECATED("Deprecated alias to moved class")
|
||||
typedef SelectMgr_ViewerSelector SelectMgr_ViewerSelector3d;
|
||||
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user