1 // Copyright (C) 2014-2021 CEA/DEN, EDF R&D
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.
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.
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
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 #include "ExchangePlugin_Import.h"
21 #include "ExchangePlugin_ImportFeature.h"
23 #include <Locale_Convert.h>
25 #include <PartSetPlugin_Part.h>
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>
36 static const std::wstring THE_NEW_PART_STR(L"New Part");
38 DocumentPtr findDocument(DocumentPtr thePartSetDoc, const std::wstring& thePartName)
41 FeaturePtr aPartFeature;
42 if (thePartName == THE_NEW_PART_STR) {
44 aPartFeature = thePartSetDoc->addFeature(PartSetPlugin_Part::ID());
46 aPartFeature->execute();
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) {
61 ResultPartPtr aPartResult =
62 std::dynamic_pointer_cast<ModelAPI_ResultPart>(aPartFeature->lastResult());
64 aDoc = aPartResult->partDoc();
71 * Request for initialization of data model of the feature: adding all attributes
73 void ExchangePlugin_ImportBase::initAttributes()
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());
80 void ExchangePlugin_Import::initAttributes()
82 ExchangePlugin_ImportBase::initAttributes();
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());
94 * Computes or recomputes the results
97 void ExchangePlugin_Import::execute()
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")
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());
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());
121 if (aFilePath.empty()) {
122 setError("File path is empty.");
125 SessionPtr aSession = ModelAPI_Session::get();
126 DocumentPtr aDoc = findDocument(aSession->moduleDocument(),
127 Locale::Convert::toWString(aPartsAttr->value(aTargetAttr->value())));
130 FeaturePtr aImportFeature = aDoc->addFeature(ExchangePlugin_ImportFeature::ID());
131 DataPtr aData = aImportFeature->data();
132 AttributeStringPtr aPathAttr;
133 if (aFormat == "STEP" || aFormat == "STP")
135 aPathAttr = aData->string(ExchangePlugin_ImportFeature::STEP_FILE_PATH_ID());
138 aPathAttr = aData->string(ExchangePlugin_ImportFeature::FILE_PATH_ID());
141 AttributeStringPtr aImportTypeAttr =
142 aData->string(ExchangePlugin_ImportFeature::IMPORT_TYPE_ID());
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());
151 aPathAttr->setValue(aFilePathAttr->value());
152 aImportTypeAttr->setValue(aFormat);
153 aImportFeature->execute();
157 void ExchangePlugin_Import_Image::execute()
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.");
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())));
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();
182 void ExchangePlugin_Import::attributeChanged(const std::string& theID)
184 AttributeStringPtr aFilePathAttr;
185 AttributeStringArrayPtr aPartsAttr;
186 AttributeIntegerPtr aTargetAttr;
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())
192 aPartsAttr = stringArray(TARGET_PARTS_LIST_ID());
193 aTargetAttr = integer(TARGET_PART_ID());
195 updatePart(aPartsAttr, aTargetAttr);
197 aFilePathAttr = string(STEP_FILE_PATH_ID());
198 if (theID == STEP_FILE_PATH_ID() && aFilePathAttr->value().empty())
201 aPartsAttr = stringArray(STEP_TARGET_PARTS_LIST_ID());
202 aTargetAttr = integer(STEP_TARGET_PART_ID());
203 updatePart(aPartsAttr, aTargetAttr);
207 void ExchangePlugin_Import_Image::attributeChanged(const std::string& theID)
209 if (theID == FILE_PATH_ID()) {
210 AttributeStringPtr aFilePathAttr = string(FILE_PATH_ID());
211 if (aFilePathAttr->value().empty())
214 AttributeStringArrayPtr aPartsAttr = stringArray(TARGET_PARTS_LIST_ID());
215 AttributeIntegerPtr aTargetAttr = integer(TARGET_PART_ID());
216 updatePart(aPartsAttr, aTargetAttr);
220 void ExchangePlugin_ImportBase::updatePart(AttributeStringArrayPtr& aPartsAttr,
221 AttributeIntegerPtr& aTargetAttr)
224 // update the list of target parts
225 SessionPtr aSession = ModelAPI_Session::get();
226 DocumentPtr aDoc = document();
227 bool isPartSet = aDoc == aSession->moduleDocument();
229 std::list<std::wstring> anAcceptedValues;
230 anAcceptedValues.push_back(THE_NEW_PART_STR);
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());
240 if ((size_t)aPartsAttr->size() != anAcceptedValues.size())
241 aTargetAttr->setValue(0);
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));
249 // keep only the name of the current part
250 if (aPartsAttr->size() == 0) {
251 FeaturePtr aPartFeature = ModelAPI_Tools::findPartFeature(aSession->moduleDocument(), aDoc);
253 aPartsAttr->setSize(1);
254 aPartsAttr->setValue(0, Locale::Convert::toString(aPartFeature->name()));
255 aTargetAttr->setValue(0);