]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Make result part as a container of the document
authormpv <mikhail.ponikarov@opencascade.com>
Wed, 16 Jul 2014 06:31:40 +0000 (10:31 +0400)
committermpv <mikhail.ponikarov@opencascade.com>
Wed, 16 Jul 2014 06:31:40 +0000 (10:31 +0400)
src/Model/Model_ResultPart.cpp
src/Model/Model_ResultPart.h
src/ModelAPI/ModelAPI_Feature.h
src/ModelAPI/ModelAPI_ResultPart.h
src/PartSetPlugin/PartSetPlugin_Duplicate.cpp
src/PartSetPlugin/PartSetPlugin_Part.cpp
src/PartSetPlugin/PartSetPlugin_Part.h
src/PartSetPlugin/PartSetPlugin_Remove.cpp

index b3602c0b5301b46aa729a97571d5e546da0e8607..75b2f8b412f732f28e2ad83e8286aabece48e293 100644 (file)
@@ -19,3 +19,11 @@ boost::shared_ptr<ModelAPI_Feature> Model_ResultPart::owner()
 Model_ResultPart::Model_ResultPart()
 {
 }
+
+void Model_ResultPart::setData(boost::shared_ptr<ModelAPI_Data> theData)
+{
+  ModelAPI_Result::setData(theData);
+  if (theData) {
+    data()->addAttribute(DOC_REF(), ModelAPI_AttributeDocRef::type());
+  }
+}
index 26c19fc0cc708099e9aed96cc03da3e5ab1680b0..4408690d849ee4cff62e7919a5000f9bf7254e8f 100644 (file)
@@ -27,6 +27,9 @@ protected:
   /// makes a result on a temporary feature (an action)
   Model_ResultPart();
 
+  /// Sets the data manager of an object (document does), here also attributes are initialized
+  virtual void setData(boost::shared_ptr<ModelAPI_Data> theData);
+
   friend class Model_Document;
 };
 
index 59c0e453743776ac0ad624b931c5e9211cb4866c..3770c06f02a00bb9d522b0ca2642485f77efa42e 100644 (file)
@@ -46,7 +46,7 @@ public:
   std::list<boost::shared_ptr<ModelAPI_Result> >& results() {return myResults;}
   /// returns the first result in the list or NULL reference
   boost::shared_ptr<ModelAPI_Result> firstResult() 
-  {return myResults.size() ? *(myResults.begin()) : boost::shared_ptr<ModelAPI_Result>();}
+  {return myResults.empty() ? boost::shared_ptr<ModelAPI_Result>() : *(myResults.begin());}
   /// sets the alone result
   void setResult(const boost::shared_ptr<ModelAPI_Result>& theResult) 
   {myResults.clear(); myResults.push_back(theResult);}
index 4e3058b6b9d8b9e63166950ab337a31c94251a58..82e0cee5d79f28a663ad96fc341c149a7734b1a3 100644 (file)
@@ -25,6 +25,13 @@ public:
   static std::string group()
     {static std::string MY_GROUP = "Parts"; return MY_GROUP;}
 
+  /// part document reference attribute
+  inline static const std::string& DOC_REF()
+  {
+    static const std::string MY_DOC_REF("PartDocument");
+    return MY_DOC_REF;
+  }
+
   /// Returns the part-document of this result
   virtual boost::shared_ptr<ModelAPI_Document> partDoc() = 0;
 };
index d1032abf8a29e9c792adbb9cb842f903923c093f..2307e09064e5478f142c72fe2187a13ea29ffb45 100644 (file)
@@ -7,6 +7,7 @@
 #include <ModelAPI_AttributeDocRef.h>
 #include <ModelAPI_Data.h>
 #include <ModelAPI_Document.h>
+#include <ModelAPI_ResultPart.h>
 
 using namespace std;
 
@@ -19,7 +20,9 @@ void PartSetPlugin_Duplicate::initAttributes()
   PartSetPlugin_Part::initAttributes();
   data()->addAttribute(PartSetPlugin_Duplicate::DOC_REF(), ModelAPI_AttributeRefAttr::type());
 
