X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FVTKViewer%2FVTKViewer_ArcBuilder.cxx;h=e0bf486804bf3ec885c7669500497a0a86ff876a;hb=refs%2Fheads%2Fngr%2Fpython3_dev_pv5.4;hp=9057c98930b9e5077fc17e3d78c4d6f6b7dfe9d9;hpb=7913d238ead6773bc2bfcbfe692738346626e4b7;p=modules%2Fgui.git diff --git a/src/VTKViewer/VTKViewer_ArcBuilder.cxx b/src/VTKViewer/VTKViewer_ArcBuilder.cxx index 9057c9893..e0bf48680 100644 --- a/src/VTKViewer/VTKViewer_ArcBuilder.cxx +++ b/src/VTKViewer/VTKViewer_ArcBuilder.cxx @@ -1,9 +1,9 @@ -// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either -// version 2.1 of the License. +// version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -23,7 +23,7 @@ // #include "VTKViewer_ArcBuilder.h" -#include +#include #include //VTK includes @@ -42,11 +42,11 @@ #define ANGLE_PRECISION 0.5 //#define _MY_DEBUG_ +#include #ifdef _MY_DEBUG_ #include #endif - bool CheckAngle(const double compare, const double angle){ if((angle <= compare - ANGLE_PRECISION) || (angle >= compare + ANGLE_PRECISION)) return true; @@ -115,11 +115,16 @@ Vec::Vec (const double Xv, const double Zv) { double D = sqrt (Xv * Xv + Yv * Yv + Zv * Zv); - if(D != 0) { + if(D > std::numeric_limits::min() ) { coord.SetX(Xv / D); coord.SetY(Yv / D); coord.SetZ(Zv / D); } + else { + coord.SetX(0); + coord.SetY(0); + coord.SetZ(0); + } } /*! @@ -159,8 +164,7 @@ Vec Vec::VectMultiplication(const Vec & Other) const{ double x = GetXYZ().Y()*Other.GetXYZ().Z() - GetXYZ().Z()*Other.GetXYZ().Y(); double y = GetXYZ().Z()*Other.GetXYZ().X() - GetXYZ().X()*Other.GetXYZ().Z(); double z = GetXYZ().X()*Other.GetXYZ().Y() - GetXYZ().Y()*Other.GetXYZ().X(); - Vec *aRes = new Vec(x,y,z); - return *aRes; + return Vec(x,y,z); } /*---------------------Class Plane --------------------------------*/ @@ -282,44 +286,42 @@ VTKViewer_ArcBuilder::VTKViewer_ArcBuilder(const Pnt& thePnt1, aInputPnts.push_back(thePnt2); aInputPnts.push_back(thePnt3); - vtkUnstructuredGrid* aGrid = BuildGrid(aInputPnts); + vtkSmartPointer aGrid = BuildGrid(aInputPnts); + aGrid->Delete(); bool needRotation = true; if(anAngle == 0 || anAngle == 180) needRotation = false; if(aGrid) { - vtkUnstructuredGrid* aTransformedGrid; if(needRotation) { - aTransformedGrid = TransformGrid(aGrid,aAxis,anAngle); + aGrid = TransformGrid(aGrid,aAxis,anAngle); + aGrid->Delete(); #ifdef _MY_DEBUG_ cout<<"Need Rotation!!!"<GetPoint(0,coords); + aGrid->GetPoint(0,coords); myPnt1 = Pnt(coords[0],coords[1],coords[2], thePnt1.GetScalarValue()); - aTransformedGrid->GetPoint(1,coords); + aGrid->GetPoint(1,coords); myPnt2 = Pnt(coords[0],coords[1],coords[2], thePnt2.GetScalarValue()); - aTransformedGrid->GetPoint(2,coords); + aGrid->GetPoint(2,coords); myPnt3 = Pnt(coords[0],coords[1],coords[2], thePnt3.GetScalarValue()); - std::vector aScalarValues; - vtkUnstructuredGrid* anArc = BuildArc(aScalarValues); - vtkUnstructuredGrid* anTransArc; - if(needRotation) - anTransArc = TransformGrid(anArc,aAxis,-anAngle); - else - anTransArc = anArc; - - myPoints = anTransArc->GetPoints(); - myScalarValues = aScalarValues; + + vtkSmartPointer anArc = BuildArc(myScalarValues); + anArc->Delete(); + if(needRotation) { + anArc = TransformGrid(anArc,aAxis,-anAngle); + anArc->Delete(); + } + myPoints = anArc->GetPoints(); myStatus = Arc_Done; } } @@ -333,6 +335,7 @@ VTKViewer_ArcBuilder::VTKViewer_ArcBuilder(const Pnt& thePnt1, aList.push_back(thePnt3); vtkUnstructuredGrid* aGrid = BuildGrid(aList); myPoints = aGrid->GetPoints(); + aGrid->Delete(); myScalarValues.clear(); myScalarValues.push_back(thePnt1.GetScalarValue()); @@ -393,9 +396,13 @@ VTKViewer_ArcBuilder::TransformGrid(vtkUnstructuredGrid* theGrid, aTransform->RotateWXYZ(angle, theAxis.GetXYZ().X(), theAxis.GetXYZ().Y(), theAxis.GetXYZ().Z()); vtkTransformFilter* aTransformFilter = vtkTransformFilter::New(); aTransformFilter->SetTransform(aTransform); - aTransformFilter->SetInputData(theGrid); aTransform->Delete(); - return aTransformFilter->GetUnstructuredGridOutput(); + aTransformFilter->SetInputData(theGrid); + aTransformFilter->Update(); + vtkUnstructuredGrid * aGrid = aTransformFilter->GetUnstructuredGridOutput(); + aGrid->Register(0); + aTransformFilter->Delete(); + return aGrid; } @@ -414,7 +421,8 @@ double InterpolateScalarValue(int index, int count, double firstValue, double mi return value; } -vtkUnstructuredGrid* VTKViewer_ArcBuilder::BuildArc(std::vector& theScalarValues){ +vtkUnstructuredGrid* VTKViewer_ArcBuilder::BuildArc(std::vector& theScalarValues) +{ double x1 = myPnt1.GetXYZ().X(); double x2 = myPnt2.GetXYZ().X(); double x3 = myPnt3.GetXYZ().X(); double y1 = myPnt1.GetXYZ().Y(); double y2 = myPnt2.GetXYZ().Y(); double y3 = myPnt3.GetXYZ().Y(); double z = myPnt1.GetXYZ().Z(); //Points on plane || XOY @@ -608,10 +616,10 @@ vtkIdType Build1DArc(vtkIdType cellId, vtkUnstructuredGrid* input, vtkPoints* aPoints = aBuilder.GetPoints(); std::vector aScalarValues = aBuilder.GetScalarValues(); vtkIdType aNbPts = aPoints->GetNumberOfPoints(); - aNewPoints = new vtkIdType[aNbPts]; + std::vector< vtkIdType > aNewPoints( aNbPts ); vtkIdType curID; vtkIdType aCellType = VTK_POLY_LINE; - + aNewPoints[0] = pts[0]; for(vtkIdType idx = 1; idx < aNbPts-1;idx++) { curID = output->GetPoints()->InsertNextPoint(aPoints->GetPoint(idx)); @@ -620,17 +628,17 @@ vtkIdType Build1DArc(vtkIdType cellId, vtkUnstructuredGrid* input, aNewPoints[idx] = curID; } aNewPoints[aNbPts-1] = pts[1]; - - aResult = output->InsertNextCell(aCellType,aNbPts,aNewPoints); + + aResult = output->InsertNextCell(aCellType,aNbPts,&aNewPoints[0]); return aResult; - } + } } /*! * Add all points from the input vector theCollection into thePoints. * Array theIds - it is array with ids of added points. */ -vtkIdType MergevtkPoints(const std::vector& theCollection, +vtkIdType MergevtkPoints(const std::vector< vtkSmartPointer< vtkPoints > >& theCollection, const std::vector< std::vector >& theScalarCollection, vtkPoints* thePoints, std::map& thePntId2ScalarValue, @@ -638,9 +646,9 @@ vtkIdType MergevtkPoints(const std::vector& theCollection, vtkIdType aNbPoints = 0; vtkIdType anIdCounter = 0; vtkIdType aNewPntId = 0; - + //Compute number of points - std::vector::const_iterator it = theCollection.begin(); + std::vector< vtkSmartPointer< vtkPoints > >::const_iterator it = theCollection.begin(); for(;it != theCollection.end();it++){ vtkPoints* aPoints = *it; if(aPoints) {