#include <ModelAPI_AttributeSelection.h>
#include <ModelAPI_AttributeSelectionList.h>
#include <ModelAPI_AttributeString.h>
+#include <ModelAPI_AttributeStringArray.h>
#include <ModelAPI_CompositeFeature.h>
#include <ModelAPI_Document.h>
#include <ModelAPI_Entity.h>
#include <fstream>
-#define DEBUG_DEFLECTION
-
static int gCompositeStackDepth = 0;
ModelHighAPI_Dumper* ModelHighAPI_Dumper::mySelf = 0;
myNotDumpedEntities.clear();
}
+// Convert string to integer. If the string is not a number, return -1
+static int toInt(const std::string& theString)
+{
+ std::string::const_iterator aChar = theString.begin();
+ for (; aChar != theString.end(); ++aChar)
+ if (!std::isdigit(*aChar))
+ break;
+ if (aChar != theString.end())
+ return -1; // not a number
+ return std::stoi(theString);
+}
+
const std::string& ModelHighAPI_Dumper::name(const EntityPtr& theEntity,
bool theSaveNotDumped,
bool theUseEntityName)
size_t anIndex = aName.find(aKind);
if (anIndex == 0 && aName[aKind.length()] == '_') { // name starts with "FeatureKind_"
std::string anIdStr = aName.substr(aKind.length() + 1);
- int anId = std::stoi(anIdStr);
+ int anId = toInt(anIdStr);
// Check number of already registered objects of such kind. Index of current object
// should be the same to identify feature's name as automatically generated.
CompositeFeaturePtr aCompFeat = std::dynamic_pointer_cast<ModelAPI_CompositeFeature>(*aFeatIt);
if (aCompFeat) // iteratively process composite features
isOk = process(aCompFeat) && isOk;
- else if (!isDumped(*aFeatIt)) // dump common feature
+ else if (!isDumped(*aFeatIt)) // dump common feature
dumpFeature(*aFeatIt);
}
return isOk;
}
-bool ModelHighAPI_Dumper::process(const std::shared_ptr<ModelAPI_CompositeFeature>& theComposite, bool isForce)
+bool ModelHighAPI_Dumper::process(const std::shared_ptr<ModelAPI_CompositeFeature>& theComposite,
+ bool isForce)
{
// increase composite features stack
++gCompositeStackDepth;
// sub-part is processed independently, because it provides separate document
if (theComposite->getKind() == PartSetPlugin_Part::ID()) {
+ // dump name of the part if it is different from default
+ if (!myEntitiesStack.empty())
+ dumpEntitySetName();
+
// decrease composite features stack because we run into separate document
--gCompositeStackDepth;
return isOk;
}
-bool ModelHighAPI_Dumper::processSubs(const std::shared_ptr<ModelAPI_CompositeFeature>& theComposite,
- bool theDumpModelDo)
+bool ModelHighAPI_Dumper::processSubs(
+ const std::shared_ptr<ModelAPI_CompositeFeature>& theComposite,
+ bool theDumpModelDo)
{
bool isOk = true;
// dump all sub-features;
for (ModulesMap::const_iterator aModIt = myModules.begin();
aModIt != myModules.end(); ++aModIt) {
aFile << "from " << aModIt->first << " import ";
- if (aModIt->second.empty() ||
+ if (aModIt->second.empty() ||
aModIt->second.find(std::string()) != aModIt->second.end())
aFile << "*"; // import whole module
else {
if (!myModules.empty())
aFile << std::endl;
- aFile << "import model" << std::endl << std::endl;
+ aFile << "from salome.shaper import model" << std::endl << std::endl;
aFile << "model.begin()" << std::endl;
// dump collected data
}
// set result deflection
if (!isDefaultDeflection(*aResIt)) {
- AttributeDoublePtr aDeflectionAttr = (*aResIt)->data()->real(ModelAPI_Result::DEFLECTION_ID());
- #ifdef DEBUG_DEFLECTION
- std::cout << "aDeflectionAttr.get(): " << (aDeflectionAttr.get() == NULL ? "Empty" : "Not empty") << std::endl;
- std::cout << "aDeflectionAttr->isInitialized(): " << aDeflectionAttr->isInitialized() << std::endl;
- #endif
+ AttributeDoublePtr aDeflectionAttr =
+ (*aResIt)->data()->real(ModelAPI_Result::DEFLECTION_ID());
if(aDeflectionAttr.get() && aDeflectionAttr->isInitialized()) {
*this << *aResIt;
- #ifdef DEBUG_DEFLECTION
- std::cout << "Dump deflection" << std::endl;
- #endif
myDumpBuffer << ".setDeflection(" << aDeflectionAttr->value() << ")" << std::endl;
}
}
aDefault = Config_PropManager::real("Visualization", "body_deflection",
ModelAPI_ResultBody::DEFAULT_DEFLECTION());
-#ifdef DEBUG_DEFLECTION
- std::cout << "Current deflection: " << aCurrent << std::endl;
- std::cout << "Default deflection: " << aDefault << std::endl;
- std::cout << "fabs(aCurrent - aDefault): " << fabs(aCurrent - aDefault) << std::endl;
-#endif
-
-
return fabs(aCurrent - aDefault) < 1.e-12;
}
ModelHighAPI_Dumper& ModelHighAPI_Dumper::operator<<(const FeaturePtr& theEntity)
{
+ bool isFound = myNames.find(theEntity) != myNames.end();
myDumpBuffer << name(theEntity);
- bool isUserDefinedName = !myNames[theEntity].myIsDefault;
- // store results if they have user-defined names or colors
- std::list<ResultPtr> aResultsWithNameOrColor;
- const std::list<ResultPtr>& aResults = theEntity->results();
- std::list<ResultPtr>::const_iterator aResIt = aResults.begin();
- for (; aResIt != aResults.end(); ++aResIt)
- if (!myNames[*aResIt].myIsDefault || !isDefaultColor(*aResIt) || !isDefaultDeflection(*aResIt))
- aResultsWithNameOrColor.push_back(*aResIt);
- // store just dumped entity to stack
- myEntitiesStack.push(LastDumpedEntity(theEntity, isUserDefinedName, aResultsWithNameOrColor));
+ if (!isFound) {
+ bool isUserDefinedName = !myNames[theEntity].myIsDefault;
+ // store results if they have user-defined names or colors
+ std::list<ResultPtr> aResultsWithNameOrColor;
+ const std::list<ResultPtr>& aResults = theEntity->results();
+ std::list<ResultPtr>::const_iterator aResIt = aResults.begin();
+ for (; aResIt != aResults.end(); ++aResIt)
+ if (!myNames[*aResIt].myIsDefault || !isDefaultColor(*aResIt) ||
+ !isDefaultDeflection(*aResIt))
+ aResultsWithNameOrColor.push_back(*aResIt);
+ // store just dumped entity to stack
+ myEntitiesStack.push(
+ LastDumpedEntity(theEntity, isUserDefinedName, aResultsWithNameOrColor));
+ }
// remove entity from the list of not dumped items
myNotDumpedEntities.erase(theEntity);
FeaturePtr aFeature = ModelAPI_Feature::feature(theResult);
int anIndex = 0;
std::list<ResultPtr> aResults = aFeature->results();
- for(std::list<ResultPtr>::const_iterator anIt = aResults.cbegin(); anIt != aResults.cend(); ++anIt, ++anIndex) {
+ for(std::list<ResultPtr>::const_iterator
+ anIt = aResults.cbegin(); anIt != aResults.cend(); ++anIt, ++anIndex) {
if(theResult->isSame(*anIt)) {
break;
}
}
- myDumpBuffer << name(aFeature) << ".result()[" << anIndex << "]";
+
+ myDumpBuffer << name(aFeature);
+ if(anIndex == 0) {
+ myDumpBuffer << ".result()";
+ } else {
+ myDumpBuffer << ".results()[" << anIndex << "]";
+ }
return *this;
}
return *this;
}
- myDumpBuffer << "\"" << aShape->shapeTypeStr() << "\", \"" << theAttrSelect->namingName() << "\")";
+ myDumpBuffer << "\"" << aShape->shapeTypeStr() << "\", \"" <<
+ theAttrSelect->namingName() << "\")";
return *this;
}
} else {
isAdded = true;
}
- myDumpBuffer << "model.selection(\"" << aShape->shapeTypeStr() << "\", \"" << anAttribute->namingName() << "\")";
+ myDumpBuffer << "model.selection(\"" <<
+ aShape->shapeTypeStr() << "\", \"" << anAttribute->namingName() << "\")";
}
myDumpBuffer << "]";
return *this;
}
+ModelHighAPI_Dumper& ModelHighAPI_Dumper::operator<<(
+ const std::shared_ptr<ModelAPI_AttributeStringArray>& theArray)
+{
+ myDumpBuffer<<"[";
+ for(int anIndex = 0; anIndex < theArray->size(); ++anIndex) {
+ if (anIndex != 0)
+ myDumpBuffer<<", ";
+
+ myDumpBuffer<<"\""<<theArray->value(anIndex)<<"\"";
+ }
+
+ myDumpBuffer<<"]";
+ return *this;
+}
+
/// Dump std::endl
-MODELHIGHAPI_EXPORT
ModelHighAPI_Dumper& operator<<(ModelHighAPI_Dumper& theDumper,
std::basic_ostream<char>& (*theEndl)(std::basic_ostream<char>&))
{