Circle draft creation.
SET(PROJECT_HEADERS
PartSet.h
PartSet_Constants.h
+ PartSet_FeatureCirclePrs.h
PartSet_FeaturePrs.h
PartSet_FeatureLinePrs.h
PartSet_FeaturePointPrs.h
SET(PROJECT_SOURCES
PartSet_FeaturePrs.cpp
+ PartSet_FeatureCirclePrs.cpp
PartSet_FeatureLinePrs.cpp
PartSet_FeaturePointPrs.cpp
PartSet_Listener.cpp
--- /dev/null
+// File: PartSet_FeaturePrs.h
+// Created: 04 Jun 2014
+// Author: Natalia ERMOLAEVA
+
+#include <PartSet_FeatureCirclePrs.h>
+#include <PartSet_Tools.h>
+
+#include <SketchPlugin_Feature.h>
+#include <SketchPlugin_Sketch.h>
+#include <SketchPlugin_ConstraintCoincidence.h>
+#include <SketchPlugin_Line.h>
+#include <SketchPlugin_Constraint.h>
+
+#include <GeomDataAPI_Point2D.h>
+
+#include <ModelAPI_Data.h>
+#include <ModelAPI_Document.h>
+#include <ModelAPI_AttributeRefAttr.h>
+#include <ModelAPI_AttributeRefList.h>
+
+#include <Precision.hxx>
+
+using namespace std;
+
+PartSet_FeatureCirclePrs::PartSet_FeatureCirclePrs(FeaturePtr theSketch)
+: PartSet_FeaturePrs(theSketch)
+{
+}
+
+void PartSet_FeatureCirclePrs::initFeature(FeaturePtr theFeature)
+{
+ if (feature() && theFeature)
+ {
+ // use the last point of the previous feature as the first of the new one
+ boost::shared_ptr<ModelAPI_Data> aData = theFeature->data();
+ boost::shared_ptr<GeomDataAPI_Point2D> anInitPoint = boost::dynamic_pointer_cast<GeomDataAPI_Point2D>
+ (aData->attribute(LINE_ATTR_END));
+ PartSet_Tools::setFeaturePoint(feature(), anInitPoint->x(), anInitPoint->y(), LINE_ATTR_START);
+ PartSet_Tools::setFeaturePoint(feature(), anInitPoint->x(), anInitPoint->y(), LINE_ATTR_END);
+
+ aData = feature()->data();
+ boost::shared_ptr<GeomDataAPI_Point2D> aPoint = boost::dynamic_pointer_cast<GeomDataAPI_Point2D>
+ (aData->attribute(LINE_ATTR_START));
+ PartSet_Tools::createConstraint(sketch(), anInitPoint, aPoint);
+ }
+}
+
+PartSet_SelectionMode PartSet_FeatureCirclePrs::setPoint(double theX, double theY,
+ const PartSet_SelectionMode& theMode)
+{
+ PartSet_SelectionMode aMode = theMode;
+ switch (theMode)
+ {
+ case SM_FirstPoint: {
+ PartSet_Tools::setFeaturePoint(feature(), theX, theY, LINE_ATTR_START);
+ PartSet_Tools::setFeaturePoint(feature(), theX, theY, LINE_ATTR_END);
+ aMode = SM_SecondPoint;
+ }
+ break;
+ case SM_SecondPoint: {
+ PartSet_Tools::setFeaturePoint(feature(), theX, theY, LINE_ATTR_END);
+ aMode = SM_DonePoint;
+ }
+ break;
+ default:
+ break;
+ }
+ return aMode;
+}
+
+std::string PartSet_FeatureCirclePrs::getAttribute(const PartSet_SelectionMode& theMode) const
+{
+ std::string aAttribute;
+ switch (theMode)
+ {
+ case SM_FirstPoint:
+ aAttribute = LINE_ATTR_START;
+ break;
+ case SM_SecondPoint:
+ aAttribute = LINE_ATTR_END;
+ break;
+ default:
+ break;
+ }
+ return aAttribute;
+}
+
+PartSet_SelectionMode PartSet_FeatureCirclePrs::getNextMode(const std::string& theAttribute) const
+{
+ PartSet_SelectionMode aMode;
+
+ if (theAttribute == LINE_ATTR_START)
+ aMode = SM_SecondPoint;
+ else if (theAttribute == LINE_ATTR_END)
+ aMode = SM_DonePoint;
+ return aMode;
+}
+
+boost::shared_ptr<GeomDataAPI_Point2D> PartSet_FeatureCirclePrs::featurePoint
+ (const PartSet_SelectionMode& theMode)
+{
+ std::string aPointArg;
+ switch (theMode)
+ {
+ case SM_FirstPoint:
+ aPointArg = LINE_ATTR_START;
+ break;
+ case SM_SecondPoint:
+ aPointArg = LINE_ATTR_END;
+ break;
+ default:
+ break;
+ }
+ boost::shared_ptr<ModelAPI_Data> aData = feature()->data();
+ boost::shared_ptr<GeomDataAPI_Point2D> aPoint = boost::dynamic_pointer_cast<GeomDataAPI_Point2D>
+ (aData->attribute(aPointArg));
+ return aPoint;
+}
--- /dev/null
+// File: PartSet_FeatureCirclePrs.h
+// Created: 04 Jun 2014
+// Author: Natalia ERMOLAEVA
+
+#ifndef PartSet_FeatureCirclePrs_H
+#define PartSet_FeatureCirclePrs_H
+
+#include "PartSet.h"
+
+#include "PartSet_FeaturePrs.h"
+#include "PartSet_Constants.h"
+
+class GeomDataAPI_Point2D;
+
+/*!
+ \class PartSet_FeatureCirclePrs
+ * \brief The abstract class to define the specific 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_FeatureCirclePrs : public PartSet_FeaturePrs
+{
+public:
+ /// Constructor
+ /// \param theSketch the sketch feature
+ PartSet_FeatureCirclePrs(FeaturePtr theSketch);
+ /// Destructor
+ virtual ~PartSet_FeatureCirclePrs() {};
+
+ /// 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;
+
+protected:
+ /// Initializes current feature by the given
+ /// \param theSourceFeature the feature, which attributes are used to initialize the current feature
+ virtual void initFeature(FeaturePtr theSourceFeature);
+
+ /// 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
#include <XGUI_Tools.h>
#include <SketchPlugin_Line.h>
-#include <SketchPlugin_Point.h>
#include <Config_PointerMessage.h>
#include <Config_ModuleReader.h>
PartSet_OperationSketchBase* aPrevOp = dynamic_cast<PartSet_OperationSketchBase*>(aCurOperation);
if (aPrevOp)
aSketch = aPrevOp->sketch();
- if (theCmdId == SKETCH_LINE_KIND || theCmdId == SKETCH_POINT_KIND)
+ if (PartSet_OperationCreateFeature::canProcessKind(theCmdId))
anOperation = new PartSet_OperationCreateFeature(theCmdId.c_str(), this, aSketch);
else if (theCmdId == PartSet_OperationEditLine::Type())
anOperation = new PartSet_OperationEditLine(theCmdId.c_str(), this, aSketch);
#include <PartSet_Tools.h>
#include <PartSet_OperationSketch.h>
-#include <PartSet_FeatureLinePrs.h>
#include <PartSet_FeaturePointPrs.h>
+#include <PartSet_FeatureLinePrs.h>
+#include <PartSet_FeatureCirclePrs.h>
#include <SketchPlugin_Feature.h>
+#include <SketchPlugin_Point.h>
#include <SketchPlugin_Line.h>
+#include <SketchPlugin_Circle.h>
#include <ModuleBase_OperationDescription.h>
: PartSet_OperationSketchBase(theId, theParent),
myPointSelectionMode(SM_FirstPoint)
{
- if (theId.toStdString() == SKETCH_LINE_KIND) {
+ std::string aKind = theId.toStdString();
+
+ if (aKind == SKETCH_POINT_KIND) {
+ myFeaturePrs = new PartSet_FeaturePointPrs(theFeature);
+ }
+ if (aKind == SKETCH_LINE_KIND) {
myFeaturePrs = new PartSet_FeatureLinePrs(theFeature);
}
- else {
- myFeaturePrs = new PartSet_FeaturePointPrs(theFeature);
+ else if (aKind == SKETCH_CIRCLE_KIND) {
+ myFeaturePrs = new PartSet_FeatureCirclePrs(theFeature);
}
}
delete myFeaturePrs;
}
+bool PartSet_OperationCreateFeature::canProcessKind(const std::string& theId)
+{
+ return theId == SKETCH_LINE_KIND || theId == SKETCH_POINT_KIND || theId == SKETCH_CIRCLE_KIND;
+}
+
bool PartSet_OperationCreateFeature::canBeCommitted() const
{
return myPointSelectionMode == SM_DonePoint;
Q_OBJECT
public:
+ /// Returns true if the feature with the given kind can be created by this operation
+ /// \param theId the feature kind
+ /// \return the boolean result
+ static bool canProcessKind(const std::string& theId);
public:
/// Constructor
<file>icons/sketch.png</file>
<file>icons/hand_point.png</file>
<file>icons/dimension_v.png</file>
+ <file>icons/radius.png</file>
</qresource>
</RCC>
<plugin>
<workbench id="Sketch">
<group id="Basic">
- <feature id="Sketch" nested="SketchLine SketchPoint SketchConstraintLength" title="Sketch" tooltip="Create a new sketch or edit an existing sketch" icon=":icons/sketch.png">
+ <feature id="Sketch" nested="SketchPoint SketchLine SketchCircle SketchConstraintLength" 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="StartPoint" title="Start point" tooltip="Start point of the line"/>
<point_selector id="EndPoint" title="End point" tooltip="End point of the line"/>
</feature>
- <feature id="SketchCircle" title="Circle" tooltip="Create a new circle" icon="" internal="1">
+ <feature id="SketchCircle" title="Circle" tooltip="Create a new circle" icon="">
<point_selector id="CircleCenter" title="Center" tooltip="Center of the circle"/>
+ <doublevalue id="CircleRadius" label="Radius:" min="0" step="1.0" default="0" icon=":icons/radius.png" tooltip="Set Radius"/>
</feature>
<feature id="SketchArc" title="Arc" tooltip="Create a new arc of a circle" icon="" internal="1">
<point_selector id="ArcCenter" title="Center" tooltip="Center of the arc"/>