Salome HOME
0f223698cce621912ada211fbcd24d58064867f6
[modules/shaper.git] / src / ExchangePlugin / ExchangePlugin_Import.cpp
1 // Copyright (C) 2014-2019  CEA/DEN, EDF R&D
2 //
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
7 //
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11 // Lesser General Public License for more details.
12 //
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
16 //
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 //
19
20 #include "ExchangePlugin_Import.h"
21 #include "ExchangePlugin_ImportFeature.h"
22
23 #include <PartSetPlugin_Part.h>
24
25 #include <ModelAPI_AttributeString.h>
26 #include <ModelAPI_AttributeInteger.h>
27 #include <ModelAPI_AttributeStringArray.h>
28 #include <ModelAPI_Session.h>
29 #include <ModelAPI_ResultPart.h>
30 #include <ModelAPI_Tools.h>
31
32
33 static const std::string THE_NEW_PART_STR("New Part");
34
35 DocumentPtr findDocument(DocumentPtr thePartSetDoc, const std::string& thePartName)
36 {
37   DocumentPtr aDoc;
38   FeaturePtr aPartFeature;
39   if (thePartName == THE_NEW_PART_STR) {
40     // create new part
41     aPartFeature = thePartSetDoc->addFeature(PartSetPlugin_Part::ID());
42     if (aPartFeature)
43       aPartFeature->execute();
44   }
45   else {
46     // find existing part by its name
47     std::list<FeaturePtr> aSubFeatures = thePartSetDoc->allFeatures();
48     for (std::list<FeaturePtr>::iterator aFIt = aSubFeatures.begin();
49       aFIt != aSubFeatures.end(); ++aFIt) {
50       if ((*aFIt)->getKind() == PartSetPlugin_Part::ID() && (*aFIt)->name() == thePartName) {
51         aPartFeature = *aFIt;
52         break;
53       }
54     }
55   }
56
57   if (aPartFeature) {
58     ResultPartPtr aPartResult =
59       std::dynamic_pointer_cast<ModelAPI_ResultPart>(aPartFeature->lastResult());
60     if (aPartResult)
61       aDoc = aPartResult->partDoc();
62   }
63   return aDoc;
64 }
65
66
67 ExchangePlugin_Import::ExchangePlugin_Import()
68 {
69 }
70
71 ExchangePlugin_Import::~ExchangePlugin_Import()
72 {
73   // TODO Auto-generated destructor stub
74 }
75
76 /*
77  * Request for initialization of data model of the feature: adding all attributes
78  */
79 void ExchangePlugin_Import::initAttributes()
80 {
81   data()->addAttribute(FILE_PATH_ID(), ModelAPI_AttributeString::typeId());
82   data()->addAttribute(TARGET_PART_ID(), ModelAPI_AttributeInteger::typeId());
83   data()->addAttribute(TARGET_PARTS_LIST_ID(), ModelAPI_AttributeStringArray::typeId());
84 }
85
86 /*
87  * Computes or recomputes the results
88  */
89 void ExchangePlugin_Import::execute()
90 {
91   AttributeStringPtr aFilePathAttr = string(ExchangePlugin_Import::FILE_PATH_ID());
92   std::string aFilePath = aFilePathAttr->value();
93   if (aFilePath.empty()) {
94     setError("File path is empty.");
95     return;
96   }
97
98   // get the document where to import
99   AttributeStringArrayPtr aPartsAttr = stringArray(TARGET_PARTS_LIST_ID());
100   AttributeIntegerPtr aTargetAttr = integer(TARGET_PART_ID());
101   SessionPtr aSession = ModelAPI_Session::get();
102   DocumentPtr aDoc =
103     findDocument(aSession->moduleDocument(), aPartsAttr->value(aTargetAttr->value()));
104
105   if (aDoc.get()) {
106     FeaturePtr aImportFeature = aDoc->addFeature(ExchangePlugin_ImportFeature::ID());
107     DataPtr aData = aImportFeature->data();
108     AttributeStringPtr aPathAttr = aData->string(ExchangePlugin_ImportFeature::FILE_PATH_ID());
109     aPathAttr->setValue(aFilePathAttr->value());
110     aImportFeature->execute();
111   }
112 }
113
114
115 void ExchangePlugin_Import::attributeChanged(const std::string& theID)
116 {
117   if (theID == FILE_PATH_ID()) {
118     AttributeStringPtr aFilePathAttr = string(FILE_PATH_ID());
119     if (aFilePathAttr->value().empty())
120       return;
121
122     AttributeStringArrayPtr aPartsAttr = stringArray(TARGET_PARTS_LIST_ID());
123     AttributeIntegerPtr aTargetAttr = integer(TARGET_PART_ID());
124
125     // update the list of target parts
126     SessionPtr aSession = ModelAPI_Session::get();
127     DocumentPtr aDoc = document();
128     bool isPartSet = aDoc == aSession->moduleDocument();
129     if (isPartSet) {
130       std::list<std::string> anAcceptedValues;
131       anAcceptedValues.push_back(THE_NEW_PART_STR);
132
133       // append names of all parts
134       std::list<FeaturePtr> aSubFeatures = aDoc->allFeatures();
135       for (std::list<FeaturePtr>::iterator aFIt = aSubFeatures.begin();
136         aFIt != aSubFeatures.end(); ++aFIt) {
137         if ((*aFIt)->getKind() == PartSetPlugin_Part::ID())
138           anAcceptedValues.push_back((*aFIt)->name());
139       }
140
141       if (aPartsAttr->size() != anAcceptedValues.size())
142         aTargetAttr->setValue(0);
143
144       aPartsAttr->setSize((int)anAcceptedValues.size());
145       std::list<std::string>::iterator anIt = anAcceptedValues.begin();
146       for (int anInd = 0; anIt != anAcceptedValues.end(); ++anIt, ++anInd)
147         aPartsAttr->setValue(anInd, *anIt);
148     }
149     else {
150       // keep only the name of the current part
151       if (aPartsAttr->size() == 0) {
152         FeaturePtr aPartFeature = ModelAPI_Tools::findPartFeature(aSession->moduleDocument(), aDoc);
153
154         aPartsAttr->setSize(1);
155         aPartsAttr->setValue(0, aPartFeature->name());
156         aTargetAttr->setValue(0);
157       }
158     }
159   }
160 }