diff --git a/src/AIS/AIS.cdl b/src/AIS/AIS.cdl index 75098fd7d4..3756366f4e 100644 --- a/src/AIS/AIS.cdl +++ b/src/AIS/AIS.cdl @@ -367,7 +367,8 @@ is ---Category: General Objects class ConnectedInteractive; --signature 0 - class MultipleConnectedInteractive; --signature 1 + class MultipleConnectedInteractive; --signature 1 + imported PointCloud; ---Category: DIMENSIONS AND RELATIONS diff --git a/src/AIS/AIS_PointCloud.cxx b/src/AIS/AIS_PointCloud.cxx new file mode 100644 index 0000000000..0b63b95bfb --- /dev/null +++ b/src/AIS/AIS_PointCloud.cxx @@ -0,0 +1,146 @@ +// 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 +#include +#include + +#include +#include + +#include +#include +#include + +#include +#include + +IMPLEMENT_STANDARD_HANDLE(AIS_PointCloud, AIS_InteractiveObject) +IMPLEMENT_STANDARD_RTTIEXT(AIS_PointCloud, AIS_InteractiveObject) + +//================================================== +// Function: AIS_PointCloud +// Purpose : Constructor +//================================================== +AIS_PointCloud::AIS_PointCloud() +: AIS_InteractiveObject() +{ +} + +//======================================================================= +//function : SetPoints +//purpose : +//======================================================================= +void AIS_PointCloud::SetPoints (const Handle(Graphic3d_ArrayOfPoints)& thePoints) +{ + myPoints.Nullify(); + + if (thePoints.IsNull()) + return; + + myPoints = thePoints; +} + +//======================================================================= +//function : SetPoints +//purpose : +//======================================================================= +void AIS_PointCloud::SetPoints (const Handle(TColgp_HArray1OfPnt)& theCoords, + const Handle(Quantity_HArray1OfColor)& theColors) +{ + myPoints.Nullify(); + + if (theCoords.IsNull()) + return; + + Standard_Integer aNumPoints = theCoords->Length(); + + Standard_Boolean aHasColors = Standard_False; + if (!theColors.IsNull() && aNumPoints == theColors->Length()) + aHasColors = Standard_True; + + myPoints = new Graphic3d_ArrayOfPoints (aNumPoints, aHasColors); + + for (Standard_Integer aPntIter = theCoords->Lower(); aPntIter <= theCoords->Upper(); aPntIter++) + { + myPoints->AddVertex (theCoords->Value (aPntIter)); + } + + if (aHasColors) + { + Standard_Integer aNumVertex = 1; + for(Standard_Integer aColorIter = theColors->Lower(); aColorIter <= theColors->Upper(); aColorIter++) + { + myPoints->SetVertexColor (aNumVertex, theColors->Value (aColorIter)); + aNumVertex++; + } + } +} + +//======================================================================= +//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) +{ + if (!myDrawer->HasPointAspect()) + { + myDrawer->SetPointAspect (new Prs3d_PointAspect (Aspect_TOM_POINT, theColor, 1.0)); + *myDrawer->PointAspect()->Aspect() = *myDrawer->Link()->PointAspect()->Aspect(); + } + myDrawer->PointAspect()->SetColor (theColor); + + hasOwnColor = Standard_True; + myOwnColor = theColor; +} + +//======================================================================= +//function : Compute +//purpose : +//======================================================================= +void AIS_PointCloud::Compute(const Handle(PrsMgr_PresentationManager3d)& /*thePresentationManager*/, + const Handle(Prs3d_Presentation)& thePresentation, + const Standard_Integer /*theMode*/) +{ + thePresentation->Clear(); + + if (GetPoints().IsNull() || !GetPoints()->IsValid()) + return; + + Handle(Graphic3d_Group) aGroup = Prs3d_Root::CurrentGroup (thePresentation); + if (myDrawer->HasPointAspect()) + { + aGroup->SetPrimitivesAspect (myDrawer->PointAspect()->Aspect()); + } + aGroup->AddPrimitiveArray (GetPoints()); +} + +//======================================================================= +//function : ComputeSelection +//purpose : +//======================================================================= +void AIS_PointCloud::ComputeSelection(const Handle(SelectMgr_Selection)& /*theSelection*/, + const Standard_Integer /*theMode*/) +{ +} diff --git a/src/AIS/AIS_PointCloud.hxx b/src/AIS/AIS_PointCloud.hxx new file mode 100644 index 0000000000..6a875d8b4c --- /dev/null +++ b/src/AIS/AIS_PointCloud.hxx @@ -0,0 +1,83 @@ +// 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 +#include + +#include + +#include + +#include +#include +#include + +#include +#include + +DEFINE_STANDARD_HANDLE (AIS_PointCloud, AIS_InteractiveObject) + +//! Interactive object for set of points. +class AIS_PointCloud : public AIS_InteractiveObject +{ + +public: + + //! Constructor + Standard_EXPORT AIS_PointCloud (); + + //! Sets the points from array of points. + //! @detailed This function allows to avoid data duplication. + //! @param thePoints [in] the array of points. + Standard_EXPORT virtual void SetPoints (const Handle(Graphic3d_ArrayOfPoints)& thePoints); + + //! Sets the points with optional colors. + //! @param theCoords [in] the array of coordinates. + //! @param theColors [in] optional array of colors. + Standard_EXPORT virtual void SetPoints (const Handle(TColgp_HArray1OfPnt)& theCoords, + const Handle(Quantity_HArray1OfColor)& theColors = NULL); + + //! Get the points. + //! @return the array of points. + Standard_EXPORT virtual const Handle(Graphic3d_ArrayOfPoints)& GetPoints () const; + + //! Redefined method implemets the standard behavior. + Standard_EXPORT virtual void SetColor (const Quantity_NameOfColor theColor); + + //! Redefined method implemets the standard behavior. + Standard_EXPORT virtual void SetColor (const Quantity_Color& theColor); + +public: + + DEFINE_STANDARD_RTTI (AIS_PointCloud) + +protected: + + Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& thePresentationManager, + const Handle(Prs3d_Presentation)& thePresentation, + const Standard_Integer theMode = 0); + + Standard_EXPORT virtual void ComputeSelection(const Handle(SelectMgr_Selection)& theSelection, + const Standard_Integer theMode); + +private: + + Handle(Graphic3d_ArrayOfPoints) myPoints; +}; + +#endif // _AIS_PointCloud_HeaderFile diff --git a/src/AIS/AIS_PointCloud.lxx b/src/AIS/AIS_PointCloud.lxx new file mode 100644 index 0000000000..5858036efc --- /dev/null +++ b/src/AIS/AIS_PointCloud.lxx @@ -0,0 +1,19 @@ +// Created on: 2014-08-25 +// 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. + +inline const Handle(Graphic3d_ArrayOfPoints)& AIS_PointCloud::GetPoints() const +{ + return myPoints; +} diff --git a/src/AIS/FILES b/src/AIS/FILES index 9b7b40d1f5..b335e6b64a 100755 --- a/src/AIS/FILES +++ b/src/AIS/FILES @@ -21,3 +21,6 @@ AIS_DiameterDimension.hxx AIS_DiameterDimension.cxx AIS_RadiusDimension.hxx AIS_RadiusDimension.cxx +AIS_PointCloud.hxx +AIS_PointCloud.lxx +AIS_PointCloud.cxx diff --git a/src/ViewerTest/ViewerTest_ObjectCommands.cxx b/src/ViewerTest/ViewerTest_ObjectCommands.cxx index 833dd02db8..83a479889d 100644 --- a/src/ViewerTest/ViewerTest_ObjectCommands.cxx +++ b/src/ViewerTest/ViewerTest_ObjectCommands.cxx @@ -39,6 +39,7 @@ #include #include +#include #include #include #include @@ -5028,6 +5029,159 @@ static int VFont (Draw_Interpretor& theDI, return 0; } +//! Auxilarily function. +//! Create random float number in range from theMin to theMax. +static Standard_Real randomReal (const Standard_Real theMin, const Standard_Real theMax) +{ + return theMin + (theMax - theMin) * Standard_Real(rand()) / RAND_MAX; +} + +//======================================================================= +//function : VPointCloud +//purpose : Create interactive object for arbitary set of points. +//======================================================================= +static Standard_Integer VPointCloud (Draw_Interpretor& /*theDI*/, + Standard_Integer theArgNum, + const char** theArgs) +{ + if (theArgNum < 2) + { + std::cout << theArgs[0] << " error: wrong number of parameters. Type 'help " + << theArgs[0] << "' for more information.\n"; + return 1; + } + + Handle(AIS_InteractiveContext) anAISContext = ViewerTest::GetAISContext(); + if (anAISContext.IsNull()) + { + std::cerr << "Call 'vinit' before!\n"; + return 1; + } + + Standard_Integer anArgIter = 1; + + // Get point cloud object name + TCollection_AsciiString aName (theArgs[anArgIter++]); + + // Sets default value + Standard_Integer aMode = 0; + Standard_Integer aMarkerType = -1; + Quantity_NameOfColor aColorName = Quantity_NOC_YELLOW; + Standard_Real aScale = 1.0; + Standard_Boolean aHasColor = Standard_True; + Standard_Integer aNumberOfPoints = 100; + + // Parses arguments + for (; anArgIter < theArgNum; ++anArgIter) + { + const TCollection_AsciiString anArg (theArgs[anArgIter]); + if (anArg.Search ("Mode=") > -1) + { + aMode = anArg.Token ("=", 2).IntegerValue(); + if (aMode < 0 && aMode > 1) + { + std::cerr << "Wrong argument : " << anArg << std::endl; + return 1; + } + } + else if (anArg.Search ("MarkerType=") > -1) + { + aMarkerType = anArg.Token ("=", 2).IntegerValue(); + } + else if (anArg.Search ("ColorName=") > -1) + { + aColorName = ViewerTest::GetColorFromName (anArg.Token ("=", 2).ToCString()); + aHasColor = Standard_False; + } + else if (anArg.Search ("Scale=") > -1) + { + aScale = anArg.Token ("=", 2).RealValue(); + } + else if (anArg.Search ("NumPoints=") > -1) + { + aNumberOfPoints = anArg.Token ("=", 2).IntegerValue(); + } + else + { + std::cerr << "Wrong argument: " << anArg << std::endl; + return 1; + } + } + + // Point cloud initialization + Handle(AIS_PointCloud) aPointCloud = new AIS_PointCloud(); + + if (aMode == 0) + { + Handle(Graphic3d_ArrayOfPoints) anArrayPoints = new Graphic3d_ArrayOfPoints (aNumberOfPoints, aHasColor); + for (Standard_Integer anIter = 1; anIter < aNumberOfPoints; anIter++) + { + // Create random point + gp_Pnt aPoint (randomReal (0., 5000.), + randomReal (0., 5000.), + randomReal (0., 5000.)); + + // Create random color + Quantity_Color aColor (randomReal (0., 1.), + randomReal (0., 1.), + randomReal (0., 1.), + Quantity_TOC_RGB); + + // Add point with color in array + anArrayPoints->AddVertex (aPoint, aColor); + } + // Set array of points in point cloud object + aPointCloud->SetPoints (anArrayPoints); + } + else if (aMode == 1) + { + Handle(TColgp_HArray1OfPnt) aCoords = new TColgp_HArray1OfPnt (1, aNumberOfPoints); + Handle(Quantity_HArray1OfColor) aColors = new Quantity_HArray1OfColor (1, aNumberOfPoints); + + if (aCoords->Length() != aColors->Length()) + { + std::cerr << "Wrong length of arrays" << std::endl; + return 1; + } + + for (Standard_Integer aPntIt = aCoords->Lower(); aPntIt <= aCoords->Upper(); aPntIt++) + { + gp_Pnt aPoint (randomReal (0., 5000.), + randomReal (0., 5000.), + randomReal (0., 5000.)); + aCoords->SetValue (aPntIt, aPoint); + } + + if (aHasColor) + { + for (Standard_Integer aColorIt = aColors->Lower(); aColorIt <= aColors->Upper(); aColorIt++) + { + Quantity_Color aColor (randomReal (0., 1.), + randomReal (0., 1.), + randomReal (0., 1.), + Quantity_TOC_RGB); + aColors->SetValue (aColorIt, aColor); + } + } + else + { + aColors.Nullify(); + } + // Set coordinates and colors + aPointCloud->SetPoints (aCoords, aColors); + } + + // Set point aspect for attributes of interactive object + aPointCloud->Attributes()->SetPointAspect ( + new Prs3d_PointAspect (aMarkerType >= 0 ? (Aspect_TypeOfMarker )aMarkerType : Aspect_TOM_POINT, + aColorName, + aScale)); + + VDisplayAISObject (aName, aPointCloud); + + return 0; +} + //======================================================================= //function : ObjectsCommands //purpose : @@ -5185,4 +5339,12 @@ void ViewerTest::ObjectCommands(Draw_Interpretor& theCommands) "vfont [add pathToFont [fontName] [regular,bold,italic,bolditalic=undefined]]" "\n\t\t: [find fontName [regular,bold,italic,bolditalic=undefined]]", __FILE__, VFont, group); + + theCommands.Add ("vpointcloud", + "vpointcloud usage:\n" + "vpointcloud ObjectName [Mode=1]\n" + " [NumPoints=100]\n" + " [MarkerType=0] [ColorName=GREEN] [Scale=1.0]" + "\n\t\t: Create an interactive object for arbitary set of points.", + __FILE__, VPointCloud, group); }