+std::shared_ptr<ModelAPI_Feature> SketchPlugin_Sketch::addFeature(std::string theID)
+{
+ std::shared_ptr<ModelAPI_Feature> aNew = document()->addFeature(theID);
+ if (aNew) {
+ std::dynamic_pointer_cast<SketchPlugin_Feature>(aNew)->setSketch(this);
+ data()->reflist(SketchPlugin_Sketch::FEATURES_ID())->append(aNew);
+ }
+ return aNew;
+}
+
+void SketchPlugin_Sketch::removeFeature(std::shared_ptr<ModelAPI_Feature> theFeature)
+{
+ if (!data().get()) // sketch is already removed (case on undo of sketch), sync is not needed
+ return;
+ list<ObjectPtr> aSubs = data()->reflist(SketchPlugin_Sketch::FEATURES_ID())->list();
+ list<ObjectPtr>::iterator aSubIt = aSubs.begin(), aLastIt = aSubs.end();
+ bool isRemoved = false;
+ bool aHasEmtpyFeature = false;
+ for(; aSubIt != aLastIt && !isRemoved; aSubIt++) {
+ std::shared_ptr<ModelAPI_Feature> aFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(*aSubIt);
+ if (aFeature.get() != NULL && aFeature == theFeature) {
+ data()->reflist(SketchPlugin_Sketch::FEATURES_ID())->remove(aFeature);
+ isRemoved = true;
+ }
+ else if (aFeature.get() == NULL)
+ aHasEmtpyFeature = true;
+ }
+ // if the object is not found in the sketch sub-elements, that means that the object is removed already.
+ // Find the first empty element and remove it
+ if (!isRemoved && aHasEmtpyFeature)
+ data()->reflist(SketchPlugin_Sketch::FEATURES_ID())->remove(ObjectPtr());
+}
+
+int SketchPlugin_Sketch::numberOfSubs() const
+{
+ return data()->reflist(SketchPlugin_Sketch::FEATURES_ID())->size();
+}
+
+std::shared_ptr<ModelAPI_Feature> SketchPlugin_Sketch::subFeature(const int theIndex) const