} 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) {
}
}
-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
continue;
}
- aFoundFolder = std::dynamic_pointer_cast<ModelAPI_Folder>(folder(aCurLabel));
- if (aFoundFolder) {
+ const ObjectPtr& aFolderObj = folder(aCurLabel);
+ if (aFolderObj.get()) {
+ aFoundFolder = std::dynamic_pointer_cast<ModelAPI_Folder>(aFolderObj);
AttributeReferencePtr aLastFeatAttr =
aFoundFolder->reference(ModelAPI_Folder::LAST_FEATURE_ID());
if (aLastFeatAttr) {
if (aFoundFolder) {
if (isSkippedFeature(theFeature)) {
theIndexInFolder = -1;
- return false;
+ 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--) {
if (!aFoundFolder) {
// if the current label refers to a folder, feel all necessary data
- aFoundFolder = std::dynamic_pointer_cast<ModelAPI_Folder>(folder(aCurLabel));
- if (aFoundFolder) {
+ const ObjectPtr& aFolderObj = folder(aCurLabel);
+ if (aFolderObj.get()) {
+ aFoundFolder = std::dynamic_pointer_cast<ModelAPI_Folder>(aFolderObj);
theIndexInFolder = -1;
AttributeReferencePtr aLastRef =
{
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