X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketchPlugin%2FSketchPlugin_Projection.cpp;h=2a034e0f5f72c8bd6db7f6e6ab68263df23e8c41;hb=b5893b0a30fac08134c24de4565cb513a43affa6;hp=de39ac7816b00a37d696b6492912c14b577e91d6;hpb=586e0f3d89e48652e2ec3587f5e5584e13109b4a;p=modules%2Fshaper.git diff --git a/src/SketchPlugin/SketchPlugin_Projection.cpp b/src/SketchPlugin/SketchPlugin_Projection.cpp index de39ac781..2a034e0f5 100644 --- a/src/SketchPlugin/SketchPlugin_Projection.cpp +++ b/src/SketchPlugin/SketchPlugin_Projection.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include @@ -17,6 +18,7 @@ #include #include #include +#include #include #include @@ -44,6 +46,8 @@ void SketchPlugin_Projection::initDerivedClassAttributes() data()->addAttribute(EXTERNAL_ID(), ModelAPI_AttributeSelection::typeId()); ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), EXTERNAL_ID()); + + ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), AUXILIARY_ID()); } void SketchPlugin_Projection::execute() @@ -53,56 +57,19 @@ void SketchPlugin_Projection::execute() return; FeaturePtr aProjection = ModelAPI_Feature::feature(aRefAttr->object()); - bool hasResult = lastResult(); + if (!lastResult().get() && aProjection->lastResult().get()) { + ResultConstructionPtr aConstr = document()->createConstruction(data()); + aConstr->setShape(aProjection->lastResult()->shape()); + aConstr->setIsInHistory(false); + aConstr->setDisplayed(false); + setResult(aConstr); - std::shared_ptr anEdge; - if (aProjection->getKind() == SketchPlugin_Line::ID()) { - std::shared_ptr aStartPnt = std::dynamic_pointer_cast( - aProjection->attribute(SketchPlugin_Line::START_ID())); - std::shared_ptr aEndPnt = std::dynamic_pointer_cast( - aProjection->attribute(SketchPlugin_Line::END_ID())); - - // edge to store result - std::shared_ptr aFirst = sketch()->to3D(aStartPnt->x(), aStartPnt->y()); - std::shared_ptr aLast = sketch()->to3D(aEndPnt->x(), aEndPnt->y()); - anEdge = GeomAlgoAPI_EdgeBuilder::line(aFirst, aLast); - } - else { - std::shared_ptr aSketchPlane = sketch()->plane(); - std::shared_ptr aNormal = aSketchPlane->direction(); - - if (aProjection->getKind() == SketchPlugin_Circle::ID()) { - std::shared_ptr aCenterPnt = std::dynamic_pointer_cast( - aProjection->attribute(SketchPlugin_Circle::CENTER_ID())); - - // edge to store result - std::shared_ptr aCenter = sketch()->to3D(aCenterPnt->x(), aCenterPnt->y()); - double aRadius = aProjection->real(SketchPlugin_Circle::RADIUS_ID())->value(); - anEdge = GeomAlgoAPI_EdgeBuilder::lineCircle(aCenter, aNormal, aRadius); - } - else if (aProjection->getKind() == SketchPlugin_Arc::ID()) { - std::shared_ptr aCenterPnt = std::dynamic_pointer_cast( - aProjection->attribute(SketchPlugin_Arc::CENTER_ID())); - std::shared_ptr aStartPnt = std::dynamic_pointer_cast( - aProjection->attribute(SketchPlugin_Arc::START_ID())); - std::shared_ptr aEndPnt = std::dynamic_pointer_cast( - aProjection->attribute(SketchPlugin_Arc::END_ID())); - - // edge to store result - std::shared_ptr aCenter = sketch()->to3D(aCenterPnt->x(), aCenterPnt->y()); - std::shared_ptr aFirst = sketch()->to3D(aStartPnt->x(), aStartPnt->y()); - std::shared_ptr aLast = sketch()->to3D(aEndPnt->x(), aEndPnt->y()); - anEdge = GeomAlgoAPI_EdgeBuilder::lineCircleArc(aCenter, aFirst, aLast, aNormal); - } + aProjection->selection(EXTERNAL_ID())->setValue(lastResult(), lastResult()->shape()); } - std::shared_ptr aConstr = document()->createConstruction(data()); - aConstr->setShape(anEdge); - aConstr->setIsInHistory(false); - setResult(aConstr); - - if (!hasResult) - aProjection->selection(EXTERNAL_ID())->setValue(lastResult(), lastResult()->shape()); + // is sketch plane is changed (issue 1791), attribute of projection is not changed, but + // projection must be fully recomputed + computeProjection(EXTERNAL_FEATURE_ID()); } void SketchPlugin_Projection::move(double theDeltaX, double theDeltaY) @@ -127,7 +94,8 @@ void SketchPlugin_Projection::computeProjection(const std::string& theID) std::shared_ptr anEdge; if (aExtFeature && aExtFeature->value() && aExtFeature->value()->isEdge()) { anEdge = std::shared_ptr(new GeomAPI_Edge(aExtFeature->value())); - } else if (aExtFeature->context() && aExtFeature->context()->shape() && aExtFeature->context()->shape()->isEdge()) { + } else if (aExtFeature->context() && aExtFeature->context()->shape() && + aExtFeature->context()->shape()->isEdge()) { anEdge = std::shared_ptr(new GeomAPI_Edge(aExtFeature->context()->shape())); } if (!anEdge.get()) @@ -139,12 +107,16 @@ void SketchPlugin_Projection::computeProjection(const std::string& theID) aProjection = ModelAPI_Feature::feature(aRefAttr->object()); // if the type of feature differs with already selected, remove it and create once again - if (aProjection) { + bool hasPrevProj = aProjection.get() != 0; + if (hasPrevProj) { if ((anEdge->isLine() && aProjection->getKind() != SketchPlugin_Line::ID()) || (anEdge->isCircle() && aProjection->getKind() != SketchPlugin_Circle::ID()) || (anEdge->isArc() && aProjection->getKind() != SketchPlugin_Arc::ID())) { DocumentPtr aDoc = sketch()->document(); - aDoc->removeFeature(aProjection); + + std::set aFeaturesToBeRemoved; + aFeaturesToBeRemoved.insert(aProjection); + ModelAPI_Tools::removeFeaturesAndReferences(aFeaturesToBeRemoved); aProjection = FeaturePtr(); aRefAttr->setObject(aProjection); } @@ -152,6 +124,13 @@ void SketchPlugin_Projection::computeProjection(const std::string& theID) std::shared_ptr aSketchPlane = sketch()->plane(); + ResultConstructionPtr aResult = + 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 (anEdge->isLine()) { std::shared_ptr aFirst = aSketchPlane->project(anEdge->firstPoint()); std::shared_ptr aLast = aSketchPlane->project(anEdge->lastPoint()); @@ -161,7 +140,7 @@ void SketchPlugin_Projection::computeProjection(const std::string& theID) if (aFirstInSketch->distance(aLastInSketch) < tolerance) return; // line is semi-orthogonal to the sketch plane - if (!aProjection) + if (!hasPrevProj) aProjection = sketch()->addFeature(SketchPlugin_Line::ID()); // update attributes of projection @@ -179,11 +158,12 @@ void SketchPlugin_Projection::computeProjection(const std::string& theID) std::shared_ptr aCenter = aSketchPlane->project(aCircle->center()); std::shared_ptr aCenterInSketch = sketch()->to2D(aCenter); - if (!aProjection) + if (!hasPrevProj) aProjection = sketch()->addFeature(SketchPlugin_Circle::ID()); // update attributes of projection - std::shared_ptr aCenterPnt = std::dynamic_pointer_cast( + std::shared_ptr aCenterPnt = + std::dynamic_pointer_cast( aProjection->attribute(SketchPlugin_Circle::CENTER_ID())); aCenterPnt->setValue(aCenterInSketch); aProjection->real(SketchPlugin_Circle::RADIUS_ID())->setValue(aRadius); @@ -198,24 +178,35 @@ void SketchPlugin_Projection::computeProjection(const std::string& theID) std::shared_ptr aCenter = aSketchPlane->project(aCircle->center()); std::shared_ptr aCenterInSketch = sketch()->to2D(aCenter); - if (!aProjection) + if (!hasPrevProj) aProjection = sketch()->addFeature(SketchPlugin_Arc::ID()); // update attributes of projection - std::shared_ptr aCenterPnt = std::dynamic_pointer_cast( + std::shared_ptr aCenterPnt = + std::dynamic_pointer_cast( aProjection->attribute(SketchPlugin_Arc::CENTER_ID())); - std::shared_ptr aStartPnt = std::dynamic_pointer_cast( + std::shared_ptr aStartPnt = + std::dynamic_pointer_cast( aProjection->attribute(SketchPlugin_Arc::START_ID())); - std::shared_ptr aEndPnt = std::dynamic_pointer_cast( + std::shared_ptr aEndPnt = + std::dynamic_pointer_cast( aProjection->attribute(SketchPlugin_Arc::END_ID())); aStartPnt->setValue(aFirstInSketch); aEndPnt->setValue(aLastInSketch); aCenterPnt->setValue(aCenterInSketch); } + aProjection->boolean(COPY_ID())->setValue(true); aProjection->execute(); aRefAttr->setObject(aProjection); - if (theID == EXTERNAL_FEATURE_ID()) - selection(EXTERNAL_ID())->setValue(aExtFeature->context(), aExtFeature->context()->shape()); + if (theID == EXTERNAL_FEATURE_ID()) { + selection(EXTERNAL_ID())->setValue(aExtFeature->context(), aExtFeature->value()); + + if (aResult) { + aResult->setShape(aProjection->lastResult()->shape()); + setResult(aResult); + aProjection->selection(EXTERNAL_ID())->setValue(lastResult(), lastResult()->shape()); + } + } }