X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketchSolver%2FSketchSolver_Group.cpp;h=5a66f99b006ed8b2f3764f0d53d404b6223737d2;hb=97c06c5cd9fc736f9b5a1dacde369a9d7b5be703;hp=6f855c97601e4f104516520f3764b4545c063de0;hpb=449bcc64cb436f1ccf664236f431600b30ce84b4;p=modules%2Fshaper.git diff --git a/src/SketchSolver/SketchSolver_Group.cpp b/src/SketchSolver/SketchSolver_Group.cpp index 6f855c976..5a66f99b0 100644 --- a/src/SketchSolver/SketchSolver_Group.cpp +++ b/src/SketchSolver/SketchSolver_Group.cpp @@ -1,8 +1,21 @@ -// Copyright (C) 2014-20xx CEA/DEN, EDF R&D - -// File: SketchSolver_Group.cpp -// Created: 27 May 2014 -// Author: Artem ZHIDKOV +// Copyright (C) 2014-2019 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 +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// #include "SketchSolver_Group.h" #include @@ -60,14 +73,14 @@ static void sendMessage(const char* theMessageName, // ======================================================== SketchSolver_Group::SketchSolver_Group(const CompositeFeaturePtr& theWorkplane) - : mySketch(theWorkplane), - myPrevResult(PlaneGCSSolver_Solver::STATUS_UNKNOWN), - myDOF(0), + : myPrevResult(PlaneGCSSolver_Solver::STATUS_UNKNOWN), + myDOF(-1), myIsEventsBlocked(false), myMultiConstraintUpdateStack(0) { mySketchSolver = SolverPtr(new PlaneGCSSolver_Solver); myStorage = StoragePtr(new PlaneGCSSolver_Storage(mySketchSolver)); + updateSketch(theWorkplane); } SketchSolver_Group::~SketchSolver_Group() @@ -110,12 +123,39 @@ bool SketchSolver_Group::changeConstraint( return true; } +bool SketchSolver_Group::updateSketch(CompositeFeaturePtr theSketch) +{ + static const double THE_TOLERANCE = 1.e-7; + bool isChanged = theSketch != mySketch; + + AttributePointPtr anOrigin = std::dynamic_pointer_cast( + theSketch->attribute(SketchPlugin_Sketch::ORIGIN_ID())); + AttributeDirPtr aNorm = std::dynamic_pointer_cast( + theSketch->attribute(SketchPlugin_Sketch::NORM_ID())); + AttributeDirPtr aDirX = std::dynamic_pointer_cast( + theSketch->attribute(SketchPlugin_Sketch::DIRX_ID())); + + isChanged = isChanged + || (mySketchOrigin && anOrigin && anOrigin->pnt()->distance(mySketchOrigin) > THE_TOLERANCE) + || (mySketchNormal && aNorm && aNorm->xyz()->distance(mySketchNormal->xyz()) > THE_TOLERANCE) + || (mySketchXDir && aDirX && aDirX->xyz()->distance(mySketchXDir->xyz()) > THE_TOLERANCE); + + if (isChanged) { + mySketch = theSketch; + mySketchOrigin = anOrigin->pnt(); + mySketchNormal = aNorm->dir(); + mySketchXDir = aDirX->dir(); + + myStorage->notify(theSketch); + } + return true; +} + bool SketchSolver_Group::updateFeature(FeaturePtr theFeature) { return myStorage->update(theFeature); } -#ifdef SUPPORT_NEW_MOVE template static SolverConstraintPtr move(StoragePtr theStorage, SolverPtr theSketchSolver, @@ -138,12 +178,10 @@ static SolverConstraintPtr move(StoragePtr theStorage, if (aConstraint) { SolverConstraintPtr(aConstraint)->process(theStorage, theEventsBlocked); if (aConstraint->error().empty()) { - if (!theStorage->isEmpty()) - theStorage->setNeedToResolve(true); - - theSketchSolver->initialize(); aConstraint->startPoint(theFrom); + theSketchSolver->initialize(); aConstraint->moveTo(theTo); + theStorage->setNeedToResolve(true); } else theStorage->notify(aConstraint->movedFeature()); } @@ -170,35 +208,6 @@ bool SketchSolver_Group::movePoint(AttributePtr theAttribute, setTemporary(aConstraint); return true; } -#else -bool SketchSolver_Group::moveFeature(FeaturePtr theFeature) -{ - bool isFeatureExists = (myStorage->entity(theFeature).get() != 0); - if (myDOF == 0 && isFeatureExists) { - // avoid moving elements of fully constrained sketch - myStorage->refresh(); - return true; - } - - // Create temporary Fixed constraint - std::shared_ptr aConstraint = - PlaneGCSSolver_Tools::createMovementConstraint(theFeature); - if (!aConstraint) - return false; - SolverConstraintPtr(aConstraint)->process(myStorage, myIsEventsBlocked); - if (aConstraint->error().empty()) { - setTemporary(aConstraint); - if (!myStorage->isEmpty()) - myStorage->setNeedToResolve(true); - - mySketchSolver->initialize(); - aConstraint->moveFeature(); - } else - myStorage->notify(theFeature); - - return true; -} -#endif // ============================================================================ // Function: resolveConstraints @@ -235,6 +244,9 @@ bool SketchSolver_Group::resolveConstraints() removeTemporaryConstraints(); aResult = mySketchSolver->solve(); } + // check degenerated geometry after constraints resolving + if (aResult == PlaneGCSSolver_Solver::STATUS_OK) + aResult = myStorage->checkDegeneratedGeometry(); } catch (...) { getWorkplane()->string(SketchPlugin_Sketch::SOLVER_ERROR()) ->setValue(SketchSolver_Error::SOLVESPACE_CRASH()); @@ -280,8 +292,10 @@ bool SketchSolver_Group::resolveConstraints() mySketchSolver->undo(); if (!myConstraints.empty()) { // the error message should be changed before sending the message - getWorkplane()->string(SketchPlugin_Sketch::SOLVER_ERROR()) - ->setValue(SketchSolver_Error::CONSTRAINTS()); + const std::string& aErrorMsg = aResult == PlaneGCSSolver_Solver::STATUS_DEGENERATED ? + SketchSolver_Error::DEGENERATED_GEOMETRY() : + SketchSolver_Error::CONSTRAINTS(); + getWorkplane()->string(SketchPlugin_Sketch::SOLVER_ERROR())->setValue(aErrorMsg); if (myPrevResult != aResult || myPrevResult == PlaneGCSSolver_Solver::STATUS_UNKNOWN || myPrevResult == PlaneGCSSolver_Solver::STATUS_FAILED) { @@ -303,10 +317,25 @@ bool SketchSolver_Group::resolveConstraints() myPrevResult = aResult; } } + + // show degrees of freedom only if the degenerated geometry appears + if (aResult == PlaneGCSSolver_Solver::STATUS_DEGENERATED) + computeDoF(); + } + + } + else if (isGroupEmpty && isWorkplaneValid()) { + // clear error related to previously degenerated entities + if (myPrevResult == PlaneGCSSolver_Solver::STATUS_DEGENERATED) { + getWorkplane()->string(SketchPlugin_Sketch::SOLVER_ERROR())->setValue(""); + myPrevResult = PlaneGCSSolver_Solver::STATUS_OK; + // the error message should be changed before sending the message + myConflictingConstraints.clear(); + sendMessage(EVENT_SOLVER_REPAIRED, myConflictingConstraints); } - } else if (isGroupEmpty && isWorkplaneValid()) computeDoF(); + } removeTemporaryConstraints(); myStorage->setNeedToResolve(false); return aResolved; @@ -329,9 +358,9 @@ void SketchSolver_Group::computeDoF() aDoFMsg << "DoF (degrees of freedom) = " << aDoF; mySketch->string(SketchPlugin_Sketch::SOLVER_DOF())->setValue(aDoFMsg.str()); - if (aDoF > 0 && myDOF == 0) + if (aDoF > 0 && myDOF <= 0) sendMessage(EVENT_SKETCH_UNDER_CONSTRAINED, mySketch, aDoF); - else if (aDoF == 0 && myDOF > 0) + else if (aDoF == 0 && myDOF != 0) sendMessage(EVENT_SKETCH_FULLY_CONSTRAINED, mySketch, aDoF); else if (aDoF < 0) sendMessage(EVENT_SKETCH_OVER_CONSTRAINED, mySketch, aDoF);