mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-08-09 13:22:24 +03:00
0025129: Visualization - add interactive object for Points Cloud objects
New class AIS_PointCloud for displaying point sets. Update Graphic3d_ArrayOfPoints, OpenGl_PrimitiveArray and OpenGl_VertexBuffer classes to be able to use normals for points. Add Draw Harness command vpointcloud. Add test case v3d/point_cloud/sphere. Move protected method AIS_Shape::DisplayBox() to public function StdPrs_WFDeflectionRestrictedFace::AddBox(). Small correction of grids.list for v3d tests
This commit is contained in:
@@ -364,7 +364,8 @@ is
|
||||
|
||||
---Category: General Objects
|
||||
class ConnectedInteractive; --signature 0
|
||||
class MultipleConnectedInteractive; --signature 1
|
||||
class MultipleConnectedInteractive; --signature 1
|
||||
imported PointCloud;
|
||||
|
||||
---Category: DIMENSIONS AND RELATIONS
|
||||
|
||||
|
451
src/AIS/AIS_PointCloud.cxx
Normal file
451
src/AIS/AIS_PointCloud.cxx
Normal file
@@ -0,0 +1,451 @@
|
||||
// Created on: 2014-08-13
|
||||
// Created by: Maxim GLIBIN
|
||||
// Copyright (c) 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 <AIS_PointCloud.hxx>
|
||||
|
||||
#include <AIS_Drawer.hxx>
|
||||
#include <AIS_GraphicTool.hxx>
|
||||
#include <Graphic3d_AspectFillArea3d.hxx>
|
||||
#include <Graphic3d_AspectMarker3d.hxx>
|
||||
#include <Graphic3d_Group.hxx>
|
||||
#include <Prs3d_PointAspect.hxx>
|
||||
#include <Prs3d_Presentation.hxx>
|
||||
#include <Prs3d_Root.hxx>
|
||||
#include <Prs3d_ShadingAspect.hxx>
|
||||
#include <PrsMgr_ModedPresentation.hxx>
|
||||
#include <PrsMgr_Presentations.hxx>
|
||||
#include <Select3D_SensitiveBox.hxx>
|
||||
#include <SelectMgr_EntityOwner.hxx>
|
||||
#include <SelectMgr_Selection.hxx>
|
||||
#include <StdPrs_WFDeflectionRestrictedFace.hxx>
|
||||
|
||||
IMPLEMENT_STANDARD_HANDLE (AIS_PointCloud, AIS_InteractiveObject)
|
||||
IMPLEMENT_STANDARD_RTTIEXT(AIS_PointCloud, AIS_InteractiveObject)
|
||||
|
||||
//==================================================
|
||||
// Function: AIS_PointCloud
|
||||
// Purpose : Constructor
|
||||
//==================================================
|
||||
AIS_PointCloud::AIS_PointCloud()
|
||||
{
|
||||
SetDisplayMode (AIS_PointCloud::DM_Points);
|
||||
SetHilightMode (AIS_PointCloud::DM_BndBox);
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : GetPoints
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
const Handle(Graphic3d_ArrayOfPoints) AIS_PointCloud::GetPoints() const
|
||||
{
|
||||
return myPoints;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : GetBoundingBox
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
Bnd_Box AIS_PointCloud::GetBoundingBox() const
|
||||
{
|
||||
return myBndBox;
|
||||
}
|
||||
|
||||
//! Auxiliary method
|
||||
static inline Bnd_Box getBoundingBox (const Handle(Graphic3d_ArrayOfPoints)& thePoints)
|
||||
{
|
||||
Bnd_Box aBndBox;
|
||||
if (thePoints.IsNull())
|
||||
{
|
||||
return aBndBox;
|
||||
}
|
||||
|
||||
const Standard_Integer aNbVertices = thePoints->VertexNumber();
|
||||
for (Standard_Integer aVertIter = 1; aVertIter <= aNbVertices; ++aVertIter)
|
||||
{
|
||||
aBndBox.Add (thePoints->Vertice (aVertIter));
|
||||
}
|
||||
return aBndBox;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : SetPoints
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
void AIS_PointCloud::SetPoints (const Handle(Graphic3d_ArrayOfPoints)& thePoints)
|
||||
{
|
||||
myPoints = thePoints;
|
||||
myBndBox = getBoundingBox (thePoints);
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : SetPoints
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
void AIS_PointCloud::SetPoints (const Handle(TColgp_HArray1OfPnt)& theCoords,
|
||||
const Handle(Quantity_HArray1OfColor)& theColors,
|
||||
const Handle(TColgp_HArray1OfDir)& theNormals)
|
||||
{
|
||||
myPoints.Nullify();
|
||||
myBndBox.SetVoid();
|
||||
if (theCoords.IsNull())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
const Standard_Integer aNbPoints = theCoords->Length();
|
||||
if ((!theNormals.IsNull() && theNormals->Length() != aNbPoints)
|
||||
|| (!theColors.IsNull() && theColors->Length() != aNbPoints))
|
||||
{
|
||||
// invalid input
|
||||
return;
|
||||
}
|
||||
|
||||
const Standard_Boolean hasColors = !theColors.IsNull() && theColors->Length() == aNbPoints;
|
||||
const Standard_Boolean hasNormals = !theNormals.IsNull() && theNormals->Length() == aNbPoints;
|
||||
|
||||
const Standard_Integer aDiffColors = hasColors ? (theColors->Lower() - theCoords->Lower()) : 0;
|
||||
const Standard_Integer aDiffNormals = hasNormals ? (theNormals->Lower() - theCoords->Lower()) : 0;
|
||||
|
||||
myPoints = new Graphic3d_ArrayOfPoints (aNbPoints, hasColors, hasNormals);
|
||||
for (Standard_Integer aPntIter = theCoords->Lower(); aPntIter <= theCoords->Upper(); ++aPntIter)
|
||||
{
|
||||
myPoints->AddVertex (theCoords->Value (aPntIter));
|
||||
if (hasColors)
|
||||
{
|
||||
myPoints->SetVertexColor (myPoints->VertexNumber(),
|
||||
theColors->Value (aPntIter + aDiffColors));
|
||||
}
|
||||
if (hasNormals)
|
||||
{
|
||||
myPoints->SetVertexNormal (myPoints->VertexNumber(),
|
||||
theNormals->Value (aPntIter + aDiffNormals));
|
||||
}
|
||||
}
|
||||
myBndBox = getBoundingBox (myPoints);
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : SetColor
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
void AIS_PointCloud::SetColor (const Quantity_NameOfColor theColor)
|
||||
{
|
||||
SetColor (Quantity_Color (theColor));
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : SetColor
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
void AIS_PointCloud::SetColor (const Quantity_Color& theColor)
|
||||
{
|
||||
AIS_InteractiveObject::SetColor(theColor);
|
||||
|
||||
if (!myDrawer->HasPointAspect())
|
||||
{
|
||||
myDrawer->SetPointAspect (new Prs3d_PointAspect (Aspect_TOM_POINT, theColor, 1.0));
|
||||
*myDrawer->PointAspect()->Aspect() = *myDrawer->Link()->PointAspect()->Aspect();
|
||||
}
|
||||
if (!myDrawer->HasShadingAspect())
|
||||
{
|
||||
myDrawer->SetShadingAspect (new Prs3d_ShadingAspect());
|
||||
*myDrawer->ShadingAspect()->Aspect() = *myDrawer->Link()->ShadingAspect()->Aspect();
|
||||
}
|
||||
|
||||
// Override color
|
||||
myDrawer->ShadingAspect()->SetColor (theColor);
|
||||
myDrawer->PointAspect() ->SetColor (theColor);
|
||||
|
||||
const PrsMgr_Presentations& aPrsList = Presentations();
|
||||
Handle(Graphic3d_AspectMarker3d) aPointAspect = myDrawer->PointAspect()->Aspect();
|
||||
Handle(Graphic3d_AspectFillArea3d) anAreaAspect = myDrawer->ShadingAspect()->Aspect();
|
||||
for (Standard_Integer aPrsIt = 1; aPrsIt <= aPrsList.Length(); ++aPrsIt)
|
||||
{
|
||||
const PrsMgr_ModedPresentation& aPrsModed = aPrsList.Value (aPrsIt);
|
||||
if (aPrsModed.Mode() != AIS_PointCloud::DM_Points)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
const Handle(Prs3d_Presentation)& aPrs = aPrsModed.Presentation()->Presentation();
|
||||
|
||||
// Set aspects for presentation
|
||||
aPrs->SetPrimitivesAspect (aPointAspect);
|
||||
aPrs->SetPrimitivesAspect (anAreaAspect);
|
||||
|
||||
// Go through all groups to change color for all primitives
|
||||
for (Graphic3d_SequenceOfGroup::Iterator aGroupIt (aPrs->Groups()); aGroupIt.More(); aGroupIt.Next())
|
||||
{
|
||||
const Handle(Graphic3d_Group)& aGroup = aGroupIt.Value();
|
||||
if (aGroup->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_MARKER))
|
||||
{
|
||||
aGroup->SetGroupPrimitivesAspect (aPointAspect);
|
||||
}
|
||||
if (aGroup->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_FILL_AREA))
|
||||
{
|
||||
aGroup->SetGroupPrimitivesAspect (anAreaAspect);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : UnsetColor
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
void AIS_PointCloud::UnsetColor()
|
||||
{
|
||||
if (!HasColor())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
AIS_InteractiveObject::UnsetColor();
|
||||
|
||||
if (!HasWidth())
|
||||
{
|
||||
myDrawer->SetPointAspect (Handle(Prs3d_PointAspect)());
|
||||
}
|
||||
else
|
||||
{
|
||||
Quantity_Color aColor;
|
||||
Aspect_TypeOfMarker aType = Aspect_TOM_POINT;
|
||||
Standard_Real aScale = 1.0;
|
||||
myDrawer->Link()->PointAspect()->Aspect()->Values (aColor, aType, aScale);
|
||||
myDrawer->PointAspect()->SetColor (aColor);
|
||||
}
|
||||
|
||||
if (HasMaterial()
|
||||
|| IsTransparent())
|
||||
{
|
||||
Graphic3d_MaterialAspect aMat = AIS_GraphicTool::GetMaterial (HasMaterial() ? myDrawer : myDrawer->Link());
|
||||
if (HasMaterial())
|
||||
{
|
||||
Quantity_Color aColor = myDrawer->Link()->ShadingAspect()->Color (myCurrentFacingModel);
|
||||
aMat.SetColor (aColor);
|
||||
}
|
||||
if (IsTransparent())
|
||||
{
|
||||
Standard_Real aTransp = myDrawer->ShadingAspect()->Transparency (myCurrentFacingModel);
|
||||
aMat.SetTransparency (aTransp);
|
||||
}
|
||||
myDrawer->ShadingAspect()->SetMaterial (aMat, myCurrentFacingModel);
|
||||
}
|
||||
else
|
||||
{
|
||||
myDrawer->SetShadingAspect (Handle(Prs3d_ShadingAspect)());
|
||||
}
|
||||
myDrawer->SetPointAspect (Handle(Prs3d_PointAspect)());
|
||||
|
||||
// modify shading presentation without re-computation
|
||||
const PrsMgr_Presentations& aPrsList = Presentations();
|
||||
Handle(Graphic3d_AspectFillArea3d) anAreaAsp = myDrawer->Link()->ShadingAspect()->Aspect();
|
||||
Handle(Graphic3d_AspectMarker3d) aMarkerAsp = myDrawer->Link()->PointAspect()->Aspect();
|
||||
for (Standard_Integer aPrsIt = 1; aPrsIt <= aPrsList.Length(); ++aPrsIt)
|
||||
{
|
||||
const PrsMgr_ModedPresentation& aPrsModed = aPrsList.Value (aPrsIt);
|
||||
if (aPrsModed.Mode() != AIS_PointCloud::DM_Points)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
const Handle(Prs3d_Presentation)& aPrs = aPrsModed.Presentation()->Presentation();
|
||||
aPrs->SetPrimitivesAspect (anAreaAsp);
|
||||
aPrs->SetPrimitivesAspect (aMarkerAsp);
|
||||
for (Graphic3d_SequenceOfGroup::Iterator aGroupIt (aPrs->Groups()); aGroupIt.More(); aGroupIt.Next())
|
||||
{
|
||||
const Handle(Graphic3d_Group)& aGroup = aGroupIt.Value();
|
||||
|
||||
// Check if aspect of given type is set for the group,
|
||||
// because setting aspect for group with no already set aspect
|
||||
// can lead to loss of presentation data
|
||||
if (aGroup->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_FILL_AREA))
|
||||
{
|
||||
aGroup->SetGroupPrimitivesAspect (anAreaAsp);
|
||||
}
|
||||
if (aGroup->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_MARKER))
|
||||
{
|
||||
aGroup->SetGroupPrimitivesAspect (aMarkerAsp);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : SetMaterial
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
void AIS_PointCloud::SetMaterial (const Graphic3d_NameOfMaterial theMatName)
|
||||
{
|
||||
SetMaterial (Graphic3d_MaterialAspect (theMatName));
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : SetMaterial
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
void AIS_PointCloud::SetMaterial (const Graphic3d_MaterialAspect& theMat)
|
||||
{
|
||||
if (!myDrawer->HasShadingAspect())
|
||||
{
|
||||
myDrawer->SetShadingAspect (new Prs3d_ShadingAspect());
|
||||
*myDrawer->ShadingAspect()->Aspect() = *myDrawer->Link()->ShadingAspect()->Aspect();
|
||||
}
|
||||
hasOwnMaterial = Standard_True;
|
||||
|
||||
myDrawer->ShadingAspect()->SetMaterial (theMat, myCurrentFacingModel);
|
||||
if (HasColor())
|
||||
{
|
||||
myDrawer->ShadingAspect()->SetColor (myOwnColor, myCurrentFacingModel);
|
||||
}
|
||||
myDrawer->ShadingAspect()->SetTransparency (myTransparency, myCurrentFacingModel);
|
||||
|
||||
// modify shading presentation without re-computation
|
||||
const PrsMgr_Presentations& aPrsList = Presentations();
|
||||
Handle(Graphic3d_AspectFillArea3d) anAreaAsp = myDrawer->ShadingAspect()->Aspect();
|
||||
for (Standard_Integer aPrsIt = 1; aPrsIt <= aPrsList.Length(); ++aPrsIt)
|
||||
{
|
||||
const PrsMgr_ModedPresentation& aPrsModed = aPrsList.Value (aPrsIt);
|
||||
if (aPrsModed.Mode() != AIS_PointCloud::DM_Points)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
const Handle(Prs3d_Presentation)& aPrs = aPrsModed.Presentation()->Presentation();
|
||||
aPrs->SetPrimitivesAspect (anAreaAsp);
|
||||
for (Graphic3d_SequenceOfGroup::Iterator aGroupIt (aPrs->Groups()); aGroupIt.More(); aGroupIt.Next())
|
||||
{
|
||||
const Handle(Graphic3d_Group)& aGroup = aGroupIt.Value();
|
||||
if (aGroup->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_FILL_AREA))
|
||||
{
|
||||
aGroup->SetGroupPrimitivesAspect (anAreaAsp);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : UnsetMaterial
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
void AIS_PointCloud::UnsetMaterial()
|
||||
{
|
||||
if (!HasMaterial())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (HasColor()
|
||||
|| IsTransparent())
|
||||
{
|
||||
myDrawer->ShadingAspect()->SetMaterial (myDrawer->Link()->ShadingAspect()->Material (myCurrentFacingModel),
|
||||
myCurrentFacingModel);
|
||||
if (HasColor())
|
||||
{
|
||||
myDrawer->ShadingAspect()->SetColor (myOwnColor, myCurrentFacingModel);
|
||||
myDrawer->ShadingAspect()->SetTransparency (myTransparency, myCurrentFacingModel);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
myDrawer->SetShadingAspect (Handle(Prs3d_ShadingAspect)());
|
||||
}
|
||||
hasOwnMaterial = Standard_False;
|
||||
|
||||
// modify shading presentation without re-computation
|
||||
const PrsMgr_Presentations& aPrsList = Presentations();
|
||||
Handle(Graphic3d_AspectFillArea3d) anAreaAsp = myDrawer->ShadingAspect()->Aspect();
|
||||
for (Standard_Integer aPrsIt = 1; aPrsIt <= aPrsList.Length(); ++aPrsIt)
|
||||
{
|
||||
const PrsMgr_ModedPresentation& aPrsModed = aPrsList.Value (aPrsIt);
|
||||
if (aPrsModed.Mode() != AIS_PointCloud::DM_Points)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
const Handle(Prs3d_Presentation)& aPrs = aPrsModed.Presentation()->Presentation();
|
||||
aPrs->SetPrimitivesAspect (anAreaAsp);
|
||||
for (Graphic3d_SequenceOfGroup::Iterator aGroupIt (aPrs->Groups()); aGroupIt.More(); aGroupIt.Next())
|
||||
{
|
||||
const Handle(Graphic3d_Group)& aGroup = aGroupIt.Value();
|
||||
if (aGroup->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_FILL_AREA))
|
||||
{
|
||||
aGroup->SetGroupPrimitivesAspect (anAreaAsp);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : Compute
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
void AIS_PointCloud::Compute (const Handle(PrsMgr_PresentationManager3d)& /*thePrsMgr*/,
|
||||
const Handle(Prs3d_Presentation)& thePrs,
|
||||
const Standard_Integer theMode)
|
||||
{
|
||||
thePrs->Clear();
|
||||
switch (theMode)
|
||||
{
|
||||
case AIS_PointCloud::DM_Points:
|
||||
{
|
||||
const Handle(Graphic3d_ArrayOfPoints) aPoints = GetPoints();
|
||||
if (aPoints.IsNull())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Handle(Graphic3d_AspectMarker3d) aMarkerAspect = myDrawer->PointAspect()->Aspect();
|
||||
if (!myDrawer->HasPointAspect())
|
||||
{
|
||||
aMarkerAspect->SetType (Aspect_TOM_POINT);
|
||||
}
|
||||
|
||||
Handle(Graphic3d_Group) aGroup = Prs3d_Root::CurrentGroup (thePrs);
|
||||
aGroup->SetGroupPrimitivesAspect (aMarkerAspect);
|
||||
aGroup->AddPrimitiveArray (aPoints);
|
||||
break;
|
||||
}
|
||||
case AIS_PointCloud::DM_BndBox:
|
||||
{
|
||||
Bnd_Box aBndBox = GetBoundingBox();
|
||||
if (aBndBox.IsVoid())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
StdPrs_WFDeflectionRestrictedFace::AddBox (thePrs, aBndBox, myDrawer);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : ComputeSelection
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
void AIS_PointCloud::ComputeSelection (const Handle(SelectMgr_Selection)& theSelection,
|
||||
const Standard_Integer /*theMode*/)
|
||||
{
|
||||
Bnd_Box aBndBox = GetBoundingBox();
|
||||
if (aBndBox.IsVoid())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Handle(SelectMgr_EntityOwner) anOwner = new SelectMgr_EntityOwner (this);
|
||||
Handle(Select3D_SensitiveBox) aSensBox = new Select3D_SensitiveBox (anOwner, aBndBox);
|
||||
theSelection->Add (aSensBox);
|
||||
}
|
128
src/AIS/AIS_PointCloud.hxx
Normal file
128
src/AIS/AIS_PointCloud.hxx
Normal file
@@ -0,0 +1,128 @@
|
||||
// Created on: 2014-08-13
|
||||
// Created by: Maxim GLIBIN
|
||||
// Copyright (c) 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 _AIS_PointCloud_HeaderFile
|
||||
#define _AIS_PointCloud_HeaderFile
|
||||
|
||||
#include <AIS.hxx>
|
||||
#include <AIS_InteractiveObject.hxx>
|
||||
#include <Bnd_Box.hxx>
|
||||
#include <Graphic3d_ArrayOfPoints.hxx>
|
||||
#include <Quantity_HArray1OfColor.hxx>
|
||||
#include <Standard.hxx>
|
||||
#include <Standard_DefineHandle.hxx>
|
||||
#include <Standard_Macro.hxx>
|
||||
#include <TColgp_HArray1OfDir.hxx>
|
||||
#include <TColgp_HArray1OfPnt.hxx>
|
||||
|
||||
DEFINE_STANDARD_HANDLE(AIS_PointCloud, AIS_InteractiveObject)
|
||||
|
||||
//! Interactive object for set of points.
|
||||
//! The presentation supports two display modes:
|
||||
//! - Points.
|
||||
//! - Bounding box for highlighting.
|
||||
//! Presentation provides selection by bouding box.
|
||||
//! Selection and consequently highlighting can disabled by
|
||||
//! setting default selection mode to -1. There will be no way
|
||||
//! to select object from interactive view. Any calls to
|
||||
//! AIS_InteractiveContext::AddOrRemoveSelected should be also prohibited,
|
||||
//! to avoid programmatic highlighting (workaround is setting non-supported
|
||||
//! hilight mode, e.g. 100);
|
||||
class AIS_PointCloud : public AIS_InteractiveObject
|
||||
{
|
||||
|
||||
public:
|
||||
|
||||
//! Display modes supported by this Point Cloud object
|
||||
enum DisplayMode
|
||||
{
|
||||
DM_Points = 0, //!< display as normal points, default presentation
|
||||
DM_BndBox = 2 //!< display as bounding box, default for highlighting
|
||||
};
|
||||
|
||||
public:
|
||||
|
||||
//! Constructor.
|
||||
Standard_EXPORT AIS_PointCloud();
|
||||
|
||||
//! Sets the points from array of points.
|
||||
//! Method will not copy the input data - array will be stored as handle.
|
||||
//! @param thePoints [in] the array of points
|
||||
Standard_EXPORT virtual void SetPoints (const Handle(Graphic3d_ArrayOfPoints)& thePoints);
|
||||
|
||||
//! Sets the points with optional colors.
|
||||
//! The input data will be copied into internal buffer.
|
||||
//! The input arrays should have equal length, otherwise
|
||||
//! the presentation will not be computed and displayed.
|
||||
//! @param theCoords [in] the array of coordinates
|
||||
//! @param theColors [in] optional array of colors
|
||||
//! @param theNormals [in] optional array of normals
|
||||
Standard_EXPORT virtual void SetPoints (const Handle(TColgp_HArray1OfPnt)& theCoords,
|
||||
const Handle(Quantity_HArray1OfColor)& theColors = NULL,
|
||||
const Handle(TColgp_HArray1OfDir)& theNormals = NULL);
|
||||
|
||||
public:
|
||||
|
||||
//! Get the points array.
|
||||
//! Method might be overridden to fill in points array dynamically from application data structures.
|
||||
//! @return the array of points
|
||||
Standard_EXPORT virtual const Handle(Graphic3d_ArrayOfPoints) GetPoints() const;
|
||||
|
||||
//! Get bounding box for presentation.
|
||||
Standard_EXPORT virtual Bnd_Box GetBoundingBox() const;
|
||||
|
||||
public:
|
||||
|
||||
//! Setup custom color. Affects presentation only when no per-point color attribute has been assigned.
|
||||
Standard_EXPORT virtual void SetColor (const Quantity_NameOfColor theColor);
|
||||
|
||||
//! Setup custom color. Affects presentation only when no per-point color attribute has been assigned.
|
||||
Standard_EXPORT virtual void SetColor (const Quantity_Color& theColor);
|
||||
|
||||
//! Restore default color.
|
||||
Standard_EXPORT virtual void UnsetColor();
|
||||
|
||||
//! Setup custom material. Affects presentation only when normals are defined.
|
||||
Standard_EXPORT virtual void SetMaterial (const Graphic3d_NameOfMaterial theMatName);
|
||||
|
||||
//! Setup custom material. Affects presentation only when normals are defined.
|
||||
Standard_EXPORT virtual void SetMaterial (const Graphic3d_MaterialAspect& theMat);
|
||||
|
||||
//! Restore default material.
|
||||
Standard_EXPORT virtual void UnsetMaterial();
|
||||
|
||||
protected:
|
||||
|
||||
//! Prepare presentation for this object.
|
||||
Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& thePrsMgr,
|
||||
const Handle(Prs3d_Presentation)& thePrs,
|
||||
const Standard_Integer theMode);
|
||||
|
||||
//! Prepare selection for this object.
|
||||
Standard_EXPORT virtual void ComputeSelection (const Handle(SelectMgr_Selection)& theSelection,
|
||||
const Standard_Integer theMode);
|
||||
|
||||
private:
|
||||
|
||||
Handle(Graphic3d_ArrayOfPoints) myPoints; //!< points array for presentation
|
||||
Bnd_Box myBndBox; //!< bounding box for presentation
|
||||
|
||||
public:
|
||||
|
||||
DEFINE_STANDARD_RTTI(AIS_PointCloud)
|
||||
|
||||
};
|
||||
|
||||
#endif // _AIS_PointCloud_HeaderFile
|
@@ -290,11 +290,7 @@ uses
|
||||
aProjector : Projector from Prs3d;
|
||||
aPresentation : Presentation from Prs3d;
|
||||
ashape : Shape from TopoDS) is static private;
|
||||
|
||||
DisplayBox(myclass; aPrs : Presentation from Prs3d;
|
||||
aBox : Box from Bnd;
|
||||
aDrawer : Drawer from Prs3d) is protected;
|
||||
|
||||
|
||||
setColor (me;
|
||||
theDrawer : Drawer from AIS;
|
||||
theColor : Color from Quantity)
|
||||
|
@@ -77,37 +77,6 @@
|
||||
|
||||
static Standard_Boolean myFirstCompute;
|
||||
|
||||
void AIS_Shape::DisplayBox(const Handle(Prs3d_Presentation)& aPrs,
|
||||
const Bnd_Box& B,
|
||||
const Handle(Prs3d_Drawer)& aDrawer)
|
||||
{
|
||||
static const Standard_Integer Indx[][3] =
|
||||
{ { 0, 0, 0 }, { 1, 0, 0 }, { 1, 0, 1 }, { 0, 0, 1 },
|
||||
{ 0, 1, 1 }, { 1, 1, 1 }, { 1, 1, 0 }, { 0, 1, 0 },
|
||||
{ 0, 0, 0 }, { 0, 0, 1 }, { 1, 0, 1 }, { 1, 1, 1 },
|
||||
{ 0, 1, 1 }, { 0, 1, 0 }, { 1, 1, 0 }, { 1, 0, 0 } };
|
||||
|
||||
if ( B.IsVoid() )
|
||||
return; // nothing to show
|
||||
|
||||
Standard_Real X[2],Y[2],Z[2];
|
||||
B.Get(X[0], Y[0], Z[0], X[1], Y[1], Z[1]);
|
||||
|
||||
Handle(Graphic3d_Group) G = Prs3d_Root::CurrentGroup(aPrs);
|
||||
Quantity_Color Q;
|
||||
Aspect_TypeOfLine A;
|
||||
Standard_Real W;
|
||||
aDrawer->LineAspect()->Aspect()->Values(Q,A,W);
|
||||
|
||||
G->SetGroupPrimitivesAspect(new Graphic3d_AspectLine3d(Q,Aspect_TOL_DOTDASH,W));
|
||||
|
||||
Handle(Graphic3d_ArrayOfPolylines) aPolyline = new Graphic3d_ArrayOfPolylines(16);
|
||||
Standard_Integer i(0);
|
||||
for(;i<16;i++)
|
||||
aPolyline->AddVertex(X[Indx[i][0]],Y[Indx[i][1]],Z[Indx[i][2]]);
|
||||
G->AddPrimitiveArray(aPolyline);
|
||||
}
|
||||
|
||||
static Standard_Boolean IsInList(const TColStd_ListOfInteger& LL, const Standard_Integer aMode)
|
||||
{
|
||||
TColStd_ListIteratorOfListOfInteger It(LL);
|
||||
@@ -238,7 +207,7 @@ void AIS_Shape::Compute(const Handle(PrsMgr_PresentationManager3d)& /*aPresentat
|
||||
{
|
||||
// bounding box
|
||||
if (IsInfinite()) StdPrs_WFDeflectionShape::Add(aPrs,myshape,myDrawer);
|
||||
else DisplayBox(aPrs,BoundingBox(),myDrawer);
|
||||
else StdPrs_WFDeflectionRestrictedFace::AddBox (aPrs, BoundingBox(), myDrawer);
|
||||
}
|
||||
} // end switch
|
||||
aPrs->ReCompute(); // for hidden line recomputation if necessary...
|
||||
|
@@ -374,7 +374,7 @@ void AIS_TexturedShape::Compute (const Handle(PrsMgr_PresentationManager3d)& /*t
|
||||
}
|
||||
else
|
||||
{
|
||||
AIS_Shape::DisplayBox (thePrs, BoundingBox(), myDrawer);
|
||||
StdPrs_WFDeflectionRestrictedFace::AddBox (thePrs, BoundingBox(), myDrawer);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@@ -21,3 +21,5 @@ AIS_DiameterDimension.hxx
|
||||
AIS_DiameterDimension.cxx
|
||||
AIS_RadiusDimension.hxx
|
||||
AIS_RadiusDimension.cxx
|
||||
AIS_PointCloud.hxx
|
||||
AIS_PointCloud.cxx
|
||||
|
Reference in New Issue
Block a user