+std::set<FeaturePtr> getParents(const FeaturePtr& theFeature)
+{
+ std::set<FeaturePtr> aParents;
+ for (FeaturePtr aCurFeat = theFeature; aCurFeat; ) {
+ CompositeFeaturePtr aFoundComposite;
+ const std::set<AttributePtr>& aRefs = aCurFeat->data()->refsToMe();
+ for (std::set<AttributePtr>::const_iterator anIt = aRefs.begin();
+ anIt != aRefs.end(); ++anIt) {
+ FeaturePtr aF = ModelAPI_Feature::feature((*anIt)->owner());
+ aFoundComposite = std::dynamic_pointer_cast<ModelAPI_CompositeFeature>(aF);
+ if (aFoundComposite && aFoundComposite->isSub(aCurFeat))
+ break;
+ else
+ aFoundComposite = CompositeFeaturePtr();
+ }
+
+ if (aFoundComposite) {
+ aParents.insert(aFoundComposite);
+ aCurFeat = aFoundComposite;
+ }
+ else {
+ // add the part containing high-level feature
+ SessionPtr aSession = ModelAPI_Session::get();
+ DocumentPtr aPartSetDoc = aSession->moduleDocument();
+ std::list<FeaturePtr> aPartSetFeatures = aPartSetDoc->allFeatures();
+ for (std::list<FeaturePtr>::const_iterator anIt = aPartSetFeatures.begin();
+ anIt != aPartSetFeatures.end(); ++anIt) {
+ aFoundComposite = std::dynamic_pointer_cast<ModelAPI_CompositeFeature>(*anIt);
+ if (aFoundComposite && aFoundComposite->isSub(aCurFeat)) {
+ aParents.insert(aFoundComposite);
+ break;
+ }
+ }
+
+ aCurFeat = FeaturePtr();
+ }
+ }
+ return aParents;
+}
+
+void removeResults(const std::list<ResultPtr>& theResults)
+{
+ // collect all documents where the results must be removed
+ std::map<DocumentPtr, std::list<ResultPtr> > aDocs;
+
+ std::list<ResultPtr>::const_iterator aResIter = theResults.cbegin();
+ for(; aResIter != theResults.cend(); aResIter++) {
+ DocumentPtr aDoc = (*aResIter)->document();
+ if (!aDocs.count(aDoc))
+ aDocs[aDoc] = std::list<ResultPtr>();
+ aDocs[aDoc].push_back(*aResIter);
+ }
+ // create a "remove" feature in each doc
+ std::map<DocumentPtr, std::list<ResultPtr> >::iterator aDoc = aDocs.begin();
+ for(; aDoc != aDocs.end(); aDoc++) {
+ FeaturePtr aRemove = aDoc->first->addFeature("RemoveResults");
+ if (aRemove) {
+ for(aResIter = aDoc->second.cbegin(); aResIter != aDoc->second.cend(); aResIter++)
+ aRemove->selectionList("results")->append(*aResIter, GeomShapePtr());
+ }
+ }
+}
+