]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Added history of features and removed Iterator (size and feature by index must be...
authormpv <mikhail.ponikarov@opencascade.com>
Thu, 8 May 2014 04:51:37 +0000 (08:51 +0400)
committermpv <mikhail.ponikarov@opencascade.com>
Thu, 8 May 2014 04:51:37 +0000 (08:51 +0400)
28 files changed:
src/GeomAPI/CMakeLists.txt
src/GeomAPI/GeomAPI_Dir.cpp
src/GeomAPI/GeomAPI_Dir.h
src/GeomAPI/GeomAPI_Pnt.cpp
src/GeomAPI/GeomAPI_Pnt.h
src/GeomAPI/GeomAPI_XYZ.cpp [new file with mode: 0644]
src/GeomAPI/GeomAPI_XYZ.h [new file with mode: 0644]
src/GeomData/GeomData_Dir.h
src/GeomData/GeomData_Point.cpp
src/GeomData/GeomData_Point.h
src/GeomDataAPI/GeomDataAPI_Dir.h
src/GeomDataAPI/GeomDataAPI_Point.h
src/Model/CMakeLists.txt
src/Model/Model_Data.h
src/Model/Model_Document.cpp
src/Model/Model_Document.h
src/Model/Model_Iterator.cpp [deleted file]
src/Model/Model_Iterator.h [deleted file]
src/ModelAPI/CMakeLists.txt
src/ModelAPI/ModelAPI.i
src/ModelAPI/ModelAPI_Attribute.h
src/ModelAPI/ModelAPI_Document.h
src/ModelAPI/ModelAPI_Iterator.h [deleted file]
src/ModelAPI/ModelAPI_PluginManager.cpp
src/PartSetPlugin/PartSetPlugin_Part.cpp
src/SketchPlugin/SketchPlugin_Sketch.cpp
src/XGUI/XGUI_DocumentDataModel.cpp
src/XGUI/XGUI_PartDataModel.cpp

index c0c67230e5acef38e77d47571e39a9bc30fc9527..142a02bb44b1fd336663c5fb9bd773481d7b6cb4 100644 (file)
@@ -7,6 +7,7 @@ INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
 SET(PROJECT_HEADERS
     GeomAPI.h
     GeomAPI_Interface.h
+    GeomAPI_XYZ.h
     GeomAPI_Pnt.h
     GeomAPI_Dir.h
     GeomAPI_Pln.h
@@ -15,6 +16,7 @@ SET(PROJECT_HEADERS
 
 SET(PROJECT_SOURCES
     GeomAPI_Interface.cpp
+    GeomAPI_XYZ.cpp
     GeomAPI_Pnt.cpp
     GeomAPI_Dir.cpp
     GeomAPI_Pln.cpp
index bf0941c31c09618517492ff3bef9e72ec96cc58d..6e8ea2429f790687cc5047a80efe94f2742e310a 100644 (file)
@@ -2,9 +2,10 @@
 // Created:     23 Apr 2014
 // Author:      Mikhail PONIKAROV
 
-#include<GeomAPI_Dir.h>
+#include <GeomAPI_Dir.h>
+#include <GeomAPI_XYZ.h>
 
-#include<gp_Dir.hxx>
+#include <gp_Dir.hxx>
 
 #define MY_DIR static_cast<gp_Pnt*>(myImpl)
 
@@ -26,3 +27,8 @@ double GeomAPI_Dir::z() const
 {
   return MY_DIR->Z();
 }
+
+const boost::shared_ptr<GeomAPI_XYZ> GeomAPI_Dir::xyz() 
+{
+  return boost::shared_ptr<GeomAPI_XYZ>(new GeomAPI_XYZ(MY_DIR->X(), MY_DIR->Y(), MY_DIR->Z()));
+}
index 7993a3d77d030e3adc6701457e36b686758d2b31..afdab1c090ccb2e7bbce10e42e98ff26bf4d4898 100644 (file)
@@ -6,6 +6,9 @@
 #define GeomAPI_Dir_HeaderFile
 
 #include <GeomAPI_Interface.h>
+#include <boost/shared_ptr.hpp>
+
+class GeomAPI_XYZ;
 
 /**\class GeomAPI_Dir
  * \ingroup DataModel
@@ -25,6 +28,8 @@ public:
   /// returns Z coordinate
   double z() const;
 
+  /// returns coordinates of the direction
+  const boost::shared_ptr<GeomAPI_XYZ> xyz();
 };
 
 #endif
index 6414a2dc35865a1af49ae8baec9f555b11a3ef31..83d1dddf9adad8bc90bbff2829df19c80238f8e3 100644 (file)
@@ -3,6 +3,7 @@
 // Author:      Mikhail PONIKAROV
 
 #include<GeomAPI_Pnt.h>
+#include<GeomAPI_XYZ.h>
 
 #include<gp_Pnt.hxx>
 
@@ -12,6 +13,10 @@ GeomAPI_Pnt::GeomAPI_Pnt(const double theX, const double theY, const double theZ
   : GeomAPI_Interface(new gp_Pnt(theX, theY, theZ))
 {}
 
+GeomAPI_Pnt::GeomAPI_Pnt(const boost::shared_ptr<GeomAPI_XYZ>& theCoords)
+  : GeomAPI_Interface(new gp_Pnt(theCoords->x(), theCoords->y(), theCoords->z()))
+{}
+
 double GeomAPI_Pnt::x() const
 {
   return MY_PNT->X();
@@ -41,3 +46,8 @@ void GeomAPI_Pnt::setZ(const double theZ)
 {
   return MY_PNT->SetZ(theZ);
 }
+
+const boost::shared_ptr<GeomAPI_XYZ> GeomAPI_Pnt::xyz() 
+{
+  return boost::shared_ptr<GeomAPI_XYZ>(new GeomAPI_XYZ(MY_PNT->X(), MY_PNT->Y(), MY_PNT->Z()));
+}
index 8f80bef18628e78d60994c2bc8b313ed7b77f061..a63974d98c597c088c4e98037a3a0d1d19e57989 100644 (file)
@@ -6,6 +6,9 @@
 #define GeomAPI_Pnt_HeaderFile
 
 #include <GeomAPI_Interface.h>
+#include <boost/shared_ptr.hpp>
+
+class GeomAPI_XYZ;
 
 /**\class GeomAPI_Pnt
  * \ingroup DataModel
@@ -17,6 +20,8 @@ class GEOMAPI_EXPORT GeomAPI_Pnt: public GeomAPI_Interface
 public:
   /// Creation of point by coordinates
   GeomAPI_Pnt(const double theX, const double theY, const double theZ);
+  /// Creation of point by coordinates
+  GeomAPI_Pnt(const boost::shared_ptr<GeomAPI_XYZ>& theCoords);
 
   /// returns X coordinate
   double x() const;
@@ -31,6 +36,9 @@ public:
   void setY(const double theY);
   /// sets Z coordinate
   void setZ(const double theZ);
+
+  /// returns coordinates of the point
+  const boost::shared_ptr<GeomAPI_XYZ> xyz();
 };
 
 #endif
diff --git a/src/GeomAPI/GeomAPI_XYZ.cpp b/src/GeomAPI/GeomAPI_XYZ.cpp
new file mode 100644 (file)
index 0000000..30c2463
--- /dev/null
@@ -0,0 +1,58 @@
+// File:        GeomAPI_XYZ.cpp
+// Created:     23 Apr 2014
+// Author:      Mikhail PONIKAROV
+
+#include<GeomAPI_XYZ.h>
+
+#include<gp_XYZ.hxx>
+
+#define MY_XYZ static_cast<gp_XYZ*>(myImpl)
+
+GeomAPI_XYZ::GeomAPI_XYZ(const double theX, const double theY, const double theZ)
+  : GeomAPI_Interface(new gp_XYZ(theX, theY, theZ))
+{}
+
+double GeomAPI_XYZ::x() const
+{
+  return MY_XYZ->X();
+}
+
+double GeomAPI_XYZ::y() const
+{
+  return MY_XYZ->Y();
+}
+
+double GeomAPI_XYZ::z() const
+{
+  return MY_XYZ->Z();
+}
+
+void GeomAPI_XYZ::setX(const double theX)
+{
+  return MY_XYZ->SetX(theX);
+}
+
+void GeomAPI_XYZ::setY(const double theY)
+{
+  return MY_XYZ->SetY(theY);
+}
+
+void GeomAPI_XYZ::setZ(const double theZ)
+{
+  return MY_XYZ->SetZ(theZ);
+}
+
+const boost::shared_ptr<GeomAPI_XYZ> GeomAPI_XYZ::added(
+  const boost::shared_ptr<GeomAPI_XYZ>& theArg)
+{
+  boost::shared_ptr<GeomAPI_XYZ> aResult(new GeomAPI_XYZ(MY_XYZ->X() + theArg->x(),
+    MY_XYZ->Y() + theArg->y(), MY_XYZ->Z() + theArg->z()));
+  return aResult;
+}
+
+const boost::shared_ptr<GeomAPI_XYZ> GeomAPI_XYZ::multiplied(const double theArg)
+{
+  boost::shared_ptr<GeomAPI_XYZ> aResult(new GeomAPI_XYZ(MY_XYZ->X() * theArg,
+    MY_XYZ->Y() * theArg, MY_XYZ->Z() * theArg));
+  return aResult;
+}
diff --git a/src/GeomAPI/GeomAPI_XYZ.h b/src/GeomAPI/GeomAPI_XYZ.h
new file mode 100644 (file)
index 0000000..6042428
--- /dev/null
@@ -0,0 +1,43 @@
+// File:        GeomAPI_XYZ.hxx
+// Created:     23 Apr 2014
+// Author:      Mikhail PONIKAROV
+
+#ifndef GeomAPI_XYZ_HeaderFile
+#define GeomAPI_XYZ_HeaderFile
+
+#include <GeomAPI_Interface.h>
+#include <boost/shared_ptr.hpp>
+
+/**\class GeomAPI_XYZ
+ * \ingroup DataModel
+ * \brief 3 coordinates: they may represent vector or point or something else
+ */
+
+class GEOMAPI_EXPORT GeomAPI_XYZ: public GeomAPI_Interface
+{
+public:
+  /// Creation by coordinates
+  GeomAPI_XYZ(const double theX, const double theY, const double theZ);
+
+  /// returns X coordinate
+  double x() const;
+  /// returns Y coordinate
+  double y() const;
+  /// returns Z coordinate
+  double z() const;
+
+  /// sets X coordinate
+  void setX(const double theX);
+  /// sets Y coordinate
+  void setY(const double theY);
+  /// sets Z coordinate
+  void setZ(const double theZ);
+
+  /// result is sum of coordinates of this and the given argument
+  const boost::shared_ptr<GeomAPI_XYZ> added(const boost::shared_ptr<GeomAPI_XYZ>& theArg);
+  /// result is coordinates multiplied by the argument
+  const boost::shared_ptr<GeomAPI_XYZ> multiplied(const double theArg);
+};
+
+#endif
+
index 56a8b9d2ac80db8fac7a821493c9332bc7ddd1e1..a7c1a2497363120d9a90bbba4820f844910f60ea 100644 (file)
@@ -31,7 +31,7 @@ public:
   /// Returns the Z double value
   GEOMDATA_EXPORT virtual double z() const;
   /// Returns the direction of this attribute
-  GEOMDATA_EXPORT boost::shared_ptr<GeomAPI_Dir> dir();
+  GEOMDATA_EXPORT virtual boost::shared_ptr<GeomAPI_Dir> dir();
 
 protected:
   /// Initializes attributes
index b928f36958adc8fe426919943d80bfa854ce6dc6..faf24fe99faf49a69c14d9afd7ce7526013d60af 100644 (file)
@@ -5,6 +5,7 @@
 #include "GeomData_Point.h"
 #include "Model_Events.h"
 #include <Events_Loop.h>
+#include <GeomAPI_Pnt.h>
 
 using namespace std;
 
@@ -35,6 +36,13 @@ double GeomData_Point::z() const
   return myCoords->Value(2);
 }
 
+boost::shared_ptr<GeomAPI_Pnt> GeomData_Point::pnt()
+{
+  boost::shared_ptr<GeomAPI_Pnt> aResult(new GeomAPI_Pnt(
+    myCoords->Value(0), myCoords->Value(1), myCoords->Value(2)));
+  return aResult;
+}
+
 GeomData_Point::GeomData_Point(TDF_Label& theLabel)
 {
   // check the attribute could be already presented in this doc (after load document)
index 9886333c2fb63e5ac219a1d12a2b5b5e3a836c57..ee319e89e53ad505005fac78e7eed5cd396af140 100644 (file)
@@ -28,6 +28,8 @@ public:
   GEOMDATA_EXPORT virtual double y() const;
   /// Returns the Z double value
   GEOMDATA_EXPORT virtual double z() const;
+  /// Returns the 3D point
+  GEOMDATA_EXPORT virtual boost::shared_ptr<GeomAPI_Pnt> pnt();
 
 protected:
   /// Initializes attributes
index 92018306c90f6e77fab041541d2c01d46956e59e..dbe8ef5e26f0a2c5d6f3d1e4d1648e1c0c4d2c96 100644 (file)
@@ -8,6 +8,8 @@
 #include "GeomDataAPI.h"
 #include <ModelAPI_Attribute.h>
 
+class GeomAPI_Dir;
+
 /**\class GeomDataAPI_Dir
  * \ingroup DataModel
  * \brief Attribute that contains 3D direction coordinates. 
@@ -25,6 +27,8 @@ public:
   virtual double y() const = 0;
   /// Returns the Z double value
   virtual double z() const = 0;
+  /// Returns the direction of this attribute
+  virtual boost::shared_ptr<GeomAPI_Dir> dir() = 0;
 
   /// Returns the type of this class of attributes
   static inline std::string type() {return std::string("Dir");}
index 68f294e60fc8a9d4e967690d3fd917461e7b9828..c9581b2bea7fd6ff38aecada82a7cf5cbeff58a8 100644 (file)
@@ -8,6 +8,8 @@
 #include "GeomDataAPI.h"
 #include <ModelAPI_Attribute.h>
 
+class GeomAPI_Pnt;
+
 /**\class GeomDataAPI_Point
  * \ingroup DataModel
  * \brief Attribute that contains 3D point coordinates. 
@@ -25,6 +27,8 @@ public:
   virtual double y() const = 0;
   /// Returns the Z double value
   virtual double z() const = 0;
+  /// Returns the 3D point
+  virtual boost::shared_ptr<GeomAPI_Pnt> pnt() = 0;
 
   /// Returns the type of this class of attributes
   static inline std::string type() {return std::string("Point");}
index 7b60ee48c26499f706c4a4876d1630aea4ceac53..ea081fac16f7e95623a5c452d05fe66ae6271f75 100644 (file)
@@ -7,7 +7,6 @@ SET(PROJECT_HEADERS
     Model_Document.h
     Model_PluginManager.h
     Model_Data.h
-    Model_Iterator.h
     Model_AttributeDouble.h
     Model_AttributeDocRef.h
     Model_Events.h
@@ -18,7 +17,6 @@ SET(PROJECT_SOURCES
     Model_Document.cpp
     Model_PluginManager.cpp
     Model_Data.cpp
-    Model_Iterator.cpp
     Model_AttributeDouble.cpp
     Model_AttributeDocRef.cpp
     Model_Events.cpp
index 1548c709e4f96eafb45d9ac5c3255c716f04a330..0cb633666de769388f272733148f6962dd47afed 100644 (file)
@@ -34,7 +34,6 @@ class Model_Data: public ModelAPI_Data
   TDF_Label label() {return myLab;}
 
   friend class Model_Document;
-  friend class Model_Iterator;
 
 public:
   /// Returns the name of the feature visible by the user in the object browser
index 304bef421dd7a3fca954e164ea484e4607b50c4e..790bab22f57b39a7f07e6ecd5c92c2641d90926d 100644 (file)
@@ -7,21 +7,22 @@
 #include <Model_Data.h>
 #include <Model_Application.h>
 #include <Model_PluginManager.h>
-#include <Model_Iterator.h>
 #include <Model_Events.h>
 #include <Events_Loop.h>
 
 #include <TDataStd_Integer.hxx>
 #include <TDataStd_Comment.hxx>
 #include <TDF_ChildIDIterator.hxx>
+#include <TDataStd_ReferenceArray.hxx>
+#include <TDataStd_HLabelArray1.hxx>
 
 #include <climits>
 
 static const int UNDO_LIMIT = 10; // number of possible undo operations
 
 static const int TAG_GENERAL = 1; // general properties tag
-static const int TAG_OBJECTS = 2; // tag of the objects sub-tree (Root for Model_DatasMgr)
-static const int TAG_HISTORY = 3; // tag of the history sub-tree (Root for Model_History)
+static const int TAG_OBJECTS = 2; // tag of the objects sub-tree (features)
+static const int TAG_HISTORY = 3; // tag of the history sub-tree (python dump)
 
 using namespace std;
 
@@ -208,7 +209,8 @@ void Model_Document::redo()
 
 boost::shared_ptr<ModelAPI_Feature> Model_Document::addFeature(string theID)
 {
-  boost::shared_ptr<ModelAPI_Feature> aFeature = ModelAPI_PluginManager::get()->createFeature(theID);
+  boost::shared_ptr<ModelAPI_Feature> aFeature = 
+    ModelAPI_PluginManager::get()->createFeature(theID);
   if (aFeature) {
     boost::dynamic_pointer_cast<Model_Document>(aFeature->documentToAdd())->addFeature(aFeature);
   } else {
@@ -225,7 +227,8 @@ void Model_Document::addFeature(const boost::shared_ptr<ModelAPI_Feature> theFea
   boost::shared_ptr<Model_Data> aData(new Model_Data);
   aData->setFeature(theFeature);
   aData->setLabel(anObjLab);
-  boost::shared_ptr<ModelAPI_Document> aThis = Model_Application::getApplication()->getDocument(myID);
+  boost::shared_ptr<ModelAPI_Document> aThis = 
+    Model_Application::getApplication()->getDocument(myID);
   theFeature->setData(aData);
   theFeature->setDoc(aThis);
   setUniqueName(theFeature);
@@ -235,6 +238,20 @@ void Model_Document::addFeature(const boost::shared_ptr<ModelAPI_Feature> theFea
   // put index of the feature in the group in the tree
   TDataStd_Integer::Set(anObjLab, myFeatures[aGroup].size());
   myFeatures[aGroup].push_back(theFeature);
+  // store feature in the history of features array
+  Handle(TDataStd_ReferenceArray) aRefs;
+  if (!groupLabel(FEATURES_GROUP).FindAttribute(TDataStd_ReferenceArray::GetID(), aRefs)) {
+    aRefs = TDataStd_ReferenceArray::Set(groupLabel(FEATURES_GROUP), 0, 0);
+    aRefs->SetValue(0, anObjLab);
+  } else { // extend array by one more element
+    Handle(TDataStd_HLabelArray1) aNewArray = 
+      new TDataStd_HLabelArray1(aRefs->Lower(), aRefs->Upper() + 1);
+    for(int a = aRefs->Lower(); a < aRefs->Upper(); a++) {
+      aNewArray->SetValue(a, aRefs->Value(a));
+    }
+    aNewArray->SetValue(aRefs->Upper() + 1, anObjLab);
+    aRefs->SetInternalArray(aNewArray);
+  }
 
   // event: feature is added
   static Events_ID anEvent = Events_Loop::eventByName(EVENT_FEATURE_CREATED);
@@ -260,7 +277,8 @@ int Model_Document::featureIndex(boost::shared_ptr<ModelAPI_Feature> theFeature)
   if (theFeature->document().get() != this) {
     return theFeature->document()->featureIndex(theFeature);
   }
-  boost::shared_ptr<Model_Data> aData = boost::dynamic_pointer_cast<Model_Data>(theFeature->data());
+  boost::shared_ptr<Model_Data> aData =
+    boost::dynamic_pointer_cast<Model_Data>(theFeature->data());
   Handle(TDataStd_Integer) aFeatureIndex;
   if (aData->label().FindAttribute(TDataStd_Integer::GetID(), aFeatureIndex)) {
     return aFeatureIndex->Get();
@@ -276,22 +294,42 @@ boost::shared_ptr<ModelAPI_Document> Model_Document::subDocument(string theDocID
   return Model_Application::getApplication()->getDocument(theDocID);
 }
 
-boost::shared_ptr<ModelAPI_Iterator> Model_Document::featuresIterator(const string theGroup)
+boost::shared_ptr<ModelAPI_Feature> Model_Document::feature(
+  const string& theGroupID, const int theIndex)
 {
-  boost::shared_ptr<Model_Document> aThis(Model_Application::getApplication()->getDocument(myID));
-  // create an empty iterator for not existing group 
-  // (to avoidance of attributes management outside the transaction)
-  if (myGroups.find(theGroup) == myGroups.end())
-    return boost::shared_ptr<ModelAPI_Iterator>(new Model_Iterator());
-  return boost::shared_ptr<ModelAPI_Iterator>(new Model_Iterator(aThis, groupLabel(theGroup)));
+  if (theGroupID == FEATURES_GROUP) { // history is just a references array
+    Handle(TDataStd_ReferenceArray) aRefs;
+    if (groupLabel(FEATURES_GROUP).FindAttribute(TDataStd_ReferenceArray::GetID(), aRefs)) {
+      if (aRefs->Lower() <= theIndex && aRefs->Upper() >= theIndex) {
+        TDF_Label aFeatureLab = aRefs->Value(theIndex);
+        return feature(aFeatureLab);
+      }
+    }
+  } else { // one of the group
+    map<string, vector<boost::shared_ptr<ModelAPI_Feature> > >::iterator aGroup = 
+      myFeatures.find(theGroupID);
+    if (aGroup != myFeatures.end() && (int)(aGroup->second.size()) > theIndex) {
+      return aGroup->second[theIndex];
+    }
+  }
+  // not found
+  return boost::shared_ptr<ModelAPI_Feature>();
 }
 
-boost::shared_ptr<ModelAPI_Feature> Model_Document::feature(const string& theGroupID, const int theIndex)
+int Model_Document::size(const string& theGroupID) 
 {
-  // TODO: optimize this method
-  boost::shared_ptr<ModelAPI_Iterator>  anIter = featuresIterator(theGroupID);
-  for(int a = 0; a != theIndex && anIter->more(); anIter->next()) a++;
-  return anIter->more() ? anIter->current() : boost::shared_ptr<ModelAPI_Feature>();
+  if (theGroupID == FEATURES_GROUP) { // history is just a references array
+    Handle(TDataStd_ReferenceArray) aRefs;
+    if (groupLabel(FEATURES_GROUP).FindAttribute(TDataStd_ReferenceArray::GetID(), aRefs))
+      return aRefs->Length();
+  } else { // one of the group
+    map<string, vector<boost::shared_ptr<ModelAPI_Feature> > >::iterator aGroup = 
+      myFeatures.find(theGroupID);
+    if (aGroup != myFeatures.end())
+      return aGroup->second.size();
+  }
+  // group is not found
+  return 0;
 }
 
 const vector<string>& Model_Document::getGroups() const
@@ -304,11 +342,6 @@ Model_Document::Model_Document(const std::string theID)
 {
   myDoc->SetUndoLimit(UNDO_LIMIT);
   myTransactionsAfterSave = 0;
-  // to avoid creation of tag outside of the transaction (by iterator, for example)
-  /*
-  if (!myDoc->Main().FindChild(TAG_OBJECTS).IsAttribute(TDF_TagSource::GetID()))
-    TDataStd_Comment::Set(myDoc->Main().FindChild(TAG_OBJECTS).NewChild(), "");
-    */
 }
 
 TDF_Label Model_Document::groupLabel(const string theGroup)
@@ -326,10 +359,10 @@ TDF_Label Model_Document::groupLabel(const string theGroup)
 void Model_Document::setUniqueName(boost::shared_ptr<ModelAPI_Feature> theFeature)
 {
   // first count all objects of such kind to start with index = count + 1
-  int aNumObjects = 0;
-  boost::shared_ptr<ModelAPI_Iterator> anIter = featuresIterator(theFeature->getGroup());
-  for(; anIter->more(); anIter->next()) {
-    if (anIter->currentKind() == theFeature->getKind())
+  int a, aNumObjects = 0;
+  int aSize = size(theFeature->getGroup());
+  for(a = 0; a < aSize; a++) {
+    if (feature(theFeature->getGroup(), a)->getKind() == theFeature->getKind())
       aNumObjects++;
   }
   // generate candidate name
@@ -337,14 +370,14 @@ void Model_Document::setUniqueName(boost::shared_ptr<ModelAPI_Feature> theFeatur
   aNameStream<<theFeature->getKind()<<"_"<<aNumObjects + 1;
   string aName = aNameStream.str();
   // check this is unique, if not, increase index by 1
-  for(anIter = featuresIterator(theFeature->getGroup()); anIter->more();) {
-    if (anIter->currentName() == aName) {
+  for(a = 0; a < aSize;) {
+    if (feature(theFeature->getGroup(), a)->data()->getName() == aName) {
       aNumObjects++;
       stringstream aNameStream;
       aNameStream<<theFeature->getKind()<<"_"<<aNumObjects + 1;
       // reinitialize iterator to make sure a new name is unique
-      anIter = featuresIterator(theFeature->getGroup());
-    } else anIter->next();
+      a = 0;
+    } else a++;
   }
 
   theFeature->data()->setName(aName);
index f98788c5ec8c3f802a5bde4228a8350ad7712c68..0bf22b98e5b450e9dcbf1ef7771a64d82a267ba9 100644 (file)
@@ -70,16 +70,16 @@ public:
   //! Adds a new sub-document by the identifier, or returns existing one if it is already exist
   MODEL_EXPORT virtual boost::shared_ptr<ModelAPI_Document> subDocument(std::string theDocID);
 
-  //! Creates an iterator of the features by the specific groups
-  MODEL_EXPORT virtual boost::shared_ptr<ModelAPI_Iterator> featuresIterator(
-    const std::string theGroup);
-
+  ///! Returns the id of hte document
   MODEL_EXPORT virtual const std::string& id() const {return myID;}
 
   //! Returns the feature in the group by the index (started from zero)
   MODEL_EXPORT virtual boost::shared_ptr<ModelAPI_Feature> 
     feature(const std::string& theGroupID, const int theIndex);
 
+  //! Returns the number of features in the group
+  MODEL_EXPORT virtual int size(const std::string& theGroupID);
+
   ///! Returns the vector of groups already added to the document
   MODEL_EXPORT virtual const std::vector<std::string>& getGroups() const;
 
diff --git a/src/Model/Model_Iterator.cpp b/src/Model/Model_Iterator.cpp
deleted file mode 100644 (file)
index ba59cdf..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-// File:        Model_Iterator.hxx
-// Created:     1 Apr 2014
-// Author:      Mikhail PONIKAROV
-
-#include "Model_Iterator.h"
-#include "Model_Document.h"
-#include "ModelAPI_Feature.h"
-#include "Model_Data.h"
-#include <TDataStd_Comment.hxx>
-#include <TDataStd_Name.hxx>
-
-using namespace std;
-
-void Model_Iterator::next()
-{
-  return myIter.Next();
-}
-
-bool Model_Iterator::more()
-{
-  return myIter.More() == Standard_True;
-}
-
-boost::shared_ptr<ModelAPI_Feature> Model_Iterator::current()
-{
-  TDF_Label aLab = myIter.Value()->Label();
-  return myDoc->feature(aLab);
-}
-
-string Model_Iterator::currentKind()
-{
-  return string(TCollection_AsciiString(
-    Handle(TDataStd_Comment)::DownCast(myIter.Value())->Get()).ToCString());
-}
-
-string Model_Iterator::currentName()
-{
-  TDF_Label aLab = myIter.Value()->Label();
-  Handle(TDataStd_Name) aName;
-  if (aLab.FindAttribute(TDataStd_Name::GetID(), aName))
-    return string(TCollection_AsciiString(aName->Get()).ToCString());
-  return ""; // name is not found
-}
-
-int Model_Iterator::numIterationsLeft()
-{
-  int aResult = 0;
-  TDF_ChildIDIterator aTempIter(myIter);
-  for(; aTempIter.More(); aTempIter.Next())
-    aResult++;
-  return aResult;
-}
-
-bool Model_Iterator::isEqual(boost::shared_ptr<ModelAPI_Feature> theFeature)
-{
-  return (myIter.Value()->Label() == 
-    boost::dynamic_pointer_cast<Model_Data>(theFeature->data())->label()) == Standard_True;
-
-}
-
-Model_Iterator::Model_Iterator()
-{
-}
-
-Model_Iterator::Model_Iterator(boost::shared_ptr<Model_Document> theDoc, TDF_Label theLab)
-  : myDoc(theDoc), myIter(theLab, TDataStd_Comment::GetID(), Standard_False)
-{}
diff --git a/src/Model/Model_Iterator.h b/src/Model/Model_Iterator.h
deleted file mode 100644 (file)
index ff11660..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-// File:        Model_Iterator.h
-// Created:     1 Apr 2014
-// Author:      Mikhail PONIKAROV
-
-#ifndef Model_Iterator_HeaderFile
-#define Model_Iterator_HeaderFile
-
-#include "Model.h"
-#include "ModelAPI_Iterator.h"
-#include <TDF_Label.hxx>
-#include <TDF_ChildIDIterator.hxx>
-
-class Model_Document;
-
-/**\class Model_Iterator
- * \ingroup DataModel
- * \brief Allows to iterate features of the document. Is created by the document
- * (see method featuresIterator).
- */
-
-class Model_Iterator : public ModelAPI_Iterator
-{
-  boost::shared_ptr<Model_Document> myDoc; ///< the document of iterated objects
-  TDF_ChildIDIterator myIter; ///< iterator of the features-labels
-public:
-  /// Iterates to the next feature
-  MODEL_EXPORT virtual void next();
-  /// Returns true if the current iteration is valid and next iteration is possible
-  MODEL_EXPORT virtual bool more();
-  /// Returns the currently iterated feature
-  MODEL_EXPORT virtual boost::shared_ptr<ModelAPI_Feature> current();
-  /// Returns the kind of the current feature (faster than Current()->getKind())
-  MODEL_EXPORT virtual std::string currentKind();
-  /// Returns the name of the current feature (faster than Current()->getName())
-  MODEL_EXPORT virtual std::string currentName();
-  /// Don't changes the current position of iterator. Not fast: iterates the left items.
-  /// \returns number of left iterations
-  MODEL_EXPORT virtual int numIterationsLeft();
-
-  /// Compares the current feature with the given one
-  /// \returns true if given feature equals to the current one
-  MODEL_EXPORT virtual bool isEqual(boost::shared_ptr<ModelAPI_Feature> theFeature);
-
-protected:
-  /// Creates an empty iterator that alway returns More false
-  Model_Iterator();
-  /// Initializes iterator
-  /// \param theDoc document where the iteration is performed
-  /// \param theLab label of the features group to iterate
-  Model_Iterator(boost::shared_ptr<Model_Document> theDoc, TDF_Label theLab);
-
-  friend class Model_Document;
-};
-
-#endif
index b5a717b02be548139bd653856089a71b0c1b397e..2fe5b53597751ef83cbb2a21f70d5c2612d3a3f2 100644 (file)
@@ -7,7 +7,6 @@ SET(PROJECT_HEADERS
     ModelAPI_PluginManager.h
     ModelAPI_Plugin.h
     ModelAPI_Feature.h
-    ModelAPI_Iterator.h
     ModelAPI_Data.h
     ModelAPI_Document.h
     ModelAPI_Attribute.h
index 19be24d4d21dd4e5ba1798ebf2b8178892fabdbc..119f73d1678d706d8a6a1ed52b3f411344e3181e 100644 (file)
@@ -9,7 +9,6 @@
   #include "ModelAPI_Attribute.h"
   #include "ModelAPI_AttributeDocRef.h"
   #include "ModelAPI_AttributeDouble.h"
-  #include "ModelAPI_Iterator.h"
 %}
 
 // to avoid error on this
@@ -29,7 +28,6 @@
 %shared_ptr(ModelAPI_Attribute)
 %shared_ptr(ModelAPI_AttributeDocRef)
 %shared_ptr(ModelAPI_AttributeDouble)
-%shared_ptr(ModelAPI_Iterator)
 
 // all supported interfaces
 %include "ModelAPI_Document.h"
@@ -39,4 +37,3 @@
 %include "ModelAPI_Attribute.h"
 %include "ModelAPI_AttributeDocRef.h"
 %include "ModelAPI_AttributeDouble.h"
-%include "ModelAPI_Iterator.h"
index 011430d723d31ee1859a45152577838dcd007ed5..d00bbc76a4d8132db951fd9f71a2440384d82e12 100644 (file)
@@ -27,9 +27,11 @@ public:
   /// To virtually destroy the fields of successors
   MODELAPI_EXPORT virtual ~ModelAPI_Attribute() {}
 
+  /// Sets the owner of this attribute
   MODELAPI_EXPORT void setFeature(const boost::shared_ptr<ModelAPI_Feature>& theFeature)
     {myFeature = theFeature;}
 
+  /// Returns the owner of this attribute
   MODELAPI_EXPORT const boost::shared_ptr<ModelAPI_Feature>& feature()
   {return myFeature;}
 protected:
index efc85b2756a317c37849e096aa522b286b0749a2..4ae7380227ed57209753cbf3c8857670cee363c2 100644 (file)
@@ -11,7 +11,6 @@
 #include <vector>
 
 class ModelAPI_Feature;
-class ModelAPI_Iterator;
 
 /// Common groups identifiers
 /// Group of parameters
@@ -20,8 +19,8 @@ static const std::string PARAMETERS_GROUP = "Parameters";
 static const std::string CONSTRUCTIONS_GROUP = "Construction";
 /// Group of parts
 static const std::string PARTS_GROUP = "Parts";
-/// Group of sketches
-static const std::string SKETCHS_GROUP = "Sketchs";
+/// All created fetaures of the document (a history)
+static const std::string FEATURES_GROUP = "Features";
 
 /**\class Model_Document
  * \ingroup DataModel
@@ -73,10 +72,6 @@ public:
   ///! Adds a new sub-document by the identifier, or returns existing one if it is already exist
   MODELAPI_EXPORT virtual boost::shared_ptr<ModelAPI_Document> subDocument(std::string theDocID) = 0;
 
-  ///! Creates an iterator of the features by the specific groups
-  MODELAPI_EXPORT virtual boost::shared_ptr<ModelAPI_Iterator> featuresIterator(
-    const std::string theGroup) = 0;
-
   ///! Returns the id of hte document
   MODELAPI_EXPORT virtual const std::string& id() const = 0;
 
@@ -84,6 +79,9 @@ public:
   MODELAPI_EXPORT virtual boost::shared_ptr<ModelAPI_Feature> 
     feature(const std::string& theGroupID, const int theIndex) = 0;
 
+  //! Returns the number of features in the group
+  MODELAPI_EXPORT virtual int size(const std::string& theGroupID) = 0;
+
   //! Returns the index of feature in the group (zero based)
   MODELAPI_EXPORT virtual int featureIndex(boost::shared_ptr<ModelAPI_Feature> theFeature) = 0;
 
diff --git a/src/ModelAPI/ModelAPI_Iterator.h b/src/ModelAPI/ModelAPI_Iterator.h
deleted file mode 100644 (file)
index db4a5d1..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-// File:        ModelAPI_Iterator.hxx
-// Created:     1 Apr 2014
-// Author:      Mikhail PONIKAROV
-
-#ifndef ModelAPI_Iterator_HeaderFile
-#define ModelAPI_Iterator_HeaderFile
-
-#include "ModelAPI.h"
-#include <string>
-#include <boost/shared_ptr.hpp>
-
-class ModelAPI_Feature;
-class ModelAPI_Document;
-
-/**\class ModelAPI_Iterator
- * \ingroup DataModel
- * \brief Allows to iterate features of the document. Is created by the document
- * (see method featuresIterator).
- */
-
-class MODELAPI_EXPORT ModelAPI_Iterator
-{
-public:
-  /// Iterates to the next feature
-  virtual void next() = 0;
-  /// Returns true if the current iteration is valid and next iteration is possible
-  virtual bool more() = 0;
-  /// Returns the currently iterated feature
-  virtual boost::shared_ptr<ModelAPI_Feature> current() = 0;
-  /// Returns the kind of the current feature (faster than Current()->getKind())
-  virtual std::string currentKind() = 0;
-  /// Returns the name of the current feature (faster than Current()->getName())
-  virtual std::string currentName() = 0;
-  /// Don't changes the current position of iterator. Not fast: iterates the left items.
-  /// \returns number of left iterations
-  virtual int numIterationsLeft() = 0;
-  /// Compares the current feature with the given one
-  /// \returns true if given feature equals to the current one
-  virtual bool isEqual(boost::shared_ptr<ModelAPI_Feature> theFeature) = 0;
-
-  /// To virtually destroy the fields of successors
-  virtual ~ModelAPI_Iterator() {}
-
-protected:
-  /// Use plugin manager for features creation: this method is 
-  /// defined here only for SWIG-wrapping
-  ModelAPI_Iterator()
-  {}
-};
-
-#endif
index 772ac8d9888b4ea4ac3893c5ca1e1c4cebf20d7c..285bb4031acc83853ee41bc72bca610ef0433684 100644 (file)
 #include <ModelAPI_Data.h>
 // to avoid unresolved ModelAPI_Plugin()
 #include <ModelAPI_Plugin.h>
-// to avoid unresolved ModelAPI_Iterator()
-#include <ModelAPI_Iterator.h>
-// to avoid unresolved ModelAPI_Iterator()
-#include <ModelAPI_Iterator.h>
 #include <ModelAPI_Attribute.h>
 #include <ModelAPI_AttributeDocRef.h>
 #include <ModelAPI_AttributeDouble.h>
index 144411717f28f3fc8de381777c41e5a3bc97407d..0fd91d96958458e2a292ef214608d854586eb12f 100644 (file)
@@ -6,7 +6,6 @@
 #include "ModelAPI_PluginManager.h"
 #include "ModelAPI_Document.h"
 #include "ModelAPI_Data.h"
-#include "ModelAPI_Iterator.h"
 #include "ModelAPI_AttributeDocRef.h"
 
 using namespace std;
index 6acb48d74992a873aabb1dc1ca9858de2166bae2..35d90ab5d8682df9c526f89fc87cffe71e35ad20 100644 (file)
@@ -4,6 +4,7 @@
 
 #include "SketchPlugin_Sketch.h"
 #include <ModelAPI_Data.h>
+#include <GeomAPI_XYZ.h>
 #include <GeomDataAPI_Dir.h>
 #include <GeomDataAPI_Point.h>
 #include <GeomAlgoAPI_FaceBuilder.h>
@@ -70,8 +71,8 @@ boost::shared_ptr<GeomAPI_Pnt> SketchPlugin_Sketch::to3D(const double theX, cons
   boost::shared_ptr<GeomDataAPI_Dir> aY = 
     boost::dynamic_pointer_cast<GeomDataAPI_Dir>(data()->attribute(SKETCH_ATTR_DIRY));
 
-  return boost::shared_ptr<GeomAPI_Pnt>(new GeomAPI_Pnt(
-    aC->x() + aX->x() * theX + aY->x() * theY, 
-    aC->y() + aX->y() * theX + aY->y() * theY,
-    aC->z() + aX->z() * theX + aY->z() * theY));
+  boost::shared_ptr<GeomAPI_XYZ> aSum = aC->pnt()->xyz()->added(
+    aX->dir()->xyz()->multiplied(theX))->added(aY->dir()->xyz()->multiplied(theY));
+
+  return boost::shared_ptr<GeomAPI_Pnt>(new GeomAPI_Pnt(aSum));
 }
index a9bb8b61b76b7264fdf3545d059621e23bafafdb..ebae53b82849b7f98631299e36dc6841fe45dff3 100644 (file)
@@ -2,7 +2,6 @@
 #include "XGUI_PartDataModel.h"
 
 #include <ModelAPI_PluginManager.h>
-#include <ModelAPI_Iterator.h>
 #include <ModelAPI_Document.h>
 #include <ModelAPI_Feature.h>
 #include <ModelAPI_Data.h>
@@ -125,7 +124,7 @@ void XGUI_DocumentDataModel::processEvent(const Events_Message* theMessage)
   // Reset whole tree **************************
   } else {  
     beginResetModel();
-    int aNbParts = myDocument->featuresIterator(PARTS_GROUP)->numIterationsLeft();
+    int aNbParts = myDocument->size(PARTS_GROUP);
     if (myPartModels.size() != aNbParts) { // resize internal models
       while (myPartModels.size() > aNbParts) {
         delete myPartModels.last();
@@ -341,4 +340,4 @@ QModelIndex XGUI_DocumentDataModel::partFolderNode() const
 {
   int aPos = myModel->rowCount(QModelIndex());
   return createIndex(aPos, columnCount() - 1, 0);
-}
\ No newline at end of file
+}
index 3ca210d76d6fc6787f4ef682e021964e21928281..0e31dd7fd7bea98a67cfbad22ab9b509b21e0570 100644 (file)
@@ -1,7 +1,6 @@
 #include "XGUI_PartDataModel.h"
 
 #include <ModelAPI_PluginManager.h>
-#include <ModelAPI_Iterator.h>
 #include <ModelAPI_Document.h>
 #include <ModelAPI_Feature.h>
 #include <ModelAPI_Data.h>
@@ -74,10 +73,10 @@ int XGUI_TopDataModel::rowCount(const QModelIndex& theParent) const
     return 2;
 
   if (theParent.internalId() == ParamsFolder)
-    return myDocument->featuresIterator(PARAMETERS_GROUP)->numIterationsLeft();
+    return myDocument->size(PARAMETERS_GROUP);
 
   if (theParent.internalId() == ConstructFolder)
-    return myDocument->featuresIterator(CONSTRUCTIONS_GROUP)->numIterationsLeft();
+    return myDocument->size(CONSTRUCTIONS_GROUP);
 
   return 0;
 }
@@ -246,9 +245,9 @@ int XGUI_PartDataModel::rowCount(const QModelIndex& parent) const
   case MyRoot:
     return 3;
   case ParamsFolder:
-    return featureDocument()->featuresIterator(PARAMETERS_GROUP)->numIterationsLeft();
+    return featureDocument()->size(PARAMETERS_GROUP);
   case ConstructFolder:
-    return featureDocument()->featuresIterator(CONSTRUCTIONS_GROUP)->numIterationsLeft();
+    return featureDocument()->size(CONSTRUCTIONS_GROUP);
   case BodiesFolder:
     return 0;
   }