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