-  boost::shared_ptr<ModelAPI_AttributeRefAttr> aRef = data()->refattr(PartSetPlugin_Duplicate::DOC_REF());
+  ResultPartPtr aResult = boost::dynamic_pointer_cast<ModelAPI_ResultPart>(firstResult());
+  boost::shared_ptr<ModelAPI_AttributeRefAttr> aRef = 
+    aResult->data()->refattr(ModelAPI_ResultPart::DOC_REF());
   if (!aRef->attr()) { // create a copy: if not created yet attribute is not initialized
     boost::shared_ptr<ModelAPI_PluginManager> aPManager = ModelAPI_PluginManager::get();
     boost::shared_ptr<ModelAPI_Document> aRoot = aPManager->rootDocument();
@@ -27,13 +30,13 @@ void PartSetPlugin_Duplicate::initAttributes()
     for(int a = aRoot->size(getGroup()) - 1; a >= 0; a--) {
       aSource = boost::dynamic_pointer_cast<PartSetPlugin_Part>(
         aRoot->object(ModelAPI_Feature::group(), a));
-      if (aSource->data()->docRef(PartSetPlugin_Part::DOC_REF())->value() == aPManager->currentDocument())
+      if (aSource->data()->docRef(ModelAPI_ResultPart::DOC_REF())->value() == aPManager->currentDocument())
         break;
       aSource.reset();
     }
     if (aSource) {
       boost::shared_ptr<ModelAPI_Document> aCopy = 
-        aPManager->copy(aSource->data()->docRef(PartSetPlugin_Part::DOC_REF())->value(), data()->name());
+        aPManager->copy(aSource->data()->docRef(ModelAPI_ResultPart::DOC_REF())->value(), data()->name());
       aRef->setObject(aSource);
     }
   }
index c8beaeac9bf40be39d76146398cc72cc0a0848fa..e2b47f4ce9b3f35c8982dbf7788a8549f75120b4 100644 (file)
@@ -16,23 +16,24 @@ PartSetPlugin_Part::PartSetPlugin_Part()
 }
 
 void PartSetPlugin_Part::initAttributes()
-{
-  data()->addAttribute(PartSetPlugin_Part::DOC_REF(), ModelAPI_AttributeDocRef::type());
+{// all is in part result
 }
 
 void PartSetPlugin_Part::execute() 
 {
-  boost::shared_ptr<ModelAPI_AttributeDocRef> aDocRef = data()->docRef(PartSetPlugin_Part::DOC_REF());
+  ResultPartPtr aResult = boost::dynamic_pointer_cast<ModelAPI_ResultPart>(firstResult());
+  if (!aResult) {
+    aResult = document()->createPart(data());
+    setResult(aResult);
+  }
+  boost::shared_ptr<ModelAPI_AttributeDocRef> aDocRef =
+    aResult->data()->docRef(ModelAPI_ResultPart::DOC_REF());
+
   if (!aDocRef->value()) { // create a document if not yet created
     boost::shared_ptr<ModelAPI_Document> aPartSetDoc = 
       ModelAPI_PluginManager::get()->rootDocument();
     aDocRef->setValue(aPartSetDoc->subDocument(data()->name()));
   }
-  // create a result only once
-  if (results().empty()) {
-    boost::shared_ptr<ModelAPI_ResultPart> aResult = document()->createPart(data());
-    setResult(aResult);
-  }
 }
 
 boost::shared_ptr<ModelAPI_Document> PartSetPlugin_Part::documentToAdd() {
index cd656b18e76fa9c3a6f98ae849cfde264936abd6..7eb27f5ac1cf99e5f6d8aa1d96d3d1ed44bee7d7 100644 (file)
@@ -21,12 +21,6 @@ public:
     static const std::string MY_PART_KIND("Part");
     return MY_PART_KIND;
   }
-  /// part reference attribute
-  inline static const std::string& DOC_REF()
-  {
-    static const std::string MY_DOC_REF("PartDocument");
-    return MY_DOC_REF;
-  }
   /// Returns the kind of a feature
   PARTSETPLUGIN_EXPORT virtual const std::string& getKind() 
   {static std::string MY_KIND = PartSetPlugin_Part::ID(); return MY_KIND;}
index ca31737285e7b2c7b83ad9342b57fe4a7d2db1c9..f352aa39e8641fd815f297e47ba0a181420829c5 100644 (file)
@@ -7,6 +7,7 @@
 #include <ModelAPI_Document.h>
 #include <ModelAPI_Data.h>
 #include <ModelAPI_AttributeDocRef.h>
+#include <ModelAPI_ResultPart.h>
 
 void PartSetPlugin_Remove::execute()
 {
@@ -20,9 +21,10 @@ void PartSetPlugin_Remove::execute()
     if (aFeature->getKind() == PartSetPlugin_Part::ID()) {
       boost::shared_ptr<PartSetPlugin_Part> aPart = 
         boost::static_pointer_cast<PartSetPlugin_Part>(aFeature);
-      if (aPart->data()->docRef(PartSetPlugin_Part::DOC_REF())->value() == aPManager->currentDocument()) {
+      if (aPart->data()->docRef(ModelAPI_ResultPart::DOC_REF())->value() == 
+        aPManager->currentDocument()) {
         // do remove
-        aPart->data()->docRef(PartSetPlugin_Part::DOC_REF())->value()->close();
+        aPart->data()->docRef(ModelAPI_ResultPart::DOC_REF())->value()->close();
         aRoot->removeFeature(aPart);
       }
     }