X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketchSolver%2FSketchSolver_ConstraintCoincidence.cpp;h=934966b523121cc8800b88d63e369fc1a6d3cf39;hb=801131b41013eeb97fe917311b47bff78fb86d86;hp=1172988cba921d4ba5e83eab6c9d0627ca88789f;hpb=33b3a43ad2266cb044e4232c902344842adbba7c;p=modules%2Fshaper.git diff --git a/src/SketchSolver/SketchSolver_ConstraintCoincidence.cpp b/src/SketchSolver/SketchSolver_ConstraintCoincidence.cpp index 1172988cb..934966b52 100644 --- a/src/SketchSolver/SketchSolver_ConstraintCoincidence.cpp +++ b/src/SketchSolver/SketchSolver_ConstraintCoincidence.cpp @@ -1,207 +1,39 @@ #include #include -#include +#include -#include - -bool SketchSolver_ConstraintCoincidence::hasConstraint(ConstraintPtr theConstraint) const -{ - if (myBaseConstraint == theConstraint) - return true; - std::map::const_iterator anIt = myExtraCoincidence.begin(); - for (; anIt != myExtraCoincidence.end(); anIt++) - if (anIt->second == theConstraint) - return true; - return false; -} - -std::list SketchSolver_ConstraintCoincidence::constraints() const -{ - std::list aConstraints; - aConstraints.push_back(myBaseConstraint); - std::map::const_iterator anIt = myExtraCoincidence.begin(); - for (; anIt != myExtraCoincidence.end(); anIt++) - aConstraints.push_back(anIt->second); - return aConstraints; -} - -bool SketchSolver_ConstraintCoincidence::isCoincide( - std::shared_ptr theConstraint) const -{ - std::map::const_iterator aFeatIter = myFeatureMap.begin(); - for (; aFeatIter != myFeatureMap.end(); aFeatIter++) - if (theConstraint->myFeatureMap.find(aFeatIter->first) != theConstraint->myFeatureMap.end()) - return true; - std::map::const_iterator anAttrIter = myAttributeMap.begin(); - for (; anAttrIter != myAttributeMap.end(); anAttrIter++) - if (theConstraint->myAttributeMap.find(anAttrIter->first) != theConstraint->myAttributeMap.end()) - return true; - return false; -} - -void SketchSolver_ConstraintCoincidence::attach( - std::shared_ptr theConstraint) -{ - cleanErrorMsg(); - Slvs_Constraint aBaseCoincidence = myStorage->getConstraint(mySlvsConstraints.front()); - // Remove constraints from theConstraint - std::vector::iterator aCIter = theConstraint->mySlvsConstraints.begin(); - for (; aCIter != theConstraint->mySlvsConstraints.end(); aCIter++) - theConstraint->myStorage->removeConstraint(*aCIter); - - if (myStorage == theConstraint->myStorage) { - // Clean removed items - std::set aRemParams; - std::set aRemEnts; - std::set aRemConstr; - theConstraint->myStorage->getRemoved(aRemParams, aRemEnts, aRemConstr); - } - - // Copy data. - addConstraint(theConstraint->myBaseConstraint); - std::map::iterator aConstrIter = - theConstraint->myExtraCoincidence.begin(); - for (; aConstrIter != theConstraint->myExtraCoincidence.end(); aConstrIter++) - addConstraint(aConstrIter->second); - // Clear the lists to not remove the entities on destruction - theConstraint->mySlvsConstraints.clear(); - theConstraint->myFeatureMap.clear(); - theConstraint->myAttributeMap.clear(); -} - -Slvs_hConstraint SketchSolver_ConstraintCoincidence::addConstraint( - Slvs_hEntity thePoint1, Slvs_hEntity thePoint2) +void SketchSolver_ConstraintCoincidence::getAttributes( + double& theValue, + std::vector& theAttributes) { - Slvs_Constraint aNewConstraint = Slvs_MakeConstraint(SLVS_E_UNKNOWN, myGroup->getId(), - SLVS_C_POINTS_COINCIDENT, myGroup->getWorkplaneId(), 0.0, thePoint1, thePoint2, - SLVS_E_UNKNOWN, SLVS_E_UNKNOWN); - Slvs_hConstraint aNewID = myStorage->addConstraint(aNewConstraint); - mySlvsConstraints.push_back(aNewID); - return aNewID; -} - -void SketchSolver_ConstraintCoincidence::addConstraint(ConstraintPtr theConstraint) -{ - std::list anAttrList = - theConstraint->data()->attributes(ModelAPI_AttributeRefAttr::typeId()); - std::list::iterator anIter = anAttrList.begin(); - std::vector anEntities; - for (; anIter != anAttrList.end(); anIter++) { - AttributeRefAttrPtr aRefAttr = std::dynamic_pointer_cast(*anIter); - if (!aRefAttr || aRefAttr->isObject() || - myAttributeMap.find(aRefAttr->attr()) != myAttributeMap.end()) - continue; - int aType; - Slvs_hEntity anEntityID = myGroup->getAttributeId(aRefAttr->attr()); - if (anEntityID == SLVS_E_UNKNOWN) - anEntityID = changeEntity(aRefAttr->attr(), aType); - anEntities.push_back(anEntityID); - } - - Slvs_Constraint aBaseCoincidence = myStorage->getConstraint(mySlvsConstraints.front()); - Slvs_hConstraint aNewConstr = SLVS_E_UNKNOWN; - std::vector::iterator anEntIter = anEntities.begin(); - for (; anEntIter != anEntities.end(); anEntIter++) - aNewConstr = addConstraint(aBaseCoincidence.ptA, *anEntIter); - myExtraCoincidence[aNewConstr] = theConstraint; -} - -bool SketchSolver_ConstraintCoincidence::remove(ConstraintPtr theConstraint) -{ - cleanErrorMsg(); - if (mySlvsConstraints.empty()) - return true; - ConstraintPtr aConstraint = theConstraint ? theConstraint : myBaseConstraint; - int aPos = -1; // position of constraint in the list (-1 for base constraint) - std::map::iterator anExtraIt; - if (aConstraint != myBaseConstraint) { - anExtraIt = myExtraCoincidence.begin(); - for (aPos = 0; anExtraIt != myExtraCoincidence.end(); anExtraIt++, aPos++) - if (anExtraIt->second == aConstraint) - break; - if (aPos >= (int)myExtraCoincidence.size()) - return false; // there is no constraint, which is specified to remove - else { - bool isEmpty = anExtraIt->first == SLVS_E_UNKNOWN; - myExtraCoincidence.erase(anExtraIt); - if (isEmpty) - return false; - } - } - - bool isFullyRemoved = myStorage->removeConstraint(mySlvsConstraints[aPos+1]); - mySlvsConstraints.erase(mySlvsConstraints.begin() + (1+aPos)); - if (aPos < 0 && !myExtraCoincidence.empty()) { - anExtraIt = myExtraCoincidence.begin(); - // Remove invalid constraints - while (anExtraIt != myExtraCoincidence.end()) { - if (!anExtraIt->second->data() || !anExtraIt->second->data()->isValid()) { - std::map::iterator aTempIt = anExtraIt++; - if (aTempIt->first != SLVS_E_UNKNOWN) { - myStorage->removeConstraint(aTempIt->first); - std::vector::iterator anIt = mySlvsConstraints.begin(); - for (; anIt != mySlvsConstraints.end(); anIt++) - if (*anIt == aTempIt->first) { - mySlvsConstraints.erase(anIt); - break; - } - } - myExtraCoincidence.erase(aTempIt); - continue; - } - anExtraIt++; - } - // Find first non-extra conststraint - while (anExtraIt != myExtraCoincidence.end() && anExtraIt->first == SLVS_E_UNKNOWN) - anExtraIt++; - if (anExtraIt != myExtraCoincidence.end()) { - // Need to specify another base coincidence constraint - myBaseConstraint = anExtraIt->second; - myExtraCoincidence.erase(anExtraIt); - std::vector::iterator aCIter = mySlvsConstraints.begin(); - Slvs_Constraint aBase = myStorage->getConstraint(*aCIter); - for (++aCIter; aCIter != mySlvsConstraints.end(); aCIter++) { - Slvs_Constraint aConstr = myStorage->getConstraint(*aCIter); - aConstr.ptA = aBase.ptA; - myStorage->updateConstraint(aConstr); - } - } - } - // Clear removed attributes - std::set aParamRemoved; - std::set anEntRemoved; - std::set aConstrRemoved; - myStorage->getRemoved(aParamRemoved, anEntRemoved, aConstrRemoved); - std::map::iterator anAttrIter = myAttributeMap.begin(); - while (anAttrIter != myAttributeMap.end()) { - if (anEntRemoved.find(anAttrIter->second) != anEntRemoved.end()) { - std::map::iterator aTempIt = anAttrIter++; - myAttributeMap.erase(aTempIt); - continue; - } - anAttrIter++; + SketchSolver_Constraint::getAttributes(theValue, theAttributes); + if (!myErrorMsg.empty() || !theAttributes[0]) { + theAttributes.clear(); + return; } - // Go through remaining extra coincidence and try to add or remove them - anExtraIt = myExtraCoincidence.begin(); - while (anExtraIt != myExtraCoincidence.end()) { - if (anExtraIt->first == SLVS_E_UNKNOWN) { - if (!anExtraIt->second->data() || !anExtraIt->second->data()->isValid()) { - std::map::iterator aTempIt = anExtraIt++; - myExtraCoincidence.erase(aTempIt); - continue; - } - if (mySlvsConstraints.empty()) { - myBaseConstraint = anExtraIt->second; - std::map::iterator aTempIt = anExtraIt++; - myExtraCoincidence.erase(aTempIt); - process(); - continue; - } else - addConstraint(anExtraIt->second); + if (theAttributes[1]) { + myType = CONSTRAINT_PT_PT_COINCIDENT; + if (myStorage->isFixed(theAttributes[1]) && !myStorage->isFixed(theAttributes[0])) { + // fixed point should go first + EntityWrapperPtr aTemp = theAttributes[0]; + theAttributes[0] = theAttributes[1]; + theAttributes[1] = aTemp; } - anExtraIt++; + // Set the slave (second) point the same as master (first) point. + // This will allow to skip adding point-point coincidence to the set of constraints + // and give us speed-up in solving the set of equations + myStorage->addCoincidentPoints(theAttributes[0], theAttributes[1]); } - return isFullyRemoved; + else if (theAttributes[2]) { + // check the type of entity (line or circle) + SketchSolver_EntityType anEntType = theAttributes[2]->type(); + if (anEntType == ENTITY_LINE) + myType = CONSTRAINT_PT_ON_LINE; + else if (anEntType == ENTITY_CIRCLE || anEntType == ENTITY_ARC) + myType = CONSTRAINT_PT_ON_CIRCLE; + else + myErrorMsg = SketchSolver_Error::INCORRECT_ATTRIBUTE(); + } else + myErrorMsg = SketchSolver_Error::INCORRECT_ATTRIBUTE(); } -