Salome HOME
Correct processing arcs in SketchSolver with SolveSpace (issue #1144)
[modules/shaper.git] / src / SketchSolver / SolveSpaceSolver / SolveSpaceSolver_EntityWrapper.cpp
1 // Copyright (C) 2014-20xx CEA/DEN, EDF R&D
2
3 // File:    SolveSpaceSolver_EntityWrapper.cpp
4 // Created: 2 Dec 2015
5 // Author:  Artem ZHIDKOV
6
7 #include <SolveSpaceSolver_EntityWrapper.h>
8
9 SolveSpaceSolver_EntityWrapper::SolveSpaceSolver_EntityWrapper(
10     const FeaturePtr theFeature, const Slvs_Entity& theEntity)
11   : myEntity(theEntity)
12 {
13   myBaseFeature = theFeature;
14 }
15
16 SolveSpaceSolver_EntityWrapper::SolveSpaceSolver_EntityWrapper(
17     const AttributePtr theAttribute, const Slvs_Entity& theEntity)
18   : myEntity(theEntity)
19 {
20   myBaseAttribute = theAttribute;
21 }
22
23 SolveSpaceSolver_EntityWrapper::SolveSpaceSolver_EntityWrapper(
24     const std::shared_ptr<SketchPlugin_Point> theFeature,
25     const AttributePtr theAttribute,
26     const Slvs_Entity& theEntity)
27   : myEntity(theEntity)
28 {
29   myBaseFeature = FeaturePtr(theFeature);
30   myBaseAttribute = theAttribute;
31 }
32
33
34 EntityID SolveSpaceSolver_EntityWrapper::id() const
35 {
36   return (EntityID)myEntity.h;
37 }
38
39 void SolveSpaceSolver_EntityWrapper::setGroup(const GroupID& theGroup)
40 {
41   myEntity.group = (Slvs_hGroup)theGroup;
42   std::list<EntityWrapperPtr>::iterator aSubsIt = mySubEntities.begin();
43   for (; aSubsIt != mySubEntities.end(); ++aSubsIt)
44     (*aSubsIt)->setGroup(theGroup);
45   std::list<ParameterWrapperPtr>::iterator aPIt = myParameters.begin();
46   for (; aPIt != myParameters.end(); ++aPIt)
47     (*aPIt)->setGroup(theGroup);
48 }
49
50 SketchSolver_EntityType SolveSpaceSolver_EntityWrapper::type() const
51 {
52   switch (myEntity.type) {
53   case SLVS_E_POINT_IN_3D:
54   case SLVS_E_POINT_IN_2D:    return ENTITY_POINT;
55   case SLVS_E_LINE_SEGMENT:   return ENTITY_LINE;
56   case SLVS_E_CIRCLE:         return ENTITY_CIRCLE;
57   case SLVS_E_ARC_OF_CIRCLE:  return ENTITY_ARC;
58   case SLVS_E_NORMAL_IN_3D:
59   case SLVS_E_NORMAL_IN_2D:   return ENTITY_NORMAL;
60   case SLVS_E_DISTANCE:       return ENTITY_SCALAR;
61   case SLVS_E_WORKPLANE:      return ENTITY_SKETCH;
62   default: break;
63   }
64   return ENTITY_UNKNOWN;
65 }
66
67 bool SolveSpaceSolver_EntityWrapper::isUsed(FeaturePtr theFeature) const
68 {
69   if (isBase(theFeature))
70     return true;
71
72   std::list<EntityWrapperPtr>::const_iterator anIt = mySubEntities.begin();
73   for (; anIt != mySubEntities.end(); ++anIt)
74     if ((*anIt)->isUsed(theFeature))
75       return true;
76   return false;
77 }
78
79 bool SolveSpaceSolver_EntityWrapper::isUsed(AttributePtr theAttribute) const
80 {
81   if (isBase(theAttribute))
82     return true;
83
84   std::list<EntityWrapperPtr>::const_iterator anIt = mySubEntities.begin();
85   for (; anIt != mySubEntities.end(); ++anIt)
86     if ((*anIt)->isUsed(theAttribute))
87       return true;
88   return false;
89 }
90
91 bool SolveSpaceSolver_EntityWrapper::isEqual(const EntityWrapperPtr& theOther)
92 {
93   if (type() != theOther->type())
94     return false;
95
96   // Verify Equality of sub-entities
97   const std::list<EntityWrapperPtr>& anOtherSubs = theOther->subEntities();
98   if (mySubEntities.size() != anOtherSubs.size())
99     return false;
100   std::list<EntityWrapperPtr>::const_iterator aMySubsIt = mySubEntities.begin();
101   std::list<EntityWrapperPtr>::const_iterator anOtherSubsIt = anOtherSubs.begin();
102   for (; aMySubsIt != mySubEntities.end(); ++aMySubsIt, ++anOtherSubsIt)
103     if (!(*aMySubsIt)->isEqual(*anOtherSubsIt))
104       return false;
105
106   // Verify equality of parameters
107   const std::list<ParameterWrapperPtr>& anOtherParams = theOther->parameters();
108   if (myParameters.size() != anOtherParams.size())
109     return false;
110   std::list<ParameterWrapperPtr>::const_iterator aMyIt = myParameters.begin();
111   std::list<ParameterWrapperPtr>::const_iterator anOtherIt = anOtherParams.begin();
112   for (; aMyIt != myParameters.end(); ++aMyIt, ++anOtherIt)
113     if (!(*aMyIt)->isEqual(*anOtherIt))
114       return false;
115   return true;
116 }
117
118 bool SolveSpaceSolver_EntityWrapper::update(const EntityWrapperPtr& theOther)
119 {
120   bool isUpdated = false;
121
122   std::list<EntityWrapperPtr> aMySubs = subEntities();
123   std::list<EntityWrapperPtr> anOtherSubs = theOther->subEntities();
124   std::list<EntityWrapperPtr>::const_iterator aMySubsIt = aMySubs.begin();
125   std::list<EntityWrapperPtr>::const_iterator anOtherSubsIt = anOtherSubs.begin();
126   for (; aMySubsIt != aMySubs.end() && anOtherSubsIt != anOtherSubs.end();
127        ++aMySubsIt, ++anOtherSubsIt)
128      isUpdated = (*aMySubsIt)->update(*anOtherSubsIt) || isUpdated;
129
130   std::list<ParameterWrapperPtr> aMyParams = parameters();
131   std::list<ParameterWrapperPtr> anOtherParams = theOther->parameters();
132   std::list<ParameterWrapperPtr>::const_iterator aMyParIt = aMyParams.begin();
133   std::list<ParameterWrapperPtr>::const_iterator anOtherParIt = anOtherParams.begin();
134   for (; aMyParIt != aMyParams.end() && anOtherParIt != anOtherParams.end();
135       ++aMyParIt, ++anOtherParIt)
136     isUpdated = (*aMyParIt)->update(*anOtherParIt);
137   return isUpdated;
138 }