Salome HOME
fix coding style
[modules/shaper.git] / src / ExchangePlugin / ExchangePlugin_Import.cpp
1 // Copyright (C) 2014-2020  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 <Locale_Convert.h>
24
25 #include <PartSetPlugin_Part.h>
26
27 #include <ModelAPI_AttributeString.h>
28 #include <ModelAPI_AttributeInteger.h>
29 #include <ModelAPI_AttributeStringArray.h>
30 #include <ModelAPI_AttributeBoolean.h>
31 #include <ModelAPI_Session.h>
32 #include <ModelAPI_ResultPart.h>
33 #include <ModelAPI_Tools.h>
34
35
36 static const std::wstring THE_NEW_PART_STR(L"New Part");
37
38 DocumentPtr findDocument(DocumentPtr thePartSetDoc, const std::wstring& thePartName)
39 {
40   DocumentPtr aDoc;
41   FeaturePtr aPartFeature;
42   if (thePartName == THE_NEW_PART_STR) {
43     // create new part
44     aPartFeature = thePartSetDoc->addFeature(PartSetPlugin_Part::ID());
45     if (aPartFeature)
46       aPartFeature->execute();
47   }
48   else {
49     // find existing part by its name
50     std::list<FeaturePtr> aSubFeatures = thePartSetDoc->allFeatures();
51     for (std::list<FeaturePtr>::iterator aFIt = aSubFeatures.begin();
52       aFIt != aSubFeatures.end(); ++aFIt) {
53       if ((*aFIt)->getKind() == PartSetPlugin_Part::ID() && (*aFIt)->name() == thePartName) {
54         aPartFeature = *aFIt;
55         break;
56       }
57     }
58   }
59
60   if (aPartFeature) {
61     ResultPartPtr aPartResult =
62       std::dynamic_pointer_cast<ModelAPI_ResultPart>(aPartFeature->lastResult());
63     if (aPartResult)
64       aDoc = aPartResult->partDoc();
65   }
66   return aDoc;
67 }
68
69
70 /*
71  * Request for initialization of data model of the feature: adding all attributes
72  */
73 void ExchangePlugin_ImportBase::initAttributes()
74 {
75   data()->addAttribute(FILE_PATH_ID(), ModelAPI_AttributeString::typeId());
76   data()->addAttribute(TARGET_PART_ID(), ModelAPI_AttributeInteger::typeId());
77   data()->addAttribute(TARGET_PARTS_LIST_ID(), ModelAPI_AttributeStringArray::typeId());
78 }
79
80 void ExchangePlugin_Import::initAttributes()
81 {
82   ExchangePlugin_ImportBase::initAttributes();
83
84   data()->addAttribute(STEP_FILE_PATH_ID(), ModelAPI_AttributeString::typeId());
85   data()->addAttribute(IMPORT_TYPE_ID(), ModelAPI_AttributeString::typeId());
86   data()->addAttribute(STEP_TARGET_PART_ID(), ModelAPI_AttributeInteger::typeId());
87   data()->addAttribute(STEP_TARGET_PARTS_LIST_ID(), ModelAPI_AttributeStringArray::typeId());
88   data()->addAttribute(STEP_MATERIALS_ID(), ModelAPI_AttributeBoolean::typeId());
89   data()->addAttribute(STEP_COLORS_ID(), ModelAPI_AttributeBoolean::typeId());
90   data()->addAttribute(STEP_SCALE_INTER_UNITS_ID(), ModelAPI_AttributeBoolean::typeId());
91 }
92
93 /*
94  * Computes or recomputes the results
95  */
96
97 void ExchangePlugin_Import::execute()
98 {
99   AttributeStringPtr aFormatAttr =
100       this->string(ExchangePlugin_Import::IMPORT_TYPE_ID());
101   std::string aFormat = aFormatAttr->value();
102   AttributeStringPtr aFilePathAttr;
103   std::string aFilePath;
104   AttributeStringArrayPtr aPartsAttr;
105   AttributeIntegerPtr aTargetAttr;
106   if (aFormat == "STEP" || aFormat == "STP")
107   {
108     aFilePathAttr = string(ExchangePlugin_Import::STEP_FILE_PATH_ID());
109     aFilePath = aFilePathAttr->value();
110     // get the document where to import
111     aPartsAttr = stringArray(STEP_TARGET_PARTS_LIST_ID());
112     aTargetAttr = integer(STEP_TARGET_PART_ID());
113   }else{
114     aFilePathAttr = string(ExchangePlugin_Import::FILE_PATH_ID());
115     aFilePath = aFilePathAttr->value();
116     // get the document where to import
117     aPartsAttr = stringArray(TARGET_PARTS_LIST_ID());
118     aTargetAttr = integer(TARGET_PART_ID());
119   }
120
121   if (aFilePath.empty()) {
122       setError("File path is empty.");
123       return;
124   }
125   SessionPtr aSession = ModelAPI_Session::get();
126   DocumentPtr aDoc = findDocument(aSession->moduleDocument(),
127       Locale::Convert::toWString(aPartsAttr->value(aTargetAttr->value())));
128
129   if (aDoc.get()) {
130     FeaturePtr aImportFeature = aDoc->addFeature(ExchangePlugin_ImportFeature::ID());
131     DataPtr aData = aImportFeature->data();
132     AttributeStringPtr aPathAttr;
133     if (aFormat == "STEP" || aFormat == "STP")
134     {
135       aPathAttr = aData->string(ExchangePlugin_ImportFeature::STEP_FILE_PATH_ID());
136     }else
137     {
138       aPathAttr = aData->string(ExchangePlugin_ImportFeature::FILE_PATH_ID());
139     }
140
141     AttributeStringPtr aImportTypeAttr =
142         aData->string(ExchangePlugin_ImportFeature::IMPORT_TYPE_ID());
143
144     aData->boolean(ExchangePlugin_ImportFeature::STEP_MATERIALS_ID())
145         ->setValue(boolean(ExchangePlugin_Import::STEP_MATERIALS_ID())->value());
146     aData->boolean(ExchangePlugin_ImportFeature::STEP_COLORS_ID())
147         ->setValue(boolean(ExchangePlugin_Import::STEP_COLORS_ID())->value());
148     aData->boolean(ExchangePlugin_ImportFeature::STEP_SCALE_INTER_UNITS_ID())
149         ->setValue(boolean(ExchangePlugin_Import::STEP_SCALE_INTER_UNITS_ID())->value());
150
151     aPathAttr->setValue(aFilePathAttr->value());
152     aImportTypeAttr->setValue(aFormat);
153     aImportFeature->execute();
154   }
155 }
156
157 void ExchangePlugin_Import_Image::execute()
158 {
159  AttributeStringPtr aFilePathAttr = string(ExchangePlugin_ImportBase::FILE_PATH_ID());
160   std::string aFilePath = aFilePathAttr->value();
161   if (aFilePath.empty()) {
162     setError("File path is empty.");
163     return;
164   }
165
166   // get the document where to import
167   AttributeStringArrayPtr aPartsAttr = stringArray(TARGET_PARTS_LIST_ID());
168   AttributeIntegerPtr aTargetAttr = integer(TARGET_PART_ID());
169   SessionPtr aSession = ModelAPI_Session::get();
170   DocumentPtr aDoc = findDocument(aSession->moduleDocument(),
171       Locale::Convert::toWString(aPartsAttr->value(aTargetAttr->value())));
172
173   if (aDoc.get()) {
174     FeaturePtr aImportFeature = aDoc->addFeature(ExchangePlugin_Import_ImageFeature::ID());
175     DataPtr aData = aImportFeature->data();
176     AttributeStringPtr aPathAttr =
177         aData->string(ExchangePlugin_Import_ImageFeature::FILE_PATH_ID());
178     aPathAttr->setValue(aFilePathAttr->value());
179     aImportFeature->execute();
180   }
181 }
182 void ExchangePlugin_Import::attributeChanged(const std::string& theID)
183 {
184   AttributeStringPtr aFilePathAttr;
185   AttributeStringArrayPtr aPartsAttr;
186   AttributeIntegerPtr aTargetAttr;
187
188   if (theID == FILE_PATH_ID() ||theID == STEP_FILE_PATH_ID() ) {
189     aFilePathAttr = string(FILE_PATH_ID());
190     if (theID == FILE_PATH_ID() && aFilePathAttr->value().empty())
191       return;
192     aPartsAttr = stringArray(TARGET_PARTS_LIST_ID());
193     aTargetAttr = integer(TARGET_PART_ID());
194
195     updatePart(aPartsAttr, aTargetAttr);
196
197     aFilePathAttr = string(STEP_FILE_PATH_ID());
198     if (theID == STEP_FILE_PATH_ID() && aFilePathAttr->value().empty())
199       return;
200
201     aPartsAttr = stringArray(STEP_TARGET_PARTS_LIST_ID());
202     aTargetAttr = integer(STEP_TARGET_PART_ID());
203     updatePart(aPartsAttr, aTargetAttr);
204    }
205 }
206
207 void ExchangePlugin_Import_Image::attributeChanged(const std::string& theID)
208 {
209   if (theID == FILE_PATH_ID()) {
210     AttributeStringPtr aFilePathAttr = string(FILE_PATH_ID());
211     if (aFilePathAttr->value().empty())
212       return;
213
214     AttributeStringArrayPtr aPartsAttr = stringArray(TARGET_PARTS_LIST_ID());
215     AttributeIntegerPtr aTargetAttr = integer(TARGET_PART_ID());
216     updatePart(aPartsAttr, aTargetAttr);
217   }
218 }
219
220 void ExchangePlugin_ImportBase::updatePart(AttributeStringArrayPtr& aPartsAttr,
221                                        AttributeIntegerPtr& aTargetAttr)
222 {
223
224   // update the list of target parts
225   SessionPtr aSession = ModelAPI_Session::get();
226   DocumentPtr aDoc = document();
227   bool isPartSet = aDoc == aSession->moduleDocument();
228   if (isPartSet) {
229     std::list<std::wstring> anAcceptedValues;
230     anAcceptedValues.push_back(THE_NEW_PART_STR);
231
232     // append names of all parts
233     std::list<FeaturePtr> aSubFeatures = aDoc->allFeatures();
234     for (std::list<FeaturePtr>::iterator aFIt = aSubFeatures.begin();
235          aFIt != aSubFeatures.end(); ++aFIt) {
236       if ((*aFIt)->getKind() == PartSetPlugin_Part::ID())
237         anAcceptedValues.push_back((*aFIt)->name());
238     }
239
240     if ((size_t)aPartsAttr->size() != anAcceptedValues.size())
241       aTargetAttr->setValue(0);
242
243     aPartsAttr->setSize((int)anAcceptedValues.size());
244     std::list<std::wstring>::iterator anIt = anAcceptedValues.begin();
245     for (int anInd = 0; anIt != anAcceptedValues.end(); ++anIt, ++anInd)
246       aPartsAttr->setValue(anInd, Locale::Convert::toString(*anIt));
247   }
248   else {
249     // keep only the name of the current part
250     if (aPartsAttr->size() == 0) {
251       FeaturePtr aPartFeature = ModelAPI_Tools::findPartFeature(aSession->moduleDocument(), aDoc);
252
253       aPartsAttr->setSize(1);
254       aPartsAttr->setValue(0, Locale::Convert::toString(aPartFeature->name()));
255       aTargetAttr->setValue(0);
256     }
257   }
258 }