X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketchSolver%2FSketchSolver_Group.h;h=193e1d54182391bfa0aa62f17d57b7b0f4392d73;hb=4f565b2204d3fba046aa8c851abada2a5a17bf6c;hp=68317fd0a15db5819d55f311d595036ece11c737;hpb=bc06873747d5ea9bc0e8d6bd56641eebe33ac08d;p=modules%2Fshaper.git diff --git a/src/SketchSolver/SketchSolver_Group.h b/src/SketchSolver/SketchSolver_Group.h index 68317fd0a..193e1d541 100644 --- a/src/SketchSolver/SketchSolver_Group.h +++ b/src/SketchSolver/SketchSolver_Group.h @@ -10,18 +10,14 @@ #include "SketchSolver.h" #include #include -#include -#include +#include #include -#include #include - #include #include #include -#include #include typedef std::map ConstraintConstraintMap; @@ -42,22 +38,17 @@ class SketchSolver_Group ~SketchSolver_Group(); /// \brief Returns group's unique identifier - inline const Slvs_hGroup& getId() const + inline const GroupID& getId() const { return myID; } /// \brief Returns identifier of the workplane - inline const Slvs_hEntity& getWorkplaneId() const + inline const EntityID& getWorkplaneId() const { return myWorkplaneID; } - /// \brief Find the identifier of the feature, if it already exists in the group - Slvs_hEntity getFeatureId(FeaturePtr theFeature) const; - /// \brief Find the identifier of the attribute, if it already exists in the group - Slvs_hEntity getAttributeId(AttributePtr theAttribute) const; - /// \brief Returns true if the group has no constraints yet inline bool isEmpty() const { @@ -70,38 +61,35 @@ class SketchSolver_Group return mySketch->data() && mySketch->data()->isValid(); } + /// \brief Check the group has conflicting constraints + inline bool isFailed() const + { + return !myConflictingConstraints.empty(); + } + /** \brief Adds or updates a constraint in the group * \param[in] theConstraint constraint to be changed * \return \c true if the constraint added or updated successfully */ bool changeConstraint(std::shared_ptr theConstraint); -//// /** \brief Adds or updates a rigid constraint in the group -//// * \param[in] theConstraint constraint to be changed -//// * \return \c true if the constraint added or updated successfully -//// */ -//// bool changeRigidConstraint(std::shared_ptr theConstraint); -//// /** \brief Adds or updates a mirror constraint in the group -//// * \param[in] theConstraint constraint to be changed -//// * \return \c true if the constraint added or updated successfully -//// */ -//// bool changeMirrorConstraint(std::shared_ptr theConstraint); -//// /** \brief Adds or updates a fillet constraint in the group -//// * \param[in] theConstraint constraint to be changed -//// * \return \c true if the constraint added or updated successfully -//// */ -//// bool changeFilletConstraint(std::shared_ptr theConstraint); + + /** \brief Updates the data corresponding the specified feature + * \param[in] theFeature the feature to be updated + */ + bool updateFeature(FeaturePtr theFeature); /** \brief Updates the data corresponding the specified feature moved in GUI. * Additional Fixed constraints are created. * \param[in] theFeature the feature to be updated + * \return \c true, if the feature is moved */ - void moveFeature(std::shared_ptr theFeature); + bool moveFeature(FeaturePtr theFeature); /** \brief Verifies the feature attributes are used in this group * \param[in] theFeature constraint or any other object for verification of interaction * \return \c true if some of attributes are used in current group */ - bool isInteract(std::shared_ptr theFeature) const; + bool isInteract(FeaturePtr theFeature) const; /** \brief Verifies the specified feature is equal to the base workplane for this group * \param[in] theWorkplane the feature to be compared with base workplane @@ -116,14 +104,10 @@ class SketchSolver_Group } /** \brief Update parameters of workplane. Should be called when Update event is coming. - * \return \c true if workplane updated successfully, \c false if workplane parameters are not consistent + * \return \c true if workplane updated successfully, + * \c false if workplane parameters are not consistent */ bool updateWorkplane(); -//// -//// /** \brief If the entity is in this group it will updated -//// * \param[in] theEntity attribute, which values should update SolveSpace entity -//// */ -//// void updateEntityIfPossible(std::shared_ptr theEntity); /** \brief Searches invalid features and constraints in the group and removes them * \return \c false if the group several constraints were removed @@ -135,94 +119,30 @@ class SketchSolver_Group */ void mergeGroups(const SketchSolver_Group& theGroup); - /** \brief Cut from the group several subgroups, which are not connected to the current one by any constraint + /** \brief Cut from the group several subgroups, which are not connected to + * the current one by any constraint * \param[out] theCuts enlarge this list by newly created groups */ - void splitGroup(std::vector& theCuts); + void splitGroup(std::list& theCuts); /** \brief Start solution procedure if necessary and update attributes of features * \return \c false when no need to solve constraints */ bool resolveConstraints(); -//// -//// /** \brief Searches the constraints built on the entity and emit the signal to update them -//// * \param[in] theEntity attribute of the constraint -//// */ -//// void updateRelatedConstraints(std::shared_ptr theEntity) const; -//// /** \brief Searches the constraints built on the entity and emit the signal to update them -//// * \param[in] theFeature feature of the constraint -//// */ -//// void updateRelatedConstraintsFeature(std::shared_ptr theFeature) const; -//// -//// /** \brief Adds or updates an entity in the group -//// * -//// * The parameters of entity will be parsed and added to the list of SolveSpace parameters. -//// * Parameters of certain entity will be placed sequentially in the list. -//// * -//// * \param[in] theEntity the object of constraint -//// * \return identifier of changed entity or 0 if entity could not be changed -//// */ -//// Slvs_hEntity changeEntity(std::shared_ptr theEntity); -//// Slvs_hEntity changeEntityFeature(std::shared_ptr theEntity); -protected: -//// /** \brief Adds or updates a normal in the group -//// * -//// * Normal is a special entity in SolveSpace, which defines a direction in 3D and -//// * a rotation about this direction. So, SolveSpace represents normals as unit quaternions. -//// * -//// * To define a normal there should be specified two coordinate axis -//// * on the plane transversed to created normal. -//// * -//// * \param[in] theDirX first coordinate axis of the plane -//// * \param[in] theNorm attribute for the normal (used to identify newly created entity) -//// * \return identifier of created or updated normal -//// */ -//// Slvs_hEntity changeNormal(std::shared_ptr theDirX, -//// std::shared_ptr theNorm); -//// -//// /** \brief Adds or updates a parameter in the group -//// * \param[in] theParam the value of parameter -//// * \param[in] thePrmIter the cell in the list of parameters which should be changed -//// * (the iterator will be increased if it does not reach the end of the list) -//// * \return identifier of changed parameter; when the parameter cannot be created, returned ID is 0 -//// */ -//// Slvs_hParam changeParameter(const double& theParam, -//// std::vector::const_iterator& thePrmIter); -//// -//// /** \brief Removes specified entities and their parameters -//// * \param[in] theEntities list of IDs of the entities to be removed -//// */ -//// void removeEntitiesById(const std::set& theEntities); + /** \brief Collect all features applicable for the sketch + * \param theObjects list of features + * \return list of bolted and sorted features + */ + static std::list selectApplicableFeatures(const std::set& theObjects); +protected: /** \brief Removes constraints from the group * \param[in] theConstraint constraint to be removed */ void removeConstraint(ConstraintPtr theConstraint); -//// -//// /** \brief Change values of attribute by parameters received from SolveSpace solver -//// * \param[in,out] theAttribute pointer to the attribute to be changed -//// * \param[in] theEntityID identifier of SolveSpace entity, which contains updated data -//// * \return \c true if the attribute's value has changed -//// */ -//// bool updateAttribute(std::shared_ptr theAttribute, -//// const Slvs_hEntity& theEntityID); -//// -//// /// \brief Update arc of fillet to be less than 180 degree -//// void updateFilletConstraints(); -//// -//// /** \brief Adds a constraint for a point which should not be changed during computations -//// * \param[in] theEntity the base for the constraint -//// * \param[in] theAllowToFit this flag shows that the entity may be placed into -//// * the 'dragged' field of SolveSpace solver, so this entity -//// * may be changed a little during solution -//// */ -//// void addTemporaryConstraintWhereDragged(std::shared_ptr theEntity, -//// bool theAllowToFit = true); - - /** \brief Remove all temporary constraint after computation finished - * \param[in] theRemoved indexes of constraints to be removed. If empty, all temporary constraints should be deleted - */ + + /// \brief Remove all temporary constraint after computation finished void removeTemporaryConstraints(); private: @@ -231,79 +151,34 @@ private: * \return \c true if success, \c false if workplane parameters are not consistent */ bool addWorkplane(CompositeFeaturePtr theSketch); -//// -//// /** \brief Add the entities of constraint for points coincidence into the appropriate list -//// * \param[in] thePoint1 identifier of the first point -//// * \param[in] thePoint2 identifier of the second point -//// * \return \c true if the points are added successfully, and -//// * \c false if the constraint is the extra one (should not be created in SolveSpace) -//// */ -//// bool addCoincidentPoints(const Slvs_hEntity& thePoint1, const Slvs_hEntity& thePoint2); -//// -//// /** \brief Verifies and changes parameters of constriant, -//// * e.g. sign of the distance between line and point -//// * \param[in,out] theConstraint SolveSpace constraint to be verified -//// */ -//// void checkConstraintConsistence(Slvs_Constraint& theConstraint); -//// -//// /** \brief Change entities parameters to make them symmetric relating to the mirror line -//// * \param[in] theBase entity to be mirrored -//// * \param[in] theMirror a mirrored object -//// * \param[in] theMirrorLine a mirror line -//// */ -//// void makeMirrorEntity(const Slvs_hEntity& theBase, -//// const Slvs_hEntity& theMirror, -//// const Slvs_hEntity& theMirrorLine); -//// -//// /** \brief Calculates middle point on line or arc -//// * \param[in] theEntity identifier of line or arc -//// * \param[out] theX X value of middle point -//// * \param[out] theY Y value of middle point -//// */ -//// void calculateMiddlePoint(const Slvs_hEntity& theEntity, -//// double& theX, double& theY) const; -//// -//// private: -//// // SolveSpace entities -//// Slvs_hGroup myID; ///< the index of the group -//// Slvs_Entity myWorkplane; ///< Workplane for the current group -//// std::vector myParams; ///< List of parameters of the constraints -//// Slvs_hParam myParamMaxID; ///< Actual maximal ID of parameters (not equal to myParams size) -//// std::vector myEntities; ///< List of entities of the constaints -//// std::vector myEntOfConstr; ///< Flags show that certain entity used in constraints -//// Slvs_hEntity myEntityMaxID; ///< Actual maximal ID of entities (not equal to myEntities size) -//// std::vector myConstraints; ///< List of constraints in SolveSpace format -//// Slvs_hConstraint myConstrMaxID; ///< Actual maximal ID of constraints (not equal to myConstraints size) -//// bool myNeedToSolve; ///< Indicator that something changed in the group and constraint system need to be rebuilt -//// -//// SketchSolver_Solver myConstrSolver; ///< Solver for set of equations obtained by constraints -//// -//// std::vector myTempPointWhereDragged; ///< Parameters of one of the points which is moved by user -//// Slvs_hEntity myTempPointWDrgdID; ///< Identifier of such point -//// std::list myTempConstraints; ///< The list of identifiers of temporary constraints (SLVS_C_WHERE_DRAGGED) applied for all other points moved by user -//// -//// // SketchPlugin entities -//// std::shared_ptr mySketch; ///< Equivalent to workplane -//// ConstraintMap myConstraintMap; ///< The map between SketchPlugin and SolveSpace constraints -//// std::map, Slvs_hEntity> myEntityAttrMap; ///< The map between "attribute" parameters of constraints and their equivalent SolveSpace entities -//// std::map myEntityFeatMap; ///< The map between "feature" parameters of constraints and their equivalent SolveSpace entities -//// -//// // Conincident items -//// std::vector > myCoincidentPoints; ///< Stores the lists of identifiers of coincident points (to avoid unnecessary coincidence constraints) -//// std::set > myExtraCoincidence; ///< Additional coincidence constraints which are not necessary (coincidence between points already done -//// ///< by other constraints) but created by GUI tools. Useful when some coincidence constraints were removed + + /// \brief Append given constraint to the group of temporary constraints + void setTemporary(SolverConstraintPtr theConstraint); + + /// \brief Verifies is the feature valid + bool checkFeatureValidity(FeaturePtr theFeature); + + /// \brief Notify all interested constraints that coincidence appears or removed + /// \param[in] theCoincidence coincidence constraint + void notifyCoincidenceChanged(SolverConstraintPtr theCoincidence); private: - Slvs_hGroup myID; ///< Index of the group - Slvs_hEntity myWorkplaneID; ///< Index of workplane, the group is based on + GroupID myID; ///< Index of the group + EntityID myWorkplaneID; ///< Index of workplane, the group is based on CompositeFeaturePtr mySketch; ///< Sketch is equivalent to workplane ConstraintConstraintMap myConstraints; ///< List of constraints std::set myTempConstraints; ///< List of temporary constraints + /// List of parametric constraints + std::map myParametricConstraints; + StoragePtr myStorage; ///< Container for the set of SolveSpace constraints and their entities - FeatureStoragePtr myFeatureStorage; ///< Container for the set of SketchPlugin features and their dependencies - SketchSolver_Solver myConstrSolver; ///< Solver for set of equations obtained by constraints + SolverPtr mySketchSolver; ///< Solver for set of equations obtained by constraints + + /// Result of previous solution of the set of constraints + SketchSolver_SolveStatus myPrevResult; + std::set myConflictingConstraints; ///< List of conflicting constraints }; #endif