mirror of
https://github.com/Open-Cascade-SAS/OCCT.git
synced 2026-05-15 13:48:57 +08:00
A special mode for the selecting by polygon is added to select only completely overlapping objects. In order to track the sensitives that were included completely by defined polygon, the boundary points of the polygonal frustrum are stored in the variable myBoundaryPoints. If an sensitive intersects with at least one of the frustrums from myFrustums, then checking whether this object intersects with borders using the isIntersectBoundary method; if not, then the sensitive were included completely by defined polygon. Because the polygon can be concave, then to check the sensitive were included completely by defined polygon, it is not enough to check of all its points, it is necessary that the edges of the sensitive do not intersect polygonal frustrum. To do this, for polygonal selection, a call to the Overlaps method for a point was replaced by a call to a segment where necessary. bugs/vis/bug31440: test case added
108 lines
5.9 KiB
C++
108 lines
5.9 KiB
C++
// Created on: 2014-05-22
|
|
// Created by: Varvara POSKONINA
|
|
// Copyright (c) 2005-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.
|
|
|
|
#ifndef _SelectMgr_TriangularFrustumSet_HeaderFile
|
|
#define _SelectMgr_TriangularFrustumSet_HeaderFile
|
|
|
|
#include <NCollection_Handle.hxx>
|
|
#include <NCollection_List.hxx>
|
|
|
|
#include <SelectMgr_BaseFrustum.hxx>
|
|
#include <SelectMgr_TriangularFrustum.hxx>
|
|
|
|
typedef NCollection_List<Handle(SelectMgr_TriangularFrustum)> SelectMgr_TriangFrustums;
|
|
typedef NCollection_List<Handle(SelectMgr_TriangularFrustum)>::Iterator SelectMgr_TriangFrustumsIter;
|
|
|
|
//! This class is used to handle polyline selection. The main principle of polyline selection
|
|
//! algorithm is to split the polygon defined by polyline onto triangles. Than each of
|
|
//! them is considered as a base for triangular frustum building. In other
|
|
//! words, each triangle vertiex will be projected from 2d screen space to 3d world space
|
|
//! onto near and far view frustum planes. Thus, the projected triangles make up the bases of
|
|
//! selecting frustum. When the set of such frustums is created, the function determining
|
|
//! selection iterates through triangular frustum set and searches for overlap with any
|
|
//! frustum.
|
|
class SelectMgr_TriangularFrustumSet : public SelectMgr_BaseFrustum
|
|
{
|
|
public:
|
|
|
|
SelectMgr_TriangularFrustumSet();
|
|
|
|
~SelectMgr_TriangularFrustumSet() {};
|
|
|
|
//! Meshes polygon bounded by polyline. Than organizes a set of triangular frustums,
|
|
//! where each triangle's projection onto near and far view frustum planes is
|
|
//! considered as a frustum base
|
|
Standard_EXPORT virtual void Build (const TColgp_Array1OfPnt2d& thePoints) Standard_OVERRIDE;
|
|
|
|
//! Returns a copy of the frustum with all sub-volumes transformed according to the matrix given
|
|
Standard_EXPORT virtual Handle(SelectMgr_BaseFrustum) ScaleAndTransform (const Standard_Integer theScale,
|
|
const gp_GTrsf& theTrsf) const Standard_OVERRIDE;
|
|
|
|
Standard_EXPORT virtual Standard_Boolean Overlaps (const SelectMgr_Vec3& theMinPnt,
|
|
const SelectMgr_Vec3& theMaxPnt,
|
|
const SelectMgr_ViewClipRange& theClipRange,
|
|
SelectBasics_PickResult& thePickResult) const Standard_OVERRIDE;
|
|
|
|
Standard_EXPORT virtual Standard_Boolean Overlaps (const SelectMgr_Vec3& theMinPnt,
|
|
const SelectMgr_Vec3& theMaxPnt,
|
|
Standard_Boolean* theInside) const Standard_OVERRIDE;
|
|
|
|
Standard_EXPORT virtual Standard_Boolean Overlaps (const gp_Pnt& thePnt,
|
|
const SelectMgr_ViewClipRange& theClipRange,
|
|
SelectBasics_PickResult& thePickResult) const Standard_OVERRIDE;
|
|
|
|
Standard_EXPORT virtual Standard_Boolean Overlaps (const TColgp_Array1OfPnt& theArrayOfPnts,
|
|
Select3D_TypeOfSensitivity theSensType,
|
|
const SelectMgr_ViewClipRange& theClipRange,
|
|
SelectBasics_PickResult& thePickResult) const Standard_OVERRIDE;
|
|
|
|
Standard_EXPORT virtual Standard_Boolean Overlaps (const gp_Pnt& thePnt1,
|
|
const gp_Pnt& thePnt2,
|
|
const SelectMgr_ViewClipRange& theClipRange,
|
|
SelectBasics_PickResult& thePickResult) const Standard_OVERRIDE;
|
|
|
|
Standard_EXPORT virtual Standard_Boolean Overlaps (const gp_Pnt& thePnt1,
|
|
const gp_Pnt& thePnt2,
|
|
const gp_Pnt& thePnt3,
|
|
Select3D_TypeOfSensitivity theSensType,
|
|
const SelectMgr_ViewClipRange& theClipRange,
|
|
SelectBasics_PickResult& thePickResult) const Standard_OVERRIDE;
|
|
|
|
//! Stores plane equation coefficients (in the following form:
|
|
//! Ax + By + Cz + D = 0) to the given vector
|
|
Standard_EXPORT virtual void GetPlanes (NCollection_Vector<SelectMgr_Vec4>& thePlaneEquations) const Standard_OVERRIDE;
|
|
|
|
//! If theIsToAllow is false, only fully included sensitives will be detected, otherwise the algorithm will
|
|
//! mark both included and overlapped entities as matched
|
|
Standard_EXPORT virtual void SetAllowOverlapDetection (const Standard_Boolean theIsToAllow);
|
|
|
|
private:
|
|
|
|
//! Checks whether the segment intersects with the boundary of the current volume selection
|
|
Standard_EXPORT Standard_Boolean isIntersectBoundary (const gp_Pnt& thePnt1, const gp_Pnt& thePnt2) const;
|
|
|
|
//! Checks whether the triangle intersects with a segment
|
|
Standard_EXPORT Standard_Boolean segmentTriangleIntersection (const gp_Pnt &theOrig, const gp_Vec& theDir,
|
|
const gp_Pnt& theV1, const gp_Pnt& theV2, const gp_Pnt& theV3) const;
|
|
|
|
private:
|
|
|
|
SelectMgr_TriangFrustums myFrustums;
|
|
TColgp_Array1OfPnt myBoundaryPoints;
|
|
Standard_Boolean myToAllowOverlap;
|
|
};
|
|
|
|
#endif // _SelectMgr_TriangularFrustumSet_HeaderFile
|