X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketchSolver%2FSketchSolver_ConstraintMultiTranslation.cpp;h=a16619076004ab610d885c29d606a6d642839b6f;hb=26a7489eb80cc314d2719eb88c243affff2d7428;hp=2bea9a21774d8e3765694ad8a32a3c1af603763c;hpb=b98b3e6f3c213eece262930dca161c4d256cb2a9;p=modules%2Fshaper.git diff --git a/src/SketchSolver/SketchSolver_ConstraintMultiTranslation.cpp b/src/SketchSolver/SketchSolver_ConstraintMultiTranslation.cpp index 2bea9a217..a16619076 100644 --- a/src/SketchSolver/SketchSolver_ConstraintMultiTranslation.cpp +++ b/src/SketchSolver/SketchSolver_ConstraintMultiTranslation.cpp @@ -1,7 +1,29 @@ +// 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 @@ -13,8 +35,10 @@ void SketchSolver_ConstraintMultiTranslation::getAttributes( 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(); @@ -23,50 +47,43 @@ void SketchSolver_ConstraintMultiTranslation::getAttributes( myType = CONSTRAINT_MULTI_TRANSLATION; - myStorage->update(aStartPointAttr); - theStartPoint = myStorage->entity(aStartPointAttr); - myStorage->update(aEndPointAttr); - theEndPoint = myStorage->entity(aEndPointAttr); + myStorage->update(AttributePtr(aStartPointAttr)); + theStartPoint = myStorage->entity(AttributePtr(aStartPointAttr)); + myStorage->update(AttributePtr(aEndPointAttr)); + theEndPoint = myStorage->entity(AttributePtr(aEndPointAttr)); 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 || myGroupID == GID_UNKNOWN) { - /// TODO: Put error message here + if (!myBaseConstraint || !myStorage) { + // Not enough parameters are assigned return; } EntityWrapperPtr aStartPoint, aEndPoint; - bool aFullValue; std::list aBaseEntities; - getAttributes(aStartPoint, aEndPoint, aFullValue, aBaseEntities); + getAttributes(aStartPoint, aEndPoint, myIsFullValue, aBaseEntities); if (!myErrorMsg.empty()) return; - AttributeStringPtr aMethodTypeAttr = - myBaseConstraint->data()->string(SketchPlugin_MultiTranslation::VALUE_TYPE()); - - BuilderPtr aBuilder = SketchSolver_Manager::instance()->builder(); - std::list aTransConstraints; - - std::list::iterator anEntIt = aBaseEntities.begin(); - for (; anEntIt != aBaseEntities.end(); ++anEntIt) { - std::list aNewConstraints = - aBuilder->createConstraint(myBaseConstraint, myGroupID, mySketchID, myType, - 0.0, aFullValue, aStartPoint, aEndPoint, std::list(1, *anEntIt)); - aTransConstraints.insert(aTransConstraints.end(), aNewConstraints.begin(), aNewConstraints.end()); - } - - myStorage->addConstraint(myBaseConstraint, aTransConstraints); - myAdjusted = false; adjustConstraint(); + + myStorage->subscribeUpdates(this, PlaneGCSSolver_UpdateFeature::GROUP()); } const std::string& SketchSolver_ConstraintMultiTranslation::nameNbObjects() @@ -95,45 +112,8 @@ void SketchSolver_ConstraintMultiTranslation::updateLocal() if (isMethodChanged) myIsFullValue = aFullValue; - if (aStartPointChanged || anEndPointChanged || isMethodChanged) { - DataPtr aData = myBaseConstraint->data(); - std::list aConstraints = myStorage->constraint(myBaseConstraint); - std::list::const_iterator anIt = aConstraints.begin(), - aLast = aConstraints.end(); - std::list anEntities; - for (; anIt != aLast; anIt++) { - ConstraintWrapperPtr aConstraint = *anIt; - aConstraint->setIsFullValue(myIsFullValue); - anEntities.clear(); - - const std::list& aConstraintEntities = aConstraint->entities(); - std::list::const_iterator aSIt = aConstraintEntities.begin(), - aSLast = aConstraintEntities.end(); - EntityWrapperPtr aStartEntity = *aSIt++; - if (aStartPointChanged) { - AttributePtr aStartPointAttr = aData->attribute(SketchPlugin_MultiTranslation::START_POINT_ID()); - myStorage->update(aStartPointAttr); - aStartEntity = myStorage->entity(aStartPointAttr); - } - anEntities.push_back(aStartEntity); - - EntityWrapperPtr anEndEntity = *aSIt++; - if (anEndPointChanged) { - AttributePtr anEndPointAttr = aData->attribute(SketchPlugin_MultiTranslation::END_POINT_ID()); - myStorage->update(anEndPointAttr); - anEndEntity = myStorage->entity(anEndPointAttr); - } - anEntities.push_back(anEndEntity); - - for (; aSIt != aSLast; ++aSIt) - anEntities.push_back(*aSIt); - - aConstraint->setEntities(anEntities); - } - myStorage->addConstraint(myBaseConstraint, aConstraints); - + if (aStartPointChanged || anEndPointChanged || isMethodChanged) myAdjusted = false; - } } void SketchSolver_ConstraintMultiTranslation::adjustConstraint() @@ -142,15 +122,33 @@ void SketchSolver_ConstraintMultiTranslation::adjustConstraint() return; // Obtain delta between start and end points of translation - EntityWrapperPtr aStart = myStorage->entity( - myBaseConstraint->attribute(SketchPlugin_MultiTranslation::START_POINT_ID())); - std::list aStartParams = aStart->parameters(); - EntityWrapperPtr aEnd = myStorage->entity( - myBaseConstraint->attribute(SketchPlugin_MultiTranslation::END_POINT_ID())); - std::list aEndParams = aEnd->parameters(); - - myDelta[0] = aEndParams.front()->value() - aStartParams.front()->value(); - myDelta[1] = aEndParams.back()->value() - aStartParams.back()->value(); + 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(); + } + } + + myDelta[0] = aCoords[1][0] - aCoords[0][0]; + myDelta[1] = aCoords[1][1] - aCoords[0][1]; if (myIsFullValue && myNumberOfCopies > 0) { myDelta[0] /= myNumberOfCopies;