]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
refs #80 - Sketch base GUI: create/draw point, circle and arc
authornds <natalia.donis@opencascade.com>
Fri, 20 Jun 2014 15:04:35 +0000 (19:04 +0400)
committernds <natalia.donis@opencascade.com>
Fri, 20 Jun 2014 15:04:35 +0000 (19:04 +0400)
1. Move the constraint presentation creation to the feature prs class
2. Create distance/radius presentation classes.

17 files changed:
src/PartSet/CMakeLists.txt
src/PartSet/PartSet_Constants.h
src/PartSet/PartSet_FeatureDistancePrs.cpp [new file with mode: 0644]
src/PartSet/PartSet_FeatureDistancePrs.h [new file with mode: 0644]
src/PartSet/PartSet_FeatureLengthPrs.cpp
src/PartSet/PartSet_FeatureLengthPrs.h
src/PartSet/PartSet_FeatureRadiusPrs.cpp [new file with mode: 0644]
src/PartSet/PartSet_FeatureRadiusPrs.h [new file with mode: 0644]
src/PartSet/PartSet_OperationCreateConstraint.cpp
src/PartSet/PartSet_Presentation.cpp
src/PartSet/PartSet_Presentation.h
src/PartSet/PartSet_Tools.cpp
src/SketchPlugin/SketchPlugin_ConstraintDistance.cpp
src/SketchPlugin/SketchPlugin_ConstraintRadius.cpp
src/SketchPlugin/SketchPlugin_ConstraintRadius.h
src/SketchPlugin/plugin-Sketch.xml
src/SketchSolver/SketchSolver_Constraint.cpp

