]> SALOME platform Git repositories - modules/shaper.git/blob - src/SketchSolver/SketchSolver_ConstraintDistance.cpp
Salome HOME
Task 2.7. Horizontal and Vertical Distance constraint
[modules/shaper.git] / src / SketchSolver / SketchSolver_ConstraintDistance.cpp
1 // Copyright (C) 2014-20xx CEA/DEN, EDF R&D
2
3 #include <SketchSolver_ConstraintDistance.h>
4 #include <SketchSolver_Error.h>
5 #include <SketchSolver_Manager.h>
6
7 #include <SketchPlugin_ConstraintDistanceHorizontal.h>
8 #include <SketchPlugin_ConstraintDistanceVertical.h>
9
10 #include <GeomAPI_Dir2d.h>
11 #include <GeomAPI_Lin2d.h>
12 #include <GeomAPI_Pnt2d.h>
13 #include <GeomAPI_XY.h>
14
15 #include <math.h>
16
17
18 void SketchSolver_ConstraintDistance::getAttributes(
19     EntityWrapperPtr& theValue,
20     std::vector<EntityWrapperPtr>& theAttributes)
21 {
22   SketchSolver_Constraint::getAttributes(theValue, theAttributes);
23   if (!myErrorMsg.empty() || !theAttributes[0]) {
24     theAttributes.clear();
25     return;
26   }
27
28   if (theAttributes[1]) {
29     if (myBaseConstraint->getKind() == SketchPlugin_ConstraintDistanceHorizontal::ID())
30       myType = CONSTRAINT_HORIZONTAL_DISTANCE;
31     else if (myBaseConstraint->getKind() == SketchPlugin_ConstraintDistanceVertical::ID())
32       myType = CONSTRAINT_VERTICAL_DISTANCE;
33     else
34       myType = CONSTRAINT_PT_PT_DISTANCE;
35   } else if (theAttributes[2] && theAttributes[2]->type() == ENTITY_LINE)
36     myType = CONSTRAINT_PT_LINE_DISTANCE;
37   else
38     theAttributes.clear();
39
40   myPrevValue = 0.0;
41 }
42
43 void SketchSolver_ConstraintDistance::adjustConstraint()
44 {
45   ConstraintWrapperPtr aConstraint = myStorage->constraint(myBaseConstraint);
46
47   // Adjust point-point distance if the points are equal
48   if (getType() == CONSTRAINT_PT_PT_DISTANCE) {
49 ////    AttributePtr aPt1 = myBaseConstraint->attribute(SketchPlugin_Constraint::ENTITY_A());
50 ////    AttributePtr aPt2 = myBaseConstraint->attribute(SketchPlugin_Constraint::ENTITY_B());
51 ////
52 ////    BuilderPtr aBuilder = SketchSolver_Manager::instance()->builder();
53 ////    std::shared_ptr<GeomAPI_Pnt2d> aPoint1 = aBuilder->point(myStorage->entity(aPt1));
54 ////    EntityWrapperPtr anEntity2 = myStorage->entity(aPt2);
55 ////    std::shared_ptr<GeomAPI_Pnt2d> aPoint2 = aBuilder->point(anEntity2);
56 ////
57 ////////    if (aPoint1->distance(aPoint2) < tolerance) {
58 ////////      // Change X coordinate of second point to eliminate coincidence
59 ////////      ParameterWrapperPtr aX = aSubs.back()->parameters().front();
60 ////////      aX->setValue(aX->value() + 1.0);
61 ////////      myStorage->update(aX);
62 ////////    }
63     return;
64   }
65
66   // Adjust point-line distance
67   if (fabs(myPrevValue) == fabs(aConstraint->value())) {
68     // sign of distance is not changed
69 ////    aConstraint->setValue(myPrevValue);
70 ////    myStorage->addConstraint(myBaseConstraint, aConstraint);
71     return;
72   }
73
74 ////  // Adjust the sign of constraint value
75 ////  BuilderPtr aBuilder = SketchSolver_Manager::instance()->builder();
76 ////
77 ////  std::shared_ptr<GeomAPI_Lin2d> aLine;
78 ////  std::shared_ptr<GeomAPI_Pnt2d> aPoint;
79 ////  for (int i = 0; i < 2; ++i) {
80 ////    AttributePtr anAttr = myBaseConstraint->attribute(SketchPlugin_Constraint::ATTRIBUTE(i));
81 ////    EntityWrapperPtr anEntity = myStorage->entity(anAttr);
82 ////    if (anEntity->type() == ENTITY_POINT)
83 ////      aPoint = aBuilder->point(anEntity);
84 ////    else if (anEntity->type() == ENTITY_LINE)
85 ////      aLine = aBuilder->line(anEntity);
86 ////  }
87 ////
88 ////  std::shared_ptr<GeomAPI_XY> aLineVec = aLine->direction()->xy();
89 ////  std::shared_ptr<GeomAPI_XY> aPtLineVec = aPoint->xy()->decreased(aLine->location()->xy());
90 ////  if (aLineVec->cross(aPtLineVec) * aConstraint->value() < 0.0)
91 ////    aConstraint->setValue(aConstraint->value() * (-1.0));
92 }
93
94 void SketchSolver_ConstraintDistance::update()
95 {
96   ConstraintWrapperPtr aConstraint = myStorage->constraint(myBaseConstraint);
97   myPrevValue = aConstraint->value();
98
99   SketchSolver_Constraint::update();
100 }