+// Copyright (C) 2014-2023 CEA, EDF
+//
+// 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_ConstraintMultiTranslation.h>
#include <SketchSolver_Error.h>
#include <SketchSolver_Manager.h>
+#include <PlaneGCSSolver_PointWrapper.h>
+
#include <SketchPlugin_MultiTranslation.h>
#include <ModelAPI_AttributeString.h>
bool& theFullValue, std::list<EntityWrapperPtr>& 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();
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<EntityWrapperPtr> 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<ConstraintWrapperPtr> aTransConstraints;
-
- std::list<EntityWrapperPtr>::iterator anEntIt = aBaseEntities.begin();
- for (; anEntIt != aBaseEntities.end(); ++anEntIt) {
- std::list<ConstraintWrapperPtr> aNewConstraints =
- aBuilder->createConstraint(myBaseConstraint, myGroupID, mySketchID, myType,
- 0.0, aFullValue, aStartPoint, aEndPoint, std::list<EntityWrapperPtr>(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()
if (isMethodChanged)
myIsFullValue = aFullValue;
- if (aStartPointChanged || anEndPointChanged || isMethodChanged) {
- DataPtr aData = myBaseConstraint->data();
- std::list<ConstraintWrapperPtr> aConstraints = myStorage->constraint(myBaseConstraint);
- std::list<ConstraintWrapperPtr>::const_iterator anIt = aConstraints.begin(),
- aLast = aConstraints.end();
- std::list<EntityWrapperPtr> anEntities;
- for (; anIt != aLast; anIt++) {
- ConstraintWrapperPtr aConstraint = *anIt;
- aConstraint->setIsFullValue(myIsFullValue);
- anEntities.clear();
-
- const std::list<EntityWrapperPtr>& aConstraintEntities = aConstraint->entities();
- std::list<EntityWrapperPtr>::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()
return;
// Obtain delta between start and end points of translation
- EntityWrapperPtr aStart = myStorage->entity(
- myBaseConstraint->attribute(SketchPlugin_MultiTranslation::START_POINT_ID()));
- std::list<ParameterWrapperPtr> aStartParams = aStart->parameters();
- EntityWrapperPtr aEnd = myStorage->entity(
- myBaseConstraint->attribute(SketchPlugin_MultiTranslation::END_POINT_ID()));
- std::list<ParameterWrapperPtr> 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<PlaneGCSSolver_PointWrapper> aPointWrapper =
+ std::dynamic_pointer_cast<PlaneGCSSolver_PointWrapper>(
+ 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<GeomDataAPI_Point2D>(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;
+ myDelta[1] /= myNumberOfCopies;
+ }
SketchSolver_ConstraintMulti::adjustConstraint();
}