index 800a4d5933de8009fd8603dacf60aa98cd642080..37822dd00061988cffb478a38659ce5034cfb77f 100644 (file)
@@ -8,10 +8,12 @@ SET(PROJECT_HEADERS
        PartSet_EditLine.h
        PartSet_FeatureArcPrs.h
        PartSet_FeatureCirclePrs.h
+       PartSet_FeatureDistancePrs.h
        PartSet_FeaturePrs.h
        PartSet_FeatureLengthPrs.h
        PartSet_FeatureLinePrs.h
        PartSet_FeaturePointPrs.h
+       PartSet_FeatureRadiusPrs.h
        PartSet_Listener.h
        PartSet_Module.h
        PartSet_OperationCreateConstraint.h
@@ -30,9 +32,11 @@ SET(PROJECT_SOURCES
        PartSet_FeaturePrs.cpp
        PartSet_FeatureArcPrs.cpp
        PartSet_FeatureCirclePrs.cpp
+       PartSet_FeatureDistancePrs.cpp
        PartSet_FeatureLengthPrs.cpp
        PartSet_FeatureLinePrs.cpp
        PartSet_FeaturePointPrs.cpp
+       PartSet_FeatureRadiusPrs.cpp
        PartSet_Listener.cpp
        PartSet_Module.cpp
        PartSet_OperationCreateConstraint.cpp
index 141e25bde2a638f290cf38444cfc64be8746c77d..fd1fb97256844dae23f1702318564f88f434e3dc 100644 (file)
@@ -18,5 +18,7 @@ enum PartSet_SelectionMode
   SM_DonePoint
 };
 
+const int CONSTRAINT_TEXT_HEIGHT = 28; /// the text height of the constraint
+const int CONSTRAINT_TEXT_SELECTION_TOLERANCE = 20; /// the text selection tolerance
 
 #endif
diff --git a/src/PartSet/PartSet_FeatureDistancePrs.cpp b/src/PartSet/PartSet_FeatureDistancePrs.cpp
new file mode 100644 (file)
index 0000000..e3e903a
--- /dev/null
@@ -0,0 +1,137 @@
+// File:        PartSet_FeaturePrs.h
+// Created:     16 Jun 2014
+// Author:      Natalia ERMOLAEVA
+
+#include <PartSet_FeatureDistancePrs.h>
+#include <PartSet_Tools.h>
+
+#include <PartSet_FeatureLinePrs.h>
+
+#include <SketchPlugin_Feature.h>
+#include <SketchPlugin_Sketch.h>
+#include <SketchPlugin_Line.h>
+#include <SketchPlugin_ConstraintDistance.h>
+
+#include <GeomDataAPI_Point2D.h>
+#include <GeomAPI_Pnt2d.h>
+#include <GeomAPI_Lin2d.h>
+
+#include <ModelAPI_Data.h>
+#include <ModelAPI_Document.h>
+#include <ModelAPI_AttributeRefAttr.h>
+#include <ModelAPI_AttributeRefList.h>
+#include <ModelAPI_AttributeDouble.h>
+
+#include <Precision.hxx>
+
+using namespace std;
+
+PartSet_FeatureDistancePrs::PartSet_FeatureDistancePrs(FeaturePtr theSketch)
+: PartSet_FeaturePrs(theSketch)
+{
+}
+
+std::string PartSet_FeatureDistancePrs::getKind()
+{
+  return SKETCH_CONSTRAINT_DISTANCE_KIND;
+}
+
+bool PartSet_FeatureDistancePrs::setFeature(FeaturePtr theFeature, const PartSet_SelectionMode& theMode)
+{
+  bool aResult = false;
+  if (feature() && theFeature && theFeature->getKind() == SKETCH_LINE_KIND && theMode == SM_FirstPoint)
+  {
+    // set length feature
+    boost::shared_ptr<ModelAPI_Data> aData = feature()->data();
+    boost::shared_ptr<ModelAPI_AttributeRefAttr> aRef =
+          boost::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(aData->attribute(CONSTRAINT_ATTR_ENTITY_A));
+    aRef->setFeature(theFeature);
+
+    // set length value
+    aData = theFeature->data();
+    boost::shared_ptr<GeomDataAPI_Point2D> aPoint1 =
+          boost::dynamic_pointer_cast<GeomDataAPI_Point2D>(aData->attribute(LINE_ATTR_START));
+    boost::shared_ptr<GeomDataAPI_Point2D> aPoint2 =
+          boost::dynamic_pointer_cast<GeomDataAPI_Point2D>(aData->attribute(LINE_ATTR_END));
+
+    double aLenght = aPoint1->pnt()->distance(aPoint2->pnt());
+    PartSet_Tools::setFeatureValue(feature(), aLenght, CONSTRAINT_ATTR_VALUE);
+    aResult = true;
+  }
+  return aResult;
+}
+
+PartSet_SelectionMode PartSet_FeatureDistancePrs::setPoint(double theX, double theY,
+                                                         const PartSet_SelectionMode& theMode)
+{
+  PartSet_SelectionMode aMode = theMode;
+  switch (theMode)
+  {
+    case SM_SecondPoint: {
+      boost::shared_ptr<ModelAPI_Data> aData = feature()->data();
+      boost::shared_ptr<ModelAPI_AttributeRefAttr> anAttr = 
+              boost::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(aData->attribute(CONSTRAINT_ATTR_ENTITY_A));
+      FeaturePtr aFeature;
+      if (anAttr) {
+        aFeature = anAttr->feature();
+        if (aFeature->getKind() != SKETCH_LINE_KIND) {
+          aFeature = FeaturePtr();
+        }
+      }
+      boost::shared_ptr<GeomAPI_Pnt2d> aPoint = boost::shared_ptr<GeomAPI_Pnt2d>
+                                                             (new GeomAPI_Pnt2d(theX, theY));
+      boost::shared_ptr<GeomAPI_Lin2d> aFeatureLin = PartSet_FeatureLinePrs::createLin2d(aFeature);
+      boost::shared_ptr<GeomAPI_Pnt2d> aResult = aFeatureLin->project(aPoint);
+      double aDistance = aPoint->distance(aResult);
+
+      double aStartX, aStartY;
+      PartSet_FeatureLinePrs::getLinePoint(aFeature, LINE_ATTR_START, aStartX, aStartY);
+
+      if (!aFeatureLin->isRight(aPoint))
+        aDistance = -aDistance;
+
+      AttributeDoublePtr aFlyoutAttr = 
+          boost::dynamic_pointer_cast<ModelAPI_AttributeDouble>(aData->attribute(CONSTRAINT_ATTR_FLYOUT_VALUE));
+      aFlyoutAttr->setValue(aDistance);
+
+      aMode = SM_DonePoint;
+    }
+    break;
+    default:
+      break;
+  }
+  return aMode;
+}
+
+std::string PartSet_FeatureDistancePrs::getAttribute(const PartSet_SelectionMode& theMode) const
+{
+  return "";
+}
+
+PartSet_SelectionMode PartSet_FeatureDistancePrs::getNextMode(const std::string& theAttribute) const
+{
+  return SM_FirstPoint;
+}
+
+void PartSet_FeatureDistancePrs::move(double theDeltaX, double theDeltaY)
+{
+}
+
+double PartSet_FeatureDistancePrs::distanceToPoint(FeaturePtr theFeature,
+                                                 double theX, double theY)
+{
+  return 0;
+}
+
+boost::shared_ptr<GeomDataAPI_Point2D> PartSet_FeatureDistancePrs::findPoint(FeaturePtr theFeature,
+                                                                           double theX, double theY)
+{
+  boost::shared_ptr<GeomDataAPI_Point2D> aPoint2D;
+  return aPoint2D;
+}
+
+boost::shared_ptr<GeomDataAPI_Point2D> PartSet_FeatureDistancePrs::featurePoint
+                                                     (const PartSet_SelectionMode& theMode)
+{
+  return boost::shared_ptr<GeomDataAPI_Point2D>();
+}
diff --git a/src/PartSet/PartSet_FeatureDistancePrs.h b/src/PartSet/PartSet_FeatureDistancePrs.h
new file mode 100644 (file)
index 0000000..4f72829
--- /dev/null
@@ -0,0 +1,80 @@
+// File:        PartSet_FeatureDistancePrs.h
+// Created:     16 Jun 2014
+// Author:      Natalia ERMOLAEVA
+
+#ifndef PartSet_FeatureDistancePrs_H
+#define PartSet_FeatureDistancePrs_H
+
+#include "PartSet.h"
+
+#include "PartSet_FeaturePrs.h"
+#include "PartSet_Constants.h"
+
+class GeomDataAPI_Point2D;
+
+/*!
+ \class PartSet_FeatureDistancePrs
+ * \brief The class to define the circle feature manipulation. It is created for
+ * the feature create operation to move out the feature properties set and use one operation
+ * for any type of features.
+*/
+class PARTSET_EXPORT PartSet_FeatureDistancePrs : public PartSet_FeaturePrs
+{
+public:
+  /// Returns the feature type processed by this presentation
+  /// \return the feature kind
+  static std::string getKind();
+
+  /// Constructor
+  /// \param theSketch the sketch feature
+  PartSet_FeatureDistancePrs(FeaturePtr theSketch);
+  /// Destructor
+  virtual ~PartSet_FeatureDistancePrs() {};
+
+  /// Sets the feature to to a feature attribute depending on the selection mode
+  /// \param theFeature a feature instance
+  /// \param theMode the selection mode
+  /// \return whether the feature is set
+  virtual bool setFeature(FeaturePtr theFeature, const PartSet_SelectionMode& theMode);
+
+  /// Sets the point to the feature in an attribute depending on the selection mode
+  /// \param theX the 2D point horizontal coordinate
+  /// \param theY the 2D point vertical coordinate
+  /// \param theMode the selection mode
+  /// \return the new selection mode
+  virtual PartSet_SelectionMode setPoint(double theX, double theY,
+                                         const PartSet_SelectionMode& theMode);
+
+  /// Returns the feature attribute name for the selection mode
+  /// \param theMode the current operation selection mode. The feature attribute depends on the mode
+  virtual std::string getAttribute(const PartSet_SelectionMode& theMode) const;
+
+  /// Returns the next selection mode after the attribute
+  /// \param theAttribute the feature attribute name
+  /// \return next attribute selection mode
+  virtual PartSet_SelectionMode getNextMode(const std::string& theAttribute) const;
+
+  /// \brief Move the full feature.
+  /// \param theDeltaX the delta for X coordinate is moved
+  /// \param theDeltaY the delta for Y coordinate is moved
+  virtual void move(double theDeltaX, double theDeltaY);
+
+  /// Return the distance between the feature and the point
+  /// \param theFeature feature object
+  /// \param theX the horizontal coordinate of the point
+  /// \param theX the vertical coordinate of the point
+  virtual double distanceToPoint(FeaturePtr theFeature, double theX, double theY);
+
+  /// Find a point in the line with given coordinates
+  /// \param theFeature the line feature
+  /// \param theX the horizontal point coordinate
+  /// \param theY the vertical point coordinate
+  virtual boost::shared_ptr<GeomDataAPI_Point2D> findPoint(FeaturePtr theFeature, double theX,
+                                                           double theY);
+protected:
+  /// Returns the feature point in the selection mode position.
+  /// \param theMode the current operation selection mode. The feature attribute depends on the mode
+  virtual boost::shared_ptr<GeomDataAPI_Point2D> featurePoint(const PartSet_SelectionMode& theMode);
+};
+
+#endif
index 26b4bee77de44b5a306f0053ec1c5e394fd5dc54..bd4bdd8c6802397b5d22b43d983549217e46c7a0 100644 (file)
@@ -4,6 +4,7 @@
 
 #include <PartSet_FeatureLengthPrs.h>
 #include <PartSet_Tools.h>
+#include <PartSet_Constants.h>
 
 #include <PartSet_FeatureLinePrs.h>
 
 #include <SketchPlugin_Line.h>
 #include <SketchPlugin_ConstraintLength.h>
 
+#include <GeomDataAPI_Point.h>
 #include <GeomDataAPI_Point2D.h>
+#include <GeomDataAPI_Dir.h>
 #include <GeomAPI_Pnt2d.h>
 #include <GeomAPI_Lin2d.h>
 
+#include <AIS_InteractiveObject.hxx>
+#include <AIS_LengthDimension.hxx>
+
 #include <ModelAPI_Data.h>
 #include <ModelAPI_Document.h>
 #include <ModelAPI_AttributeRefAttr.h>
 #include <ModelAPI_AttributeRefList.h>
 #include <ModelAPI_AttributeDouble.h>
 
+#include <gp_Pln.hxx>
+#include <gp_Pnt.hxx>
 #include <Precision.hxx>
 
 using namespace std;
@@ -36,6 +44,31 @@ std::string PartSet_FeatureLengthPrs::getKind()
   return SKETCH_CONSTRAINT_LENGTH_KIND;
 }
 
