X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESHDS%2FSMESHDS_Mesh.cxx;h=168b9ceb3a7c8f8552a75d0d03a5fd23f03b76c8;hp=d4a018b10c6ba96ae17965035cb2934e9158c76d;hb=8a1ff9ba77b7b72b64b08134f941b56aac80ff55;hpb=23d90107acec5e54ded86d9f309fe5cb42720b78 diff --git a/src/SMESHDS/SMESHDS_Mesh.cxx b/src/SMESHDS/SMESHDS_Mesh.cxx index d4a018b10..168b9ceb3 100644 --- a/src/SMESHDS/SMESHDS_Mesh.cxx +++ b/src/SMESHDS/SMESHDS_Mesh.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS @@ -220,7 +220,6 @@ bool SMESHDS_Mesh::ChangeElementNodes(const SMDS_MeshElement * elem, const SMDS_MeshNode * nodes[], const int nbnodes) { - //MESSAGE("SMESHDS_Mesh::ChangeElementNodes"); if ( ! SMDS_Mesh::ChangeElementNodes( elem, nodes, nbnodes )) return false; @@ -894,16 +893,7 @@ void SMESHDS_Mesh::RemoveNode(const SMDS_MeshNode * n) { if ( n->NbInverseElements() == 0 && !(hasConstructionEdges() || hasConstructionFaces())) { - SMESHDS_SubMesh* subMesh = MeshElements( n->getshapeId() ); - SMESHDS_SubMeshIteratorPtr subIt; - if ( !subMesh ) - subIt = SubMeshes(); - for ( ; !subMesh && subIt->more(); ) { - subMesh = const_cast< SMESHDS_SubMesh* >( subIt->next() ); - if ( subMesh->IsComplexSubmesh() || !subMesh->Contains( n )) - subMesh = 0; - } - RemoveFreeNode( n, subMesh, true); + RemoveFreeNode( n, 0, true ); return; } @@ -965,7 +955,7 @@ void SMESHDS_Mesh::RemoveElement(const SMDS_MeshElement * elt) if ( elt->getshapeId() > 0 ) subMesh = MeshElements( elt->getshapeId() ); - RemoveFreeElement( elt, subMesh, true); + RemoveFreeElement( elt, subMesh, true ); return; } @@ -974,7 +964,7 @@ void SMESHDS_Mesh::RemoveElement(const SMDS_MeshElement * elt) list removedElems; list removedNodes; - SMDS_Mesh::RemoveElement(elt, removedElems, removedNodes, false); + SMDS_Mesh::RemoveElement(elt, removedElems, removedNodes, false ); removeFromContainers( this, myGroups, removedElems, false ); } @@ -987,9 +977,8 @@ void SMESHDS_Mesh::RemoveFreeElement(const SMDS_MeshElement * elt, SMESHDS_SubMesh * subMesh, bool fromGroups) { - //MESSAGE(" --------------------------------> SMESHDS_Mesh::RemoveFreeElement " << subMesh << " " << fromGroups); if (elt->GetType() == SMDSAbs_Node) { - RemoveFreeNode( static_cast(elt), subMesh); + RemoveFreeNode( static_cast(elt), subMesh, fromGroups); return; } @@ -1000,7 +989,7 @@ void SMESHDS_Mesh::RemoveFreeElement(const SMDS_MeshElement * elt, myScript->RemoveElement(elt->GetID()); // Rm from group - // Node can belong to several groups + // Element can belong to several groups if ( fromGroups && !myGroups.empty() ) { set::iterator GrIt = myGroups.begin(); for (; GrIt != myGroups.end(); GrIt++) { @@ -1012,10 +1001,12 @@ void SMESHDS_Mesh::RemoveFreeElement(const SMDS_MeshElement * elt, // Rm from sub-mesh // Element should belong to only one sub-mesh - if( subMesh ) - subMesh->RemoveElement(elt, /*deleted=*/false); + if ( !subMesh && elt->getshapeId() > 0 ) + subMesh = MeshElements( elt->getshapeId() ); + if ( subMesh ) + subMesh->RemoveElement( elt, /*deleted=*/false ); - SMDS_Mesh::RemoveFreeElement(elt); + SMDS_Mesh::RemoveFreeElement( elt ); } //================================================================================ @@ -1352,7 +1343,6 @@ int SMESHDS_Mesh::AddCompoundSubmesh(const TopoDS_Shape& S, bool all = ( type == TopAbs_SHAPE ); if ( all ) // corresponding simple submesh may exist aMainIndex = -aMainIndex; - //MESSAGE("AddCompoundSubmesh index = " << aMainIndex ); SMESHDS_SubMesh * aNewSub = NewSubMesh( aMainIndex ); if ( !aNewSub->IsComplexSubmesh() ) // is empty { @@ -1408,11 +1398,7 @@ int SMESHDS_Mesh::MaxSubMeshIndex() const //======================================================================= int SMESHDS_Mesh::ShapeToIndex(const TopoDS_Shape & S) const { - if (myShape.IsNull()) - MESSAGE("myShape is NULL"); - int index = myIndexToShape.FindIndex(S); - return index; } @@ -2123,18 +2109,18 @@ SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1, const SMDS_MeshNode * n2, const SMDS_MeshNode * n3, const SMDS_MeshNode * n4, - const SMDS_MeshNode * n5, - const SMDS_MeshNode * n6, + const SMDS_MeshNode * n5, + const SMDS_MeshNode * n6, const SMDS_MeshNode * n7, - const SMDS_MeshNode * n8, + const SMDS_MeshNode * n8, const SMDS_MeshNode * n12, const SMDS_MeshNode * n23, const SMDS_MeshNode * n34, - const SMDS_MeshNode * n41, + const SMDS_MeshNode * n41, const SMDS_MeshNode * n56, const SMDS_MeshNode * n67, const SMDS_MeshNode * n78, - const SMDS_MeshNode * n85, + const SMDS_MeshNode * n85, const SMDS_MeshNode * n15, const SMDS_MeshNode * n26, const SMDS_MeshNode * n37, @@ -2162,7 +2148,7 @@ void SMESHDS_Mesh::compactMesh() int newNodeSize = 0; int nbNodes = myNodes.size(); int nbVtkNodes = myGrid->GetNumberOfPoints(); - MESSAGE("nbNodes=" << nbNodes << " nbVtkNodes=" << nbVtkNodes); + //MESSAGE("nbNodes=" << nbNodes << " nbVtkNodes=" << nbVtkNodes); int nbNodeTemp = nbVtkNodes; if (nbNodes > nbVtkNodes) nbNodeTemp = nbNodes; @@ -2171,22 +2157,22 @@ void SMESHDS_Mesh::compactMesh() idNodesOldToNew.resize(nbNodeTemp, -1); // all unused id will be -1 for (int i = 0; i < nbNodes; i++) + { + if (myNodes[i]) { - if (myNodes[i]) - { - int vtkid = myNodes[i]->getVtkId(); - idNodesOldToNew[vtkid] = i; // old vtkId --> old smdsId (valid smdsId are >= 0) - newNodeSize++; - } + int vtkid = myNodes[i]->getVtkId(); + idNodesOldToNew[vtkid] = i; // old vtkId --> old smdsId (valid smdsId are >= 0) + newNodeSize++; } + } bool areNodesModified = (newNodeSize < nbVtkNodes); - MESSAGE("------------------------- compactMesh Nodes Modified: " << areNodesModified); + //MESSAGE("------------------------- compactMesh Nodes Modified: " << areNodesModified); areNodesModified = true; int newCellSize = 0; int nbCells = myCells.size(); int nbVtkCells = myGrid->GetNumberOfCells(); - MESSAGE("nbCells=" << nbCells << " nbVtkCells=" << nbVtkCells); + //MESSAGE("nbCells=" << nbCells << " nbVtkCells=" << nbVtkCells); int nbCellTemp = nbVtkCells; if (nbCells > nbVtkCells) nbCellTemp = nbCells; @@ -2195,15 +2181,15 @@ void SMESHDS_Mesh::compactMesh() idCellsOldToNew.resize(nbCellTemp, -1); // all unused id will be -1 for (int i = 0; i < nbCells; i++) + { + if (myCells[i]) { - if (myCells[i]) - { -// //idCellsOldToNew[i] = myCellIdVtkToSmds[i]; // valid vtk indexes are > = 0 -// int vtkid = myCells[i]->getVtkId(); -// idCellsOldToNew[vtkid] = i; // old vtkId --> old smdsId (not used in input) - newCellSize++; - } + // //idCellsOldToNew[i] = myCellIdVtkToSmds[i]; // valid vtk indexes are > = 0 + // int vtkid = myCells[i]->getVtkId(); + // idCellsOldToNew[vtkid] = i; // old vtkId --> old smdsId (not used in input) + newCellSize++; } + } if (areNodesModified) myGrid->compactGrid(idNodesOldToNew, newNodeSize, idCellsOldToNew, newCellSize); else @@ -2212,62 +2198,62 @@ void SMESHDS_Mesh::compactMesh() int nbVtkPts = myGrid->GetNumberOfPoints(); nbVtkCells = myGrid->GetNumberOfCells(); if (nbVtkPts != newNodeSize) - { - MESSAGE("===> nbVtkPts != newNodeSize " << nbVtkPts << " " << newNodeSize); - if (nbVtkPts > newNodeSize) newNodeSize = nbVtkPts; // several points with same SMDS Id - } + { + MESSAGE("===> nbVtkPts != newNodeSize " << nbVtkPts << " " << newNodeSize); + if (nbVtkPts > newNodeSize) newNodeSize = nbVtkPts; // several points with same SMDS Id + } if (nbVtkCells != newCellSize) - { - MESSAGE("===> nbVtkCells != newCellSize " << nbVtkCells << " " << newCellSize); - if (nbVtkCells > newCellSize) newCellSize = nbVtkCells; // several cells with same SMDS Id - } + { + MESSAGE("===> nbVtkCells != newCellSize " << nbVtkCells << " " << newCellSize); + if (nbVtkCells > newCellSize) newCellSize = nbVtkCells; // several cells with same SMDS Id + } // --- SMDS_MeshNode and myNodes (id in SMDS and in VTK are the same), myNodeIdFactory if (areNodesModified) + { + //MESSAGE("-------------- modify myNodes"); + SetOfNodes newNodes; + newNodes.resize(newNodeSize+1,0); // 0 not used, SMDS numbers 1..n + int newSmdsId = 0; + for (int i = 0; i < nbNodes; i++) { - MESSAGE("-------------- modify myNodes"); - SetOfNodes newNodes; - newNodes.resize(newNodeSize+1,0); // 0 not used, SMDS numbers 1..n - int newSmdsId = 0; - for (int i = 0; i < nbNodes; i++) - { - if (myNodes[i]) - { - newSmdsId++; // SMDS id start to 1 - int oldVtkId = myNodes[i]->getVtkId(); - int newVtkId = idNodesOldToNew[oldVtkId]; - //MESSAGE("myNodes["<< i << "] vtkId " << oldVtkId << " --> " << newVtkId); - myNodes[i]->setVtkId(newVtkId); - myNodes[i]->setId(newSmdsId); - newNodes[newSmdsId] = myNodes[i]; - //MESSAGE("myNodes["<< i << "] --> newNodes[" << newSmdsId << "]"); - } - } - myNodes.swap(newNodes); - this->myNodeIDFactory->emptyPool(newSmdsId); // newSmdsId = number of nodes - MESSAGE("myNodes.size " << myNodes.size()); + if (myNodes[i]) + { + newSmdsId++; // SMDS id start to 1 + int oldVtkId = myNodes[i]->getVtkId(); + int newVtkId = idNodesOldToNew[oldVtkId]; + //MESSAGE("myNodes["<< i << "] vtkId " << oldVtkId << " --> " << newVtkId); + myNodes[i]->setVtkId(newVtkId); + myNodes[i]->setId(newSmdsId); + newNodes[newSmdsId] = myNodes[i]; + //MESSAGE("myNodes["<< i << "] --> newNodes[" << newSmdsId << "]"); + } } + myNodes.swap(newNodes); + this->myNodeIDFactory->emptyPool(newSmdsId); // newSmdsId = number of nodes + //MESSAGE("myNodes.size " << myNodes.size()); + } // --- SMDS_MeshCell, myCellIdVtkToSmds, myCellIdSmdsToVtk, myCells int vtkIndexSize = myCellIdVtkToSmds.size(); int maxVtkId = -1; for (int oldVtkId = 0; oldVtkId < vtkIndexSize; oldVtkId++) + { + int oldSmdsId = this->myCellIdVtkToSmds[oldVtkId]; + if (oldSmdsId > 0) { - int oldSmdsId = this->myCellIdVtkToSmds[oldVtkId]; - if (oldSmdsId > 0) - { - int newVtkId = idCellsOldToNew[oldVtkId]; - if (newVtkId > maxVtkId) - maxVtkId = newVtkId; - //MESSAGE("myCells["<< oldSmdsId << "] vtkId " << oldVtkId << " --> " << newVtkId); - myCells[oldSmdsId]->setVtkId(newVtkId); - } + int newVtkId = idCellsOldToNew[oldVtkId]; + if (newVtkId > maxVtkId) + maxVtkId = newVtkId; + //MESSAGE("myCells["<< oldSmdsId << "] vtkId " << oldVtkId << " --> " << newVtkId); + myCells[oldSmdsId]->setVtkId(newVtkId); } -// MESSAGE("myCells.size()=" << myCells.size() -// << " myCellIdSmdsToVtk.size()=" << myCellIdSmdsToVtk.size() -// << " myCellIdVtkToSmds.size()=" << myCellIdVtkToSmds.size() ); + } + // MESSAGE("myCells.size()=" << myCells.size() + // << " myCellIdSmdsToVtk.size()=" << myCellIdSmdsToVtk.size() + // << " myCellIdVtkToSmds.size()=" << myCellIdVtkToSmds.size() ); SetOfCells newCells; //vector newSmdsToVtk; @@ -2282,7 +2268,7 @@ void SMESHDS_Mesh::compactMesh() int newSmdsId = 0; for (int i = 0; i < myCellsSize; i++) { - if (myCells[i]) + if ( myCells[i] ) { newSmdsId++; // SMDS id start to 1 assert(newSmdsId <= newCellSize); @@ -2299,8 +2285,7 @@ void SMESHDS_Mesh::compactMesh() myCells.swap(newCells); //myCellIdSmdsToVtk.swap(newSmdsToVtk); myCellIdVtkToSmds.swap(newVtkToSmds); - MESSAGE("myCells.size()=" << myCells.size() - << " myCellIdVtkToSmds.size()=" << myCellIdVtkToSmds.size() ); + //MESSAGE("myCells.size()="<< myCells.size()<<" myCellIdVtkToSmds.size()="<myElementIDFactory->emptyPool(newSmdsId); this->myScript->SetModified(true); // notify GUI client for buildPrs when update