X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketchPlugin%2FSketchPlugin_ConstraintSplit.h;h=e4e1bc7705eb816b4abd8994ea553c445326d6b5;hb=071297c18a7c1bf8e651b96b5874edad24f42e23;hp=bd602854c6100c6b7bdddcbddaba84f51ffb03ad;hpb=7c26163aa1b2f3384ed0b3bd3fb12188478f6189;p=modules%2Fshaper.git diff --git a/src/SketchPlugin/SketchPlugin_ConstraintSplit.h b/src/SketchPlugin/SketchPlugin_ConstraintSplit.h index bd602854c..e4e1bc770 100755 --- a/src/SketchPlugin/SketchPlugin_ConstraintSplit.h +++ b/src/SketchPlugin/SketchPlugin_ConstraintSplit.h @@ -26,7 +26,7 @@ typedef std::pair > IdToPointP * * The following constraints will be applied after split to keep the divided segments geometry: * - Coincident constraints for both parts of created segments in the point of splitting - * - For linear segments parallel, for circles – tangent constraint, for arc – tangent and equal + * - For linear segments parallel, for circles - tangent constraint, for arc - tangent and equal * constraints. In case of three segments in result two couple of constraints are created * - parallel and equal constraints: the first is between 1st and middle entity, the second is * between 1st and 3rd. @@ -80,17 +80,17 @@ class SketchPlugin_ConstraintSplit : public SketchPlugin_ConstraintBase /// \brief Use plugin manager for features creation SketchPlugin_ConstraintSplit(); - /// \return map of base points and features; - //SKETCHPLUGIN_EXPORT const std::map pointsFeaturesMap() const { - // return myPointFeaturesMap; - //}; + /// Returns the AIS preview + SKETCHPLUGIN_EXPORT virtual AISObjectPtr getAISObject(AISObjectPtr thePrevious); private: /// Returns geom point attribute of the feature bounds. It processes line or arc. /// For circle feature, the result attributes are null + /// \param theFeature a source feature /// \param theStartPointAttr an out attribute to start point /// \param theStartPointAttr an out attribute to end point - void getFeaturePoints(std::shared_ptr& theStartPointAttr, + void getFeaturePoints(const FeaturePtr& theFeature, + std::shared_ptr& theStartPointAttr, std::shared_ptr& theEndPointAttr); /// Returns cast of attribute to geometrical point if the attribute is a ref attr attribute @@ -101,32 +101,50 @@ private: /// Obtains those constraints of the feature that should be modified. output maps contain /// point of coincidence and attribute id to be modified after split /// \param theFeaturesToDelete [out] constrains that will be deleted after split + /// \param theFeaturesToUpdate [out] constrains that will be updated after split /// \param theTangentFeatures [out] tangent feature to be connected to new feature /// \param theCoincidenceToFeature [out] coincidence to feature to be connected to new feature /// \param theCoincidenceToPoint [out] coincidence to point be connected to new feature void getConstraints(std::set>& theFeaturesToDelete, - std::map, IdToPointPair>& theTangentFeatures, - std::map, IdToPointPair>& theCoincidenceToFeature, - std::map, IdToPointPair>& theCoincidenceToPoint); + std::set>& theFeaturesToUpdate, + std::map, IdToPointPair>& theCoincidenceToFeature); + /// Obtains references to feature point attributes and to feature, + /// e.g. for feature line: 1st container is + /// <1st line point, list > + /// <2nd line point, list<> > + /// for feature circle 2nd container is + /// \param theFeature an investigated feature + /// \param theRefs a container of list of referenced attributes void getRefAttributes(const FeaturePtr& theFeature, - std::map >& theRefs); + std::map >& theRefs, + std::list& theRefsToFeature); /// Move coincidence constraint from feature to point if it is found /// \param theCoincidenceToFeature coincidence to feature to be connected to new feature /// \param theFurtherCoincidences a list of points where coincidences will be build - /// \paramv theFeatureResults created results after split where constaint might be connected + /// \param theFeatureResults created results after split where constaint might be connected + /// \param theSplitFeature feature created by split, new coincidences to points should be created + /// if theCoincidenceToFeature contains equal points void updateCoincidenceConstraintsToFeature( - const std::map, IdToPointPair>& theCoincidenceToFeature, - const std::set >& theFurtherCoincidences, - const std::set& theFeatureResults); + const std::map, IdToPointPair>& theCoincidenceToFeature, + const std::set >& theFurtherCoincidences, + const std::set& theFeatureResults, + const FeaturePtr& theSplitFeature); + + /// Move constraints from base feature to given feature + /// \param theFeature a base feature + /// \param theRefsToFeature list of attributes referenced to base feature + void updateRefFeatureConstraints(const std::shared_ptr& theFeatureBaseResult, + const std::list& theRefsToFeature); - /// Move tangency constraint to the nearest split feature that has a coincidence to the tangent - /// \param theTangentFeatures tangencies to feature to be connected to nearest feature - /// \param theFurtherCoincidences a list of points where coincidences is built - void updateTangentConstraintsToFeature( - const std::map, IdToPointPair>& theTangentFeatures, - const std::set >& theFurtherCoincidences); + /// Move constraints from attribute of base feature to attribute after modification + /// \param theBaseRefAttributes container of references to the attributes of base feature + /// \param theModifiedAttributes container of attributes placed instead of base attributes + /// at the same place + void updateRefAttConstraints( + const std::map >& theBaseRefAttributes, + const std::set >& theModifiedAttributes); /// Make the base object is splitted by the point attributes /// \param theSplitFeature a result split feature @@ -134,11 +152,14 @@ private: /// \param theAfterFeature a feature between last point of split feature and the end point /// \param thePoints a list of points where coincidences will be build /// \param theCreatedFeatures a container of created features + /// \param theModifiedAttributes a container of attribute on base + /// feature to attribute on new feature void splitLine(std::shared_ptr& theSplitFeature, std::shared_ptr& theBeforeFeature, std::shared_ptr& theAfterFeature, std::set >& thePoints, - std::set>& theCreatedFeatures); + std::set>& theCreatedFeatures, + std::set>& theModifiedAttributes); /// Make the base object is splitted by the point attributes /// \param theSplitFeature a result split feature @@ -150,7 +171,8 @@ private: std::shared_ptr& theBeforeFeature, std::shared_ptr& theAfterFeature, std::set >& thePoints, - std::set>& theCreatedFeatures); + std::set>& theCreatedFeatures, + std::set>& theModifiedAttributes); /// Make the base object is splitted by the point attributes /// \param theSplitFeature a result split feature @@ -162,7 +184,8 @@ private: std::shared_ptr& theBeforeFeature, std::shared_ptr& theAfterFeature, std::set >& thePoints, - std::set>& theCreatedFeatures); + std::set>& theCreatedFeatures, + std::set>& theModifiedAttributes); /// Correct the first and the second point to provide condition that the first is closer to /// the start point and the second point - to the last end of current segment. To rearrange @@ -171,10 +194,24 @@ private: /// \param theEndPointAttr an end point of a segment /// \param theFirstPointAttr a start point of a segment /// \param theSecondPointAttr an end point of a segment - void arrangePoints(const std::shared_ptr& theStartPointAttr, - const std::shared_ptr& theEndPointAttr, - std::shared_ptr& theFirstPointAttr, - std::shared_ptr& theSecondPointAttr); + void arrangePointsOnLine(const std::shared_ptr& theStartPointAttr, + const std::shared_ptr& theEndPointAttr, + std::shared_ptr& theFirstPointAttr, + std::shared_ptr& theSecondPointAttr) const; + + /// Correct the first and the second point to provide condition that the first is closer to + /// the start point and the second point - to the last end of current segment. To rearrange + /// them if this condition is not satisfied. + /// \param theArc an arc to be split + /// \param theStartPointAttr a start point of a segment + /// \param theEndPointAttr an end point of a segment + /// \param theFirstPointAttr a start point of a segment + /// \param theSecondPointAttr an end point of a segment + void arrangePointsOnArc(const FeaturePtr& theArc, + const std::shared_ptr& theStartPointAttr, + const std::shared_ptr& theEndPointAttr, + std::shared_ptr& theFirstPointAttr, + std::shared_ptr& theSecondPointAttr) const; /// Fill attribute by value of another attribute. It processes only Point 2D attributes. /// \param theModifiedAttribute an attribute of GeomDataAPI_Point2D on feature to be modified @@ -214,6 +251,10 @@ private: const std::shared_ptr& theFirstObject, const std::shared_ptr& theSecondObject); + /// Add feature coincidence constraint between given attributes + /// \param theFeaturesToUpdate a constraint index + void updateFeaturesAfterSplit(const std::set& theFeaturesToUpdate); + /// Result result of the feature to build constraint with. For arc, circle it is an edge result. /// \param theFeature a feature /// \return result object @@ -226,11 +267,13 @@ private: std::set > getEdgeAttributes( const std::shared_ptr& theFeature); +#ifdef _DEBUG /// Return feature name, kind, point attribute values united in a string /// \param theFeature an investigated feature /// \return string value std::string getFeatureInfo(const std::shared_ptr& theFeature, const bool isUseAttributesInfo = true); +#endif }; #endif