Salome HOME
Issue #1941 Split auxiliary line.
[modules/shaper.git] / src / SketchSolver / SketchSolver_Builder.cpp
1 // Copyright (C) 2014-20xx CEA/DEN, EDF R&D
2
3 // File:    SketchSolver_Builder.cpp
4 // Created: 25 Mar 2015
5 // Author:  Artem ZHIDKOV
6
7 #include "SketchSolver_Builder.h"
8 #include <SketchSolver_Constraint.h>
9 #include <SketchSolver_ConstraintAngle.h>
10 #include <SketchSolver_ConstraintCoincidence.h>
11 #include <SketchSolver_ConstraintCollinear.h>
12 #include <SketchSolver_ConstraintDistance.h>
13 #include <SketchSolver_ConstraintEqual.h>
14 #include <SketchSolver_ConstraintFixed.h>
15 #include <SketchSolver_ConstraintFixedArcRadius.h>
16 #include <SketchSolver_ConstraintLength.h>
17 #include <SketchSolver_ConstraintMiddle.h>
18 #include <SketchSolver_ConstraintMirror.h>
19 #include <SketchSolver_ConstraintTangent.h>
20 #include <SketchSolver_ConstraintMultiRotation.h>
21 #include <SketchSolver_ConstraintMultiTranslation.h>
22 #include <SketchSolver_ConstraintMovement.h>
23
24 #ifdef _DEBUG
25 #include <Events_InfoMessage.h>
26 #include <ModelAPI_AttributeRefList.h>
27 #include <ModelAPI_ResultConstruction.h>
28 #include <SketchSolver_Error.h>
29 #endif
30
31 #include <SketchPlugin_ConstraintAngle.h>
32 #include <SketchPlugin_ConstraintCoincidence.h>
33 #include <SketchPlugin_ConstraintCollinear.h>
34 #include <SketchPlugin_ConstraintDistance.h>
35 #include <SketchPlugin_ConstraintEqual.h>
36 #include <SketchPlugin_ConstraintLength.h>
37 #include <SketchPlugin_ConstraintMiddle.h>
38 #include <SketchPlugin_ConstraintMirror.h>
39 #include <SketchPlugin_ConstraintRigid.h>
40 #include <SketchPlugin_ConstraintTangent.h>
41 #include <SketchPlugin_MultiRotation.h>
42 #include <SketchPlugin_MultiTranslation.h>
43
44 #include <math.h>
45
46 SolverConstraintPtr SketchSolver_Builder::createConstraint(ConstraintPtr theConstraint) const
47 {
48   SolverConstraintPtr aResult;
49   DataPtr aData = theConstraint->data();
50   if (!aData || !aData->isValid())
51     return aResult;
52
53 #ifdef _DEBUG
54   // Verify attributes of constraint and generate errors
55   std::list<AttributePtr> anAttrList = aData->attributes(std::string());
56   std::list<AttributePtr>::iterator anIter = anAttrList.begin();
57   for (; anIter != anAttrList.end(); anIter++) {
58     AttributeRefAttrPtr aRefAttr = std::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(*anIter);
59     if (aRefAttr) {
60       if (aRefAttr->isObject() && aRefAttr->object()) {
61         ResultConstructionPtr aRC =
62             std::dynamic_pointer_cast<ModelAPI_ResultConstruction>(aRefAttr->object());
63         if (!aRC)
64           Events_InfoMessage("SketchSolver_Builder",
65                              SketchSolver_Error::NEED_OBJECT_NOT_FEATURE(), this).send();
66       }
67       continue;
68     }
69     AttributeRefListPtr aRefList = std::dynamic_pointer_cast<ModelAPI_AttributeRefList>(*anIter);
70     if (aRefList) {
71       std::list<ObjectPtr> aList = aRefList->list();
72       std::list<ObjectPtr>::iterator aListIter = aList.begin();
73       for (; aListIter != aList.end(); aListIter++) {
74         ResultConstructionPtr aRC =
75             std::dynamic_pointer_cast<ModelAPI_ResultConstruction>(*aListIter);
76         if (*aListIter && !aRC)
77           Events_InfoMessage("SketchSolver_Builder",
78             SketchSolver_Error::NEED_OBJECT_NOT_FEATURE(), this).send();
79       }
80     }
81   }
82 #endif
83
84   if (theConstraint->getKind() == SketchPlugin_ConstraintCoincidence::ID()) {
85     return SolverConstraintPtr(new SketchSolver_ConstraintCoincidence(theConstraint));
86   } else if (theConstraint->getKind() == SketchPlugin_ConstraintCollinear::ID()) {
87     return SolverConstraintPtr(new SketchSolver_ConstraintCollinear(theConstraint));
88   } else if (theConstraint->getKind() == SketchPlugin_ConstraintDistance::ID()) {
89     return SolverConstraintPtr(new SketchSolver_ConstraintDistance(theConstraint));
90   } else if (theConstraint->getKind() == SketchPlugin_ConstraintEqual::ID()) {
91     return SolverConstraintPtr(new SketchSolver_ConstraintEqual(theConstraint));
92   } else if (theConstraint->getKind() == SketchPlugin_ConstraintLength::ID()) {
93     return SolverConstraintPtr(new SketchSolver_ConstraintLength(theConstraint));
94   } else if (theConstraint->getKind() == SketchPlugin_ConstraintMiddle::ID()) {
95     return SolverConstraintPtr(new SketchSolver_ConstraintMiddle(theConstraint));
96   } else if (theConstraint->getKind() == SketchPlugin_ConstraintMirror::ID()) {
97     return SolverConstraintPtr(new SketchSolver_ConstraintMirror(theConstraint));
98   } else if (theConstraint->getKind() == SketchPlugin_ConstraintTangent::ID()) {
99     return SolverConstraintPtr(new SketchSolver_ConstraintTangent(theConstraint));
100   } else if (theConstraint->getKind() == SketchPlugin_ConstraintRigid::ID()) {
101     return SolverConstraintPtr(new SketchSolver_ConstraintFixed(theConstraint));
102   } else if (theConstraint->getKind() == SketchPlugin_MultiTranslation::ID()) {
103     return SolverConstraintPtr(new SketchSolver_ConstraintMultiTranslation(theConstraint));
104   } else if (theConstraint->getKind() == SketchPlugin_MultiRotation::ID()) {
105     return SolverConstraintPtr(new SketchSolver_ConstraintMultiRotation(theConstraint));
106   } else if (theConstraint->getKind() == SketchPlugin_ConstraintAngle::ID()) {
107     return SolverConstraintPtr(new SketchSolver_ConstraintAngle(theConstraint));
108   }
109   // All other types of constraints
110   return SolverConstraintPtr(new SketchSolver_Constraint(theConstraint));
111 }
112
113 SolverConstraintPtr SketchSolver_Builder::createFixedConstraint(FeaturePtr theFixedFeature) const
114 {
115   DataPtr aData = theFixedFeature->data();
116   if (!aData || !aData->isValid())
117     return SolverConstraintPtr();
118   return SolverConstraintPtr(new SketchSolver_ConstraintFixed(theFixedFeature));
119 }
120
121 SolverConstraintPtr SketchSolver_Builder::createFixedArcRadiusConstraint(FeaturePtr theArc) const
122 {
123   DataPtr aData = theArc->data();
124   if (!aData || !aData->isValid())
125     return SolverConstraintPtr();
126   return SolverConstraintPtr(new SketchSolver_ConstraintFixedArcRadius(theArc));
127 }
128
129 SolverConstraintPtr SketchSolver_Builder::createMovementConstraint(FeaturePtr theFixedFeature) const
130 {
131   DataPtr aData = theFixedFeature->data();
132   if (!aData || !aData->isValid())
133     return SolverConstraintPtr();
134   return SolverConstraintPtr(new SketchSolver_ConstraintMovement(theFixedFeature));
135 }
136
137 std::shared_ptr<GeomAPI_Pnt2d> SketchSolver_Builder::point(EntityWrapperPtr theEntity) const
138 {
139   if (theEntity->type() != ENTITY_POINT)
140     return std::shared_ptr<GeomAPI_Pnt2d>();
141   if (theEntity->subEntities().size() == 1) // SketchPlugin_Point wrapper
142     return point(theEntity->subEntities().front());
143
144   double aXY[2];
145   std::list<ParameterWrapperPtr> aParams = theEntity->parameters();
146   std::list<ParameterWrapperPtr>::const_iterator anIt = aParams.begin();
147   for (int i = 0; i < 2 && anIt != aParams.end(); ++i, ++anIt)
148     aXY[i] = (*anIt)->value();
149   if (anIt != aParams.end())
150     return std::shared_ptr<GeomAPI_Pnt2d>();
151
152   return std::shared_ptr<GeomAPI_Pnt2d>(new GeomAPI_Pnt2d(aXY[0], aXY[1]));
153 }
154
155 std::shared_ptr<GeomAPI_Lin2d> SketchSolver_Builder::line(EntityWrapperPtr theEntity) const
156 {
157   if (theEntity->type() != ENTITY_LINE)
158     return std::shared_ptr<GeomAPI_Lin2d>();
159
160   std::shared_ptr<GeomAPI_Pnt2d> aPoints[2];
161   std::list<EntityWrapperPtr> aSubs = theEntity->subEntities();
162   std::list<EntityWrapperPtr>::const_iterator anIt = aSubs.begin();
163   for (int i = 0; i < 2 && anIt != aSubs.end(); ++i, ++anIt)
164     aPoints[i] = point(*anIt);
165   if (anIt != aSubs.end())
166     return std::shared_ptr<GeomAPI_Lin2d>();
167
168   return std::shared_ptr<GeomAPI_Lin2d>(new GeomAPI_Lin2d(aPoints[0], aPoints[1]));
169 }
170