X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketchPlugin%2FSketchPlugin_Projection.cpp;h=91b45643c5b46e6cf5848b9f9d4fc059d6b5a264;hb=15fc1914159f4671968f56eb32d878a022edcd8b;hp=254ccafc99899862470662f77a7daa3ce5eacff0;hpb=e7936a7615b6be5d69d4428088e6249f541480b8;p=modules%2Fshaper.git diff --git a/src/SketchPlugin/SketchPlugin_Projection.cpp b/src/SketchPlugin/SketchPlugin_Projection.cpp index 254ccafc9..91b45643c 100644 --- a/src/SketchPlugin/SketchPlugin_Projection.cpp +++ b/src/SketchPlugin/SketchPlugin_Projection.cpp @@ -75,14 +75,17 @@ void SketchPlugin_Projection::execute() return; FeaturePtr aProjection = ModelAPI_Feature::feature(aRefAttr->object()); - if (!lastResult().get() && aProjection->lastResult().get()) { + if (!lastResult().get()) { + bool hasProjResult = aProjection->lastResult().get() != NULL; ResultConstructionPtr aConstr = document()->createConstruction(data()); - aConstr->setShape(aProjection->lastResult()->shape()); + if (hasProjResult) + aConstr->setShape(aProjection->lastResult()->shape()); aConstr->setIsInHistory(false); aConstr->setDisplayed(false); setResult(aConstr); - aProjection->selection(EXTERNAL_ID())->setValue(lastResult(), lastResult()->shape()); + if (hasProjResult) + aProjection->selection(EXTERNAL_ID())->setValue(lastResult(), lastResult()->shape()); } // is sketch plane is changed (issue 1791), attribute of projection is not changed, but @@ -162,7 +165,8 @@ void SketchPlugin_Projection::computeProjection(const std::string& theID) std::dynamic_pointer_cast(lastResult()); if (aResult && aResult->shape() && theID == EXTERNAL_FEATURE_ID()) { aResult->setShape(std::shared_ptr()); - aProjection->selection(EXTERNAL_ID())->setValue(lastResult(), lastResult()->shape()); + if (aProjection) + aProjection->selection(EXTERNAL_ID())->setValue(lastResult(), lastResult()->shape()); } if (aVertex) { @@ -200,6 +204,10 @@ void SketchPlugin_Projection::computeProjection(const std::string& theID) std::shared_ptr aCircle = anEdge->circle(); double aRadius = aCircle->radius(); + double aNormalsDot = aCircle->normal()->dot(aSketchPlane->direction()); + if (fabs(fabs(aNormalsDot) - 1.0) > tolerance) + return; // circle is not in the plane, parallel to the sketch plane + std::shared_ptr aCenter = aSketchPlane->project(aCircle->center()); std::shared_ptr aCenterInSketch = sketch()->to2D(aCenter); @@ -223,7 +231,11 @@ void SketchPlugin_Projection::computeProjection(const std::string& theID) std::shared_ptr aCenter = aSketchPlane->project(aCircle->center()); std::shared_ptr aCenterInSketch = sketch()->to2D(aCenter); - bool isInversed = aCircle->normal()->dot(aSketchPlane->direction()) < 0.; + double aNormalsDot = aCircle->normal()->dot(aSketchPlane->direction()); + if (fabs(fabs(aNormalsDot) - 1.0) > tolerance) + return; // arc is not in the plane, parallel to the sketch plane + + bool isInversed = aNormalsDot < 0.; if (!hasPrevProj) aProjection = sketch()->addFeature(SketchPlugin_Arc::ID()); @@ -245,8 +257,9 @@ void SketchPlugin_Projection::computeProjection(const std::string& theID) aCenterPnt->setValue(aCenterInSketch); aProjection->boolean(SketchPlugin_Arc::REVERSED_ID())->setValue(isInversed); - aProjection->data()->blockSendAttributeUpdated(aWasBlocked, false); - } + aProjection->data()->blockSendAttributeUpdated(aWasBlocked); + } else + return; aProjection->boolean(COPY_ID())->setValue(true); aProjection->execute(); @@ -258,7 +271,8 @@ void SketchPlugin_Projection::computeProjection(const std::string& theID) if (aResult) { aResult->setShape(aProjection->lastResult()->shape()); setResult(aResult); - aProjection->selection(EXTERNAL_ID())->setValue(lastResult(), lastResult()->shape()); + GeomShapePtr anEmptyVal; + aProjection->selection(EXTERNAL_ID())->setValue(lastResult(), anEmptyVal); } } }