#include <SketchPlugin_ConstraintCoincidence.h>
#include <SketchPlugin_ConstraintMirror.h>
#include <SketchPlugin_ConstraintRigid.h>
+#include <SketchPlugin_Projection.h>
/// \brief Verify two vectors of constraints are equal.
void SketchSolver_Storage::addEntity(AttributePtr theAttribute,
EntityWrapperPtr theSolverEntity)
{
- std::map<AttributePtr, EntityWrapperPtr>::const_iterator aFound = myAttributeMap.find(theAttribute);
+ std::map<AttributePtr, EntityWrapperPtr>::const_iterator aFound =
+ myAttributeMap.find(theAttribute);
if (aFound == myAttributeMap.end() || !aFound->second ||
(theSolverEntity && !aFound->second->isEqual(theSolverEntity)))
setNeedToResolve(true); // the entity is new or modified
return false;
bool aResult = theFeature->isCopy();
if (aResult) {
- std::map<ConstraintPtr, std::list<ConstraintWrapperPtr> >::const_iterator
- anIt = theConstraints.begin();
- for (; anIt != theConstraints.end() && aResult; ++anIt) {
- if (anIt->first->getKind() != SketchPlugin_ConstraintMirror::ID())
- continue;
- AttributeRefListPtr aRefList = std::dynamic_pointer_cast<ModelAPI_AttributeRefList>(
- anIt->first->attribute(SketchPlugin_Constraint::ENTITY_C()));
- std::list<ObjectPtr> aMirroredList = aRefList->list();
- std::list<ObjectPtr>::const_iterator aMIt = aMirroredList.begin();
- for (; aMIt != aMirroredList.end() && aResult; ++aMIt) {
- FeaturePtr aFeat = ModelAPI_Feature::feature(*aMIt);
- if (aFeat == theFeature)
- aResult = false;
- }
+ const std::set<AttributePtr>& aRefs = theFeature->data()->refsToMe();
+ for (std::set<AttributePtr>::const_iterator aRefIt = aRefs.begin();
+ aRefIt != aRefs.end() && aResult; ++aRefIt) {
+ FeaturePtr anOwner = ModelAPI_Feature::feature((*aRefIt)->owner());
+ if ((anOwner->getKind() == SketchPlugin_ConstraintMirror::ID() &&
+ (*aRefIt)->id() == SketchPlugin_Constraint::ENTITY_C()) ||
+ (anOwner->getKind() == SketchPlugin_Projection::ID()))
+ aResult = false;
}
}
return aResult;
bool isUpdated = false;
EntityWrapperPtr aRelated = entity(theFeature);
if (!aRelated) { // Feature is not exist, create it
- std::shared_ptr<SketchPlugin_Feature> aSketchFeature =
+ std::shared_ptr<SketchPlugin_Feature> aSketchFeature =
std::dynamic_pointer_cast<SketchPlugin_Feature>(theFeature);
bool isCopy = isCopyInMulti(aSketchFeature, myConstraintMap);
+ // the feature is a copy in "Multi" constraint and does not used in other constraints
if (!theForce && isCopy && myFeatureMap.find(theFeature) == myFeatureMap.end())
- return false; // the feature is a copy in "Multi" constraint and does not used in other constraints
+ return false;
std::list<EntityWrapperPtr> aSubs;
// Reserve the feature in the map of features (do not want to add several copies of it)
if (aFeature->getKind() == SketchPlugin_Arc::ID() &&
myFeatureMap.find(aFeature) == myFeatureMap.end()) {
// Additional checking that all attributes are initialized
- if (aFeature->attribute(SketchPlugin_Arc::CENTER_ID())->isInitialized() &&
- aFeature->attribute(SketchPlugin_Arc::START_ID())->isInitialized() &&
+ if (aFeature->attribute(SketchPlugin_Arc::CENTER_ID())->isInitialized() &&
+ aFeature->attribute(SketchPlugin_Arc::START_ID())->isInitialized() &&
aFeature->attribute(SketchPlugin_Arc::END_ID())->isInitialized()) {
return SketchSolver_Storage::update(aFeature, theGroup, theForce);
} else {
BuilderPtr aBuilder = SketchSolver_Manager::instance()->builder();
GroupID aGroup = theGroup != GID_UNKNOWN ? theGroup : myGroupID;
// Check attribute of external features
- std::shared_ptr<SketchPlugin_Feature> aSketchFeature =
+ std::shared_ptr<SketchPlugin_Feature> aSketchFeature =
std::dynamic_pointer_cast<SketchPlugin_Feature>(anAttribute->owner());
- if (aSketchFeature && (aSketchFeature->isExternal() || isCopyInMulti(aSketchFeature, myConstraintMap)))
+ if (aSketchFeature && (aSketchFeature->isExternal() ||
+ isCopyInMulti(aSketchFeature, myConstraintMap)))
aGroup = GID_OUTOFGROUP;
aRelated = aBuilder->createAttribute(anAttribute, aGroup);
if (!aRelated)
return true;
}
-void SketchSolver_Storage::replaceEntities(const std::map<EntityWrapperPtr, EntityWrapperPtr>& theChange)
+void SketchSolver_Storage::replaceEntities(const std::map<EntityWrapperPtr,
+ EntityWrapperPtr>& theChange)
{
std::set<EntityWrapperPtr> anUpdFeatures;
std::map<EntityWrapperPtr, EntityWrapperPtr>::const_iterator aSubIt;
if (aBaseFeature)
isFullyRemoved = SketchSolver_Storage::removeEntity(aBaseFeature) && isFullyRemoved;
else
- isFullyRemoved = SketchSolver_Storage::removeEntity((*anIt)->baseAttribute()) && isFullyRemoved;
+ isFullyRemoved =
+ SketchSolver_Storage::removeEntity((*anIt)->baseAttribute()) && isFullyRemoved;
}
return isFullyRemoved;
}
if (!theAttribute)
return false;
- AttributeRefListPtr aRefList =
+ AttributeRefListPtr aRefList =
std::dynamic_pointer_cast<ModelAPI_AttributeRefList>(theAttribute);
if (aRefList) {
std::list<ObjectPtr> anObjects = aRefList->list();
return true;
}
- std::map<ConstraintPtr, std::list<ConstraintWrapperPtr> >::const_iterator aCIt = myConstraintMap.begin();
+ std::map<ConstraintPtr, std::list<ConstraintWrapperPtr> >::const_iterator aCIt =
+ myConstraintMap.begin();
std::list<ConstraintWrapperPtr>::const_iterator aCWIt;
for (; aCIt != myConstraintMap.end(); ++aCIt) {
if (aCIt->second.empty())
for (; aFIt != myFeatureMap.end(); ++aFIt)
if (!aFIt->second && aFIt->first->getKind() == SketchPlugin_Arc::ID()) {
// Additional checking the attributes are initialized
- if (aFIt->first->attribute(SketchPlugin_Arc::CENTER_ID())->isInitialized() &&
- aFIt->first->attribute(SketchPlugin_Arc::START_ID())->isInitialized() &&
+ if (aFIt->first->attribute(SketchPlugin_Arc::CENTER_ID())->isInitialized() &&
+ aFIt->first->attribute(SketchPlugin_Arc::START_ID())->isInitialized() &&
aFIt->first->attribute(SketchPlugin_Arc::END_ID())->isInitialized())
update(aFIt->first);
else
// if the feature has several results, we choose which one is referred
const std::list<ResultPtr>& aResults = aFeature->results();
if (aResults.size() > 1 && theResult != aFeature->lastResult()) {
- // actually, the attribute refers to center of arc or circle, but not the edge, get correct attributes
+ // actually, the attribute refers to center of arc or circle,
+ // but not the edge, get correct attributes
std::string anAttrName;
if (aFeature->getKind() == SketchPlugin_Arc::ID())
anAttrName = SketchPlugin_Arc::CENTER_ID();