X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketchAPI%2FSketchAPI_Mirror.cpp;h=aa33878d0d6f9e85e8a065e2efd1638a0173f1eb;hb=9270adddc12db9661c676544537b0e8eb78c1624;hp=1013e3cf5c7d2605fbb313132eca80fcb495e506;hpb=380f01e1fce1a012267d604a1190d04bf4659447;p=modules%2Fshaper.git diff --git a/src/SketchAPI/SketchAPI_Mirror.cpp b/src/SketchAPI/SketchAPI_Mirror.cpp index 1013e3cf5..aa33878d0 100644 --- a/src/SketchAPI/SketchAPI_Mirror.cpp +++ b/src/SketchAPI/SketchAPI_Mirror.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2020 CEA/DEN, EDF R&D +// Copyright (C) 2014-2022 CEA/DEN, EDF R&D // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -39,15 +39,18 @@ SketchAPI_Mirror::SketchAPI_Mirror( { if (initialize()) { fillAttribute(theMirrorLine, mirrorLine()); - fillAttribute(theObjects, mirrorList()); - - execute(); + setMirrorList(theObjects); } } SketchAPI_Mirror::~SketchAPI_Mirror() { +} +void SketchAPI_Mirror::setMirrorList(const std::list >& theObjects) +{ + fillAttribute(theObjects, mirrorList()); + execute(); } std::list > SketchAPI_Mirror::mirrored() const @@ -69,44 +72,71 @@ void SketchAPI_Mirror::dump(ModelHighAPI_Dumper& theDumper) const FeaturePtr aBase = feature(); const std::string& aSketchName = theDumper.parentName(aBase); - AttributeRefAttrPtr aMirrorLine = mirrorLine(); AttributeRefListPtr aMirrorObjects = mirrorList(); // Check all attributes are already dumped. If not, store the constraint as postponed. - if (!theDumper.isDumped(aMirrorLine) || !theDumper.isDumped(aMirrorObjects)) { + size_t aFirstNotDumped = theDumper.indexOfFirstNotDumped(aMirrorObjects); + if (!theDumper.isDumped(aMirrorLine) || aFirstNotDumped == 0) { + theDumper.postpone(aBase); + return; + } + + + // the number of dumped aMirrorObjects is not changed, no need to dump anything + static std::map aNbDumpedArguments; + std::map::iterator aFound = aNbDumpedArguments.find(aBase); + if (aFound != aNbDumpedArguments.end() && aFound->second == aFirstNotDumped) { theDumper.postpone(aBase); return; } + else + aNbDumpedArguments[aBase] = aFirstNotDumped; - theDumper << aBase << " = " << aSketchName << ".addMirror(" << aMirrorLine << ", " - << aMirrorObjects << ")" << std::endl; + if (theDumper.isDumped(aBase)) { + // the feature is already dumped, but it was postponed, because of some arguments + // were not dumped yet, thus, it is necessary to update the list of rotated objects + theDumper << "\n### Update " << aBase->getKind() << std::endl; + theDumper << aBase << ".setMirrorList(" << aMirrorObjects << ")" << std::endl; + } + else { + // the feature is not dumped yet, make the full dump + theDumper << aBase << " = " << aSketchName << ".addMirror(" << aMirrorLine << ", " + << aMirrorObjects << ")" << std::endl; + } // Dump variables for a list of mirrored features theDumper << "["; std::list > aList = mirrored(); std::list >::const_iterator anIt = aList.begin(); - for (; anIt != aList.end(); ++anIt) { + for (size_t anIndex = 0; anIndex < aFirstNotDumped; ++anIndex, ++anIt) { if (anIt != aList.begin()) theDumper << ", "; theDumper << (*anIt)->feature(); } theDumper << "] = " << theDumper.name(aBase) << ".mirrored()" << std::endl; - // Set necessary "auxiliary" flag for mirrored features - // (flag is set if it differs to base entity) - std::list aMirList = aMirrorObjects->list(); - std::list::const_iterator aMIt = aMirList.begin(); - for (anIt = aList.begin(); aMIt != aMirList.end(); ++aMIt, ++anIt) { - FeaturePtr aFeature = ModelAPI_Feature::feature(*aMIt); - if (!aFeature) - continue; - bool aBaseAux = aFeature->boolean(SketchPlugin_SketchEntity::AUXILIARY_ID())->value(); + if (theDumper.isDumped(aMirrorObjects)) { + aNbDumpedArguments.erase(aBase); + // Set necessary "auxiliary" flag for mirrored features + // (flag is set if it differs to base entity) + std::list aMirList = aMirrorObjects->list(); + std::list::const_iterator aMIt = aMirList.begin(); + for (anIt = aList.begin(); aMIt != aMirList.end(); ++aMIt, ++anIt) { + FeaturePtr aFeature = ModelAPI_Feature::feature(*aMIt); + if (!aFeature) + continue; + bool aBaseAux = aFeature->boolean(SketchPlugin_SketchEntity::AUXILIARY_ID())->value(); - aFeature = (*anIt)->feature(); - bool aFeatAux = aFeature->boolean(SketchPlugin_SketchEntity::AUXILIARY_ID())->value(); - if (aFeatAux != aBaseAux) - theDumper << theDumper.name((*anIt)->feature(), false) - << ".setAuxiliary(" << aFeatAux << ")" <feature(); + bool aFeatAux = aFeature->boolean(SketchPlugin_SketchEntity::AUXILIARY_ID())->value(); + if (aFeatAux != aBaseAux) + theDumper << theDumper.name((*anIt)->feature(), false) + << ".setAuxiliary(" << aFeatAux << ")" <