From 9598bbb67cfda15385cfe532360cd8dfce446be9 Mon Sep 17 00:00:00 2001 From: mgn Date: Thu, 21 Aug 2014 12:15:00 +0400 Subject: [PATCH 1/3] 0025129: Visualization - add interactive object for Points Cloud objects --- src/AIS/AIS.cdl | 3 +- src/AIS/AIS_PointCloud.cxx | 150 ++++++++++++++ src/AIS/AIS_PointCloud.hxx | 74 +++++++ src/AIS/FILES | 2 + src/ViewerTest/ViewerTest_ObjectCommands.cxx | 203 +++++++++++++++++++ 5 files changed, 431 insertions(+), 1 deletion(-) create mode 100644 src/AIS/AIS_PointCloud.cxx create mode 100644 src/AIS/AIS_PointCloud.hxx diff --git a/src/AIS/AIS.cdl b/src/AIS/AIS.cdl index 75098fd7d4..50b17bb717 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; --signature 2 ---Category: DIMENSIONS AND RELATIONS diff --git a/src/AIS/AIS_PointCloud.cxx b/src/AIS/AIS_PointCloud.cxx new file mode 100644 index 0000000000..0104b6f049 --- /dev/null +++ b/src/AIS/AIS_PointCloud.cxx @@ -0,0 +1,150 @@ +// 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 + +IMPLEMENT_STANDARD_HANDLE(AIS_PointCloud, AIS_InteractiveObject) +IMPLEMENT_STANDARD_RTTIEXT(AIS_PointCloud, AIS_InteractiveObject) + +IMPLEMENT_HARRAY1(AIS_ArrayOfPnt) + +//================================================== +// Function: AIS_PointCloud +// Purpose : Constructor +//================================================== +AIS_PointCloud::AIS_PointCloud() +: AIS_InteractiveObject() +{ +} + +//======================================================================= +//function : SetPoints +//purpose : +//======================================================================= +bool AIS_PointCloud::SetPoints (const Handle(Graphic3d_ArrayOfPoints)& thePoints) +{ + if (thePoints.IsNull() || !thePoints->IsValid()) return false; + myPoints = thePoints; + return true; +} + +//======================================================================= +//function : SetPoints +//purpose : +//======================================================================= +bool AIS_PointCloud::SetPoints (const Handle(AIS_ArrayOfPnt)& theCoords, + const Handle(AIS_ArrayOfPnt)& theColors, + const Standard_Boolean hasColors) +{ + if (theCoords.IsNull() || theColors.IsNull()) return false; + if (theCoords->Size() != theColors->Size()) return false; + + Standard_Integer aNumPoints = theCoords->Size(); + + Handle(Graphic3d_ArrayOfPoints) anArrayOfPoints = new Graphic3d_ArrayOfPoints (aNumPoints, hasColors); + Standard_Integer iter = 1; + for (; iter <= aNumPoints; iter++) + { + anArrayOfPoints->AddVertex (theCoords->Value(iter)); + + gp_Pnt aColor = theColors->Value(iter); + anArrayOfPoints->SetVertexColor (anArrayOfPoints->VertexNumber(), + aColor.X(), aColor.Y(), aColor.Z()); + } + myPoints = anArrayOfPoints; + return true; +} + +void AIS_PointCloud::SetColor (const Quantity_NameOfColor theColor) +{ + SetColor (Quantity_Color(theColor)); +} + +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; + + Handle(Graphic3d_AspectMarker3d) aPointAspect = myDrawer->PointAspect()->Aspect(); + + const Handle(Prs3d_Presentation)& aPrs = Presentations().Value (1).Presentation()->Presentation(); + + // Set aspect for presentation + aPrs->SetPrimitivesAspect (aPointAspect); + + const Handle(Graphic3d_Group)& aGroup = aPrs->Groups().First(); + + // 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_MARKER)) + { + aGroup->SetGroupPrimitivesAspect (aPointAspect); + } +} + +//======================================================================= +//function : Compute +//purpose : +//======================================================================= +void AIS_PointCloud::Compute(const Handle(PrsMgr_PresentationManager3d)& /*aPresentationManager*/, + const Handle(Prs3d_Presentation)& aPresentation, + const Standard_Integer /*aMode*/) +{ + aPresentation->Clear(); + if (myPoints.IsNull() || !myPoints->IsValid()) return; + + Handle(Graphic3d_Group) aGroup = Prs3d_Root::CurrentGroup (aPresentation); + + /************************************ + static Handle(Graphic3d_AspectMarker3d) PtA = new Graphic3d_AspectMarker3d(); + PtA->SetType(Aspect_TOM_POINT); + PtA->SetScale(1.); + Handle(Graphic3d_Group) TheGroup = Prs3d_Root::CurrentGroup(aPresentation); + TheGroup->SetPrimitivesAspect(PtA); + Handle(Graphic3d_ArrayOfPoints) aPoint = new Graphic3d_ArrayOfPoints (1); + aPoint->AddVertex (myComponent->X(),myComponent->Y(),myComponent->Z()); + TheGroup->AddPrimitiveArray (aPoint); + ******************************/ + + if (Attributes()->HasPointAspect()) + { + aGroup->SetPrimitivesAspect (Attributes()->PointAspect()->Aspect()); + } + aGroup->AddPrimitiveArray (myPoints); +} + +void AIS_PointCloud::ComputeSelection(const Handle(SelectMgr_Selection)& /*aSelection*/, + const Standard_Integer /*aMode*/) +{ +} diff --git a/src/AIS/AIS_PointCloud.hxx b/src/AIS/AIS_PointCloud.hxx new file mode 100644 index 0000000000..5bacffedcc --- /dev/null +++ b/src/AIS/AIS_PointCloud.hxx @@ -0,0 +1,74 @@ +// 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 + +DEFINE_STANDARD_HANDLE (AIS_PointCloud, AIS_InteractiveObject) + +NCOLLECTION_HARRAY1(AIS_ArrayOfPnt, gp_Pnt) + +//! Interactive object for set of points. +class AIS_PointCloud : public AIS_InteractiveObject +{ + +public: + + //! Create point cloud. + Standard_EXPORT AIS_PointCloud (); + + //! Initializes construction of the point cloud from points. + //! @param thePoints [in] the points. + Standard_EXPORT bool SetPoints (const Handle(Graphic3d_ArrayOfPoints)& thePoints); + + //! Sets the points. + //! @param theCoords [in] the array of coordinates. + //! @param theColors [in] the array of RGB colors. + Standard_EXPORT bool SetPoints (const Handle(AIS_ArrayOfPnt)& theCoords, + const Handle(AIS_ArrayOfPnt)& theColors, + const Standard_Boolean hasColors = true); + + //! Sets the color theColor in the reconstructed point cloud + Standard_EXPORT void SetColor (const Quantity_NameOfColor theColor); + Standard_EXPORT 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)& aSelection, + const Standard_Integer aMode); + +private: + + Handle(Graphic3d_ArrayOfPoints) myPoints; +}; + +#endif // _AIS_PointCloud_HeaderFile diff --git a/src/AIS/FILES b/src/AIS/FILES index 9b7b40d1f5..2f3c30c8e9 100755 --- a/src/AIS/FILES +++ b/src/AIS/FILES @@ -21,3 +21,5 @@ AIS_DiameterDimension.hxx AIS_DiameterDimension.cxx AIS_RadiusDimension.hxx AIS_RadiusDimension.cxx +AIS_PointCloud.hxx +AIS_PointCloud.cxx diff --git a/src/ViewerTest/ViewerTest_ObjectCommands.cxx b/src/ViewerTest/ViewerTest_ObjectCommands.cxx index 833dd02db8..a0c7e102e7 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,194 @@ static int VFont (Draw_Interpretor& theDI, return 0; } +//======================================================================= +//function : VPointCloud +//purpose : Create interactive object for arbitary set of points. +//======================================================================= +static Standard_Integer VPointCloud (Draw_Interpretor&, + 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 and check point cloud name in AIS context + TCollection_AsciiString aName (theArgs[anArgIter++]); + if (GetMapOfAIS().IsBound2 (aName)) + { + std::cout << theArgs[0] << " error: object name exists." << std::endl; + return 1; + } + + // Sets default value + Standard_Integer aMode = 0; + Standard_Integer aMarkerType = -1; + Quantity_NameOfColor aColorName = Quantity_NOC_YELLOW; + Standard_Real aScale = 1.; + Standard_Boolean aHasColor = true; + Standard_Integer aNumberOfPoints = 1000; + TCollection_AsciiString aFileName = NULL; + + // 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 << "\n"; + 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 = false; + } + else if (anArg.Search ("Scale=") > -1) + { + aScale = anArg.Token ("=", 2).RealValue(); + } + else if (anArg.Search ("NumPoints=") > -1) + { + aNumberOfPoints = anArg.Token ("=", 2).IntegerValue(); + } + else if (anArg.Search ("FileName=") > -1) + { + aFileName = anArg.Token ("=", 2); + } + else + { + std::cerr << "Wrong argument: " << anArg << "\n"; + return 1; + } + } + + srand (static_cast(time(NULL))); + + // Point cloud initialization + Handle(AIS_PointCloud) aPointCloud = new AIS_PointCloud(); + + Standard_Integer anIter = 1; + if (aMode == 0) + { + Handle(Graphic3d_ArrayOfPoints) anArrayPoints = new Graphic3d_ArrayOfPoints (aNumberOfPoints, aHasColor); + for (; anIter < aNumberOfPoints; anIter++) + { + // Create random points + gp_Pnt aPoint (RandomReal (0., 10000.), + RandomReal (0., 10000.), + RandomReal (0., 10000.)); + + // Create random colors + 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(AIS_ArrayOfPnt) aCoords = new AIS_ArrayOfPnt (1, aNumberOfPoints); + Handle(AIS_ArrayOfPnt) aColors = new AIS_ArrayOfPnt (1, aNumberOfPoints); + for (; anIter <= aNumberOfPoints; anIter++) + { + gp_Pnt aPoint (RandomReal (0., 5000.), + RandomReal (0., 5000.), + RandomReal (0., 5000.)); + aCoords->SetValue (anIter, aPoint); + + gp_Pnt aColor (RandomReal (0., 1.), + RandomReal (0., 1.), + RandomReal (0., 1.)); + aColors->SetValue (anIter, aColor); + } + // Set coordinates and colors + aPointCloud->SetPoints (aCoords, aColors, aHasColor); + }*/ + + //std::cout << aPointCloud->Attributes()->HasLocalAttributes() + + // Set point aspect for attributes of interactive object + Aspect_TypeOfMarker anAMarkerType = aMarkerType >= 0 ? (Aspect_TypeOfMarker )aMarkerType : Aspect_TOM_POINT; + aPointCloud->Attributes()->SetPointAspect (new Prs3d_PointAspect (anAMarkerType, aColorName, aScale)); + + anAISContext->Display (aPointCloud); + GetMapOfAIS().Bind (aPointCloud, theArgs[1]); + + return 0; +} + +//======================================================================= +//function : VPointCloudSetColor +//purpose : Sets the color for point cloud. +//======================================================================= +static Standard_Integer VPointCloudSetColor (Draw_Interpretor&, + Standard_Integer theArgNum, + const char** theArgs) +{ + // Check arguments + if (theArgNum < 3) + { + std::cout << theArgs[0] << " error: wrong number of parameters. Type 'help " + << theArgs[0] << "' for more information.\n"; + return 1; + } + + // Check AIS context + Handle(AIS_InteractiveContext) anAISContext = ViewerTest::GetAISContext(); + if (anAISContext.IsNull()) + { + std::cerr << "Call 'vinit' before!" << std::endl; + return 1; + } + + Standard_Integer anArgIter = 1; + + // Find an interactive object in map of AIS context + TCollection_AsciiString aName (theArgs[anArgIter++]); + Handle(AIS_InteractiveObject) anInterObject = Handle(AIS_InteractiveObject)::DownCast (GetMapOfAIS().Find2 (aName)); + if (anInterObject.IsNull()) + { + std::cout << "Not an AIS interactive object!" << std::endl; + return 1; + } + + // Get color name + const TCollection_AsciiString aColorName (theArgs[anArgIter++]); + Quantity_NameOfColor aNameOfColor = ViewerTest::GetColorFromName (aColorName.ToCString()); + + // Set color + anInterObject->SetColor (aNameOfColor); + + // Update context current viewer + anAISContext->UpdateCurrentViewer(); +} + //======================================================================= //function : ObjectsCommands //purpose : @@ -5185,4 +5374,18 @@ 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" + " [FileName=PointCloudFile]" + "\n\t\t: Create an interactive object for arbitary set of points.", + __FILE__, VPointCloud, group); + theCommands.Add ("vpcsetcolor", + "vpcsetcolor usage:\n" + "vpcsetcolor PointCloudObjectName [ColorName=GREEN]" + "\n\t\t: Set color for point cloud interactive object.", + __FILE__, VPointCloudSetColor, group); } From 25afaea6e2089406e7a0cfa17cd68c3e9bc05c6f Mon Sep 17 00:00:00 2001 From: mgn Date: Fri, 22 Aug 2014 15:17:28 +0400 Subject: [PATCH 2/3] Refactor code. Remove the extra test "vpcsetcolor" command. --- src/AIS/AIS_PointCloud.cxx | 41 ++++-------- src/ViewerTest/ViewerTest_ObjectCommands.cxx | 68 ++++---------------- 2 files changed, 23 insertions(+), 86 deletions(-) diff --git a/src/AIS/AIS_PointCloud.cxx b/src/AIS/AIS_PointCloud.cxx index 0104b6f049..6527786cea 100644 --- a/src/AIS/AIS_PointCloud.cxx +++ b/src/AIS/AIS_PointCloud.cxx @@ -78,11 +78,19 @@ bool AIS_PointCloud::SetPoints (const Handle(AIS_ArrayOfPnt)& theCoords, return true; } +//======================================================================= +//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()) @@ -94,23 +102,6 @@ void AIS_PointCloud::SetColor (const Quantity_Color &theColor) hasOwnColor = Standard_True; myOwnColor = theColor; - - Handle(Graphic3d_AspectMarker3d) aPointAspect = myDrawer->PointAspect()->Aspect(); - - const Handle(Prs3d_Presentation)& aPrs = Presentations().Value (1).Presentation()->Presentation(); - - // Set aspect for presentation - aPrs->SetPrimitivesAspect (aPointAspect); - - const Handle(Graphic3d_Group)& aGroup = aPrs->Groups().First(); - - // 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_MARKER)) - { - aGroup->SetGroupPrimitivesAspect (aPointAspect); - } } //======================================================================= @@ -125,18 +116,6 @@ void AIS_PointCloud::Compute(const Handle(PrsMgr_PresentationManager3d)& /*aPres if (myPoints.IsNull() || !myPoints->IsValid()) return; Handle(Graphic3d_Group) aGroup = Prs3d_Root::CurrentGroup (aPresentation); - - /************************************ - static Handle(Graphic3d_AspectMarker3d) PtA = new Graphic3d_AspectMarker3d(); - PtA->SetType(Aspect_TOM_POINT); - PtA->SetScale(1.); - Handle(Graphic3d_Group) TheGroup = Prs3d_Root::CurrentGroup(aPresentation); - TheGroup->SetPrimitivesAspect(PtA); - Handle(Graphic3d_ArrayOfPoints) aPoint = new Graphic3d_ArrayOfPoints (1); - aPoint->AddVertex (myComponent->X(),myComponent->Y(),myComponent->Z()); - TheGroup->AddPrimitiveArray (aPoint); - ******************************/ - if (Attributes()->HasPointAspect()) { aGroup->SetPrimitivesAspect (Attributes()->PointAspect()->Aspect()); @@ -144,6 +123,10 @@ void AIS_PointCloud::Compute(const Handle(PrsMgr_PresentationManager3d)& /*aPres aGroup->AddPrimitiveArray (myPoints); } +//======================================================================= +//function : ComputeSelection +//purpose : +//======================================================================= void AIS_PointCloud::ComputeSelection(const Handle(SelectMgr_Selection)& /*aSelection*/, const Standard_Integer /*aMode*/) { diff --git a/src/ViewerTest/ViewerTest_ObjectCommands.cxx b/src/ViewerTest/ViewerTest_ObjectCommands.cxx index a0c7e102e7..c715a0f9ab 100644 --- a/src/ViewerTest/ViewerTest_ObjectCommands.cxx +++ b/src/ViewerTest/ViewerTest_ObjectCommands.cxx @@ -5029,11 +5029,18 @@ 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&, +static Standard_Integer VPointCloud (Draw_Interpretor& /*theDI*/, Standard_Integer theArgNum, const char** theArgs) { @@ -5079,7 +5086,7 @@ static Standard_Integer VPointCloud (Draw_Interpretor&, aMode = anArg.Token ("=", 2).IntegerValue(); if (aMode != 0 && aMode != 1) { - std::cerr << "Wrong argument : " << anArg << "\n"; + std::cerr << "Wrong argument : " << anArg << std::endl; return 1; } } @@ -5139,7 +5146,7 @@ static Standard_Integer VPointCloud (Draw_Interpretor&, // Set array of points in point cloud object aPointCloud->SetPoints (anArrayPoints); } - /*else if (aMode == 1) + else if (aMode == 1) { Handle(AIS_ArrayOfPnt) aCoords = new AIS_ArrayOfPnt (1, aNumberOfPoints); Handle(AIS_ArrayOfPnt) aColors = new AIS_ArrayOfPnt (1, aNumberOfPoints); @@ -5157,9 +5164,7 @@ static Standard_Integer VPointCloud (Draw_Interpretor&, } // Set coordinates and colors aPointCloud->SetPoints (aCoords, aColors, aHasColor); - }*/ - - //std::cout << aPointCloud->Attributes()->HasLocalAttributes() + } // Set point aspect for attributes of interactive object Aspect_TypeOfMarker anAMarkerType = aMarkerType >= 0 ? (Aspect_TypeOfMarker )aMarkerType : Aspect_TOM_POINT; @@ -5171,52 +5176,6 @@ static Standard_Integer VPointCloud (Draw_Interpretor&, return 0; } -//======================================================================= -//function : VPointCloudSetColor -//purpose : Sets the color for point cloud. -//======================================================================= -static Standard_Integer VPointCloudSetColor (Draw_Interpretor&, - Standard_Integer theArgNum, - const char** theArgs) -{ - // Check arguments - if (theArgNum < 3) - { - std::cout << theArgs[0] << " error: wrong number of parameters. Type 'help " - << theArgs[0] << "' for more information.\n"; - return 1; - } - - // Check AIS context - Handle(AIS_InteractiveContext) anAISContext = ViewerTest::GetAISContext(); - if (anAISContext.IsNull()) - { - std::cerr << "Call 'vinit' before!" << std::endl; - return 1; - } - - Standard_Integer anArgIter = 1; - - // Find an interactive object in map of AIS context - TCollection_AsciiString aName (theArgs[anArgIter++]); - Handle(AIS_InteractiveObject) anInterObject = Handle(AIS_InteractiveObject)::DownCast (GetMapOfAIS().Find2 (aName)); - if (anInterObject.IsNull()) - { - std::cout << "Not an AIS interactive object!" << std::endl; - return 1; - } - - // Get color name - const TCollection_AsciiString aColorName (theArgs[anArgIter++]); - Quantity_NameOfColor aNameOfColor = ViewerTest::GetColorFromName (aColorName.ToCString()); - - // Set color - anInterObject->SetColor (aNameOfColor); - - // Update context current viewer - anAISContext->UpdateCurrentViewer(); -} - //======================================================================= //function : ObjectsCommands //purpose : @@ -5383,9 +5342,4 @@ void ViewerTest::ObjectCommands(Draw_Interpretor& theCommands) " [FileName=PointCloudFile]" "\n\t\t: Create an interactive object for arbitary set of points.", __FILE__, VPointCloud, group); - theCommands.Add ("vpcsetcolor", - "vpcsetcolor usage:\n" - "vpcsetcolor PointCloudObjectName [ColorName=GREEN]" - "\n\t\t: Set color for point cloud interactive object.", - __FILE__, VPointCloudSetColor, group); } From fe8bd8ca09325439342fc3038b261ac439489288 Mon Sep 17 00:00:00 2001 From: mgn Date: Mon, 25 Aug 2014 18:42:28 +0400 Subject: [PATCH 3/3] Refactor code. Add AIS_PointCloud.lxx file for inline method. Add GetPoints virtual method. Change the type of arguments of SetPoints function. Adapt test function. --- src/AIS/AIS.cdl | 2 +- src/AIS/AIS_PointCloud.cxx | 99 +++++++++-------- src/AIS/AIS_PointCloud.hxx | 51 +++++---- src/AIS/AIS_PointCloud.lxx | 19 ++++ src/AIS/FILES | 1 + src/ViewerTest/ViewerTest_ObjectCommands.cxx | 109 ++++++++++--------- 6 files changed, 164 insertions(+), 117 deletions(-) create mode 100644 src/AIS/AIS_PointCloud.lxx diff --git a/src/AIS/AIS.cdl b/src/AIS/AIS.cdl index 50b17bb717..3756366f4e 100644 --- a/src/AIS/AIS.cdl +++ b/src/AIS/AIS.cdl @@ -368,7 +368,7 @@ is ---Category: General Objects class ConnectedInteractive; --signature 0 class MultipleConnectedInteractive; --signature 1 - imported PointCloud; --signature 2 + imported PointCloud; ---Category: DIMENSIONS AND RELATIONS diff --git a/src/AIS/AIS_PointCloud.cxx b/src/AIS/AIS_PointCloud.cxx index 6527786cea..0b63b95bfb 100644 --- a/src/AIS/AIS_PointCloud.cxx +++ b/src/AIS/AIS_PointCloud.cxx @@ -13,24 +13,23 @@ // 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 #include +#include +#include +#include + +#include +#include + IMPLEMENT_STANDARD_HANDLE(AIS_PointCloud, AIS_InteractiveObject) IMPLEMENT_STANDARD_RTTIEXT(AIS_PointCloud, AIS_InteractiveObject) -IMPLEMENT_HARRAY1(AIS_ArrayOfPnt) - //================================================== // Function: AIS_PointCloud // Purpose : Constructor @@ -44,38 +43,50 @@ AIS_PointCloud::AIS_PointCloud() //function : SetPoints //purpose : //======================================================================= -bool AIS_PointCloud::SetPoints (const Handle(Graphic3d_ArrayOfPoints)& thePoints) +void AIS_PointCloud::SetPoints (const Handle(Graphic3d_ArrayOfPoints)& thePoints) { - if (thePoints.IsNull() || !thePoints->IsValid()) return false; + myPoints.Nullify(); + + if (thePoints.IsNull()) + return; + myPoints = thePoints; - return true; } //======================================================================= //function : SetPoints //purpose : //======================================================================= -bool AIS_PointCloud::SetPoints (const Handle(AIS_ArrayOfPnt)& theCoords, - const Handle(AIS_ArrayOfPnt)& theColors, - const Standard_Boolean hasColors) +void AIS_PointCloud::SetPoints (const Handle(TColgp_HArray1OfPnt)& theCoords, + const Handle(Quantity_HArray1OfColor)& theColors) { - if (theCoords.IsNull() || theColors.IsNull()) return false; - if (theCoords->Size() != theColors->Size()) return false; + myPoints.Nullify(); - Standard_Integer aNumPoints = theCoords->Size(); + if (theCoords.IsNull()) + return; - Handle(Graphic3d_ArrayOfPoints) anArrayOfPoints = new Graphic3d_ArrayOfPoints (aNumPoints, hasColors); - Standard_Integer iter = 1; - for (; iter <= aNumPoints; iter++) + 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++) { - anArrayOfPoints->AddVertex (theCoords->Value(iter)); - - gp_Pnt aColor = theColors->Value(iter); - anArrayOfPoints->SetVertexColor (anArrayOfPoints->VertexNumber(), - aColor.X(), aColor.Y(), aColor.Z()); + 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++; + } } - myPoints = anArrayOfPoints; - return true; } //======================================================================= @@ -84,14 +95,14 @@ bool AIS_PointCloud::SetPoints (const Handle(AIS_ArrayOfPnt)& theCoords, //======================================================================= void AIS_PointCloud::SetColor (const Quantity_NameOfColor theColor) { - SetColor (Quantity_Color(theColor)); + SetColor (Quantity_Color (theColor)); } //======================================================================= //function : SetColor -//purpose : +//purpose : //======================================================================= -void AIS_PointCloud::SetColor (const Quantity_Color &theColor) +void AIS_PointCloud::SetColor (const Quantity_Color& theColor) { if (!myDrawer->HasPointAspect()) { @@ -108,26 +119,28 @@ void AIS_PointCloud::SetColor (const Quantity_Color &theColor) //function : Compute //purpose : //======================================================================= -void AIS_PointCloud::Compute(const Handle(PrsMgr_PresentationManager3d)& /*aPresentationManager*/, - const Handle(Prs3d_Presentation)& aPresentation, - const Standard_Integer /*aMode*/) +void AIS_PointCloud::Compute(const Handle(PrsMgr_PresentationManager3d)& /*thePresentationManager*/, + const Handle(Prs3d_Presentation)& thePresentation, + const Standard_Integer /*theMode*/) { - aPresentation->Clear(); - if (myPoints.IsNull() || !myPoints->IsValid()) return; + thePresentation->Clear(); - Handle(Graphic3d_Group) aGroup = Prs3d_Root::CurrentGroup (aPresentation); - if (Attributes()->HasPointAspect()) + if (GetPoints().IsNull() || !GetPoints()->IsValid()) + return; + + Handle(Graphic3d_Group) aGroup = Prs3d_Root::CurrentGroup (thePresentation); + if (myDrawer->HasPointAspect()) { - aGroup->SetPrimitivesAspect (Attributes()->PointAspect()->Aspect()); + aGroup->SetPrimitivesAspect (myDrawer->PointAspect()->Aspect()); } - aGroup->AddPrimitiveArray (myPoints); + aGroup->AddPrimitiveArray (GetPoints()); } //======================================================================= //function : ComputeSelection //purpose : //======================================================================= -void AIS_PointCloud::ComputeSelection(const Handle(SelectMgr_Selection)& /*aSelection*/, - const Standard_Integer /*aMode*/) +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 index 5bacffedcc..6a875d8b4c 100644 --- a/src/AIS/AIS_PointCloud.hxx +++ b/src/AIS/AIS_PointCloud.hxx @@ -18,40 +18,49 @@ #include #include -#include -#include -#include + #include -#include -#include + +#include + +#include +#include +#include + +#include +#include DEFINE_STANDARD_HANDLE (AIS_PointCloud, AIS_InteractiveObject) -NCOLLECTION_HARRAY1(AIS_ArrayOfPnt, gp_Pnt) - //! Interactive object for set of points. class AIS_PointCloud : public AIS_InteractiveObject { public: - //! Create point cloud. + //! Constructor Standard_EXPORT AIS_PointCloud (); - //! Initializes construction of the point cloud from points. - //! @param thePoints [in] the points. - Standard_EXPORT bool SetPoints (const Handle(Graphic3d_ArrayOfPoints)& thePoints); + //! 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. + //! Sets the points with optional colors. //! @param theCoords [in] the array of coordinates. - //! @param theColors [in] the array of RGB colors. - Standard_EXPORT bool SetPoints (const Handle(AIS_ArrayOfPnt)& theCoords, - const Handle(AIS_ArrayOfPnt)& theColors, - const Standard_Boolean hasColors = true); + //! @param theColors [in] optional array of colors. + Standard_EXPORT virtual void SetPoints (const Handle(TColgp_HArray1OfPnt)& theCoords, + const Handle(Quantity_HArray1OfColor)& theColors = NULL); - //! Sets the color theColor in the reconstructed point cloud - Standard_EXPORT void SetColor (const Quantity_NameOfColor theColor); - Standard_EXPORT void SetColor (const Quantity_Color &theColor); + //! 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: @@ -63,8 +72,8 @@ protected: const Handle(Prs3d_Presentation)& thePresentation, const Standard_Integer theMode = 0); - Standard_EXPORT virtual void ComputeSelection(const Handle(SelectMgr_Selection)& aSelection, - const Standard_Integer aMode); + Standard_EXPORT virtual void ComputeSelection(const Handle(SelectMgr_Selection)& theSelection, + const Standard_Integer theMode); private: 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 2f3c30c8e9..b335e6b64a 100755 --- a/src/AIS/FILES +++ b/src/AIS/FILES @@ -22,4 +22,5 @@ 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 c715a0f9ab..83a479889d 100644 --- a/src/ViewerTest/ViewerTest_ObjectCommands.cxx +++ b/src/ViewerTest/ViewerTest_ObjectCommands.cxx @@ -5031,7 +5031,7 @@ static int VFont (Draw_Interpretor& theDI, //! Auxilarily function. //! Create random float number in range from theMin to theMax. -static Standard_Real RandomReal (const Standard_Real theMin, const Standard_Real theMax) +static Standard_Real randomReal (const Standard_Real theMin, const Standard_Real theMax) { return theMin + (theMax - theMin) * Standard_Real(rand()) / RAND_MAX; } @@ -5060,22 +5060,16 @@ static Standard_Integer VPointCloud (Draw_Interpretor& /*theDI*/, Standard_Integer anArgIter = 1; - // Get and check point cloud name in AIS context + // Get point cloud object name TCollection_AsciiString aName (theArgs[anArgIter++]); - if (GetMapOfAIS().IsBound2 (aName)) - { - std::cout << theArgs[0] << " error: object name exists." << std::endl; - return 1; - } // Sets default value - Standard_Integer aMode = 0; - Standard_Integer aMarkerType = -1; - Quantity_NameOfColor aColorName = Quantity_NOC_YELLOW; - Standard_Real aScale = 1.; - Standard_Boolean aHasColor = true; - Standard_Integer aNumberOfPoints = 1000; - TCollection_AsciiString aFileName = NULL; + 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) @@ -5084,7 +5078,7 @@ static Standard_Integer VPointCloud (Draw_Interpretor& /*theDI*/, if (anArg.Search ("Mode=") > -1) { aMode = anArg.Token ("=", 2).IntegerValue(); - if (aMode != 0 && aMode != 1) + if (aMode < 0 && aMode > 1) { std::cerr << "Wrong argument : " << anArg << std::endl; return 1; @@ -5097,7 +5091,7 @@ static Standard_Integer VPointCloud (Draw_Interpretor& /*theDI*/, else if (anArg.Search ("ColorName=") > -1) { aColorName = ViewerTest::GetColorFromName (anArg.Token ("=", 2).ToCString()); - aHasColor = false; + aHasColor = Standard_False; } else if (anArg.Search ("Scale=") > -1) { @@ -5107,37 +5101,30 @@ static Standard_Integer VPointCloud (Draw_Interpretor& /*theDI*/, { aNumberOfPoints = anArg.Token ("=", 2).IntegerValue(); } - else if (anArg.Search ("FileName=") > -1) - { - aFileName = anArg.Token ("=", 2); - } else { - std::cerr << "Wrong argument: " << anArg << "\n"; + std::cerr << "Wrong argument: " << anArg << std::endl; return 1; } } - srand (static_cast(time(NULL))); - // Point cloud initialization Handle(AIS_PointCloud) aPointCloud = new AIS_PointCloud(); - Standard_Integer anIter = 1; if (aMode == 0) { Handle(Graphic3d_ArrayOfPoints) anArrayPoints = new Graphic3d_ArrayOfPoints (aNumberOfPoints, aHasColor); - for (; anIter < aNumberOfPoints; anIter++) + for (Standard_Integer anIter = 1; anIter < aNumberOfPoints; anIter++) { - // Create random points - gp_Pnt aPoint (RandomReal (0., 10000.), - RandomReal (0., 10000.), - RandomReal (0., 10000.)); + // Create random point + gp_Pnt aPoint (randomReal (0., 5000.), + randomReal (0., 5000.), + randomReal (0., 5000.)); - // Create random colors - Quantity_Color aColor (RandomReal (0., 1.), - RandomReal (0., 1.), - RandomReal (0., 1.), + // Create random color + Quantity_Color aColor (randomReal (0., 1.), + randomReal (0., 1.), + randomReal (0., 1.), Quantity_TOC_RGB); // Add point with color in array @@ -5148,30 +5135,49 @@ static Standard_Integer VPointCloud (Draw_Interpretor& /*theDI*/, } else if (aMode == 1) { - Handle(AIS_ArrayOfPnt) aCoords = new AIS_ArrayOfPnt (1, aNumberOfPoints); - Handle(AIS_ArrayOfPnt) aColors = new AIS_ArrayOfPnt (1, aNumberOfPoints); - for (; anIter <= aNumberOfPoints; anIter++) - { - gp_Pnt aPoint (RandomReal (0., 5000.), - RandomReal (0., 5000.), - RandomReal (0., 5000.)); - aCoords->SetValue (anIter, aPoint); + Handle(TColgp_HArray1OfPnt) aCoords = new TColgp_HArray1OfPnt (1, aNumberOfPoints); + Handle(Quantity_HArray1OfColor) aColors = new Quantity_HArray1OfColor (1, aNumberOfPoints); - gp_Pnt aColor (RandomReal (0., 1.), - RandomReal (0., 1.), - RandomReal (0., 1.)); - aColors->SetValue (anIter, aColor); + 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, aHasColor); + aPointCloud->SetPoints (aCoords, aColors); } // Set point aspect for attributes of interactive object - Aspect_TypeOfMarker anAMarkerType = aMarkerType >= 0 ? (Aspect_TypeOfMarker )aMarkerType : Aspect_TOM_POINT; - aPointCloud->Attributes()->SetPointAspect (new Prs3d_PointAspect (anAMarkerType, aColorName, aScale)); + aPointCloud->Attributes()->SetPointAspect ( + new Prs3d_PointAspect (aMarkerType >= 0 ? (Aspect_TypeOfMarker )aMarkerType : Aspect_TOM_POINT, + aColorName, + aScale)); - anAISContext->Display (aPointCloud); - GetMapOfAIS().Bind (aPointCloud, theArgs[1]); + VDisplayAISObject (aName, aPointCloud); return 0; } @@ -5338,8 +5344,7 @@ void ViewerTest::ObjectCommands(Draw_Interpretor& theCommands) "vpointcloud usage:\n" "vpointcloud ObjectName [Mode=1]\n" " [NumPoints=100]\n" - " [MarkerType=0] [ColorName=GREEN] [Scale=1.0]\n" - " [FileName=PointCloudFile]" + " [MarkerType=0] [ColorName=GREEN] [Scale=1.0]" "\n\t\t: Create an interactive object for arbitary set of points.", __FILE__, VPointCloud, group); }