X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketchSolver%2FSketchSolver_Storage.h;h=bb270d77d191a1083c0b9d53e6f03898a4b09ee9;hb=8f10db487ef409d859a62aa6e2235a17d9b56723;hp=613e0ec29ab812af6b1f4c6b6afe388e36356342;hpb=b900918cef83bb82217e7221c7ff0ad9d8a6dbe9;p=modules%2Fshaper.git diff --git a/src/SketchSolver/SketchSolver_Storage.h b/src/SketchSolver/SketchSolver_Storage.h index 613e0ec29..bb270d77d 100644 --- a/src/SketchSolver/SketchSolver_Storage.h +++ b/src/SketchSolver/SketchSolver_Storage.h @@ -58,16 +58,34 @@ public: * \return \c true if the entity was successfully removed */ bool removeEntity(const Slvs_hEntity& theEntityID); + /** \brief Remove all entities, which are not used in constraints + */ + void removeUnusedEntities(); /// \brief Returns the entity by its ID const Slvs_Entity& getEntity(const Slvs_hEntity& theEntityID) const; /// \brief Makes a full copy of the given entity Slvs_hEntity copyEntity(const Slvs_hEntity& theCopied); /// \brief Copy one entity to another void copyEntity(const Slvs_hEntity& theFrom, const Slvs_hEntity& theTo); + /// \brief Check the entity is used in constraints + bool isUsedByConstraints(const Slvs_hEntity& theEntityID) const; + /// \brief Returns maximal ID of entities in this storage + const Slvs_hEntity& entityMaxID() const + { return myEntityMaxID; } /// \brief Verifies the current point or another coincident one is fixed - /// \return the ID of the Fixed constraint or SLVS_E_UNKNOWN - Slvs_hConstraint isPointFixed(const Slvs_hEntity& thePointID) const; + /// \param[in] thePointID entity to be checked fixed + /// \param[out] theFixed ID of constraint + /// \param[in] theAccurate if \c true, the calculation will be made for all type of constraints, + /// if \c false, only the point is verified + /// \return \c true if the point is fixed + bool isPointFixed(const Slvs_hEntity& thePointID, Slvs_hConstraint& theFixed, bool theAccurate = false) const; + /// \brief Verifies the current entity is fully fixed (may not be changed by constraints) + /// \param[in] theEntityID entity to be checked fixed + /// \param[in] theAccurate if \c true, the calculation will be made for all type of constraints, + /// if \c false, only points are verified + /// \return \c true if the entity is fixed + bool isEntityFixed(const Slvs_hEntity& theEntityID, bool theAccurate = false) const; /** \brief Add new constraint to the current group * \param[in] theConstraint SolveSpace's constraint @@ -90,6 +108,9 @@ public: const Slvs_Constraint& getConstraint(const Slvs_hConstraint& theConstraintID) const; /// \brief Returns list of constraints of specified type std::list getConstraintsByType(int theConstraintType) const; + /// \brief Returns quantity of constraints in this storage + size_t nbConstraints() const + { return myConstraints.size(); } /// \brief Attach constraint SLVS_C_WHERE_DRAGGED to this storage. It need to make precise calculations void addConstraintWhereDragged(const Slvs_hConstraint& theConstraintID); @@ -98,12 +119,21 @@ public: void addTemporaryConstraint(const Slvs_hConstraint& theConstraintID); /// \brief Remove all transient constraints void removeTemporaryConstraints(); + /// \brief Remove one temporary constraint. Preferable to remove the points under Point-on-Line constraint + /// \return Number of remaining temporary constraints + int deleteTemporaryConstraint(); /// \brief Checks the constraint is temporary bool isTemporary(const Slvs_hConstraint& theConstraintID) const; + /// \brief Number of temporary constraints + int numberTemporary() const + { return (int)myTemporaryConstraints.size(); } /// \brief Shows the sketch should be resolved - bool isNeedToResolve() const - { return myNeedToResolve; } + bool isNeedToResolve(); + + /// \brief Shows the storage has the same constraint twice + bool hasDuplicatedConstraint() const + { return myDuplicatedConstraint; } /// \brief Changes the flag of group to be resolved void setNeedToResolve(bool theFlag) @@ -122,11 +152,48 @@ private: void addCoincidentPoints(const Slvs_hEntity& thePoint1, const Slvs_hEntity& thePoint2); /// \brief Remove point from lists of coincidence void removeCoincidentPoint(const Slvs_hEntity& thePoint); + /// \brief Remove point-point coincidence + void removeCoincidence(const Slvs_Constraint& theCoincidence); public: /// \brief Check two points are coincident bool isCoincident(const Slvs_hEntity& thePoint1, const Slvs_hEntity& thePoint2) const; + /// \brief Check two points are coincident or have same coordinates + bool isEqual(const Slvs_hEntity& thePoint1, const Slvs_hEntity& thePoint2) const; + + /// \brief Check the entity is horizontal of vertical + bool isAxisParallel(const Slvs_hEntity& theEntity) const; + + /// \brief Verifies the entity is used in any equal constraint + /// \param[in] theEntity entity to be found + /// \param[out] theEqual constraint, which uses the entity + /// \return \c true, if the Equal constrait is found + bool isUsedInEqual(const Slvs_hEntity& theEntity, Slvs_Constraint& theEqual) const; + + /// \brief Fixes specified entity + /// \param theEntity ID of the entity to be fixed + /// \return List of created constraints + std::vector fixEntity(const Slvs_hEntity& theEntity); + +private: + /// \brief Fixes specified point + /// \param [in] thePoint point to be fixed + /// \param [out] theCreated list of the Fixed constraints created + void fixPoint(const Slvs_Entity& thePoint, std::vector& theCreated); + /// \brief Fixes specified line + /// \param [in] theLine line to be fixed + /// \param [out] theCreated list of the Fixed constraints created + void fixLine(const Slvs_Entity& theLine, std::vector& theCreated); + /// \brief Fixes specified circle + /// \param [in] theCircle circle to be fixed + /// \param [out] theCreated list of the Fixed constraints created + void fixCircle(const Slvs_Entity& theCircle, std::vector& theCreated); + /// \brief Fixes specified arc + /// \param [in] theArc arc to be fixed + /// \param [out] theCreated list of the Fixed constraints created + void fixArc(const Slvs_Entity& theArc, std::vector& theCreated); + private: Slvs_hParam myParamMaxID; ///< current parameter index (may differs with the number of parameters) std::vector myParameters; ///< list of parameters used in the current group of constraints (sorted by the identifier) @@ -139,11 +206,13 @@ private: Slvs_hConstraint myFixed; ///< identifier of one of temporary constraints to fix separate point bool myNeedToResolve; ///< parameters are changed and group needs to be resolved + bool myDuplicatedConstraint; ///< shows the storage has same constraint twice std::set myTemporaryConstraints; ///< list of transient constraints std::set myRemovedParameters; ///< list of just removed parameters (cleared when returning to applicant) std::set myRemovedEntities; ///< list of just removed entities (cleared when returning to applicant) std::set myRemovedConstraints; ///< list of just removed constraints (cleared when returning to applicant) + std::set myUpdatedParameters; ///< list of just updated parameters (cleared when isNeedToResolve() called) }; typedef std::shared_ptr StoragePtr;