X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketchPlugin%2FSketchPlugin_Sketch.cpp;h=ceaf6dd0939570316aa2e6bb1a47cedfe7c62150;hb=74e9ba33303efc2282db1261706e904efa36b255;hp=2190a6e4b550bcda625e40fdcf071cd3251024cf;hpb=3031dbf1abc9330fc9dcffeecb5813e7fe71e87b;p=modules%2Fshaper.git diff --git a/src/SketchPlugin/SketchPlugin_Sketch.cpp b/src/SketchPlugin/SketchPlugin_Sketch.cpp index 2190a6e4b..ceaf6dd09 100644 --- a/src/SketchPlugin/SketchPlugin_Sketch.cpp +++ b/src/SketchPlugin/SketchPlugin_Sketch.cpp @@ -31,6 +31,7 @@ #include #include #include +#include #include @@ -125,18 +126,24 @@ void SketchPlugin_Sketch::execute() std::shared_ptr SketchPlugin_Sketch::addFeature(std::string theID) { - std::shared_ptr aNew = document()->addFeature(theID); + std::shared_ptr aNew = document()->addFeature(theID, false); if (aNew) { std::dynamic_pointer_cast(aNew)->setSketch(this); data()->reflist(SketchPlugin_Sketch::FEATURES_ID())->append(aNew); } + // set as current also after it becomes sub to set correctly enabled for other sketch subs + document()->setCurrentFeature(aNew, false); return aNew; } void SketchPlugin_Sketch::removeFeature(std::shared_ptr theFeature) { - if (!data().get()) // sketch is already removed (case on undo of sketch), sync is not needed + if (!data()->isValid()) // sketch is already removed (case on undo of sketch), sync is not needed return; + // to keep the persistent sub-elements indexing, do not remove elements from list, + // but substitute by nulls + reflist(SketchPlugin_Sketch::FEATURES_ID())->substitute(theFeature, ObjectPtr()); + /* list aSubs = data()->reflist(SketchPlugin_Sketch::FEATURES_ID())->list(); list::iterator aSubIt = aSubs.begin(), aLastIt = aSubs.end(); bool isRemoved = false; @@ -154,22 +161,42 @@ void SketchPlugin_Sketch::removeFeature(std::shared_ptr theFea // Find the first empty element and remove it if (!isRemoved && aHasEmtpyFeature) data()->reflist(SketchPlugin_Sketch::FEATURES_ID())->remove(ObjectPtr()); + */ } -int SketchPlugin_Sketch::numberOfSubs() const +int SketchPlugin_Sketch::numberOfSubs(bool forTree) const { - return data()->reflist(SketchPlugin_Sketch::FEATURES_ID())->size(); + if (forTree) + return 0; + return data()->reflist(SketchPlugin_Sketch::FEATURES_ID())->size(false); } -std::shared_ptr SketchPlugin_Sketch::subFeature(const int theIndex) const +std::shared_ptr SketchPlugin_Sketch::subFeature( + const int theIndex, bool forTree) const { - ObjectPtr anObj = data()->reflist(SketchPlugin_Sketch::FEATURES_ID())->object(theIndex); + if (forTree) + return FeaturePtr(); + + ObjectPtr anObj = data()->reflist(SketchPlugin_Sketch::FEATURES_ID())->object(theIndex, false); return std::dynamic_pointer_cast(anObj); } int SketchPlugin_Sketch::subFeatureId(const int theIndex) const { - return subFeature(theIndex)->data()->featureId(); + std::shared_ptr aRefList = std::dynamic_pointer_cast< + ModelAPI_AttributeRefList>(data()->attribute(SketchPlugin_Sketch::FEATURES_ID())); + std::list aFeatures = aRefList->list(); + std::list::const_iterator anIt = aFeatures.begin(); + int aResultIndex = 1; // number of the counted (created) features, started from 1 + int aFeatureIndex = -1; // number of the not-empty features in the list + for (; anIt != aFeatures.end(); anIt++) { + if (anIt->get()) + aFeatureIndex++; + if (aFeatureIndex == theIndex) + break; + aResultIndex++; + } + return aResultIndex; } bool SketchPlugin_Sketch::isSub(ObjectPtr theObject) const @@ -182,11 +209,7 @@ bool SketchPlugin_Sketch::isSub(ObjectPtr theObject) const aFeature = document()->feature(aRes); } if (aFeature) { - list aSubs = data()->reflist(SketchPlugin_Sketch::FEATURES_ID())->list(); - for(list::iterator aSubIt = aSubs.begin(); aSubIt != aSubs.end(); aSubIt++) { - if (*aSubIt == aFeature) - return true; - } + return data()->reflist(SketchPlugin_Sketch::FEATURES_ID())->isInList(aFeature); } return false; } @@ -226,8 +249,8 @@ void SketchPlugin_Sketch::attributeChanged(const std::string& theID) { aCoords = aCoords->multiplied(-aD * aCoords->distance(aZero)); std::shared_ptr anOrigPnt(new GeomAPI_Pnt(aCoords)); // X axis is preferable to be dirX on the sketch - static const double tol = 1.e-7; - bool isX = fabs(anA - 1.0) < tol && fabs(aB) < tol && fabs(aC) < tol; + static const double tol = 0.1; // here can not be very small value to avoid very close to X normal axis (issue 595) + bool isX = fabs(anA) - 1.0 < tol && fabs(aB) < tol && fabs(aC) < tol; std::shared_ptr aTempDir( isX ? new GeomAPI_Dir(0, 1, 0) : new GeomAPI_Dir(1, 0, 0)); std::shared_ptr aYDir(new GeomAPI_Dir(aNormDir->cross(aTempDir))); @@ -252,7 +275,8 @@ void SketchPlugin_Sketch::attributeChanged(const std::string& theID) { std::list aSubs = data()->reflist(SketchPlugin_Sketch::FEATURES_ID())->list(); std::list::iterator aSub = aSubs.begin(); for(; aSub != aSubs.end(); aSub++) { - ModelAPI_EventCreator::get()->sendUpdated(*aSub, anUpdateEvent); + if (aSub->get()) + ModelAPI_EventCreator::get()->sendUpdated(*aSub, anUpdateEvent); } } } @@ -278,3 +302,33 @@ void SketchPlugin_Sketch::createPoint2DResult(ModelAPI_Feature* theFeature, theFeature->setResult(aResult, theIndex); } + +FeaturePtr SketchPlugin_Sketch::addUniqueNamedCopiedFeature(FeaturePtr theFeature, + SketchPlugin_Sketch* theSketch) +{ + FeaturePtr aNewFeature = theSketch->addFeature(theFeature->getKind()); + // addFeature generates a unique name for the feature, it caches the name + std::string aUniqueFeatureName = aNewFeature->data()->name(); + // all attribute values are copied\pasted to the new feature, name is not an exception + theFeature->data()->copyTo(aNewFeature->data()); + // as a name for the feature, the generated unique name is set + aNewFeature->data()->setName(aUniqueFeatureName); + // text expressions could block setValue of some attributes + clearExpressions(aNewFeature); + + return aNewFeature; +} + +std::shared_ptr SketchPlugin_Sketch::plane(SketchPlugin_Sketch* theSketch) +{ + std::shared_ptr aData = theSketch->data(); + + std::shared_ptr anOrigin = std::dynamic_pointer_cast( + aData->attribute(SketchPlugin_Sketch::ORIGIN_ID())); + std::shared_ptr aDirX = std::dynamic_pointer_cast( + aData->attribute(SketchPlugin_Sketch::DIRX_ID())); + std::shared_ptr aNorm = std::dynamic_pointer_cast( + aData->attribute(SketchPlugin_Sketch::NORM_ID())); + + return std::shared_ptr(new GeomAPI_Ax3(anOrigin->pnt(), aDirX->dir(), aNorm->dir())); +}