1 // Copyright (C) 2014-2017 CEA/DEN, EDF R&D
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Lesser General Public License for more details.
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 // See http://www.salome-platform.org/ or
18 // email : webmaster.salome@opencascade.com<mailto:webmaster.salome@opencascade.com>
21 #ifndef SketchSolver_Storage_H_
22 #define SketchSolver_Storage_H_
24 #include <PlaneGCSSolver_ConstraintWrapper.h>
25 #include <PlaneGCSSolver_EntityWrapper.h>
27 #include <PlaneGCSSolver_Solver.h>
28 #include <PlaneGCSSolver_UpdateFeature.h>
30 #include <ModelAPI_Attribute.h>
31 #include <ModelAPI_AttributeDouble.h>
32 #include <ModelAPI_Feature.h>
33 #include <SketchPlugin_Constraint.h>
35 class SketchSolver_ConstraintDistance;
36 class SketchSolver_ConstraintFixedArcRadius;
37 typedef std::map<EntityWrapperPtr, std::set<EntityWrapperPtr> > CoincidentPointsMap;
40 /** \class SketchSolver_Storage
42 * \brief Interface to map SketchPlugin features to the entities of corresponding solver.
44 class SketchSolver_Storage
47 SketchSolver_Storage(const SketchSolver_Storage&);
48 SketchSolver_Storage& operator=(const SketchSolver_Storage&);
51 SketchSolver_Storage(SolverPtr theSolver);
53 /// \brief Change mapping between constraint from SketchPlugin and
54 /// a constraint applicable for corresponding solver.
55 /// \param theConstraint [in] original SketchPlugin constraint
56 /// \param theSolverConstraint [in] solver's constraint
57 virtual void addConstraint(ConstraintPtr theConstraint,
58 ConstraintWrapperPtr theSolverConstraint);
60 /// \brief Add a movement constraint which will be destroyed
61 /// after the next solving of the set of constraints.
62 /// \param theSolverConstraint [in] solver's constraint
63 virtual void addMovementConstraint(const ConstraintWrapperPtr& theSolverConstraint) = 0;
65 /// \brief Change mapping feature from SketchPlugin and
66 /// the entity applicable for corresponding solver.
67 /// \param theFeature [in] original SketchPlugin feature
68 /// \param theSolverEntity [in] solver's entity, created outside
69 void addEntity(FeaturePtr theFeature,
70 EntityWrapperPtr theSolverEntity);
72 /// \brief Change mapping attribute of a feature and the entity
73 /// applicable for corresponding solver.
74 /// \param theAttribute [in] original attribute
75 /// \param theSolverEntity [in] solver's entity, created outside
76 void addEntity(AttributePtr theAttribute,
77 EntityWrapperPtr theSolverEntity);
79 /// \brief Convert feature to the form applicable for specific solver and map it
80 /// \param theFeature [in] feature to convert
81 /// \param theForce [in] forced feature creation
82 /// \return \c true if the feature has been created or updated
83 virtual bool update(FeaturePtr theFeature, bool theForce = false) = 0;
85 /// \brief Convert attribute to the form applicable for specific solver and map it
86 /// \param theAttribute [in] attribute to convert
87 /// \param theForce [in] forced feature creation
88 /// \return \c true if the attribute has been created or updated
89 virtual bool update(AttributePtr theAttribute, bool theForce = false) = 0;
91 /// \brief Returns constraint related to corresponding constraint
92 const ConstraintWrapperPtr& constraint(const ConstraintPtr& theConstraint) const;
94 /// \brief Returns entity related to corresponding feature
95 const EntityWrapperPtr& entity(const FeaturePtr& theFeature) const;
96 /// \brief Returns entity related to corresponding attribute
97 const EntityWrapperPtr& entity(const AttributePtr& theAttribute) const;
99 /// \brief Make entity external
100 virtual void makeExternal(const EntityWrapperPtr& theEntity) = 0;
101 /// \brief Make entity non-external
102 virtual void makeNonExternal(const EntityWrapperPtr& theEntity) = 0;
104 /// \brief Removes constraint from the storage
105 /// \return \c true if the constraint and all its parameters are removed successfully
106 virtual bool removeConstraint(ConstraintPtr theConstraint) = 0;
107 /// \brief Removes feature from the storage
108 void removeFeature(FeaturePtr theFeature);
109 /// \brief Removes attribute from the storage
110 void removeAttribute(AttributePtr theAttribute);
112 /// \brief Remove all features became invalid
113 virtual void removeInvalidEntities() = 0;
115 /// \brief Check the features have not been removed
116 bool areFeaturesValid() const;
118 /// \brief Check the storage has constraints
119 virtual bool isEmpty() const
120 { return myConstraintMap.empty(); }
122 /// \brief Shows the sketch should be resolved
123 virtual bool isNeedToResolve()
124 { return myNeedToResolve; }
125 /// \brief Changes the flag of group to be resolved
126 void setNeedToResolve(bool theFlag)
127 { myNeedToResolve = theFlag; }
129 /// \brief Return list of conflicting constraints
130 std::set<ObjectPtr> getConflictingConstraints(SolverPtr theSolver) const;
132 /// \brief Verify, the sketch contains degenerated geometry
133 /// after resolving the set of constraints
134 /// \return STATUS_OK if the geometry is valid, STATUS_DEGENERATED otherwise.
135 virtual PlaneGCSSolver_Solver::SolveStatus checkDegeneratedGeometry() const = 0;
137 /// \brief Update SketchPlugin features after resolving constraints
138 virtual void refresh() const = 0;
140 /// \brief Block or unblock events when refreshing features
141 void blockEvents(bool isBlocked);
143 /// \brief Subscribe for updates of features
144 /// \param theSubscriber [in] object which wants to revceive notifications
145 /// \param theGroup [in] group of updates features to be send
146 void subscribeUpdates(SketchSolver_Constraint* theSubscriber, const std::string& theGroup) const;
147 /// \brief Unsubscribe for updates of features
148 /// \param theSubscriber [in] object which does not want to revceive notifications anymore
149 void unsubscribeUpdates(SketchSolver_Constraint* theSubscriber) const;
151 /// \brief Notify all subscribers about update of the feature
152 void notify(const FeaturePtr& theFeature) const;
155 /// \brief Convert result to feature or attribute if theResult is linked to center of circle/arc
156 static void resultToFeatureOrAttribute(const ObjectPtr& theResult,
157 FeaturePtr& theFeature,
158 AttributePtr& theAttribute);
161 SolverPtr mySketchSolver; ///< Sketch solver, prepared in corresponding group
162 bool myNeedToResolve; ///< parameters are changed and group needs to be resolved
163 bool myEventsBlocked; ///< indicates that features do not send events
165 /// map SketchPlugin constraint to a list of solver's constraints
166 std::map<ConstraintPtr, ConstraintWrapperPtr> myConstraintMap;
167 /// map SketchPlugin feature to solver's entity
168 std::map<FeaturePtr, EntityWrapperPtr> myFeatureMap;
169 /// map attribute to solver's entity
170 std::map<AttributePtr, EntityWrapperPtr> myAttributeMap;
172 UpdaterPtr myUpdaters;
175 typedef std::shared_ptr<SketchSolver_Storage> StoragePtr;