+bool PartSet_FeatureLengthPrs::setFeature(FeaturePtr theFeature, const PartSet_SelectionMode& theMode)
+{
+  bool aResult = false;
+  if (feature() && theFeature && theFeature->getKind() == SKETCH_LINE_KIND && theMode == SM_FirstPoint)
+  {
+    // set length feature
+    boost::shared_ptr<ModelAPI_Data> aData = feature()->data();
+    boost::shared_ptr<ModelAPI_AttributeRefAttr> aRef =
+          boost::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(aData->attribute(CONSTRAINT_ATTR_ENTITY_A));
+    aRef->setFeature(theFeature);
+
+    // set length value
+    aData = theFeature->data();
+    boost::shared_ptr<GeomDataAPI_Point2D> aPoint1 =
+          boost::dynamic_pointer_cast<GeomDataAPI_Point2D>(aData->attribute(LINE_ATTR_START));
+    boost::shared_ptr<GeomDataAPI_Point2D> aPoint2 =
+          boost::dynamic_pointer_cast<GeomDataAPI_Point2D>(aData->attribute(LINE_ATTR_END));
+
+    double aLenght = aPoint1->pnt()->distance(aPoint2->pnt());
+    PartSet_Tools::setFeatureValue(feature(), aLenght, CONSTRAINT_ATTR_VALUE);
+    aResult = true;
+  }
+  return aResult;
+}
+
 PartSet_SelectionMode PartSet_FeatureLengthPrs::setPoint(double theX, double theY,
                                                          const PartSet_SelectionMode& theMode)
 {
@@ -78,6 +111,88 @@ PartSet_SelectionMode PartSet_FeatureLengthPrs::setPoint(double theX, double the
   return aMode;
 }
 
+Handle(AIS_InteractiveObject) PartSet_FeatureLengthPrs::createPresentation(FeaturePtr theFeature,
+                                                       FeaturePtr theSketch,
+                                                       Handle(AIS_InteractiveObject) thePreviuos)
+{
+  if (!theFeature || !theSketch)
+    return thePreviuos;
+
+  boost::shared_ptr<ModelAPI_Data> aData = theSketch->data();
+  boost::shared_ptr<GeomDataAPI_Point> anOrigin = 
+    boost::dynamic_pointer_cast<GeomDataAPI_Point>(aData->attribute(SKETCH_ATTR_ORIGIN));
+  boost::shared_ptr<GeomDataAPI_Dir> aNormal = 
+    boost::dynamic_pointer_cast<GeomDataAPI_Dir>(aData->attribute(SKETCH_ATTR_NORM));
+  gp_Pln aPlane(aNormal->x(), aNormal->y(), aNormal->z(), 0/*D*/);
+
+  aData = theFeature->data();
+  boost::shared_ptr<ModelAPI_AttributeRefAttr> anAttr = 
+          boost::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(aData->attribute(CONSTRAINT_ATTR_ENTITY_A));
+  if (!anAttr)
+    return thePreviuos;
+  FeaturePtr aFeature = anAttr->feature();
+  if (!aFeature || aFeature->getKind() != SKETCH_LINE_KIND)
+    return thePreviuos;
+
+  boost::shared_ptr<ModelAPI_AttributeDouble> aFlyoutAttr = 
+          boost::dynamic_pointer_cast<ModelAPI_AttributeDouble>(aData->attribute(CONSTRAINT_ATTR_FLYOUT_VALUE));
+  double aFlyout = aFlyoutAttr->value();
+
+  aData = aFeature->data();
+  if (!aData->isValid())
+    return thePreviuos;
+
+  boost::shared_ptr<GeomDataAPI_Point2D> aPointStart =
+        boost::dynamic_pointer_cast<GeomDataAPI_Point2D>(aData->attribute(LINE_ATTR_START));
+  boost::shared_ptr<GeomDataAPI_Point2D> aPointEnd =
+        boost::dynamic_pointer_cast<GeomDataAPI_Point2D>(aData->attribute(LINE_ATTR_END));
+
+  gp_Pnt aPoint1, aPoint2;
+  PartSet_Tools::convertTo3D(aPointStart->x(), aPointStart->y(), theSketch, aPoint1);
+  PartSet_Tools::convertTo3D(aPointEnd->x(), aPointEnd->y(), theSketch, aPoint2);
+
+  //Build dimension here
+  gp_Pnt aP1 = aPoint1;
+  gp_Pnt aP2 = aPoint2;
+  if (aFlyout < 0) {
+    aP1 = aPoint2;
+    aP2 = aPoint1;
+  }
+
+  Handle(AIS_InteractiveObject) anAIS = thePreviuos;
+  if (anAIS.IsNull())
+  {
+    Handle(AIS_LengthDimension) aDimAIS = new AIS_LengthDimension (aP1, aP2, aPlane);
+
+    Handle(Prs3d_DimensionAspect) anAspect = new Prs3d_DimensionAspect();
+    anAspect->MakeArrows3d (Standard_False);
+    anAspect->MakeText3d(false/*is text 3d*/);
+    anAspect->TextAspect()->SetHeight(CONSTRAINT_TEXT_HEIGHT);
+    anAspect->MakeTextShaded(false/*is test shaded*/);
+    aDimAIS->DimensionAspect()->MakeUnitsDisplayed(false/*is units displayed*/);
+    /*if (isUnitsDisplayed)
+    {
+      aDimAIS->SetDisplayUnits (aDimDlg->GetUnits ());
+    }*/
+    aDimAIS->SetDimensionAspect (anAspect);
+    aDimAIS->SetFlyout(aFlyout);
+    aDimAIS->SetSelToleranceForText2d(CONSTRAINT_TEXT_SELECTION_TOLERANCE);
+
+    anAIS = aDimAIS;
+  }
+  else {
+    // update presentation
+    Handle(AIS_LengthDimension) aDimAIS = Handle(AIS_LengthDimension)::DownCast(anAIS);
+    if (!aDimAIS.IsNull()) {
+      aDimAIS->SetMeasuredGeometry(aPoint1, aPoint2, aPlane);
+      aDimAIS->SetFlyout(aFlyout);
+
+      aDimAIS->Redisplay(Standard_True);
+    }
+  }
+  return anAIS;
+}
+
 std::string PartSet_FeatureLengthPrs::getAttribute(const PartSet_SelectionMode& theMode) const
 {
   return "";
@@ -110,28 +225,3 @@ boost::shared_ptr<GeomDataAPI_Point2D> PartSet_FeatureLengthPrs::featurePoint
 {
   return boost::shared_ptr<GeomDataAPI_Point2D>();
 }
-
-bool PartSet_FeatureLengthPrs::setFeature(FeaturePtr theFeature, const PartSet_SelectionMode& theMode)
-{
-  bool aResult = false;
-  if (feature() && theFeature && theFeature->getKind() == SKETCH_LINE_KIND && theMode == SM_FirstPoint)
-  {
-    // set length feature
-    boost::shared_ptr<ModelAPI_Data> aData = feature()->data();
-    boost::shared_ptr<ModelAPI_AttributeRefAttr> aRef =
-          boost::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(aData->attribute(CONSTRAINT_ATTR_ENTITY_A));
-    aRef->setFeature(theFeature);
-
-    // set length value
-    aData = theFeature->data();
-    boost::shared_ptr<GeomDataAPI_Point2D> aPoint1 =
-          boost::dynamic_pointer_cast<GeomDataAPI_Point2D>(aData->attribute(LINE_ATTR_START));
-    boost::shared_ptr<GeomDataAPI_Point2D> aPoint2 =
-          boost::dynamic_pointer_cast<GeomDataAPI_Point2D>(aData->attribute(LINE_ATTR_END));
-
-    double aLenght = aPoint1->pnt()->distance(aPoint2->pnt());
-    PartSet_Tools::setFeatureValue(feature(), aLenght, CONSTRAINT_ATTR_VALUE);
-    aResult = true;
-  }
-  return aResult;
-}
index 1bd7f8c1f4dace6db0a8b36ca1cf3155894ec8c9..90b1edd4a34bf6d4f1527a65736d973ef4d0c6c9 100644 (file)
@@ -11,6 +11,7 @@
 #include "PartSet_Constants.h"
 
 class GeomDataAPI_Point2D;
+class Handle_AIS_InteractiveObject;
 
 /*!
  \class PartSet_FeatureLengthPrs
@@ -31,6 +32,12 @@ public:
   /// Destructor
   virtual ~PartSet_FeatureLengthPrs() {};
 
+  /// Sets the feature to to a feature attribute depending on the selection mode
+  /// \param theFeature a feature instance
+  /// \param theMode the selection mode
+  /// \return whether the feature is set
+  virtual bool setFeature(FeaturePtr theFeature, const PartSet_SelectionMode& theMode);
+
   /// Sets the point to the feature in an attribute depending on the selection mode
   /// \param theX the 2D point horizontal coordinate
   /// \param theY the 2D point vertical coordinate
@@ -39,11 +46,14 @@ public:
   virtual PartSet_SelectionMode setPoint(double theX, double theY,
                                          const PartSet_SelectionMode& theMode);
 
-  /// Sets the feature to to a feature attribute depending on the selection mode
-  /// \param theFeature a feature instance
-  /// \param theMode the selection mode
-  /// \return whether the feature is set
-  virtual bool setFeature(FeaturePtr theFeature, const PartSet_SelectionMode& theMode);
+  /// Creates an AIS presentation if the previous is null or update the given one
+  /// \param theFeature a feature
+  /// \param theSketch a feature sketch
+  /// \param thePrevious a previuos AIS presentation
+  /// \return a created/changed AIS object with the feature parameters
+  static Handle_AIS_InteractiveObject createPresentation(FeaturePtr theFeature,
+                                                         FeaturePtr theSketch,
+                                                         Handle_AIS_InteractiveObject thePreviuos);
 
   /// Returns the feature attribute name for the selection mode
   /// \param theMode the current operation selection mode. The feature attribute depends on the mode
diff --git a/src/PartSet/PartSet_FeatureRadiusPrs.cpp b/src/PartSet/PartSet_FeatureRadiusPrs.cpp
new file mode 100644 (file)
index 0000000..0c65679
--- /dev/null
@@ -0,0 +1,143 @@
+// File:        PartSet_FeaturePrs.h
+// Created:     16 Jun 2014
+// Author:      Natalia ERMOLAEVA
+
+#include <PartSet_FeatureRadiusPrs.h>
+#include <PartSet_Tools.h>
+
+#include <PartSet_FeatureLinePrs.h>
+
+#include <SketchPlugin_Feature.h>
+#include <SketchPlugin_Sketch.h>
+#include <SketchPlugin_Line.h>
+#include <SketchPlugin_Circle.h>
+#include <SketchPlugin_Arc.h>
+#include <SketchPlugin_ConstraintRadius.h>
+
+#include <GeomDataAPI_Point2D.h>
+#include <GeomAPI_Pnt2d.h>
+#include <GeomAPI_Lin2d.h>
+
+#include <ModelAPI_Data.h>
+#include <ModelAPI_Document.h>
+#include <ModelAPI_AttributeRefAttr.h>
+#include <ModelAPI_AttributeRefList.h>
+#include <ModelAPI_AttributeDouble.h>
+
+#include <Precision.hxx>
+
+using namespace std;
+
+PartSet_FeatureRadiusPrs::PartSet_FeatureRadiusPrs(FeaturePtr theSketch)
+: PartSet_FeaturePrs(theSketch)
+{
+}
+
+std::string PartSet_FeatureRadiusPrs::getKind()
+{
+  return SKETCH_CONSTRAINT_RADIUS_KIND;
+}
+
+bool PartSet_FeatureRadiusPrs::setFeature(FeaturePtr theFeature, const PartSet_SelectionMode& theMode)
+{
+  bool aResult = false;
+  if (feature() && theMode == SM_FirstPoint &&
+      (theFeature && theFeature->getKind() == SKETCH_CIRCLE_KIND ||
+       theFeature && theFeature->getKind() == SKETCH_ARC_KIND)) {
+    // set length feature
+    boost::shared_ptr<ModelAPI_Data> aData = feature()->data();
+    boost::shared_ptr<ModelAPI_AttributeRefAttr> aRef =
+          boost::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(aData->attribute(CONSTRAINT_ATTR_ENTITY_A));
+    aRef->setFeature(theFeature);
+
+    // set length value
+    /*aData = theFeature->data();
+    boost::shared_ptr<GeomDataAPI_Point2D> aPoint1 =
+          boost::dynamic_pointer_cast<GeomDataAPI_Point2D>(aData->attribute(LINE_ATTR_START));
+    boost::shared_ptr<GeomDataAPI_Point2D> aPoint2 =
+          boost::dynamic_pointer_cast<GeomDataAPI_Point2D>(aData->attribute(LINE_ATTR_END));
+
+    double aLenght = aPoint1->pnt()->distance(aPoint2->pnt());
+    */
+    double aLenght = 50;
+    PartSet_Tools::setFeatureValue(feature(), aLenght, CONSTRAINT_ATTR_VALUE);
+    aResult = true;
+  }
+  return aResult;
+}
+
+PartSet_SelectionMode PartSet_FeatureRadiusPrs::setPoint(double theX, double theY,
+                                                         const PartSet_SelectionMode& theMode)
+{
+  PartSet_SelectionMode aMode = theMode;
+  switch (theMode)
+  {
+    case SM_SecondPoint: {
+      boost::shared_ptr<ModelAPI_Data> aData = feature()->data();
+      /*boost::shared_ptr<ModelAPI_AttributeRefAttr> anAttr = 
+              boost::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(aData->attribute(CONSTRAINT_ATTR_ENTITY_A));
+      FeaturePtr aFeature;
+      if (anAttr) {
+        aFeature = anAttr->feature();
+        if (aFeature->getKind() != SKETCH_LINE_KIND) {
+          aFeature = FeaturePtr();
+        }
+      }
+      boost::shared_ptr<GeomAPI_Pnt2d> aPoint = boost::shared_ptr<GeomAPI_Pnt2d>
+                                                             (new GeomAPI_Pnt2d(theX, theY));
+      boost::shared_ptr<GeomAPI_Lin2d> aFeatureLin = PartSet_FeatureLinePrs::createLin2d(aFeature);
+      boost::shared_ptr<GeomAPI_Pnt2d> aResult = aFeatureLin->project(aPoint);
+      double aDistance = aPoint->distance(aResult);
+
+      double aStartX, aStartY;
+      PartSet_FeatureLinePrs::getLinePoint(aFeature, LINE_ATTR_START, aStartX, aStartY);
+
+      if (!aFeatureLin->isRight(aPoint))
+        aDistance = -aDistance;
+        */
+      double aDistance = 40;
+      AttributeDoublePtr aFlyoutAttr = 
+          boost::dynamic_pointer_cast<ModelAPI_AttributeDouble>(aData->attribute(CONSTRAINT_ATTR_FLYOUT_VALUE));
+      aFlyoutAttr->setValue(aDistance);
+
+      aMode = SM_DonePoint;
+    }
+    break;
+    default:
+      break;
+  }
+  return aMode;
+}
+
+std::string PartSet_FeatureRadiusPrs::getAttribute(const PartSet_SelectionMode& theMode) const
+{
+  return "";
+}
+
+PartSet_SelectionMode PartSet_FeatureRadiusPrs::getNextMode(const std::string& theAttribute) const
+{
+  return SM_FirstPoint;
+}
+
+void PartSet_FeatureRadiusPrs::move(double theDeltaX, double theDeltaY)
+{
+}
+
+double PartSet_FeatureRadiusPrs::distanceToPoint(FeaturePtr theFeature,
+                                                 double theX, double theY)
+{
+  return 0;
+}
+
+boost::shared_ptr<GeomDataAPI_Point2D> PartSet_FeatureRadiusPrs::findPoint(FeaturePtr theFeature,
+                                                                           double theX, double theY)
+{
+  boost::shared_ptr<GeomDataAPI_Point2D> aPoint2D;
+  return aPoint2D;
+}
+
+boost::shared_ptr<GeomDataAPI_Point2D> PartSet_FeatureRadiusPrs::featurePoint
+                                                     (const PartSet_SelectionMode& theMode)
+{
+  return boost::shared_ptr<GeomDataAPI_Point2D>();
+}
diff --git a/src/PartSet/PartSet_FeatureRadiusPrs.h b/src/PartSet/PartSet_FeatureRadiusPrs.h
new file mode 100644 (file)
index 0000000..fcdaa64
--- /dev/null
@@ -0,0 +1,80 @@
+// File:        PartSet_FeatureRadiusPrs.h
+// Created:     16 Jun 2014
+// Author:      Natalia ERMOLAEVA
+
+#ifndef PartSet_FeatureRadiusPrs_H
+#define PartSet_FeatureRadiusPrs_H
+
+#include "PartSet.h"
+
+#include "PartSet_FeaturePrs.h"
+#include "PartSet_Constants.h"
+
+class GeomDataAPI_Point2D;
+
+/*!
+ \class PartSet_FeatureRadiusPrs
+ * \brief The class to define the circle feature manipulation. It is created for
+ * the feature create operation to move out the feature properties set and use one operation
+ * for any type of features.
+*/
+class PARTSET_EXPORT PartSet_FeatureRadiusPrs : public PartSet_FeaturePrs
+{
+public:
+  /// Returns the feature type processed by this presentation
+  /// \return the feature kind
+  static std::string getKind();
+
+  /// Constructor
+  /// \param theSketch the sketch feature
+  PartSet_FeatureRadiusPrs(FeaturePtr theSketch);
+  /// Destructor
+  virtual ~PartSet_FeatureRadiusPrs() {};
+
+  /// Sets the feature to to a feature attribute depending on the selection mode
+  /// \param theFeature a feature instance
+  /// \param theMode the selection mode
+  /// \return whether the feature is set
+  virtual bool setFeature(FeaturePtr theFeature, const PartSet_SelectionMode& theMode);
+
+  /// Sets the point to the feature in an attribute depending on the selection mode
+  /// \param theX the 2D point horizontal coordinate
+  /// \param theY the 2D point vertical coordinate
+  /// \param theMode the selection mode
+  /// \return the new selection mode
+  virtual PartSet_SelectionMode setPoint(double theX, double theY,
+                                         const PartSet_SelectionMode& theMode);
+
+  /// Returns the feature attribute name for the selection mode
+  /// \param theMode the current operation selection mode. The feature attribute depends on the mode
+  virtual std::string getAttribute(const PartSet_SelectionMode& theMode) const;
+
+  /// Returns the next selection mode after the attribute
+  /// \param theAttribute the feature attribute name
+  /// \return next attribute selection mode
+  virtual PartSet_SelectionMode getNextMode(const std::string& theAttribute) const;
+
+  /// \brief Move the full feature.
+  /// \param theDeltaX the delta for X coordinate is moved
+  /// \param theDeltaY the delta for Y coordinate is moved
+  virtual void move(double theDeltaX, double theDeltaY);
+
+  /// Return the distance between the feature and the point
+  /// \param theFeature feature object
+  /// \param theX the horizontal coordinate of the point
+  /// \param theX the vertical coordinate of the point
+  virtual double distanceToPoint(FeaturePtr theFeature, double theX, double theY);
+
+  /// Find a point in the line with given coordinates
+  /// \param theFeature the line feature
+  /// \param theX the horizontal point coordinate
+  /// \param theY the vertical point coordinate
+  virtual boost::shared_ptr<GeomDataAPI_Point2D> findPoint(FeaturePtr theFeature, double theX,
+                                                           double theY);
+protected:
+  /// Returns the feature point in the selection mode position.
+  /// \param theMode the current operation selection mode. The feature attribute depends on the mode
+  virtual boost::shared_ptr<GeomDataAPI_Point2D> featurePoint(const PartSet_SelectionMode& theMode);
+};
+
+#endif
index bc4463b94ff000e982dc9d13fffc3e16d87bf678..d4e9e51758b96e6851e449b7816c223319a30495 100644 (file)
 #include <PartSet_EditLine.h>
 
 #include <SketchPlugin_Feature.h>
