X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketchSolver%2FSketchSolver_Constraint.cpp;h=e4af2a0643970b1518b35cd344566ccaffdce20a;hb=51889d235a27d0ee4b3c3237d21d1ea621063580;hp=d5f1e6810f95dda81de2d48ff4b0a4ef31ec9c1a;hpb=8dc74f82810d5f597b78633b457efb0ef4f89f9f;p=modules%2Fshaper.git diff --git a/src/SketchSolver/SketchSolver_Constraint.cpp b/src/SketchSolver/SketchSolver_Constraint.cpp index d5f1e6810..e4af2a064 100644 --- a/src/SketchSolver/SketchSolver_Constraint.cpp +++ b/src/SketchSolver/SketchSolver_Constraint.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2014-20xx CEA/DEN, EDF R&D + // File: SketchSolver_Constraint.cpp // Created: 27 May 2014 // Author: Artem ZHIDKOV @@ -11,10 +13,15 @@ #include #include #include +#include +#include #include #include #include #include +#include +#include +#include #include #include @@ -39,17 +46,17 @@ enum AttrType }; /// Calculate type of the attribute -static AttrType typeOfAttribute(boost::shared_ptr theAttribute); +static AttrType typeOfAttribute(std::shared_ptr theAttribute); SketchSolver_Constraint::SketchSolver_Constraint() - : myConstraint(boost::shared_ptr()), + : myConstraint(std::shared_ptr()), myType(SLVS_C_UNKNOWN), myAttributesList() { } SketchSolver_Constraint::SketchSolver_Constraint( - boost::shared_ptr theConstraint) + std::shared_ptr theConstraint) : myConstraint(theConstraint), myAttributesList() { @@ -57,12 +64,16 @@ SketchSolver_Constraint::SketchSolver_Constraint( } const int& SketchSolver_Constraint::getType( - boost::shared_ptr theConstraint) + std::shared_ptr theConstraint) { myType = SLVS_C_UNKNOWN; if (!theConstraint) return getType(); + DataPtr aConstrData = theConstraint->data(); + if (!aConstrData || !aConstrData->isValid()) + return getType(); + // Assign empty names of attributes myAttributesList.clear(); for (int i = 0; i < CONSTRAINT_ATTR_SIZE; i++) @@ -76,8 +87,8 @@ const int& SketchSolver_Constraint::getType( int aPt2d = 0; // bit-mapped field, each bit indicates whether the attribute is 2D point int aPt3d = 0; // bit-mapped field, the same information for 3D points for (unsigned int indAttr = 0; indAttr < CONSTRAINT_ATTR_SIZE; indAttr++) { - boost::shared_ptr anAttr = theConstraint->data()->attribute( - SketchPlugin_Constraint::ATTRIBUTE(indAttr)); + std::shared_ptr anAttr = + aConstrData->attribute(SketchPlugin_Constraint::ATTRIBUTE(indAttr)); if (!anAttr) continue; switch (typeOfAttribute(anAttr)) { @@ -107,8 +118,8 @@ const int& SketchSolver_Constraint::getType( int aNbPoints = 0; int aNbEntities = 0; for (unsigned int indAttr = 0; indAttr < CONSTRAINT_ATTR_SIZE; indAttr++) { - boost::shared_ptr anAttr = theConstraint->data()->attribute( - SketchPlugin_Constraint::ATTRIBUTE(indAttr)); + std::shared_ptr anAttr = + aConstrData->attribute(SketchPlugin_Constraint::ATTRIBUTE(indAttr)); switch (typeOfAttribute(anAttr)) { case POINT2D: case POINT3D: @@ -133,8 +144,8 @@ const int& SketchSolver_Constraint::getType( if (aConstraintKind.compare(SketchPlugin_ConstraintLength::ID()) == 0) { int aNbLines = 0; for (unsigned int indAttr = 0; indAttr < CONSTRAINT_ATTR_SIZE; indAttr++) { - boost::shared_ptr anAttr = theConstraint->data()->attribute( - SketchPlugin_Constraint::ATTRIBUTE(indAttr)); + std::shared_ptr anAttr = + aConstrData->attribute(SketchPlugin_Constraint::ATTRIBUTE(indAttr)); if (typeOfAttribute(anAttr) == LINE) myAttributesList[aNbLines++] = SketchPlugin_Constraint::ATTRIBUTE(indAttr); } @@ -149,8 +160,8 @@ const int& SketchSolver_Constraint::getType( if (isParallel || isPerpendicular) { int aNbEntities = 2; // lines in SolveSpace constraints should start from SketchPlugin_Constraint::ENTITY_C() attribute for (unsigned int indAttr = 0; indAttr < CONSTRAINT_ATTR_SIZE; indAttr++) { - boost::shared_ptr anAttr = theConstraint->data()->attribute( - SketchPlugin_Constraint::ATTRIBUTE(indAttr)); + std::shared_ptr anAttr = + aConstrData->attribute(SketchPlugin_Constraint::ATTRIBUTE(indAttr)); if (typeOfAttribute(anAttr) == LINE) myAttributesList[aNbEntities++] = SketchPlugin_Constraint::ATTRIBUTE(indAttr); } @@ -163,8 +174,8 @@ const int& SketchSolver_Constraint::getType( if (aConstraintKind.compare(SketchPlugin_ConstraintRadius::ID()) == 0) { int aNbEntities = 2; // lines in SolveSpace constraints should started from SketchPlugin_Constraint::ENTITY_C() attribute for (unsigned int indAttr = 0; indAttr < CONSTRAINT_ATTR_SIZE; indAttr++) { - boost::shared_ptr anAttr = theConstraint->data()->attribute( - SketchPlugin_Constraint::ATTRIBUTE(indAttr)); + std::shared_ptr anAttr = + aConstrData->attribute(SketchPlugin_Constraint::ATTRIBUTE(indAttr)); AttrType aType = typeOfAttribute(anAttr); if (aType == CIRCLE || aType == ARC) myAttributesList[aNbEntities++] = SketchPlugin_Constraint::ATTRIBUTE(indAttr); @@ -174,29 +185,106 @@ const int& SketchSolver_Constraint::getType( return getType(); } + // Constraint for fixed entity + if (aConstraintKind.compare(SketchPlugin_ConstraintRigid::ID()) == 0) { + // Verify that only one entity is filled + int aNbAttrs = 0; + for (unsigned int indAttr = 0; indAttr < CONSTRAINT_ATTR_SIZE; indAttr++) { + std::shared_ptr anAttr = + aConstrData->attribute(SketchPlugin_Constraint::ATTRIBUTE(indAttr)); + AttrType aType = typeOfAttribute(anAttr); + if (aType != UNKNOWN) + myAttributesList[aNbAttrs++] = SketchPlugin_Constraint::ATTRIBUTE(indAttr); + } + if (aNbAttrs == 1) + myType = SLVS_C_WHERE_DRAGGED; + return getType(); + } + + // Constraint for horizontal/vertical line + bool isHorizontal = (aConstraintKind.compare(SketchPlugin_ConstraintHorizontal::ID()) == 0); + bool isVertical = (aConstraintKind.compare(SketchPlugin_ConstraintVertical::ID()) == 0); + if (isHorizontal || isVertical) { + int aNbEntities = 2; // lines in SolveSpace constraints should start from SketchPlugin_Constraint::ENTITY_C() attribute + for (unsigned int indAttr = 0; indAttr < CONSTRAINT_ATTR_SIZE; indAttr++) { + std::shared_ptr anAttr = + aConstrData->attribute(SketchPlugin_Constraint::ATTRIBUTE(indAttr)); + if (typeOfAttribute(anAttr) == LINE) + myAttributesList[aNbEntities++] = SketchPlugin_Constraint::ATTRIBUTE(indAttr); + } + if (aNbEntities == 3) + myType = isHorizontal ? SLVS_C_HORIZONTAL : SLVS_C_VERTICAL; + return getType(); + } + + if (aConstraintKind.compare(SketchPlugin_ConstraintEqual::ID()) == 0) + { + static const int aConstrType[3] = { + SLVS_C_EQUAL_RADIUS, + SLVS_C_EQUAL_LINE_ARC_LEN, + SLVS_C_EQUAL_LENGTH_LINES + }; + int aNbLines = 0; + int aNbEntities = 2; // lines and circles in SolveSpace constraints should start from SketchPlugin_Constraint::ENTITY_C() attribute + for (unsigned int indAttr = 0; indAttr < CONSTRAINT_ATTR_SIZE; indAttr++) { + std::shared_ptr anAttr = + aConstrData->attribute(SketchPlugin_Constraint::ATTRIBUTE(indAttr)); + AttrType aType = typeOfAttribute(anAttr); + if (aType == LINE) { + myAttributesList[aNbEntities++] = SketchPlugin_Constraint::ATTRIBUTE(indAttr); + aNbLines++; + } + else if (aType == CIRCLE || aType == ARC) + myAttributesList[aNbEntities++] = SketchPlugin_Constraint::ATTRIBUTE(indAttr); + } + if (aNbEntities == 4) + myType = aConstrType[aNbLines]; + return getType(); + } + + if (aConstraintKind.compare(SketchPlugin_ConstraintTangent::ID()) == 0) + { + static const int anArcPosDefault = 2; + static const int aLinePosDefault = 3; + int anArcPos = anArcPosDefault; // arc in tangency constraint should be placed before line + int aLinePos = aLinePosDefault; + for (unsigned int indAttr = 0; indAttr < CONSTRAINT_ATTR_SIZE; indAttr++) { + std::shared_ptr anAttr = + aConstrData->attribute(SketchPlugin_Constraint::ATTRIBUTE(indAttr)); + AttrType aType = typeOfAttribute(anAttr); + if (aType == LINE && aLinePos < CONSTRAINT_ATTR_SIZE) + myAttributesList[aLinePos++] = SketchPlugin_Constraint::ATTRIBUTE(indAttr); + else if (aType == ARC) + myAttributesList[anArcPos++] = SketchPlugin_Constraint::ATTRIBUTE(indAttr); + } + if (anArcPos - anArcPosDefault + aLinePos - aLinePosDefault == 2) + myType = aLinePos > 3 ? SLVS_C_ARC_LINE_TANGENT : SLVS_C_CURVE_CURVE_TANGENT; + return getType(); + } + /// \todo Implement other kind of constraints return getType(); } // ================= Auxiliary functions ============================== -AttrType typeOfAttribute(boost::shared_ptr theAttribute) +AttrType typeOfAttribute(std::shared_ptr theAttribute) { - boost::shared_ptr anAttrRef = boost::dynamic_pointer_cast< + std::shared_ptr anAttrRef = std::dynamic_pointer_cast< ModelAPI_AttributeRefAttr>(theAttribute); if (!anAttrRef) return UNKNOWN; if (anAttrRef->isObject()) { - ResultConstructionPtr aRC = boost::dynamic_pointer_cast( + ResultConstructionPtr aRC = std::dynamic_pointer_cast( anAttrRef->object()); - if (!aRC) + if (!aRC || !aRC->shape()) return UNKNOWN; if (aRC->shape()->isVertex()) return POINT3D; else if (aRC->shape()->isEdge()) { - boost::shared_ptr anEdge = boost::dynamic_pointer_cast( + std::shared_ptr anEdge = std::dynamic_pointer_cast( aRC->shape()); if (anEdge->isLine()) return LINE; @@ -206,11 +294,13 @@ AttrType typeOfAttribute(boost::shared_ptr theAttribute) return ARC; } } else { - const std::string aType = anAttrRef->attr()->attributeType(); - if (aType == GeomDataAPI_Point2D::type()) - return POINT2D; - if (aType == GeomDataAPI_Point2D::type()) - return POINT2D; + if (anAttrRef->attr().get() != NULL) { + const std::string aType = anAttrRef->attr()->attributeType(); + if (aType == GeomDataAPI_Point2D::type()) + return POINT2D; + if (aType == GeomDataAPI_Point2D::type()) + return POINT2D; + } } return UNKNOWN;