X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FINTERP_KERNEL%2FOrientationInverter.cxx;h=d8b191802c3d196877838571d78a20ba98839d29;hb=b33408f1dc045a4d0f2e16d22f4930d7029996a3;hp=b5f3acc06fc5e47d98dc84de4e4875861c382be3;hpb=8d97afe48bd8fb622fccd2c16c37f281261bd0d7;p=tools%2Fmedcoupling.git diff --git a/src/INTERP_KERNEL/OrientationInverter.cxx b/src/INTERP_KERNEL/OrientationInverter.cxx index b5f3acc06..d8b191802 100644 --- a/src/INTERP_KERNEL/OrientationInverter.cxx +++ b/src/INTERP_KERNEL/OrientationInverter.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2016 CEA/DEN, EDF R&D +// Copyright (C) 2007-2021 CEA/DEN, EDF R&D // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -20,13 +20,59 @@ #include "OrientationInverter.hxx" #include "InterpKernelException.hxx" +#include "CellModel.hxx" #include #include using namespace INTERP_KERNEL; -void OrientationInverterChecker::check(int *beginPt, int *endPt) const +OrientationInverter *OrientationInverter::BuildInstanceFrom(NormalizedCellType gt) +{ + switch(gt) + { + case NORM_SEG2: + return new OrientationInverterSEG2; + case NORM_SEG3: + return new OrientationInverterSEG3; + case NORM_TRI3: + return new OrientationInverter2DLinear(3u); + case NORM_QUAD4: + return new OrientationInverter2DLinear(4u); + case NORM_POLYGON: + return new OrientationInverterPolygon; + case NORM_TRI6: + return new OrientationInverter2DQuadratic(6u); + case NORM_QUAD8: + return new OrientationInverter2DQuadratic(8u); + case NORM_QPOLYG: + return new OrientationInverterQPolygon; + case NORM_TETRA4: + return new OrientationInverterTetra4; + case NORM_PYRA5: + return new OrientationInverterPyra5; + case NORM_PENTA6: + return new OrientationInverter3DExtrusionLinear(6u); + case NORM_HEXA8: + return new OrientationInverter3DExtrusionLinear(8u); + case NORM_TETRA10: + return new OrientationInverterTetra10; + case NORM_PYRA13: + return new OrientationInverterPyra13; + case NORM_PENTA15: + return new OrientationInverter3DExtrusionQuadratic(15u); + case NORM_HEXA20: + return new OrientationInverter3DExtrusionQuadratic(20u); + default: + { + const CellModel& cm(CellModel::GetCellModel(gt)); + std::ostringstream oss; oss << "OrientationInverter::BuildInstanceFrom : Sorry no inverter for geo type " << cm.getRepr() << " !"; + throw INTERP_KERNEL::Exception(oss.str()); + } + } +} + +void OrientationInverterChecker::check(mcIdType *beginPt, mcIdType *endPt) const { if(std::distance(beginPt,endPt)!=getNbNodes()) { @@ -35,72 +81,72 @@ void OrientationInverterChecker::check(int *beginPt, int *endPt) const } } -void OrientationInverterSEG2::operateAndShutUp(int *beginPt) const +void OrientationInverterSEG2::operateAndShutUp(mcIdType *beginPt) const { std::swap(beginPt[0],beginPt[1]); } -void OrientationInverterSEG3::operateAndShutUp(int *beginPt) const +void OrientationInverterSEG3::operateAndShutUp(mcIdType *beginPt) const { std::swap(beginPt[0],beginPt[2]); } -void OrientationInverter2DLinear::operateAndShutUp(int *beginPt) const +void OrientationInverter2DLinear::operateAndShutUp(mcIdType *beginPt) const { std::reverse(beginPt+1,beginPt+getNbNodes()); } -void OrientationInverter2DQuadratic::operateAndShutUp(int *beginPt) const +void OrientationInverter2DQuadratic::operateAndShutUp(mcIdType *beginPt) const { int nbNodes(getNbNodes()); std::reverse(beginPt+1,beginPt+nbNodes/2); std::reverse(beginPt+nbNodes/2,beginPt+nbNodes); } -void OrientationInverterPolygon::operate(int *beginPt, int *endPt) const +void OrientationInverterPolygon::operate(mcIdType *beginPt, mcIdType *endPt) const { std::reverse(beginPt+1,endPt); } -void OrientationInverterQPolygon::operate(int *beginPt, int *endPt) const +void OrientationInverterQPolygon::operate(mcIdType *beginPt, mcIdType *endPt) const { std::size_t sz(std::distance(beginPt,endPt)); std::reverse(beginPt+1,beginPt+sz/2); std::reverse(beginPt+sz/2,endPt); } -void OrientationInverterTetra4::operateAndShutUp(int *beginPt) const +void OrientationInverterTetra4::operateAndShutUp(mcIdType *beginPt) const { std::swap(beginPt[1],beginPt[2]); } -void OrientationInverterTetra10::operateAndShutUp(int *beginPt) const +void OrientationInverterTetra10::operateAndShutUp(mcIdType *beginPt) const { std::swap(beginPt[1],beginPt[2]); std::swap(beginPt[4],beginPt[6]); std::swap(beginPt[8],beginPt[9]); } -void OrientationInverterPyra5::operateAndShutUp(int *beginPt) const +void OrientationInverterPyra5::operateAndShutUp(mcIdType *beginPt) const { std::reverse(beginPt+1,beginPt+4); } -void OrientationInverterPyra13::operateAndShutUp(int *beginPt) const +void OrientationInverterPyra13::operateAndShutUp(mcIdType *beginPt) const { std::reverse(beginPt+1,beginPt+4); std::reverse(beginPt+5,beginPt+9); std::swap(beginPt[10],beginPt[12]); } -void OrientationInverter3DExtrusionLinear::operateAndShutUp(int *beginPt) const +void OrientationInverter3DExtrusionLinear::operateAndShutUp(mcIdType *beginPt) const { int nbNodes(getNbNodes()); std::reverse(beginPt+1,beginPt+nbNodes/2); std::reverse(beginPt+nbNodes/2+1,beginPt+nbNodes); } -void OrientationInverter3DExtrusionQuadratic::operateAndShutUp(int *beginPt) const +void OrientationInverter3DExtrusionQuadratic::operateAndShutUp(mcIdType *beginPt) const { int nbNodes(getNbNodes()),nbNodesLinearBase(nbNodes/5); std::reverse(beginPt+1,beginPt+nbNodesLinearBase);