X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMDS%2FSMDS_UnstructuredGrid.cxx;h=124d069f1b3e407335b4a4c78fbb26f31fd3e37b;hp=03bff2d6662715edcf1582d0d7e457aa3ff7f7d3;hb=d5aa4efde29d902f7be1259d7603d36e95f61215;hpb=560f8b2d0c2a7fdb4047f981cfac56ed3629bc1a diff --git a/src/SMDS/SMDS_UnstructuredGrid.cxx b/src/SMDS/SMDS_UnstructuredGrid.cxx index 03bff2d66..124d069f1 100644 --- a/src/SMDS/SMDS_UnstructuredGrid.cxx +++ b/src/SMDS/SMDS_UnstructuredGrid.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2010-2016 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2010-2021 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 @@ -46,7 +46,7 @@ void SMDS_CellLinks::ResizeForPoint(vtkIdType vtkID) if ( vtkID > this->MaxId ) { this->MaxId = vtkID; - if ( vtkID >= this->Size ) + if ( vtkID >= this->Size ) vtkCellLinks::Resize( vtkID+SMDS_Mesh::chunkSize ); } } @@ -59,7 +59,7 @@ void SMDS_CellLinks::BuildLinks(vtkDataSet *data, vtkCellArray *Connectivity, vt vtkIdType j, cellId = 0; unsigned short *linkLoc; vtkIdType npts=0; - vtkIdType *pts=0; + vtkIdType const *pts(nullptr); vtkIdType loc = Connectivity->GetTraversalLocation(); // traverse data to determine number of uses of each point @@ -135,7 +135,7 @@ vtkPoints* SMDS_UnstructuredGrid::GetPoints() return this->Points; } -int SMDS_UnstructuredGrid::InsertNextLinkedCell(int type, int npts, vtkIdType *pts) +vtkIdType SMDS_UnstructuredGrid::InsertNextLinkedCell(int type, int npts, vtkIdType *pts) { if ( !this->Links ) // don't create Links until they are needed { @@ -146,7 +146,7 @@ int SMDS_UnstructuredGrid::InsertNextLinkedCell(int type, int npts, vtkIdType *p return vtkUnstructuredGrid::InsertNextLinkedCell(type, npts, pts); // --- type = VTK_POLYHEDRON - int cellid = this->InsertNextCell(type, npts, pts); + vtkIdType cellid = this->InsertNextCell(type, npts, pts); std::set setOfNodes; setOfNodes.clear(); @@ -158,18 +158,15 @@ int SMDS_UnstructuredGrid::InsertNextLinkedCell(int type, int npts, vtkIdType *p i++; for (int k = 0; k < nbnodes; k++) { - setOfNodes.insert(pts[i]); + if ( setOfNodes.insert( pts[i] ).second ) + { + (static_cast< vtkCellLinks * >(this->Links.GetPointer()))->ResizeCellList( pts[i], 1 ); + (static_cast< vtkCellLinks * >(this->Links.GetPointer()))->AddCellReference( cellid, pts[i] ); + } i++; } } - std::set::iterator it = setOfNodes.begin(); - for (; it != setOfNodes.end(); ++it) - { - this->Links->ResizeCellList(*it, 1); - this->Links->AddCellReference(cellid, *it); - } - return cellid; } @@ -178,15 +175,15 @@ void SMDS_UnstructuredGrid::setSMDS_mesh(SMDS_Mesh *mesh) _mesh = mesh; } -void SMDS_UnstructuredGrid::compactGrid(std::vector& idNodesOldToNew, int newNodeSize, - std::vector& idCellsNewToOld, int newCellSize) +void SMDS_UnstructuredGrid::compactGrid(std::vector& idNodesOldToNew, smIdType newNodeSize, + std::vector& idCellsNewToOld, smIdType newCellSize) { this->DeleteLinks(); // IDs of VTK nodes always correspond to SMDS IDs but there can be "holes" in SMDS numeration. // We compact only if there were holes - int oldNodeSize = this->GetNumberOfPoints(); + vtkIdType oldNodeSize = this->GetNumberOfPoints(); bool updateNodes = ( oldNodeSize > newNodeSize ); if ( true /*updateNodes*/ ) { @@ -194,19 +191,19 @@ void SMDS_UnstructuredGrid::compactGrid(std::vector& idNodesOldToNew, int n // Use double type for storing coordinates of nodes instead float. vtkPoints *newPoints = vtkPoints::New(); newPoints->SetDataType( VTK_DOUBLE ); - newPoints->SetNumberOfPoints( newNodeSize ); + newPoints->SetNumberOfPoints( FromSmIdType(newNodeSize) ); - int i = 0, alreadyCopied = 0; + vtkIdType i = 0, alreadyCopied = 0; while ( i < oldNodeSize ) { // skip a hole if any while ( i < oldNodeSize && idNodesOldToNew[i] < 0 ) ++i; - int startBloc = i; + vtkIdType startBloc = i; // look for a block end while ( i < oldNodeSize && idNodesOldToNew[i] >= 0 ) ++i; - int endBloc = i; + vtkIdType endBloc = i; copyNodes(newPoints, idNodesOldToNew, alreadyCopied, startBloc, endBloc); } this->SetPoints(newPoints); @@ -220,15 +217,15 @@ void SMDS_UnstructuredGrid::compactGrid(std::vector& idNodesOldToNew, int n // Compact cells if VTK IDs do not correspond to SMDS IDs or nodes compacted - int oldCellSize = this->Types->GetNumberOfTuples(); - bool updateCells = ( updateNodes || newCellSize != oldCellSize ); - for ( int newID = 0, nbIDs = idCellsNewToOld.size(); newID < nbIDs && !updateCells; ++newID ) + vtkIdType oldCellSize = this->Types->GetNumberOfTuples(); + bool updateCells = ( updateNodes || newCellSize != oldCellSize ); + for ( vtkIdType newID = 0, nbIDs = idCellsNewToOld.size(); newID < nbIDs && !updateCells; ++newID ) updateCells = ( idCellsNewToOld[ newID ] != newID ); if ( false /*!updateCells*/ ) // no holes in elements { this->Connectivity->Squeeze(); - this->Locations->Squeeze(); + this->CellLocations->Squeeze(); this->Types->Squeeze(); if ( this->FaceLocations ) { @@ -239,20 +236,20 @@ void SMDS_UnstructuredGrid::compactGrid(std::vector& idNodesOldToNew, int n return; } - if ((int) idNodesOldToNew.size() < oldNodeSize ) + if ((vtkIdType) idNodesOldToNew.size() < oldNodeSize ) { idNodesOldToNew.reserve( oldNodeSize ); - for ( int i = idNodesOldToNew.size(); i < oldNodeSize; ++i ) + for ( vtkIdType i = idNodesOldToNew.size(); i < oldNodeSize; ++i ) idNodesOldToNew.push_back( i ); } // --- create new compacted Connectivity, Locations and Types - int newConnectivitySize = this->Connectivity->GetNumberOfConnectivityEntries(); + vtkIdType newConnectivitySize = this->Connectivity->GetNumberOfConnectivityEntries(); if ( newCellSize != oldCellSize ) - for ( int i = 0; i < oldCellSize - 1; ++i ) + for ( vtkIdType i = 0; i < oldCellSize - 1; ++i ) if ( this->Types->GetValue( i ) == VTK_EMPTY_CELL ) - newConnectivitySize -= this->Locations->GetValue( i+1 ) - this->Locations->GetValue( i ); + newConnectivitySize -= this->Connectivity->GetCellSize( i ); vtkCellArray *newConnectivity = vtkCellArray::New(); newConnectivity->Initialize(); @@ -260,11 +257,11 @@ void SMDS_UnstructuredGrid::compactGrid(std::vector& idNodesOldToNew, int n vtkUnsignedCharArray *newTypes = vtkUnsignedCharArray::New(); newTypes->Initialize(); - newTypes->SetNumberOfValues(newCellSize); + newTypes->SetNumberOfValues(FromSmIdType(newCellSize)); vtkIdTypeArray *newLocations = vtkIdTypeArray::New(); newLocations->Initialize(); - newLocations->SetNumberOfValues(newCellSize); + newLocations->SetNumberOfValues(FromSmIdType(newCellSize)); std::vector< vtkIdType > pointsCell(1024); // --- points id to fill a new cell @@ -276,11 +273,11 @@ void SMDS_UnstructuredGrid::compactGrid(std::vector& idNodesOldToNew, int n { vtkDoubleArray* newDiameters = vtkDoubleArray::New(); newDiameters->SetNumberOfComponents(1); - for ( int newCellID = 0; newCellID < newCellSize; newCellID++ ) + for ( vtkIdType newCellID = 0; newCellID < newCellSize; newCellID++ ) { if ( newTypes->GetValue( newCellID ) == VTK_POLY_VERTEX ) { - int oldCellID = idCellsNewToOld[ newCellID ]; + vtkIdType oldCellID = idCellsNewToOld[ newCellID ]; newDiameters->InsertValue( newCellID, diameters->GetValue( oldCellID )); } vtkDataSet::CellData->SetScalars( newDiameters ); @@ -295,22 +292,22 @@ void SMDS_UnstructuredGrid::compactGrid(std::vector& idNodesOldToNew, int n vtkIdTypeArray *newFaces = vtkIdTypeArray::New(); newFaces->Initialize(); newFaces->Allocate(this->Faces->GetSize()); - for ( int newCellID = 0; newCellID < newCellSize; newCellID++ ) + for ( vtkIdType newCellID = 0; newCellID < newCellSize; newCellID++ ) { if ( newTypes->GetValue( newCellID ) == VTK_POLYHEDRON ) { - int oldCellId = idCellsNewToOld[ newCellID ]; + smIdType oldCellId = idCellsNewToOld[ newCellID ]; newFaceLocations->InsertNextValue( newFaces->GetMaxId()+1 ); - int oldFaceLoc = this->FaceLocations->GetValue( oldCellId ); - int nCellFaces = this->Faces->GetValue( oldFaceLoc++ ); - newFaces->InsertNextValue( nCellFaces ); + smIdType oldFaceLoc = this->FaceLocations->GetValue( FromSmIdType(oldCellId) ); + smIdType nCellFaces = this->Faces->GetValue( FromSmIdType(oldFaceLoc++) ); + newFaces->InsertNextValue( FromSmIdType(nCellFaces) ); for ( int n = 0; n < nCellFaces; n++ ) { - int nptsInFace = this->Faces->GetValue( oldFaceLoc++ ); + int nptsInFace = this->Faces->GetValue( FromSmIdType(oldFaceLoc++) ); newFaces->InsertNextValue( nptsInFace ); for ( int k = 0; k < nptsInFace; k++ ) { - int oldpt = this->Faces->GetValue( oldFaceLoc++ ); + vtkIdType oldpt = this->Faces->GetValue( FromSmIdType(oldFaceLoc++) ); newFaces->InsertNextValue( idNodesOldToNew[ oldpt ]); } } @@ -323,12 +320,14 @@ void SMDS_UnstructuredGrid::compactGrid(std::vector& idNodesOldToNew, int n newFaceLocations->Squeeze(); newFaces->Squeeze(); this->SetCells( newTypes, newLocations, newConnectivity, newFaceLocations, newFaces ); + this->CellLocations = newLocations; newFaceLocations->Delete(); newFaces->Delete(); } else { this->SetCells( newTypes, newLocations, newConnectivity, FaceLocations, Faces ); + this->CellLocations = newLocations; } newTypes->Delete(); @@ -336,15 +335,15 @@ void SMDS_UnstructuredGrid::compactGrid(std::vector& idNodesOldToNew, int n newConnectivity->Delete(); } -void SMDS_UnstructuredGrid::copyNodes(vtkPoints * newPoints, - std::vector& idNodesOldToNew, - int& alreadyCopied, - int start, - int end) +void SMDS_UnstructuredGrid::copyNodes(vtkPoints * newPoints, + std::vector& /*idNodesOldToNew*/, + vtkIdType& alreadyCopied, + vtkIdType start, + vtkIdType end) { void *target = newPoints->GetVoidPointer(3 * alreadyCopied); void *source = this->Points->GetVoidPointer(3 * start); - int nbPoints = end - start; + vtkIdType nbPoints = end - start; if (nbPoints > 0) { memcpy(target, source, 3 * sizeof(double) * nbPoints); @@ -353,43 +352,44 @@ void SMDS_UnstructuredGrid::copyNodes(vtkPoints * newPoints, } void SMDS_UnstructuredGrid::copyBloc(vtkUnsignedCharArray * newTypes, - const std::vector& idCellsNewToOld, - const std::vector& idNodesOldToNew, + const std::vector& idCellsNewToOld, + const std::vector& idNodesOldToNew, vtkCellArray* newConnectivity, vtkIdTypeArray* newLocations, std::vector& pointsCell) { for ( size_t iNew = 0; iNew < idCellsNewToOld.size(); iNew++ ) { - int iOld = idCellsNewToOld[ iNew ]; + vtkIdType iOld = idCellsNewToOld[ iNew ]; newTypes->SetValue( iNew, this->Types->GetValue( iOld )); - vtkIdType oldLoc = this->Locations->GetValue( iOld ); + + vtkIdType oldLoc = ((vtkIdTypeArray *)(this->Connectivity->GetOffsetsArray()))->GetValue( iOld ); vtkIdType nbpts; - vtkIdType *oldPtsCell = 0; - this->Connectivity->GetCell( oldLoc, nbpts, oldPtsCell ); + vtkIdType const *oldPtsCell(nullptr); + this->Connectivity->GetCell( oldLoc+iOld, nbpts, oldPtsCell ); if ((vtkIdType) pointsCell.size() < nbpts ) pointsCell.resize( nbpts ); for ( int l = 0; l < nbpts; l++ ) { - int oldval = oldPtsCell[l]; + vtkIdType oldval = oldPtsCell[l]; pointsCell[l] = idNodesOldToNew[oldval]; } - /*int newcnt = */newConnectivity->InsertNextCell( nbpts, pointsCell.data() ); - int newLoc = newConnectivity->GetInsertLocation( nbpts ); + /*vtkIdType newcnt = */newConnectivity->InsertNextCell( nbpts, pointsCell.data() ); + vtkIdType newLoc = newConnectivity->GetInsertLocation( nbpts ); newLocations->SetValue( iNew, newLoc ); } } -int SMDS_UnstructuredGrid::CellIdToDownId(int vtkCellId) +int SMDS_UnstructuredGrid::CellIdToDownId(vtkIdType vtkCellId) { - if ((vtkCellId < 0) || (vtkCellId >= (int)_cellIdToDownId.size())) + if ((vtkCellId < 0) || (vtkCellId >= (vtkIdType)_cellIdToDownId.size())) { return -1; } return _cellIdToDownId[vtkCellId]; } -void SMDS_UnstructuredGrid::setCellIdToDownId(int vtkCellId, int downId) +void SMDS_UnstructuredGrid::setCellIdToDownId(vtkIdType vtkCellId, int downId) { // ASSERT((vtkCellId >= 0) && (vtkCellId < _cellIdToDownId.size())); _cellIdToDownId[vtkCellId] = downId; @@ -410,7 +410,7 @@ void SMDS_UnstructuredGrid::CleanDownwardConnectivity() * Downward connectivity is no more valid if vtkUnstructuredGrid is modified. * */ -void SMDS_UnstructuredGrid::BuildDownwardConnectivity(bool withEdges) +void SMDS_UnstructuredGrid::BuildDownwardConnectivity(bool /*withEdges*/) { MESSAGE("SMDS_UnstructuredGrid::BuildDownwardConnectivity");CHRONO(2); // TODO calcul partiel sans edges @@ -446,15 +446,15 @@ void SMDS_UnstructuredGrid::BuildDownwardConnectivity(bool withEdges) const SMDS_MeshInfo &meshInfo = _mesh->GetMeshInfo(); - int nbLinTetra = meshInfo.NbTetras (ORDER_LINEAR); - int nbQuadTetra = meshInfo.NbTetras (ORDER_QUADRATIC); - int nbLinPyra = meshInfo.NbPyramids(ORDER_LINEAR); - int nbQuadPyra = meshInfo.NbPyramids(ORDER_QUADRATIC); - int nbLinPrism = meshInfo.NbPrisms (ORDER_LINEAR); - int nbQuadPrism = meshInfo.NbPrisms (ORDER_QUADRATIC); - int nbLinHexa = meshInfo.NbHexas (ORDER_LINEAR); - int nbQuadHexa = meshInfo.NbHexas (ORDER_QUADRATIC); - int nbHexPrism = meshInfo.NbHexPrisms(); + int nbLinTetra = FromSmIdType(meshInfo.NbTetras (ORDER_LINEAR)); + int nbQuadTetra = FromSmIdType(meshInfo.NbTetras (ORDER_QUADRATIC)); + int nbLinPyra = FromSmIdType(meshInfo.NbPyramids(ORDER_LINEAR)); + int nbQuadPyra = FromSmIdType(meshInfo.NbPyramids(ORDER_QUADRATIC)); + int nbLinPrism = FromSmIdType(meshInfo.NbPrisms (ORDER_LINEAR)); + int nbQuadPrism = FromSmIdType(meshInfo.NbPrisms (ORDER_QUADRATIC)); + int nbLinHexa = FromSmIdType(meshInfo.NbHexas (ORDER_LINEAR)); + int nbQuadHexa = FromSmIdType(meshInfo.NbHexas (ORDER_QUADRATIC)); + int nbHexPrism = FromSmIdType(meshInfo.NbHexPrisms()); int nbLineGuess = int((4.0 / 3.0) * nbLinTetra + 2 * nbLinPrism + 2.5 * nbLinPyra + 3 * nbLinHexa); int nbQuadEdgeGuess = int((4.0 / 3.0) * nbQuadTetra + 2 * nbQuadPrism + 2.5 * nbQuadPyra + 3 * nbQuadHexa); @@ -482,6 +482,7 @@ void SMDS_UnstructuredGrid::BuildDownwardConnectivity(bool withEdges) GuessSize[VTK_QUADRATIC_HEXAHEDRON] = nbQuadHexa; GuessSize[VTK_TRIQUADRATIC_HEXAHEDRON] = nbQuadHexa; GuessSize[VTK_HEXAGONAL_PRISM] = nbHexPrism; + (void)GuessSize; // unused in Release mode _downArray[VTK_LINE] ->allocate(nbLineGuess); _downArray[VTK_QUADRATIC_EDGE] ->allocate(nbQuadEdgeGuess); @@ -979,8 +980,10 @@ void SMDS_UnstructuredGrid::GetNodeIds(std::set& nodeSet, int downId, unsig void SMDS_UnstructuredGrid::ModifyCellNodes(int vtkVolId, std::map localClonedNodeIds) { vtkIdType npts = 0; - vtkIdType *pts; // will refer to the point id's of the face - this->GetCellPoints(vtkVolId, npts, pts); + vtkIdType const *tmp(nullptr); // will refer to the point id's of the face + vtkIdType *pts; // will refer to the point id's of the face + this->GetCellPoints(vtkVolId, npts, tmp); + pts = const_cast< vtkIdType*>( tmp ); for (int i = 0; i < npts; i++) { if (localClonedNodeIds.count(pts[i])) @@ -1001,14 +1004,14 @@ void SMDS_UnstructuredGrid::ModifyCellNodes(int vtkVolId, std::map loc */ int SMDS_UnstructuredGrid::getOrderedNodesOfFace(int vtkVolId, int& dim, std::vector& orderedNodes) { - int vtkType = this->GetCellType(vtkVolId); - dim = SMDS_Downward::getCellDimension(vtkType); + int vtkType = this->GetCellType( vtkVolId ); + dim = SMDS_Downward::getCellDimension( vtkType ); if (dim == 3) - { - SMDS_Down3D *downvol = static_cast (_downArray[vtkType]); - int downVolId = this->_cellIdToDownId[vtkVolId]; - downvol->getOrderedNodesOfFace(downVolId, orderedNodes); - } + { + SMDS_Down3D *downvol = static_cast (_downArray[vtkType]); + int downVolId = this->_cellIdToDownId[ vtkVolId ]; + downvol->getOrderedNodesOfFace(downVolId, orderedNodes); + } // else nothing to do; return orderedNodes.size(); } @@ -1023,7 +1026,7 @@ void SMDS_UnstructuredGrid::BuildLinks() SMDS_CellLinks* links; this->Links = links = SMDS_CellLinks::New(); - this->Links->Allocate(this->GetNumberOfPoints()); + (static_cast< vtkCellLinks *>(this->Links.GetPointer()))->Allocate(this->GetNumberOfPoints()); this->Links->Register(this); links->BuildLinks(this, this->Connectivity,this->GetCellTypesArray() ); this->Links->Delete(); @@ -1042,7 +1045,7 @@ SMDS_CellLinks* SMDS_UnstructuredGrid::GetLinks() { if ( !this->Links ) BuildLinks(); - return static_cast< SMDS_CellLinks* >( this->Links ); + return static_cast< SMDS_CellLinks* >( this->Links.GetPointer() ); } /*! Create a volume (prism or hexahedron) by duplication of a face. @@ -1087,74 +1090,88 @@ SMDS_UnstructuredGrid::extrudeVolumeFromFace(int vtkVolId, break; default: isQuadratic = false; - break; + break; } if (isQuadratic) + { + long dom1 = domain1; + long dom2 = domain2; + long dom1_2; // for nodeQuadDomains + if (domain1 < domain2) + dom1_2 = dom1 + INT_MAX * dom2; + else + dom1_2 = dom2 + INT_MAX * dom1; + //cerr << "dom1=" << dom1 << " dom2=" << dom2 << " dom1_2=" << dom1_2 << endl; + int ima = orderedOriginals.size(); + int mid = orderedOriginals.size() / 2; + //cerr << "ima=" << ima << " mid=" << mid << endl; + for (int i = 0; i < mid; i++) + orderedNodes.push_back(nodeDomains[orderedOriginals[i]][domain1]); + for (int i = 0; i < mid; i++) + orderedNodes.push_back(nodeDomains[orderedOriginals[i]][domain2]); + for (int i = mid; i < ima; i++) + orderedNodes.push_back(nodeDomains[orderedOriginals[i]][domain1]); + for (int i = mid; i < ima; i++) + orderedNodes.push_back(nodeDomains[orderedOriginals[i]][domain2]); + for (int i = 0; i < mid; i++) { - long dom1 = domain1; - long dom2 = domain2; - long dom1_2; // for nodeQuadDomains - if (domain1 < domain2) - dom1_2 = dom1 + INT_MAX * dom2; + int oldId = orderedOriginals[i]; + int newId; + if (nodeQuadDomains.count(oldId) && nodeQuadDomains[oldId].count(dom1_2)) + newId = nodeQuadDomains[oldId][dom1_2]; else - dom1_2 = dom2 + INT_MAX * dom1; - //cerr << "dom1=" << dom1 << " dom2=" << dom2 << " dom1_2=" << dom1_2 << endl; - int ima = orderedOriginals.size(); - int mid = orderedOriginals.size() / 2; - //cerr << "ima=" << ima << " mid=" << mid << endl; - for (int i = 0; i < mid; i++) - orderedNodes.push_back(nodeDomains[orderedOriginals[i]][domain1]); - for (int i = 0; i < mid; i++) - orderedNodes.push_back(nodeDomains[orderedOriginals[i]][domain2]); - for (int i = mid; i < ima; i++) - orderedNodes.push_back(nodeDomains[orderedOriginals[i]][domain1]); - for (int i = mid; i < ima; i++) - orderedNodes.push_back(nodeDomains[orderedOriginals[i]][domain2]); - for (int i = 0; i < mid; i++) + { + double *coords = this->GetPoint(oldId); + SMDS_MeshNode *newNode = _mesh->AddNode(coords[0], coords[1], coords[2]); + newId = newNode->GetVtkID(); + if (! nodeQuadDomains.count(oldId)) { - int oldId = orderedOriginals[i]; - int newId; - if (nodeQuadDomains.count(oldId) && nodeQuadDomains[oldId].count(dom1_2)) - newId = nodeQuadDomains[oldId][dom1_2]; - else - { - double *coords = this->GetPoint(oldId); - SMDS_MeshNode *newNode = _mesh->AddNode(coords[0], coords[1], coords[2]); - newId = newNode->GetVtkID(); - if (! nodeQuadDomains.count(oldId)) - { - std::map emptyMap; - nodeQuadDomains[oldId] = emptyMap; - } - nodeQuadDomains[oldId][dom1_2] = newId; - } - orderedNodes.push_back(newId); + std::map emptyMap; + nodeQuadDomains[oldId] = emptyMap; } + nodeQuadDomains[oldId][dom1_2] = newId; + } + orderedNodes.push_back(newId); } + } else - { + { + for (int i = 0; i < nbNodes; i++) + orderedNodes.push_back(nodeDomains[orderedOriginals[i]][domain1]); + if (dim == 3) for (int i = 0; i < nbNodes; i++) - orderedNodes.push_back(nodeDomains[orderedOriginals[i]][domain1]); - if (dim == 3) - for (int i = 0; i < nbNodes; i++) - orderedNodes.push_back(nodeDomains[orderedOriginals[i]][domain2]); - else - for (int i = nbNodes-1; i >= 0; i--) - orderedNodes.push_back(nodeDomains[orderedOriginals[i]][domain2]); + orderedNodes.push_back(nodeDomains[orderedOriginals[i]][domain2]); + else + for (int i = nbNodes-1; i >= 0; i--) + orderedNodes.push_back(nodeDomains[orderedOriginals[i]][domain2]); - } + } if (dim == 3) - { - SMDS_MeshVolume *vol = _mesh->AddVolumeFromVtkIds(orderedNodes); - return vol; - } + { + SMDS_MeshVolume *vol = _mesh->AddVolumeFromVtkIds(orderedNodes); + return vol; + } else if (dim == 2) + { + // bos #24368 + // orient face by the original one, as getOrderedNodesOfFace() not implemented for faces + const SMDS_MeshElement* origFace = _mesh->FindElementVtk( vtkVolId ); + int i0 = origFace->GetNodeIndex( _mesh->FindNodeVtk( orderedNodes[0] )); + int i1 = origFace->GetNodeIndex( _mesh->FindNodeVtk( orderedNodes[1] )); + int diff = i0 - i1; + // order of nodes must be reverse in face and origFace + bool oriOk = ( diff == 1 ) || ( diff == -3 ); + if ( !oriOk ) { - SMDS_MeshFace *face = _mesh->AddFaceFromVtkIds(orderedNodes); - return face; + SMDSAbs_EntityType type = isQuadratic ? SMDSEntity_Quad_Quadrangle : SMDSEntity_Quadrangle; + const std::vector& interlace = SMDS_MeshCell::reverseSmdsOrder( type ); + SMDS_MeshCell::applyInterlace( interlace, orderedNodes ); } + SMDS_MeshFace *face = _mesh->AddFaceFromVtkIds(orderedNodes); + return face; + } // TODO update sub-shape list of elements and nodes return 0; @@ -1205,4 +1222,3 @@ double SMDS_UnstructuredGrid::GetBallDiameter( vtkIdType vtkID ) const return vtkDoubleArray::SafeDownCast( vtkDataSet::CellData->GetScalars() )->GetValue( vtkID ); return 0; } -