aConstraint->changeConstraint() = getConstraint(aConstrID);
isUpdated = true;
// check duplicated constraints based on different attributes
- if (myDuplicatedConstraint && !hasDupConstraints && findSameConstraint(aConstraint))
+ if (myDuplicatedConstraint && findSameConstraint(aConstraint) && !hasDupConstraints)
myDuplicatedConstraint = false;
}
}
(*aCWIt)->type() == CONSTRAINT_MULTI_TRANSLATION)
continue;
if ((*aCWIt)->type() == theConstraint->type()) {
- const Slvs_Constraint& aCComp = std::dynamic_pointer_cast<
- SolveSpaceSolver_ConstraintWrapper>(*aCWIt)->constraint();
+ const Slvs_Constraint& aCComp = getConstraint((Slvs_hConstraint)(*aCWIt)->id());
+
if (aCBase.ptA == aCComp.ptA && aCBase.ptB == aCComp.ptB &&
aCBase.entityA == aCComp.entityA && aCBase.entityB == aCComp.entityB &&
aCBase.entityC == aCComp.entityC && aCBase.entityD == aCComp.entityD &&
// parameter already used, rewrite it
int aPos = Search(theParam.h, myParameters);
if (aPos >= 0 && aPos < (int)myParameters.size()) {
- if (IsNotEqual(myParameters[aPos], theParam)) {
- myUpdatedParameters.insert(theParam.h);
+ if (IsNotEqual(myParameters[aPos], theParam))
setNeedToResolve(true);
- }
myParameters[aPos] = theParam;
return theParam.h;
}
aConstraint.entityA == aCIt->entityA && aConstraint.entityB == aCIt->entityB &&
aConstraint.entityC == aCIt->entityC && aConstraint.entityD == aCIt->entityD) {
myDuplicatedConstraint = true;
- return aCIt->h;
+ break;
}
}
// Constraint is not found, add new one
Slvs_Constraint aConstraint = theConstraint;
aConstraint.h = 0;
+
+ // Firstly, check middle-point constraint conflicts with point-on-line
+ if (aConstraint.type == SLVS_C_AT_MIDPOINT) {
+ std::vector<Slvs_Constraint>::const_iterator anIt = myConstraints.begin();
+ for (; anIt != myConstraints.end(); ++anIt)
+ if (anIt->type == SLVS_C_PT_ON_LINE &&
+ anIt->ptA == aConstraint.ptA &&
+ anIt->entityA == aConstraint.entityA)
+ break;
+ if (anIt != myConstraints.end()) {
+ // change the constraint to the lengths equality to avoid conflicts
+ Slvs_Entity aLine = getEntity(aConstraint.entityA);
+ Slvs_Entity aNewLine1 = Slvs_MakeLineSegment(SLVS_E_UNKNOWN, myGroupID,
+ myWorkplaneID, aLine.point[0], aConstraint.ptA);
+ aNewLine1.h = addEntity(aNewLine1);
+ Slvs_Entity aNewLine2 = Slvs_MakeLineSegment(SLVS_E_UNKNOWN, myGroupID,
+ myWorkplaneID, aLine.point[1], aConstraint.ptA);
+ aNewLine2.h = addEntity(aNewLine2);
+ aConstraint = Slvs_MakeConstraint(SLVS_E_UNKNOWN, myGroupID, SLVS_C_EQUAL_LENGTH_LINES,
+ myWorkplaneID, 0.0, SLVS_E_UNKNOWN, SLVS_E_UNKNOWN, aNewLine1.h, aNewLine2.h);
+ }
+ }
+
return addConstraint(aConstraint);
}
std::dynamic_pointer_cast<SolveSpaceSolver_ConstraintWrapper>(theConstraint);
// verify whether the constraint has duplicated
+ bool hasSameID = false;
SameConstraintMap::iterator anEqIt = myEqualConstraints.begin();
- for (; anEqIt != myEqualConstraints.end(); ++anEqIt)
- if (anEqIt->find(aConstraint) != anEqIt->end()) {
+ for (; anEqIt != myEqualConstraints.end(); ++anEqIt) {
+ std::set<ConstraintWrapperPtr>::const_iterator aFound = anEqIt->find(aConstraint);
+ if (aFound != anEqIt->end()) {
+ // verify there is a constraint with same ID
+ std::set<ConstraintWrapperPtr>::const_iterator anIt = anEqIt->begin();
+ ConstraintID anID = (*aFound)->id();
+ for (++anIt; anIt != anEqIt->end() && !hasSameID; ++anIt)
+ if ((*anIt)->id() == anID && aFound != anIt)
+ hasSameID = true;
+ // erase constraint
anEqIt->erase(aConstraint);
break;
}
- if (anEqIt != myEqualConstraints.end())
+ }
+ if (anEqIt != myEqualConstraints.end() && hasSameID)
return true;
bool isFullyRemoved = removeConstraint((Slvs_hConstraint)aConstraint->id());
- isFullyRemoved = SketchSolver_Storage::remove(theConstraint) && isFullyRemoved;
-
// remove point-point coincidence
if (aConstraint->type() == CONSTRAINT_PT_PT_COINCIDENT)
isFullyRemoved = removeCoincidence(theConstraint) && isFullyRemoved;
- return isFullyRemoved;
+ return SketchSolver_Storage::remove(theConstraint) && isFullyRemoved;
}
bool SolveSpaceSolver_Storage::remove(EntityWrapperPtr theEntity)
std::shared_ptr<SolveSpaceSolver_EntityWrapper> anEntity =
std::dynamic_pointer_cast<SolveSpaceSolver_EntityWrapper>(theEntity);
bool isFullyRemoved = isCoincide ? true : removeEntity((Slvs_hEntity)anEntity->id());
- return SketchSolver_Storage::remove(theEntity) && isFullyRemoved;
+ return (SketchSolver_Storage::remove(theEntity) || isCoincide) && isFullyRemoved;
}
bool SolveSpaceSolver_Storage::remove(ParameterWrapperPtr theParameter)
for (; anAttrIt != myAttributeMap.end(); ++anAttrIt) {
if (!anAttrIt->second)
continue;
+ if (anAttrIt->second->group() == GID_OUTOFGROUP) {
+ Slvs_Entity anEnt = getEntity((Slvs_hEntity)anAttrIt->second->id());
+ if (anEnt.group != (Slvs_hEntity)GID_OUTOFGROUP)
+ anEnt.group = (Slvs_hEntity)GID_OUTOFGROUP;
+ updateEntity(anEnt);
+ }
+
const std::list<ParameterWrapperPtr>& aParameters = anAttrIt->second->parameters();
std::list<ParameterWrapperPtr>::const_iterator aParIt = aParameters.begin();
for (; aParIt != aParameters.end(); ++aParIt)
- if ((*aParIt)->group() == GID_OUTOFGROUP) {
+ if (anAttrIt->second->group() == GID_OUTOFGROUP || (*aParIt)->group() == GID_OUTOFGROUP) {
Slvs_Param aParam = getParameter((Slvs_hParam)(*aParIt)->id());
if (aParam.group != (Slvs_hParam)GID_OUTOFGROUP) {
aParam.group = (Slvs_hParam)GID_OUTOFGROUP;