aRes->setImpl(new TopoDS_Shape(anEdge));
return aRes;
}
+
+boost::shared_ptr<GeomAPI_Shape> GeomAlgoAPI_EdgeBuilder::lineCircleArc(
+ boost::shared_ptr<GeomAPI_Pnt> theCenter,
+ boost::shared_ptr<GeomAPI_Pnt> theStartPoint,
+ boost::shared_ptr<GeomAPI_Pnt> theEndPoint,
+ boost::shared_ptr<GeomAPI_Dir> theNormal)
+{
+ const gp_Pnt& aCenter = theCenter->impl<gp_Pnt>();
+ const gp_Dir& aDir = theNormal->impl<gp_Dir>();
+
+ double aRadius = theCenter->distance(theStartPoint);
+ gp_Circ aCircle(gp_Ax2(aCenter, aDir), aRadius);
+
+ BRepBuilderAPI_MakeEdge anEdgeBuilder(aCircle);
+ boost::shared_ptr<GeomAPI_Shape> aRes(new GeomAPI_Shape);
+ TopoDS_Edge anEdge = anEdgeBuilder.Edge();
+ aRes->setImpl(new TopoDS_Shape(anEdge));
+ return aRes;
+}
static boost::shared_ptr<GeomAPI_Shape> lineCircle(
boost::shared_ptr<GeomAPI_Pnt> theCenter,
boost::shared_ptr<GeomAPI_Dir> theNormal, double theRadius);
+
+ /// Creates linear edge in a form of a circle arc by a three points
+ static boost::shared_ptr<GeomAPI_Shape> lineCircleArc(
+ boost::shared_ptr<GeomAPI_Pnt> theCenter,
+ boost::shared_ptr<GeomAPI_Pnt> theStartPoint,
+ boost::shared_ptr<GeomAPI_Pnt> theEndPoint,
+ boost::shared_ptr<GeomAPI_Dir> theNormal);
};
#endif
{
SM_FirstPoint,
SM_SecondPoint,
+ SM_ThirdPoint,
SM_DonePoint
};
#include <SketchPlugin_Feature.h>
#include <SketchPlugin_Sketch.h>
-#include <SketchPlugin_ConstraintCoincidence.h>
-#include <SketchPlugin_Line.h>
-#include <SketchPlugin_Constraint.h>
+#include <SketchPlugin_Arc.h>
#include <GeomDataAPI_Point2D.h>
{
}
-void PartSet_FeatureArcPrs::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_FeatureArcPrs::setPoint(double theX, double theY,
const PartSet_SelectionMode& theMode)
{
switch (theMode)
{
case SM_FirstPoint: {
- PartSet_Tools::setFeaturePoint(feature(), theX, theY, LINE_ATTR_START);
- PartSet_Tools::setFeaturePoint(feature(), theX, theY, LINE_ATTR_END);
+ PartSet_Tools::setFeaturePoint(feature(), theX, theY, ARC_ATTR_CENTER);
aMode = SM_SecondPoint;
}
break;
case SM_SecondPoint: {
- PartSet_Tools::setFeaturePoint(feature(), theX, theY, LINE_ATTR_END);
+ PartSet_Tools::setFeaturePoint(feature(), theX, theY, ARC_ATTR_START);
+ aMode = SM_ThirdPoint;
+ }
+ break;
+ case SM_ThirdPoint: {
+ PartSet_Tools::setFeaturePoint(feature(), theX, theY, ARC_ATTR_END);
aMode = SM_DonePoint;
}
break;
switch (theMode)
{
case SM_FirstPoint:
- aAttribute = LINE_ATTR_START;
+ aAttribute = ARC_ATTR_CENTER;
break;
case SM_SecondPoint:
- aAttribute = LINE_ATTR_END;
+ aAttribute = ARC_ATTR_START;
+ break;
+ case SM_ThirdPoint:
+ aAttribute = ARC_ATTR_END;
break;
default:
break;
{
PartSet_SelectionMode aMode;
- if (theAttribute == LINE_ATTR_START)
+ if (theAttribute == ARC_ATTR_CENTER)
aMode = SM_SecondPoint;
- else if (theAttribute == LINE_ATTR_END)
+ else if (theAttribute == ARC_ATTR_START)
+ aMode = SM_ThirdPoint;
+ else if (theAttribute == ARC_ATTR_END)
aMode = SM_DonePoint;
return aMode;
}
switch (theMode)
{
case SM_FirstPoint:
- aPointArg = LINE_ATTR_START;
+ aPointArg = ARC_ATTR_CENTER;
break;
case SM_SecondPoint:
- aPointArg = LINE_ATTR_END;
+ aPointArg = ARC_ATTR_START;
+ break;
+ case SM_ThirdPoint:
+ aPointArg = ARC_ATTR_END;
break;
default:
break;
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);
#include <ModelAPI_AttributeRefList.h>
#include <Precision.hxx>
+#include <V3d_View.hxx>
using namespace std;
return aMode;
}
+void PartSet_FeatureLinePrs::projectPointOnLine(FeaturePtr theFeature,
+ const PartSet_SelectionMode& theMode,
+ const gp_Pnt& thePoint, Handle(V3d_View) theView,
+ double& theX, double& theY)
+{
+ if (theFeature) {
+ double X0, X1, X2, X3;
+ double Y0, Y1, Y2, Y3;
+ PartSet_Tools::getLinePoint(theFeature, LINE_ATTR_START, X2, Y2);
+ PartSet_Tools::getLinePoint(theFeature, LINE_ATTR_END, X3, Y3);
+ PartSet_Tools::convertTo2D(thePoint, sketch(), theView, X1, Y1);
+
+ switch (theMode) {
+ case SM_FirstPoint:
+ PartSet_Tools::projectPointOnLine(X2, Y2, X3, Y3, X1, Y1, theX, theY);
+ break;
+ case SM_SecondPoint: {
+ PartSet_Tools::getLinePoint(feature(), LINE_ATTR_START, X0, Y0);
+ PartSet_Tools::intersectLines(X0, Y0, X1, Y1, X2, Y2, X3, Y3, theX, theY);
+ }
+ break;
+ default:
+ break;
+ }
+ }
+}
+
boost::shared_ptr<GeomDataAPI_Point2D> PartSet_FeatureLinePrs::featurePoint
(const PartSet_SelectionMode& theMode)
{
#include "PartSet_FeaturePrs.h"
#include "PartSet_Constants.h"
+#include <gp_Pnt.hxx>
+
class GeomDataAPI_Point2D;
+class Handle_V3d_View;
/*!
\class PartSet_FeatureLinePrs
/// \return next attribute selection mode
virtual PartSet_SelectionMode getNextMode(const std::string& theAttribute) const;
+
+ /// Project the point on a feature
+ /// \param theFeature the feature to be projected on
+ /// \param theMode the selection mode
+ /// \param thePoint the clicked point
+ /// \param theView the viewer
+ /// \param theX the output horizontal coordinate
+ /// \param theY the output vertical coordinate
+ void projectPointOnLine(FeaturePtr theFeature, const PartSet_SelectionMode& theMode,
+ const gp_Pnt& thePoint, Handle_V3d_View theView,
+ double& theX, double& theY);
+
protected:
/// Initializes current feature by the given
/// \param theSourceFeature the feature, which attributes are used to initialize the current feature
double aX, anY;
- bool isFoundPoint = false;
gp_Pnt aPoint = PartSet_Tools::convertClickToPoint(theEvent->pos(), theView);
if (theSelected.empty()) {
PartSet_Tools::convertTo2D(aPoint, sketch(), theView, aX, anY);
- isFoundPoint = true;
}
else {
XGUI_ViewerPrs aPrs = theSelected.front();
if (!aVertex.IsNull()) {
aPoint = BRep_Tool::Pnt(aVertex);
PartSet_Tools::convertTo2D(aPoint, sketch(), theView, aX, anY);
- isFoundPoint = true;
myFeaturePrs->setConstraints(aX, anY, myPointSelectionMode);
}
else if (aShape.ShapeType() == TopAbs_EDGE) // the line is selected
{
PartSet_Tools::convertTo2D(aPoint, sketch(), theView, aX, anY);
- isFoundPoint = true;
- /*
- FeaturePtr aFeature = aPrs.feature();
- if (aFeature) {
- double X0, X1, X2, X3;
- double Y0, Y1, Y2, Y3;
- PartSet_Tools::getLinePoint(aFeature, LINE_ATTR_START, X2, Y2);
- PartSet_Tools::getLinePoint(aFeature, LINE_ATTR_END, X3, Y3);
- PartSet_Tools::convertTo2D(aPoint, sketch(), theView, X1, Y1);
-
- switch (myPointSelectionMode) {
- case SM_FirstPoint:
- PartSet_Tools::projectPointOnLine(X2, Y2, X3, Y3, X1, Y1, aX, anY);
- break;
- case SM_SecondPoint: {
- PartSet_Tools::getLinePoint(feature(), LINE_ATTR_START, X0, Y0);
- PartSet_Tools::intersectLines(X0, Y0, X1, Y1, X2, Y2, X3, Y3, aX, anY);
- }
- break;
- default:
- break;
+ // move to selected line
+ if (feature()->getKind() == SKETCH_LINE_KIND) {
+ PartSet_FeatureLinePrs* aLinePrs = dynamic_cast<PartSet_FeatureLinePrs*>(myFeaturePrs);
+ if (aLinePrs) {
+ FeaturePtr aFeature = aPrs.feature();
+ aLinePrs->projectPointOnLine(aFeature, myPointSelectionMode, aPoint, theView, aX, anY);
}
- isFoundPoint = true;
}
- */
}
}
}
switch (myPointSelectionMode)
{
case SM_FirstPoint:
- case SM_SecondPoint: {
+ case SM_SecondPoint:
+ case SM_ThirdPoint: {
PartSet_SelectionMode aMode = myFeaturePrs->setPoint(aX, anY, myPointSelectionMode);
flushUpdated();
setPointSelectionMode(aMode);
{
case SM_FirstPoint:
case SM_SecondPoint:
+ case SM_ThirdPoint:
{
double aX, anY;
gp_Pnt aPoint = PartSet_Tools::convertClickToPoint(theEvent->pos(), theView);
#include "SketchPlugin_Arc.h"
#include "SketchPlugin_Sketch.h"
#include <ModelAPI_Data.h>
+
#include <GeomDataAPI_Point2D.h>
+#include <GeomDataAPI_Dir.h>
+
+#include <GeomAlgoAPI_PointBuilder.h>
+#include <GeomAlgoAPI_EdgeBuilder.h>
+#include <GeomAlgoAPI_CompoundBuilder.h>
SketchPlugin_Arc::SketchPlugin_Arc()
: SketchPlugin_Feature()
const boost::shared_ptr<GeomAPI_Shape>& SketchPlugin_Arc::preview()
{
- /// \todo Implement preview for arc of circle
+ SketchPlugin_Sketch* aSketch = sketch();
+ if (aSketch) {
+ std::list<boost::shared_ptr<GeomAPI_Shape> > aShapes;
+
+ // compute a circle point in 3D view
+ boost::shared_ptr<GeomDataAPI_Point2D> aCenterAttr =
+ boost::dynamic_pointer_cast<GeomDataAPI_Point2D>(data()->attribute(ARC_ATTR_CENTER));
+ boost::shared_ptr<GeomAPI_Pnt> aCenter(aSketch->to3D(aCenterAttr->x(), aCenterAttr->y()));
+ // make a visible point
+ boost::shared_ptr<GeomAPI_Shape> aCenterPointShape = GeomAlgoAPI_PointBuilder::point(aCenter);
+ aShapes.push_back(aCenterPointShape);
+
+ // make a visible circle
+ boost::shared_ptr<GeomDataAPI_Dir> aNDir =
+ boost::dynamic_pointer_cast<GeomDataAPI_Dir>(aSketch->data()->attribute(SKETCH_ATTR_NORM));
+ bool aHasPlane = aNDir && !(aNDir->x() == 0 && aNDir->y() == 0 && aNDir->z() == 0);
+ if (aHasPlane) {
+ boost::shared_ptr<GeomAPI_Dir> aNormal(new GeomAPI_Dir(aNDir->x(), aNDir->y(), aNDir->z()));
+ // compute the arc start point
+ boost::shared_ptr<GeomDataAPI_Point2D> aStartAttr =
+ boost::dynamic_pointer_cast<GeomDataAPI_Point2D>(data()->attribute(ARC_ATTR_START));
+ boost::shared_ptr<GeomAPI_Pnt> aStartPoint(aSketch->to3D(aStartAttr->x(), aStartAttr->y()));
+
+ // compute the arc end point
+ boost::shared_ptr<GeomDataAPI_Point2D> anEndAttr =
+ boost::dynamic_pointer_cast<GeomDataAPI_Point2D>(data()->attribute(ARC_ATTR_END));
+ boost::shared_ptr<GeomAPI_Pnt> aEndPoint(aSketch->to3D(anEndAttr->x(), anEndAttr->y()));
+
+ boost::shared_ptr<GeomAPI_Shape> aCircleShape =
+ GeomAlgoAPI_EdgeBuilder::lineCircleArc(aCenter, aStartPoint, aEndPoint, aNormal);
+ aShapes.push_back(aCircleShape);
+ }
+ boost::shared_ptr<GeomAPI_Shape> aCompound = GeomAlgoAPI_CompoundBuilder::compound(aShapes);
+ setPreview(aCompound);
+ }
return getPreview();
}
#include "SketchPlugin_Circle.h"
#include "SketchPlugin_Sketch.h"
#include <ModelAPI_Data.h>
+
#include <GeomDataAPI_Point2D.h>
+#include <GeomDataAPI_Dir.h>
+
#include <GeomAlgoAPI_PointBuilder.h>
#include <GeomAlgoAPI_EdgeBuilder.h>
#include <GeomAlgoAPI_CompoundBuilder.h>
-#include <GeomDataAPI_Dir.h>
#include <ModelAPI_AttributeDouble.h>
{
SketchPlugin_Sketch* aSketch = sketch();
if (aSketch) {
+ std::list<boost::shared_ptr<GeomAPI_Shape> > aShapes;
+
// compute a circle point in 3D view
boost::shared_ptr<GeomDataAPI_Point2D> aCenterAttr =
boost::dynamic_pointer_cast<GeomDataAPI_Point2D>(data()->attribute(CIRCLE_ATTR_CENTER));
boost::shared_ptr<GeomAPI_Pnt> aCenter(aSketch->to3D(aCenterAttr->x(), aCenterAttr->y()));
-
- // compute the circle radius
- boost::shared_ptr<ModelAPI_AttributeDouble> aRadiusAttr =
- boost::dynamic_pointer_cast<ModelAPI_AttributeDouble>(data()->attribute(CIRCLE_ATTR_RADIUS));
- double aRadius = aRadiusAttr->value();
-
- std::list<boost::shared_ptr<GeomAPI_Shape> > aShapes;
// make a visible point
boost::shared_ptr<GeomAPI_Shape> aCenterPointShape = GeomAlgoAPI_PointBuilder::point(aCenter);
aShapes.push_back(aCenterPointShape);
bool aHasPlane = aNDir && !(aNDir->x() == 0 && aNDir->y() == 0 && aNDir->z() == 0);
if (aHasPlane) {
boost::shared_ptr<GeomAPI_Dir> aNormal(new GeomAPI_Dir(aNDir->x(), aNDir->y(), aNDir->z()));
+ // compute the circle radius
+ boost::shared_ptr<ModelAPI_AttributeDouble> aRadiusAttr =
+ boost::dynamic_pointer_cast<ModelAPI_AttributeDouble>(data()->attribute(CIRCLE_ATTR_RADIUS));
+ double aRadius = aRadiusAttr->value();
boost::shared_ptr<GeomAPI_Shape> aCircleShape =
GeomAlgoAPI_EdgeBuilder::lineCircle(aCenter, aNormal, aRadius);
aShapes.push_back(aCircleShape);
-
- boost::shared_ptr<GeomAPI_Shape> aCompound = GeomAlgoAPI_CompoundBuilder::compound(aShapes);
- setPreview(aCompound);
}
+ boost::shared_ptr<GeomAPI_Shape> aCompound = GeomAlgoAPI_CompoundBuilder::compound(aShapes);
+ setPreview(aCompound);
}
- /// \todo Implement preview for the circle
return getPreview();
}