X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketchSolver%2FSketchSolver_ConstraintMultiTranslation.cpp;h=a16619076004ab610d885c29d606a6d642839b6f;hb=26a7489eb80cc314d2719eb88c243affff2d7428;hp=381c8641b71770392680a17696b53140416e1c85;hpb=f0571dbfc2ca0a38ce29c57e74c841ebd001e5f9;p=modules%2Fshaper.git diff --git a/src/SketchSolver/SketchSolver_ConstraintMultiTranslation.cpp b/src/SketchSolver/SketchSolver_ConstraintMultiTranslation.cpp index 381c8641b..a16619076 100644 --- a/src/SketchSolver/SketchSolver_ConstraintMultiTranslation.cpp +++ b/src/SketchSolver/SketchSolver_ConstraintMultiTranslation.cpp @@ -1,146 +1,119 @@ +// Copyright (C) 2014-2017 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 -#include #include +#include -#include -#include - -#include -#include -#include -#include -#include -#include +#include -#include -#include +#include -#include +#include +#include void SketchSolver_ConstraintMultiTranslation::getAttributes( - Slvs_hEntity& theStartPoint, Slvs_hEntity& theEndPoint, - std::vector< std::vector >& thePoints, - std::vector< std::vector >& theEntities) + EntityWrapperPtr& theStartPoint, EntityWrapperPtr& theEndPoint, + bool& theFullValue, std::list& theEntities) { DataPtr aData = myBaseConstraint->data(); - AttributePtr aStartPointAttr = aData->attribute(SketchPlugin_MultiTranslation::START_POINT_ID()); - AttributePtr aEndPointAttr = aData->attribute(SketchPlugin_MultiTranslation::END_POINT_ID()); + AttributeRefAttrPtr aStartPointAttr = + aData->refattr(SketchPlugin_MultiTranslation::START_POINT_ID()); + AttributeRefAttrPtr aEndPointAttr = + aData->refattr(SketchPlugin_MultiTranslation::END_POINT_ID()); if (!aStartPointAttr || !aStartPointAttr->isInitialized() || !aEndPointAttr || !aEndPointAttr->isInitialized()) { myErrorMsg = SketchSolver_Error::NOT_INITIALIZED(); return; } - int aType = SLVS_E_UNKNOWN; // type of created entity - Slvs_hEntity anEntityID = myGroup->getAttributeId(aStartPointAttr); - if (anEntityID == SLVS_E_UNKNOWN) - anEntityID = changeEntity(aStartPointAttr, aType); - theStartPoint = anEntityID; - anEntityID = myGroup->getAttributeId(aEndPointAttr); - if (anEntityID == SLVS_E_UNKNOWN) - anEntityID = changeEntity(aEndPointAttr, aType); - theEndPoint = anEntityID; - - // Lists of objects and number of copies - AttributeRefListPtr anInitialRefList = std::dynamic_pointer_cast( - aData->attribute(SketchPlugin_Constraint::ENTITY_A())); - myNumberOfObjects = anInitialRefList->size(); - myNumberOfCopies = (size_t) aData->integer(SketchPlugin_MultiTranslation::NUMBER_OF_COPIES_ID())->value(); - AttributeRefListPtr aRefList = std::dynamic_pointer_cast( - myBaseConstraint->attribute(SketchPlugin_Constraint::ENTITY_B())); - if (!aRefList) { - myErrorMsg = SketchSolver_Error::INCORRECT_ATTRIBUTE(); - return; - } + myType = CONSTRAINT_MULTI_TRANSLATION; - // Obtain all points of initial features and store them into separate lists - // containing their translated copies. - // Also all circles and arc collected too, because they will be constrained by equal radii. - FeaturePtr aFeature; - ResultConstructionPtr aRC; - static const size_t MAX_POINTS = 3; - std::vector aPoints[MAX_POINTS]; // lists of points of features - std::vector anEntities; // list of translated entities - std::list anObjectList = aRefList->list(); - std::list::iterator anObjectIter = anObjectList.begin(); - while (anObjectIter != anObjectList.end()) { - for (size_t i = 0; i < MAX_POINTS; i++) - aPoints[i].clear(); - anEntities.clear(); - - for (size_t i = 0; i <= myNumberOfCopies && anObjectIter != anObjectList.end(); i++, anObjectIter++) { - aFeature = ModelAPI_Feature::feature(*anObjectIter); - if (!aFeature) - continue; - anEntityID = changeEntity(aFeature, aType); - anEntities.push_back(anEntityID); - Slvs_Entity anEntity = myStorage->getEntity(anEntityID); - switch (aType) { - case SLVS_E_POINT_IN_2D: - case SLVS_E_POINT_IN_3D: - aPoints[0].push_back(anEntityID); - break; - case SLVS_E_LINE_SEGMENT: - aPoints[0].push_back(anEntity.point[0]); // start point of line - aPoints[1].push_back(anEntity.point[1]); // end point of line - break; - case SLVS_E_CIRCLE: - aPoints[0].push_back(anEntity.point[0]); // center of circle - break; - case SLVS_E_ARC_OF_CIRCLE: - aPoints[0].push_back(anEntity.point[0]); // center of arc - aPoints[1].push_back(anEntity.point[1]); // start point of arc - aPoints[2].push_back(anEntity.point[2]); // end point of arc - break; - default: - myErrorMsg = SketchSolver_Error::INCORRECT_ATTRIBUTE(); - return; - } - } + myStorage->update(AttributePtr(aStartPointAttr)); + theStartPoint = myStorage->entity(AttributePtr(aStartPointAttr)); + myStorage->update(AttributePtr(aEndPointAttr)); + theEndPoint = myStorage->entity(AttributePtr(aEndPointAttr)); - for (size_t i = 0; i < MAX_POINTS; ++i) - if (!aPoints[i].empty()) - thePoints.push_back(aPoints[i]); - if (!anEntities.empty()) - theEntities.push_back(anEntities); - } + AttributeStringPtr aMethodTypeAttr = aData->string(SketchPlugin_MultiTranslation::VALUE_TYPE()); + theFullValue = aMethodTypeAttr->value() != "SingleValue"; + + getEntities(theEntities); + + // add owner of start and end points of Multi-Translation to the list of monitored features + FeaturePtr anOwner = ModelAPI_Feature::feature(aStartPointAttr->attr()->owner()); + if (anOwner) + myOriginalFeatures.insert(anOwner); + anOwner = ModelAPI_Feature::feature(aEndPointAttr->attr()->owner()); + if (anOwner) + myOriginalFeatures.insert(anOwner); } void SketchSolver_ConstraintMultiTranslation::process() { cleanErrorMsg(); - if (!myBaseConstraint || !myStorage || myGroup == 0) { - /// TODO: Put error message here + if (!myBaseConstraint || !myStorage) { + // Not enough parameters are assigned return; } - if (!mySlvsConstraints.empty()) // some data is changed, update constraint - update(myBaseConstraint); - Slvs_hEntity aStartPoint, aEndPoint; - std::vector > anEntitiesAndCopies; - getAttributes(aStartPoint, aEndPoint, myPointsAndCopies, anEntitiesAndCopies); + EntityWrapperPtr aStartPoint, aEndPoint; + std::list aBaseEntities; + getAttributes(aStartPoint, aEndPoint, myIsFullValue, aBaseEntities); if (!myErrorMsg.empty()) return; - // Create translation line - if (myTranslationLine == SLVS_E_UNKNOWN) { - Slvs_Entity aTranslationLine = Slvs_MakeLineSegment(SLVS_E_UNKNOWN, myGroup->getId(), - myGroup->getWorkplaneId(), aStartPoint, aEndPoint); - aTranslationLine.h = myStorage->addEntity(aTranslationLine); - myTranslationLine = aTranslationLine.h; - } else { - Slvs_Entity aTranslationLine = myStorage->getEntity(myTranslationLine); - if (aTranslationLine.point[0] != aStartPoint || aTranslationLine.point[1] != aEndPoint) { - aTranslationLine.point[0] = aStartPoint; - aTranslationLine.point[1] = aEndPoint; - myStorage->updateEntity(aTranslationLine); - } - } - myAdjusted = false; - processEntities(anEntitiesAndCopies); adjustConstraint(); + + myStorage->subscribeUpdates(this, PlaneGCSSolver_UpdateFeature::GROUP()); +} + +const std::string& SketchSolver_ConstraintMultiTranslation::nameNbObjects() +{ + return SketchPlugin_MultiTranslation::NUMBER_OF_OBJECTS_ID(); +} + +void SketchSolver_ConstraintMultiTranslation::updateLocal() +{ + DataPtr aData = myBaseConstraint->data(); + AttributePoint2DPtr aStartPointAttribute = GeomDataAPI_Point2D::getPoint2D(aData, + SketchPlugin_MultiTranslation::START_POINT_ID()); + AttributePoint2DPtr anEndPointAttribute = GeomDataAPI_Point2D::getPoint2D(aData, + SketchPlugin_MultiTranslation::END_POINT_ID()); + AttributeStringPtr aMethodTypeAttr = aData->string(SketchPlugin_MultiTranslation::VALUE_TYPE()); + bool aFullValue = aMethodTypeAttr->value() != "SingleValue"; + + bool aStartPointChanged = aStartPointAttribute != myStartPointAttribute; + bool anEndPointChanged = anEndPointAttribute != myEndPointAttribute; + bool isMethodChanged = aFullValue != myIsFullValue; + + if (aStartPointChanged) + myStartPointAttribute = aStartPointAttribute; + if (aStartPointChanged) + myEndPointAttribute = anEndPointAttribute; + if (isMethodChanged) + myIsFullValue = aFullValue; + + if (aStartPointChanged || anEndPointChanged || isMethodChanged) + myAdjusted = false; } void SketchSolver_ConstraintMultiTranslation::adjustConstraint() @@ -148,31 +121,38 @@ void SketchSolver_ConstraintMultiTranslation::adjustConstraint() if (myAdjusted) return; - Slvs_Entity aTranslationLine = myStorage->getEntity(myTranslationLine); - Slvs_hConstraint aFixed; // temporary variable - // Set the translation line unchanged during constraint recalculation - for (int i = 0; i < 2; i++) { - if (myStorage->isPointFixed(aTranslationLine.point[i], aFixed, true)) - continue; - Slvs_Constraint aConstraint = Slvs_MakeConstraint( - SLVS_E_UNKNOWN, myGroup->getId(), SLVS_C_WHERE_DRAGGED, myGroup->getWorkplaneId(), 0.0, - aTranslationLine.point[i], SLVS_E_UNKNOWN, SLVS_E_UNKNOWN, SLVS_E_UNKNOWN); - aConstraint.h = myStorage->addConstraint(aConstraint); - myStorage->addTemporaryConstraint(aConstraint.h); + // Obtain delta between start and end points of translation + AttributeRefAttrPtr aStartEnd[2] = { + myBaseConstraint->refattr(SketchPlugin_MultiTranslation::START_POINT_ID()), + myBaseConstraint->refattr(SketchPlugin_MultiTranslation::END_POINT_ID()) + }; + double aCoords[2][2]; + for (int i = 0; i < 2; ++i) + { + std::shared_ptr aPointWrapper = + std::dynamic_pointer_cast( + myStorage->entity(AttributePtr(aStartEnd[i]))); + if (aPointWrapper) + { + GCSPointPtr aPnt = aPointWrapper->point(); + aCoords[i][0] = *(aPnt->x); + aCoords[i][1] = *(aPnt->y); + } + else + { + AttributePoint2DPtr aPnt = + std::dynamic_pointer_cast(aStartEnd[i]->attr()); + aCoords[i][0] = aPnt->x(); + aCoords[i][1] = aPnt->y(); + } } - // Check if the distance between point is 0, no need to resolve constraints (just wait another values) - double aXY[4]; - for (int i = 0; i < 2; i++) { - Slvs_Entity aPnt = myStorage->getEntity(aTranslationLine.point[i]); - aXY[2*i] = myStorage->getParameter(aPnt.param[0]).val; - aXY[2*i+1] = myStorage->getParameter(aPnt.param[1]).val; - } - myDelta[0] = aXY[2] - aXY[0]; - myDelta[1] = aXY[3] - aXY[1]; - if (fabs(myDelta[0]) + fabs(myDelta[1]) < tolerance) { - myStorage->setNeedToResolve(false); - return; + myDelta[0] = aCoords[1][0] - aCoords[0][0]; + myDelta[1] = aCoords[1][1] - aCoords[0][1]; + + if (myIsFullValue && myNumberOfCopies > 0) { + myDelta[0] /= myNumberOfCopies; + myDelta[1] /= myNumberOfCopies; } SketchSolver_ConstraintMulti::adjustConstraint(); @@ -199,7 +179,3 @@ void SketchSolver_ConstraintMultiTranslation::transformRelative(double& theX, do theY += myDelta[1]; } -const std::string& SketchSolver_ConstraintMultiTranslation::nameNbCopies() -{ - return SketchPlugin_MultiTranslation::NUMBER_OF_COPIES_ID(); -}