-#include <SketchPlugin_Point.h>
+/*#include <SketchPlugin_Point.h>
 #include <SketchPlugin_Line.h>
 #include <SketchPlugin_Circle.h>
 #include <SketchPlugin_Arc.h>
+*/
 
-#include <SketchPlugin_ConstraintLength.h>
+#include <PartSet_FeatureLengthPrs.h>
+#include <PartSet_FeatureDistancePrs.h>
+#include <PartSet_FeatureRadiusPrs.h>
+
+#include <SketchPlugin_Constraint.h>
 
 #include <ModuleBase_OperationDescription.h>
 
@@ -59,7 +64,9 @@ PartSet_OperationCreateConstraint::~PartSet_OperationCreateConstraint()
 bool PartSet_OperationCreateConstraint::canProcessKind(const std::string& theId)
 {
   // changed
-  return theId == SKETCH_CONSTRAINT_LENGTH_KIND;
+  return theId == PartSet_FeatureLengthPrs::getKind() ||
+         theId == PartSet_FeatureDistancePrs::getKind() ||
+         theId == PartSet_FeatureRadiusPrs::getKind();
 }
 
 bool PartSet_OperationCreateConstraint::canBeCommitted() const
index a89383a7a02a7d049b52551bfcbe58727c9659c4..5d174047b4f3495dc85ede5968d66a32bb2f4b74 100644 (file)
@@ -5,44 +5,33 @@
 #include <PartSet_Presentation.h>
 #include <PartSet_Tools.h>
 
