X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketchPlugin%2FSketchPlugin_Tools.cpp;h=8e3dfabb404b9f881a8a97faec530495a21414b4;hb=099946a7d91982c9a2c4ca2ccdd934320f196413;hp=82c5a3f93986c9c07d3857e797771ec59f7cdc52;hpb=1b93f1881c5fec599aa79707f93c84dd9c287bc0;p=modules%2Fshaper.git diff --git a/src/SketchPlugin/SketchPlugin_Tools.cpp b/src/SketchPlugin/SketchPlugin_Tools.cpp index 82c5a3f93..8e3dfabb4 100644 --- a/src/SketchPlugin/SketchPlugin_Tools.cpp +++ b/src/SketchPlugin/SketchPlugin_Tools.cpp @@ -6,12 +6,17 @@ #include "SketchPlugin_Tools.h" +#include "SketchPlugin_ConstraintCoincidence.h" +#include "SketchPlugin_ConstraintTangent.h" +#include "SketchPlugin_Point.h" +#include "SketchPlugin_SketchEntity.h" + +#include + +#include + #include #include -#include -#include -#include -#include namespace SketchPlugin_Tools { @@ -33,17 +38,17 @@ void clearExpressions(AttributePoint2DPtr theAttribute) void clearExpressions(AttributePtr theAttribute) { // Double - AttributeDoublePtr anAttributeDouble = + AttributeDoublePtr anAttributeDouble = std::dynamic_pointer_cast(theAttribute); if (anAttributeDouble.get()) clearExpressions(anAttributeDouble); // Point - AttributePointPtr anAttributePoint = + AttributePointPtr anAttributePoint = std::dynamic_pointer_cast(theAttribute); if (anAttributePoint.get()) clearExpressions(anAttributePoint); // Point2D - AttributePoint2DPtr anAttributePoint2D = + AttributePoint2DPtr anAttributePoint2D = std::dynamic_pointer_cast(theAttribute); if (anAttributePoint2D.get()) clearExpressions(anAttributePoint2D); @@ -54,7 +59,7 @@ void clearExpressions(FeaturePtr theFeature) if (!theFeature.get()) return; - std::list anAttributes = theFeature->data()->attributes(std::string()); + std::list anAttributes = theFeature->data()->attributes(std::string()); std::list::iterator anAttributeIt = anAttributes.begin(); for (; anAttributeIt != anAttributes.end(); ++anAttributeIt) { clearExpressions(*anAttributeIt); @@ -63,13 +68,26 @@ void clearExpressions(FeaturePtr theFeature) std::shared_ptr getCoincidencePoint(const FeaturePtr theStartCoin) { - std::shared_ptr aPnt = SketcherPrs_Tools::getPoint(theStartCoin.get(), - SketchPlugin_Constraint::ENTITY_A()); + std::shared_ptr aPnt = SketcherPrs_Tools::getPoint(theStartCoin.get(), + SketchPlugin_Constraint::ENTITY_A()); if (aPnt.get() == NULL) aPnt = SketcherPrs_Tools::getPoint(theStartCoin.get(), SketchPlugin_Constraint::ENTITY_B()); return aPnt; } +std::set findCoincidentConstraints(const FeaturePtr& theFeature) +{ + std::set aCoincident; + const std::set& aRefsList = theFeature->data()->refsToMe(); + std::set::const_iterator aIt; + for (aIt = aRefsList.cbegin(); aIt != aRefsList.cend(); ++aIt) { + FeaturePtr aConstrFeature = std::dynamic_pointer_cast((*aIt)->owner()); + if (aConstrFeature->getKind() == SketchPlugin_ConstraintCoincidence::ID()) + aCoincident.insert(aConstrFeature); + } + return aCoincident; +} + void findCoincidences(const FeaturePtr theStartCoin, const std::string& theAttr, std::set& theList) @@ -85,20 +103,122 @@ void findCoincidences(const FeaturePtr theStartCoin, return; } theList.insert(aObj); - const std::set& aRefsList = aObj->data()->refsToMe(); - std::set::const_iterator aIt; - for(aIt = aRefsList.cbegin(); aIt != aRefsList.cend(); ++aIt) { - std::shared_ptr aAttr = (*aIt); - FeaturePtr aConstrFeature = std::dynamic_pointer_cast(aAttr->owner()); - if(aConstrFeature->getKind() == SketchPlugin_ConstraintCoincidence::ID()) { - std::shared_ptr aPnt = getCoincidencePoint(aConstrFeature); - if(aPnt.get() && aOrig->isEqual(aPnt)) { - findCoincidences(aConstrFeature, SketchPlugin_ConstraintCoincidence::ENTITY_A(), theList); - findCoincidences(aConstrFeature, SketchPlugin_ConstraintCoincidence::ENTITY_B(), theList); + std::set aCoincidences = findCoincidentConstraints(aObj); + std::set::const_iterator aCIt = aCoincidences.begin(); + for (; aCIt != aCoincidences.end(); ++aCIt) { + FeaturePtr aConstrFeature = *aCIt; + std::shared_ptr aPnt = getCoincidencePoint(aConstrFeature); + if(aPnt.get() && aOrig->isEqual(aPnt)) { + findCoincidences(aConstrFeature, SketchPlugin_ConstraintCoincidence::ENTITY_A(), theList); + findCoincidences(aConstrFeature, SketchPlugin_ConstraintCoincidence::ENTITY_B(), theList); + } + } + } +} + +std::set findFeaturesCoincidentToPoint(const AttributePoint2DPtr& thePoint) +{ + std::set aCoincidentFeatures; + + FeaturePtr anOwner = ModelAPI_Feature::feature(thePoint->owner()); + aCoincidentFeatures.insert(anOwner); + + std::set aCoincidences = findCoincidentConstraints(anOwner); + std::set::const_iterator aCIt = aCoincidences.begin(); + for (; aCIt != aCoincidences.end(); ++aCIt) { + bool isPointUsedInCoincidence = false; + AttributeRefAttrPtr anOtherCoincidentAttr; + for (int i = 0; i < CONSTRAINT_ATTR_SIZE; ++i) { + AttributeRefAttrPtr aRefAttr = (*aCIt)->refattr(SketchPlugin_Constraint::ATTRIBUTE(i)); + if (!aRefAttr) + continue; + if (!aRefAttr->isObject() && aRefAttr->attr() == thePoint) + isPointUsedInCoincidence = true; + else + anOtherCoincidentAttr = aRefAttr; + } + + if (isPointUsedInCoincidence) { + ObjectPtr anObj; + if (anOtherCoincidentAttr->isObject()) + anObj = anOtherCoincidentAttr->object(); + else + anObj = anOtherCoincidentAttr->attr()->owner(); + aCoincidentFeatures.insert(ModelAPI_Feature::feature(anObj)); + } + } + + return aCoincidentFeatures; +} + +void resetAttribute(SketchPlugin_Feature* theFeature, + const std::string& theId) +{ + AttributePtr anAttr = theFeature->attribute(theId); + if(anAttr.get()) { + anAttr->reset(); + } +} + +void createConstraint(SketchPlugin_Feature* theFeature, + const std::string& theId, + const AttributePtr theAttr, + const ObjectPtr theObject, + const bool theIsCanBeTangent) +{ + AttributeRefAttrPtr aRefAttr = theFeature->refattr(theId); + if(aRefAttr.get() && aRefAttr->isInitialized()) { + FeaturePtr aConstraint; + if(!theIsCanBeTangent) { + aConstraint = theFeature->sketch() + ->addFeature(SketchPlugin_ConstraintCoincidence::ID()); + } else { + if(aRefAttr->isObject()) { + ObjectPtr anObject = aRefAttr->object(); + FeaturePtr aFeature = ModelAPI_Feature::feature(anObject); + if(aFeature->getKind() == SketchPlugin_Point::ID()) { + aConstraint = theFeature->sketch() + ->addFeature(SketchPlugin_ConstraintCoincidence::ID()); + } else { + aConstraint = theFeature->sketch() + ->addFeature(SketchPlugin_ConstraintTangent::ID()); } + } else { + aConstraint = theFeature->sketch() + ->addFeature(SketchPlugin_ConstraintCoincidence::ID()); } } + AttributeRefAttrPtr aRefAttrA = aConstraint->refattr(SketchPlugin_Constraint::ENTITY_A()); + aRefAttr->isObject() ? aRefAttrA->setObject(aRefAttr->object()) + : aRefAttrA->setAttr(aRefAttr->attr()); + AttributeRefAttrPtr aRefAttrB = aConstraint->refattr(SketchPlugin_Constraint::ENTITY_B()); + if(theObject.get()) { + aRefAttrB->setObject(theObject); + } else if(theAttr.get()) { + aRefAttrB->setAttr(theAttr); + } } } +void convertRefAttrToPointOrTangentCurve(const AttributeRefAttrPtr& theRefAttr, + const AttributePtr& theDefaultAttr, + std::shared_ptr& theTangentCurve, + std::shared_ptr& thePassingPoint) +{ + AttributePtr anAttr = theDefaultAttr; + if (theRefAttr->isObject()) { + FeaturePtr aTgFeature = ModelAPI_Feature::feature(theRefAttr->object()); + if (aTgFeature) { + if (aTgFeature->getKind() != SketchPlugin_Point::ID()) { + theTangentCurve = aTgFeature->lastResult()->shape(); + return; + } + anAttr = aTgFeature->attribute(SketchPlugin_Point::COORD_ID()); + } + } else + anAttr = theRefAttr->attr(); + + thePassingPoint = std::dynamic_pointer_cast(anAttr)->pnt(); +} + } // namespace SketchPlugin_Tools