X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModel%2FModel_Objects.cpp;h=b3b21793043789b434d0c4b7a51e2f4123786290;hb=e85bb4f7065e5750e48a7c77056c80c0fa18e559;hp=fe5ac904f254f5bce53f846db0e43d68b0a48841;hpb=d7a6c25deae913bdee575372b0ccea7e041c9b5c;p=modules%2Fshaper.git diff --git a/src/Model/Model_Objects.cpp b/src/Model/Model_Objects.cpp index fe5ac904f..b3b217930 100644 --- a/src/Model/Model_Objects.cpp +++ b/src/Model/Model_Objects.cpp @@ -26,7 +26,6 @@ #include #include #include -#include #include #include #include @@ -487,7 +486,7 @@ void Model_Objects::createHistory(const std::string& theGroupID) } else { // it may be a folder - ObjectPtr aFolder = folder(aRefs->Value(a)); + const ObjectPtr& aFolder = folder(aRefs->Value(a)); if (aFolder.get()) { // store folder information for the Features group only if (isFeature || isFolder) { @@ -535,11 +534,12 @@ void Model_Objects::updateHistory(const std::string theGroup) } } -ObjectPtr Model_Objects::folder(TDF_Label theLabel) const +const ObjectPtr& Model_Objects::folder(TDF_Label theLabel) const { if (myFolders.IsBound(theLabel)) return myFolders.Find(theLabel); - return ObjectPtr(); + static ObjectPtr anEmptyResult; + return anEmptyResult; } FeaturePtr Model_Objects::feature(TDF_Label theLabel) const @@ -555,41 +555,54 @@ ObjectPtr Model_Objects::object(TDF_Label theLabel) FeaturePtr aFeature = feature(theLabel); if (aFeature.get()) return feature(theLabel); - TDF_Label aFeatureLabel = theLabel.Father().Father(); // let's suppose it is result - aFeature = feature(aFeatureLabel); - bool isSubResult = false; - if (!aFeature.get() && aFeatureLabel.Depth() > 1) { // let's suppose this is sub-result of result + TDF_Label aFeatureLabel = theLabel; // let's suppose it is result of this feature + TDF_LabelList aSubLabs; // sub - labels from higher level to lower level of result + while(!aFeature.get() && aFeatureLabel.Depth() > 1) { + aSubLabs.Prepend(aFeatureLabel); aFeatureLabel = aFeatureLabel.Father().Father(); aFeature = feature(aFeatureLabel); - isSubResult = true; } if (aFeature.get()) { - const std::list >& aResults = aFeature->results(); - std::list >::const_iterator aRIter = aResults.cbegin(); - for (; aRIter != aResults.cend(); aRIter++) { - if (isSubResult) { - ResultCompSolidPtr aCompRes = std::dynamic_pointer_cast(*aRIter); - if (aCompRes.get()) { - int aNumSubs = aCompRes->numberOfSubs(); - for(int a = 0; a < aNumSubs; a++) { - ResultPtr aSub = aCompRes->subResult(a); - if (aSub.get()) { - std::shared_ptr aSubData = std::dynamic_pointer_cast( - aSub->data()); - if (aSubData->label().Father().IsEqual(theLabel)) - return aSub; + ResultPtr aCurrentResult; + // searching for results then sub-results label by label + for(TDF_ListIteratorOfLabelList aSubLab(aSubLabs); aSubLab.More(); aSubLab.Next()) { + if (aCurrentResult.get()) { // iterate sub-results of result + ResultBodyPtr anOwner = std::dynamic_pointer_cast(aCurrentResult); + if (!anOwner) + return ObjectPtr(); // only Body can have sub-results + int a, aNumSubs = anOwner->numberOfSubs(); + for(a = 0; a < aNumSubs; a++) { + ResultPtr aSub = anOwner->subResult(a); + if (aSub.get()) { + std::shared_ptr aSubData = std::dynamic_pointer_cast( + aSub->data()); + const TDF_Label& aSubLabVal = aSubLab.ChangeValue(); + if (aSubData->label().Father().IsEqual(aSubLabVal)) { + aCurrentResult = aSub; + break; } } } - } else { - std::shared_ptr aResData = std::dynamic_pointer_cast( - (*aRIter)->data()); - if (aResData->label().Father().IsEqual(theLabel)) - return *aRIter; + if (a == aNumSubs) // not found an appropriate sub-result of result + return ObjectPtr(); + } else { // iterate results of feature + const std::list& aResults = aFeature->results(); + std::list >::const_iterator aRIter = aResults.cbegin(); + for(; aRIter != aResults.cend(); aRIter++) { + std::shared_ptr aResData = + std::dynamic_pointer_cast((*aRIter)->data()); + if (aResData->label().Father().IsEqual(aSubLab.ChangeValue())) { + aCurrentResult = *aRIter; + break; + } + } + if (aRIter == aResults.cend()) // not found an appropriate result of feature + return ObjectPtr(); } } + return aCurrentResult; } - return FeaturePtr(); // not found + return ObjectPtr(); // not found } ObjectPtr Model_Objects::object(const std::string& theGroupID, @@ -621,24 +634,12 @@ std::shared_ptr Model_Objects::objectByName( std::list > allObjs = allFeatures(); std::list >::iterator anObjIter = allObjs.begin(); for(; anObjIter != allObjs.end(); anObjIter++) { - const std::list >& aResults = (*anObjIter)->results(); - std::list >::const_iterator aRIter = aResults.cbegin(); - for (; aRIter != aResults.cend(); aRIter++) { - if (aRIter->get() && (*aRIter)->groupName() == theGroupID) { - if ((*aRIter)->data()->name() == theName) - return *aRIter; - ResultCompSolidPtr aCompRes = - std::dynamic_pointer_cast(*aRIter); - if (aCompRes.get()) { - int aNumSubs = aCompRes->numberOfSubs(); - for(int a = 0; a < aNumSubs; a++) { - ResultPtr aSub = aCompRes->subResult(a); - if (aSub.get() && aSub->groupName() == theGroupID) { - if (aSub->data()->name() == theName) - return aSub; - } - } - } + std::list allRes; + ModelAPI_Tools::allResults(*anObjIter, allRes); + for(std::list::iterator aRes = allRes.begin(); aRes != allRes.end(); aRes++) { + if (aRes->get() && (*aRes)->groupName() == theGroupID) { + if ((*aRes)->data()->name() == theName) + return *aRes; } } } @@ -677,6 +678,21 @@ int Model_Objects::size(const std::string& theGroupID, const bool theAllowFolder return aGroupID.empty() ? int(myHistory[theGroupID].size()) : int(myHistory[aGroupID].size()); } +std::shared_ptr Model_Objects::parent( + const std::shared_ptr theChild) +{ + if (theChild.get()) { + std::shared_ptr aData = std::dynamic_pointer_cast(theChild->data()); + TDF_Label aLab = aData->label(); + if (!aLab.IsNull() && aLab.Depth() > 2) { + ObjectPtr anObj = object(aLab.Father().Father().Father()); + return anObj; + } + } + return ObjectPtr(); +} + + void Model_Objects::allResults(const std::string& theGroupID, std::list& theResults) { // iterate the array of references and get feature by feature from the array @@ -1165,10 +1181,10 @@ bool Model_Objects::hasCustomName(DataPtr theFeatureData, int theResultIndex, std::string& theParentName) const { - ResultCompSolidPtr aCompSolidRes = - std::dynamic_pointer_cast(theFeatureData->owner()); - if (aCompSolidRes) { - FeaturePtr anOwner = ModelAPI_Feature::feature(theResult->data()->owner()); + ResultBodyPtr aBodyRes = std::dynamic_pointer_cast(theFeatureData->owner()); + if (aBodyRes && std::dynamic_pointer_cast(theFeatureData)->label().Depth() < 7) { + // only for top-results (works for the cases when results are not yet added to the feature) + FeaturePtr anOwner = ModelAPI_Feature::feature(theResult); // names of sub-solids in CompSolid should be default (for example, // result of boolean operation 'Boolean_1' is a CompSolid which is renamed to 'MyBOOL', @@ -1176,18 +1192,18 @@ bool Model_Objects::hasCustomName(DataPtr theFeatureData, std::ostringstream aDefaultName; aDefaultName << anOwner->name(); // compute default name of CompSolid (name of feature + index of CompSolid's result) - int aCompSolidResultIndex = 0; + int aBodyResultIndex = 0; const std::list& aResults = anOwner->results(); - for (std::list::const_iterator anIt = aResults.begin(); - anIt != aResults.end(); ++anIt, ++aCompSolidResultIndex) - if (aCompSolidRes == *anIt) + std::list::const_iterator anIt = aResults.begin(); + for(; anIt != aResults.end(); ++anIt, ++aBodyResultIndex) + if(aBodyRes == *anIt) break; - aDefaultName << "_" << (aCompSolidResultIndex + 1); + aDefaultName << "_" << (aBodyResultIndex + 1); theParentName = aDefaultName.str(); return false; } - std::pair aName = ModelAPI_Tools::getDefaultName(theResult, theResultIndex); + std::pair aName = ModelAPI_Tools::getDefaultName(theResult); if (aName.second) theParentName = aName.first; return aName.second; @@ -1241,27 +1257,14 @@ std::shared_ptr Model_Objects::createBody( const std::shared_ptr& theFeatureData, const int theIndex) { TDF_Label aLab = resultLabel(theFeatureData, theIndex); - // for feature create compsolid, but for result sub create body: - // only one level of recursion is supported now - ResultPtr aResultOwner = std::dynamic_pointer_cast(theFeatureData->owner()); - ObjectPtr anOldObject; - if (aResultOwner.get()) { - TDataStd_Comment::Set(aLab, ModelAPI_ResultBody::group().c_str()); - } else { // in compsolid (higher level result) old object probably may be found - TDataStd_Comment::Set(aLab, ModelAPI_ResultCompSolid::group().c_str()); - anOldObject = object(aLab); - } + TDataStd_Comment::Set(aLab, ModelAPI_ResultBody::group().c_str()); + ObjectPtr anOldObject = object(aLab); std::shared_ptr aResult; if (anOldObject.get()) { aResult = std::dynamic_pointer_cast(anOldObject); } if (!aResult.get()) { - // create compsolid anyway; if it is compsolid, it will create sub-bodies internally - if (aResultOwner.get()) { - aResult = std::shared_ptr(new Model_ResultBody); - } else { - aResult = std::shared_ptr(new Model_ResultCompSolid); - } + aResult = std::shared_ptr(new Model_ResultBody); storeResult(theFeatureData, aResult, theIndex); } return aResult; @@ -1483,8 +1486,9 @@ std::shared_ptr Model_Objects::findFolder( continue; } - aFoundFolder = std::dynamic_pointer_cast(folder(aCurLabel)); - if (aFoundFolder) { + const ObjectPtr& aFolderObj = folder(aCurLabel); + if (aFolderObj.get()) { + aFoundFolder = std::dynamic_pointer_cast(aFolderObj); AttributeReferencePtr aLastFeatAttr = aFoundFolder->reference(ModelAPI_Folder::LAST_FEATURE_ID()); if (aLastFeatAttr) { @@ -1732,19 +1736,31 @@ FolderPtr Model_Objects::findContainingFolder(const FeaturePtr& theFeature, int& for (int aRefIndex = aRefs->Lower(); aRefIndex <= aRefs->Upper(); ++aRefIndex) { TDF_Label aCurLabel = aRefs->Value(aRefIndex); - if (isSkippedFeature(feature(aCurLabel))) - continue; if (aFoundFolder) ++theIndexInFolder; - if (aCurLabel == aLabelToFind) // the feature is reached + if (aCurLabel == aLabelToFind) { // the feature is reached + if (aFoundFolder) { + if (isSkippedFeature(theFeature)) { + theIndexInFolder = -1; + return FolderPtr(); + } + // decrease the index of the feature in the folder by the number of skipped features + for (int anIndex = theIndexInFolder - 1; anIndex > 0; anIndex--) { + aCurLabel = aRefs->Value(aRefIndex - anIndex); + if (isSkippedFeature(feature(aCurLabel))) + theIndexInFolder--; + } + } return aFoundFolder; + } if (!aFoundFolder) { // if the current label refers to a folder, feel all necessary data - aFoundFolder = std::dynamic_pointer_cast(folder(aCurLabel)); - if (aFoundFolder) { + const ObjectPtr& aFolderObj = folder(aCurLabel); + if (aFolderObj.get()) { + aFoundFolder = std::dynamic_pointer_cast(aFolderObj); theIndexInFolder = -1; AttributeReferencePtr aLastRef = @@ -1776,7 +1792,7 @@ std::shared_ptr Model_Objects::feature( if (aData.get()) { TDF_Label aFeatureLab = aData->label().Father().Father().Father(); FeaturePtr aFeature = feature(aFeatureLab); - if (!aFeature.get() && aFeatureLab.Depth() > 1) { // this may be sub-result of result + while(!aFeature.get() && aFeatureLab.Depth() > 1) { // this may be sub-result of result aFeatureLab = aFeatureLab.Father().Father(); aFeature = feature(aFeatureLab); } @@ -1849,8 +1865,7 @@ void Model_Objects::updateResults(FeaturePtr theFeature, std::set& t TDF_Label anArgLab = aLabIter.Value(); Handle(TDataStd_Comment) aGroup; if (anArgLab.FindAttribute(TDataStd_Comment::GetID(), aGroup)) { - if (aGroup->Get() == ModelAPI_ResultBody::group().c_str() || - aGroup->Get() == ModelAPI_ResultCompSolid::group().c_str()) { + if (aGroup->Get() == ModelAPI_ResultBody::group().c_str()) { aNewBody = createBody(theFeature->data(), aResIndex); } else if (aGroup->Get() == ModelAPI_ResultPart::group().c_str()) { std::shared_ptr aNewP = createPart(theFeature->data(), aResIndex); @@ -1876,6 +1891,15 @@ void Model_Objects::updateResults(FeaturePtr theFeature, std::set& t } } } + if (aResSize > 0) { // check there exist a body that must be updated + std::list::const_iterator aRes = theFeature->results().cbegin(); + for (; aResSize && aRes != theFeature->results().cend(); aRes++, aResSize++) { + if ((*aRes)->data()->isValid() && (*aRes)->groupName() == ModelAPI_ResultBody::group()) { + ResultBodyPtr aBody = std::dynamic_pointer_cast(*aRes); + aBody->updateSubs(aBody->shape()); + } + } + } } ResultPtr Model_Objects::findByName(const std::string theName) @@ -1954,6 +1978,11 @@ FeaturePtr Model_Objects::lastFeature() { Handle(TDataStd_ReferenceArray) aRefs; if (featuresLabel().FindAttribute(TDataStd_ReferenceArray::GetID(), aRefs)) { + FeaturePtr aLast = feature(aRefs->Value(aRefs->Upper())); + if (!aLast.get() && aRefs->Length() != 0) { // erase the invalid feature from the array + RemoveFromRefArray(featuresLabel(), aRefs->Value(aRefs->Upper())); + return lastFeature(); // try once again, after the last was removed + } return feature(aRefs->Value(aRefs->Upper())); } return FeaturePtr(); // no features at all