X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketchSolver%2FSketchSolver_Constraint.cpp;h=96051c3d01128d11ef79f375f255acb67cfaaabd;hb=68a3f0934001109743353b6cc2ac42d8b92bd868;hp=c382cdeb30e86ec4d051643104d75e95ec23aeec;hpb=4cbfb073803b0c753a8a31e677a5b786974cf983;p=modules%2Fshaper.git diff --git a/src/SketchSolver/SketchSolver_Constraint.cpp b/src/SketchSolver/SketchSolver_Constraint.cpp index c382cdeb3..96051c3d0 100644 --- a/src/SketchSolver/SketchSolver_Constraint.cpp +++ b/src/SketchSolver/SketchSolver_Constraint.cpp @@ -1,227 +1,158 @@ #include #include #include +#include #include #include #include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include #include #include #include #include +#include SketchSolver_Constraint::SketchSolver_Constraint( ConstraintPtr theConstraint) : myBaseConstraint(theConstraint), - myGroup(0) + myGroupID(GID_UNKNOWN), + myType(CONSTRAINT_UNKNOWN) { } -SketchSolver_Constraint::~SketchSolver_Constraint() -{ - std::map::const_iterator anIt1 = myValueMap.begin(); - for (; anIt1 != myValueMap.end(); anIt1++) - myStorage->removeParameter(anIt1->second); - myValueMap.clear(); - - std::map::const_iterator anIt2 = myAttributeMap.begin(); - for (; anIt2 != myAttributeMap.end(); anIt2++) - myStorage->removeEntity(anIt2->second); - myAttributeMap.clear(); - - std::map::const_iterator anIt3 = myFeatureMap.begin(); - for (; anIt3 != myFeatureMap.end(); anIt3++) - myStorage->removeEntity(anIt3->second); - myFeatureMap.clear(); - - std::vector::const_iterator anIt4 = mySlvsConstraints.begin(); - for (; anIt4 != mySlvsConstraints.end(); anIt4++) - myStorage->removeConstraint(*anIt4); - mySlvsConstraints.clear(); -} - -void SketchSolver_Constraint::setStorage(StoragePtr theStorage) +void SketchSolver_Constraint::process(StoragePtr theStorage, + const GroupID& theGroupID, + const EntityID& theSketchID) { myStorage = theStorage; + myGroupID = theGroupID; + mySketchID = theSketchID; + // Process constraint according to its type process(); } -void SketchSolver_Constraint::setGroup(SketchSolver_Group* theGroup) -{ - myGroup = theGroup; - process(); -} +SketchSolver_ConstraintType SketchSolver_Constraint::TYPE(ConstraintPtr theConstraint) +{ + const std::string& aType = theConstraint->getKind(); + if (aType == SketchPlugin_ConstraintCoincidence::ID()) + return CONSTRAINT_COINCIDENCE; + else if (aType == SketchPlugin_ConstraintRigid::ID()) + return CONSTRAINT_FIXED; + else if (aType == SketchPlugin_ConstraintHorizontal::ID()) + return CONSTRAINT_HORIZONTAL; + else if (aType == SketchPlugin_ConstraintVertical::ID()) + return CONSTRAINT_VERTICAL; + else if (aType == SketchPlugin_ConstraintAngle::ID()) + return CONSTRAINT_ANGLE; + else if (aType == SketchPlugin_ConstraintDistance::ID()) + return CONSTRAINT_DISTANCE; + else if (aType == SketchPlugin_ConstraintEqual::ID()) + return CONSTRAINT_EQUAL; + else if (aType == SketchPlugin_ConstraintLength::ID()) + return CONSTRAINT_PT_PT_DISTANCE; + else if (aType == SketchPlugin_ConstraintMirror::ID()) + return CONSTRAINT_SYMMETRIC; + else if (aType == SketchPlugin_ConstraintParallel::ID()) + return CONSTRAINT_PARALLEL; + else if (aType == SketchPlugin_ConstraintPerpendicular::ID()) + return CONSTRAINT_PERPENDICULAR; + else if (aType == SketchPlugin_ConstraintRadius::ID()) + return CONSTRAINT_RADIUS; + else if (aType == SketchPlugin_ConstraintTangent::ID()) + return CONSTRAINT_TANGENT; + return CONSTRAINT_UNKNOWN; +} void SketchSolver_Constraint::process() { cleanErrorMsg(); - if (!myBaseConstraint || !myStorage || myGroup == 0) { - /// TODO: Put error message here + if (!myBaseConstraint || !myStorage || myGroupID == GID_UNKNOWN) { + // Not enough parameters are assigned return; } - if (!mySlvsConstraints.empty()) // some data is changed, update constraint - update(myBaseConstraint); - int aConstrType = getType(); - double aValue = 0.0; - std::vector anAttributes; + SketchSolver_ConstraintType aConstrType = getType(); + double aValue; + std::vector anAttributes; getAttributes(aValue, anAttributes); if (!myErrorMsg.empty()) return; - - Slvs_hGroup aGroupID = myGroup->getId(); - Slvs_hEntity aWorkplaneID = myGroup->getWorkplaneId(); - Slvs_Constraint aConstraint; - if (mySlvsConstraints.empty()) - aConstraint = Slvs_MakeConstraint(SLVS_C_UNKNOWN, aGroupID, aConstrType, aWorkplaneID, - aValue, anAttributes[0], anAttributes[1], anAttributes[2], anAttributes[3]); - else { - aConstraint = myStorage->getConstraint(mySlvsConstraints[0]); - aConstraint.valA = aValue; - static const int aNbAttrs = 6; - Slvs_hEntity* aConstrAttrs[aNbAttrs] = { - &aConstraint.ptA, &aConstraint.ptB, - &aConstraint.entityA, &aConstraint.entityB, - &aConstraint.entityC, &aConstraint.entityD}; - std::vector::const_iterator anIter = anAttributes.begin(); - for (int i = 0; i < aNbAttrs && anIter != anAttributes.end(); i++, anIter++) - *(aConstrAttrs[i]) = *anIter; + if (anAttributes.empty()) { + myErrorMsg = SketchSolver_Error::INCORRECT_ATTRIBUTE(); + return; } + if (aConstrType == CONSTRAINT_UNKNOWN) + aConstrType = getType(); + + BuilderPtr aBuilder = SketchSolver_Manager::instance()->builder(); + std::list aNewConstraints = aBuilder->createConstraint( + myBaseConstraint, myGroupID, mySketchID, aConstrType, + aValue, anAttributes[0], anAttributes[1], anAttributes[2], anAttributes[3]); + myStorage->addConstraint(myBaseConstraint, aNewConstraints); - Slvs_hConstraint anID = myStorage->addConstraint(aConstraint); - if (mySlvsConstraints.empty()) - mySlvsConstraints.push_back(anID); - else - mySlvsConstraints[0] = anID; adjustConstraint(); } -void SketchSolver_Constraint::update(ConstraintPtr theConstraint) +void SketchSolver_Constraint::update() { cleanErrorMsg(); - if (theConstraint && theConstraint != myBaseConstraint) { - if (theConstraint->getKind() != myBaseConstraint->getKind()) - return; - remove(myBaseConstraint); - myBaseConstraint = theConstraint; - process(); - } - // Update all attributes - int aType; - std::map aRelocationMap; - std::map::iterator aFeatIter = myFeatureMap.begin(); - for (; aFeatIter != myFeatureMap.end(); aFeatIter++) { - Slvs_hEntity aPrevID = aFeatIter->second; - aFeatIter->second = changeEntity(aFeatIter->first, aType); - if (aFeatIter->second != aPrevID) - aRelocationMap[aPrevID] = aFeatIter->second; - } - std::map::iterator anAttrIter = myAttributeMap.begin(); - for (; anAttrIter != myAttributeMap.end(); anAttrIter++) { - Slvs_hEntity aPrevID = anAttrIter->second; - anAttrIter->second = changeEntity(anAttrIter->first, aType); - if (anAttrIter->second != aPrevID) - aRelocationMap[aPrevID] = anAttrIter->second; - } - - // Value if exists + std::list aWrapper = myStorage->constraint(myBaseConstraint); AttributeDoublePtr aValueAttr = std::dynamic_pointer_cast( - myBaseConstraint->data()->attribute(SketchPlugin_Constraint::VALUE())); - double aValue = aValueAttr ? aValueAttr->value() : 0.0; - - // Update constraint - std::vector::iterator aCIter = mySlvsConstraints.begin(); - for (; aCIter != mySlvsConstraints.end(); aCIter++) { - Slvs_Constraint aConstraint = myStorage->getConstraint(*aCIter); - aConstraint.valA = aValue; - Slvs_hEntity* aCoeffs[6] = { - &aConstraint.ptA, &aConstraint.ptB, - &aConstraint.entityA, &aConstraint.entityB, - &aConstraint.entityC, &aConstraint.entityD}; - for (int i = 0; i < 6; i++) { - if (*(aCoeffs[i]) == SLVS_E_UNKNOWN) - continue; - std::map::iterator aFound = aRelocationMap.find(*(aCoeffs[i])); - if (aFound != aRelocationMap.end()) - *(aCoeffs[i]) = aFound->second; - } - *aCIter = myStorage->addConstraint(aConstraint); + myBaseConstraint->attribute(SketchPlugin_Constraint::VALUE())); + if (aValueAttr) { + std::list::iterator aWIt = aWrapper.begin(); + for (; aWIt != aWrapper.end(); ++aWIt) + (*aWIt)->setValue(aValueAttr->value()); } + myStorage->addConstraint(myBaseConstraint, aWrapper); + adjustConstraint(); } -bool SketchSolver_Constraint::remove(ConstraintPtr theConstraint) +bool SketchSolver_Constraint::remove() { cleanErrorMsg(); - if (theConstraint && theConstraint != myBaseConstraint) - return false; - if (mySlvsConstraints.empty()) - return true; - bool isFullyRemoved = myStorage->removeConstraint(mySlvsConstraints.front()); - if (isFullyRemoved) { - myFeatureMap.clear(); - myAttributeMap.clear(); - myValueMap.clear(); - } else - cleanRemovedEntities(); - return true; -} - -void SketchSolver_Constraint::cleanRemovedEntities() -{ - std::set aRemovedParams; - std::set aRemovedEntities; - std::set aRemovedConstraints; - myStorage->getRemoved(aRemovedParams, aRemovedEntities, aRemovedConstraints); - std::map::iterator aFeatIt = myFeatureMap.begin(); - while (aFeatIt != myFeatureMap.end()) { - if (aRemovedEntities.find(aFeatIt->second) == aRemovedEntities.end()) { - aFeatIt++; - continue; - } - std::map::iterator aTmpIter = aFeatIt++; - myFeatureMap.erase(aTmpIter); - } - std::map::iterator anAttrIt = myAttributeMap.begin(); - while (anAttrIt != myAttributeMap.end()) { - if (aRemovedEntities.find(anAttrIt->second) == aRemovedEntities.end()) { - anAttrIt++; - continue; - } - std::map::iterator aTmpIter = anAttrIt++; - myAttributeMap.erase(aTmpIter); - } - std::map::iterator aValIt = myValueMap.begin(); - while (aValIt != myValueMap.end()) { - if (aRemovedParams.find(aValIt->second) == aRemovedParams.end()) { - aValIt++; - continue; - } - std::map::iterator aTmpIter = aValIt++; - myValueMap.erase(aTmpIter); - } + return myStorage->removeConstraint(myBaseConstraint); } void SketchSolver_Constraint::getAttributes( double& theValue, - std::vector& theAttributes) + std::vector& theAttributes) { static const int anInitNbOfAttr = 4; - theAttributes.assign(anInitNbOfAttr, SLVS_E_UNKNOWN); + theAttributes.assign(anInitNbOfAttr, EntityWrapperPtr()); DataPtr aData = myBaseConstraint->data(); + BuilderPtr aBuilder = SketchSolver_Manager::instance()->builder(); + + myType = TYPE(myBaseConstraint); AttributeDoublePtr aValueAttr = std::dynamic_pointer_cast( - aData->attribute(SketchPlugin_Constraint::VALUE())); + aData->attribute(SketchPlugin_Constraint::VALUE())); theValue = aValueAttr ? aValueAttr->value() : 0.0; int aPtInd = 0; // index of first point in the list of attributes - int aEntInd = 2; // index of first antity in the list of attributes + int aEntInd = 2; // index of first entity in the list of attributes std::list aConstrAttrs = aData->attributes(ModelAPI_AttributeRefAttr::typeId()); std::list::iterator anIter = aConstrAttrs.begin(); for (; anIter != aConstrAttrs.end(); anIter++) { @@ -232,18 +163,13 @@ void SketchSolver_Constraint::getAttributes( return; } - int aType = SLVS_E_UNKNOWN; // type of created entity - Slvs_hEntity anEntity = myGroup->getAttributeId(aRefAttr); - if (anEntity == SLVS_E_UNKNOWN) - anEntity = changeEntity(aRefAttr, aType); - else { - Slvs_Entity anEnt = myStorage->getEntity(anEntity); - aType = anEnt.type; - } + myStorage->update(*anIter/*, myGroupID*/); + EntityWrapperPtr anEntity = myStorage->entity(*anIter); - if (aType == SLVS_E_UNKNOWN) + SketchSolver_EntityType aType = anEntity->type(); + if (aType == ENTITY_UNKNOWN) continue; - else if (aType == SLVS_E_POINT_IN_2D || aType == SLVS_E_POINT_IN_3D) + else if (aType == ENTITY_POINT) theAttributes[aPtInd++] = anEntity; // the point is created else { // another entity (not a point) is created if (aEntInd < anInitNbOfAttr) @@ -255,302 +181,45 @@ void SketchSolver_Constraint::getAttributes( } } -Slvs_hEntity SketchSolver_Constraint::changeEntity(AttributeRefAttrPtr theAttribute, int& theType) +bool SketchSolver_Constraint::isUsed(FeaturePtr theFeature) const { - // Convert the object of the attribute to the feature - FeaturePtr aFeature; - if (theAttribute->isObject() && theAttribute->object()) { - ResultConstructionPtr aRC = std::dynamic_pointer_cast( - theAttribute->object()); - if (!aRC) { - myErrorMsg = SketchSolver_Error::NOT_INITIALIZED(); - return SLVS_E_UNKNOWN; - } - std::shared_ptr aDoc = aRC->document(); - aFeature = aDoc->feature(aRC); + const std::list& aCList = myStorage->constraint(myBaseConstraint); + std::list::const_iterator aCIt = aCList.begin(); + for (; aCIt != aCList.end(); ++aCIt) + if ((*aCIt)->isUsed(theFeature)) + return true; - return changeEntity(aFeature, theType); - } + std::list anAttrList = theFeature->data()->attributes(GeomDataAPI_Point2D::typeId()); + std::list::const_iterator anAttrIt = anAttrList.begin(); + for (; anAttrIt != anAttrList.end(); ++ anAttrIt) + if (isUsed(*anAttrIt)) + return true; - return changeEntity(theAttribute->attr(), theType); + return false; } -Slvs_hEntity SketchSolver_Constraint::changeEntity(AttributePtr theEntity, int& theType) +bool SketchSolver_Constraint::isUsed(AttributePtr theAttribute) const { - Slvs_hEntity aResult = SLVS_E_UNKNOWN; - if (!theEntity->isInitialized()) - return SLVS_E_UNKNOWN; - - // If the entity is already in the group, try to find it - std::map, Slvs_hEntity>::const_iterator anEntIter = - myAttributeMap.find(theEntity); - Slvs_Entity aCurrentEntity; - aCurrentEntity.h = SLVS_E_UNKNOWN; - if (anEntIter != myAttributeMap.end()) - aCurrentEntity = myStorage->getEntity(anEntIter->second); - else { - aResult = myGroup->getAttributeId(theEntity); - if (aResult != SLVS_E_UNKNOWN) { - Slvs_Entity anEnt = myStorage->getEntity(aResult); - theType = anEnt.type; - return aResult; - } + AttributePtr anAttribute = theAttribute; + AttributeRefAttrPtr aRefAttr = + std::dynamic_pointer_cast(anAttribute); + if (aRefAttr) { + if (aRefAttr->isObject()) + return isUsed(ModelAPI_Feature::feature(aRefAttr->object())); + else + anAttribute = aRefAttr->attr(); } - Slvs_hGroup aGroupID = myGroup->getId(); - // Point in 3D - std::shared_ptr aPoint = - std::dynamic_pointer_cast(theEntity); - if (aPoint) { - double aXYZ[3] = {aPoint->x(), aPoint->y(), aPoint->z()}; - Slvs_hParam aParams[3]; - for (int i = 0; i < 3; i++) { - Slvs_Param aPar = aCurrentEntity.h != SLVS_E_UNKNOWN ? - myStorage->getParameter(aCurrentEntity.param[i]) : - Slvs_MakeParam(SLVS_E_UNKNOWN, aGroupID, 0.0); - aPar.val = aXYZ[i]; - aParams[i] = myStorage->addParameter(aPar); - } - - if (aCurrentEntity.h == SLVS_E_UNKNOWN) // New entity - aCurrentEntity = Slvs_MakePoint3d(SLVS_E_UNKNOWN, aGroupID, aParams[0], aParams[1], aParams[2]); - else { // update entity data - for (int i = 0; i < 3; i++) - aCurrentEntity.param[i] = aParams[i]; - } - aResult = myStorage->addEntity(aCurrentEntity); - } else { - // All entities except 3D points are created on workplane. So, if there is no workplane yet, then error - Slvs_hEntity aWorkplaneID = myGroup->getWorkplaneId(); - if (aWorkplaneID == SLVS_E_UNKNOWN) - return SLVS_E_UNKNOWN; - - // Point in 2D - std::shared_ptr aPoint2D = - std::dynamic_pointer_cast(theEntity); - if (aPoint2D) { - double aXY[2] = {aPoint2D->x(), aPoint2D->y()}; - Slvs_hParam aParams[2]; - for (int i = 0; i < 2; i++) { - Slvs_Param aPar = aCurrentEntity.h != SLVS_E_UNKNOWN ? - myStorage->getParameter(aCurrentEntity.param[i]) : - Slvs_MakeParam(SLVS_E_UNKNOWN, aGroupID, 0.0); - aPar.val = aXY[i]; - aParams[i] = myStorage->addParameter(aPar); - } - - if (aCurrentEntity.h == SLVS_E_UNKNOWN) // New entity - aCurrentEntity = Slvs_MakePoint2d(SLVS_E_UNKNOWN, aGroupID, aWorkplaneID, aParams[0], aParams[1]); - else { // update entity data - for (int i = 0; i < 2; i++) - aCurrentEntity.param[i] = aParams[i]; - } - aResult = myStorage->addEntity(aCurrentEntity); - } else { - // Scalar value (used for the distance entities) - AttributeDoublePtr aScalar = std::dynamic_pointer_cast(theEntity); - if (aScalar) { - Slvs_Param aParam = aCurrentEntity.h != SLVS_E_UNKNOWN ? - myStorage->getParameter(aCurrentEntity.param[0]) : - Slvs_MakeParam(SLVS_E_UNKNOWN, aGroupID, 0.0); - aParam.val = aScalar->value(); - Slvs_hParam aValue = myStorage->addParameter(aParam); - - if (aCurrentEntity.h == SLVS_E_UNKNOWN) // New entity - aCurrentEntity = Slvs_MakeDistance(SLVS_E_UNKNOWN, aGroupID, aWorkplaneID, aValue); - else - aCurrentEntity.param[0] = aValue; - aResult = myStorage->addEntity(aCurrentEntity); - } - } - } - - myAttributeMap[theEntity] = aResult; - theType = aCurrentEntity.type; - return aResult; -} - -Slvs_hEntity SketchSolver_Constraint::changeEntity(FeaturePtr theEntity, int& theType) -{ - Slvs_hEntity aResult = SLVS_E_UNKNOWN; - if (!theEntity->data()->isValid()) - return SLVS_E_UNKNOWN; - // If the entity is already in the group, try to find it - std::map::const_iterator anEntIter = myFeatureMap.find(theEntity); - Slvs_Entity aCurrentEntity; - aCurrentEntity.h = SLVS_E_UNKNOWN; - if (anEntIter != myFeatureMap.end()) - aCurrentEntity = myStorage->getEntity(anEntIter->second); - else { - aResult = myGroup->getFeatureId(theEntity); - if (aResult != SLVS_E_UNKNOWN) { - Slvs_Entity anEnt = myStorage->getEntity(aResult); - theType = anEnt.type; - return aResult; - } - } - - Slvs_hGroup aGroupID = myGroup->getId(); - Slvs_hEntity aWorkplaneID = myGroup->getWorkplaneId(); - // SketchPlugin features - std::shared_ptr aFeature = std::dynamic_pointer_cast< - SketchPlugin_Feature>(theEntity); - if (aFeature) { // Verify the feature by its kind - const std::string& aFeatureKind = aFeature->getKind(); - AttributePtr anAttribute; - int anAttrType; - - // Line - if (aFeatureKind == SketchPlugin_Line::ID()) { - anAttribute = aFeature->data()->attribute(SketchPlugin_Line::START_ID()); - if (!anAttribute->isInitialized()) return SLVS_E_UNKNOWN; - Slvs_hEntity aStart = changeEntity(anAttribute, anAttrType); - - anAttribute = aFeature->data()->attribute(SketchPlugin_Line::END_ID()); - if (!anAttribute->isInitialized()) return SLVS_E_UNKNOWN; - Slvs_hEntity aEnd = changeEntity(anAttribute, anAttrType); - - if (aCurrentEntity.h == SLVS_E_UNKNOWN) // New entity - aCurrentEntity = Slvs_MakeLineSegment(SLVS_E_UNKNOWN, aGroupID, aWorkplaneID, aStart, aEnd); - else { - aCurrentEntity.point[0] = aStart; - aCurrentEntity.point[1] = aEnd; - } - aResult = myStorage->addEntity(aCurrentEntity); - } - // Circle - else if (aFeatureKind == SketchPlugin_Circle::ID()) { - anAttribute = aFeature->data()->attribute(SketchPlugin_Circle::CENTER_ID()); - if (!anAttribute->isInitialized()) return SLVS_E_UNKNOWN; - Slvs_hEntity aCenter = changeEntity(anAttribute, anAttrType); - - anAttribute = aFeature->data()->attribute(SketchPlugin_Circle::RADIUS_ID()); - if (!anAttribute->isInitialized()) return SLVS_E_UNKNOWN; - Slvs_hEntity aRadius = changeEntity(anAttribute, anAttrType); - - if (aCurrentEntity.h == SLVS_E_UNKNOWN) { // New entity - Slvs_Entity aWorkplane = myStorage->getEntity(aWorkplaneID); - aCurrentEntity = Slvs_MakeCircle(SLVS_E_UNKNOWN, aGroupID, aWorkplaneID, - aCenter, aWorkplane.normal, aRadius); - } else { - aCurrentEntity.point[0] = aCenter; - aCurrentEntity.distance = aRadius; - } - aResult = myStorage->addEntity(aCurrentEntity); - } - // Arc - else if (aFeatureKind == SketchPlugin_Arc::ID()) { - anAttribute = aFeature->data()->attribute(SketchPlugin_Arc::CENTER_ID()); - if (!anAttribute->isInitialized()) return SLVS_E_UNKNOWN; - Slvs_hEntity aCenter = changeEntity(anAttribute, anAttrType); - - anAttribute = aFeature->data()->attribute(SketchPlugin_Arc::START_ID()); - if (!anAttribute->isInitialized()) return SLVS_E_UNKNOWN; - Slvs_hEntity aStart = changeEntity(anAttribute, anAttrType); - - anAttribute = aFeature->data()->attribute(SketchPlugin_Arc::END_ID()); - if (!anAttribute->isInitialized()) return SLVS_E_UNKNOWN; - Slvs_hEntity aEnd = changeEntity(anAttribute, anAttrType); - - if (aCurrentEntity.h == SLVS_E_UNKNOWN) { // New entity - Slvs_Entity aWorkplane = myStorage->getEntity(aWorkplaneID); - aCurrentEntity = Slvs_MakeArcOfCircle(SLVS_E_UNKNOWN, aGroupID, aWorkplaneID, - aWorkplane.normal, aCenter, aStart, aEnd); - } else { - aCurrentEntity.point[0] = aCenter; - aCurrentEntity.point[1] = aStart; - aCurrentEntity.point[2] = aEnd; - } - aResult = myStorage->addEntity(aCurrentEntity); - } - // Point (it has low probability to be an attribute of constraint, so it is checked at the end) - else if (aFeatureKind == SketchPlugin_Point::ID()) { - anAttribute = aFeature->data()->attribute(SketchPlugin_Point::COORD_ID()); - if (!anAttribute->isInitialized()) return SLVS_E_UNKNOWN; - // Both the sketch point and its attribute (coordinates) link to the same SolveSpace point identifier - aResult = changeEntity(anAttribute, anAttrType); - aCurrentEntity.type = SLVS_E_POINT_IN_3D; - } - } - - if (aResult != SLVS_E_UNKNOWN) { - myFeatureMap[theEntity] = aResult; - theType = aCurrentEntity.type; - } - return aResult; -} - -std::list SketchSolver_Constraint::constraints() const -{ - std::list aConstraints; - aConstraints.push_back(myBaseConstraint); - return aConstraints; -} - -void SketchSolver_Constraint::refresh() -{ - cleanErrorMsg(); - std::map::iterator anAttrIter = myAttributeMap.begin(); - for (; anAttrIter != myAttributeMap.end(); anAttrIter++) { - std::shared_ptr aPoint = - std::dynamic_pointer_cast(anAttrIter->first); - if (aPoint) { - Slvs_Entity anEntity = myStorage->getEntity(anAttrIter->second); - double aXYZ[3]; - for (int i = 0; i < 3; i++) { - Slvs_Param aPar = myStorage->getParameter(anEntity.param[i]); - aXYZ[i] = aPar.val; - } - aPoint->setValue(aXYZ[0], aXYZ[1], aXYZ[2]); - } else { - // Point in 2D - std::shared_ptr aPoint2D = - std::dynamic_pointer_cast(anAttrIter->first); - if (aPoint2D) { - Slvs_Entity anEntity = myStorage->getEntity(anAttrIter->second); - double aXYZ[2]; - for (int i = 0; i < 2; i++) { - Slvs_Param aPar = myStorage->getParameter(anEntity.param[i]); - aXYZ[i] = aPar.val; - } - aPoint2D->setValue(aXYZ[0], aXYZ[1]); - } else { - // Scalar value (used for the distance entities) - AttributeDoublePtr aScalar = - std::dynamic_pointer_cast(anAttrIter->first); - if (aScalar) { - Slvs_Entity anEntity = myStorage->getEntity(anAttrIter->second); - Slvs_Param aPar = myStorage->getParameter(anEntity.param[0]); - aScalar->setValue(aPar.val); - } - } - } - } - - std::map::iterator aValIter = myValueMap.begin(); - for (; aValIter != myValueMap.end(); aValIter++) { - AttributeDoublePtr aScalar = - std::dynamic_pointer_cast(anAttrIter->first); - if (aScalar) { - Slvs_Param aPar = myStorage->getParameter(anAttrIter->second); - aScalar->setValue(aPar.val); - } - } -} - -Slvs_hEntity SketchSolver_Constraint::getId(FeaturePtr theFeature) const -{ - std::map::const_iterator aFIter = myFeatureMap.find(theFeature); - if (aFIter == myFeatureMap.end()) - return SLVS_E_UNKNOWN; - return aFIter->second; + const std::list& aCList = myStorage->constraint(myBaseConstraint); + std::list::const_iterator aCIt = aCList.begin(); + for (; aCIt != aCList.end(); ++aCIt) + if ((*aCIt)->isUsed(theAttribute)) + return true; + return false; } -Slvs_hEntity SketchSolver_Constraint::getId(AttributePtr theAttribute) const +void SketchSolver_Constraint::makeTemporary() const { - std::map::const_iterator anAttrIter = myAttributeMap.find(theAttribute); - if (anAttrIter == myAttributeMap.end()) - return SLVS_E_UNKNOWN; - return anAttrIter->second; + myStorage->setTemporary(myBaseConstraint); }