1 // File: PartSet_FeaturePrs.h
2 // Created: 04 Jun 2014
3 // Author: Natalia ERMOLAEVA
5 #include <PartSet_FeatureLinePrs.h>
6 #include <PartSet_Tools.h>
8 #include <SketchPlugin_Feature.h>
9 #include <SketchPlugin_Sketch.h>
10 #include <SketchPlugin_ConstraintCoincidence.h>
11 #include <SketchPlugin_Line.h>
12 #include <SketchPlugin_Constraint.h>
14 #include <GeomDataAPI_Point2D.h>
16 #include <ModelAPI_Data.h>
17 #include <ModelAPI_Document.h>
18 #include <ModelAPI_AttributeRefAttr.h>
19 #include <ModelAPI_AttributeRefList.h>
21 #include <Precision.hxx>
22 #include <V3d_View.hxx>
26 PartSet_FeatureLinePrs::PartSet_FeatureLinePrs(FeaturePtr theSketch)
27 : PartSet_FeaturePrs(theSketch)
31 void PartSet_FeatureLinePrs::initFeature(FeaturePtr theFeature)
33 if (feature() && theFeature)
35 // use the last point of the previous feature as the first of the new one
36 boost::shared_ptr<ModelAPI_Data> aData = theFeature->data();
37 boost::shared_ptr<GeomDataAPI_Point2D> anInitPoint = boost::dynamic_pointer_cast<GeomDataAPI_Point2D>
38 (aData->attribute(LINE_ATTR_END));
39 PartSet_Tools::setFeaturePoint(feature(), anInitPoint->x(), anInitPoint->y(), LINE_ATTR_START);
40 PartSet_Tools::setFeaturePoint(feature(), anInitPoint->x(), anInitPoint->y(), LINE_ATTR_END);
42 aData = feature()->data();
43 boost::shared_ptr<GeomDataAPI_Point2D> aPoint = boost::dynamic_pointer_cast<GeomDataAPI_Point2D>
44 (aData->attribute(LINE_ATTR_START));
45 PartSet_Tools::createConstraint(sketch(), anInitPoint, aPoint);
49 PartSet_SelectionMode PartSet_FeatureLinePrs::setPoint(double theX, double theY,
50 const PartSet_SelectionMode& theMode)
52 PartSet_SelectionMode aMode = theMode;
56 PartSet_Tools::setFeaturePoint(feature(), theX, theY, LINE_ATTR_START);
57 PartSet_Tools::setFeaturePoint(feature(), theX, theY, LINE_ATTR_END);
58 aMode = SM_SecondPoint;
61 case SM_SecondPoint: {
62 PartSet_Tools::setFeaturePoint(feature(), theX, theY, LINE_ATTR_END);
72 std::string PartSet_FeatureLinePrs::getAttribute(const PartSet_SelectionMode& theMode) const
74 std::string aAttribute;
78 aAttribute = LINE_ATTR_START;
81 aAttribute = LINE_ATTR_END;
89 PartSet_SelectionMode PartSet_FeatureLinePrs::getNextMode(const std::string& theAttribute) const
91 PartSet_SelectionMode aMode;
93 if (theAttribute == LINE_ATTR_START)
94 aMode = SM_SecondPoint;
95 else if (theAttribute == LINE_ATTR_END)
100 void PartSet_FeatureLinePrs::projectPointOnLine(FeaturePtr theFeature,
101 const PartSet_SelectionMode& theMode,
102 const gp_Pnt& thePoint, Handle(V3d_View) theView,
103 double& theX, double& theY)
106 double X0, X1, X2, X3;
107 double Y0, Y1, Y2, Y3;
108 PartSet_Tools::getLinePoint(theFeature, LINE_ATTR_START, X2, Y2);
109 PartSet_Tools::getLinePoint(theFeature, LINE_ATTR_END, X3, Y3);
110 PartSet_Tools::convertTo2D(thePoint, sketch(), theView, X1, Y1);
114 PartSet_Tools::projectPointOnLine(X2, Y2, X3, Y3, X1, Y1, theX, theY);
116 case SM_SecondPoint: {
117 PartSet_Tools::getLinePoint(feature(), LINE_ATTR_START, X0, Y0);
118 PartSet_Tools::intersectLines(X0, Y0, X1, Y1, X2, Y2, X3, Y3, theX, theY);
127 boost::shared_ptr<GeomDataAPI_Point2D> PartSet_FeatureLinePrs::featurePoint
128 (const PartSet_SelectionMode& theMode)
130 std::string aPointArg;
134 aPointArg = LINE_ATTR_START;
137 aPointArg = LINE_ATTR_END;
142 boost::shared_ptr<ModelAPI_Data> aData = feature()->data();
143 boost::shared_ptr<GeomDataAPI_Point2D> aPoint = boost::dynamic_pointer_cast<GeomDataAPI_Point2D>
144 (aData->attribute(aPointArg));