-#include <ModelAPI_Feature.h>
-#include <ModelAPI_Data.h>
-#include <ModelAPI_AttributeDouble.h>
+#include <PartSet_FeatureLengthPrs.h>
 
-#include <GeomDataAPI_Point.h>
-#include <GeomDataAPI_Point2D.h>
-#include <GeomDataAPI_Dir.h>
+#include <ModelAPI_Feature.h>
 
 #include <SketchPlugin_Sketch.h>
-#include <SketchPlugin_Line.h>
-#include <SketchPlugin_Constraint.h>
-#include <SketchPlugin_ConstraintLength.h>
 
 #include <AIS_InteractiveObject.hxx>
-#include <AIS_LengthDimension.hxx>
 #include <AIS_Shape.hxx>
 
-#include <gp_Pln.hxx>
-#include <gp_Pnt.hxx>
+#include <Quantity_NameOfColor.hxx>
 
 const Quantity_NameOfColor SKETCH_PLANE_COLOR = Quantity_NOC_CHOCOLATE; /// the plane edge color
 const int SKETCH_WIDTH = 4; /// the plane edge width
 
-const int CONSTRAINT_TEXT_HEIGHT = 28; /// the text height of the constraint
-const int CONSTRAINT_TEXT_SELECTION_TOLERANCE = 20; /// the text selection tolerance
-
 Handle(AIS_InteractiveObject) PartSet_Presentation::createPresentation(
                                          FeaturePtr theFeature,
                                          FeaturePtr theSketch,
                                          const TopoDS_Shape& theShape,
-                                         Handle_AIS_InteractiveObject thePrevPrs)
+                                         Handle_AIS_InteractiveObject thePreviuos)
 {
   Handle(AIS_InteractiveObject) anAIS;
 
-  if (theFeature->getKind() == SKETCH_CONSTRAINT_LENGTH_KIND)
-    anAIS = createSketchConstraintLength(theFeature, theSketch, thePrevPrs);
+  std::string aKind = theFeature->getKind();
+  if (aKind == PartSet_FeatureLengthPrs::getKind())
+    anAIS = PartSet_FeatureLengthPrs::createPresentation(theFeature, theSketch, thePreviuos);
   else {
-    anAIS = createFeature(theFeature, theShape, thePrevPrs);
+    anAIS = createFeature(theFeature, theShape, thePreviuos);
     if (theFeature->getKind() == SKETCH_KIND)
     {
       Handle(AIS_Shape) aShapeAIS = Handle(AIS_Shape)::DownCast(anAIS);
@@ -58,9 +47,9 @@ Handle(AIS_InteractiveObject) PartSet_Presentation::createPresentation(
 Handle(AIS_InteractiveObject) PartSet_Presentation::createFeature(
                                               FeaturePtr theFeature,
                                               const TopoDS_Shape& theShape,
-                                              Handle_AIS_InteractiveObject thePrevPrs)
+                                              Handle_AIS_InteractiveObject thePreviuos)
 {
-  Handle(AIS_InteractiveObject) anAIS = thePrevPrs;
+  Handle(AIS_InteractiveObject) anAIS = thePreviuos;
   if (!anAIS.IsNull())
   {
     Handle(AIS_Shape) aShapeAIS = Handle(AIS_Shape)::DownCast(anAIS);
@@ -80,87 +69,3 @@ Handle(AIS_InteractiveObject) PartSet_Presentation::createFeature(
   }
   return anAIS;
 }
-
-Handle(AIS_InteractiveObject) PartSet_Presentation::createSketchConstraintLength(
-                                         FeaturePtr theFeature,
-                                         FeaturePtr theSketch,
-                                         Handle(AIS_InteractiveObject) thePrevPrs)
-{
-  if (!theFeature || !theSketch)
-    return thePrevPrs;
-
-  boost::shared_ptr<ModelAPI_Data> aData = theSketch->data();
-  boost::shared_ptr<GeomDataAPI_Point> anOrigin = 
-    boost::dynamic_pointer_cast<GeomDataAPI_Point>(aData->attribute(SKETCH_ATTR_ORIGIN));
-  boost::shared_ptr<GeomDataAPI_Dir> aNormal = 
-    boost::dynamic_pointer_cast<GeomDataAPI_Dir>(aData->attribute(SKETCH_ATTR_NORM));
-  gp_Pln aPlane(aNormal->x(), aNormal->y(), aNormal->z(), 0/*D*/);
-
-  aData = theFeature->data();
-  boost::shared_ptr<ModelAPI_AttributeRefAttr> anAttr = 
-          boost::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(aData->attribute(CONSTRAINT_ATTR_ENTITY_A));
-  if (!anAttr)
-    return thePrevPrs;
-  FeaturePtr aFeature = anAttr->feature();
-  if (!aFeature || aFeature->getKind() != SKETCH_LINE_KIND)
-    return thePrevPrs;
-
-  boost::shared_ptr<ModelAPI_AttributeDouble> aFlyoutAttr = 
-          boost::dynamic_pointer_cast<ModelAPI_AttributeDouble>(aData->attribute(CONSTRAINT_ATTR_FLYOUT_VALUE));
-  double aFlyout = aFlyoutAttr->value();
-
-  aData = aFeature->data();
-  if (!aData->isValid())
-    return thePrevPrs;
-
-  boost::shared_ptr<GeomDataAPI_Point2D> aPointStart =
-        boost::dynamic_pointer_cast<GeomDataAPI_Point2D>(aData->attribute(LINE_ATTR_START));
-  boost::shared_ptr<GeomDataAPI_Point2D> aPointEnd =
-        boost::dynamic_pointer_cast<GeomDataAPI_Point2D>(aData->attribute(LINE_ATTR_END));
-
-  gp_Pnt aPoint1, aPoint2;
-  PartSet_Tools::convertTo3D(aPointStart->x(), aPointStart->y(), theSketch, aPoint1);
-  PartSet_Tools::convertTo3D(aPointEnd->x(), aPointEnd->y(), theSketch, aPoint2);
-
-  //Build dimension here
-  gp_Pnt aP1 = aPoint1;
-  gp_Pnt aP2 = aPoint2;
-  if (aFlyout < 0) {
-    aP1 = aPoint2;
-    aP2 = aPoint1;
-  }
-
-
-  Handle(AIS_InteractiveObject) anAIS = thePrevPrs;
-  if (anAIS.IsNull())
-  {
-    Handle(AIS_LengthDimension) aDimAIS = new AIS_LengthDimension (aP1, aP2, aPlane);
-
-    Handle(Prs3d_DimensionAspect) anAspect = new Prs3d_DimensionAspect();
-    anAspect->MakeArrows3d (Standard_False);
-    anAspect->MakeText3d(false/*is text 3d*/);
-    anAspect->TextAspect()->SetHeight(CONSTRAINT_TEXT_HEIGHT);
-    anAspect->MakeTextShaded(false/*is test shaded*/);
-    aDimAIS->DimensionAspect()->MakeUnitsDisplayed(false/*is units displayed*/);
-    /*if (isUnitsDisplayed)
-    {
-      aDimAIS->SetDisplayUnits (aDimDlg->GetUnits ());
-    }*/
-    aDimAIS->SetDimensionAspect (anAspect);
-    aDimAIS->SetFlyout(aFlyout);
-    aDimAIS->SetSelToleranceForText2d(CONSTRAINT_TEXT_SELECTION_TOLERANCE);
-
-    anAIS = aDimAIS;
-  }
-  else {
-    // update presentation
-    Handle(AIS_LengthDimension) aDimAIS = Handle(AIS_LengthDimension)::DownCast(anAIS);
-    if (!aDimAIS.IsNull()) {
-      aDimAIS->SetMeasuredGeometry(aPoint1, aPoint2, aPlane);
-      aDimAIS->SetFlyout(aFlyout);
-
-      aDimAIS->Redisplay(Standard_True);
-    }
-  }
-  return anAIS;
-}
index 8e4b2ae6fa0fb6b84680549bbf13b7eeffd92c39..1e11bb578e36025f5e537ed92d7c67018c2747fe 100644 (file)
@@ -22,24 +22,29 @@ class Handle_AIS_InteractiveObject;
 class PARTSET_EXPORT PartSet_Presentation
 {
 public:
-  /// Creates AIS presentation for the given feature
+  /// Creates AIS presentation for the given feature. It deals with features and
+  /// constraints presentations
   /// \param theFeature a feature
-  /// \return the presentation
+  /// \param theSketch a feature sketch
+  /// \param theShape a shape of the feature
+  /// \param thePrevious a previous AIS object
+  /// \return a created/changed AIS object with the feature parameters
   static Handle_AIS_InteractiveObject createPresentation(
                                               FeaturePtr theFeature,
                                               FeaturePtr theSketch,
                                               const TopoDS_Shape& theShape,
-                                              Handle_AIS_InteractiveObject thePrevPrs);
+                                              Handle_AIS_InteractiveObject thePreviuos);
 protected:
-  static Handle_AIS_InteractiveObject createFeature(
+  /// Creates AIS presentation based on the given shape
+  /// \param theFeature a feature
+  /// \param theSketch a feature sketch
+  /// \param theShape a shape of the feature
+  /// \param thePrevious a previous AIS object
+  /// \return a created/changed AIS object with the feature parameters
+ static Handle_AIS_InteractiveObject createFeature(
                                               FeaturePtr theFeature,
                                               const TopoDS_Shape& theShape,
-                                              Handle_AIS_InteractiveObject thePrevPrs);
-
-  static Handle_AIS_InteractiveObject createSketchConstraintLength(
-                                              FeaturePtr theFeature,
-                                              FeaturePtr theSketch,
-                                              Handle_AIS_InteractiveObject thePrevPrs);
+                                              Handle_AIS_InteractiveObject thePreviuos);
 };
 
 #endif
index 2241830377292853dfa92dd01de6976459625152..a8868beb7998ac9458e458b937e63ce8c6413787 100644 (file)
@@ -26,6 +26,8 @@
 #include <PartSet_FeatureArcPrs.h>
 
 #include <PartSet_FeatureLengthPrs.h>
+#include <PartSet_FeatureRadiusPrs.h>
+#include <PartSet_FeatureDistancePrs.h>
 
 #include <XGUI_ViewerPrs.h>
 
@@ -157,6 +159,13 @@ boost::shared_ptr<PartSet_FeaturePrs> PartSet_Tools::createFeaturePrs(const std:
   else if (theKind == PartSet_FeatureLengthPrs::getKind()) {
     aFeaturePrs = boost::shared_ptr<PartSet_FeaturePrs>(new PartSet_FeatureLengthPrs(theSketch));
   }
+  else if (theKind == PartSet_FeatureRadiusPrs::getKind()) {
+    aFeaturePrs = boost::shared_ptr<PartSet_FeatureRadiusPrs>(new PartSet_FeatureRadiusPrs(theSketch));
+  }
+  else if (theKind == PartSet_FeatureDistancePrs::getKind()) {
+    aFeaturePrs = boost::shared_ptr<PartSet_FeatureDistancePrs>(new PartSet_FeatureDistancePrs(theSketch));
+  }
+
 
   if (theFeature && aFeaturePrs)
     aFeaturePrs->init(theFeature);
index 57f7b627d30fedcb6810a7fcbc69ebe11713f371..52c58e14603aa78092e6a32c288e8fd4be72b005 100644 (file)
@@ -15,6 +15,7 @@ SketchPlugin_ConstraintDistance::SketchPlugin_ConstraintDistance()
 void SketchPlugin_ConstraintDistance::initAttributes()
 {
   data()->addAttribute(CONSTRAINT_ATTR_VALUE,    ModelAPI_AttributeDouble::type());
+  data()->addAttribute(CONSTRAINT_ATTR_FLYOUT_VALUE, ModelAPI_AttributeDouble::type());
   data()->addAttribute(CONSTRAINT_ATTR_ENTITY_A, ModelAPI_AttributeRefAttr::type());
   data()->addAttribute(CONSTRAINT_ATTR_ENTITY_B, ModelAPI_AttributeRefAttr::type());
 }
index 6eb620f489422b6efd5b0f17b04a2385f28b84ad..f56b897697109a519d652d8cfe7e66f0db768441 100644 (file)
@@ -6,6 +6,7 @@
 
 #include <ModelAPI_AttributeDouble.h>
 #include <ModelAPI_Data.h>
+#include <GeomDataAPI_Point2D.h>
 #include <SketchPlugin_Point.h>
 
 SketchPlugin_ConstraintRadius::SketchPlugin_ConstraintRadius()
@@ -16,6 +17,9 @@ void SketchPlugin_ConstraintRadius::initAttributes()
 {
   data()->addAttribute(CONSTRAINT_ATTR_VALUE,    ModelAPI_AttributeDouble::type());
   data()->addAttribute(CONSTRAINT_ATTR_ENTITY_A, ModelAPI_AttributeRefAttr::type());
+
+  data()->addAttribute(CONSTRAINT_ATTR_FLYOUT_VALUE, ModelAPI_AttributeDouble::type());
+  data()->addAttribute(SKETCH_CONSTRAINT_ATTR_CIRCLE_POINT, GeomDataAPI_Point2D::type());
 }
 
 void SketchPlugin_ConstraintRadius::execute()
index bdfaa42974ee3885a7d44b6890c4e3f74b2eea99..fb39f7bc36153f251bf9e67ec6a6664d67c1f74a 100644 (file)
@@ -12,6 +12,9 @@
 /// Radius constraint kind
 const std::string SKETCH_CONSTRAINT_RADIUS_KIND("SketchConstraintRadius");
 
+/// Start 2D point of the line
+const std::string SKETCH_CONSTRAINT_ATTR_CIRCLE_POINT("CirclePoint");
+
 
 /** \class SketchPlugin_ConstraintRadius
  *  \ingroup DataModel
index e39aa518cf6fe8c2f589d2b237529cbd5d6fdbe2..5968793236ddca565cd2db78f75d217ccfac293f 100644 (file)
@@ -1,7 +1,7 @@
 <plugin>
   <workbench id="Sketch">
     <group id="Basic">
-      <feature id="Sketch" nested="SketchPoint SketchLine SketchCircle SketchArc SketchConstraintLength" title="Sketch" tooltip="Create a new sketch or edit an existing sketch" icon=":icons/sketch.png">
+      <feature id="Sketch" nested="SketchPoint SketchLine SketchCircle SketchArc SketchConstraintLength SketchConstraintRadius SketchConstraintDistance" title="Sketch" tooltip="Create a new sketch or edit an existing sketch" icon=":icons/sketch.png">
         <label title="Select a plane on which to create a sketch" tooltip="Select a plane on which to create a sketch"/> 
       <!--icon=":pictures/x_point.png"-->
       </feature>
         <point_selector id="ArcEndPoint" title="End point" tooltip="End point of the arc"/>
       </feature>
       <feature id="SketchConstraintCoincidence" title="Points coincidence" tooltip="Create constraint for the coincidence of two points" internal="1"/>
-      <feature id="SketchConstraintDistance" title="Distance between objects" tooltip="Create constraint for the distance from a point to an object" internal="1"/>
+      <feature id="SketchConstraintDistance" title="Distance between objects" tooltip="Create constraint for the distance from a point to an object">
+        <label title="Select point and another feature (point or point on line) between which to calculate distance" tooltip="Select point and another feature (point or point on line) between which to calculate distance"/>
+      </feature>
       <feature id="SketchConstraintLength" title="Length of a line" tooltip="Create constraint for the given length of a line segment">
         <label title="Select a line entity on which to calculate lenght" tooltip="Select a line entity on which to calculate lenght"/>
       </feature>
-      <feature id="SketchConstraintRadius" title="Radius of a circle or an arc" tooltip="Create constraint for the given radius of a circle or an arc" internal="1"/>
+      <feature id="SketchConstraintRadius" title="Radius of a circle or an arc" tooltip="Create constraint for the given radius of a circle or an arc">
+        <label title="Select two points on a circle or an arc of circle on which to calculate radius" tooltip="Select two points on a circle or an arc of circle on which to calculate radius"/>
+      </feature>
       <feature id="SketchConstraintParallel" title="Parallelism of a lines" tooltip="Create constraint defining two parallel lines" internal="1"/>
       <feature id="SketchConstraintPerpendicular" title="Orthgonality of a lines" tooltip="Create constraint defining two perpendicular lines" internal="1"/>
     </group>
index d4f55e00d1ac4db93bdfe0c516ae0b49316849e0..1b92bf9470a579a40d4822933defd1918fdbce08 100644 (file)
@@ -206,7 +206,7 @@ const int& SketchSolver_Constraint::getType(boost::shared_ptr<SketchPlugin_Const
         boost::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(
           theConstraint->data()->attribute(CONSTRAINT_ATTRIBUTES[indAttr])
         );
-      if (!anAttr || !anAttr->isFeature()) continue;
+      if (!anAttr || !anAttr->isFeature() || !anAttr->feature()) continue;
       const std::string& aKind = anAttr->feature()->getKind();
       if (aKind.compare(SKETCH_CIRCLE_KIND) == 0 || aKind.compare(SKETCH_ARC_KIND) == 0)
       {