X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModel%2FModel_AttributeRefList.cpp;h=44f7e44ab01fa922d1923a40384c438f3a742e65;hb=3ce3e69a217055142b03d67add35d054979a6340;hp=4c152b929046792b437e691049bae46b6e17cb2d;hpb=1028c669d99d70f23d1b4c78d3ba885a64b92903;p=modules%2Fshaper.git diff --git a/src/Model/Model_AttributeRefList.cpp b/src/Model/Model_AttributeRefList.cpp index 4c152b929..44f7e44ab 100644 --- a/src/Model/Model_AttributeRefList.cpp +++ b/src/Model/Model_AttributeRefList.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2017 CEA/DEN, EDF R&D +// Copyright (C) 2014-2020 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 @@ -12,10 +12,9 @@ // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // -// See http://www.salome-platform.org/ or -// email : webmaster.salome@opencascade.com +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // #include "Model_AttributeRefList.h" @@ -67,6 +66,7 @@ void Model_AttributeRefList::remove(ObjectPtr theObject) REMOVE_BACK_REF(theObject); owner()->data()->sendAttributeUpdated(this); } else { + // LCOV_EXCL_START // create new lists because for the current moment remove one of the duplicated elements // from the list is buggy TDF_LabelList anOldList = myRef->List(); @@ -102,6 +102,7 @@ void Model_AttributeRefList::remove(ObjectPtr theObject) REMOVE_BACK_REF(theObject); owner()->data()->sendAttributeUpdated(this); } + // LCOV_EXCL_STOP } } else { // in case of empty object remove, the first empty object is removed from the list @@ -124,7 +125,6 @@ void Model_AttributeRefList::remove(ObjectPtr theObject) void Model_AttributeRefList::clear() { - eraseHash(); std::list anOldList = list(); myRef->Clear(); std::list::iterator anOldIter = anOldList.begin(); @@ -132,6 +132,7 @@ void Model_AttributeRefList::clear() REMOVE_BACK_REF((*anOldIter)); } myExtDocRef->Clear(); + eraseHash(); owner()->data()->sendAttributeUpdated(this); } @@ -181,7 +182,9 @@ ObjectPtr Model_AttributeRefList::iteratedObject(TDF_ListIteratorOfLabelList& th } theExtIter.Next(); } else { // internal document object - anObj = theDoc->objects()->object(theLIter.Value()); + TDF_Label aLab = theLIter.Value(); + if (!aLab.IsNull()) + anObj = theDoc->objects()->object(theLIter.Value()); } } return anObj; @@ -251,38 +254,6 @@ void Model_AttributeRefList::substitute(const ObjectPtr& theCurrent, const Objec } } -void Model_AttributeRefList::exchange(const ObjectPtr& theObject1, const ObjectPtr& theObject2) -{ - std::shared_ptr aDoc = std::dynamic_pointer_cast( - owner()->document()); - if (aDoc) { - std::shared_ptr aData1 = std::dynamic_pointer_cast(theObject1->data()); - if (aData1.get() && aData1->isValid()) { - TDF_Label aLab1 = aData1->label().Father(); - if (theObject2.get() && theObject2->data()->isValid()) { // the new may be null - std::shared_ptr aData2 = - std::dynamic_pointer_cast(theObject2->data()); - if (aData2.get() && aData2->isValid()) { - eraseHash(); - TDF_Label aLab2 = aData2->label().Father(); - // do the substitution: use the temporary label, as usually in exchange - TDF_Label aTmpLab = aLab1.Root(); - if (myRef->InsertAfter(aTmpLab, aLab1)) { - myRef->Remove(aLab1); - } - if (myRef->InsertAfter(aLab1, aLab2)) { - myRef->Remove(aLab2); - } - if (myRef->InsertAfter(aLab2, aTmpLab)) { - myRef->Remove(aTmpLab); - } - owner()->data()->sendAttributeUpdated(this); - } - } - } - } -} - void Model_AttributeRefList::removeLast() { std::shared_ptr aDoc = std::dynamic_pointer_cast( @@ -318,8 +289,8 @@ void Model_AttributeRefList::remove(const std::set& theIndices) REMOVE_BACK_REF(anObj); } } - eraseHash(); if (!aLabelsToRemove.IsEmpty()) { + eraseHash(); owner()->data()->sendAttributeUpdated(this); } } @@ -347,6 +318,7 @@ void Model_AttributeRefList::createHash() { if (myHashUsed) return; + eraseHash(); std::shared_ptr aDoc = std::dynamic_pointer_cast( owner()->document()); if (aDoc) { @@ -360,11 +332,11 @@ void Model_AttributeRefList::createHash() myHashObjects.insert(anObj); } } - myHashUsed = true; } + if (!myHashObjects.empty()) // on open document with multi-rotation referenced have no results + myHashUsed = true; } - void Model_AttributeRefList::eraseHash() { myHashObjects.clear();